@wovin/core 0.0.1-RC20 → 0.0.1-RC21
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.
- package/dist/applog.js +5 -4
- package/dist/chunk-3VDDRHGD.js +9854 -0
- package/dist/chunk-3VDDRHGD.js.map +1 -0
- package/dist/{chunk-RBXGBMA7.js → chunk-5FO6VRGW.js} +16 -5
- package/dist/chunk-5FO6VRGW.js.map +1 -0
- package/dist/chunk-AWVTEBES.js +7 -0
- package/dist/chunk-AWVTEBES.js.map +1 -0
- package/dist/chunk-JHX2WWYS.js +78766 -0
- package/dist/chunk-JHX2WWYS.js.map +1 -0
- package/dist/{chunk-XJPITJRE.js → chunk-JI36NHJX.js} +18 -6
- package/dist/chunk-JI36NHJX.js.map +1 -0
- package/dist/chunk-MTQJBBHB.js +4586 -0
- package/dist/chunk-MTQJBBHB.js.map +1 -0
- package/dist/chunk-TIIA4ZAI.js +56 -0
- package/dist/chunk-TIIA4ZAI.js.map +1 -0
- package/dist/chunk-TYUDGJVU.js +7 -0
- package/dist/chunk-TYUDGJVU.js.map +1 -0
- package/dist/chunk-YJXKRB2D.js +7651 -0
- package/dist/chunk-YJXKRB2D.js.map +1 -0
- package/dist/chunk-YNB6ALUV.js +56 -0
- package/dist/chunk-YNB6ALUV.js.map +1 -0
- package/dist/index.js +13 -9
- package/dist/index.js.map +1 -1
- package/dist/ipfs.js +4 -3
- package/dist/pubsub.js +5 -4
- package/dist/query.js +5 -4
- package/dist/stream.js +4 -3
- package/dist/types.js +5 -4
- package/dist/utils.js +6 -0
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-6ZDPEEFN.js +0 -67
- package/dist/chunk-6ZDPEEFN.js.map +0 -1
- package/dist/chunk-DBACGNVR.js +0 -1
- package/dist/chunk-DBACGNVR.js.map +0 -1
- package/dist/chunk-I5PELB4T.js +0 -770
- package/dist/chunk-I5PELB4T.js.map +0 -1
- package/dist/chunk-K2JRTCRC.js +0 -44
- package/dist/chunk-K2JRTCRC.js.map +0 -1
- package/dist/chunk-RBXGBMA7.js.map +0 -1
- package/dist/chunk-TR5AJKIN.js +0 -1
- package/dist/chunk-TR5AJKIN.js.map +0 -1
- package/dist/chunk-VKQDEGWA.js +0 -561
- package/dist/chunk-VKQDEGWA.js.map +0 -1
- package/dist/chunk-X23XAGRU.js +0 -60
- package/dist/chunk-X23XAGRU.js.map +0 -1
- package/dist/chunk-XJPITJRE.js.map +0 -1
package/dist/chunk-VKQDEGWA.js
DELETED
|
@@ -1,561 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ApplogStream,
|
|
3
|
-
MappedApplogStream,
|
|
4
|
-
applogStreamComparer,
|
|
5
|
-
computedFnDeepCompare,
|
|
6
|
-
computedStructuralComparer,
|
|
7
|
-
createDebugName,
|
|
8
|
-
dateNowIso,
|
|
9
|
-
isInitEvent,
|
|
10
|
-
isTsBefore,
|
|
11
|
-
observableArrayMap,
|
|
12
|
-
queryNodesComparer,
|
|
13
|
-
removeDuplicateAppLogs,
|
|
14
|
-
resolveOrRemoveVariables,
|
|
15
|
-
rollingFilter,
|
|
16
|
-
rollingMapper,
|
|
17
|
-
sortApplogsByTs
|
|
18
|
-
} from "./chunk-I5PELB4T.js";
|
|
19
|
-
import {
|
|
20
|
-
encodeApplogAndGetCid
|
|
21
|
-
} from "./chunk-6ZDPEEFN.js";
|
|
22
|
-
|
|
23
|
-
// src/stream/writeable.ts
|
|
24
|
-
import { Logger as Logger3 } from "besonders-logger";
|
|
25
|
-
import { action as action2, makeObservable as makeObservable2, observable as observable2 } from "mobx";
|
|
26
|
-
|
|
27
|
-
// src/applog/applog-helpers.ts
|
|
28
|
-
import { Logger as Logger2 } from "besonders-logger";
|
|
29
|
-
import { action, untracked as untracked2 } from "mobx";
|
|
30
|
-
|
|
31
|
-
// src/query/basic.ts
|
|
32
|
-
import { Logger } from "besonders-logger";
|
|
33
|
-
import { autorun, comparer, computed, makeObservable, observable, onBecomeObserved, toJS, untracked } from "mobx";
|
|
34
|
-
import stringify from "safe-stable-stringify";
|
|
35
|
-
var { WARN, LOG, DEBUG, VERBOSE, ERROR } = Logger.setup(Logger.INFO, { prefix: "[q]" });
|
|
36
|
-
var QueryNode = class {
|
|
37
|
-
constructor(logsOfThisNode, variables, prev = null) {
|
|
38
|
-
this.logsOfThisNode = logsOfThisNode;
|
|
39
|
-
this.variables = variables;
|
|
40
|
-
this.prev = prev;
|
|
41
|
-
makeObservable(this, {
|
|
42
|
-
allApplogs: computed
|
|
43
|
-
// ? intuitively only put the ones here that felt expensive to compute (join)
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
get record() {
|
|
47
|
-
return this.variables;
|
|
48
|
-
}
|
|
49
|
-
get allApplogs() {
|
|
50
|
-
if (!this.prev)
|
|
51
|
-
return this.logsOfThisNode;
|
|
52
|
-
return joinStreams([
|
|
53
|
-
this.logsOfThisNode,
|
|
54
|
-
this.prev.allApplogs
|
|
55
|
-
]);
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
var QueryNodes = class {
|
|
59
|
-
constructor(nodes) {
|
|
60
|
-
this.nodes = nodes;
|
|
61
|
-
makeObservable(this, {
|
|
62
|
-
allApplogs: computed,
|
|
63
|
-
// ? intuitively only put the ones here that felt expensive to compute (join)
|
|
64
|
-
size: computed,
|
|
65
|
-
// ... or cheap to cache
|
|
66
|
-
isEmpty: computed
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
get size() {
|
|
70
|
-
return this.records.length;
|
|
71
|
-
}
|
|
72
|
-
get isEmpty() {
|
|
73
|
-
return this.records.length === 0;
|
|
74
|
-
}
|
|
75
|
-
get untrackedSize() {
|
|
76
|
-
return untracked(() => this.records.length);
|
|
77
|
-
}
|
|
78
|
-
get records() {
|
|
79
|
-
return this.nodes.map(({ variables }) => variables);
|
|
80
|
-
}
|
|
81
|
-
get applogSets() {
|
|
82
|
-
return this.nodes.map(({ logsOfThisNode: stream }) => stream.applogs);
|
|
83
|
-
}
|
|
84
|
-
get applogStreams() {
|
|
85
|
-
return this.nodes.map(({ logsOfThisNode: stream }) => stream);
|
|
86
|
-
}
|
|
87
|
-
get allApplogs() {
|
|
88
|
-
return joinStreams(this.nodes.map((node) => node.allApplogs));
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
var withoutHistory = computedFnDeepCompare(function withoutHistory2(stream, { inverseToOnlyReturnFirstLogs, tolerateAlreadyFiltered } = {}) {
|
|
92
|
-
VERBOSE(`withoutHistory${inverseToOnlyReturnFirstLogs ? ".inversed" : ""} < ${stream.nameAndSizeUntracked} > initializing`);
|
|
93
|
-
if (stream.filters.includes("withoutHistory")) {
|
|
94
|
-
if (tolerateAlreadyFiltered) {
|
|
95
|
-
DEBUG(`[withoutHistory] already filtered, but tolerateAlreadyFiltered=true, so returning`);
|
|
96
|
-
return stream;
|
|
97
|
-
}
|
|
98
|
-
throw ERROR(`stream already filtered withoutHistory:`, stream.filters, { name: stream.name });
|
|
99
|
-
}
|
|
100
|
-
let rollingMap;
|
|
101
|
-
const mappedStream = rollingMapper(stream, function(event, sourceStream) {
|
|
102
|
-
const isInitial = isInitEvent(event);
|
|
103
|
-
let newLogs;
|
|
104
|
-
const toAdd = [];
|
|
105
|
-
const toRemove = isInitial ? null : [];
|
|
106
|
-
if (isInitial) {
|
|
107
|
-
rollingMap = /* @__PURE__ */ new Map();
|
|
108
|
-
newLogs = event.init;
|
|
109
|
-
} else {
|
|
110
|
-
newLogs = event.added;
|
|
111
|
-
}
|
|
112
|
-
let tsCheck;
|
|
113
|
-
for (let i = inverseToOnlyReturnFirstLogs ? 0 : newLogs.length - 1; inverseToOnlyReturnFirstLogs ? i < newLogs.length : i >= 0; inverseToOnlyReturnFirstLogs ? i++ : i--) {
|
|
114
|
-
const log = newLogs[i];
|
|
115
|
-
const key = stringify([log.en, log.at]);
|
|
116
|
-
if (tsCheck && (inverseToOnlyReturnFirstLogs ? tsCheck > log.ts : tsCheck < log.ts)) {
|
|
117
|
-
throw ERROR(`withoutHistory.mapper logs not sorted:`, tsCheck, inverseToOnlyReturnFirstLogs ? ">" : "<", log.ts, {
|
|
118
|
-
log,
|
|
119
|
-
i,
|
|
120
|
-
newLogs,
|
|
121
|
-
inverseToOnlyReturnFirstLogs
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
tsCheck = log.ts;
|
|
125
|
-
const existing = rollingMap.get(key);
|
|
126
|
-
if (!existing || (inverseToOnlyReturnFirstLogs ? existing.ts > log.ts : existing.ts < log.ts)) {
|
|
127
|
-
if (existing && !isInitial)
|
|
128
|
-
toRemove.push(existing);
|
|
129
|
-
toAdd.push(log);
|
|
130
|
-
rollingMap.set(key, log);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
sortApplogsByTs(toAdd);
|
|
134
|
-
VERBOSE.isDisabled || VERBOSE(
|
|
135
|
-
`withoutHistory${inverseToOnlyReturnFirstLogs ? ".inversed" : ""}<${stream.nameAndSizeUntracked}> mapped event`,
|
|
136
|
-
isInitial ? { ...Object.fromEntries(Object.entries(event).map(([k, v]) => [k, v?.length])), toAdd: toAdd.length, toRemove } : { ...event, toAdd, toRemove }
|
|
137
|
-
);
|
|
138
|
-
return isInitial ? { init: toAdd } : { added: toAdd, removed: toRemove };
|
|
139
|
-
}, { name: `withoutHistory${inverseToOnlyReturnFirstLogs ? ".inversed" : ""}`, extraFilterName: "withoutHistory" });
|
|
140
|
-
VERBOSE.isDisabled || autorun(() => {
|
|
141
|
-
VERBOSE(`withoutHistory<${stream.nameAndSizeUntracked}> filtered down to`, mappedStream.applogs.length);
|
|
142
|
-
});
|
|
143
|
-
return mappedStream;
|
|
144
|
-
}, { equals: applogStreamComparer });
|
|
145
|
-
var withoutDeleted = computedFnDeepCompare(function withoutDeleted2(stream) {
|
|
146
|
-
VERBOSE(`withoutDeleted<${stream.nameAndSizeUntracked}>`);
|
|
147
|
-
if (stream.filters.includes("withoutDeleted")) {
|
|
148
|
-
throw ERROR(`stream already filtered withoutDeleted:`, stream.filters, { name: stream.name });
|
|
149
|
-
}
|
|
150
|
-
const deletionLogs = rollingFilter(
|
|
151
|
-
stream,
|
|
152
|
-
// TODO: handle un-delection
|
|
153
|
-
{ at: ["isDeleted", "relation/isDeleted", "block/isDeleted"], vl: true },
|
|
154
|
-
{ name: "isDeleted" }
|
|
155
|
-
);
|
|
156
|
-
VERBOSE(`withoutDeleted<${stream.nameAndSizeUntracked}> deletionLogs:`, untracked(() => [...deletionLogs.applogs]));
|
|
157
|
-
const obsArrMapName = createDebugName({ caller: "allDeletedEntities", stream });
|
|
158
|
-
const deleted = observableArrayMap(() => deletionLogs.map((log) => log.en), { name: obsArrMapName });
|
|
159
|
-
VERBOSE.isDisabled || autorun(() => {
|
|
160
|
-
VERBOSE(`withoutDeleted<${stream.nameAndSizeUntracked}> deleted:`, [...deleted]);
|
|
161
|
-
});
|
|
162
|
-
return rollingFilter(stream, { "!en": deleted }, { name: `withoutDeleted`, extraFilterName: "withoutDeleted" });
|
|
163
|
-
}, { equals: applogStreamComparer });
|
|
164
|
-
var query = computedFnDeepCompare(function query2(stream, patternOrPatterns, startVariables = {}, opts = {}) {
|
|
165
|
-
DEBUG(`query<${stream.nameAndSizeUntracked}>:`, patternOrPatterns);
|
|
166
|
-
const patterns = Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns];
|
|
167
|
-
let nodes;
|
|
168
|
-
if (patterns.length === 1) {
|
|
169
|
-
nodes = null;
|
|
170
|
-
} else {
|
|
171
|
-
const pattersExceptLast = patterns.slice(0, -1);
|
|
172
|
-
nodes = query2(stream, pattersExceptLast, startVariables, opts);
|
|
173
|
-
}
|
|
174
|
-
const lastPattern = patterns[patterns.length - 1];
|
|
175
|
-
const stepResult = queryStep(stream, nodes, lastPattern, opts);
|
|
176
|
-
VERBOSE.isDisabled || autorun(() => VERBOSE(`query result:`, toJS(stepResult)));
|
|
177
|
-
return stepResult;
|
|
178
|
-
}, { equals: queryNodesComparer });
|
|
179
|
-
var queryStep = computedFnDeepCompare(function queryStep2(stream, nodeSet, pattern, opts = {}) {
|
|
180
|
-
DEBUG(`queryStep<${stream.nameAndSizeUntracked}> with`, nodeSet?.untrackedSize ?? "all", "nodes, pattern:", pattern);
|
|
181
|
-
if (!Object.entries(pattern).length)
|
|
182
|
-
throw new Error(`Pattern is empty`);
|
|
183
|
-
const observableResultNodes = observableArrayMap(
|
|
184
|
-
() => {
|
|
185
|
-
function doQuery(node) {
|
|
186
|
-
const [patternWithResolvedVars, variablesToFill] = resolveOrRemoveVariables(pattern, node?.variables ?? {});
|
|
187
|
-
VERBOSE(`[queryStep] patternWithoutVars: `, patternWithResolvedVars);
|
|
188
|
-
const applogsMatchingStatic = rollingFilter(stream, patternWithResolvedVars);
|
|
189
|
-
const varMapper = mapTo(variablesToFill);
|
|
190
|
-
const newVarsAndTheirLog = applogsMatchingStatic.map((log) => ({ log, vars: varMapper(log) }));
|
|
191
|
-
VERBOSE.isDisabled || VERBOSE(
|
|
192
|
-
`[queryStep] step node:`,
|
|
193
|
-
node?.variables,
|
|
194
|
-
" =>",
|
|
195
|
-
newVarsAndTheirLog,
|
|
196
|
-
"from:",
|
|
197
|
-
untracked(() => applogsMatchingStatic.applogs)
|
|
198
|
-
);
|
|
199
|
-
const resultNodes = newVarsAndTheirLog.map(({ log, vars }) => {
|
|
200
|
-
const nodeVars = Object.assign({}, node?.variables, vars);
|
|
201
|
-
return new QueryNode(
|
|
202
|
-
new ApplogStreamInMemory(
|
|
203
|
-
[log],
|
|
204
|
-
stream.filters,
|
|
205
|
-
createDebugName({
|
|
206
|
-
caller: "QueryNode",
|
|
207
|
-
stream: applogsMatchingStatic,
|
|
208
|
-
pattern: `${stringify(nodeVars)}@${stringify(patternWithResolvedVars)}`
|
|
209
|
-
}),
|
|
210
|
-
true,
|
|
211
|
-
applogsMatchingStatic
|
|
212
|
-
),
|
|
213
|
-
nodeVars,
|
|
214
|
-
node
|
|
215
|
-
);
|
|
216
|
-
});
|
|
217
|
-
if (opts.debug) {
|
|
218
|
-
LOG(
|
|
219
|
-
`[queryStep] step result:`,
|
|
220
|
-
untracked(
|
|
221
|
-
() => resultNodes.map(({ variables, logsOfThisNode: stream2 }) => ({
|
|
222
|
-
variables,
|
|
223
|
-
stream: (
|
|
224
|
-
/* util.inspect( */
|
|
225
|
-
stream2.applogs
|
|
226
|
-
)
|
|
227
|
-
/* , { showHidden: false, depth: null }) */
|
|
228
|
-
}))
|
|
229
|
-
)
|
|
230
|
-
);
|
|
231
|
-
}
|
|
232
|
-
return resultNodes;
|
|
233
|
-
}
|
|
234
|
-
if (nodeSet) {
|
|
235
|
-
return nodeSet.nodes.flatMap(doQuery);
|
|
236
|
-
} else {
|
|
237
|
-
return doQuery(null);
|
|
238
|
-
}
|
|
239
|
-
},
|
|
240
|
-
{ name: createDebugName({ caller: "queryStep", stream, pattern }) }
|
|
241
|
-
);
|
|
242
|
-
VERBOSE(`queryStep result:`, observableResultNodes);
|
|
243
|
-
return new QueryNodes(observableResultNodes);
|
|
244
|
-
}, { equals: queryNodesComparer });
|
|
245
|
-
var queryNot = computedFnDeepCompare(function queryNot2(stream, startNodes, patternOrPatterns, opts = {}) {
|
|
246
|
-
let nodes = startNodes.nodes;
|
|
247
|
-
DEBUG(`queryNot<${stream.nameAndSizeUntracked}> from: ${nodes.length} nodes`);
|
|
248
|
-
const patterns = Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns];
|
|
249
|
-
for (const pattern of patterns) {
|
|
250
|
-
if (!Object.entries(patternOrPatterns).length)
|
|
251
|
-
throw new Error(`Pattern is empty`);
|
|
252
|
-
nodes = nodes.filter(({
|
|
253
|
-
/* applogs, */
|
|
254
|
-
variables
|
|
255
|
-
}) => {
|
|
256
|
-
const [patternWithResolvedVars, _variablesToFill] = resolveOrRemoveVariables(pattern, variables ?? {});
|
|
257
|
-
VERBOSE(`[queryNot] patternWithoutVars: `, patternWithResolvedVars);
|
|
258
|
-
const newApplogs = rollingFilter(stream, patternWithResolvedVars);
|
|
259
|
-
VERBOSE(`[queryNot] step node:`, variables, " =>", newApplogs.size, "applogs");
|
|
260
|
-
VERBOSE.isDisabled || VERBOSE(`[queryNot] step node:`, variables, " => empty?", untracked(() => newApplogs.applogs));
|
|
261
|
-
if (opts.debug)
|
|
262
|
-
LOG(`[queryNot] node result:`, variables, "=>", newApplogs.applogs);
|
|
263
|
-
return newApplogs.isEmpty;
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
return new QueryNodes(nodes);
|
|
267
|
-
}, { equals: queryNodesComparer });
|
|
268
|
-
var filterAndMap = computedFnDeepCompare(function filterAndMap2(stream, pattern, mapper) {
|
|
269
|
-
DEBUG(`filterAndMap<${stream.nameAndSizeUntracked}>`, pattern);
|
|
270
|
-
const filtered = rollingFilter(stream, pattern);
|
|
271
|
-
VERBOSE(`[filterAndMap] filtered:`, filtered.untrackedSize);
|
|
272
|
-
VERBOSE.isDisabled || autorun(() => VERBOSE(`[filterAndMap] filtered:`, filtered.applogs));
|
|
273
|
-
const mapperFX = function filterAndMapGetterFx() {
|
|
274
|
-
if (typeof mapper === "function") {
|
|
275
|
-
return filtered.map(mapper);
|
|
276
|
-
} else if (typeof mapper === "string") {
|
|
277
|
-
return filtered.map((log) => log[mapper]);
|
|
278
|
-
} else {
|
|
279
|
-
return filtered.map(mapTo(mapper));
|
|
280
|
-
}
|
|
281
|
-
};
|
|
282
|
-
const name = createDebugName({ stream, pattern, caller: "filterAndMap" });
|
|
283
|
-
const mapped = observableArrayMap(mapperFX, { name });
|
|
284
|
-
VERBOSE.isDisabled || autorun(() => VERBOSE(`[filterAndMap] mapped:`, mapped));
|
|
285
|
-
return mapped;
|
|
286
|
-
}, { equals: comparer.structural });
|
|
287
|
-
var queryAndMap = computedFnDeepCompare(function queryAndMap2(stream, patternOrPatterns, map, variables = {}) {
|
|
288
|
-
DEBUG(`queryAndMap<${stream.nameAndSizeUntracked}>`, { patternOrPatterns, variables, map });
|
|
289
|
-
const debugName = createDebugName({ stream, caller: "queryAndMap" });
|
|
290
|
-
const filtered = query(stream, patternOrPatterns);
|
|
291
|
-
VERBOSE(`[queryAndMap] filtered count:`, filtered.untrackedSize);
|
|
292
|
-
const mapped = observableArrayMap(
|
|
293
|
-
() => {
|
|
294
|
-
if (typeof map === "function") {
|
|
295
|
-
return filtered.records.map(map);
|
|
296
|
-
} else if (typeof map === "string") {
|
|
297
|
-
return filtered.records.map((log) => log[map]);
|
|
298
|
-
} else {
|
|
299
|
-
throw new Error("what's this map param about?");
|
|
300
|
-
}
|
|
301
|
-
},
|
|
302
|
-
{ name: debugName }
|
|
303
|
-
);
|
|
304
|
-
VERBOSE.isDisabled || autorun(() => VERBOSE(`[queryAndMap] result:`, toJS(mapped)));
|
|
305
|
-
return mapped;
|
|
306
|
-
}, { equals: comparer.structural });
|
|
307
|
-
var queryEntity = computedFnDeepCompare(function queryEntity2(stream, name, entityID, attributes) {
|
|
308
|
-
DEBUG(`queryEntity<${stream.nameAndSizeUntracked}>`, entityID, name);
|
|
309
|
-
const filtered = rollingFilter(stream, { en: entityID, at: prefixAttrs(name, attributes) });
|
|
310
|
-
VERBOSE(`queryEntity applogs:`, filtered.applogs);
|
|
311
|
-
return computed(
|
|
312
|
-
() => filtered.isEmpty ? null : Object.fromEntries(
|
|
313
|
-
filtered.map(({ at, vl }) => [at.slice(name.length + 1), vl])
|
|
314
|
-
)
|
|
315
|
-
);
|
|
316
|
-
}, { equals: computedStructuralComparer });
|
|
317
|
-
var agentsOfStream = computedFnDeepCompare(function agentsOfStream2(stream) {
|
|
318
|
-
LOG(`agentsOfStream<${stream.nameAndSizeUntracked}>`);
|
|
319
|
-
const mapped = observable.map();
|
|
320
|
-
function onEvent(event) {
|
|
321
|
-
for (const log of isInitEvent(event) ? event.init : event.added) {
|
|
322
|
-
const prev = mapped.get(log.ag) ?? 0;
|
|
323
|
-
mapped.set(log.ag, prev + 1);
|
|
324
|
-
}
|
|
325
|
-
for (const log of !isInitEvent(event) && event.removed || []) {
|
|
326
|
-
const prev = mapped.get(log.ag);
|
|
327
|
-
if (!prev || prev < 1)
|
|
328
|
-
throw ERROR(`[agentsOfStream] number is now negative`, { log, event, mapped, prev });
|
|
329
|
-
mapped.set(log.ag, prev - 1);
|
|
330
|
-
}
|
|
331
|
-
LOG(`agentsOfStream<${stream.nameAndSizeUntracked}> processed event`, { event, mapped });
|
|
332
|
-
}
|
|
333
|
-
untracked(() => onEvent({ init: stream.applogs }));
|
|
334
|
-
stream.subscribe(onEvent);
|
|
335
|
-
onBecomeObserved(mapped, () => stream.unsubscribe(onEvent));
|
|
336
|
-
return mapped;
|
|
337
|
-
});
|
|
338
|
-
var entityOverlap = computedFnDeepCompare(function entityOverlapCount(streamA, streamB) {
|
|
339
|
-
LOG(`entityOverlap<${streamA.nameAndSizeUntracked}, ${streamB.nameAndSizeUntracked}>`);
|
|
340
|
-
return computed(() => {
|
|
341
|
-
const entitiesA = new Set(streamA.map((log) => log.en));
|
|
342
|
-
const entitiesB = new Set(streamB.map((log) => log.en));
|
|
343
|
-
return [...entitiesA].filter((en) => entitiesB.has(en));
|
|
344
|
-
});
|
|
345
|
-
});
|
|
346
|
-
var entityOverlapCount2 = computedFnDeepCompare(function entityOverlapCount3(streamA, streamB) {
|
|
347
|
-
return computed(() => entityOverlap(streamA, streamB).get().length);
|
|
348
|
-
});
|
|
349
|
-
function mapTo(applogFieldMap) {
|
|
350
|
-
return (applog) => {
|
|
351
|
-
return Object.entries(applogFieldMap).reduce((acc, [key, value]) => {
|
|
352
|
-
acc[value] = applog[key];
|
|
353
|
-
return acc;
|
|
354
|
-
}, {});
|
|
355
|
-
};
|
|
356
|
-
}
|
|
357
|
-
function startsWith(str) {
|
|
358
|
-
return (value) => value.startsWith(str);
|
|
359
|
-
}
|
|
360
|
-
function prefixAttrs(prefix, attrs) {
|
|
361
|
-
return attrs.map((at) => prefixAt(prefix, at));
|
|
362
|
-
}
|
|
363
|
-
function prefixAt(prefix, attr) {
|
|
364
|
-
return `${prefix}/${attr}`;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
// src/applog/applog-helpers.ts
|
|
368
|
-
var { WARN: WARN2, LOG: LOG2, DEBUG: DEBUG2, VERBOSE: VERBOSE2, ERROR: ERROR2 } = Logger2.setup(Logger2.INFO);
|
|
369
|
-
function hasAg(log) {
|
|
370
|
-
return !!log.ag;
|
|
371
|
-
}
|
|
372
|
-
function hasTs(log) {
|
|
373
|
-
return !!log.ts;
|
|
374
|
-
}
|
|
375
|
-
function hasPv(log) {
|
|
376
|
-
return !!log.pv;
|
|
377
|
-
}
|
|
378
|
-
function withTs(log, ts) {
|
|
379
|
-
return hasTs(log) ? log : { ...log, ts };
|
|
380
|
-
}
|
|
381
|
-
function withPv(log, ds) {
|
|
382
|
-
const { en, at } = log;
|
|
383
|
-
const pvs = filterAndMap(withoutHistory(ds), { en, at }, "cid");
|
|
384
|
-
if (pvs.length > 1)
|
|
385
|
-
WARN2(`[withPv] unexpected result count:`, pvs.length);
|
|
386
|
-
let pv = pvs.length ? pvs[0] : null;
|
|
387
|
-
const isMatchingPv = !!(pv === log.pv);
|
|
388
|
-
if (log.pv && !isMatchingPv)
|
|
389
|
-
WARN2(`[withPv] different than pre-set pv:`, { queriedPv: pv, logPv: log.pv });
|
|
390
|
-
pv = log.pv ?? pv;
|
|
391
|
-
return { ...log, pv: pv ?? null };
|
|
392
|
-
}
|
|
393
|
-
function joinStreams(streams) {
|
|
394
|
-
if (streams.length === 0)
|
|
395
|
-
throw ERROR2(`joinStreams called with empty array`);
|
|
396
|
-
if (streams.length === 1)
|
|
397
|
-
return streams[0];
|
|
398
|
-
const fullJoin = () => sortApplogsByTs(
|
|
399
|
-
removeDuplicateAppLogs(streams.flatMap((s) => {
|
|
400
|
-
const logs = s.applogs;
|
|
401
|
-
if (!logs) {
|
|
402
|
-
ERROR2(`falsy applogs of stream`, s);
|
|
403
|
-
throw new Error(`falsy applogs of stream`);
|
|
404
|
-
}
|
|
405
|
-
return logs;
|
|
406
|
-
}))
|
|
407
|
-
);
|
|
408
|
-
const initialMergeResult = untracked2(() => fullJoin());
|
|
409
|
-
const eventMapper = action(function(event, sourceStream) {
|
|
410
|
-
if (isInitEvent(event)) {
|
|
411
|
-
return { init: untracked2(() => fullJoin()) };
|
|
412
|
-
} else {
|
|
413
|
-
return {
|
|
414
|
-
// TODO: test this stuff
|
|
415
|
-
added: event.added.filter((addedLog) => !this.hasApplog(addedLog, true)),
|
|
416
|
-
removed: event.added.filter(
|
|
417
|
-
(addedLog) => !this.parents.some((parent) => {
|
|
418
|
-
if (parent === sourceStream)
|
|
419
|
-
return false;
|
|
420
|
-
return parent.hasApplog(addedLog, true);
|
|
421
|
-
})
|
|
422
|
-
)
|
|
423
|
-
};
|
|
424
|
-
}
|
|
425
|
-
});
|
|
426
|
-
return new MappedApplogStream(streams, ["?"], initialMergeResult, eventMapper, `join(${streams.map((s) => s.name).join(", ")})`);
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
// src/applog/datom-types.ts
|
|
430
|
-
import { FormatRegistry, Type } from "@sinclair/typebox";
|
|
431
|
-
import { TypeCompiler } from "@sinclair/typebox/compiler";
|
|
432
|
-
var Nullable = (schema) => Type.Union([schema, Type.Null()]);
|
|
433
|
-
var EntityID_LENGTH = 7;
|
|
434
|
-
var isCID = /^(k51qz|baguq)[0-9a-z]{56,57}$/;
|
|
435
|
-
var isShortHash = /^[0-9A-Fa-f]{7,8}$/g;
|
|
436
|
-
FormatRegistry.Set("EntityID", (value) => !!value.match(isShortHash) || !!value.match(isCID));
|
|
437
|
-
var EntityID = Type.String();
|
|
438
|
-
FormatRegistry.Set("CID", (value) => !!value.match(isCID));
|
|
439
|
-
var CIDTB = Type.String({ format: "EntityID" });
|
|
440
|
-
var isURL = /^http([s]?):\/\/.*\..*/;
|
|
441
|
-
FormatRegistry.Set("URL", (value) => !!value.match(isURL));
|
|
442
|
-
var URL = Type.String({ format: "URL" });
|
|
443
|
-
var AppLogTB = Type.Object({
|
|
444
|
-
en: EntityID,
|
|
445
|
-
// EntityID
|
|
446
|
-
at: Type.String(),
|
|
447
|
-
// Attribute
|
|
448
|
-
vl: Nullable(Type.Union([Type.String(), Type.Boolean(), Type.Number()])),
|
|
449
|
-
// TODO refactor to semantic typesafe ApplogValue
|
|
450
|
-
ts: Type.String(),
|
|
451
|
-
// Timestamp
|
|
452
|
-
ag: Type.String()
|
|
453
|
-
// AgentHash
|
|
454
|
-
});
|
|
455
|
-
var AppLogTBC = TypeCompiler.Compile(AppLogTB);
|
|
456
|
-
var getApplogTypeErrors = (obj) => Array.from(AppLogTBC.Errors(obj));
|
|
457
|
-
var isValidApplog = AppLogTBC.Check.bind(AppLogTBC);
|
|
458
|
-
|
|
459
|
-
// src/stream/writeable.ts
|
|
460
|
-
var { WARN: WARN3, LOG: LOG3, DEBUG: DEBUG3, VERBOSE: VERBOSE3, ERROR: ERROR3 } = Logger3.setup(Logger3.INFO);
|
|
461
|
-
var WriteableApplogStream = class extends ApplogStream {
|
|
462
|
-
constructor(parents, filters, applogs = [], name) {
|
|
463
|
-
super(parents, filters, applogs, name);
|
|
464
|
-
makeObservable2(this, {
|
|
465
|
-
insert: action2
|
|
466
|
-
// ? is there an advantage to do this here instead of wrapping the fx in action below?
|
|
467
|
-
});
|
|
468
|
-
}
|
|
469
|
-
insert(appLogsToInsert) {
|
|
470
|
-
const ts = dateNowIso();
|
|
471
|
-
const mapped = appLogsToInsert.map((log) => {
|
|
472
|
-
const logWithTs = withTs(log, ts);
|
|
473
|
-
if (!isValidApplog(logWithTs)) {
|
|
474
|
-
throw ERROR3(`Bogus Applog ${JSON.stringify(logWithTs)}`, getApplogTypeErrors(logWithTs));
|
|
475
|
-
}
|
|
476
|
-
const logWithPv = withPv(logWithTs, this);
|
|
477
|
-
const cid = encodeApplogAndGetCid(logWithPv).toString();
|
|
478
|
-
const logWithCid = { ...logWithPv, cid };
|
|
479
|
-
return Object.freeze(logWithCid);
|
|
480
|
-
});
|
|
481
|
-
const mappedLogs = removeDuplicateAppLogs(mapped);
|
|
482
|
-
if (appLogsToInsert.length !== mappedLogs.length) {
|
|
483
|
-
WARN3("request to insert duplicate log, inserting mappedLogs:", { appLogsToInsert, mappedLogs });
|
|
484
|
-
} else if (!appLogsToInsert.length) {
|
|
485
|
-
WARN3("request to insert empty logs array");
|
|
486
|
-
} else {
|
|
487
|
-
LOG3("Inserting:", mappedLogs.length === 1 ? mappedLogs[0] : mappedLogs, { ds: this });
|
|
488
|
-
}
|
|
489
|
-
if (!mappedLogs.length)
|
|
490
|
-
return [];
|
|
491
|
-
sortApplogsByTs(mappedLogs);
|
|
492
|
-
const sortNeeded = this._applogs.length && isTsBefore(mappedLogs[0], this._applogs[this._applogs.length - 1]);
|
|
493
|
-
this._applogs.push(...mappedLogs);
|
|
494
|
-
if (sortNeeded) {
|
|
495
|
-
sortApplogsByTs(this._applogs);
|
|
496
|
-
}
|
|
497
|
-
this.notifySubscribers({ added: mappedLogs, removed: null });
|
|
498
|
-
void this.persist(mappedLogs);
|
|
499
|
-
return mappedLogs;
|
|
500
|
-
}
|
|
501
|
-
get readOnly() {
|
|
502
|
-
return false;
|
|
503
|
-
}
|
|
504
|
-
};
|
|
505
|
-
var ApplogStreamInMemory = class extends WriteableApplogStream {
|
|
506
|
-
constructor(applogs, filters, name, _readOnly, parents = null) {
|
|
507
|
-
super(parents, filters, applogs, name);
|
|
508
|
-
this._readOnly = _readOnly;
|
|
509
|
-
makeObservable2(this, {
|
|
510
|
-
// @ts-expect-error bc it's private
|
|
511
|
-
_applogs: observable2.shallow
|
|
512
|
-
});
|
|
513
|
-
}
|
|
514
|
-
get readOnly() {
|
|
515
|
-
return this._readOnly;
|
|
516
|
-
}
|
|
517
|
-
persist(logs) {
|
|
518
|
-
VERBOSE3(`[InMem.persist] no persist for`, logs);
|
|
519
|
-
if (this.readOnly) {
|
|
520
|
-
throw ERROR3(`[persist] called for readOnly stream`);
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
};
|
|
524
|
-
|
|
525
|
-
export {
|
|
526
|
-
Nullable,
|
|
527
|
-
EntityID_LENGTH,
|
|
528
|
-
EntityID,
|
|
529
|
-
CIDTB,
|
|
530
|
-
URL,
|
|
531
|
-
AppLogTB,
|
|
532
|
-
AppLogTBC,
|
|
533
|
-
getApplogTypeErrors,
|
|
534
|
-
isValidApplog,
|
|
535
|
-
WriteableApplogStream,
|
|
536
|
-
ApplogStreamInMemory,
|
|
537
|
-
QueryNode,
|
|
538
|
-
QueryNodes,
|
|
539
|
-
withoutHistory,
|
|
540
|
-
withoutDeleted,
|
|
541
|
-
query,
|
|
542
|
-
queryStep,
|
|
543
|
-
queryNot,
|
|
544
|
-
filterAndMap,
|
|
545
|
-
queryAndMap,
|
|
546
|
-
queryEntity,
|
|
547
|
-
agentsOfStream,
|
|
548
|
-
entityOverlap,
|
|
549
|
-
entityOverlapCount2 as entityOverlapCount,
|
|
550
|
-
mapTo,
|
|
551
|
-
startsWith,
|
|
552
|
-
prefixAttrs,
|
|
553
|
-
prefixAt,
|
|
554
|
-
hasAg,
|
|
555
|
-
hasTs,
|
|
556
|
-
hasPv,
|
|
557
|
-
withTs,
|
|
558
|
-
withPv,
|
|
559
|
-
joinStreams
|
|
560
|
-
};
|
|
561
|
-
//# sourceMappingURL=chunk-VKQDEGWA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stream/writeable.ts","../src/applog/applog-helpers.ts","../src/query/basic.ts","../src/applog/datom-types.ts"],"sourcesContent":["import { Logger } from 'besonders-logger'\nimport { action, makeObservable, observable } from 'mobx'\nimport { withPv, withTs } from '../applog/applog-helpers'\nimport { dateNowIso } from '../applog/applog-utils'\nimport { isTsBefore, removeDuplicateAppLogs, sortApplogsByTs } from '../applog/applog-utils'\nimport { type Applog, ApplogForInsert, getApplogTypeErrors, isValidApplog } from '../applog/datom-types'\nimport { encodeApplogAndGetCid } from '../ipfs/ipfs-utils'\nimport { ApplogStream } from './basic'\n\nconst { WARN, LOG, DEBUG, VERBOSE, ERROR } = Logger.setup(Logger.INFO) // eslint-disable-line no-unused-vars\n\nexport abstract class WriteableApplogStream extends ApplogStream {\n\tconstructor(\n\t\tparents: ApplogStream | ApplogStream[] | null,\n\t\tfilters: string[],\n\t\tapplogs: Applog[] = [],\n\t\tname: string,\n\t) {\n\t\tsuper(parents, filters, applogs, name)\n\n\t\tmakeObservable(this, {\n\t\t\tinsert: action, // ? is there an advantage to do this here instead of wrapping the fx in action below?\n\t\t})\n\t}\n\n\tpublic insert(appLogsToInsert: ApplogForInsert[]) {\n\t\tconst ts = dateNowIso()\n\n\t\tconst mapped = appLogsToInsert.map(log => {\n\t\t\tconst logWithTs = withTs(log, ts)\n\t\t\tif (!isValidApplog(logWithTs)) {\n\t\t\t\tthrow ERROR(`Bogus Applog ${JSON.stringify(logWithTs)}`, getApplogTypeErrors(logWithTs))\n\t\t\t}\n\t\t\tconst logWithPv = withPv(logWithTs, this)\n\t\t\tconst cid = encodeApplogAndGetCid(logWithPv).toString()\n\t\t\tconst logWithCid = { ...logWithPv, cid } satisfies Applog\n\t\t\treturn Object.freeze(logWithCid)\n\t\t})\n\t\tconst mappedLogs = removeDuplicateAppLogs(mapped)\n\t\tif (appLogsToInsert.length !== mappedLogs.length) {\n\t\t\tWARN('request to insert duplicate log, inserting mappedLogs:', { appLogsToInsert, mappedLogs })\n\t\t} else if (!appLogsToInsert.length) {\n\t\t\tWARN('request to insert empty logs array')\n\t\t} else {\n\t\t\tLOG('Inserting:', mappedLogs.length === 1 ? mappedLogs[0] : mappedLogs, { ds: this })\n\t\t}\n\t\tif (!mappedLogs.length) return []\n\n\t\tsortApplogsByTs(mappedLogs)\n\t\tconst sortNeeded = this._applogs.length && isTsBefore(mappedLogs[0], this._applogs[this._applogs.length - 1])\n\t\tthis._applogs.push(...mappedLogs)\n\t\tif (sortNeeded) {\n\t\t\tsortApplogsByTs(this._applogs)\n\t\t}\n\t\tthis.notifySubscribers({ added: mappedLogs, removed: null })\n\n\t\t// ? persist sync\n\t\tvoid this.persist(mappedLogs)\n\t\treturn mappedLogs as Applog[]\n\t}\n\n\tget readOnly() {\n\t\treturn false\n\t}\n\n\tprotected abstract persist(logs: Applog[])\n}\nexport class ApplogStreamInMemory extends WriteableApplogStream {\n\tconstructor(\n\t\tapplogs: Applog[],\n\t\tfilters: string[],\n\t\tname: string,\n\t\treadonly _readOnly: boolean,\n\t\tparents: ApplogStream | ApplogStream[] | null = null,\n\t) {\n\t\tsuper(parents, filters, applogs, name)\n\n\t\tmakeObservable(this, {\n\t\t\t// @ts-expect-error bc it's private\n\t\t\t_applogs: observable.shallow,\n\t\t})\n\t}\n\n\tget readOnly() {\n\t\treturn this._readOnly\n\t}\n\n\tprotected persist(logs: Applog[]) {\n\t\tVERBOSE(`[InMem.persist] no persist for`, logs)\n\t\tif (this.readOnly) {\n\t\t\tthrow ERROR(`[persist] called for readOnly stream`)\n\t\t}\n\t}\n}\n","import { Logger } from 'besonders-logger'\nimport { action, untracked } from 'mobx'\nimport { filterAndMap, withoutHistory } from '../query/basic'\nimport { ApplogEventMapper, ApplogStream, isInitEvent, MappedApplogStream } from '../stream'\nimport { WriteableApplogStream } from '../stream/writeable'\nimport { removeDuplicateAppLogs, sortApplogsByTs } from './applog-utils'\nimport { Applog, ApplogForInsert, ApplogForInsertOptionalAgent, ApplogNoCid, Timestamp } from './datom-types'\n\nconst { WARN, LOG, DEBUG, VERBOSE, ERROR } = Logger.setup(Logger.INFO) // eslint-disable-line no-unused-vars\n\nexport function hasAg(log: ApplogForInsertOptionalAgent): log is ApplogForInsert {\n\treturn !!log.ag\n}\nexport function hasTs(log: ApplogForInsert): log is Omit<ApplogForInsert, 'ts'> & { ts: Timestamp } {\n\treturn !!log.ts\n}\nexport function hasPv(log: ApplogForInsert): log is ApplogForInsert & { pv: string } {\n\treturn !!log.pv\n}\n\nexport function withTs(log: ApplogForInsert, ts: Timestamp) {\n\treturn hasTs(log) ? log : { ...log, ts }\n}\nexport function withPv(log: ApplogNoCid, ds: WriteableApplogStream) {\n\tconst { en, at } = log\n\tconst pvs = filterAndMap(withoutHistory(ds), { en, at }, 'cid')\n\tif (pvs.length > 1) WARN(`[withPv] unexpected result count:`, pvs.length)\n\tlet pv = pvs.length ? pvs[0] : null\n\tconst isMatchingPv = !!(pv === log.pv)\n\tif (log.pv && !isMatchingPv) WARN(`[withPv] different than pre-set pv:`, { queriedPv: pv, logPv: log.pv }) // TODO: this is actually a normal thing when e.g. pulling\n\tpv = log.pv ?? pv\n\treturn { ...log, pv: pv ?? null }\n}\nexport function joinStreams(streams: ApplogStream[]) {\n\tif (streams.length === 0) throw ERROR(`joinStreams called with empty array`) // ? EmptyStream\n\tif (streams.length === 1) return streams[0]\n\tconst fullJoin = () =>\n\t\tsortApplogsByTs(\n\t\t\tremoveDuplicateAppLogs(streams.flatMap(s => {\n\t\t\t\tconst logs = s.applogs\n\t\t\t\tif (!logs) {\n\t\t\t\t\tERROR(`falsy applogs of stream`, s)\n\t\t\t\t\tthrow new Error(`falsy applogs of stream`)\n\t\t\t\t}\n\t\t\t\treturn logs\n\t\t\t})),\n\t\t)\n\tconst initialMergeResult = untracked(() => fullJoin())\n\tconst eventMapper: ApplogEventMapper = action(function(event, sourceStream) {\n\t\tif (isInitEvent(event)) {\n\t\t\treturn { init: untracked(() => fullJoin()) } // HACK: if this would become a common thing, think of a better solution\n\t\t} else {\n\t\t\treturn {\n\t\t\t\t// TODO: test this stuff\n\t\t\t\tadded: event.added.filter(addedLog => !this.hasApplog(addedLog, true)),\n\t\t\t\tremoved: event.added.filter(addedLog =>\n\t\t\t\t\t!this.parents.some(parent => {\n\t\t\t\t\t\tif (parent === sourceStream) return false\n\t\t\t\t\t\treturn parent.hasApplog(addedLog, true)\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t}\n\t\t}\n\t})\n\t// TODO @manu check this ['?'] biz\n\treturn new MappedApplogStream(streams, ['?'], initialMergeResult, eventMapper, `join(${streams.map(s => s.name).join(', ')})`)\n}\n","import { Applog, ApplogValue, DatalogQueryPattern, EntityID, SearchContext } from '../applog/datom-types'\n\nimport { Logger } from 'besonders-logger'\nimport { autorun, comparer, computed, makeObservable, observable, onBecomeObserved, toJS, untracked } from 'mobx'\n\nimport stringify from 'safe-stable-stringify'\nimport { joinStreams } from '../applog/applog-helpers'\nimport { resolveOrRemoveVariables, sortApplogsByTs } from '../applog/applog-utils'\nimport {\n\tapplogStreamComparer,\n\tcomputedFnDeepCompare,\n\tcomputedStructuralComparer,\n\tcreateDebugName,\n\tobservableArrayMap,\n\tqueryNodesComparer,\n} from '../mobx/mobx-utils'\nimport { ApplogStream, ApplogStreamEvent, isInitEvent } from '../stream'\nimport { rollingFilter, rollingMapper } from '../stream/filters'\nimport { ApplogStreamInMemory } from '../stream/writeable'\n\nconst { WARN, LOG, DEBUG, VERBOSE, ERROR } = Logger.setup(Logger.INFO, { prefix: '[q]' }) // eslint-disable-line no-unused-vars\n\n// util.inspect.defaultOptions.depth = 5;\n\n// export interface QueryExecutorArguments {\n// db: ApplogStream\n// // applogs: AppLog[]\n// nodes: SearchContextWithLog[]\n// }\n// export interface QueryExecutorResult {\n// // applogs: AppLog[]\n// nodes: SearchContextWithLog[]\n// }\n// export type QueryExecutor = (args: QueryExecutorArguments) => QueryExecutorResult\n\nexport class QueryNode {\n\tconstructor(\n\t\tpublic logsOfThisNode: ApplogStream,\n\t\tpublic variables: SearchContext,\n\t\tpublic prev: QueryNode | null = null,\n\t) {\n\t\tmakeObservable(this, {\n\t\t\tallApplogs: computed, // ? intuitively only put the ones here that felt expensive to compute (join)\n\t\t})\n\t}\n\tget record() {\n\t\treturn this.variables // alias for end-user consumption\n\t}\n\n\tget allApplogs() {\n\t\tif (!this.prev) return this.logsOfThisNode\n\t\treturn joinStreams([\n\t\t\tthis.logsOfThisNode,\n\t\t\tthis.prev.allApplogs,\n\t\t])\n\t}\n}\nexport class QueryNodes {\n\tconstructor(\n\t\tpublic nodes: Array<QueryNode>,\n\t) {\n\t\tmakeObservable(this, {\n\t\t\tallApplogs: computed, // ? intuitively only put the ones here that felt expensive to compute (join)\n\t\t\tsize: computed, // ... or cheap to cache\n\t\t\tisEmpty: computed,\n\t\t})\n\t}\n\n\tget size() {\n\t\treturn this.records.length\n\t}\n\tget isEmpty() {\n\t\treturn this.records.length === 0\n\t}\n\tget untrackedSize() {\n\t\treturn untracked(() => this.records.length)\n\t}\n\n\tget records() {\n\t\treturn this.nodes.map(({ variables }) => variables)\n\t}\n\tget applogSets() {\n\t\treturn this.nodes.map(({ logsOfThisNode: stream }) => stream.applogs)\n\t}\n\tget applogStreams() {\n\t\treturn this.nodes.map(({ logsOfThisNode: stream }) => stream)\n\t}\n\tget allApplogs() {\n\t\treturn joinStreams(this.nodes.map(node => node.allApplogs))\n\t}\n}\n\n/////////////\n// QUERIES //\n/////////////\n\n/**\n * Keep only the latest logs for each en&at (= last write wins)\n */\nexport const withoutHistory = computedFnDeepCompare(function withoutHistory(\n\tstream: ApplogStream,\n\t{ inverseToOnlyReturnFirstLogs, tolerateAlreadyFiltered }: {\n\t\tinverseToOnlyReturnFirstLogs?: boolean\n\t\ttolerateAlreadyFiltered?: boolean\n\t} = {},\n) {\n\tVERBOSE(`withoutHistory${inverseToOnlyReturnFirstLogs ? '.inversed' : ''} < ${stream.nameAndSizeUntracked} > initializing`)\n\t// if (stream.name.includes('withoutHistory')) WARN(`stream already contains withoutHistory:`, stream.name)\n\tif (stream.filters.includes('withoutHistory')) {\n\t\tif (tolerateAlreadyFiltered) {\n\t\t\tDEBUG(`[withoutHistory] already filtered, but tolerateAlreadyFiltered=true, so returning`)\n\t\t\treturn stream\n\t\t}\n\t\tthrow ERROR(`stream already filtered withoutHistory:`, stream.filters, { name: stream.name })\n\t}\n\n\tlet rollingMap: Map<string, Applog>\n\tconst mappedStream = rollingMapper(stream, function(event, sourceStream) {\n\t\tconst isInitial = isInitEvent(event)\n\n\t\tlet newLogs: readonly Applog[]\n\t\tconst toAdd = [] as Applog[]\n\t\tconst toRemove = isInitial ? null : [] as Applog[]\n\t\tif (isInitial) {\n\t\t\trollingMap = new Map()\n\t\t\tnewLogs = event.init\n\t\t} else {\n\t\t\tnewLogs = event.added\n\t\t}\n\n\t\tlet tsCheck: string\n\t\tfor (\n\t\t\tlet i = inverseToOnlyReturnFirstLogs ? 0 : newLogs.length - 1;\n\t\t\tinverseToOnlyReturnFirstLogs ? i < newLogs.length : i >= 0;\n\t\t\tinverseToOnlyReturnFirstLogs ? i++ : i--\n\t\t) {\n\t\t\tconst log = newLogs[i]\n\t\t\tconst key = stringify([log.en, log.at])\n\n\t\t\tif (tsCheck && (inverseToOnlyReturnFirstLogs ? tsCheck > log.ts : tsCheck < log.ts)) {\n\t\t\t\tthrow ERROR(`withoutHistory.mapper logs not sorted:`, tsCheck, inverseToOnlyReturnFirstLogs ? '>' : '<', log.ts, {\n\t\t\t\t\tlog,\n\t\t\t\t\ti,\n\t\t\t\t\tnewLogs,\n\t\t\t\t\tinverseToOnlyReturnFirstLogs,\n\t\t\t\t})\n\t\t\t}\n\t\t\ttsCheck = log.ts\n\n\t\t\tconst existing = rollingMap.get(key)\n\t\t\tif (!existing || (inverseToOnlyReturnFirstLogs ? (existing.ts > log.ts) : (existing.ts < log.ts))) {\n\t\t\t\tif (existing && !isInitial) toRemove.push(existing)\n\t\t\t\ttoAdd.push(log)\n\t\t\t\trollingMap.set(key, log)\n\t\t\t}\n\t\t}\n\t\tsortApplogsByTs(toAdd) // HACK: find logical solution\n\t\tVERBOSE.isDisabled ||\n\t\t\tVERBOSE(\n\t\t\t\t`withoutHistory${inverseToOnlyReturnFirstLogs ? '.inversed' : ''}<${stream.nameAndSizeUntracked}> mapped event`,\n\t\t\t\tisInitial ?\n\t\t\t\t\t{ ...Object.fromEntries(Object.entries(event).map(([k, v]) => [k, v?.length])), toAdd: toAdd.length, toRemove } :\n\t\t\t\t\t{ ...event, toAdd, toRemove },\n\t\t\t)\n\t\treturn isInitial ?\n\t\t\t{ init: toAdd }\n\t\t\t: { added: toAdd, removed: toRemove }\n\t}, { name: `withoutHistory${inverseToOnlyReturnFirstLogs ? '.inversed' : ''}`, extraFilterName: 'withoutHistory' })\n\tVERBOSE.isDisabled || autorun(() => {\n\t\tVERBOSE(`withoutHistory<${stream.nameAndSizeUntracked}> filtered down to`, mappedStream.applogs.length) // using applogs.length, as size might not change, but we still want a log\n\t})\n\treturn mappedStream\n\t// const filtered = observableArrayMap(() => {\n\t// VERBOSE(`withoutHistory stream deps:`, getDependencyTree(stream.applogs), stream)\n\t// stream.applogs.forEach(applog => {\n\t// const key = stringify([applog.en, applog.at])\n\t// const existing = mapped.get(key)\n\t// if (!existing || existing.ts < applog.ts)\n\t// mapped.set(key, applog)\n\t// })\n\t// VERBOSE(`[withoutHistory] mapped:`, mapped.size)\n\t// return Array.from(mapped.values())\n\t// }, { name: obsArrMapName })\n\t// VERBOSE(`withoutHistory deps of filteredArr:`, getDependencyTree(filtered))\n\t// return new MappedApplogStream(stream, filtered, `${stream.name} | withoutHistory`)\n}, { equals: applogStreamComparer })\n\n/**\n * Remove all applogs for entities that have an applog: { at: `isDeleted`, val: true }\n * ! WARNING: If not based on withoutHistory, it will not respect un-deletions yet (isDeleted: false)\n */\nexport const withoutDeleted = computedFnDeepCompare(function withoutDeleted(\n\tstream: ApplogStream,\n) {\n\tVERBOSE(`withoutDeleted<${stream.nameAndSizeUntracked}>`)\n\t// if (stream.name.includes('withoutDeleted')) WARN(`stream already contains withoutDeleted:`, withoutDeleted)\n\tif (stream.filters.includes('withoutDeleted')) {\n\t\tthrow ERROR(`stream already filtered withoutDeleted:`, stream.filters, { name: stream.name })\n\t}\n\n\tconst deletionLogs = rollingFilter(\n\t\tstream, // TODO: handle un-delection\n\t\t{ at: ['isDeleted', 'relation/isDeleted', 'block/isDeleted'], vl: true },\n\t\t{ name: 'isDeleted' },\n\t)\n\tVERBOSE(`withoutDeleted<${stream.nameAndSizeUntracked}> deletionLogs:`, untracked(() => [...deletionLogs.applogs]))\n\tconst obsArrMapName = createDebugName({ caller: 'allDeletedEntities', stream })\n\tconst deleted = observableArrayMap(() => deletionLogs.map(log => log.en), { name: obsArrMapName })\n\t// VERBOSE(`withoutDeleted<${db.nameAndSize}> deleted:`, untracked(() => [...deleted]))\n\tVERBOSE.isDisabled || autorun(() => {\n\t\tVERBOSE(`withoutDeleted<${stream.nameAndSizeUntracked}> deleted:`, [...deleted])\n\t})\n\n\treturn rollingFilter(stream, { '!en': deleted }, { name: `withoutDeleted`, extraFilterName: 'withoutDeleted' })\n}, { equals: applogStreamComparer })\n\n// export const filterStatic = computedFnDeepCompare(function filterStatic(\n// stream: ApplogStream,\n// pattern: DatalogQueryPattern,\n// opts: { name?: string } = {},\n// ) {\n// VERBOSE(`filterStatic<${stream.nameAndSizeUntracked}>:`, pattern)\n// if (!Object.entries(pattern).length) throw new Error(`Pattern is empty`)\n// //TODO: deprecaate in favor of rollingFilter ?\n// return new ApplogStream(stream, stream.applogs.filter(applog => {\n// for (const [field, patternValue] of Object.entries(pattern)) {\n// const applogValue = applog[field.startsWith('!') ? field.slice(1) : field]\n// if (!matchPartStatic(field, patternValue, applogValue))\n// return false\n// }\n// return true\n// }), `${stream.name} | ${opts.name || `filterStatic{${stringify(pattern)}}`}`)\n// }, { equals: applogStreamComparer })\n\nexport const query = computedFnDeepCompare(function query(\n\tstream: ApplogStream,\n\tpatternOrPatterns: DatalogQueryPattern | DatalogQueryPattern[],\n\tstartVariables: SearchContext = {},\n\topts: { debug?: boolean } = {},\n) {\n\tDEBUG(`query<${stream.nameAndSizeUntracked}>:`, patternOrPatterns)\n\tconst patterns = (Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns]) as DatalogQueryPattern[]\n\n\tlet nodes: QueryNodes | null\n\tif (patterns.length === 1) {\n\t\tnodes = null // new QueryNodes([/* new QueryNode(stream, startVariables) */])\n\t} else {\n\t\tconst pattersExceptLast = patterns.slice(0, -1)\n\t\t// recursively call this function to have partial queries cacheable\n\t\tnodes = query(stream, pattersExceptLast, startVariables, opts)\n\t}\n\tconst lastPattern = patterns[patterns.length - 1]\n\tconst stepResult = queryStep(stream, nodes, lastPattern, opts)\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`query result:`, toJS(stepResult)))\n\treturn stepResult\n}, { equals: queryNodesComparer })\n\nexport const queryStep = computedFnDeepCompare(function queryStep(\n\tstream: ApplogStream,\n\tnodeSet: QueryNodes | null,\n\tpattern: DatalogQueryPattern,\n\t// variables: SearchContext = {},\n\topts: { debug?: boolean } = {},\n) {\n\tDEBUG(`queryStep<${stream.nameAndSizeUntracked}> with`, nodeSet?.untrackedSize ?? 'all', 'nodes, pattern:', pattern)\n\tif (!Object.entries(pattern).length) throw new Error(`Pattern is empty`)\n\n\tconst observableResultNodes = observableArrayMap(\n\t\t() => {\n\t\t\tfunction doQuery(node: QueryNode | null) {\n\t\t\t\tconst [patternWithResolvedVars, variablesToFill] = resolveOrRemoveVariables(pattern, node?.variables ?? {})\n\t\t\t\tVERBOSE(`[queryStep] patternWithoutVars: `, patternWithResolvedVars)\n\t\t\t\tconst applogsMatchingStatic = rollingFilter(stream, patternWithResolvedVars)\n\t\t\t\tconst varMapper = mapTo(variablesToFill)\n\t\t\t\tconst newVarsAndTheirLog = applogsMatchingStatic.map(log => ({ log, vars: varMapper(log) }))\n\t\t\t\tVERBOSE.isDisabled ||\n\t\t\t\t\tVERBOSE(\n\t\t\t\t\t\t`[queryStep] step node:`,\n\t\t\t\t\t\tnode?.variables,\n\t\t\t\t\t\t' =>',\n\t\t\t\t\t\tnewVarsAndTheirLog,\n\t\t\t\t\t\t'from:',\n\t\t\t\t\t\tuntracked(() => applogsMatchingStatic.applogs),\n\t\t\t\t\t)\n\t\t\t\tconst resultNodes = newVarsAndTheirLog.map(({ log, vars }) => {\n\t\t\t\t\tconst nodeVars = Object.assign({}, node?.variables, vars)\n\t\t\t\t\treturn new QueryNode(\n\t\t\t\t\t\tnew ApplogStreamInMemory(\n\t\t\t\t\t\t\t[log],\n\t\t\t\t\t\t\tstream.filters,\n\t\t\t\t\t\t\tcreateDebugName({\n\t\t\t\t\t\t\t\tcaller: 'QueryNode',\n\t\t\t\t\t\t\t\tstream: applogsMatchingStatic,\n\t\t\t\t\t\t\t\tpattern: `${stringify(nodeVars)}@${stringify(patternWithResolvedVars)}`,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tapplogsMatchingStatic,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tnodeVars,\n\t\t\t\t\t\tnode,\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t\tif (opts.debug) {\n\t\t\t\t\tLOG(\n\t\t\t\t\t\t`[queryStep] step result:`,\n\t\t\t\t\t\tuntracked(() =>\n\t\t\t\t\t\t\tresultNodes.map(({ variables, logsOfThisNode: stream }) => ({\n\t\t\t\t\t\t\t\tvariables,\n\t\t\t\t\t\t\t\tstream: /* util.inspect( */ stream.applogs, /* , { showHidden: false, depth: null }) */\n\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn resultNodes\n\t\t\t}\n\t\t\tif (nodeSet) {\n\t\t\t\treturn nodeSet.nodes.flatMap(doQuery)\n\t\t\t} else {\n\t\t\t\treturn doQuery(null) // initial query step\n\t\t\t}\n\t\t},\n\t\t{ name: createDebugName({ caller: 'queryStep', stream, pattern }) },\n\t)\n\n\tVERBOSE(`queryStep result:`, observableResultNodes)\n\treturn new QueryNodes(observableResultNodes)\n}, { equals: queryNodesComparer })\n\nexport const queryNot = computedFnDeepCompare(function queryNot( // TODO: update old-style query\n\tstream: ApplogStream,\n\tstartNodes: QueryNodes,\n\tpatternOrPatterns: DatalogQueryPattern | DatalogQueryPattern[],\n\topts: { debug?: boolean } = {},\n) {\n\tlet nodes = startNodes.nodes\n\tDEBUG(`queryNot<${stream.nameAndSizeUntracked}> from: ${nodes.length} nodes`)\n\tconst patterns = (Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns]) as DatalogQueryPattern[]\n\n\tfor (const pattern of patterns) {\n\t\tif (!Object.entries(patternOrPatterns).length) throw new Error(`Pattern is empty`)\n\t\tnodes = nodes.filter(({ /* applogs, */ variables }) => {\n\t\t\tconst [patternWithResolvedVars, _variablesToFill] = resolveOrRemoveVariables(pattern, variables ?? {})\n\t\t\tVERBOSE(`[queryNot] patternWithoutVars: `, patternWithResolvedVars)\n\t\t\tconst newApplogs = rollingFilter(stream, patternWithResolvedVars)\n\t\t\tVERBOSE(`[queryNot] step node:`, variables, ' =>', newApplogs.size, 'applogs')\n\t\t\tVERBOSE.isDisabled || VERBOSE(`[queryNot] step node:`, variables, ' => empty?', untracked(() => newApplogs.applogs))\n\n\t\t\tif (opts.debug) LOG(`[queryNot] node result:`, variables, '=>', newApplogs.applogs)\n\t\t\treturn newApplogs.isEmpty\n\t\t})\n\t}\n\treturn new QueryNodes(nodes)\n}, { equals: queryNodesComparer })\n\n// export function or(queries: QueryExecutor[]) {\n// return tagged(\n// `or{${stringify(queries)} } `,\n// function orExecutor(args: QueryExecutorArguments) {\n// const { db, nodes: contexts } = args\n// VERBOSE('[or]', { queries, contexts })\n// let results = []\n// for (const query of queries) {\n// const res = query(args)\n// VERBOSE('[or] query', query, 'result =>', res)\n// results.push(...res.nodes)\n// }\n// return { contexts: results }\n// }\n// )\n// }\n\n// export type Tagged<T> = T & { tag: string }\n// export function tagged<T>(tag: string, thing: T): Tagged<T> {\n// const e = thing as (T & { tag: string })\n// e.tag = tag\n// return e\n// }\n\n//////////////////////\n// COMPOSED QUERIES //\n//////////////////////\n// createDebugName({ caller: 'useKidRelations' }, true)\nexport const filterAndMap = computedFnDeepCompare(function filterAndMap<R>(\n\tstream: ApplogStream,\n\tpattern: DatalogQueryPattern,\n\tmapper: (keyof Applog) | (Partial<{ [key in keyof Applog]: string }>) | ((applog: Applog) => R),\n) {\n\tDEBUG(`filterAndMap<${stream.nameAndSizeUntracked}>`, pattern)\n\n\tconst filtered = rollingFilter(stream, pattern)\n\tVERBOSE(`[filterAndMap] filtered:`, filtered.untrackedSize)\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`[filterAndMap] filtered:`, filtered.applogs))\n\n\tconst mapperFX = function filterAndMapGetterFx() {\n\t\tif (typeof mapper === 'function') {\n\t\t\treturn filtered.map(mapper)\n\t\t} else if (typeof mapper === 'string') {\n\t\t\treturn filtered.map(log => log[mapper])\n\t\t} else {\n\t\t\treturn filtered.map(mapTo(mapper))\n\t\t}\n\t}\n\tconst name = createDebugName({ stream, pattern, caller: 'filterAndMap' })\n\tconst mapped = observableArrayMap<ApplogValue | any>(mapperFX, { name }) // TODO typing:? Record<string, ApplogValue> ?\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`[filterAndMap] mapped:`, mapped))\n\treturn mapped\n}, { equals: comparer.structural })\n\nexport const queryAndMap = computedFnDeepCompare(function queryAndMap<R>(\n\tstream: ApplogStream,\n\tpatternOrPatterns: DatalogQueryPattern | DatalogQueryPattern[],\n\tmap: string | ((record: SearchContext) => R),\n\tvariables: SearchContext = {},\n) {\n\tDEBUG(`queryAndMap<${stream.nameAndSizeUntracked}>`, { patternOrPatterns, variables, map })\n\tconst debugName = createDebugName({ stream, caller: 'queryAndMap' })\n\n\tconst filtered = query(stream, patternOrPatterns)\n\tVERBOSE(`[queryAndMap] filtered count:`, filtered.untrackedSize)\n\tconst mapped = observableArrayMap<ApplogValue | any>(\n\t\t() => {\n\t\t\tif (typeof map === 'function') {\n\t\t\t\treturn filtered.records.map(map)\n\t\t\t} else if (typeof map === 'string') {\n\t\t\t\treturn filtered.records.map(log => log[map])\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"what's this map param about?\")\n\t\t\t}\n\t\t},\n\t\t{ name: debugName },\n\t)\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`[queryAndMap] result:`, toJS(mapped)))\n\treturn mapped\n}, { equals: comparer.structural })\n\nexport const queryEntity = computedFnDeepCompare(function queryEntity<R>(\n\tstream: ApplogStream,\n\tname: string,\n\tentityID: EntityID,\n\tattributes: string[],\n) {\n\tDEBUG(`queryEntity<${stream.nameAndSizeUntracked}>`, entityID, name)\n\n\tconst filtered = rollingFilter(stream, { en: entityID, at: prefixAttrs(name, attributes) })\n\tVERBOSE(`queryEntity applogs:`, filtered.applogs)\n\treturn computed(() =>\n\t\tfiltered.isEmpty ? null : Object.fromEntries(\n\t\t\tfiltered.map(({ at, vl }) => [at.slice(name.length + 1), vl]),\n\t\t)\n\t)\n}, { equals: computedStructuralComparer })\n\nexport const agentsOfStream = computedFnDeepCompare(function agentsOfStream<R>(\n\tstream: ApplogStream,\n) {\n\tLOG(`agentsOfStream<${stream.nameAndSizeUntracked}>`)\n\n\tconst mapped = observable.map<string, number>()\n\tfunction onEvent(event: ApplogStreamEvent) {\n\t\tfor (const log of (isInitEvent(event) ? event.init : event.added)) {\n\t\t\tconst prev = mapped.get(log.ag) ?? 0\n\t\t\tmapped.set(log.ag, prev + 1)\n\t\t}\n\t\tfor (const log of (!isInitEvent(event) && event.removed || [])) {\n\t\t\tconst prev = mapped.get(log.ag)\n\t\t\tif (!prev || prev < 1) throw ERROR(`[agentsOfStream] number is now negative`, { log, event, mapped, prev })\n\t\t\tmapped.set(log.ag, prev - 1)\n\t\t}\n\t\tLOG(`agentsOfStream<${stream.nameAndSizeUntracked}> processed event`, { event, mapped })\n\t}\n\tuntracked(() => onEvent({ init: stream.applogs }))\n\tstream.subscribe(onEvent)\n\tonBecomeObserved(mapped, () => stream.unsubscribe(onEvent))\n\n\treturn mapped\n})\n\nexport const entityOverlap = computedFnDeepCompare(function entityOverlapCount(\n\tstreamA: ApplogStream,\n\tstreamB: ApplogStream,\n) {\n\tLOG(`entityOverlap<${streamA.nameAndSizeUntracked}, ${streamB.nameAndSizeUntracked}>`)\n\n\treturn computed(() => {\n\t\tconst entitiesA = new Set(streamA.map(log => log.en))\n\t\tconst entitiesB = new Set(streamB.map(log => log.en))\n\t\treturn [...entitiesA].filter(en => entitiesB.has(en))\n\t})\n})\n\nexport const entityOverlapCount = computedFnDeepCompare(function entityOverlapCount(streamA: ApplogStream, streamB: ApplogStream) {\n\treturn computed(() => entityOverlap(streamA, streamB).get().length)\n})\n\n/////////////\n// HELPERS //\n/////////////\n\nexport function mapTo(applogFieldMap: Partial<{ [key in keyof Applog]: string }>) {\n\treturn applog => {\n\t\treturn Object.entries(applogFieldMap).reduce((acc, [key, value]) => {\n\t\t\tacc[value] = applog[key]\n\t\t\treturn acc\n\t\t}, {} as SearchContext)\n\t}\n}\n\nexport function startsWith(str: string) {\n\treturn (value) => value.startsWith(str)\n}\n\nexport function prefixAttrs(prefix: string, attrs: string[]) {\n\treturn attrs.map(at => prefixAt(prefix, at))\n}\nexport function prefixAt(prefix: string, attr: string) {\n\treturn `${prefix}/${attr}`\n}\n","// import type { CID } from '@oddjs/odd'\nimport { FormatRegistry, Static, TSchema, Type } from '@sinclair/typebox'\nimport { TypeCompiler } from '@sinclair/typebox/compiler'\nimport { CID } from 'multiformats/cid'\nimport { PartialBy, Tagged } from '../types/typescript-utils'\n\nexport const Nullable = <T extends TSchema>(schema: T) => Type.Union([schema, Type.Null()])\nexport const EntityID_LENGTH = 7\n// const bagu = 'baguqeerav3h4b46j2pyxikqhtm5si5vhzsyrba2duhrtltfutrlmj42anmvq'\n// const k51q = 'k51qzi5uqu5dhe1bxxjxj144bj2a225o1681yobevns26xlxtsfidjgnpwknfd'\nconst isCID = /^(k51qz|baguq)[0-9a-z]{56,57}$/\nconst isShortHash = /^[0-9A-Fa-f]{7,8}$/g // TODO awkward why are some 7 and some 8 long\n// engine level: min 6 (lenient within reason)\n// note3 TBD... either fixed for all entity types VS 7 for pub/sub, 8 for tags, 9 for blocks, 10 for relations etc...\n\nFormatRegistry.Set('EntityID', (value) => !!value.match(isShortHash) || !!value.match(isCID))\nexport const EntityID = Type.String() /*{ format: 'EntityID' }*/ // HACK how to configure ID format?\nexport type EntityID = Static<typeof EntityID>\n\nexport type DatomPart = string // TODO refactor\nexport type CidString = Tagged<string, CID>\nexport type AgentID = EntityID\nexport type Attribute = string\nexport type ApplogValue = string | boolean | Number | null // TODO: use Tagged types\n// ? allow objects? or just as serialized strings? Or serialize everything anyways?\n\nexport interface Atom {\n\ten: EntityID\n\tat: Attribute\n\tvl: ApplogValue\n}\n\nexport type AgentHash = string\nexport type Timestamp = string\nexport interface Applog extends Atom {\n\tcid: CidString\n\tpv?: CidString // | CID\n\tts: Timestamp\n\tag: AgentHash\n}\nexport type ApplogNoCid = Omit<Applog, 'cid'>\nexport type ApplogOptionalCid = PartialBy<Applog, 'cid'>\nexport type ApplogForInsert = PartialBy<ApplogNoCid, 'ts'>\nexport type ApplogForInsertOptionalAgent = PartialBy<ApplogForInsert, 'ag'>\n\nexport type AtomPattern = Atom | Applog\n\nexport interface DatalogStateIdentifier {\n\tlastTS: Timestamp\n}\n\n// New generic type for fields that can be a value, an array of that, or a function\nexport type ValueOrMatcher<T> = T | readonly T[] | ((value: T) => boolean)\n// Generic type that applies ValueOrMatcher to each field of T\nexport type WithMatchers<T extends Record<string, any>> = {\n\t[K in keyof T & string as `${K}` | `!${K}`]?: ValueOrMatcher<T[K]>\n}\n\nexport type DatalogQueryPattern = Partial<WithMatchers<Applog>>\nexport type DatalogQueryPatternArray = DatalogQueryPattern[]\nexport interface DatalogQuery<SELECT extends string> {\n\tfind: readonly SELECT[] // see: https://github.com/microsoft/TypeScript/issues/20965#issuecomment-868981458\n\twhere: DatalogQueryPatternArray\n\tonlyLatest?: boolean\n}\nexport type DatalogQueryResultEntry<SELECT extends string> = Record<\n\t// SELECT,\n\tStripPrefix<'?', SELECT>,\n\tDatomPart\n>\nexport type DatalogQueryResultRows<SELECT extends string> = DatalogQueryResultEntry<SELECT>[]\n// export type StripTest = StripPrefix<'?', '?A' | '?B'>\n// export type DatalogQueryResultEntryTEST = DatalogQueryResultEntry<'?A' | '?B'>\n// export type DatalogQueryResultEntryTESTX = MapKeysStripPrefix<'?A' | '?B', '?'>\n\nexport interface SearchContext {\n\t[key: string]: ApplogValue\n}\nexport interface SearchContextWithLog {\n\tcontext: SearchContext\n\tapplog?: Applog\n}\n\nexport type ResultContext = SearchContext | null\n\n/* https://stackoverflow.com/a/72497461 */\ntype StripPrefix<\n\tTPrefix extends string,\n\tT extends string,\n> = T extends `${TPrefix}${infer R}` ? R : never\n\ntype MapKeysStripPrefix<SELECT extends string, TPrefix extends string> = {\n\t[K in SELECT as StripPrefix<TPrefix, K>]: DatomPart\n}\n\nFormatRegistry.Set('CID', (value) => !!value.match(isCID))\nexport const CIDTB = Type.String({ format: 'EntityID' })\nexport type CIDTB = Static<typeof EntityID>\n\nconst isURL = /^http([s]?):\\/\\/.*\\..*/\nFormatRegistry.Set('URL', (value) => !!value.match(isURL))\nexport const URL = Type.String({ format: 'URL' })\nexport type URL = Static<typeof URL>\n\nexport const AppLogTB = Type.Object({\n\ten: EntityID, // EntityID\n\tat: Type.String(), // Attribute\n\tvl: Nullable(Type.Union([Type.String(), Type.Boolean(), Type.Number()])), // TODO refactor to semantic typesafe ApplogValue\n\tts: Type.String(), // Timestamp\n\tag: Type.String(), // AgentHash\n})\nexport type AppLogTB = Static<typeof AppLogTB> // type T = {\n\nexport const AppLogTBC = TypeCompiler.Compile(AppLogTB)\nexport const getApplogTypeErrors = (obj: any) => Array.from(AppLogTBC.Errors(obj))\nexport const isValidApplog = AppLogTBC.Check.bind(AppLogTBC)\n\n// maybe useful for defaulting https://github.com/sinclairzx81/typebox#cast\n"],"mappings":"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","names":["Logger","action","makeObservable","observable","Logger","untracked","withoutHistory","withoutDeleted","query","queryStep","stream","queryNot","filterAndMap","queryAndMap","queryEntity","agentsOfStream","entityOverlapCount","WARN","LOG","DEBUG","VERBOSE","ERROR","Logger","untracked","WARN","LOG","DEBUG","VERBOSE","ERROR","Logger","makeObservable","action","observable"]}
|