@welshman/store 0.14.0-pre4 → 0.14.0-pre5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/dist/store/src/{repository.d.ts → derive.d.ts} +33 -41
  2. package/dist/store/src/derive.d.ts.map +1 -0
  3. package/dist/store/src/derive.js +706 -0
  4. package/dist/store/src/derive.js.map +1 -0
  5. package/dist/store/src/index.d.ts +9 -1
  6. package/dist/store/src/index.d.ts.map +1 -1
  7. package/dist/store/src/index.js +9 -1
  8. package/dist/store/src/index.js.map +1 -1
  9. package/dist/store/src/misc.d.ts +2 -7
  10. package/dist/store/src/misc.d.ts.map +1 -1
  11. package/dist/store/src/misc.js +1 -1
  12. package/dist/store/src/misc.js.map +1 -1
  13. package/dist/{net/src/repository.d.ts → store/src/repository/adapters/memory.d.ts} +22 -30
  14. package/dist/store/src/repository/adapters/memory.d.ts.map +1 -0
  15. package/dist/{net/src/repository.js → store/src/repository/adapters/memory.js} +96 -106
  16. package/dist/store/src/repository/adapters/memory.js.map +1 -0
  17. package/dist/store/src/repository/adapters/sqlite/engine.d.ts +65 -0
  18. package/dist/store/src/repository/adapters/sqlite/engine.d.ts.map +1 -0
  19. package/dist/store/src/repository/adapters/sqlite/engine.js +420 -0
  20. package/dist/store/src/repository/adapters/sqlite/engine.js.map +1 -0
  21. package/dist/store/src/repository/adapters/sqlite/leader.d.ts +8 -0
  22. package/dist/store/src/repository/adapters/sqlite/leader.d.ts.map +1 -0
  23. package/dist/store/src/repository/adapters/sqlite/leader.js +222 -0
  24. package/dist/store/src/repository/adapters/sqlite/leader.js.map +1 -0
  25. package/dist/store/src/repository/adapters/sqlite/protocol.d.ts +52 -0
  26. package/dist/store/src/repository/adapters/sqlite/protocol.d.ts.map +1 -0
  27. package/dist/store/src/repository/adapters/sqlite/protocol.js +52 -0
  28. package/dist/store/src/repository/adapters/sqlite/protocol.js.map +1 -0
  29. package/dist/store/src/repository/adapters/sqlite/repository.d.ts +54 -0
  30. package/dist/store/src/repository/adapters/sqlite/repository.d.ts.map +1 -0
  31. package/dist/store/src/repository/adapters/sqlite/repository.js +238 -0
  32. package/dist/store/src/repository/adapters/sqlite/repository.js.map +1 -0
  33. package/dist/store/src/repository/adapters/sqlite/serve.d.ts +4 -0
  34. package/dist/store/src/repository/adapters/sqlite/serve.d.ts.map +1 -0
  35. package/dist/store/src/repository/adapters/sqlite/serve.js +39 -0
  36. package/dist/store/src/repository/adapters/sqlite/serve.js.map +1 -0
  37. package/dist/store/src/repository/adapters/sqlite/wasm.d.ts +7 -0
  38. package/dist/store/src/repository/adapters/sqlite/wasm.d.ts.map +1 -0
  39. package/dist/store/src/repository/adapters/sqlite/wasm.js +61 -0
  40. package/dist/store/src/repository/adapters/sqlite/wasm.js.map +1 -0
  41. package/dist/store/src/repository/adapters/sqlite/worker.d.ts +2 -0
  42. package/dist/store/src/repository/adapters/sqlite/worker.d.ts.map +1 -0
  43. package/dist/store/src/repository/adapters/sqlite/worker.js +4 -0
  44. package/dist/store/src/repository/adapters/sqlite/worker.js.map +1 -0
  45. package/dist/store/src/repository/core.d.ts +68 -0
  46. package/dist/store/src/repository/core.d.ts.map +1 -0
  47. package/dist/store/src/repository/core.js +123 -0
  48. package/dist/store/src/repository/core.js.map +1 -0
  49. package/dist/store/src/svelte.d.ts +22 -0
  50. package/dist/store/src/svelte.d.ts.map +1 -0
  51. package/dist/store/src/svelte.js +100 -0
  52. package/dist/store/src/svelte.js.map +1 -0
  53. package/dist/store/src/synced.d.ts +1 -1
  54. package/dist/store/src/synced.d.ts.map +1 -1
  55. package/dist/store/src/synced.js +1 -1
  56. package/dist/store/src/synced.js.map +1 -1
  57. package/dist/store/src/throttle.d.ts +1 -1
  58. package/dist/store/src/throttle.d.ts.map +1 -1
  59. package/dist/{net → store}/src/tracker.d.ts +2 -0
  60. package/dist/store/src/tracker.d.ts.map +1 -0
  61. package/dist/{net → store}/src/tracker.js +8 -4
  62. package/dist/store/src/tracker.js.map +1 -0
  63. package/dist/tsconfig.build.tsbuildinfo +1 -1
  64. package/dist/util/src/Command.d.ts +1 -1
  65. package/dist/util/src/Command.d.ts.map +1 -1
  66. package/dist/util/src/Command.js +12 -5
  67. package/dist/util/src/Command.js.map +1 -1
  68. package/dist/util/src/Events.d.ts +3 -2
  69. package/dist/util/src/Events.d.ts.map +1 -1
  70. package/dist/util/src/Events.js.map +1 -1
  71. package/dist/util/src/Kinds.d.ts +1 -0
  72. package/dist/util/src/Kinds.d.ts.map +1 -1
  73. package/dist/util/src/Kinds.js +1 -0
  74. package/dist/util/src/Kinds.js.map +1 -1
  75. package/dist/util/src/RelaySelection.d.ts +5 -0
  76. package/dist/util/src/RelaySelection.d.ts.map +1 -1
  77. package/dist/util/src/RelaySelection.js.map +1 -1
  78. package/dist/util/src/Tags.d.ts +5 -0
  79. package/dist/util/src/Tags.d.ts.map +1 -1
  80. package/dist/util/src/Tags.js +3 -0
  81. package/dist/util/src/Tags.js.map +1 -1
  82. package/dist/util/src/index.d.ts +1 -0
  83. package/dist/util/src/index.d.ts.map +1 -1
  84. package/dist/util/src/index.js +1 -0
  85. package/dist/util/src/index.js.map +1 -1
  86. package/package.json +31 -12
  87. package/dist/net/src/adapter.d.ts +0 -47
  88. package/dist/net/src/adapter.d.ts.map +0 -1
  89. package/dist/net/src/adapter.js +0 -139
  90. package/dist/net/src/adapter.js.map +0 -1
  91. package/dist/net/src/auth.d.ts +0 -40
  92. package/dist/net/src/auth.d.ts.map +0 -1
  93. package/dist/net/src/auth.js +0 -131
  94. package/dist/net/src/auth.js.map +0 -1
  95. package/dist/net/src/context.d.ts +0 -10
  96. package/dist/net/src/context.d.ts.map +0 -1
  97. package/dist/net/src/context.js +0 -2
  98. package/dist/net/src/context.js.map +0 -1
  99. package/dist/net/src/count.d.ts +0 -30
  100. package/dist/net/src/count.d.ts.map +0 -1
  101. package/dist/net/src/count.js +0 -97
  102. package/dist/net/src/count.js.map +0 -1
  103. package/dist/net/src/diff.d.ts +0 -57
  104. package/dist/net/src/diff.d.ts.map +0 -1
  105. package/dist/net/src/diff.js +0 -169
  106. package/dist/net/src/diff.js.map +0 -1
  107. package/dist/net/src/index.d.ts +0 -17
  108. package/dist/net/src/index.d.ts.map +0 -1
  109. package/dist/net/src/index.js +0 -17
  110. package/dist/net/src/index.js.map +0 -1
  111. package/dist/net/src/message.d.ts +0 -106
  112. package/dist/net/src/message.d.ts.map +0 -1
  113. package/dist/net/src/message.js +0 -98
  114. package/dist/net/src/message.js.map +0 -1
  115. package/dist/net/src/multiplex.d.ts +0 -14
  116. package/dist/net/src/multiplex.d.ts.map +0 -1
  117. package/dist/net/src/multiplex.js +0 -219
  118. package/dist/net/src/multiplex.js.map +0 -1
  119. package/dist/net/src/negentropy.d.ts +0 -48
  120. package/dist/net/src/negentropy.d.ts.map +0 -1
  121. package/dist/net/src/negentropy.js +0 -528
  122. package/dist/net/src/negentropy.js.map +0 -1
  123. package/dist/net/src/policy.d.ts +0 -63
  124. package/dist/net/src/policy.d.ts.map +0 -1
  125. package/dist/net/src/policy.js +0 -388
  126. package/dist/net/src/policy.js.map +0 -1
  127. package/dist/net/src/pool.d.ts +0 -15
  128. package/dist/net/src/pool.d.ts.map +0 -1
  129. package/dist/net/src/pool.js +0 -51
  130. package/dist/net/src/pool.js.map +0 -1
  131. package/dist/net/src/publish.d.ts +0 -47
  132. package/dist/net/src/publish.d.ts.map +0 -1
  133. package/dist/net/src/publish.js +0 -112
  134. package/dist/net/src/publish.js.map +0 -1
  135. package/dist/net/src/repository.d.ts.map +0 -1
  136. package/dist/net/src/repository.js.map +0 -1
  137. package/dist/net/src/request.d.ts +0 -38
  138. package/dist/net/src/request.d.ts.map +0 -1
  139. package/dist/net/src/request.js +0 -220
  140. package/dist/net/src/request.js.map +0 -1
  141. package/dist/net/src/socket.d.ts +0 -52
  142. package/dist/net/src/socket.d.ts.map +0 -1
  143. package/dist/net/src/socket.js +0 -134
  144. package/dist/net/src/socket.js.map +0 -1
  145. package/dist/net/src/tracker.d.ts.map +0 -1
  146. package/dist/net/src/tracker.js.map +0 -1
  147. package/dist/net/src/util.d.ts +0 -18
  148. package/dist/net/src/util.d.ts.map +0 -1
  149. package/dist/net/src/util.js +0 -25
  150. package/dist/net/src/util.js.map +0 -1
  151. package/dist/net/src/wrapManager.d.ts +0 -34
  152. package/dist/net/src/wrapManager.d.ts.map +0 -1
  153. package/dist/net/src/wrapManager.js +0 -79
  154. package/dist/net/src/wrapManager.js.map +0 -1
  155. package/dist/store/src/repository.d.ts.map +0 -1
  156. package/dist/store/src/repository.js +0 -580
  157. package/dist/store/src/repository.js.map +0 -1
@@ -1,79 +0,0 @@
1
- import { Emitter, remove, omit, pushToMapKey } from "@welshman/lib";
2
- export class WrapManager extends Emitter {
3
- options;
4
- _wrapIndex = new Map();
5
- _rumorIndex = new Map();
6
- constructor(options) {
7
- super();
8
- this.options = options;
9
- }
10
- // Reading/exporting
11
- dump = () => Array.from(this._wrapIndex.values());
12
- getWraps = (rumorId) => (this._rumorIndex.get(rumorId) || []).map(wrapId => this._wrapIndex.get(wrapId));
13
- getRumor = (wrapId) => {
14
- const wrapItem = this._wrapIndex.get(wrapId);
15
- if (wrapItem) {
16
- return this.options.repository.getEvent(wrapItem.rumorId);
17
- }
18
- };
19
- // Adding/importing
20
- clear = () => {
21
- this._wrapIndex.clear();
22
- this._rumorIndex.clear();
23
- this.emit("clear");
24
- };
25
- load = (wrapItems) => {
26
- this._wrapIndex.clear();
27
- this._rumorIndex.clear();
28
- for (const wrapItem of wrapItems) {
29
- this._add(wrapItem);
30
- }
31
- this.emit("load");
32
- };
33
- add = ({ recipient, rumor, wrap }) => {
34
- const wrapItem = {
35
- ...omit(["content"], wrap),
36
- rumorId: rumor.id,
37
- recipient,
38
- };
39
- this._add(wrapItem);
40
- // Save to our repository
41
- this.options.repository.publish(rumor);
42
- // Mark the rumor as having come from the wrap's urls
43
- this.options.tracker.copy(wrap.id, rumor.id);
44
- this.emit("add", wrapItem);
45
- };
46
- // Removing
47
- remove = (id) => {
48
- const wrapItem = this._wrapIndex.get(id);
49
- if (wrapItem) {
50
- this._remove(wrapItem);
51
- // Another wrap may carry the same rumor
52
- if (!this._rumorIndex.has(wrapItem.rumorId)) {
53
- this.options.repository.removeEvent(wrapItem.rumorId);
54
- }
55
- this.emit("remove", wrapItem);
56
- }
57
- };
58
- removeByRumorId = (rumorId) => {
59
- for (const id of this._rumorIndex.get(rumorId) || []) {
60
- this.remove(id);
61
- }
62
- };
63
- // Utils
64
- _add = (wrapItem) => {
65
- this._wrapIndex.set(wrapItem.id, wrapItem);
66
- pushToMapKey(this._rumorIndex, wrapItem.rumorId, wrapItem.id);
67
- };
68
- _remove = (wrapItem) => {
69
- const wrapIds = remove(wrapItem.id, this._rumorIndex.get(wrapItem.rumorId) || []);
70
- this._wrapIndex.delete(wrapItem.id);
71
- if (wrapIds.length > 0) {
72
- this._rumorIndex.set(wrapItem.rumorId, wrapIds);
73
- }
74
- else {
75
- this._rumorIndex.delete(wrapItem.rumorId);
76
- }
77
- };
78
- }
79
- //# sourceMappingURL=wrapManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wrapManager.js","sourceRoot":"","sources":["../../../../net/src/wrapManager.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/repository.ts"],"names":[],"mappings":"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"}
@@ -1,580 +0,0 @@
1
- import { derived, readable } from "svelte/store";
2
- import { on, gt, now, noop, mapPop, LRUCache, call, sortBy, first, } from "@welshman/lib";
3
- import { matchFilters, getIdFilters, sortEventsAsc, sortEventsDesc, getIdOrAddress, } from "@welshman/util";
4
- import { deriveDeduplicated, projection, projectFrom } from "./misc.js";
5
- export const getEventsById = ({ filters, repository, includeDeleted }) => {
6
- const eventsById = new Map();
7
- for (const event of repository.query(filters, { includeDeleted })) {
8
- eventsById.set(event.id, event);
9
- }
10
- return eventsById;
11
- };
12
- export const deriveEventsById = (options) => {
13
- const { filters, repository, includeDeleted } = options;
14
- const store = readable(new Map(), set => {
15
- const eventsById = getEventsById(options);
16
- set(eventsById);
17
- return on(repository, "update", ({ added, removed }) => {
18
- let dirty = false;
19
- for (const event of added) {
20
- if (matchFilters(filters, event)) {
21
- dirty = true;
22
- eventsById.set(event.id, event);
23
- }
24
- }
25
- if (!includeDeleted) {
26
- for (const id of removed) {
27
- if (mapPop(id, eventsById)) {
28
- dirty = true;
29
- }
30
- }
31
- }
32
- if (dirty) {
33
- set(eventsById);
34
- }
35
- });
36
- });
37
- return projection(store, () => getEventsById(options));
38
- };
39
- export const deriveArray = (itemsById) => projectFrom(itemsById, $itemsById => Array.from($itemsById.values()));
40
- export const deriveEventsAsc = (eventsById) => projectFrom(eventsById, $eventsById => sortEventsAsc($eventsById.values()));
41
- export const deriveEventsDesc = (eventsById) => projectFrom(eventsById, $eventsById => sortEventsDesc($eventsById.values()));
42
- export const deriveEvents = (options) => deriveArray(deriveEventsById(options));
43
- export const makeDeriveEvent = ({ repository, includeDeleted = false, onDerive }) => {
44
- return (idOrAddress, ...args) => {
45
- const filters = getIdFilters([idOrAddress]);
46
- onDerive?.(filters, ...args);
47
- const store = readable(undefined, set => {
48
- let event = first(repository.query(filters, { includeDeleted }));
49
- set(event);
50
- return on(repository, "update", ({ added, removed }) => {
51
- if (!includeDeleted) {
52
- for (const id of removed) {
53
- if (event?.id === id) {
54
- set(undefined);
55
- }
56
- }
57
- }
58
- for (const newEvent of added) {
59
- if (matchFilters(filters, newEvent)) {
60
- event = newEvent;
61
- set(event);
62
- }
63
- }
64
- });
65
- });
66
- return projection(store, () => first(repository.query(filters, { includeDeleted })));
67
- };
68
- };
69
- export const getEventsByIdByUrl = ({ filters, tracker, repository, includeDeleted, }) => {
70
- const eventsByIdByUrl = new Map();
71
- for (const event of repository.query(filters, { includeDeleted })) {
72
- for (const url of tracker.getRelays(event.id)) {
73
- let eventsById = eventsByIdByUrl.get(url);
74
- if (!eventsById) {
75
- eventsById = new Map();
76
- eventsByIdByUrl.set(url, eventsById);
77
- }
78
- eventsById.set(event.id, event);
79
- }
80
- }
81
- return eventsByIdByUrl;
82
- };
83
- export const deriveEventsByIdByUrl = (options) => {
84
- const { filters, tracker, repository, includeDeleted } = options;
85
- const store = readable(new Map(), set => {
86
- const eventsByIdByUrl = getEventsByIdByUrl(options);
87
- const addEvent = (url, event) => {
88
- if (!matchFilters(filters, event))
89
- return false;
90
- const eventsById = eventsByIdByUrl.get(url);
91
- // The repository swaps a changed copy of a held event in under the same id.
92
- if (eventsById?.get(event.id) === event)
93
- return false;
94
- // Create a new map so we can detect which key changed
95
- const newEventsById = new Map(eventsById);
96
- newEventsById.set(event.id, event);
97
- eventsByIdByUrl.set(url, newEventsById);
98
- return true;
99
- };
100
- const removeEvent = (url, id) => {
101
- const eventsById = eventsByIdByUrl.get(url);
102
- if (eventsById?.has(id)) {
103
- eventsById.delete(id);
104
- if (eventsById.size === 0) {
105
- eventsByIdByUrl.delete(url);
106
- }
107
- else {
108
- // Create a new map so we can detect which key changed
109
- eventsByIdByUrl.set(url, new Map(eventsById));
110
- }
111
- return true;
112
- }
113
- return false;
114
- };
115
- set(eventsByIdByUrl);
116
- const unsubscribers = [
117
- on(repository, "update", ({ added, removed }) => {
118
- let dirty = false;
119
- for (const event of added) {
120
- for (const url of tracker.getRelays(event.id)) {
121
- dirty = addEvent(url, event) || dirty;
122
- }
123
- }
124
- if (!includeDeleted) {
125
- for (const id of removed) {
126
- for (const url of tracker.getRelays(id)) {
127
- dirty = removeEvent(url, id) || dirty;
128
- }
129
- }
130
- }
131
- if (dirty) {
132
- set(eventsByIdByUrl);
133
- }
134
- }),
135
- on(tracker, "add", (id, url) => {
136
- const event = repository.getEvent(id);
137
- if (event && addEvent(url, event)) {
138
- set(eventsByIdByUrl);
139
- }
140
- }),
141
- on(tracker, "remove", (id, url) => {
142
- if (removeEvent(url, id)) {
143
- set(eventsByIdByUrl);
144
- }
145
- }),
146
- on(tracker, "load", () => {
147
- eventsByIdByUrl.clear();
148
- for (const event of repository.query(filters, { includeDeleted })) {
149
- for (const url of tracker.getRelays(event.id)) {
150
- addEvent(url, event);
151
- }
152
- }
153
- set(eventsByIdByUrl);
154
- }),
155
- on(tracker, "clear", () => {
156
- eventsByIdByUrl.clear();
157
- set(eventsByIdByUrl);
158
- }),
159
- ];
160
- return () => unsubscribers.forEach(call);
161
- });
162
- return projection(store, () => getEventsByIdByUrl(options));
163
- };
164
- /**
165
- * The events one relay has been seen to hold, narrowed by the filters. The filters choose the
166
- * index and the tracker answers provenance per event, so the cost tracks what the caller asked
167
- * for, and a limit counts only events on the relay.
168
- */
169
- export const getEventsByIdForUrl = ({ url, filters, tracker, repository, includeDeleted, }) => {
170
- const eventsById = new Map();
171
- const where = (event) => tracker.hasRelay(event.id, url);
172
- for (const event of repository.query(filters, { includeDeleted, where })) {
173
- eventsById.set(event.id, event);
174
- }
175
- return eventsById;
176
- };
177
- export const deriveEventsByIdForUrl = (options) => {
178
- const { url, filters, tracker, repository, includeDeleted } = options;
179
- const belongs = (event) => tracker.hasRelay(event.id, url) && matchFilters(filters, event);
180
- let eventsById = getEventsByIdForUrl(options);
181
- const store = readable(eventsById, set => {
182
- const reset = () => {
183
- eventsById = getEventsByIdForUrl(options);
184
- set(eventsById);
185
- };
186
- reset();
187
- const unsubscribers = [
188
- on(repository, "update", ({ added, removed }) => {
189
- let dirty = false;
190
- for (const event of added) {
191
- if (belongs(event)) {
192
- eventsById.set(event.id, event);
193
- dirty = true;
194
- }
195
- }
196
- if (!includeDeleted) {
197
- for (const id of removed) {
198
- if (eventsById.has(id)) {
199
- eventsById.delete(id);
200
- dirty = true;
201
- }
202
- }
203
- }
204
- if (dirty) {
205
- set(eventsById);
206
- }
207
- }),
208
- on(tracker, "add", (id, trackedUrl) => {
209
- if (trackedUrl === url) {
210
- const event = repository.getEvent(id);
211
- if (event && belongs(event)) {
212
- eventsById.set(id, event);
213
- set(eventsById);
214
- }
215
- }
216
- }),
217
- on(tracker, "remove", (id, trackedUrl) => {
218
- if (trackedUrl === url && eventsById.has(id)) {
219
- eventsById.delete(id);
220
- set(eventsById);
221
- }
222
- }),
223
- on(tracker, "load", reset),
224
- on(tracker, "clear", reset),
225
- ];
226
- return () => unsubscribers.forEach(call);
227
- });
228
- return projection(store, () => getEventsByIdForUrl(options));
229
- };
230
- const asCollection = (store, pending) => {
231
- const self = projection(store);
232
- // Subscribing queues the parses, so a key the index lacks is read, drained, and read again
233
- const read = (key) => self.get().get(key) ?? Promise.all(pending.values()).then(() => self.get().get(key));
234
- return { ...self, read };
235
- };
236
- const onParseError = (error) => console.warn("Failed to build an item from an event", error);
237
- /**
238
- * Build `event`'s item and pass it to `commit`, synchronously when the parse needs no IO.
239
- * An async parse waits in `pending`, and deleting its entry there cancels the commit.
240
- */
241
- const buildItem = (event, eventToItem, pending, commit) => {
242
- let changed = false;
243
- try {
244
- const itemOrPromise = eventToItem(event);
245
- if (itemOrPromise instanceof Promise) {
246
- const isPending = () => pending.get(event.id) === parse;
247
- const parse = itemOrPromise
248
- .then(item => {
249
- if (isPending())
250
- commit(item);
251
- })
252
- .catch(onParseError)
253
- .finally(() => {
254
- if (isPending())
255
- pending.delete(event.id);
256
- });
257
- pending.set(event.id, parse);
258
- }
259
- else {
260
- changed = Boolean(commit(itemOrPromise));
261
- }
262
- }
263
- catch (error) {
264
- onParseError(error);
265
- }
266
- return changed;
267
- };
268
- export const deriveItemsByKey = ({ getKey, filters, repository, eventToItem, includeDeleted, }) => {
269
- const pending = new Map();
270
- const itemsByKey = new Map();
271
- // The event owning each key, so removing a superseded event leaves its successor's entry
272
- const ownerByKey = new Map();
273
- // The key each event contributed, for teardown.
274
- const keyById = new Map();
275
- const store = readable(itemsByKey, set => {
276
- const commit = (id, item) => {
277
- if (item) {
278
- const key = getKey(item);
279
- itemsByKey.set(key, item);
280
- ownerByKey.set(key, id);
281
- keyById.set(id, key);
282
- set(itemsByKey);
283
- }
284
- };
285
- const addEvent = (event) => {
286
- if (!pending.has(event.id) && !keyById.has(event.id)) {
287
- buildItem(event, eventToItem, pending, item => commit(event.id, item));
288
- }
289
- };
290
- const removeEvent = (id) => {
291
- const key = mapPop(id, keyById);
292
- const owns = key !== undefined && ownerByKey.get(key) === id;
293
- pending.delete(id);
294
- if (owns) {
295
- ownerByKey.delete(key);
296
- itemsByKey.delete(key);
297
- }
298
- return owns;
299
- };
300
- // The index outlives a subscription, so a subscribe drops what left the repository meanwhile
301
- const catchUp = () => {
302
- const events = repository.query(filters, { includeDeleted });
303
- const ids = new Set(events.map(event => event.id));
304
- let dirty = false;
305
- for (const id of Array.from(keyById.keys())) {
306
- if (!ids.has(id)) {
307
- dirty = removeEvent(id) || dirty;
308
- }
309
- }
310
- if (dirty)
311
- set(itemsByKey);
312
- for (const event of events) {
313
- addEvent(event);
314
- }
315
- };
316
- catchUp();
317
- return on(repository, "update", ({ added, removed }) => {
318
- for (const event of added) {
319
- if (matchFilters(filters, event)) {
320
- addEvent(event);
321
- }
322
- }
323
- if (!includeDeleted) {
324
- let dirty = false;
325
- for (const id of removed) {
326
- dirty = removeEvent(id) || dirty;
327
- }
328
- if (dirty) {
329
- set(itemsByKey);
330
- }
331
- }
332
- });
333
- });
334
- return asCollection(store, pending);
335
- };
336
- /**
337
- * Like `deriveItemsByKey`, but relay-scoped: an event is keyed once per relay
338
- * it has been seen on (via the tracker), using `getKey(item, url)`. This is the
339
- * substrate for relay-dependent collections — NIP-29 rooms, relay membership,
340
- * relay roles — where the same addressable coordinate can exist independently
341
- * on multiple relays.
342
- */
343
- export const deriveItemsByKeyByUrl = ({ getKey, filters, repository, tracker, eventToItem, includeDeleted, revalidateOn, }) => {
344
- const pending = new Map();
345
- const itemsByKey = new Map();
346
- // Which event currently owns each key, as in `deriveItemsByKey`.
347
- const ownerByKey = new Map();
348
- // The key each event contributed on each relay url, for teardown.
349
- const keysById = new Map();
350
- // What each event parsed to, so a rebuild re-keys it without parsing it again.
351
- const itemsById = new Map();
352
- const store = readable(itemsByKey, set => {
353
- // Held while a catch-up keys its events, so a rebuild emits once rather than per event
354
- let holding = false;
355
- const setKey = (key, id, url, item) => {
356
- itemsByKey.set(key, item);
357
- ownerByKey.set(key, id);
358
- let byUrl = keysById.get(id);
359
- if (!byUrl) {
360
- byUrl = new Map();
361
- keysById.set(id, byUrl);
362
- }
363
- byUrl.set(url, key);
364
- };
365
- const dropKey = (key, id) => {
366
- // Only remove if this id still owns the key (guards against a replaceable
367
- // event having already taken it over).
368
- if (ownerByKey.get(key) === id) {
369
- itemsByKey.delete(key);
370
- ownerByKey.delete(key);
371
- return true;
372
- }
373
- return false;
374
- };
375
- // Keys the item on each tracked relay it lacks a key for, including relays seen mid-parse
376
- const commit = (id, item) => {
377
- let keyed = false;
378
- if (item) {
379
- itemsById.set(id, item);
380
- for (const url of tracker.getRelays(id)) {
381
- const key = keysById.get(id)?.has(url) ? undefined : getKey(item, url);
382
- if (key !== undefined) {
383
- setKey(key, id, url, item);
384
- keyed = true;
385
- }
386
- }
387
- // Emit only when some url keyed the item
388
- if (keyed && !holding)
389
- set(itemsByKey);
390
- }
391
- return keyed;
392
- };
393
- const addEvent = (event) => {
394
- const parsed = itemsById.get(event.id);
395
- let keyed = false;
396
- // A rebuild clears the keys and keeps the items, so re-keying needs no parse
397
- if (parsed) {
398
- keyed = commit(event.id, parsed);
399
- }
400
- else if (!pending.has(event.id)) {
401
- keyed = buildItem(event, eventToItem, pending, item => commit(event.id, item));
402
- }
403
- return keyed;
404
- };
405
- const removeEvent = (id) => {
406
- const byUrl = mapPop(id, keysById);
407
- let dirty = false;
408
- pending.delete(id);
409
- itemsById.delete(id);
410
- for (const key of byUrl?.values() ?? []) {
411
- dirty = dropKey(key, id) || dirty;
412
- }
413
- return dirty;
414
- };
415
- const removeEventUrl = (id, url) => {
416
- const byUrl = keysById.get(id);
417
- const key = byUrl?.get(url);
418
- if (!byUrl || key === undefined)
419
- return false;
420
- byUrl.delete(url);
421
- if (byUrl.size === 0) {
422
- keysById.delete(id);
423
- }
424
- return dropKey(key, id);
425
- };
426
- const catchUp = (cleared = false) => {
427
- const events = repository.query(filters, { includeDeleted });
428
- const ids = new Set(events.map(event => event.id));
429
- let dirty = cleared;
430
- for (const id of Array.from(keysById.keys())) {
431
- if (!ids.has(id)) {
432
- dirty = removeEvent(id) || dirty;
433
- }
434
- }
435
- holding = true;
436
- for (const event of events) {
437
- dirty = addEvent(event) || dirty;
438
- }
439
- holding = false;
440
- if (dirty)
441
- set(itemsByKey);
442
- };
443
- const clear = () => {
444
- const dirty = itemsByKey.size > 0;
445
- itemsByKey.clear();
446
- ownerByKey.clear();
447
- keysById.clear();
448
- return dirty;
449
- };
450
- const rebuild = () => catchUp(clear());
451
- catchUp();
452
- const unsubscribers = [
453
- on(repository, "update", ({ added, removed }) => {
454
- for (const event of added) {
455
- if (matchFilters(filters, event)) {
456
- addEvent(event);
457
- }
458
- }
459
- if (!includeDeleted) {
460
- let dirty = false;
461
- for (const id of removed) {
462
- dirty = removeEvent(id) || dirty;
463
- }
464
- if (dirty)
465
- set(itemsByKey);
466
- }
467
- }),
468
- on(tracker, "add", (id, url) => {
469
- const event = repository.getEvent(id);
470
- if (event && matchFilters(filters, event)) {
471
- addEvent(event);
472
- }
473
- }),
474
- on(tracker, "remove", (id, url) => {
475
- if (removeEventUrl(id, url)) {
476
- set(itemsByKey);
477
- }
478
- }),
479
- on(tracker, "load", rebuild),
480
- on(tracker, "clear", () => {
481
- if (clear())
482
- set(itemsByKey);
483
- }),
484
- ];
485
- // Re-evaluate everything when external key state (e.g. relay self pubkeys)
486
- // changes. The first emission fires synchronously on subscribe and is the
487
- // initial state we already built, so skip it.
488
- if (revalidateOn) {
489
- let initialized = false;
490
- unsubscribers.push(revalidateOn.subscribe(() => {
491
- if (initialized) {
492
- rebuild();
493
- }
494
- else {
495
- initialized = true;
496
- }
497
- }));
498
- }
499
- return () => unsubscribers.forEach(call);
500
- });
501
- return asCollection(store, pending);
502
- };
503
- export const deriveItems = (itemsByKeyStore) => derived(itemsByKeyStore, itemsByKey => Array.from(itemsByKey.values()));
504
- export const deriveItemsSorted = (sortFn, itemsStore) => derived(itemsStore, items => sortBy(sortFn, items));
505
- export const makeDeriveItem = (itemsByKeyStore, onDerive) => {
506
- return (key, ...args) => {
507
- if (!key)
508
- return readable(undefined);
509
- // Nothing awaits this, so a failed load has nowhere to go
510
- Promise.resolve(onDerive?.(key, ...args)).catch(noop);
511
- return deriveDeduplicated(itemsByKeyStore, itemsByKey => itemsByKey.get(key));
512
- };
513
- };
514
- export const makeForceLoadItem = (loadItem, getItem) => {
515
- return async (key, ...args) => {
516
- await loadItem(key, ...args);
517
- return getItem(key);
518
- };
519
- };
520
- export const makeLoadItem = (loadItem, getItem, options = {}) => {
521
- const timeout = options.timeout || 3600;
522
- const maxSize = options.maxSize || 10_000;
523
- const fetched = new LRUCache(maxSize);
524
- const getFetched = options.getFetched || ((key) => fetched.get(key) || 0);
525
- const setFetched = options.setFetched || ((key, ts) => fetched.set(key, ts));
526
- const getSource = options.getSource || ((...args) => JSON.stringify(args));
527
- const sourceFetched = new LRUCache(maxSize);
528
- const attempts = new LRUCache(maxSize);
529
- const pending = new Map();
530
- return async (key, ...args) => {
531
- const stale = await getItem(key);
532
- // If we have an item, reload if it's relatively recent
533
- if (stale && getFetched(key) > now() - timeout) {
534
- return stale;
535
- }
536
- const source = `${key}:${getSource(...args)}`;
537
- const pendingItem = pending.get(source);
538
- // If we already are loading from this source, await and return
539
- if (pendingItem) {
540
- return pendingItem;
541
- }
542
- const attempt = attempts.get(source) || 0;
543
- // Use exponential backoff to throttle repeat attempts against the same source
544
- if (gt(sourceFetched.get(source), now() - Math.pow(2, attempt))) {
545
- return stale;
546
- }
547
- attempts.set(source, attempt + 1);
548
- sourceFetched.set(source, now());
549
- setFetched(key, now());
550
- const promise = loadItem(key, ...args).then(() => getItem(key));
551
- pending.set(source, promise);
552
- let item;
553
- try {
554
- item = await promise;
555
- }
556
- finally {
557
- pending.delete(source);
558
- }
559
- if (item) {
560
- attempts.pop(source);
561
- }
562
- return item;
563
- };
564
- };
565
- // Miscellaneous other stuff
566
- export const deriveIsDeleted = (repository, event) => projection(readable(false, set => {
567
- const idOrAddress = getIdOrAddress(event);
568
- set(repository.isDeleted(event));
569
- return on(repository, "update", ({ removed, added }) => {
570
- if (removed.has(event.id)) {
571
- set(true);
572
- }
573
- for (const event of added) {
574
- if (getIdOrAddress(event) === idOrAddress) {
575
- set(false);
576
- }
577
- }
578
- });
579
- }), () => repository.isDeleted(event));
580
- //# sourceMappingURL=repository.js.map