Files: 802a60339e1acf7a9475055d8ad7c94155f24c36 / emit-links.js
1038 bytesRaw
1 | var ref = require('ssb-ref') |
2 | var deepEqual = require('deep-equal') |
3 | var extend = require('xtend') |
4 | var matchChannel = /^#[^\s#]+$/ |
5 | |
6 | module.exports = emitLinks |
7 | |
8 | function 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 | |
30 | function isChannel (value) { |
31 | return typeof value === 'string' && value.length < 30 && matchChannel.test(value) |
32 | } |
33 | |
34 | function 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