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