git ssb

0+

Matt McKegg / ssb-backlinks



Tree: f8f6dea260ff781d496a17158ef9fd91603b8ea5

Files: f8f6dea260ff781d496a17158ef9fd91603b8ea5 / emit-links.js

1038 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 dest: link
26 }))
27 })
28}
29
30function isChannel (value) {
31 return typeof value === 'string' && value.length < 30 && matchChannel.test(value)
32}
33
34function walk (obj, fn, prefix) {
35 if (obj && typeof obj === 'object') {
36 for (var k in obj) {
37 walk(obj[k], fn, (prefix || []).concat(k))
38 }
39 } else {
40 fn(prefix, obj)
41 }
42}
43

Built with git-ssb-web