git ssb

0+

Matt McKegg / ssb-backlinks



Tree: ec9bfbd5c334144796063edc61e8e12ac90011ae

Files: ec9bfbd5c334144796063edc61e8e12ac90011ae / emit-links.js

1291 bytesRaw
1var ref = require('ssb-ref')
2var deepEqual = require('deep-equal')
3var extend = require('xtend')
4var matchChannel = /^#[^\s#]+$/
5
6module.exports = emitLinks
7
8function emitLinks (msg, emit) {
9 var links = new Set()
10 walk(msg.value.content, function (path, value) {
11 // HACK: handle legacy channel mentions
12 if (deepEqual(path, ['channel']) && typeof value === 'string' && value.length < 30) {
13 value = `#${ref.normalizeChannel(value)}`
14 }
15
16 // TODO: should add channel matching to ref.type
17 if (ref.type(value)) {
18 links.add(value)
19 } else if (isChannel(value)) {
20 links.add(ref.normalizeChannel(value))
21 }
22 })
23 links.forEach(link => {
24 emit(extend(msg, {
25 rts: resolveTimestamp(msg),
26 dest: link
27 }))
28 })
29}
30
31function isChannel (value) {
32 return typeof value === 'string' && value.length < 30 && matchChannel.test(value)
33}
34
35function resolveTimestamp (msg) {
36 if (!msg || !msg.value || !msg.value.timestamp) return
37 if (msg.timestamp) {
38 return Math.min(msg.timestamp, msg.value.timestamp)
39 } else {
40 return msg.value.timestamp
41 }
42}
43
44function walk (obj, fn, prefix) {
45 if (obj && typeof obj === 'object') {
46 for (var k in obj) {
47 walk(obj[k], fn, (prefix || []).concat(k))
48 }
49 } else {
50 fn(prefix, obj)
51 }
52}
53

Built with git-ssb-web