UNPKG

1.95 kBJavaScriptView Raw
1var collect = require('collect-stream')
2var xtend = require('xtend')
3var mapStream = require('through2-map')
4
5var errors = require('../errors')
6var refs2nodes = require('../lib/util').refs2nodes
7
8module.exports = function (osm) {
9 return function getElement (id, opts, cb) {
10 if (typeof opts === 'function') {
11 cb = opts
12 opts = null
13 }
14 opts = opts || {}
15 if (opts.history) {
16 getHistory(id, cb)
17 } else if (opts.version) {
18 getVersion(id, opts.version, cb)
19 } else {
20 getForks(id, cb)
21 }
22 }
23
24 function getForks (id, cb) {
25 osm.get(id, function (err, docs) {
26 if (err) return cb(err)
27 var forks = Object.keys(docs)
28 if (forks.length === 0) return cb(new errors.NotFound('element id: ' + id))
29 forks = forks.map(function (key) {
30 return xtend(docs[key], {
31 id: id,
32 version: key
33 })
34 }).map(refs2nodes)
35 cb(null, forks)
36 })
37 }
38
39 function getVersion (id, version, cb) {
40 osm.log.get(version, function (err, doc) {
41 if (err && (/^notfound/.test(err) || err.notFound)) {
42 err = errors(404, err)
43 }
44 if (err) return cb(err)
45 var element = xtend(doc.value.v, {
46 id: id,
47 version: version
48 })
49 cb(null, refs2nodes(element))
50 })
51 }
52
53 function getHistory (id, cb) {
54 var r = osm.kv.createHistoryStream(id).on('error', function (err) {
55 if (/^notfound/i.test(err) || err.notFound) {
56 err = new errors.NotFound('element id: ' + id)
57 }
58 if (cb) return cb(err)
59 if (stream) return stream.emit('error', err)
60 })
61 if (cb) {
62 collect(r, function (err, rows) {
63 if (err) return cb(err)
64 cb(null, rows.map(rowMap))
65 })
66 } else {
67 var stream = r.pipe(mapStream.obj(rowMap))
68 return stream
69 }
70 }
71}
72
73function rowMap (row) {
74 return xtend(refs2nodes(row.value), {
75 id: row.key,
76 version: row.link
77 })
78}