sbot/api/util.js

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 })
})
}
}