Commit 2d4bc2859a6de598bd5ac555f34ed6da81562a2e
remove bulk-require
mix irving committed on 2/26/2018, 12:43:25 AMParent: 073f7adfddd31252faca6d3c503e202ad1aef088
Files changed
index.js | changed |
tag/obs/tagged.js | deleted |
tag/obs.js | added |
index.js | ||
---|---|---|
@@ -1,7 +1,14 @@ | ||
1 | -const bulk = require('bulk-require') | |
1 … | +var modules = { | |
2 … | + tag: { | |
3 … | + async: { | |
4 … | + apply: require('./tag/async/apply'), | |
5 … | + create: require('./tag/async/create'), | |
6 … | + name: require('./tag/async/name'), | |
7 … | + }, | |
8 … | + obs: require('./tag/obs'), | |
9 … | + } | |
10 … | +} | |
2 | 11 … | |
3 | -const modules = bulk(__dirname, ['!(node_modules|test.js|*.test.js)/**/*.js'], {require: function (module) { | |
4 | - return module.match(/(.*.test.js$)/) ? null : require(module) | |
5 | -}}) | |
6 | 12 … | |
7 | -module.exports = modules | |
13 … | +module.exports = { 'patch-tag': modules } | |
14 … | + |
tag/obs/tagged.js | ||
---|---|---|
@@ -1,185 +1,0 @@ | ||
1 | -var { Value, Set, computed } = require('mutant') | |
2 | -var pull = require('pull-stream') | |
3 | -var nest = require('depnest') | |
4 | -var ref = require('ssb-ref') | |
5 | -var set = require('lodash/set') | |
6 | -var unset = require('lodash/unset') | |
7 | -var get = require('lodash/get') | |
8 | -var isEmpty = require('lodash/isEmpty') | |
9 | - | |
10 | -exports.needs = nest({ | |
11 | - 'sbot.pull.stream': 'first' | |
12 | -}) | |
13 | - | |
14 | -exports.gives = nest({ | |
15 | - 'tag.obs': [ | |
16 | - 'taggedMessages', | |
17 | - 'messageTags', | |
18 | - 'allTagsFrom', | |
19 | - 'allTags' | |
20 | - ] | |
21 | -}) | |
22 | - | |
23 | -exports.create = function(api) { | |
24 | - var tagsCache = {} | |
25 | - var messagesCache = {} | |
26 | - var cacheLoading = false | |
27 | - var sync = Value(false) | |
28 | - | |
29 | - return nest({ | |
30 | - 'tag.obs': { | |
31 | - taggedMessages, | |
32 | - messageTags, | |
33 | - allTagsFrom, | |
34 | - allTags | |
35 | - } | |
36 | - }) | |
37 | - | |
38 | - function taggedMessages(author, tagId) { | |
39 | - if (!ref.isFeed(author) || !ref.isLink(tagId)) throw new Error('Requires an ssb ref!') | |
40 | - return withSync(computed([getObs(author, tagsCache), tagId], getTaggedMessages)) | |
41 | - } | |
42 | - | |
43 | - function messageTags(msgId) { | |
44 | - if (!ref.isLink(msgId)) throw new Error('Requires an ssb ref!') | |
45 | - return withSync(computed(getObs(msgId, messagesCache), getMessageTags)) | |
46 | - } | |
47 | - | |
48 | - function allTagsFrom(author) { | |
49 | - if (!ref.isFeed(author)) throw new Error('Requires an ssb ref!') | |
50 | - return withSync(computed(getObs(author, tagsCache), Object.keys)) | |
51 | - } | |
52 | - | |
53 | - function allTags() { | |
54 | - return withSync(getAllTags(getCache(tagsCache))) | |
55 | - } | |
56 | - | |
57 | - function withSync(obs) { | |
58 | - obs.sync = sync | |
59 | - return obs | |
60 | - } | |
61 | - | |
62 | - function getObs(id, lookup) { | |
63 | - if (!ref.isLink(id)) throw new Error('Requires an ssb ref!') | |
64 | - if (!cacheLoading) { | |
65 | - cacheLoading = true | |
66 | - loadCache() | |
67 | - } | |
68 | - if (!lookup[id]) { | |
69 | - lookup[id] = Value({}) | |
70 | - } | |
71 | - return lookup[id] | |
72 | - } | |
73 | - | |
74 | - function getCache(lookup) { | |
75 | - if (!cacheLoading) { | |
76 | - cacheLoading = true | |
77 | - loadCache() | |
78 | - } | |
79 | - return lookup | |
80 | - } | |
81 | - | |
82 | - function update(id, values, lookup) { | |
83 | - const state = getObs(id, lookup) | |
84 | - const lastState = state() | |
85 | - var changed = false | |
86 | - | |
87 | - for (const tag in values) { | |
88 | - const lastTag = lastState[tag] | |
89 | - const isUnusedTag = isEmpty(values[tag]) && (lastTag === undefined || !isEmpty(lastTag)) | |
90 | - if (isUnusedTag) { | |
91 | - set(lastState, [ tag ], {}) | |
92 | - changed = true | |
93 | - continue | |
94 | - } | |
95 | - for (const key in values[tag]) { | |
96 | - const value = get(values, [ tag, key ]) | |
97 | - const lastValue = get(lastState, [ tag, key ]) | |
98 | - if (value !== lastValue) { | |
99 | - if (value) { | |
100 | - set(lastState, [ tag, key ], value) | |
101 | - } else { | |
102 | - unset(lastState, [ tag, key ]) | |
103 | - } | |
104 | - changed = true | |
105 | - } | |
106 | - } | |
107 | - } | |
108 | - | |
109 | - if (changed) { | |
110 | - state.set(lastState) | |
111 | - } | |
112 | - } | |
113 | - | |
114 | - function loadCache() { | |
115 | - pull( | |
116 | - api.sbot.pull.stream(sbot => sbot.tags.stream({ live: true })), | |
117 | - pull.drain(item => { | |
118 | - if (!sync()) { | |
119 | - // populate tags observable cache | |
120 | - const messageLookup = {} | |
121 | - for (const author in item) { | |
122 | - update(author, item[author], tagsCache) | |
123 | - | |
124 | - // generate message lookup | |
125 | - for (const tag in item[author]) { | |
126 | - for (const message in item[author][tag]) { | |
127 | - set(messageLookup, [message, tag, author], item[author][tag][message]) | |
128 | - } | |
129 | - } | |
130 | - } | |
131 | - | |
132 | - // populate messages observable cache | |
133 | - for (const message in messageLookup) { | |
134 | - update(message, messageLookup[message], messagesCache) | |
135 | - } | |
136 | - | |
137 | - if (!sync()) { | |
138 | - sync.set(true) | |
139 | - } | |
140 | - } else if (item && ref.isLink(item.tagKey) && ref.isFeed(item.author) && ref.isLink(item.message)) { | |
141 | - // handle realtime updates | |
142 | - const { tagKey, author, message, tagged, timestamp } = item | |
143 | - if (tagged) { | |
144 | - update(author, { [tagKey]: { [message]: timestamp } }, tagsCache) | |
145 | - update(message, { [tagKey]: { [author]: timestamp } }, messagesCache) | |
146 | - } else { | |
147 | - update(author, { [tagKey]: { [message]: false } }, tagsCache) | |
148 | - update(message, { [tagKey]: { [author]: false } }, messagesCache) | |
149 | - } | |
150 | - } | |
151 | - }) | |
152 | - ) | |
153 | - } | |
154 | -} | |
155 | - | |
156 | -function getTaggedMessages(lookup, key) { | |
157 | - const messages = [] | |
158 | - for (const msg in lookup[key]) { | |
159 | - if (lookup[key][msg]) { | |
160 | - messages.push(msg) | |
161 | - } | |
162 | - } | |
163 | - return messages | |
164 | -} | |
165 | - | |
166 | -function getMessageTags(lookup) { | |
167 | - const tags = [] | |
168 | - for (const tag in lookup) { | |
169 | - if (!isEmpty(lookup[tag])) { | |
170 | - tags.push(tag) | |
171 | - } | |
172 | - } | |
173 | - return tags | |
174 | -} | |
175 | - | |
176 | -function getAllTags(lookup) { | |
177 | - const tags = Set([]) | |
178 | - for (const author in lookup) { | |
179 | - const authorTags = lookup[author]() | |
180 | - for (const tag in authorTags) { | |
181 | - tags.add(tag) | |
182 | - } | |
183 | - } | |
184 | - return tags | |
185 | -} |
tag/obs.js | |||
---|---|---|---|
@@ -1,0 +1,185 @@ | |||
1 … | +var { Value, Set, computed } = require('mutant') | ||
2 … | +var pull = require('pull-stream') | ||
3 … | +var nest = require('depnest') | ||
4 … | +var ref = require('ssb-ref') | ||
5 … | +var set = require('lodash/set') | ||
6 … | +var unset = require('lodash/unset') | ||
7 … | +var get = require('lodash/get') | ||
8 … | +var isEmpty = require('lodash/isEmpty') | ||
9 … | + | ||
10 … | +exports.needs = nest({ | ||
11 … | + 'sbot.pull.stream': 'first' | ||
12 … | +}) | ||
13 … | + | ||
14 … | +exports.gives = nest({ | ||
15 … | + 'tag.obs': [ | ||
16 … | + 'taggedMessages', | ||
17 … | + 'messageTags', | ||
18 … | + 'allTagsFrom', | ||
19 … | + 'allTags' | ||
20 … | + ] | ||
21 … | +}) | ||
22 … | + | ||
23 … | +exports.create = function(api) { | ||
24 … | + var tagsCache = {} | ||
25 … | + var messagesCache = {} | ||
26 … | + var cacheLoading = false | ||
27 … | + var sync = Value(false) | ||
28 … | + | ||
29 … | + return nest({ | ||
30 … | + 'tag.obs': { | ||
31 … | + taggedMessages, | ||
32 … | + messageTags, | ||
33 … | + allTagsFrom, | ||
34 … | + allTags | ||
35 … | + } | ||
36 … | + }) | ||
37 … | + | ||
38 … | + function taggedMessages(author, tagId) { | ||
39 … | + if (!ref.isFeed(author) || !ref.isLink(tagId)) throw new Error('Requires an ssb ref!') | ||
40 … | + return withSync(computed([getObs(author, tagsCache), tagId], getTaggedMessages)) | ||
41 … | + } | ||
42 … | + | ||
43 … | + function messageTags(msgId) { | ||
44 … | + if (!ref.isLink(msgId)) throw new Error('Requires an ssb ref!') | ||
45 … | + return withSync(computed(getObs(msgId, messagesCache), getMessageTags)) | ||
46 … | + } | ||
47 … | + | ||
48 … | + function allTagsFrom(author) { | ||
49 … | + if (!ref.isFeed(author)) throw new Error('Requires an ssb ref!') | ||
50 … | + return withSync(computed(getObs(author, tagsCache), Object.keys)) | ||
51 … | + } | ||
52 … | + | ||
53 … | + function allTags() { | ||
54 … | + return withSync(getAllTags(getCache(tagsCache))) | ||
55 … | + } | ||
56 … | + | ||
57 … | + function withSync(obs) { | ||
58 … | + obs.sync = sync | ||
59 … | + return obs | ||
60 … | + } | ||
61 … | + | ||
62 … | + function getObs(id, lookup) { | ||
63 … | + if (!ref.isLink(id)) throw new Error('Requires an ssb ref!') | ||
64 … | + if (!cacheLoading) { | ||
65 … | + cacheLoading = true | ||
66 … | + loadCache() | ||
67 … | + } | ||
68 … | + if (!lookup[id]) { | ||
69 … | + lookup[id] = Value({}) | ||
70 … | + } | ||
71 … | + return lookup[id] | ||
72 … | + } | ||
73 … | + | ||
74 … | + function getCache(lookup) { | ||
75 … | + if (!cacheLoading) { | ||
76 … | + cacheLoading = true | ||
77 … | + loadCache() | ||
78 … | + } | ||
79 … | + return lookup | ||
80 … | + } | ||
81 … | + | ||
82 … | + function update(id, values, lookup) { | ||
83 … | + const state = getObs(id, lookup) | ||
84 … | + const lastState = state() | ||
85 … | + var changed = false | ||
86 … | + | ||
87 … | + for (const tag in values) { | ||
88 … | + const lastTag = lastState[tag] | ||
89 … | + const isUnusedTag = isEmpty(values[tag]) && (lastTag === undefined || !isEmpty(lastTag)) | ||
90 … | + if (isUnusedTag) { | ||
91 … | + set(lastState, [ tag ], {}) | ||
92 … | + changed = true | ||
93 … | + continue | ||
94 … | + } | ||
95 … | + for (const key in values[tag]) { | ||
96 … | + const value = get(values, [ tag, key ]) | ||
97 … | + const lastValue = get(lastState, [ tag, key ]) | ||
98 … | + if (value !== lastValue) { | ||
99 … | + if (value) { | ||
100 … | + set(lastState, [ tag, key ], value) | ||
101 … | + } else { | ||
102 … | + unset(lastState, [ tag, key ]) | ||
103 … | + } | ||
104 … | + changed = true | ||
105 … | + } | ||
106 … | + } | ||
107 … | + } | ||
108 … | + | ||
109 … | + if (changed) { | ||
110 … | + state.set(lastState) | ||
111 … | + } | ||
112 … | + } | ||
113 … | + | ||
114 … | + function loadCache() { | ||
115 … | + pull( | ||
116 … | + api.sbot.pull.stream(sbot => sbot.tags.stream({ live: true })), | ||
117 … | + pull.drain(item => { | ||
118 … | + if (!sync()) { | ||
119 … | + // populate tags observable cache | ||
120 … | + const messageLookup = {} | ||
121 … | + for (const author in item) { | ||
122 … | + update(author, item[author], tagsCache) | ||
123 … | + | ||
124 … | + // generate message lookup | ||
125 … | + for (const tag in item[author]) { | ||
126 … | + for (const message in item[author][tag]) { | ||
127 … | + set(messageLookup, [message, tag, author], item[author][tag][message]) | ||
128 … | + } | ||
129 … | + } | ||
130 … | + } | ||
131 … | + | ||
132 … | + // populate messages observable cache | ||
133 … | + for (const message in messageLookup) { | ||
134 … | + update(message, messageLookup[message], messagesCache) | ||
135 … | + } | ||
136 … | + | ||
137 … | + if (!sync()) { | ||
138 … | + sync.set(true) | ||
139 … | + } | ||
140 … | + } else if (item && ref.isLink(item.tagKey) && ref.isFeed(item.author) && ref.isLink(item.message)) { | ||
141 … | + // handle realtime updates | ||
142 … | + const { tagKey, author, message, tagged, timestamp } = item | ||
143 … | + if (tagged) { | ||
144 … | + update(author, { [tagKey]: { [message]: timestamp } }, tagsCache) | ||
145 … | + update(message, { [tagKey]: { [author]: timestamp } }, messagesCache) | ||
146 … | + } else { | ||
147 … | + update(author, { [tagKey]: { [message]: false } }, tagsCache) | ||
148 … | + update(message, { [tagKey]: { [author]: false } }, messagesCache) | ||
149 … | + } | ||
150 … | + } | ||
151 … | + }) | ||
152 … | + ) | ||
153 … | + } | ||
154 … | +} | ||
155 … | + | ||
156 … | +function getTaggedMessages(lookup, key) { | ||
157 … | + const messages = [] | ||
158 … | + for (const msg in lookup[key]) { | ||
159 … | + if (lookup[key][msg]) { | ||
160 … | + messages.push(msg) | ||
161 … | + } | ||
162 … | + } | ||
163 … | + return messages | ||
164 … | +} | ||
165 … | + | ||
166 … | +function getMessageTags(lookup) { | ||
167 … | + const tags = [] | ||
168 … | + for (const tag in lookup) { | ||
169 … | + if (!isEmpty(lookup[tag])) { | ||
170 … | + tags.push(tag) | ||
171 … | + } | ||
172 … | + } | ||
173 … | + return tags | ||
174 … | +} | ||
175 … | + | ||
176 … | +function getAllTags(lookup) { | ||
177 … | + const tags = Set([]) | ||
178 … | + for (const author in lookup) { | ||
179 … | + const authorTags = lookup[author]() | ||
180 … | + for (const tag in authorTags) { | ||
181 … | + tags.add(tag) | ||
182 … | + } | ||
183 … | + } | ||
184 … | + return tags | ||
185 … | +} |
Built with git-ssb-web