index.jsView |
---|
1 | 1 … | 'use strict'; |
2 | 2 … | |
| 3 … | +var join = require('path').join |
| 4 … | +var assert = require('assert') |
| 5 … | +var EventEmitter = require('events') |
| 6 … | + |
3 | 7 … | var contpara = require('cont').para |
4 | 8 … | var pull = require('pull-stream') |
5 | 9 … | var pl = require('pull-level') |
6 | 10 … | var paramap = require('pull-paramap') |
7 | 11 … | var timestamp = require('monotonic-timestamp') |
8 | | -var assert = require('assert') |
9 | 12 … | var ltgt = require('ltgt') |
10 | 13 … | var mlib = require('ssb-msgs') |
11 | 14 … | var explain = require('explain-error') |
12 | 15 … | var pdotjson = require('./package.json') |
15 | 18 … | var ref = require('ssb-ref') |
16 | 19 … | var ssbKeys = require('ssb-keys') |
17 | 20 … | var Live = require('pull-live') |
18 | 21 … | var Notify = require('pull-notify') |
19 | | -var compare = require('typewiselite') |
20 | 22 … | var peek = require('level-peek') |
21 | 23 … | var Validator = require('ssb-feed/validator') |
| 24 … | +var Related = require('./related') |
22 | 25 … | |
23 | | -var EventEmitter = require('events') |
24 | | - |
25 | 26 … | var isFeedId = ref.isFeedId |
26 | 27 … | var isMsgId = ref.isMsgId |
27 | 28 … | var isBlobId = ref.isBlobId |
28 | 29 … | |
45 | 46 … | function isObject (o) { |
46 | 47 … | return o && 'object' === typeof o && !Array.isArray(o) |
47 | 48 … | } |
48 | 49 … | |
49 | | -function all (stream) { |
50 | | - return function (cb) { |
51 | | - pull(stream, pull.collect(cb)) |
52 | | - } |
53 | | -} |
54 | | - |
55 | 50 … | function getVMajor () { |
56 | 51 … | var version = require('./package.json').version |
57 | 52 … | return (version.split('.')[0])|0 |
58 | 53 … | } |
61 | 56 … | path = path || _db.location |
62 | 57 … | |
63 | 58 … | keys = keys || ssbKeys.generate() |
64 | 59 … | |
65 | | - var db = require('./db')(path, keys) |
| 60 … | + var db = require('./db')(join(opts.path || path, 'flume'), keys) |
66 | 61 … | |
67 | | - if(_db) { |
68 | | - require('./legacy')(_db) |
69 | | - db.since.once(function (v) { |
70 | | - if(v === -1) load(null) |
71 | | - else db.get(v, function (err, data) { |
72 | | - if(err) throw err |
73 | | - load(data.timestamp) |
74 | | - }) |
75 | | - }) |
| 62 … | + |
| 63 … | + if(_db) require('./legacy')(_db, db) |
76 | 64 … | |
77 | | - function load(since) { |
78 | | - pull( |
79 | | - _db.createLogStream({gt: since}), |
80 | | - paramap(function (data, cb) { |
81 | | - if(Math.random() < 0.001) |
82 | | - console.log(data.timestamp) |
83 | | - db.append(data, cb) |
84 | | - }), |
85 | | - pull.drain(null, function () { |
86 | | - console.log('loaded!') |
87 | | - }) |
88 | | - ) |
89 | | - |
90 | | - } |
91 | | - |
92 | | - |
93 | | - } |
94 | 65 … | db.sublevel = function (a, b) { |
95 | 66 … | return _db.sublevel(a, b) |
96 | 67 … | } |
| 68 … | + |
| 69 … | + |
97 | 70 … | |
98 | 71 … | db.__proto__ = new EventEmitter() |
99 | 72 … | |
100 | | - function get (db, key) { |
101 | | - return function (cb) { db.get(key, cb) } |
102 | | - } |
103 | | - |
104 | 73 … | db.opts = opts |
105 | 74 … | |
106 | 75 … | db.batch = function (batch, cb) { |
107 | | - db.append(batch.map(function (e) { |
108 | | - return { |
109 | | - key: e.key, |
110 | | - value: e.value, |
111 | | - timestamp: timestamp() |
112 | | - } |
113 | | - }), function (err, offsets) { |
114 | | - cb(err) |
115 | | - }) |
116 | | - } |
| 76 … | + db.append(batch.map(function (e) { |
| 77 … | + return { |
| 78 … | + key: e.key, |
| 79 … | + value: e.value, |
| 80 … | + timestamp: timestamp() |
| 81 … | + } |
| 82 … | + }), function (err, offsets) { |
| 83 … | + cb(err) |
| 84 … | + }) |
| 85 … | + } |
117 | 86 … | |
118 | 87 … | var _get = db.get |
119 | 88 … | |
120 | 89 … | db.get = function (key, cb) { |
131 | 100 … | db.add = Validator(db, opts) |
132 | 101 … | |
133 | 102 … | var realtime = Notify() |
134 | 103 … | |
135 | | - function Limit (fn) { |
136 | | - return function (opts) { |
137 | | - if(opts && opts.limit && opts.limit > 0) { |
138 | | - var limit = opts.limit |
139 | | - var read = fn(opts) |
140 | | - return function (abort, cb) { |
141 | | - if(limit--) return read(abort, function (err, data) { |
142 | | - if(data && data.sync) limit ++ |
143 | | - cb(err, data) |
144 | | - }) |
145 | | - else read(true, cb) |
146 | | - } |
147 | | - } |
148 | | - else |
149 | | - return fn(opts) |
150 | | - } |
151 | | - } |
152 | | - |
153 | 104 … | |
154 | 105 … | db.createFeedStream = db.feed.createFeedStream |
155 | 106 … | |
156 | 107 … | |
218 | 169 … | if(err || !value || !value[key]) cb() |
219 | 170 … | |
220 | 171 … | |
221 | 172 … | |
222 | | - |
223 | 173 … | else db.get(value[key].id, function (err, msg) { |
224 | 174 … | cb(err, {key: value[key].id, value: msg}) |
225 | 175 … | }) |
226 | 176 … | }) |
243 | 193 … | |
244 | 194 … | var HI = undefined, LO = null |
245 | 195 … | |
246 | 196 … | |
247 | | - db.relatedMessages = function (opts, cb) { |
248 | | - if(isString(opts)) opts = {key: opts} |
249 | | - if(!opts) throw new Error('opts *must* be object') |
250 | | - var key = opts.id || opts.key |
251 | | - var depth = opts.depth || Infinity |
252 | | - var seen = {} |
253 | 197 … | |
254 | | - |
255 | | - |
256 | | - var n = 1 |
257 | | - var msgs = {key: key, value: null} |
258 | | - db.get(key, function (err, msg) { |
259 | | - msgs.value = msg |
260 | | - if (err && err.notFound) |
261 | | - err = null |
262 | | - done(err) |
263 | | - }) |
| 198 … | + db.relatedMessages = Related(db) |
264 | 199 … | |
265 | | - related(msgs, depth) |
266 | | - |
267 | | - function related (msg, depth) { |
268 | | - if(depth <= 0) return |
269 | | - if (n<0) return |
270 | | - n++ |
271 | | - all(db.links({dest: msg.key, rel: opts.rel, keys: true, values:true, meta: false, type:'msg'})) |
272 | | - (function (err, ary) { |
273 | | - if(ary && ary.length) { |
274 | | - msg.related = ary = ary.sort(function (a, b) { |
275 | | - return compare(a.value.timestamp, b.value.timestamp) || compare(a.key, b.key) |
276 | | - }).filter(function (msg) { |
277 | | - if(seen[msg.key]) return |
278 | | - return seen[msg.key] = true |
279 | | - }) |
280 | | - ary.forEach(function (msg) { related (msg, depth - 1) }) |
281 | | - } |
282 | | - done(err) |
283 | | - }) |
284 | | - } |
285 | | - |
286 | | - function count (msg) { |
287 | | - if(!msg.related) |
288 | | - return msg |
289 | | - var c = 0 |
290 | | - msg.related.forEach(function (_msg) { |
291 | | - if(opts.parent) _msg.parent = msg.key |
292 | | - c += 1 + (count(_msg).count || 0) |
293 | | - }) |
294 | | - if(opts.count) msg.count = c |
295 | | - return msg |
296 | | - } |
297 | | - |
298 | | - function done (err) { |
299 | | - if(err && n > 0) { |
300 | | - n = -1 |
301 | | - return cb(err) |
302 | | - } |
303 | | - if(--n) return |
304 | | - cb(null, count(msgs)) |
305 | | - } |
306 | | - } |
307 | | - |
308 | 200 … | return db |
309 | 201 … | } |
310 | 202 … | |
311 | | - |
312 | | - |
313 | | - |
314 | | - |
315 | | - |