git ssb

7+

dinoworm 🐛 / patchcore



Commit f180a1dc8e2f0250559dc2f9e7391cb613ce75b3

move temp sbot plugins, add private message index

Matt McKegg committed on 6/9/2017, 8:01:46 AM
Parent: 61da396c13a5c46a54a687885b89f5108fce69eb

Files changed

package.jsonchanged
backlinks-plugin.jsdeleted
flumeview-links-raw.jsdeleted
sbot-plugins/backlinks.jsadded
sbot-plugins/lib/flumeview-links-raw.jsadded
sbot-plugins/private.jsadded
package.jsonView
@@ -37,8 +37,9 @@
3737 "deep-equal": "^1.0.1",
3838 "depnest": "^1.0.2",
3939 "emoji-named-characters": "^1.0.2",
4040 "es2040": "^1.2.4",
41 + "flumeview-level": "^2.0.2",
4142 "flumeview-query": "^3.0.3",
4243 "html-escape": "^2.0.0",
4344 "human-time": "0.0.1",
4445 "mutant": "^3.17.0",
backlinks-plugin.jsView
@@ -1,74 +1,0 @@
flumeview-links-raw.jsView
@@ -1,105 +1,0 @@
sbot-plugins/backlinks.jsView
@@ -1,0 +1,62 @@
1 +// this shouldn't really be in patchcore, should be its own module (ssb-backlinks)
2 +
3 +var FlumeQueryLinks = require('./lib/flumeview-links-raw')
4 +var ref = require('ssb-ref')
5 +var deepEqual = require('deep-equal')
6 +var extend = require('xtend')
7 +var matchChannel = /^#[^\s#]+$/
8 +
9 +var indexes = [
10 + { key: 'DTS', value: [['dest'], ['timestamp']] },
11 + { key: 'DTY', value: [['dest'], ['value', 'content', 'type'], ['timestamp']] }
12 +]
13 +
14 +var indexVersion = 0
15 +
16 +exports.name = 'backlinks'
17 +exports.version = require('../package.json').version
18 +exports.manifest = {
19 + read: 'source'
20 +}
21 +
22 +exports.init = function (ssb, config) {
23 + return ssb._flumeUse(
24 + 'backlinks',
25 + FlumeQueryLinks(indexes, extractLinks, indexVersion)
26 + )
27 +}
28 +
29 +function extractLinks (msg, emit) {
30 + var links = new Set()
31 + walk(msg.value.content, function (path, value) {
32 + // HACK: handle legacy channel mentions
33 + if (deepEqual(path, ['channel']) && typeof value === 'string' && value.length < 30) {
34 + value = `#${value.replace(/\s/g, '')}`
35 + }
36 +
37 + // TODO: should add channel matching to ref.type
38 + if (ref.type(value) || isChannel(value)) {
39 + links.add(value)
40 + }
41 + })
42 + links.forEach(link => {
43 + console.log('index backlink', link)
44 + emit(extend(msg, {
45 + dest: link
46 + }))
47 + })
48 +}
49 +
50 +function isChannel (value) {
51 + return typeof value === 'string' && value.length < 30 && matchChannel.test(value)
52 +}
53 +
54 +function walk (obj, fn, prefix) {
55 + if (obj && typeof obj === 'object') {
56 + for (var k in obj) {
57 + walk(obj[k], fn, (prefix || []).concat(k))
58 + }
59 + } else {
60 + fn(prefix, obj)
61 + }
62 +}
sbot-plugins/lib/flumeview-links-raw.jsView
@@ -1,0 +1,105 @@
sbot-plugins/private.jsView
@@ -1,0 +1,92 @@
1 +// this shouldn't really be in patchcore, should be its own module (ssb-private)
2 +
3 +var ssbKeys = require('ssb-keys')
4 +var FlumeQueryLinks = require('./lib/flumeview-links-raw')
5 +var explain = require('explain-error')
6 +var pull = require('pull-stream')
7 +
8 +var indexes = [
9 + { key: 'TSP', value: ['timestamp'] },
10 + { key: 'ATY', value: [['value', 'author'], ['value', 'content', 'type'], 'timestamp'] }
11 +]
12 +
13 +var indexVersion = 0
14 +
15 +exports.name = 'private'
16 +exports.version = require('../package.json').version
17 +exports.manifest = {
18 + publish: 'async',
19 + unbox: 'sync',
20 + read: 'source'
21 +}
22 +
23 +exports.init = function (ssb, config) {
24 + var index = ssb._flumeUse(
25 + `private-${ssb.id.slice(1, 10)}`,
26 + FlumeQueryLinks(indexes, (msg, emit) => {
27 + var value = unbox(msg)
28 + if (value) {
29 + emit(value)
30 + }
31 + }, indexVersion)
32 + )
33 +
34 + return {
35 + read: function (opts) {
36 + return pull(
37 + index.read(opts),
38 + pull.map(unbox)
39 + )
40 + },
41 +
42 + unbox: function (msgOrData) {
43 + if (typeof msgOrData === 'string') {
44 + try {
45 + var data = ssbKeys.unbox(msgOrData, ssb.keys.private)
46 + } catch (e) {
47 + throw explain(e, 'failed to decrypt')
48 + }
49 + return data
50 + } else if (msgOrData && msgOrData.value && msgOrData.value.content === 'string') {
51 + return unbox(msgOrData)
52 + }
53 + },
54 +
55 + publish: function (content, recps, cb) {
56 + try {
57 + var ciphertext = ssbKeys.box(content, recps)
58 + } catch (e) {
59 + return cb(explain(e, 'failed to encrypt'))
60 + }
61 + ssb.publish(ciphertext, cb)
62 + }
63 + }
64 +
65 + function unbox (msg) {
66 + if (typeof msg.value.content === 'string') {
67 + var value = unboxValue(msg.value)
68 + if (value) {
69 + return {
70 + key: msg.key, value: value, timestamp: msg.timestamp
71 + }
72 + }
73 + }
74 + }
75 +
76 + function unboxValue (value) {
77 + var plaintext = null
78 + try {
79 + plaintext = ssbKeys.unbox(value.content, ssb.keys.private)
80 + } catch (ex) {}
81 + if (!plaintext) return null
82 + return {
83 + previous: value.previous,
84 + author: value.author,
85 + sequence: value.sequence,
86 + timestamp: value.timestamp,
87 + hash: value.hash,
88 + content: plaintext,
89 + private: true
90 + }
91 + }
92 +}

Built with git-ssb-web