@voltro/runtime 0.85.0 → 0.86.0

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 (160) hide show
  1. package/CHANGELOG.md +666 -0
  2. package/THIRD-PARTY-NOTICES.md +5 -33
  3. package/dist/aggregate.js +42 -0
  4. package/dist/aggregateExtrema.js +80 -0
  5. package/dist/aggregateIvm.js +115 -0
  6. package/dist/analyticsMirror.js +228 -0
  7. package/dist/analyticsSink.js +38 -0
  8. package/dist/apiKeyUsage.js +33 -0
  9. package/dist/apiKeys.js +223 -0
  10. package/dist/apiKeysWiring.js +114 -0
  11. package/dist/approvalBuiltins.js +10 -0
  12. package/dist/approvals.js +269 -0
  13. package/dist/authMiddlewareLayer.js +47 -0
  14. package/dist/bindEvent.js +72 -0
  15. package/dist/bootListener.js +76 -0
  16. package/dist/bootRefusal.js +7 -0
  17. package/dist/bootStoreCodec.js +70 -0
  18. package/dist/businessRules.js +67 -0
  19. package/dist/changeClaimsTable.js +12 -0
  20. package/dist/circuitBreaker.js +72 -0
  21. package/dist/columnOnUpdate.js +23 -0
  22. package/dist/composeAnalytics.js +108 -0
  23. package/dist/computedQuery.js +4 -0
  24. package/dist/connectionBuiltins.js +81 -0
  25. package/dist/connectionCredentials.js +66 -0
  26. package/dist/connectionState.js +34 -0
  27. package/dist/connectionVault.js +410 -0
  28. package/dist/connectionsFacade.js +54 -0
  29. package/dist/coordinatedSchedule.js +139 -0
  30. package/dist/crdtHistory.js +138 -0
  31. package/dist/crdtMerge.js +179 -0
  32. package/dist/crdtVersionsTable.js +25 -0
  33. package/dist/credentialBound.js +12 -0
  34. package/dist/crud.js +72 -0
  35. package/dist/dataStore.js +679 -0
  36. package/dist/dataloader.js +61 -0
  37. package/dist/declaredTablesGuard.js +48 -0
  38. package/dist/defineExecutor.js +4 -0
  39. package/dist/dependencyGraph.js +32 -0
  40. package/dist/devices.js +228 -0
  41. package/dist/devicesWiring.js +168 -0
  42. package/dist/dialectReplicationAdapter.js +29 -0
  43. package/dist/dispatcher.js +447 -0
  44. package/dist/effectStore.js +71 -0
  45. package/dist/eventBus.js +260 -0
  46. package/dist/eventPublish.js +49 -0
  47. package/dist/events.js +193 -0
  48. package/dist/expectation.js +52 -0
  49. package/dist/expectationEvaluator.js +308 -0
  50. package/dist/experiment.js +96 -0
  51. package/dist/experimentEvaluator.js +245 -0
  52. package/dist/externalizedTasks.js +25 -0
  53. package/dist/fieldCipher.js +61 -0
  54. package/dist/fingerprint.js +21 -0
  55. package/dist/finops.js +42 -0
  56. package/dist/finopsAccountant.js +216 -0
  57. package/dist/handlerBody.js +8 -0
  58. package/dist/healthProbes.js +55 -0
  59. package/dist/httpClientSsrf.js +49 -0
  60. package/dist/httpClientTracing.js +11 -0
  61. package/dist/httpCompression.js +76 -0
  62. package/dist/httpKeepAlive.js +12 -0
  63. package/dist/httpRouteMounts.js +47 -0
  64. package/dist/idempotencyStore.js +70 -0
  65. package/dist/idleDetector.js +21 -0
  66. package/dist/index.d.ts +88 -69
  67. package/dist/index.js +144 -15292
  68. package/dist/insertRequiredColumns.js +19 -0
  69. package/dist/inspectWorkflow.js +1 -0
  70. package/dist/instanceMembership.js +98 -0
  71. package/dist/ivm.js +125 -0
  72. package/dist/kvDataStore.js +86 -0
  73. package/dist/kvFacade.js +32 -0
  74. package/dist/matcher.js +304 -0
  75. package/dist/memoryColumnDefaults.js +11 -0
  76. package/dist/memoryQueryJoins.js +114 -0
  77. package/dist/metrics.js +161 -0
  78. package/dist/observability.js +123 -0
  79. package/dist/observedGraph.js +52 -0
  80. package/dist/originGuard.js +116 -0
  81. package/dist/outbox.js +352 -0
  82. package/dist/pluginRefRules.js +65 -0
  83. package/dist/policyGuardResolver.js +55 -0
  84. package/dist/preview.js +62 -0
  85. package/dist/projectedRows.js +12 -0
  86. package/dist/provenance.js +63 -0
  87. package/dist/rangeIndex.js +89 -0
  88. package/dist/rawReadScope.js +17 -0
  89. package/dist/reaction.js +85 -0
  90. package/dist/reactiveConfig.js +11 -0
  91. package/dist/readClassification.js +57 -0
  92. package/dist/readRecorder.js +66 -0
  93. package/dist/rebac.js +104 -0
  94. package/dist/rebacInterceptor.js +81 -0
  95. package/dist/registry.js +29 -0
  96. package/dist/relevantFields.js +65 -0
  97. package/dist/replicaHealth.js +42 -0
  98. package/dist/replicaLocality.js +44 -0
  99. package/dist/replicaObservations.js +121 -0
  100. package/dist/replicaSelection.js +32 -0
  101. package/dist/replicatedDataStore.js +239 -0
  102. package/dist/requestLoader.js +7 -0
  103. package/dist/resumeCensus.js +28 -0
  104. package/dist/revalidation.js +22 -0
  105. package/dist/rowFilter.js +65 -0
  106. package/dist/rowStateBytes.js +45 -0
  107. package/dist/rpcBodyCap.js +63 -0
  108. package/dist/rpcConnections.js +83 -0
  109. package/dist/rpcDefectDiagnostics.js +15 -0
  110. package/dist/rpcServer.js +992 -0
  111. package/dist/runAsSystem.js +23 -0
  112. package/dist/rywPositionStore.js +84 -0
  113. package/dist/schedule.js +23 -0
  114. package/dist/scheduleBackfillRequests.js +151 -0
  115. package/dist/scheduleClaimsTable.js +11 -0
  116. package/dist/scheduleRunsTable.js +37 -0
  117. package/dist/scheduler.js +835 -0
  118. package/dist/schemaRegistry.js +65 -0
  119. package/dist/secretsResolver.js +35 -0
  120. package/dist/securityHeaders.js +33 -0
  121. package/dist/servePipeline.js +305 -0
  122. package/dist/serverOnlyAudit.js +66 -0
  123. package/dist/serverTracer.js +15 -0
  124. package/dist/serviceCredentials.js +40 -0
  125. package/dist/singleNodeOrchestrator.js +91 -0
  126. package/dist/sourceResolution.js +42 -0
  127. package/dist/storeMiddleware.js +880 -0
  128. package/dist/storeQuery.js +204 -0
  129. package/dist/storeRead.js +10 -0
  130. package/dist/subscriber.js +7 -0
  131. package/dist/subscriptionOutbox.js +139 -0
  132. package/dist/subscriptionRegistry.js +82 -0
  133. package/dist/subscriptionResume.js +132 -0
  134. package/dist/subscriptionSocketMetrics.js +65 -0
  135. package/dist/systemSubject.js +5 -0
  136. package/dist/tenantScope.js +23 -0
  137. package/dist/tenantSelection.js +27 -0
  138. package/dist/timeline.js +105 -0
  139. package/dist/traceContext.js +5 -0
  140. package/dist/traceSink.js +63 -0
  141. package/dist/traceSpansTable.js +29 -0
  142. package/dist/traceparent.js +34 -0
  143. package/dist/transactionSubject.js +12 -0
  144. package/dist/trustedProxy.js +155 -0
  145. package/dist/undo.js +129 -0
  146. package/dist/undoBuiltins.js +69 -0
  147. package/dist/undoCapture.js +74 -0
  148. package/dist/undoLogTable.js +16 -0
  149. package/dist/upsertBinding.js +20 -0
  150. package/dist/wakeOrchestrator.js +34 -0
  151. package/dist/wakeRegistry.js +71 -0
  152. package/dist/wakeRouter.js +63 -0
  153. package/dist/wakeSupervisor.js +62 -0
  154. package/dist/wakeupsTable.js +12 -0
  155. package/dist/webSocketGatewayRuntime.js +114 -0
  156. package/dist/webhookVerification.js +18 -0
  157. package/dist/wireColumnStrip.js +84 -0
  158. package/dist/workflowReadBuiltins.js +87 -0
  159. package/dist/workflowRuntime.js +708 -0
  160. package/package.json +7 -7
@@ -0,0 +1,679 @@
1
+ import { memoryQueryJoins as e } from "./memoryQueryJoins.js";
2
+ import { applyMemoryColumnDefaults as t } from "./memoryColumnDefaults.js";
3
+ import { Effect as n } from "effect";
4
+ import { applyJsonPatch as r, attachEagerLoads as i, attributionFields as a, collectSubqueries as o, compareDecimal as s, emitCommittedChanges as c, evaluatePredicate as l, externalChangeEvent as u, getTable as d, hasEagerLoads as f, isTableReactive as p, jsonPatchAssignments as m, preparePredicate as h, raiseChangeListenerCeiling as g, requireTable as _, rowKeyColumns as v, settleTransactionExit as y, stampGeneratedId as b, transactionRetrySchedule as x, upsertUpdatePatch as S, upsertUpdateValues as C } from "@voltro/database";
5
+ import { EventEmitter as w } from "node:events";
6
+ //#region src/dataStore.ts
7
+ var T = (e, t, n, r = d(n)?.fields) => t.length === 0 ? e : [...e].sort((e, n) => {
8
+ for (let i of t) {
9
+ let t = e[i.column], a = n[i.column];
10
+ if (t === a || t instanceof Date && a instanceof Date && t.getTime() === a.getTime()) continue;
11
+ if (t == null) return i.direction === "asc" ? -1 : 1;
12
+ if (a == null) return i.direction === "asc" ? 1 : -1;
13
+ let o = r?.[i.column]?.type === "decimal" ? s(t, a) ?? 0 : t < a ? -1 : 1;
14
+ if (o !== 0) return i.direction === "asc" ? o : -o;
15
+ }
16
+ return 0;
17
+ }), E = (e, t, n, r) => !e || l(e, t, n, r ? d(r)?.fields : void 0), D = (e, t) => {
18
+ let n = /* @__PURE__ */ new Map();
19
+ if (!e) return n;
20
+ for (let r of o(e)) {
21
+ let e = t.get(r.descriptor.table) ?? /* @__PURE__ */ new Map(), i = D(r.descriptor.predicate, t), a = N(r.descriptor, e, t, i);
22
+ if (r.kind === "exists") n.set(r.descriptor, a.length);
23
+ else {
24
+ let e = r.descriptor.projection, t = /* @__PURE__ */ new Set();
25
+ if (e && e.length === 1) {
26
+ let n = e[0];
27
+ for (let e of a) t.add(e[n]);
28
+ } else for (let e of a) {
29
+ let n = Object.keys(e)[0];
30
+ n !== void 0 && t.add(e[n]);
31
+ }
32
+ n.set(r.descriptor, t);
33
+ }
34
+ }
35
+ return n;
36
+ }, O = {
37
+ A: 4,
38
+ B: 2,
39
+ C: 1,
40
+ D: .5
41
+ }, k = (e) => (typeof e == "string" ? e : e == null ? "" : JSON.stringify(e)).toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? [], A = (e) => {
42
+ let t = {
43
+ children: /* @__PURE__ */ new Map(),
44
+ terms: []
45
+ };
46
+ for (let n = 0; n < e.length; n++) {
47
+ let r = t, i = e[n];
48
+ for (let e = 0; e < i.length; e++) {
49
+ let t = i[e], n = r.children.get(t);
50
+ n === void 0 && (n = {
51
+ children: /* @__PURE__ */ new Map(),
52
+ terms: []
53
+ }, r.children.set(t, n)), r = n;
54
+ }
55
+ r.terms.push(n);
56
+ }
57
+ return t;
58
+ }, j = (e, t, n) => {
59
+ let r = Array(n).fill(0);
60
+ for (let n of t) {
61
+ let t = e;
62
+ for (let e = 0; e < n.length && (t = t.children.get(n[e]), t !== void 0); e++) for (let e of t.terms) r[e] = r[e] + 1;
63
+ }
64
+ return r;
65
+ }, M = (e, t) => {
66
+ let n = k(t.query);
67
+ if (n.length === 0) return [];
68
+ let r = [], i;
69
+ for (let a of e) {
70
+ let e = 0, o = /* @__PURE__ */ new Set();
71
+ for (let r of t.columns) {
72
+ let s = k(a[r]), c = O[t.weights?.[r] ?? ""] ?? 1;
73
+ i === void 0 && n.length >= 16 && s.length >= 512 && (i = A(n));
74
+ let l = i === void 0 ? void 0 : j(i, s, n.length);
75
+ for (let t = 0; t < n.length; t++) {
76
+ let r = n[t], i = l?.[t];
77
+ if (i === void 0) {
78
+ i = 0;
79
+ for (let e of s) e.startsWith(r) && (i += 1);
80
+ }
81
+ i > 0 && (o.add(r), e += i * c);
82
+ }
83
+ }
84
+ o.size === n.length && r.push(t.rank === void 0 ? a : {
85
+ ...a,
86
+ [t.rank.alias]: e
87
+ });
88
+ }
89
+ return r;
90
+ }, N = (t, n, r = /* @__PURE__ */ new Map(), i = null) => {
91
+ let a = i ?? D(t.predicate, r), o = t.alias !== void 0 || (t.joins?.length ?? 0) > 0 || t.joinedProjection !== void 0 ? e(t, [...n.values()], r, (e) => D(e, r)) : void 0, s = t.predicate === void 0 ? void 0 : h(t.predicate, a, o?.columns ?? d(t.table)?.fields), c = o?.rows ?? [...n.values()], l = s === void 0 ? c : c.filter((e) => s(e) ?? !0);
92
+ if (t.aggregations && t.aggregations.length > 0) {
93
+ let e = P(l, t.aggregations, t.groupBy, t.table, o?.columns);
94
+ if (!t.having) return e;
95
+ let n = D(t.having, r);
96
+ return e.filter((e) => E(t.having, e, n));
97
+ }
98
+ let u = T(t.fullTextSearch === void 0 ? l : M(l, t.fullTextSearch), t.order, t.table, o?.columns), f = t.fullTextSearch?.rank, p = f?.order === !0 ? u.sort((e, t) => Number(t[f.alias] ?? 0) - Number(e[f.alias] ?? 0)) : u, m = t.skip ? p.slice(t.skip) : p, g = t.take === void 0 ? m : m.slice(0, t.take);
99
+ if (o) return g.map(o.project);
100
+ if (!t.projection) return g;
101
+ let _ = t.projection;
102
+ return g.map((e) => {
103
+ let t = {};
104
+ for (let n of _) t[n] = e[n];
105
+ return t;
106
+ });
107
+ }, P = (e, t, n, r, i = d(r)?.fields) => {
108
+ let a = /* @__PURE__ */ new Map();
109
+ for (let t of e) {
110
+ let e = {};
111
+ if (n) for (let r of n) e[r] = t[r];
112
+ let r = n ? n.map((e) => String(t[e] ?? "null")).join("\0") : "", i = a.get(r);
113
+ i || (i = {
114
+ keyVals: e,
115
+ rows: []
116
+ }, a.set(r, i)), i.rows.push(t);
117
+ }
118
+ a.size === 0 && !n && a.set("", {
119
+ keyVals: {},
120
+ rows: []
121
+ });
122
+ let o = [];
123
+ for (let e of a.values()) {
124
+ let n = { ...e.keyVals };
125
+ for (let r of t) n[r.alias] = L(r, e.rows, r.column === void 0 ? void 0 : i?.[r.column]?.type);
126
+ o.push(n);
127
+ }
128
+ return o;
129
+ }, F = /^-?\d+$/, I = (e, t) => {
130
+ let n = !1;
131
+ for (let r of e) {
132
+ let e = r[t];
133
+ if (e != null) {
134
+ if (typeof e != "string" || !F.test(e)) return !1;
135
+ n = !0;
136
+ }
137
+ }
138
+ return n;
139
+ }, L = (e, t, n) => {
140
+ if (n === void 0 && (e.op === "sum" || e.op === "avg") && e.column !== void 0 && I(t, e.column) && (n = "bigint"), n === "bigint" && (e.op === "sum" || e.op === "avg")) {
141
+ let n = 0n, r = 0;
142
+ for (let i of t) {
143
+ let t = i[e.column];
144
+ t != null && (n += BigInt(t), r++);
145
+ }
146
+ return r === 0 ? null : e.op === "sum" ? String(n) : Number(n) / r;
147
+ }
148
+ switch (e.op) {
149
+ case "column": {
150
+ let n = t[0];
151
+ return n === void 0 ? null : n[e.column] ?? null;
152
+ }
153
+ case "count": return e.column === void 0 ? t.length : t.reduce((t, n) => t + +(n[e.column] !== null && n[e.column] !== void 0), 0);
154
+ case "count-distinct": {
155
+ let n = /* @__PURE__ */ new Set();
156
+ for (let r of t) {
157
+ let t = r[e.column];
158
+ t != null && n.add(t);
159
+ }
160
+ return n.size;
161
+ }
162
+ case "sum": {
163
+ let n = 0, r = !1;
164
+ for (let i of t) {
165
+ let t = i[e.column];
166
+ typeof t == "number" && (n += t, r = !0);
167
+ }
168
+ return r ? n : null;
169
+ }
170
+ case "avg": {
171
+ let n = 0, r = 0;
172
+ for (let i of t) {
173
+ let t = i[e.column];
174
+ typeof t == "number" && (n += t, r++);
175
+ }
176
+ return r > 0 ? n / r : null;
177
+ }
178
+ case "min":
179
+ case "max": {
180
+ let r = null;
181
+ for (let i of t) {
182
+ let t = i[e.column];
183
+ if (t == null) continue;
184
+ if (r === null) {
185
+ r = t;
186
+ continue;
187
+ }
188
+ if (n === "decimal" || n === "bigint") {
189
+ let n = s(t, r);
190
+ n !== null && (e.op === "min" && n < 0 || e.op === "max" && n > 0) && (r = t);
191
+ continue;
192
+ }
193
+ let a = t instanceof Date ? t.getTime() : t, o = r instanceof Date ? r.getTime() : r, c = e.op === "min";
194
+ (c && a < o || !c && a > o) && (r = t);
195
+ }
196
+ return r;
197
+ }
198
+ default: throw Error(`computeAggregates: unknown op '${e.op}'`);
199
+ }
200
+ }, R = (e, t) => {
201
+ let n = /* @__PURE__ */ new Set();
202
+ for (let e of t.values()) for (let t of Object.keys(e)) n.add(t);
203
+ return {
204
+ table: e,
205
+ columns: [...n],
206
+ rowCount: t.size
207
+ };
208
+ }, z = "\0", B = (e, t) => e === null ? t : `${e}${z}${t}`, V = class extends Error {
209
+ constructor() {
210
+ super("InMemoryDataStore.transactional: concurrent table change; transaction attempt was discarded."), this.name = "MemoryTransactionConflict";
211
+ }
212
+ }, H = (e, t) => {
213
+ if (typeof t == "string" || typeof t == "number") return e.has(String(t)) ? String(t) : void 0;
214
+ let n = v(t);
215
+ for (let [t, r] of e) if (n.every(([e, t]) => r[e] === t)) return t;
216
+ }, U = /* @__PURE__ */ new WeakSet(), W = class e {
217
+ #e;
218
+ #t;
219
+ #n;
220
+ #r(e, t = !0) {
221
+ t && this.#l(this.#c(e.table)), p(e.table) && this.#n.emit("change", {
222
+ ...a(),
223
+ ...e
224
+ });
225
+ }
226
+ #i(e, t = !1) {
227
+ if (t) for (let t of e) this.#l(this.#c(t.table));
228
+ let n = e.filter((e) => p(e.table)).map((e) => ({
229
+ ...a(),
230
+ ...e
231
+ }));
232
+ c(n, (e) => this.#n.emit("change", e));
233
+ }
234
+ #a;
235
+ #o;
236
+ static #s(t, n) {
237
+ let r = new e(void 0, n);
238
+ return r.#e = t.tables, r.#t = t.revisions, r.#n = t.emitter, r.#a = t.numericCounters, r;
239
+ }
240
+ constructor(e, t = null) {
241
+ if (this.#o = t, this.#e = /* @__PURE__ */ new Map(), this.#t = /* @__PURE__ */ new Map(), this.#n = new w(), g(this.#n), this.#a = /* @__PURE__ */ new Map(), e) for (let [n, r] of Object.entries(e)) {
242
+ let e = /* @__PURE__ */ new Map(), i = 0n;
243
+ for (let [t, n] of r.entries()) {
244
+ let r = n.id, a = r == null ? `__voltro_seed_${t}` : String(r);
245
+ if (e.set(a, n), r != null) try {
246
+ let e = BigInt(r);
247
+ e > i && (i = e);
248
+ } catch {}
249
+ }
250
+ let a = B(t, n);
251
+ this.#e.set(a, e), i > 0n && this.#a.set(a, i);
252
+ }
253
+ }
254
+ withNamespace(t) {
255
+ return t === this.#o ? this : e.#s({
256
+ tables: this.#e,
257
+ revisions: this.#t,
258
+ emitter: this.#n,
259
+ numericCounters: this.#a
260
+ }, t);
261
+ }
262
+ #c(e) {
263
+ return B(this.#o, e);
264
+ }
265
+ #l(e) {
266
+ this.#t.set(e, (this.#t.get(e) ?? 0n) + 1n);
267
+ }
268
+ #u(e = this.#e) {
269
+ let t = /* @__PURE__ */ new Map(), n = this.#o === null ? null : `${this.#o}${z}`;
270
+ for (let [r, i] of e) n === null ? r.includes(z) || t.set(r, i) : r.startsWith(n) && t.set(r.slice(n.length), i);
271
+ return t;
272
+ }
273
+ #d(e) {
274
+ let t = this.#c(e), n = this.#e.get(t);
275
+ return n || (n = /* @__PURE__ */ new Map(), this.#e.set(t, n)), U.has(n) && (n = new Map(n), this.#e.set(t, n)), n;
276
+ }
277
+ storedTables() {
278
+ return [...this.#u()].map(([e, t]) => R(e, t));
279
+ }
280
+ async query(e) {
281
+ let t = N(e, this.#e.get(this.#c(e.table)) ?? /* @__PURE__ */ new Map(), this.#u());
282
+ return f(e) ? i(t, e.eager, _(e.table), (e) => this.query(e)) : t;
283
+ }
284
+ async insert(e, n) {
285
+ n = t(e, b(e, n));
286
+ let r = d(e), i = (r?.fields)?.id?.idScheme, a = n;
287
+ if (a.id === void 0 && (r === void 0 || i !== void 0)) {
288
+ let t = this.#f(e);
289
+ a = {
290
+ ...n,
291
+ id: t
292
+ };
293
+ }
294
+ let o = a.id === void 0 ? `__voltro_row_${this.#f(e)}` : String(a.id);
295
+ return this.#d(e).set(o, a), this.#r({
296
+ table: e,
297
+ op: "insert",
298
+ old: null,
299
+ new: a
300
+ }), a;
301
+ }
302
+ async insertMany(e, t) {
303
+ let n = [];
304
+ for (let r of t) n.push(await this.insert(e, r));
305
+ return n;
306
+ }
307
+ async patchJson(e, t, n, i, a) {
308
+ let o = m(t, n, a), s = this.#e.get(this.#c(e));
309
+ if (!s) return null;
310
+ let c = H(s, t), l = c === void 0 ? void 0 : s.get(c);
311
+ if (!l || c === void 0) return null;
312
+ let u = {
313
+ ...r(l, n, i),
314
+ ...o
315
+ };
316
+ return this.#d(e).set(c, u), this.#r({
317
+ table: e,
318
+ op: "update",
319
+ old: l,
320
+ new: u
321
+ }), u;
322
+ }
323
+ #f(e) {
324
+ let t = this.#c(e), n = (this.#a.get(t) ?? 0n) + 1n;
325
+ if (n > BigInt(2 ** 53 - 1)) throw RangeError("Numeric id must be a safe integer; use a string id scheme for larger identities");
326
+ return this.#a.set(t, n), Number(n);
327
+ }
328
+ async update(e, t, n) {
329
+ let r = this.#e.get(this.#c(e));
330
+ if (!r) return null;
331
+ let i = H(r, t), a = i === void 0 ? void 0 : r.get(i);
332
+ if (!a || i === void 0) return null;
333
+ let o = {
334
+ ...a,
335
+ ...n
336
+ };
337
+ return this.#d(e).set(i, o), this.#r({
338
+ table: e,
339
+ op: "update",
340
+ old: a,
341
+ new: o
342
+ }), o;
343
+ }
344
+ async delete(e, t) {
345
+ let n = this.#e.get(this.#c(e));
346
+ if (!n) return !1;
347
+ let r = H(n, t), i = r === void 0 ? void 0 : n.get(r);
348
+ return !i || r === void 0 ? !1 : (this.#d(e).delete(r), this.#r({
349
+ table: e,
350
+ op: "delete",
351
+ old: i,
352
+ new: null
353
+ }), !0);
354
+ }
355
+ async updateMany(e, t, n) {
356
+ let r = this.#e.get(this.#c(e));
357
+ if (!r) return 0;
358
+ let i = D(n.where, this.#u()), a = h(n.where, i, d(e)?.fields), o = 0, s = [];
359
+ for (let [n, i] of r) {
360
+ if (!a(i)) continue;
361
+ let r = {
362
+ ...i,
363
+ ...t
364
+ };
365
+ this.#d(e).set(n, r), s.push({
366
+ table: e,
367
+ op: "update",
368
+ old: i,
369
+ new: r
370
+ }), o++;
371
+ }
372
+ return this.#i(s, !0), o;
373
+ }
374
+ async deleteMany(e, t) {
375
+ let n = this.#e.get(this.#c(e));
376
+ if (!n) return 0;
377
+ let r = D(t.where, this.#u()), i = h(t.where, r, d(e)?.fields), a = [];
378
+ for (let [e, t] of n) i(t) && a.push([e, t]);
379
+ for (let [t, n] of a) this.#d(e).delete(t);
380
+ return this.#i(a.map(([, t]) => ({
381
+ table: e,
382
+ op: "delete",
383
+ old: t,
384
+ new: null
385
+ })), !0), a.length;
386
+ }
387
+ async upsert(e, t, n) {
388
+ C(n);
389
+ let r = this.#p(e, t, n.conflictColumns);
390
+ if (r) {
391
+ let i = S(t, r, n), a = Object.fromEntries(n.conflictColumns.map((e) => [e, r[e]]));
392
+ return await this.update(e, a, i) ?? r;
393
+ }
394
+ return this.insert(e, t);
395
+ }
396
+ async insertIgnore(e, t, n) {
397
+ return (await this.insertIgnoreWithOutcome(e, t, n)).row;
398
+ }
399
+ async insertIgnoreWithOutcome(e, t, n) {
400
+ let r = this.#p(e, t, n.conflictColumns);
401
+ return r ? {
402
+ row: r,
403
+ outcome: "ignored"
404
+ } : {
405
+ row: await this.insert(e, t),
406
+ outcome: "inserted"
407
+ };
408
+ }
409
+ #p(e, t, n) {
410
+ let r = this.#e.get(this.#c(e));
411
+ if (r && n.length !== 0) outer: for (let e of r.values()) {
412
+ for (let r of n) if (e[r] !== t[r]) continue outer;
413
+ return e;
414
+ }
415
+ }
416
+ async transactional(e) {
417
+ let t = n.tryPromise({
418
+ try: async () => {
419
+ let t = new G(this.#m());
420
+ try {
421
+ let n = await e(t);
422
+ return t.commit(), n;
423
+ } catch (e) {
424
+ throw t.discard(), e;
425
+ }
426
+ },
427
+ catch: (e) => e
428
+ });
429
+ return y(await n.runPromiseExit(t.pipe(n.retry(x((e) => e instanceof V)))));
430
+ }
431
+ onChange(e) {
432
+ return this.#n.on("change", e), () => {
433
+ this.#n.off("change", e);
434
+ };
435
+ }
436
+ injectExternalChange(e) {
437
+ this.#r(u(e), !1);
438
+ }
439
+ #m() {
440
+ let e = new Map(this.#e);
441
+ for (let t of e.values()) U.add(t);
442
+ let t = new Map(this.#t), n = /* @__PURE__ */ new Set();
443
+ return {
444
+ readTable: (t) => {
445
+ let r = this.#c(t);
446
+ return n.add(r), e.get(r);
447
+ },
448
+ listTables: () => [...this.#u(e).keys()],
449
+ commitOverlay: (e, r) => {
450
+ let i = /* @__PURE__ */ new Set();
451
+ for (let t of e.keys()) i.add(this.#c(t));
452
+ for (let e of r.keys()) i.add(this.#c(e));
453
+ let a = new Set(n);
454
+ for (let e of i) a.add(e);
455
+ for (let e of a) if ((t.get(e) ?? 0n) !== (this.#t.get(e) ?? 0n)) throw new V();
456
+ for (let [e, t] of r) {
457
+ if (!this.#e.get(this.#c(e))) continue;
458
+ let n = this.#d(e);
459
+ for (let e of t) n.delete(e);
460
+ }
461
+ for (let [t, n] of e) {
462
+ let e = this.#d(t);
463
+ for (let [t, r] of n) e.set(t, r);
464
+ }
465
+ for (let e of i) this.#l(e);
466
+ },
467
+ emit: (e) => this.#i(e),
468
+ allocateNumericId: (e) => this.#f(e)
469
+ };
470
+ }
471
+ }, G = class {
472
+ parent;
473
+ overlay = /* @__PURE__ */ new Map();
474
+ tombstones = /* @__PURE__ */ new Map();
475
+ events = [];
476
+ settled = !1;
477
+ constructor(e) {
478
+ this.parent = e;
479
+ }
480
+ assertActive() {
481
+ if (this.settled) throw Error("InMemoryDataStore.transactional: transaction view is settled.");
482
+ }
483
+ async savepoint(e) {
484
+ this.assertActive();
485
+ let t = /* @__PURE__ */ new Map();
486
+ this.overlay.forEach((e, n) => {
487
+ t.set(n, new Map(e));
488
+ });
489
+ let n = /* @__PURE__ */ new Map();
490
+ this.tombstones.forEach((e, t) => {
491
+ n.set(t, new Set(e));
492
+ });
493
+ let r = this.events.length;
494
+ try {
495
+ return await e();
496
+ } catch (e) {
497
+ this.overlay.clear();
498
+ for (let [e, n] of t) this.overlay.set(e, n);
499
+ this.tombstones.clear();
500
+ for (let [e, t] of n) this.tombstones.set(e, t);
501
+ throw this.events.length = r, e;
502
+ }
503
+ }
504
+ materialise(e) {
505
+ this.assertActive();
506
+ let t = /* @__PURE__ */ new Map(), n = this.parent.readTable(e), r = this.tombstones.get(e);
507
+ if (n) for (let [e, i] of n) r?.has(e) || t.set(e, i);
508
+ let i = this.overlay.get(e);
509
+ if (i) for (let [e, n] of i) t.set(e, n);
510
+ return t;
511
+ }
512
+ buildTablesView(e) {
513
+ let t = /* @__PURE__ */ new Set([e.table]), n = (e) => {
514
+ t.add(e.table);
515
+ for (let r of e.joins ?? []) {
516
+ t.add(r.table);
517
+ for (let e of o(r.on)) n(e.descriptor);
518
+ }
519
+ if (e.predicate) for (let t of o(e.predicate)) n(t.descriptor);
520
+ };
521
+ n(e);
522
+ let r = /* @__PURE__ */ new Map();
523
+ for (let e of t) r.set(e, this.materialise(e));
524
+ return r;
525
+ }
526
+ storedTables() {
527
+ return [.../* @__PURE__ */ new Set([...this.parent.listTables(), ...this.overlay.keys()])].map((e) => R(e, this.materialise(e)));
528
+ }
529
+ getOrCreateOverlay(e) {
530
+ this.assertActive();
531
+ let t = this.overlay.get(e);
532
+ return t || (t = /* @__PURE__ */ new Map(), this.overlay.set(e, t)), t;
533
+ }
534
+ async query(e) {
535
+ let t = this.buildTablesView(e), n = N(e, this.materialise(e.table), t);
536
+ return f(e) ? i(n, e.eager, _(e.table), (e) => this.query(e)) : n;
537
+ }
538
+ async insert(e, n) {
539
+ n = t(e, b(e, n));
540
+ let r = d(e), i = (r?.fields)?.id?.idScheme, a = n;
541
+ a.id === void 0 && (r === void 0 || i !== void 0) && (a = {
542
+ ...n,
543
+ id: this.parent.allocateNumericId(e)
544
+ });
545
+ let o = a.id === void 0 ? `__voltro_row_${this.parent.allocateNumericId(e)}` : String(a.id);
546
+ return this.getOrCreateOverlay(e).set(o, a), this.tombstones.get(e)?.delete(o), this.events.push({
547
+ table: e,
548
+ op: "insert",
549
+ old: null,
550
+ new: a
551
+ }), a;
552
+ }
553
+ async insertMany(e, t) {
554
+ let n = [];
555
+ for (let r of t) n.push(await this.insert(e, r));
556
+ return n;
557
+ }
558
+ async update(e, t, n) {
559
+ let r = this.materialise(e), i = H(r, t), a = i === void 0 ? void 0 : r.get(i);
560
+ if (!a || i === void 0) return null;
561
+ let o = {
562
+ ...a,
563
+ ...n
564
+ };
565
+ return this.getOrCreateOverlay(e).set(i, o), this.events.push({
566
+ table: e,
567
+ op: "update",
568
+ old: a,
569
+ new: o
570
+ }), o;
571
+ }
572
+ async patchJson(e, t, n, i, a) {
573
+ let o = m(t, n, a), s = this.materialise(e), c = H(s, t), l = c === void 0 ? void 0 : s.get(c);
574
+ if (!l || c === void 0) return null;
575
+ let u = {
576
+ ...r(l, n, i),
577
+ ...o
578
+ };
579
+ return this.getOrCreateOverlay(e).set(c, u), this.events.push({
580
+ table: e,
581
+ op: "update",
582
+ old: l,
583
+ new: u
584
+ }), u;
585
+ }
586
+ async delete(e, t) {
587
+ let n = this.materialise(e), r = H(n, t), i = r === void 0 ? void 0 : n.get(r);
588
+ if (!i || r === void 0) return !1;
589
+ this.overlay.get(e)?.delete(r);
590
+ let a = this.tombstones.get(e);
591
+ return a || (a = /* @__PURE__ */ new Set(), this.tombstones.set(e, a)), a.add(r), this.events.push({
592
+ table: e,
593
+ op: "delete",
594
+ old: i,
595
+ new: null
596
+ }), !0;
597
+ }
598
+ async updateMany(e, t, n) {
599
+ let r = this.materialise(e), i = D(n.where, this.buildTablesViewForPred(n.where)), a = h(n.where, i, d(e)?.fields), o = 0;
600
+ for (let [n, i] of r) {
601
+ if (!a(i)) continue;
602
+ let r = {
603
+ ...i,
604
+ ...t
605
+ };
606
+ this.getOrCreateOverlay(e).set(n, r), this.events.push({
607
+ table: e,
608
+ op: "update",
609
+ old: i,
610
+ new: r
611
+ }), o++;
612
+ }
613
+ return o;
614
+ }
615
+ async deleteMany(e, t) {
616
+ let n = this.materialise(e), r = D(t.where, this.buildTablesViewForPred(t.where)), i = h(t.where, r, d(e)?.fields), a = 0, o = this.tombstones.get(e);
617
+ for (let [t, r] of n) i(r) && (this.overlay.get(e)?.delete(t), o || (o = /* @__PURE__ */ new Set(), this.tombstones.set(e, o)), o.add(t), this.events.push({
618
+ table: e,
619
+ op: "delete",
620
+ old: r,
621
+ new: null
622
+ }), a++);
623
+ return a;
624
+ }
625
+ buildTablesViewForPred(e) {
626
+ let t = /* @__PURE__ */ new Set();
627
+ for (let n of o(e)) t.add(n.descriptor.table);
628
+ let n = /* @__PURE__ */ new Map();
629
+ for (let e of t) n.set(e, this.materialise(e));
630
+ return n;
631
+ }
632
+ async upsert(e, t, n) {
633
+ C(n);
634
+ let r = this.findByConflictColumns(e, t, n.conflictColumns);
635
+ if (r) {
636
+ let i = S(t, r, n), a = Object.fromEntries(n.conflictColumns.map((e) => [e, r[e]]));
637
+ return await this.update(e, a, i) ?? r;
638
+ }
639
+ return this.insert(e, t);
640
+ }
641
+ async insertIgnore(e, t, n) {
642
+ return (await this.insertIgnoreWithOutcome(e, t, n)).row;
643
+ }
644
+ async insertIgnoreWithOutcome(e, t, n) {
645
+ let r = this.findByConflictColumns(e, t, n.conflictColumns);
646
+ return r ? {
647
+ row: r,
648
+ outcome: "ignored"
649
+ } : {
650
+ row: await this.insert(e, t),
651
+ outcome: "inserted"
652
+ };
653
+ }
654
+ findByConflictColumns(e, t, n) {
655
+ if (n.length === 0) return;
656
+ let r = this.materialise(e);
657
+ outer: for (let e of r.values()) {
658
+ for (let r of n) if (e[r] !== t[r]) continue outer;
659
+ return e;
660
+ }
661
+ }
662
+ transactional(e) {
663
+ return Promise.reject(/* @__PURE__ */ Error("InMemoryDataStore.transactional: nested transactions are not supported. Mutations should execute a single top-level transaction."));
664
+ }
665
+ onChange(e) {
666
+ throw Error("InMemoryTransactionalView.onChange: subscribing from inside a transaction is not supported. Subscribe on the parent store outside `transactional()`.");
667
+ }
668
+ injectExternalChange(e) {
669
+ throw Error("InMemoryTransactionalView.injectExternalChange: injecting external changes from inside a transaction is not supported. Inject on the parent store outside `transactional()`.");
670
+ }
671
+ commit() {
672
+ this.settled || (this.parent.commitOverlay(this.overlay, this.tombstones), this.settled = !0, this.parent.emit(this.events));
673
+ }
674
+ discard() {
675
+ this.settled || (this.settled = !0, this.overlay.clear(), this.tombstones.clear(), this.events.length = 0);
676
+ }
677
+ };
678
+ //#endregion
679
+ export { W as InMemoryDataStore };