92 lines
2.1 KiB
JavaScript
92 lines
2.1 KiB
JavaScript
var mlib = require('ssb-msgs')
|
|
var EventEmitter = require('events').EventEmitter
|
|
|
|
module.exports.index = function () {
|
|
var index = new EventEmitter()
|
|
index.rows = []
|
|
|
|
index.sortedInsert = function (ts, key) {
|
|
var row = { ts: ts, key: key }
|
|
for (var i=0; i < index.rows.length; i++) {
|
|
if (index.rows[i].ts < ts) {
|
|
index.rows.splice(i, 0, row)
|
|
index.emit('add', row)
|
|
return row
|
|
}
|
|
}
|
|
index.rows.push(row)
|
|
index.emit('add', row)
|
|
return row
|
|
}
|
|
|
|
index.sortedUpsert = function (ts, key) {
|
|
var i = index.indexOf(key)
|
|
if (i !== -1) {
|
|
// readd to index at new TS
|
|
if (index.rows[i].ts < ts) {
|
|
var oldrow = index.rows[i]
|
|
index.rows.splice(i, 1)
|
|
var newrow = index.sortedInsert(ts, key)
|
|
for (var k in oldrow) {
|
|
if (k != 'ts')
|
|
newrow[k] = oldrow[k]
|
|
}
|
|
return newrow
|
|
} else
|
|
return index.rows[i]
|
|
} else {
|
|
// add to index
|
|
return index.sortedInsert(ts, key)
|
|
}
|
|
}
|
|
|
|
index.indexOf = function (key, keyname) {
|
|
keyname = keyname || 'key'
|
|
for (var i=0; i < index.rows.length; i++) {
|
|
if (index.rows[i][keyname] === key)
|
|
return i
|
|
}
|
|
return -1
|
|
}
|
|
|
|
index.find = function (key, keyname) {
|
|
var i = index.indexOf(key, keyname)
|
|
if (i !== -1)
|
|
return index.rows[i]
|
|
return null
|
|
}
|
|
|
|
index.contains = function (key) {
|
|
return index.indexOf(index, key) !== -1
|
|
}
|
|
|
|
index.filter = index.rows.filter.bind(index.rows)
|
|
|
|
return index
|
|
}
|
|
|
|
|
|
module.exports.getRootMsg = function (sbot, msg, cb) {
|
|
var mid = mlib.link(msg.value.content.root || msg.value.content.branch, 'msg').link
|
|
up()
|
|
function up () {
|
|
sbot.get(mid, function (err, msgvalue) {
|
|
if (err)
|
|
return cb(err)
|
|
|
|
// not found? stop here
|
|
if (!msgvalue)
|
|
return cb()
|
|
|
|
// ascend
|
|
var link = mlib.link(msgvalue.content.root || msgvalue.content.branch, 'msg')
|
|
if (link) {
|
|
mid = link.link
|
|
return up()
|
|
}
|
|
|
|
// topmost, finish
|
|
cb(null, { key: mid, value: msgvalue })
|
|
})
|
|
}
|
|
} |