Advertisement
Guest User

Untitled

a guest
May 24th, 2015
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.72 KB | None | 0 0
  1. var Rx = require('rx');
  2. var _ = require('lodash');
  3.  
  4. function noop() { }
  5.  
  6. function makeArray(item) {
  7. return Array.isArray(item) ? item : [item];
  8. }
  9.  
  10. var LevelUpAdapter = {
  11. get: function (db, bucketKey) {
  12. return Rx.Observable.create(function (o) {
  13. db.get(bucketKey, function (err, results) {
  14. if (err && err.notFound) {
  15. o.onNext([]);
  16. o.onCompleted();
  17. } else if (err) {
  18. o.onError();
  19. } else {
  20. o.onNext(_.compact(results.split(',')));
  21. o.onCompleted();
  22. }
  23. });
  24. });
  25. },
  26. put: function (db, bucketKey, values) {
  27. return Rx.Observable.create(function (o) {
  28. db.put(bucketKey, values, function (err) {
  29. if (err) {
  30. o.onError(err);
  31. } else {
  32. o.onNext(null);
  33. o.onCompleted();
  34. }
  35. })
  36. });
  37. },
  38. del: function (db, bucketKey) {
  39. return Rx.Observable.create(function (o) {
  40. db.del(bucketKey, function (err) {
  41. if (err) {
  42. o.onError(err);
  43. } else {
  44. o.onNext(null);
  45. o.onCompleted();
  46. }
  47. })
  48. });
  49. }
  50. }
  51.  
  52. function LevelUpBackend(db, prefix) {
  53. this.db = db;
  54. this.prefix = prefix || 'acl';
  55. }
  56.  
  57. LevelUpBackend.prototype = {
  58. /**
  59. Begins a transaction
  60. */
  61. begin : function() {
  62. return [];
  63. },
  64. /**
  65. Ends a transaction (and executes it)
  66. */
  67. end : function(transaction, cb){
  68. Rx.Observable.concat(transaction).subscribe(
  69. noop,
  70. cb,
  71. function () {
  72. cb(null);
  73. }
  74. );
  75. },
  76. /**
  77. Cleans the whole storage.
  78. */
  79. clean : function(cb) {
  80. cb(null);
  81. },
  82. /**
  83. Gets the contents at the bucket's key.
  84. */
  85. get : function(bucket, key, cb) {
  86. LevelUpAdapter.get(this.db, this.bucketKey(bucket, key)).subscribe(
  87. function (x) {
  88. cb(null, x)
  89. },
  90. cb
  91. );
  92. },
  93. /**
  94. * Returns the union of the values in the given keys.
  95. */
  96. union : function(bucket, keys, cb) {
  97. var db = this.db;
  98.  
  99. var source = Rx.Observable
  100. .fromArray(this.bucketKey(bucket, keys))
  101. .concatMap(function (bk) { return LevelUpAdapter.get(db, bk); })
  102. .toArray()
  103. .subscribe(
  104. function (results) {
  105. cb(null, _.uniq(_.compact(_.flatten(results))));
  106. },
  107. cb
  108. );
  109. },
  110. /**
  111. * Adds values to a given key inside a bucket.
  112. */
  113. add : function(transaction, bucket, key, values) {
  114. var bk = this.bucketKey(bucket, key), db = this.db;
  115.  
  116. transaction.push(LevelUpAdapter.get(db, bk)
  117. .concatMap(function (results) {
  118. results.push.apply(results, makeArray(values));
  119.  
  120. var uniqueResults = _.uniq(_.compact(results));
  121. return LevelUpAdapter.put(db, bk, uniqueResults);
  122. }));
  123. },
  124. /**
  125. * Delete the given key(s) at the bucket
  126. */
  127. del : function(transaction, bucket, keys) {
  128. var keyArray = makeArray(keys), bks = this.bucketKey(bucket, keyArray), db = this.db;
  129.  
  130. transaction.push(
  131. Rx.Observable
  132. .fromArray(bks)
  133. .concatMap(function (bk) {
  134. return LevelUpAdapter.del(db, bk);
  135. })
  136. );
  137. },
  138. /**
  139. * Removes values from a given key inside a bucket.
  140. */
  141. remove : function(transaction, bucket, key, values){
  142. var db = this.db, valueArray = makeArray(values), bk = this.bucketKey(bucket, key);
  143.  
  144. transaction.push(
  145. LevelUpAdapter.get(db, bk)
  146. .concatMap(function (results) {
  147. return LevelUpAdapter.put(db, bk, _.difference(results, valueArray));
  148. })
  149. );
  150. },
  151. //
  152. // Private methods
  153. //
  154.  
  155. bucketKey : function(bucket, keys){
  156. if (Array.isArray(keys)) {
  157. return keys.map(function(key){
  158. return this.prefix+'_'+bucket+'@'+key;
  159. }, this);
  160. } else {
  161. return this.prefix+'_'+bucket+'@'+keys;
  162. }
  163. }
  164. };
  165.  
  166. module.exports = LevelUpBackend;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement