UNPKG

3.38 kBJavaScriptView Raw
1var calypso = require('calypso');
2var LevelDriver = require('calypso-level');
3var levelup = require('levelup');
4var medeadown = require('medeadown');
5var Query = calypso.Query;
6var medea = require('medea');
7var async = require('async');
8
9var Registry = module.exports = function(opts){
10 opts = opts || {};
11 var self = this;
12 this.collection = opts.collection;
13 if (opts.db) {
14 this.db = opts.db;
15 } else {
16 this.location = opts.path;
17 this.compactor = medea();
18 }
19
20 this.session = null;
21};
22
23Registry.prototype._init = function(cb) {
24 var self = this;
25
26 function buildCalypsoEngine(cb) {
27 var map = {};
28 map[self.collection] = self.db;
29 var driver = LevelDriver.create({
30 collectionMap: map
31 });
32
33 var engine = calypso.configure({
34 driver: driver
35 });
36
37 engine.build(function(err, connection) {
38 if (err) {
39 cb(err);
40 return;
41 }
42
43 self.session = connection.createSession();
44 cb();
45 });
46
47 }
48
49 if(this.compactor) {
50 async.series([
51 function(next) {
52 self.compactor.open(self.location, next);
53 },
54 function(next) {
55 self.compactor.compact(next);
56 },
57 function(next) {
58 self.compactor.close(next);
59 }
60
61 ], function(err) {
62 if(err) {
63 cb(err);
64 } else {
65 self.db = levelup(self.location, { db: medeadown, valueEncoding: 'json' });
66 buildCalypsoEngine(cb);
67 }
68 });
69 } else {
70 buildCalypsoEngine(cb);
71 }
72};
73
74Registry.prototype.match = function(query, value, cb) {
75 if (!this.session) {
76 var self = this;
77 this._init(function(err) {
78 if (err) {
79 cb(err);
80 return;
81 }
82 self._match(query, value, cb);
83 });
84 } else {
85 this._match(query, value, cb);
86 }
87};
88
89Registry.prototype._match = function(query, value, cb) {
90 var match;
91 try {
92 match = this.session.match(query, value);
93 } catch (err) {
94 cb(err);
95 return;
96 }
97 cb(null, match);
98};
99
100Registry.prototype.find = function(query, cb) {
101 if (!this.session) {
102 var self = this;
103 this._init(function(err) {
104 if (err) {
105 cb(err);
106 return;
107 }
108
109 self._find(query, cb);
110 });
111 } else {
112 this._find(query, cb);
113 }
114};
115
116Registry.prototype._find = function(q, cb) {
117 var query = Query.of(this.collection);
118
119 if (q instanceof Query) {
120 query = q;
121 } else if (typeof q === 'object') {
122 Object.keys(q).forEach(function(key) {
123 query = query.where(key, { eq: q[key] });
124 });
125 } else {
126 query = query.ql(q);
127 }
128
129 // run a match to test if the query is valid
130 try {
131 this.session.match(query, {});
132 } catch(err) {
133 return cb(err);
134 }
135
136 this.session.find(query, function(err, results) {
137 if(err) {
138 cb(err);
139 } else {
140 var objects = [];
141 results.forEach(function(peer) {
142 if(typeof peer === 'string') {
143 peer = JSON.parse(peer);
144 }
145 objects.push(peer);
146 });
147 cb(null, objects);
148 }
149 });
150};
151
152
153Registry.prototype.get = function(id, cb) {
154 this.db.get(id, { valueEncoding: 'json' }, function(err, result){
155 if(err) {
156 cb(err);
157 } else {
158 if(typeof result === 'object') {
159 cb(null, result);
160 } else {
161 cb(null, JSON.parse(result));
162 }
163 }
164 });
165};
166
167Registry.prototype.close = function() {
168 this.db.close.apply(this.db, arguments);
169};