@wovin/core 0.0.0-ciao-mobx-955482e8

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 (180) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +3 -0
  3. package/dist/applog/applog-helpers.d.ts +47 -0
  4. package/dist/applog/applog-helpers.d.ts.map +1 -0
  5. package/dist/applog/applog-utils.d.ts +57 -0
  6. package/dist/applog/applog-utils.d.ts.map +1 -0
  7. package/dist/applog/datom-types.d.ts +128 -0
  8. package/dist/applog/datom-types.d.ts.map +1 -0
  9. package/dist/applog.d.ts +4 -0
  10. package/dist/applog.d.ts.map +1 -0
  11. package/dist/applog.js +101 -0
  12. package/dist/applog.js.map +1 -0
  13. package/dist/blockstore/index.d.ts +21 -0
  14. package/dist/blockstore/index.d.ts.map +1 -0
  15. package/dist/blockstore.d.ts +2 -0
  16. package/dist/blockstore.d.ts.map +1 -0
  17. package/dist/blockstore.js +24 -0
  18. package/dist/blockstore.js.map +1 -0
  19. package/dist/chunk-6MQKRL6W.js +86 -0
  20. package/dist/chunk-6MQKRL6W.js.map +1 -0
  21. package/dist/chunk-7MW34UEO.js +40 -0
  22. package/dist/chunk-7MW34UEO.js.map +1 -0
  23. package/dist/chunk-7Z5YDQKK.js +1 -0
  24. package/dist/chunk-7Z5YDQKK.js.map +1 -0
  25. package/dist/chunk-CY4NLISM.js +144 -0
  26. package/dist/chunk-CY4NLISM.js.map +1 -0
  27. package/dist/chunk-E46VTKTZ.js +1 -0
  28. package/dist/chunk-E46VTKTZ.js.map +1 -0
  29. package/dist/chunk-O43W7UW6.js +434 -0
  30. package/dist/chunk-O43W7UW6.js.map +1 -0
  31. package/dist/chunk-XIQSYEV3.js +1604 -0
  32. package/dist/chunk-XIQSYEV3.js.map +1 -0
  33. package/dist/chunk-XVGW4QC3.js +55 -0
  34. package/dist/chunk-XVGW4QC3.js.map +1 -0
  35. package/dist/chunk-YDAKBU6Q.js +9 -0
  36. package/dist/chunk-YDAKBU6Q.js.map +1 -0
  37. package/dist/chunk-ZAADLBSB.js +36 -0
  38. package/dist/chunk-ZAADLBSB.js.map +1 -0
  39. package/dist/chunk-ZXCJRYD7.js +883 -0
  40. package/dist/chunk-ZXCJRYD7.js.map +1 -0
  41. package/dist/index.d.ts +8 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +354 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/ipfs/car.d.ts +59 -0
  46. package/dist/ipfs/car.d.ts.map +1 -0
  47. package/dist/ipfs/fetch-snapshot-chain.d.ts +32 -0
  48. package/dist/ipfs/fetch-snapshot-chain.d.ts.map +1 -0
  49. package/dist/ipfs/ipfs-utils.d.ts +35 -0
  50. package/dist/ipfs/ipfs-utils.d.ts.map +1 -0
  51. package/dist/ipfs.d.ts +4 -0
  52. package/dist/ipfs.d.ts.map +1 -0
  53. package/dist/ipfs.js +60 -0
  54. package/dist/ipfs.js.map +1 -0
  55. package/dist/ipns/ipns-record.d.ts +34 -0
  56. package/dist/ipns/ipns-record.d.ts.map +1 -0
  57. package/dist/ipns.d.ts +2 -0
  58. package/dist/ipns.d.ts.map +1 -0
  59. package/dist/ipns.js +64 -0
  60. package/dist/ipns.js.map +1 -0
  61. package/dist/pubsub/connector.d.ts +9 -0
  62. package/dist/pubsub/connector.d.ts.map +1 -0
  63. package/dist/pubsub/pub-pull.d.ts +14 -0
  64. package/dist/pubsub/pub-pull.d.ts.map +1 -0
  65. package/dist/pubsub/pubsub-types.d.ts +72 -0
  66. package/dist/pubsub/pubsub-types.d.ts.map +1 -0
  67. package/dist/pubsub/snap-push.d.ts +41 -0
  68. package/dist/pubsub/snap-push.d.ts.map +1 -0
  69. package/dist/pubsub/ucan-example.d.ts +3 -0
  70. package/dist/pubsub/ucan-example.d.ts.map +1 -0
  71. package/dist/pubsub/ucan.d.ts +16 -0
  72. package/dist/pubsub/ucan.d.ts.map +1 -0
  73. package/dist/pubsub.d.ts +5 -0
  74. package/dist/pubsub.d.ts.map +1 -0
  75. package/dist/pubsub.js +31 -0
  76. package/dist/pubsub.js.map +1 -0
  77. package/dist/query/basic.d.ts +105 -0
  78. package/dist/query/basic.d.ts.map +1 -0
  79. package/dist/query/divergences.d.ts +12 -0
  80. package/dist/query/divergences.d.ts.map +1 -0
  81. package/dist/query/matchers.d.ts +4 -0
  82. package/dist/query/matchers.d.ts.map +1 -0
  83. package/dist/query/memoized.d.ts +66 -0
  84. package/dist/query/memoized.d.ts.map +1 -0
  85. package/dist/query/query-steps.d.ts +4 -0
  86. package/dist/query/query-steps.d.ts.map +1 -0
  87. package/dist/query/situations.d.ts +80 -0
  88. package/dist/query/situations.d.ts.map +1 -0
  89. package/dist/query/subscribable.d.ts +102 -0
  90. package/dist/query/subscribable.d.ts.map +1 -0
  91. package/dist/query/types.d.ts +70 -0
  92. package/dist/query/types.d.ts.map +1 -0
  93. package/dist/query.d.ts +8 -0
  94. package/dist/query.d.ts.map +1 -0
  95. package/dist/query.js +108 -0
  96. package/dist/query.js.map +1 -0
  97. package/dist/retrieve/index.d.ts +2 -0
  98. package/dist/retrieve/index.d.ts.map +1 -0
  99. package/dist/retrieve/update-thread.d.ts +64 -0
  100. package/dist/retrieve/update-thread.d.ts.map +1 -0
  101. package/dist/retrieve.d.ts +2 -0
  102. package/dist/retrieve.d.ts.map +1 -0
  103. package/dist/retrieve.js +14 -0
  104. package/dist/retrieve.js.map +1 -0
  105. package/dist/thread/basic.d.ts +60 -0
  106. package/dist/thread/basic.d.ts.map +1 -0
  107. package/dist/thread/filters.d.ts +47 -0
  108. package/dist/thread/filters.d.ts.map +1 -0
  109. package/dist/thread/mapped.d.ts +31 -0
  110. package/dist/thread/mapped.d.ts.map +1 -0
  111. package/dist/thread/utils.d.ts +23 -0
  112. package/dist/thread/utils.d.ts.map +1 -0
  113. package/dist/thread/writeable.d.ts +41 -0
  114. package/dist/thread/writeable.d.ts.map +1 -0
  115. package/dist/thread.d.ts +6 -0
  116. package/dist/thread.d.ts.map +1 -0
  117. package/dist/thread.js +54 -0
  118. package/dist/thread.js.map +1 -0
  119. package/dist/types/typescript-utils.d.ts +34 -0
  120. package/dist/types/typescript-utils.d.ts.map +1 -0
  121. package/dist/types.d.ts +2 -0
  122. package/dist/types.d.ts.map +1 -0
  123. package/dist/types.js +26 -0
  124. package/dist/types.js.map +1 -0
  125. package/dist/utils/debug-name.d.ts +13 -0
  126. package/dist/utils/debug-name.d.ts.map +1 -0
  127. package/dist/utils.d.ts +4 -0
  128. package/dist/utils.d.ts.map +1 -0
  129. package/dist/utils.js +9 -0
  130. package/dist/utils.js.map +1 -0
  131. package/package.json +110 -0
  132. package/src/applog/applog-helpers.ts +150 -0
  133. package/src/applog/applog-utils.ts +398 -0
  134. package/src/applog/datom-types.ts +148 -0
  135. package/src/applog.ts +3 -0
  136. package/src/blockstore/index.ts +36 -0
  137. package/src/blockstore.ts +1 -0
  138. package/src/index.ts +8 -0
  139. package/src/ipfs/car.ts +291 -0
  140. package/src/ipfs/fetch-snapshot-chain.ts +135 -0
  141. package/src/ipfs/ipfs-utils.ts +132 -0
  142. package/src/ipfs.ts +3 -0
  143. package/src/ipns/ipns-record.ts +115 -0
  144. package/src/ipns.ts +1 -0
  145. package/src/pubsub/UCAN Specs Overview.md +217 -0
  146. package/src/pubsub/connector.ts +9 -0
  147. package/src/pubsub/pub-pull.ts +31 -0
  148. package/src/pubsub/pubsub-types.ts +90 -0
  149. package/src/pubsub/snap-push.ts +277 -0
  150. package/src/pubsub/ucan-example.ts +61 -0
  151. package/src/pubsub/ucan.ts +56 -0
  152. package/src/pubsub.ts +4 -0
  153. package/src/query/basic.ts +1061 -0
  154. package/src/query/divergences.ts +50 -0
  155. package/src/query/matchers.ts +8 -0
  156. package/src/query/memoized.test.ts +151 -0
  157. package/src/query/memoized.ts +180 -0
  158. package/src/query/query-steps.ts +4 -0
  159. package/src/query/query.test.ts +536 -0
  160. package/src/query/situations.ts +261 -0
  161. package/src/query/subscribable.test.ts +245 -0
  162. package/src/query/subscribable.ts +225 -0
  163. package/src/query/types.ts +155 -0
  164. package/src/query.ts +7 -0
  165. package/src/retrieve/index.ts +1 -0
  166. package/src/retrieve/update-thread.ts +248 -0
  167. package/src/retrieve.ts +1 -0
  168. package/src/test/perf/query.1m.perf.test.ts +94 -0
  169. package/src/test/perf/query.perf.test.ts +389 -0
  170. package/src/test/perf/query.realdata.perf.test.ts +175 -0
  171. package/src/thread/basic.ts +209 -0
  172. package/src/thread/filters.ts +234 -0
  173. package/src/thread/mapped.ts +166 -0
  174. package/src/thread/utils.ts +146 -0
  175. package/src/thread/writeable.ts +163 -0
  176. package/src/thread.ts +5 -0
  177. package/src/types/typescript-utils.ts +64 -0
  178. package/src/types.ts +1 -0
  179. package/src/utils/debug-name.ts +54 -0
  180. package/src/utils.ts +4 -0
@@ -0,0 +1,883 @@
1
+ import {
2
+ StaticThread,
3
+ SubscribableArrayImpl,
4
+ SubscribableImpl,
5
+ ThreadInMemory,
6
+ createDebugName,
7
+ hasFilter,
8
+ isArrayInitEvent,
9
+ isInitEvent,
10
+ joinThreads,
11
+ makeFilter,
12
+ memoizedFn,
13
+ resolveOrRemoveVariables,
14
+ rollingFilter,
15
+ rollingMapper,
16
+ sortApplogsByTs
17
+ } from "./chunk-XIQSYEV3.js";
18
+
19
+ // src/query/types.ts
20
+ var QueryNode = class {
21
+ constructor(logsOfThisNode, variables, prevNode = null) {
22
+ this.logsOfThisNode = logsOfThisNode;
23
+ this.variables = variables;
24
+ this.prevNode = prevNode;
25
+ }
26
+ get record() {
27
+ return this.variables;
28
+ }
29
+ get threadOfTrail() {
30
+ if (!this.prevNode) return this.logsOfThisNode;
31
+ return joinThreads([
32
+ this.logsOfThisNode,
33
+ this.prevNode.threadOfTrail
34
+ ]);
35
+ }
36
+ get trailLogs() {
37
+ return this.threadOfTrail.applogs;
38
+ }
39
+ };
40
+ var QueryResult = class {
41
+ constructor(nodes) {
42
+ this.nodes = nodes;
43
+ }
44
+ get size() {
45
+ return this.nodes.length;
46
+ }
47
+ get isEmpty() {
48
+ return this.nodes.length === 0;
49
+ }
50
+ get untrackedSize() {
51
+ return this.nodes.length;
52
+ }
53
+ get records() {
54
+ return this.nodes.map(({ variables }) => variables);
55
+ }
56
+ get leafNodeThread() {
57
+ return joinThreads(
58
+ this.nodes.map(({ logsOfThisNode: thread }) => thread)
59
+ );
60
+ }
61
+ get leafNodeLogSet() {
62
+ return this.nodes.map(({ logsOfThisNode: thread }) => thread.applogs);
63
+ }
64
+ get leafNodeLogs() {
65
+ return this.nodes.flatMap(({ logsOfThisNode: thread }) => thread.applogs);
66
+ }
67
+ get threadOfAllTrails() {
68
+ return joinThreads(this.nodes.map((node) => node.threadOfTrail));
69
+ }
70
+ get thread() {
71
+ return this.threadOfAllTrails;
72
+ }
73
+ get allApplogs() {
74
+ return this.threadOfAllTrails.applogs;
75
+ }
76
+ };
77
+ var LiveQueryResult = class {
78
+ constructor(_source, activate = true) {
79
+ this._source = _source;
80
+ if (activate) {
81
+ this._activationUnsub = this._source.subscribe(() => {
82
+ });
83
+ }
84
+ }
85
+ _activationUnsub = null;
86
+ /** Subscribe to node change events. Callback fires on future changes only. */
87
+ subscribe(cb, type) {
88
+ return this._source.subscribe(cb, type);
89
+ }
90
+ /** Current nodes — live view, always up-to-date while not disposed */
91
+ get nodes() {
92
+ return this._source.items;
93
+ }
94
+ get size() {
95
+ return this._source.length;
96
+ }
97
+ get isEmpty() {
98
+ return this._source.length === 0;
99
+ }
100
+ get untrackedSize() {
101
+ return this._source.length;
102
+ }
103
+ get records() {
104
+ return this.nodes.map(({ variables }) => variables);
105
+ }
106
+ get leafNodeThread() {
107
+ return joinThreads(
108
+ this.nodes.map(({ logsOfThisNode: thread }) => thread)
109
+ );
110
+ }
111
+ get leafNodeLogSet() {
112
+ return this.nodes.map(({ logsOfThisNode: thread }) => thread.applogs);
113
+ }
114
+ get leafNodeLogs() {
115
+ return this.nodes.flatMap(({ logsOfThisNode: thread }) => thread.applogs);
116
+ }
117
+ get threadOfAllTrails() {
118
+ return joinThreads(this.nodes.map((node) => node.threadOfTrail));
119
+ }
120
+ get thread() {
121
+ return this.threadOfAllTrails;
122
+ }
123
+ get allApplogs() {
124
+ return this.threadOfAllTrails.applogs;
125
+ }
126
+ dispose() {
127
+ this._activationUnsub?.();
128
+ this._activationUnsub = null;
129
+ this._source.dispose();
130
+ }
131
+ };
132
+
133
+ // src/query/basic.ts
134
+ import { Logger } from "besonders-logger";
135
+ import stringify from "safe-stable-stringify";
136
+ var { WARN, LOG, DEBUG, VERBOSE, ERROR } = Logger.setup(Logger.INFO, { prefix: "[q]" });
137
+ function assertLWW(thread) {
138
+ if (!hasFilter(thread, "lastWriteWins")) {
139
+ throw ERROR(`requires lastWriteWins-filtered thread, got filters:`, thread.filters, { name: thread.name });
140
+ }
141
+ }
142
+ var globalQueryTimeoutTime = null;
143
+ var lastWriteWins = memoizedFn("lastWriteWins", function lastWriteWins2(thread, { inverseToOnlyReturnFirstLogs, tolerateAlreadyFiltered } = {}) {
144
+ VERBOSE(`lastWriteWins${inverseToOnlyReturnFirstLogs ? ".inversed" : ""} < ${thread.nameAndSizeUntracked} > initializing`);
145
+ if (thread.filters.includes("lastWriteWins")) {
146
+ if (tolerateAlreadyFiltered) {
147
+ DEBUG(`[lastWriteWins] already filtered, but tolerateAlreadyFiltered=true, so returning`);
148
+ return thread;
149
+ }
150
+ throw ERROR(`thread already filtered lastWriteWins:`, thread.filters, { name: thread.name });
151
+ }
152
+ let rollingMap;
153
+ const mappedThread = rollingMapper(thread, function lastWriteWinsMapper(event, sourceThread) {
154
+ const isInitial = isInitEvent(event);
155
+ let newLogs;
156
+ const toAdd = [];
157
+ const toRemove = isInitial ? null : [];
158
+ if (isInitial) {
159
+ rollingMap = /* @__PURE__ */ new Map();
160
+ newLogs = event.init;
161
+ } else {
162
+ newLogs = event.added;
163
+ }
164
+ let tsCheck;
165
+ for (let i = inverseToOnlyReturnFirstLogs ? 0 : newLogs.length - 1; inverseToOnlyReturnFirstLogs ? i < newLogs.length : i >= 0; inverseToOnlyReturnFirstLogs ? i++ : i--) {
166
+ const log = newLogs[i];
167
+ const key = log.en + "|" + log.at;
168
+ if (tsCheck && (inverseToOnlyReturnFirstLogs ? tsCheck > log.ts : tsCheck < log.ts)) {
169
+ throw ERROR(`lastWriteWins.mapper logs not sorted:`, tsCheck, inverseToOnlyReturnFirstLogs ? ">" : "<", log.ts, {
170
+ log,
171
+ i,
172
+ newLogs,
173
+ inverseToOnlyReturnFirstLogs
174
+ });
175
+ }
176
+ tsCheck = log.ts;
177
+ const existing = rollingMap.get(key);
178
+ if (!existing || (inverseToOnlyReturnFirstLogs ? existing.ts > log.ts : existing.ts < log.ts)) {
179
+ if (existing && !isInitial) toRemove.push(existing);
180
+ toAdd.push(log);
181
+ rollingMap.set(key, log);
182
+ }
183
+ }
184
+ sortApplogsByTs(toAdd);
185
+ VERBOSE.isDisabled || VERBOSE(
186
+ `lastWriteWins${inverseToOnlyReturnFirstLogs ? ".inversed" : ""}<${thread.nameAndSizeUntracked}> mapped event`,
187
+ isInitial ? { ...Object.fromEntries(Object.entries(event).map(([k, v]) => [k, v?.length])), toAdd: toAdd.length, toRemove } : { ...event, toAdd, toRemove }
188
+ );
189
+ return isInitial ? { init: toAdd } : { added: toAdd, removed: toRemove };
190
+ }, { name: `lastWriteWins${inverseToOnlyReturnFirstLogs ? ".inversed" : ""}`, extraFilterName: "lastWriteWins" });
191
+ VERBOSE.isDisabled || VERBOSE(`lastWriteWins<${thread.nameAndSizeUntracked}> filtered down to`, mappedThread.applogs.length);
192
+ return mappedThread;
193
+ }, { argsDebugName: (thread) => createDebugName({ caller: "lastWriteWins", thread }) });
194
+ var withoutDeleted = memoizedFn("withoutDeleted", function withoutDeleted2(thread) {
195
+ if (VERBOSE.isEnabled) VERBOSE(`withoutDeleted<${thread.nameAndSizeUntracked}>`);
196
+ if (thread.filters.includes("withoutDeleted")) {
197
+ throw ERROR(`thread already filtered withoutDeleted:`, thread.filters, { name: thread.name });
198
+ }
199
+ const deletionLogs = rollingFilter(
200
+ thread,
201
+ // TODO: handle un-deletion
202
+ { at: ["isDeleted", "relation/isDeleted", "block/isDeleted"], vl: true },
203
+ { name: "isDeleted" }
204
+ );
205
+ VERBOSE.isEnabled && VERBOSE(`withoutDeleted<${thread.nameAndSizeUntracked}> deletionLogs:`, [...deletionLogs.applogs]);
206
+ const deleted = new Set(deletionLogs.map((log) => log.en));
207
+ const unsubDeletions = deletionLogs.subscribe((event) => {
208
+ if (isInitEvent(event)) {
209
+ deleted.clear();
210
+ for (const log of event.init) deleted.add(log.en);
211
+ } else {
212
+ for (const log of event.added) deleted.add(log.en);
213
+ }
214
+ }, "derived");
215
+ VERBOSE.isEnabled && VERBOSE(`withoutDeleted<${thread.nameAndSizeUntracked}> deleted:`, [...deleted]);
216
+ const result = rollingFilter(thread, { "!en": deleted }, { name: `withoutDeleted`, extraFilterName: "withoutDeleted" });
217
+ const origDispose = result.dispose.bind(result);
218
+ result.dispose = () => {
219
+ unsubDeletions();
220
+ origDispose();
221
+ };
222
+ return result;
223
+ });
224
+ function makeQueryNode(log, parentNode, varMapper, threadName) {
225
+ const nodeVars = Object.assign({}, parentNode?.variables, varMapper(log));
226
+ return new QueryNode(
227
+ StaticThread.fromArray([log], threadName),
228
+ nodeVars,
229
+ parentNode
230
+ );
231
+ }
232
+ var query = memoizedFn("query", function query2(threadOrLogs, patternOrPatterns, startVariables = {}, opts = {}) {
233
+ throwOnTimeout();
234
+ const thread = threadFromMaybeArray(threadOrLogs);
235
+ DEBUG(`query<${thread.nameAndSizeUntracked}>:`, patternOrPatterns);
236
+ const patterns = Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns];
237
+ let prevNodes;
238
+ if (patterns.length === 1) {
239
+ prevNodes = null;
240
+ } else {
241
+ const patternsExceptLast = patterns.slice(0, -1);
242
+ prevNodes = query2(thread, patternsExceptLast, startVariables, opts).nodes;
243
+ }
244
+ const lastPattern = patterns[patterns.length - 1];
245
+ const stepResult = queryStepOnce(thread, prevNodes, lastPattern, opts);
246
+ VERBOSE.isDisabled || VERBOSE(`query result:`, stepResult.nodes);
247
+ return stepResult;
248
+ }, {
249
+ argsDebugName: (thread, pattern, startVars) => createDebugName({ caller: "query", thread, args: startVars ? { pattern, startVars } : pattern })
250
+ });
251
+ function queryStepOnce(thread, prevNodes, pattern, opts = {}) {
252
+ DEBUG(`queryStepOnce<${thread.nameAndSizeUntracked}> with`, prevNodes?.length ?? "all", "nodes, pattern:", pattern);
253
+ if (!Object.entries(pattern).length) throw new Error(`Pattern is empty`);
254
+ function doQueryOnce(node) {
255
+ const [patternWithResolvedVars, variablesToFill] = resolveOrRemoveVariables(pattern, node?.variables ?? {});
256
+ VERBOSE(`[queryStepOnce.doQuery] patternWithoutVars: `, patternWithResolvedVars);
257
+ const filter = makeFilter(patternWithResolvedVars);
258
+ const matchingLogs = filter(thread.applogs);
259
+ const varMapper = createObjMapper(variablesToFill);
260
+ const nodes = matchingLogs.map((log) => makeQueryNode(
261
+ log,
262
+ node,
263
+ varMapper,
264
+ createDebugName({
265
+ caller: "QueryNode",
266
+ thread,
267
+ pattern: `${stringify(Object.assign({}, node?.variables, varMapper(log)))}@${stringify(patternWithResolvedVars)}`
268
+ })
269
+ ));
270
+ if (VERBOSE.isEnabled) VERBOSE(`[queryStepOnce.doQuery] nodes:`, nodes.map((n) => n.variables));
271
+ if (opts.debug) {
272
+ LOG(`[queryStepOnce] step result:`, nodes.map(({ variables, logsOfThisNode: thread2 }) => ({
273
+ variables,
274
+ thread: thread2
275
+ })));
276
+ }
277
+ return nodes;
278
+ }
279
+ if (!prevNodes) {
280
+ return new QueryResult(doQueryOnce(null));
281
+ }
282
+ const allNodes = prevNodes.flatMap((inputNode) => doQueryOnce(inputNode));
283
+ return new QueryResult(allNodes);
284
+ }
285
+ var liveQuery = memoizedFn("liveQuery", function liveQuery2(threadOrLogs, patternOrPatterns, startVariables = {}, opts = {}) {
286
+ throwOnTimeout();
287
+ const thread = threadFromMaybeArray(threadOrLogs);
288
+ DEBUG(`liveQuery<${thread.nameAndSizeUntracked}>:`, patternOrPatterns);
289
+ const patterns = Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns];
290
+ let prevResult;
291
+ if (patterns.length === 1) {
292
+ prevResult = null;
293
+ } else {
294
+ const patternsExceptLast = patterns.slice(0, -1);
295
+ prevResult = liveQuery2(thread, patternsExceptLast, startVariables, opts);
296
+ }
297
+ const lastPattern = patterns[patterns.length - 1];
298
+ const stepResult = liveQueryStep(thread, prevResult, lastPattern, opts);
299
+ VERBOSE.isDisabled || VERBOSE(`liveQuery result:`, stepResult.nodes);
300
+ return stepResult;
301
+ }, {
302
+ argsDebugName: (thread, pattern, startVars) => createDebugName({ caller: "liveQuery", thread, args: startVars ? { pattern, startVars } : pattern })
303
+ });
304
+ var liveQueryStep = memoizedFn("liveQueryStep", function liveQueryStep2(thread, nodeSet, pattern, opts = {}) {
305
+ DEBUG(`liveQueryStep<${thread.nameAndSizeUntracked}> with`, nodeSet?.untrackedSize ?? "all", "nodes, pattern:", pattern);
306
+ if (!Object.entries(pattern).length) throw new Error(`Pattern is empty`);
307
+ function doQuery(node) {
308
+ const [patternWithResolvedVars, variablesToFill] = resolveOrRemoveVariables(pattern, node?.variables ?? {});
309
+ VERBOSE(`[liveQueryStep.doQuery] patternWithoutVars: `, patternWithResolvedVars);
310
+ const applogsMatchingStatic = rollingFilter(thread, patternWithResolvedVars);
311
+ const varMapper = createObjMapper(variablesToFill);
312
+ function makeNode(log) {
313
+ return makeQueryNode(
314
+ log,
315
+ node,
316
+ varMapper,
317
+ createDebugName({
318
+ caller: "QueryNode",
319
+ thread: applogsMatchingStatic,
320
+ pattern: `${stringify(Object.assign({}, node?.variables, varMapper(log)))}@${stringify(patternWithResolvedVars)}`
321
+ })
322
+ );
323
+ }
324
+ const initialNodes = applogsMatchingStatic.applogs.map(makeNode);
325
+ if (VERBOSE.isEnabled) VERBOSE(`[liveQueryStep.doQuery] initial nodes:`, initialNodes.map((n) => n.variables));
326
+ if (opts.debug) {
327
+ LOG(`[liveQueryStep] step result:`, initialNodes.map(({ variables, logsOfThisNode: thread2 }) => ({
328
+ variables,
329
+ thread: thread2
330
+ })));
331
+ }
332
+ const result = new SubscribableArrayImpl(
333
+ initialNodes,
334
+ () => applogsMatchingStatic.subscribe((event) => {
335
+ if (isInitEvent(event)) {
336
+ result._reset(event.init.map(makeNode));
337
+ } else {
338
+ if (event.added.length) {
339
+ result._push(...event.added.map(makeNode));
340
+ }
341
+ if (event.removed?.length) {
342
+ const removedCids = new Set(event.removed.map((log) => log.cid));
343
+ const toRemove = result.items.filter(
344
+ (qn) => removedCids.has(qn.logsOfThisNode.applogs[0]?.cid)
345
+ );
346
+ if (toRemove.length) result._remove(toRemove);
347
+ }
348
+ }
349
+ }, "derived")
350
+ );
351
+ return result;
352
+ }
353
+ if (!nodeSet) {
354
+ return new LiveQueryResult(doQuery(null));
355
+ }
356
+ const initialInners = nodeSet.nodes.map((inputNode) => ({
357
+ inputNode,
358
+ inner: doQuery(inputNode)
359
+ }));
360
+ const initialItems = initialInners.flatMap(({ inner }) => [...inner.items]);
361
+ const aggregated = new SubscribableArrayImpl(
362
+ initialItems,
363
+ () => {
364
+ const subsByInputNode = /* @__PURE__ */ new Map();
365
+ function wireInner(inputNode, inner) {
366
+ const entry = { inner, unsub: null, nodes: [...inner.items] };
367
+ entry.unsub = inner.subscribe((event) => {
368
+ if (isArrayInitEvent(event)) {
369
+ if (entry.nodes.length) aggregated._remove(entry.nodes);
370
+ entry.nodes = [...event.init];
371
+ if (entry.nodes.length) aggregated._push(...entry.nodes);
372
+ } else {
373
+ if (event.added.length) {
374
+ entry.nodes.push(...event.added);
375
+ aggregated._push(...event.added);
376
+ }
377
+ if (event.removed?.length) {
378
+ for (const r of event.removed) {
379
+ const idx = entry.nodes.indexOf(r);
380
+ if (idx >= 0) entry.nodes.splice(idx, 1);
381
+ }
382
+ aggregated._remove(event.removed);
383
+ }
384
+ }
385
+ }, "derived");
386
+ subsByInputNode.set(inputNode, entry);
387
+ return entry.nodes;
388
+ }
389
+ function addInputNode(inputNode) {
390
+ return wireInner(inputNode, doQuery(inputNode));
391
+ }
392
+ function removeInputNode(inputNode) {
393
+ const entry = subsByInputNode.get(inputNode);
394
+ if (!entry) return [];
395
+ entry.unsub();
396
+ entry.inner.dispose();
397
+ const removed = entry.nodes;
398
+ subsByInputNode.delete(inputNode);
399
+ return removed;
400
+ }
401
+ for (const { inputNode, inner } of initialInners) {
402
+ wireInner(inputNode, inner);
403
+ }
404
+ const prevUnsub = nodeSet.subscribe((event) => {
405
+ if (isArrayInitEvent(event)) {
406
+ for (const [, entry] of subsByInputNode) {
407
+ entry.unsub();
408
+ entry.inner.dispose();
409
+ }
410
+ subsByInputNode.clear();
411
+ const allNodes = [];
412
+ for (const node of event.init) {
413
+ allNodes.push(...addInputNode(node));
414
+ }
415
+ aggregated._reset(allNodes);
416
+ } else {
417
+ if (event.added.length) {
418
+ const allAdded = [];
419
+ for (const node of event.added) {
420
+ allAdded.push(...addInputNode(node));
421
+ }
422
+ if (allAdded.length) aggregated._push(...allAdded);
423
+ }
424
+ if (event.removed?.length) {
425
+ const allRemoved = [];
426
+ for (const node of event.removed) {
427
+ allRemoved.push(...removeInputNode(node));
428
+ }
429
+ if (allRemoved.length) aggregated._remove(allRemoved);
430
+ }
431
+ }
432
+ }, "derived");
433
+ return () => {
434
+ prevUnsub();
435
+ for (const [, entry] of subsByInputNode) {
436
+ entry.unsub();
437
+ entry.inner.dispose();
438
+ }
439
+ subsByInputNode.clear();
440
+ };
441
+ }
442
+ );
443
+ if (VERBOSE.isEnabled) VERBOSE(`[liveQueryStep] aggregated initial:`, [...aggregated.items]);
444
+ return new LiveQueryResult(aggregated);
445
+ }, { argsDebugName: (thread, _nodes, pattern) => createDebugName({ caller: "liveQueryStep", thread, pattern }) });
446
+ var queryNot = memoizedFn("queryNot", function queryNot2(thread, startNodes, patternOrPatterns, opts = {}) {
447
+ const nodes = startNodes.nodes;
448
+ DEBUG(`queryNot<${thread.nameAndSizeUntracked}> from: ${nodes.length} nodes`);
449
+ const patterns = Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns];
450
+ const filtered = nodes.filter(function innerNodeFilter({ variables }) {
451
+ let bindings = [variables ?? {}];
452
+ for (const pattern of patterns) {
453
+ if (!Object.entries(pattern).length) throw new Error(`Pattern is empty`);
454
+ const nextBindings = [];
455
+ for (const binding of bindings) {
456
+ const [resolved, varsToFill] = resolveOrRemoveVariables(pattern, binding);
457
+ const filter = makeFilter(resolved);
458
+ const matchingLogs = filter(thread.applogs);
459
+ const varMapper = createObjMapper(varsToFill);
460
+ for (const log of matchingLogs) {
461
+ nextBindings.push({ ...binding, ...varMapper(log) });
462
+ }
463
+ }
464
+ bindings = nextBindings;
465
+ if (bindings.length === 0) break;
466
+ }
467
+ VERBOSE(`[queryNot] node:`, variables, "=> bindings:", bindings.length);
468
+ if (opts.debug) LOG(`[queryNot] node result:`, variables, "=>", bindings);
469
+ return bindings.length === 0;
470
+ });
471
+ return new QueryResult([...filtered]);
472
+ }, { argsDebugName: (thread, nodes, pattern) => createDebugName({ caller: "queryNot", thread, pattern }) });
473
+ var liveQueryNot = memoizedFn("liveQueryNot", function liveQueryNot2(thread, upstream, patternOrPatterns, opts = {}) {
474
+ const patterns = Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns];
475
+ function nodeMatchesNot(node, applogs) {
476
+ let bindings = [node.variables ?? {}];
477
+ for (const pattern of patterns) {
478
+ const nextBindings = [];
479
+ for (const binding of bindings) {
480
+ const [resolved, varsToFill] = resolveOrRemoveVariables(pattern, binding);
481
+ const filter = makeFilter(resolved);
482
+ const varMapper = createObjMapper(varsToFill);
483
+ for (const log of filter(applogs)) {
484
+ nextBindings.push({ ...binding, ...varMapper(log) });
485
+ }
486
+ }
487
+ bindings = nextBindings;
488
+ if (bindings.length === 0) return false;
489
+ }
490
+ return bindings.length > 0;
491
+ }
492
+ function computeAll() {
493
+ return upstream.nodes.filter((node) => !nodeMatchesNot(node, thread.applogs));
494
+ }
495
+ const result = new SubscribableArrayImpl(
496
+ computeAll(),
497
+ () => {
498
+ const threadUnsub = thread.subscribe((event) => {
499
+ if (isInitEvent(event)) {
500
+ result._reset(computeAll());
501
+ return;
502
+ }
503
+ if (event.removed?.length) {
504
+ result._reset(computeAll());
505
+ return;
506
+ }
507
+ if (event.added.length) {
508
+ const toRemove = result.items.filter((node) => nodeMatchesNot(node, event.added));
509
+ if (toRemove.length > 0) {
510
+ result._remove(toRemove);
511
+ }
512
+ }
513
+ }, "derived");
514
+ const upstreamUnsub = upstream.subscribe((event) => {
515
+ if (isArrayInitEvent(event)) {
516
+ result._reset(computeAll());
517
+ return;
518
+ }
519
+ if (event.added.length) {
520
+ const passing = event.added.filter((node) => !nodeMatchesNot(node, thread.applogs));
521
+ if (passing.length > 0) result._push(...passing);
522
+ }
523
+ if (event.removed?.length) {
524
+ const removedSet = new Set(event.removed);
525
+ const toRemove = result.items.filter((node) => removedSet.has(node));
526
+ if (toRemove.length > 0) result._remove(toRemove);
527
+ }
528
+ }, "derived");
529
+ return () => {
530
+ threadUnsub();
531
+ upstreamUnsub();
532
+ };
533
+ }
534
+ );
535
+ return new LiveQueryResult(result);
536
+ }, { argsDebugName: (thread, _nodes, pattern) => createDebugName({ caller: "liveQueryNot", thread, pattern }) });
537
+ var filterAndMap = memoizedFn("filterAndMap", function filterAndMap2(thread, pattern, mapper) {
538
+ DEBUG(`filterAndMap<${thread.nameAndSizeUntracked}>`, pattern);
539
+ const filter = makeFilter(pattern);
540
+ const filtered = filter(thread.applogs);
541
+ return mapApplogsWith(filtered, mapper);
542
+ }, { argsDebugName: (thread, pattern) => createDebugName({ caller: "filterAndMap", thread, pattern }) });
543
+ var liveFilterAndMap = memoizedFn("liveFilterAndMap", function liveFilterAndMap2(thread, pattern, mapper) {
544
+ DEBUG(`liveFilterAndMap<${thread.nameAndSizeUntracked}>`, pattern);
545
+ const filtered = rollingFilter(thread, pattern);
546
+ const mapFn = makeApplogMapper(mapper);
547
+ const initial = filtered.applogs.map(mapFn);
548
+ const result = new SubscribableArrayImpl(
549
+ initial,
550
+ () => filtered.subscribe((event) => {
551
+ if (isInitEvent(event)) {
552
+ result._reset(event.init.map(mapFn));
553
+ } else {
554
+ if (event.added.length) result._push(...event.added.map(mapFn));
555
+ }
556
+ }, "derived")
557
+ );
558
+ return result;
559
+ }, { argsDebugName: (thread, pattern) => createDebugName({ caller: "liveFilterAndMap", thread, pattern }) });
560
+ var queryAndMap = memoizedFn("queryAndMap", function queryAndMap2(threadOrLogs, patternOrPatterns, mapDef, variables = {}) {
561
+ const thread = threadFromMaybeArray(threadOrLogs);
562
+ DEBUG(`queryAndMap<${thread.nameAndSizeUntracked}>`, { patternOrPatterns, variables, map: mapDef });
563
+ const queryResult = query(thread, patternOrPatterns);
564
+ return mapQueryResultWith(queryResult, mapDef);
565
+ }, { argsDebugName: (thread, pattern) => createDebugName({ caller: "queryAndMap", thread, pattern }) });
566
+ var liveQueryAndMap = memoizedFn("liveQueryAndMap", function liveQueryAndMap2(thread, patternOrPatterns, mapDef) {
567
+ DEBUG(`liveQueryAndMap<${thread.nameAndSizeUntracked}>`, { patternOrPatterns, map: mapDef });
568
+ const live = liveQuery(thread, patternOrPatterns);
569
+ function computeAll() {
570
+ const snapshot = new QueryResult(live.nodes);
571
+ return mapQueryResultWith(snapshot, mapDef);
572
+ }
573
+ const result = new SubscribableArrayImpl(
574
+ computeAll(),
575
+ () => live.subscribe(() => {
576
+ result._reset(computeAll());
577
+ }, "derived")
578
+ );
579
+ return result;
580
+ }, { argsDebugName: (thread, pattern) => createDebugName({ caller: "liveQueryAndMap", thread, pattern }) });
581
+ var queryEntity = memoizedFn("queryEntity", function queryEntity2(thread, name, entityID, attributes) {
582
+ assertLWW(thread);
583
+ DEBUG(`queryEntity<${thread.nameAndSizeUntracked}>`, entityID, name);
584
+ const filter = makeFilter({ en: entityID, at: prefixAttrs(name, attributes) });
585
+ const filtered = filter(thread.applogs);
586
+ VERBOSE(`queryEntity applogs:`, filtered);
587
+ if (filtered.length === 0) return null;
588
+ return Object.fromEntries(
589
+ filtered.map(({ at, vl }) => [at.slice(name.length + 1), vl])
590
+ );
591
+ }, {
592
+ argsDebugName: (thread, name, entityID) => createDebugName({ caller: "queryEntity", thread, args: { name, entityID } })
593
+ });
594
+ var liveQueryEntity = memoizedFn("liveQueryEntity", function liveQueryEntity2(thread, name, entityID, attributes) {
595
+ assertLWW(thread);
596
+ DEBUG(`liveQueryEntity<${thread.nameAndSizeUntracked}>`, entityID, name);
597
+ const filtered = rollingFilter(thread, { en: entityID, at: prefixAttrs(name, attributes) });
598
+ function compute() {
599
+ if (filtered.isEmpty) return null;
600
+ return Object.fromEntries(
601
+ filtered.map(({ at, vl }) => [at.slice(name.length + 1), vl])
602
+ );
603
+ }
604
+ const result = new SubscribableImpl(
605
+ compute(),
606
+ () => filtered.subscribe(() => {
607
+ result._set(compute());
608
+ }, "derived")
609
+ );
610
+ return result;
611
+ }, {
612
+ argsDebugName: (thread, name, entityID) => createDebugName({ caller: "liveQueryEntity", thread, args: { name, entityID } })
613
+ });
614
+ var liveEntityAt = memoizedFn("liveEntityAt", function liveEntityAt2(thread, entityID, at) {
615
+ assertLWW(thread);
616
+ DEBUG(`liveEntityAt<${thread.nameAndSizeUntracked}>`, entityID, at);
617
+ const filtered = rollingFilter(thread, { en: entityID, at });
618
+ function compute() {
619
+ if (filtered.isEmpty) return null;
620
+ return filtered.applogs[filtered.applogs.length - 1].vl;
621
+ }
622
+ const result = new SubscribableImpl(
623
+ compute(),
624
+ () => filtered.subscribe(() => {
625
+ result._set(compute());
626
+ }, "derived")
627
+ );
628
+ return result;
629
+ }, {
630
+ argsDebugName: (thread, entityID, at) => createDebugName({ caller: "liveEntityAt", thread, args: { entityID, at } })
631
+ });
632
+ var agentsOfThread = memoizedFn("agentsOfThread", function agentsOfThread2(thread) {
633
+ DEBUG(`agentsOfThread<${thread.nameAndSizeUntracked}>`);
634
+ const mapped = /* @__PURE__ */ new Map();
635
+ const onEvent = (event) => {
636
+ for (const log of isInitEvent(event) ? event.init : event.added) {
637
+ const prev = mapped.get(log.ag) ?? 0;
638
+ mapped.set(log.ag, prev + 1);
639
+ }
640
+ for (const log of !isInitEvent(event) && event.removed || []) {
641
+ const prev = mapped.get(log.ag);
642
+ if (!prev || prev < 1) throw ERROR(`[agentsOfThread] number is now negative`, { log, event, mapped, prev });
643
+ mapped.set(log.ag, prev - 1);
644
+ }
645
+ LOG(`agentsOfThread<${thread.nameAndSizeUntracked}> processed event`, { event, mapped });
646
+ };
647
+ onEvent({ init: thread.applogs });
648
+ thread.subscribe(onEvent, "derived");
649
+ return mapped;
650
+ });
651
+ var entityOverlap = memoizedFn("entityOverlap", function entityOverlapCount(threadA, threadB) {
652
+ LOG(`entityOverlap<${threadA.nameAndSizeUntracked}, ${threadB.nameAndSizeUntracked}>`);
653
+ const entitiesA = new Set(threadA.map((log) => log.en));
654
+ const entitiesB = new Set(threadB.map((log) => log.en));
655
+ return [...entitiesA].filter((en) => entitiesB.has(en));
656
+ });
657
+ var entityOverlapMap = function entityOverlapMap2(threadA, threadB, threadAName = "incoming", threadBName = "current") {
658
+ const useInferredVM = (en, thread) => en;
659
+ const overlapping = entityOverlap(threadA, threadB);
660
+ const mapped = /* @__PURE__ */ new Map();
661
+ overlapping.forEach((eachEntityID) => mapped.set(eachEntityID, {
662
+ [threadAName]: useInferredVM(eachEntityID, threadA),
663
+ [threadBName]: useInferredVM(eachEntityID, threadB)
664
+ }));
665
+ };
666
+ var entityOverlapCount2 = memoizedFn(
667
+ "entityOverlapCount",
668
+ function entityOverlapCount3(threadA, threadB) {
669
+ return entityOverlap(threadA, threadB).length;
670
+ }
671
+ );
672
+ var liveEntityOverlapCount = memoizedFn(
673
+ "liveEntityOverlapCount",
674
+ function liveEntityOverlapCount2(threadA, threadB) {
675
+ function compute() {
676
+ const entitiesA = new Set(threadA.map((log) => log.en));
677
+ const entitiesB = new Set(threadB.map((log) => log.en));
678
+ return [...entitiesA].filter((en) => entitiesB.has(en)).length;
679
+ }
680
+ const result = new SubscribableImpl(
681
+ compute(),
682
+ () => {
683
+ const unsub1 = threadA.subscribe(() => result._set(compute()), "derived");
684
+ const unsub2 = threadB.subscribe(() => result._set(compute()), "derived");
685
+ return () => {
686
+ unsub1();
687
+ unsub2();
688
+ };
689
+ }
690
+ );
691
+ return result;
692
+ }
693
+ );
694
+ var querySingle = memoizedFn("querySingle", function querySingle2(threadOrLogs, patternOrPatterns, variables = {}) {
695
+ const result = query(threadOrLogs, patternOrPatterns, variables);
696
+ if (result.isEmpty) return null;
697
+ if (result.size > 1) throw ERROR(`[querySingle] got`, result.size, `results:`, result);
698
+ const logsOfThisNode = result.nodes[0].logsOfThisNode;
699
+ if (logsOfThisNode.size != 1) throw ERROR(`[querySingle] single result, but got`, logsOfThisNode.size, `logs:`, logsOfThisNode.applogs);
700
+ return logsOfThisNode.applogs[0];
701
+ }, {
702
+ argsDebugName: (thread, pattern) => createDebugName({ caller: "querySingle", thread, pattern })
703
+ });
704
+ var querySingleAndMap = memoizedFn(
705
+ "querySingleAndMap",
706
+ function querySingleAndMap2(threadOrLogs, patternOrPatterns, mapDef, variables = {}) {
707
+ const log = querySingle(threadOrLogs, patternOrPatterns, variables);
708
+ if (!log) return void 0;
709
+ if (typeof mapDef === "string") {
710
+ return log[mapDef];
711
+ } else {
712
+ return createObjMapper(mapDef)(log);
713
+ }
714
+ },
715
+ {
716
+ argsDebugName: (thread, pattern) => createDebugName({ caller: "querySingleAndMap", thread, pattern })
717
+ }
718
+ );
719
+ var liveQuerySingle = memoizedFn("liveQuerySingle", function liveQuerySingle2(thread, patternOrPatterns) {
720
+ DEBUG(`liveQuerySingle<${thread.nameAndSizeUntracked}>`);
721
+ const live = liveQuery(thread, patternOrPatterns);
722
+ function compute() {
723
+ if (live.isEmpty) return null;
724
+ if (live.size > 1) throw ERROR(`[liveQuerySingle] got`, live.size, `results`);
725
+ const logsOfThisNode = live.nodes[0].logsOfThisNode;
726
+ if (logsOfThisNode.size !== 1) throw ERROR(`[liveQuerySingle] single result, but got`, logsOfThisNode.size, `logs`);
727
+ return logsOfThisNode.applogs[0];
728
+ }
729
+ const result = new SubscribableImpl(
730
+ compute(),
731
+ () => live.subscribe(() => {
732
+ result._set(compute());
733
+ })
734
+ );
735
+ return result;
736
+ }, {
737
+ argsDebugName: (thread, pattern) => createDebugName({ caller: "liveQuerySingle", thread, pattern })
738
+ });
739
+ var liveQuerySingleAndMap = memoizedFn(
740
+ "liveQuerySingleAndMap",
741
+ function liveQuerySingleAndMap2(thread, patternOrPatterns, mapDef) {
742
+ DEBUG(`liveQuerySingleAndMap<${thread.nameAndSizeUntracked}>`);
743
+ const liveSingle = liveQuerySingle(thread, patternOrPatterns);
744
+ function compute() {
745
+ const log = liveSingle.value;
746
+ if (!log) return void 0;
747
+ if (typeof mapDef === "string") {
748
+ return log[mapDef];
749
+ } else {
750
+ return createObjMapper(mapDef)(log);
751
+ }
752
+ }
753
+ const result = new SubscribableImpl(
754
+ compute(),
755
+ () => liveSingle.subscribe(() => {
756
+ result._set(compute());
757
+ })
758
+ );
759
+ return result;
760
+ },
761
+ {
762
+ argsDebugName: (thread, pattern) => createDebugName({ caller: "liveQuerySingleAndMap", thread, pattern })
763
+ }
764
+ );
765
+ function makeApplogMapper(mapDef) {
766
+ if (typeof mapDef === "function") {
767
+ return mapDef;
768
+ } else if (typeof mapDef === "string") {
769
+ return (log) => log[mapDef];
770
+ } else {
771
+ return createObjMapper(mapDef);
772
+ }
773
+ }
774
+ function mapApplogsWith(applogs, mapDef) {
775
+ return applogs.map(makeApplogMapper(mapDef));
776
+ }
777
+ var mapThreadWith = function filterAndMapGetterFx(thread, mapDef) {
778
+ return mapApplogsWith(thread.applogs, mapDef);
779
+ };
780
+ var mapQueryResultWith = function filterAndMapGetterFx2(queryResult, mapDef) {
781
+ if (typeof mapDef === "function") {
782
+ return queryResult.records.map(mapDef);
783
+ } else if (typeof mapDef === "string") {
784
+ return queryResult.nodes.map((node) => {
785
+ if (!Object.hasOwn(node.record, mapDef)) {
786
+ if (node.logsOfThisNode.size !== 1) {
787
+ throw ERROR(`not sure what to map (it's not a var and a result node log count of ${node.logsOfThisNode.size})`);
788
+ }
789
+ return node.logsOfThisNode.firstLog[mapDef];
790
+ }
791
+ return node.record[mapDef];
792
+ });
793
+ } else {
794
+ return queryResult.nodes.map((node) => {
795
+ return createObjMapper(mapDef)(node.record);
796
+ });
797
+ }
798
+ };
799
+ function createObjMapper(applogFieldMap) {
800
+ return (applog) => {
801
+ return Object.entries(applogFieldMap).reduce((acc, [key, value]) => {
802
+ acc[value] = applog[key];
803
+ return acc;
804
+ }, {});
805
+ };
806
+ }
807
+ function startsWith(str) {
808
+ return (value) => value.startsWith(str);
809
+ }
810
+ function prefixAttrs(prefix, attrs) {
811
+ return attrs.map((at) => prefixAt(prefix, at));
812
+ }
813
+ function prefixAt(prefix, attr) {
814
+ return `${prefix}/${attr}`;
815
+ }
816
+ function threadFromMaybeArray(threadOrLogs, name) {
817
+ if (!Array.isArray(threadOrLogs)) {
818
+ return threadOrLogs;
819
+ }
820
+ return ThreadInMemory.fromArray(threadOrLogs, name || `threadFromArray[${threadOrLogs.length}]`, true);
821
+ }
822
+ function withTimeout(timeoutMilliseconds, func) {
823
+ if (globalQueryTimeoutTime) throw ERROR(`Nested timeout not supported`);
824
+ globalQueryTimeoutTime = performance.now() + timeoutMilliseconds;
825
+ try {
826
+ return func();
827
+ } finally {
828
+ globalQueryTimeoutTime = null;
829
+ }
830
+ }
831
+ function throwOnTimeout() {
832
+ if (globalQueryTimeoutTime == null) return;
833
+ if (performance.now() >= globalQueryTimeoutTime) {
834
+ throw new QueryTimeoutError(globalQueryTimeoutTime);
835
+ }
836
+ }
837
+ var QueryTimeoutError = class extends Error {
838
+ constructor(message) {
839
+ super(message);
840
+ }
841
+ };
842
+
843
+ export {
844
+ QueryNode,
845
+ QueryResult,
846
+ LiveQueryResult,
847
+ lastWriteWins,
848
+ withoutDeleted,
849
+ query,
850
+ queryStepOnce,
851
+ liveQuery,
852
+ liveQueryStep,
853
+ queryNot,
854
+ liveQueryNot,
855
+ filterAndMap,
856
+ liveFilterAndMap,
857
+ queryAndMap,
858
+ liveQueryAndMap,
859
+ queryEntity,
860
+ liveQueryEntity,
861
+ liveEntityAt,
862
+ agentsOfThread,
863
+ entityOverlap,
864
+ entityOverlapMap,
865
+ entityOverlapCount2 as entityOverlapCount,
866
+ liveEntityOverlapCount,
867
+ querySingle,
868
+ querySingleAndMap,
869
+ liveQuerySingle,
870
+ liveQuerySingleAndMap,
871
+ makeApplogMapper,
872
+ mapApplogsWith,
873
+ mapThreadWith,
874
+ mapQueryResultWith,
875
+ createObjMapper,
876
+ startsWith,
877
+ prefixAttrs,
878
+ prefixAt,
879
+ threadFromMaybeArray,
880
+ withTimeout,
881
+ throwOnTimeout
882
+ };
883
+ //# sourceMappingURL=chunk-ZXCJRYD7.js.map