Files: ec9bfbd5c334144796063edc61e8e12ac90011ae / emit-links.js
1291 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 | rts: resolveTimestamp(msg), |
26 | dest: link |
27 | })) |
28 | }) |
29 | } |
30 | |
31 | function isChannel (value) { |
32 | return typeof value === 'string' && value.length < 30 && matchChannel.test(value) |
33 | } |
34 | |
35 | function 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 | |
44 | function 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