@voltro/runtime 0.3.0 → 0.5.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.
- package/CHANGELOG.md +50 -0
- package/dist/index.d.ts +329 -19
- package/dist/index.js +1204 -927
- package/package.json +6 -6
package/dist/index.js
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { ENCRYPTED_PREFIX as e, and as t, attachEagerLoads as n, boolean as r, clearRetentions as i, collectSubqueries as a, contains as o, decryptFieldsOnRead as s, deserializeArraysOnRead as c, encryptFieldsForWrite as l, eq as u, evaluatePredicate as d, generateId as f, getRelations as p, getTable as m, gt as h, gte as g, hasEagerLoads as _, id as v, inSet as y, integer as b,
|
|
2
|
-
import { createCipheriv as
|
|
3
|
-
import { EventEmitter as
|
|
4
|
-
import { ADMIN_SCOPE as
|
|
5
|
-
import { createLogger as
|
|
6
|
-
import { Cause as k, Clock as
|
|
7
|
-
import * as
|
|
8
|
-
import { createServer as
|
|
9
|
-
import { HttpClient as
|
|
10
|
-
import { NodeContext as
|
|
11
|
-
import { Rpc as
|
|
12
|
-
import { defineRestRoute as
|
|
13
|
-
import { AsyncLocalStorage as
|
|
14
|
-
import { SpanKind as
|
|
15
|
-
import { Kv as
|
|
16
|
-
import { apiKeyStrategy as
|
|
17
|
-
import { getCurrentWorkflowExecutionId as
|
|
18
|
-
import { ArrayFormatter as
|
|
19
|
-
import { spawn as
|
|
1
|
+
import { ENCRYPTED_PREFIX as e, and as t, attachEagerLoads as n, boolean as r, clearRetentions as i, collectSubqueries as a, contains as o, decryptFieldsOnRead as s, deserializeArraysOnRead as c, encryptFieldsForWrite as l, eq as u, evaluatePredicate as d, generateId as f, getRelations as p, getTable as m, gt as h, gte as g, hasEagerLoads as _, id as v, inSet as y, integer as b, isEncrypted as x, isNull as S, json as C, listRetentions as ee, lt as te, lte as ne, neq as w, or as re, queryFor as ie, registerRetention as ae, requireTable as oe, retentionTtlMsFromEnv as se, serializeArraysForWrite as ce, sweepRetention as le, table as T, text as E, timestamp as D, walkLeaves as ue } from "@voltro/database";
|
|
2
|
+
import { createCipheriv as de, createDecipheriv as fe, createHash as pe, randomBytes as me, randomUUID as he, scryptSync as ge } from "node:crypto";
|
|
3
|
+
import { EventEmitter as _e } from "node:events";
|
|
4
|
+
import { ADMIN_SCOPE as ve, ConnectionInfo as ye, SubjectService as be, UndoConflict as xe, UndoForbidden as Se, UndoNotFound as Ce, WorkflowRunHandleSchema as we, checkGuardsEffect as Te, diffRows as Ee, effectiveScopes as De, hasEffectiveScope as Oe, isIdKeyed as ke, publishServerError as Ae, requireScope as je, setPolicyGuardResolver as Me, systemSubject as Ne, tsMs as Pe } from "@voltro/protocol";
|
|
5
|
+
import { createLogger as O } from "@voltro/logger";
|
|
6
|
+
import { Cause as k, Clock as Fe, Context as Ie, Cron as A, Deferred as Le, Duration as Re, Effect as j, Either as ze, Exit as Be, Layer as M, ManagedRuntime as Ve, Metric as N, MetricBoundaries as He, MetricState as Ue, Option as P, Ref as F, Schema as I, Stream as L, Tracer as We } from "effect";
|
|
7
|
+
import * as Ge from "node:http";
|
|
8
|
+
import { createServer as Ke } from "node:http";
|
|
9
|
+
import { HttpClient as qe, HttpClientRequest as Je, HttpLayerRouter as R, HttpServer as Ye, HttpServerRequest as z, HttpServerResponse as B } from "@effect/platform";
|
|
10
|
+
import { NodeContext as Xe, NodeHttpServer as Ze, NodeRuntime as Qe } from "@effect/platform-node";
|
|
11
|
+
import { Rpc as $e, RpcSerialization as et, RpcServer as tt } from "@effect/rpc";
|
|
12
|
+
import { defineRestRoute as nt, dispatchSharedPath as rt, requireScope as it } from "@voltro/protocol/rest";
|
|
13
|
+
import { AsyncLocalStorage as at } from "node:async_hooks";
|
|
14
|
+
import { SpanKind as ot, SpanStatusCode as st } from "@opentelemetry/api";
|
|
15
|
+
import { Kv as ct, KvError as lt, KvStore as ut, layerConnections as dt, layerMemory as ft, layerRedis as pt } from "@voltro/kv";
|
|
16
|
+
import { apiKeyStrategy as mt } from "@voltro/protocol/apikey";
|
|
17
|
+
import { getCurrentWorkflowExecutionId as ht, inspectWorkflow as gt } from "@voltro/workflow";
|
|
18
|
+
import { ArrayFormatter as _t } from "effect/ParseResult";
|
|
19
|
+
import { spawn as vt } from "node:child_process";
|
|
20
20
|
//#region src/matcher.ts
|
|
21
|
-
var
|
|
21
|
+
var yt = class {
|
|
22
22
|
byTable = /* @__PURE__ */ new Map();
|
|
23
23
|
register(e) {
|
|
24
24
|
let t = this.byTable.get(e.table);
|
|
@@ -59,9 +59,9 @@ var _t = class {
|
|
|
59
59
|
});
|
|
60
60
|
return { perTable: e };
|
|
61
61
|
}
|
|
62
|
-
},
|
|
62
|
+
}, bt = (e) => {
|
|
63
63
|
let t = [];
|
|
64
|
-
for (let n of
|
|
64
|
+
for (let n of ue(e)) n.conjunctive && n.path === void 0 && (n.op === "eq" && t.push({
|
|
65
65
|
column: n.column,
|
|
66
66
|
values: [n.value]
|
|
67
67
|
}), n.op === "in" && t.push({
|
|
@@ -69,18 +69,18 @@ var _t = class {
|
|
|
69
69
|
values: n.value
|
|
70
70
|
}));
|
|
71
71
|
return t;
|
|
72
|
-
},
|
|
72
|
+
}, xt = (e) => {
|
|
73
73
|
let t = [];
|
|
74
|
-
for (let n of
|
|
74
|
+
for (let n of ue(e)) n.conjunctive && n.path === void 0 && (n.op === "gt" || n.op === "gte" || n.op === "lt" || n.op === "lte") && t.push({
|
|
75
75
|
column: n.column,
|
|
76
76
|
op: n.op,
|
|
77
77
|
threshold: n.value
|
|
78
78
|
});
|
|
79
79
|
return t;
|
|
80
|
-
},
|
|
81
|
-
for (let n of
|
|
80
|
+
}, St = (e, t) => {
|
|
81
|
+
for (let n of ue(e)) if (n.conjunctive && n.path === void 0 && n.op === "eq" && n.column === t) return n.value;
|
|
82
82
|
return null;
|
|
83
|
-
},
|
|
83
|
+
}, Ct = (e, t) => {
|
|
84
84
|
let n = [];
|
|
85
85
|
for (let r of e) {
|
|
86
86
|
let e = t(r);
|
|
@@ -88,8 +88,8 @@ var _t = class {
|
|
|
88
88
|
n.push(`${typeof e}:${String(e)}`);
|
|
89
89
|
}
|
|
90
90
|
return n.join("|");
|
|
91
|
-
},
|
|
92
|
-
let r =
|
|
91
|
+
}, wt = (e, t) => e === null || t === null ? null : e === t ? 0 : typeof e == typeof t ? e > t ? 1 : -1 : null, Tt = (e, t, n) => {
|
|
92
|
+
let r = wt(e, n);
|
|
93
93
|
if (r === null) return !1;
|
|
94
94
|
switch (t) {
|
|
95
95
|
case "gt": return r > 0;
|
|
@@ -97,7 +97,7 @@ var _t = class {
|
|
|
97
97
|
case "lt": return r < 0;
|
|
98
98
|
case "lte": return r <= 0;
|
|
99
99
|
}
|
|
100
|
-
},
|
|
100
|
+
}, Et = class {
|
|
101
101
|
columnByTable = /* @__PURE__ */ new Map();
|
|
102
102
|
rangeByTable = /* @__PURE__ */ new Map();
|
|
103
103
|
tupleByTable = /* @__PURE__ */ new Map();
|
|
@@ -105,9 +105,9 @@ var _t = class {
|
|
|
105
105
|
subscriptions = /* @__PURE__ */ new Map();
|
|
106
106
|
register(e) {
|
|
107
107
|
this.columnByTable.has(e.table) || this.columnByTable.set(e.table, /* @__PURE__ */ new Map()), this.rangeByTable.has(e.table) || this.rangeByTable.set(e.table, /* @__PURE__ */ new Map()), this.tupleByTable.has(e.table) || this.tupleByTable.set(e.table, /* @__PURE__ */ new Map()), this.unindexedByTable.has(e.table) || this.unindexedByTable.set(e.table, /* @__PURE__ */ new Set());
|
|
108
|
-
let t =
|
|
108
|
+
let t = bt(e.predicate), n = xt(e.predicate);
|
|
109
109
|
if (e.usingIndex !== void 0) {
|
|
110
|
-
let r = e.usingIndex, i =
|
|
110
|
+
let r = e.usingIndex, i = Ct(r.fields, (t) => St(e.predicate, t));
|
|
111
111
|
if (i !== null) {
|
|
112
112
|
let a = `${r.name}|${i}`, o = this.tupleByTable.get(e.table), s = o.get(a);
|
|
113
113
|
s || (s = /* @__PURE__ */ new Set(), o.set(a, s)), s.add(e.id), this.subscriptions.set(e.id, {
|
|
@@ -252,7 +252,7 @@ var _t = class {
|
|
|
252
252
|
}
|
|
253
253
|
}
|
|
254
254
|
for (let [e, a] of i) {
|
|
255
|
-
let i =
|
|
255
|
+
let i = Ct(a, (e) => t[e]);
|
|
256
256
|
if (i === null) continue;
|
|
257
257
|
let o = r.get(`${e}|${i}`);
|
|
258
258
|
if (o) for (let e of o) n.add(e);
|
|
@@ -266,7 +266,7 @@ var _t = class {
|
|
|
266
266
|
let a = this.rangeByTable.get(e);
|
|
267
267
|
if (a) for (let [e, r] of a) {
|
|
268
268
|
let i = t[e];
|
|
269
|
-
if (i !== null) for (let [e, t] of r) for (let r of t)
|
|
269
|
+
if (i !== null) for (let [e, t] of r) for (let r of t) Tt(i, e, r.threshold) && n.add(r.subId);
|
|
270
270
|
}
|
|
271
271
|
return n;
|
|
272
272
|
}
|
|
@@ -275,7 +275,7 @@ var _t = class {
|
|
|
275
275
|
let e = t[n.column];
|
|
276
276
|
if (n.kind === "eq") {
|
|
277
277
|
if (e !== n.value) return !1;
|
|
278
|
-
} else if (!
|
|
278
|
+
} else if (!Tt(e, n.op, n.threshold)) return !1;
|
|
279
279
|
}
|
|
280
280
|
return !0;
|
|
281
281
|
}
|
|
@@ -297,23 +297,23 @@ var _t = class {
|
|
|
297
297
|
}
|
|
298
298
|
return i;
|
|
299
299
|
}
|
|
300
|
-
},
|
|
300
|
+
}, Dt = (e) => {
|
|
301
301
|
if (e == null) return null;
|
|
302
|
-
if (Array.isArray(e)) return e.map(
|
|
302
|
+
if (Array.isArray(e)) return e.map(Dt);
|
|
303
303
|
if (typeof e == "object") {
|
|
304
304
|
let t = e, n = Object.keys(t).sort(), r = {};
|
|
305
|
-
for (let e of n) r[e] =
|
|
305
|
+
for (let e of n) r[e] = Dt(t[e]);
|
|
306
306
|
return r;
|
|
307
307
|
}
|
|
308
308
|
return e;
|
|
309
|
-
},
|
|
310
|
-
let r =
|
|
309
|
+
}, Ot = (e, t, n) => {
|
|
310
|
+
let r = Dt({
|
|
311
311
|
table: e,
|
|
312
312
|
predicate: t,
|
|
313
313
|
indexHint: n ?? null
|
|
314
314
|
});
|
|
315
|
-
return
|
|
316
|
-
},
|
|
315
|
+
return pe("sha256").update(JSON.stringify(r)).digest("hex").slice(0, 16);
|
|
316
|
+
}, kt = class {
|
|
317
317
|
matcher;
|
|
318
318
|
byFingerprint = /* @__PURE__ */ new Map();
|
|
319
319
|
byClient = /* @__PURE__ */ new Map();
|
|
@@ -332,7 +332,7 @@ var _t = class {
|
|
|
332
332
|
} catch {}
|
|
333
333
|
}
|
|
334
334
|
subscribe(e, t, n, r) {
|
|
335
|
-
let i =
|
|
335
|
+
let i = Ot(t, n, r?.name), a = this.byFingerprint.get(i);
|
|
336
336
|
return a ? (a.subscribers.add(e), this.byClient.set(e, i), this.notifyChange(), {
|
|
337
337
|
fingerprint: i,
|
|
338
338
|
deduplicated: !0
|
|
@@ -390,7 +390,7 @@ var _t = class {
|
|
|
390
390
|
});
|
|
391
391
|
return e;
|
|
392
392
|
}
|
|
393
|
-
},
|
|
393
|
+
}, At = (e, t) => t.length === 0 ? e : [...e].sort((e, n) => {
|
|
394
394
|
for (let r of t) {
|
|
395
395
|
let t = e[r.column], i = n[r.column];
|
|
396
396
|
if (t === i) continue;
|
|
@@ -400,7 +400,7 @@ var _t = class {
|
|
|
400
400
|
return r.direction === "asc" ? a : -a;
|
|
401
401
|
}
|
|
402
402
|
return 0;
|
|
403
|
-
}),
|
|
403
|
+
}), jt = (e, t, n) => {
|
|
404
404
|
let r = t.split("."), i = r[0], a = r.slice(1), o = (e) => typeof e == "object" && !!e && !Array.isArray(e), s = e[i], c;
|
|
405
405
|
if (a.length === 0) c = o(s) && o(n) ? {
|
|
406
406
|
...s,
|
|
@@ -418,11 +418,11 @@ var _t = class {
|
|
|
418
418
|
...e,
|
|
419
419
|
[i]: c
|
|
420
420
|
};
|
|
421
|
-
},
|
|
421
|
+
}, Mt = (e, t, n) => !e || d(e, t, n), V = (e, t) => {
|
|
422
422
|
let n = /* @__PURE__ */ new Map();
|
|
423
423
|
if (!e) return n;
|
|
424
424
|
for (let r of a(e)) {
|
|
425
|
-
let e = t.get(r.descriptor.table) ?? /* @__PURE__ */ new Map(), i = V(r.descriptor.predicate, t), a =
|
|
425
|
+
let e = t.get(r.descriptor.table) ?? /* @__PURE__ */ new Map(), i = V(r.descriptor.predicate, t), a = Nt(r.descriptor, e, t, i);
|
|
426
426
|
if (r.kind === "exists") n.set(r.descriptor, a.length);
|
|
427
427
|
else {
|
|
428
428
|
let e = r.descriptor.projection, t = /* @__PURE__ */ new Set();
|
|
@@ -437,15 +437,15 @@ var _t = class {
|
|
|
437
437
|
}
|
|
438
438
|
}
|
|
439
439
|
return n;
|
|
440
|
-
},
|
|
441
|
-
let i = r ?? V(e.predicate, n), a = [...t.values()].filter((t) =>
|
|
440
|
+
}, Nt = (e, t, n = /* @__PURE__ */ new Map(), r = null) => {
|
|
441
|
+
let i = r ?? V(e.predicate, n), a = [...t.values()].filter((t) => Mt(e.predicate, t, i));
|
|
442
442
|
if (e.aggregations && e.aggregations.length > 0) {
|
|
443
|
-
let t =
|
|
443
|
+
let t = Pt(a, e.aggregations, e.groupBy);
|
|
444
444
|
if (!e.having) return t;
|
|
445
445
|
let r = V(e.having, n);
|
|
446
|
-
return t.filter((t) =>
|
|
446
|
+
return t.filter((t) => Mt(e.having, t, r));
|
|
447
447
|
}
|
|
448
|
-
let o =
|
|
448
|
+
let o = At(a, e.order), s = e.skip ? o.slice(e.skip) : o, c = e.take === void 0 ? s : s.slice(0, e.take);
|
|
449
449
|
if (!e.projection) return c;
|
|
450
450
|
let l = e.projection;
|
|
451
451
|
return c.map((e) => {
|
|
@@ -453,7 +453,7 @@ var _t = class {
|
|
|
453
453
|
for (let n of l) t[n] = e[n];
|
|
454
454
|
return t;
|
|
455
455
|
});
|
|
456
|
-
},
|
|
456
|
+
}, Pt = (e, t, n) => {
|
|
457
457
|
let r = /* @__PURE__ */ new Map();
|
|
458
458
|
for (let t of e) {
|
|
459
459
|
let e = {};
|
|
@@ -471,11 +471,11 @@ var _t = class {
|
|
|
471
471
|
let i = [];
|
|
472
472
|
for (let e of r.values()) {
|
|
473
473
|
let n = { ...e.keyVals };
|
|
474
|
-
for (let r of t) n[r.alias] =
|
|
474
|
+
for (let r of t) n[r.alias] = Ft(r, e.rows);
|
|
475
475
|
i.push(n);
|
|
476
476
|
}
|
|
477
477
|
return i;
|
|
478
|
-
},
|
|
478
|
+
}, Ft = (e, t) => {
|
|
479
479
|
switch (e.op) {
|
|
480
480
|
case "count": return e.column === void 0 ? t.length : t.reduce((t, n) => t + +(n[e.column] !== null && n[e.column] !== void 0), 0);
|
|
481
481
|
case "count-distinct": {
|
|
@@ -519,7 +519,7 @@ var _t = class {
|
|
|
519
519
|
}
|
|
520
520
|
default: throw Error(`computeAggregates: unknown op '${e.op}'`);
|
|
521
521
|
}
|
|
522
|
-
},
|
|
522
|
+
}, It = "\0", Lt = (e, t) => e === null ? t : `${e}${It}${t}`, Rt = class e {
|
|
523
523
|
#e;
|
|
524
524
|
#t;
|
|
525
525
|
#n;
|
|
@@ -529,13 +529,13 @@ var _t = class {
|
|
|
529
529
|
return r.#e = t.tables, r.#t = t.emitter, r.#n = t.numericCounters, r;
|
|
530
530
|
}
|
|
531
531
|
constructor(e, t = null) {
|
|
532
|
-
if (this.#r = t, this.#e = /* @__PURE__ */ new Map(), this.#t = new
|
|
532
|
+
if (this.#r = t, this.#e = /* @__PURE__ */ new Map(), this.#t = new _e(), this.#n = /* @__PURE__ */ new Map(), e) for (let [n, r] of Object.entries(e)) {
|
|
533
533
|
let e = /* @__PURE__ */ new Map();
|
|
534
534
|
for (let t of r) {
|
|
535
535
|
let n = t.id;
|
|
536
536
|
n && e.set(n, t);
|
|
537
537
|
}
|
|
538
|
-
this.#e.set(
|
|
538
|
+
this.#e.set(Lt(t, n), e);
|
|
539
539
|
}
|
|
540
540
|
}
|
|
541
541
|
withNamespace(t) {
|
|
@@ -546,11 +546,11 @@ var _t = class {
|
|
|
546
546
|
}, t);
|
|
547
547
|
}
|
|
548
548
|
#a(e) {
|
|
549
|
-
return
|
|
549
|
+
return Lt(this.#r, e);
|
|
550
550
|
}
|
|
551
551
|
#o() {
|
|
552
|
-
let e = /* @__PURE__ */ new Map(), t = this.#r === null ? null : `${this.#r}${
|
|
553
|
-
for (let [n, r] of this.#e) t === null ? n.includes(
|
|
552
|
+
let e = /* @__PURE__ */ new Map(), t = this.#r === null ? null : `${this.#r}${It}`;
|
|
553
|
+
for (let [n, r] of this.#e) t === null ? n.includes(It) || e.set(n, r) : n.startsWith(t) && e.set(n.slice(t.length), r);
|
|
554
554
|
return e;
|
|
555
555
|
}
|
|
556
556
|
#s(e) {
|
|
@@ -558,8 +558,8 @@ var _t = class {
|
|
|
558
558
|
return n || (n = /* @__PURE__ */ new Map(), this.#e.set(t, n)), n;
|
|
559
559
|
}
|
|
560
560
|
async query(e) {
|
|
561
|
-
let t =
|
|
562
|
-
return _(e) ? n(t, e.eager,
|
|
561
|
+
let t = Nt(e, this.#e.get(this.#a(e.table)) ?? /* @__PURE__ */ new Map(), this.#o());
|
|
562
|
+
return _(e) ? n(t, e.eager, oe(e.table), (e) => this.query(e)) : t;
|
|
563
563
|
}
|
|
564
564
|
async insert(e, t) {
|
|
565
565
|
let n = t;
|
|
@@ -588,7 +588,7 @@ var _t = class {
|
|
|
588
588
|
if (!i) return null;
|
|
589
589
|
let a = i.get(t);
|
|
590
590
|
if (!a) return null;
|
|
591
|
-
let o =
|
|
591
|
+
let o = jt(a, n, r);
|
|
592
592
|
return i.set(t, o), this.#t.emit("change", {
|
|
593
593
|
table: e,
|
|
594
594
|
op: "update",
|
|
@@ -688,7 +688,7 @@ var _t = class {
|
|
|
688
688
|
}
|
|
689
689
|
}
|
|
690
690
|
async transactional(e) {
|
|
691
|
-
let t = new
|
|
691
|
+
let t = new zt(this.#u());
|
|
692
692
|
try {
|
|
693
693
|
let n = await e(t);
|
|
694
694
|
return t.commit(), n;
|
|
@@ -724,7 +724,7 @@ var _t = class {
|
|
|
724
724
|
allocateNumericId: (e) => this.#c(e)
|
|
725
725
|
};
|
|
726
726
|
}
|
|
727
|
-
},
|
|
727
|
+
}, zt = class {
|
|
728
728
|
parent;
|
|
729
729
|
overlay = /* @__PURE__ */ new Map();
|
|
730
730
|
tombstones = /* @__PURE__ */ new Map();
|
|
@@ -754,8 +754,8 @@ var _t = class {
|
|
|
754
754
|
return t || (t = /* @__PURE__ */ new Map(), this.overlay.set(e, t)), t;
|
|
755
755
|
}
|
|
756
756
|
async query(e) {
|
|
757
|
-
let t = this.buildTablesView(e), r =
|
|
758
|
-
return _(e) ? n(r, e.eager,
|
|
757
|
+
let t = this.buildTablesView(e), r = Nt(e, this.materialise(e.table), t);
|
|
758
|
+
return _(e) ? n(r, e.eager, oe(e.table), (e) => this.query(e)) : r;
|
|
759
759
|
}
|
|
760
760
|
async insert(e, t) {
|
|
761
761
|
let n = t;
|
|
@@ -793,7 +793,7 @@ var _t = class {
|
|
|
793
793
|
async patchJson(e, t, n, r) {
|
|
794
794
|
let i = this.materialise(e).get(t);
|
|
795
795
|
if (!i) return null;
|
|
796
|
-
let a =
|
|
796
|
+
let a = jt(i, n, r);
|
|
797
797
|
return this.getOrCreateOverlay(e).set(t, a), this.events.push({
|
|
798
798
|
table: e,
|
|
799
799
|
op: "update",
|
|
@@ -894,7 +894,7 @@ var _t = class {
|
|
|
894
894
|
discard() {
|
|
895
895
|
this.settled || (this.settled = !0, this.overlay.clear(), this.tombstones.clear(), this.events.length = 0);
|
|
896
896
|
}
|
|
897
|
-
},
|
|
897
|
+
}, Bt = (e) => {
|
|
898
898
|
let t = {}, n = [], r = e;
|
|
899
899
|
for (let e = 0; e < 8 && typeof r == "object" && r; e++) {
|
|
900
900
|
let e = r;
|
|
@@ -905,23 +905,23 @@ var _t = class {
|
|
|
905
905
|
(o || s) && n.push(`${o || "Error"}${s ? `: ${s.slice(0, 200)}` : ""}`), r = e.cause;
|
|
906
906
|
}
|
|
907
907
|
return n.length > 0 && (t.dbCauseChain = n.join(" ← "), t.dbMessage === void 0 && (t.dbMessage = n[n.length - 1])), t;
|
|
908
|
-
},
|
|
908
|
+
}, Vt = (e) => {
|
|
909
909
|
let t = e.dbCode;
|
|
910
910
|
return t === "23503" || e.dbErrno === 1452 || t === 547 || t === "SQLITE_CONSTRAINT_FOREIGNKEY";
|
|
911
|
-
},
|
|
912
|
-
has: (t) =>
|
|
913
|
-
hasAny: (t) => t.some((t) =>
|
|
914
|
-
require: (t) =>
|
|
911
|
+
}, Ht = (e) => ({
|
|
912
|
+
has: (t) => Oe(e, t),
|
|
913
|
+
hasAny: (t) => t.some((t) => Oe(e, t)),
|
|
914
|
+
require: (t) => je(e, t),
|
|
915
915
|
get scopes() {
|
|
916
|
-
return
|
|
916
|
+
return De(e);
|
|
917
917
|
}
|
|
918
|
-
}),
|
|
918
|
+
}), Ut = (e) => {
|
|
919
919
|
let t = /* @__PURE__ */ new Set();
|
|
920
|
-
return
|
|
921
|
-
},
|
|
922
|
-
if (t.add(e.table), e.eager !== void 0 &&
|
|
923
|
-
if (e.ctes !== void 0) for (let n of e.ctes)
|
|
924
|
-
},
|
|
920
|
+
return Wt(e, t), t;
|
|
921
|
+
}, Wt = (e, t) => {
|
|
922
|
+
if (t.add(e.table), e.eager !== void 0 && Gt(e.table, e.eager, t), e.setOp !== void 0) for (let n of e.setOp.queries) Wt(n, t);
|
|
923
|
+
if (e.ctes !== void 0) for (let n of e.ctes) Wt(n.descriptor, t);
|
|
924
|
+
}, Gt = (e, t, n) => {
|
|
925
925
|
let r = p(e);
|
|
926
926
|
if (r !== void 0) for (let [e, i] of Object.entries(t)) {
|
|
927
927
|
let t = r[e];
|
|
@@ -929,24 +929,24 @@ var _t = class {
|
|
|
929
929
|
let a = i === !0 ? {} : i;
|
|
930
930
|
if (t.kind === "manyToMany") {
|
|
931
931
|
let e = t.through().tableName, r = t.target().tableName;
|
|
932
|
-
n.add(e), n.add(r), a.with !== void 0 &&
|
|
932
|
+
n.add(e), n.add(r), a.with !== void 0 && Gt(r, a.with, n);
|
|
933
933
|
} else {
|
|
934
934
|
let e = t.target().tableName;
|
|
935
|
-
n.add(e), a.with !== void 0 &&
|
|
935
|
+
n.add(e), a.with !== void 0 && Gt(e, a.with, n);
|
|
936
936
|
}
|
|
937
937
|
}
|
|
938
|
-
},
|
|
938
|
+
}, Kt = (e) => e.setOp !== void 0 || e.ctes !== void 0 && e.ctes.length > 0 || e.aggregations !== void 0 && e.aggregations.some((e) => e.op.startsWith("window-")), qt = /* @__PURE__ */ new Set(["*"]), Jt = (e, t) => {
|
|
939
939
|
if (e !== void 0) {
|
|
940
940
|
if ("not" in e) {
|
|
941
|
-
|
|
941
|
+
Jt(e.not, t);
|
|
942
942
|
return;
|
|
943
943
|
}
|
|
944
944
|
if ("and" in e) {
|
|
945
|
-
for (let n of e.and)
|
|
945
|
+
for (let n of e.and) Jt(n, t);
|
|
946
946
|
return;
|
|
947
947
|
}
|
|
948
948
|
if ("or" in e) {
|
|
949
|
-
for (let n of e.or)
|
|
949
|
+
for (let n of e.or) Jt(n, t);
|
|
950
950
|
return;
|
|
951
951
|
}
|
|
952
952
|
if (e.op === "subquery-in" || e.op === "subquery-not-in") {
|
|
@@ -955,11 +955,11 @@ var _t = class {
|
|
|
955
955
|
}
|
|
956
956
|
e.op === "exists" || e.op === "not-exists" || t.add(e.column);
|
|
957
957
|
}
|
|
958
|
-
},
|
|
958
|
+
}, H = (e, t, n) => {
|
|
959
959
|
let r = e.get(t);
|
|
960
960
|
r === void 0 && (r = /* @__PURE__ */ new Set(), e.set(t, r));
|
|
961
961
|
for (let e of n) r.add(e);
|
|
962
|
-
},
|
|
962
|
+
}, Yt = (e, t, n) => {
|
|
963
963
|
let r = p(e);
|
|
964
964
|
if (r !== void 0) for (let [i, a] of Object.entries(t)) {
|
|
965
965
|
let t = r[i];
|
|
@@ -967,65 +967,65 @@ var _t = class {
|
|
|
967
967
|
let o = a === !0 ? {} : a;
|
|
968
968
|
if (t.kind === "manyToMany") {
|
|
969
969
|
let r = t.through(), i = t.target();
|
|
970
|
-
|
|
970
|
+
H(n, r.tableName, [t.sourceKey, t.targetKey]), H(n, e, ["id"]), H(n, i.tableName, ["id"]), Xt(i.tableName, o, n), o.with !== void 0 && Yt(i.tableName, o.with, n);
|
|
971
971
|
continue;
|
|
972
972
|
}
|
|
973
973
|
let s = t.target();
|
|
974
|
-
t.foreignKey !== void 0 &&
|
|
974
|
+
t.foreignKey !== void 0 && H(n, s.tableName, [t.foreignKey]), t.sourceKey === void 0 ? H(n, e, ["id"]) : H(n, e, [t.sourceKey]), H(n, s.tableName, ["id"]), Xt(s.tableName, o, n), o.with !== void 0 && Yt(s.tableName, o.with, n);
|
|
975
975
|
}
|
|
976
|
-
},
|
|
976
|
+
}, Xt = (e, t, n) => {
|
|
977
977
|
if (t.where !== void 0) {
|
|
978
978
|
let r = /* @__PURE__ */ new Set();
|
|
979
|
-
|
|
979
|
+
Jt(t.where, r), H(n, e, r);
|
|
980
980
|
}
|
|
981
|
-
t.orderBy !== void 0 &&
|
|
981
|
+
t.orderBy !== void 0 && H(n, e, t.orderBy.map((e) => e.column));
|
|
982
982
|
let r = m(e);
|
|
983
|
-
r === void 0 ?
|
|
984
|
-
},
|
|
983
|
+
r === void 0 ? H(n, e, ["*"]) : H(n, e, Object.keys(r.fields));
|
|
984
|
+
}, Zt = (e) => {
|
|
985
985
|
let t = /* @__PURE__ */ new Map();
|
|
986
|
-
if (
|
|
987
|
-
for (let n of
|
|
986
|
+
if (Kt(e)) {
|
|
987
|
+
for (let n of Ut(e)) H(t, n, ["*"]);
|
|
988
988
|
return t;
|
|
989
989
|
}
|
|
990
990
|
let n = /* @__PURE__ */ new Set();
|
|
991
991
|
if (e.projection !== void 0) for (let t of e.projection) n.add(t);
|
|
992
992
|
else n.add("*");
|
|
993
|
-
|
|
993
|
+
Jt(e.predicate, n);
|
|
994
994
|
for (let t of e.order) n.add(t.column);
|
|
995
|
-
return
|
|
996
|
-
},
|
|
997
|
-
if (e.op === "insert" || e.op === "delete" || e.old === null || e.new === null) return
|
|
995
|
+
return H(t, e.table, n), e.eager !== void 0 && Yt(e.table, e.eager, t), t;
|
|
996
|
+
}, Qt = (e) => {
|
|
997
|
+
if (e.op === "insert" || e.op === "delete" || e.old === null || e.new === null) return qt;
|
|
998
998
|
let t = /* @__PURE__ */ new Set(), n = e.old, r = e.new, i = /* @__PURE__ */ new Set([...Object.keys(n), ...Object.keys(r)]);
|
|
999
999
|
for (let e of i) Object.is(n[e], r[e]) || t.add(e);
|
|
1000
1000
|
return t;
|
|
1001
|
-
},
|
|
1001
|
+
}, $t = (e, t) => {
|
|
1002
1002
|
let n = t.get(e.table);
|
|
1003
1003
|
if (n === void 0) return !1;
|
|
1004
1004
|
if (n.has("*")) return !0;
|
|
1005
|
-
let r =
|
|
1005
|
+
let r = Qt(e);
|
|
1006
1006
|
if (r.has("*")) return !0;
|
|
1007
1007
|
for (let e of r) if (n.has(e)) return !0;
|
|
1008
1008
|
return !1;
|
|
1009
|
-
},
|
|
1009
|
+
}, en = He.exponential({
|
|
1010
1010
|
start: .001,
|
|
1011
1011
|
factor: 2,
|
|
1012
1012
|
count: 16
|
|
1013
|
-
}),
|
|
1014
|
-
let t = e.durationMs / 1e3, n = e.kind === "rpc" ? j.zipRight(N.increment(
|
|
1013
|
+
}), tn = N.counter("voltro_rpc_requests_total", { description: "Total RPC handler invocations." }), nn = N.counter("voltro_rpc_errors_total", { description: "RPC handler invocations that errored." }), rn = N.histogram("voltro_rpc_duration_seconds", en, "RPC handler duration in seconds."), an = N.counter("voltro_http_requests_total", { description: "Total HTTP route invocations." }), on = N.histogram("voltro_http_duration_seconds", en, "HTTP route duration in seconds."), sn = N.histogram("voltro_plugin_hook_duration_seconds", en, "Plugin interceptor duration in seconds."), cn = N.counter("voltro_plugin_hook_errors_total", { description: "Plugin interceptor invocations that errored." }), ln = N.counter("voltro_subscription_deliveries_total", { description: "Total subscription deliveries (snapshot + delta)." }), un = N.histogram("voltro_subscription_delivery_seconds", en, "Subscription delivery produce→push latency in seconds."), dn = N.gauge("voltro_subscriptions_active", { description: "Currently-open subscriptions." }), fn = (e) => {
|
|
1014
|
+
let t = e.durationMs / 1e3, n = e.kind === "rpc" ? j.zipRight(N.increment(tn).pipe(j.tagMetrics("tag", e.tag), j.tagMetrics("status", e.status)), j.zipRight(N.update(rn, t).pipe(j.tagMetrics("tag", e.tag)), e.status === "error" ? N.increment(nn).pipe(j.tagMetrics("tag", e.tag)) : j.void)) : e.kind === "request" ? j.zipRight(N.increment(an).pipe(j.tagMetrics("route", e.tag), j.tagMetrics("status", e.status)), N.update(on, t).pipe(j.tagMetrics("route", e.tag))) : j.zipRight(N.update(sn, t).pipe(j.tagMetrics("hook", e.tag)), e.status === "error" ? N.increment(cn).pipe(j.tagMetrics("hook", e.tag)) : j.void);
|
|
1015
1015
|
j.runSync(n);
|
|
1016
|
-
},
|
|
1017
|
-
let t =
|
|
1018
|
-
j.runSync(j.zipRight(N.increment(
|
|
1019
|
-
},
|
|
1020
|
-
let n =
|
|
1021
|
-
r === 0 ?
|
|
1022
|
-
},
|
|
1016
|
+
}, pn = (e) => e.startsWith("subscription.") ? e.slice(13) : e, mn = (e) => {
|
|
1017
|
+
let t = pn(e.label);
|
|
1018
|
+
j.runSync(j.zipRight(N.increment(ln).pipe(j.tagMetrics("tag", t), j.tagMetrics("kind", e.kind)), N.update(un, e.durationMs / 1e3).pipe(j.tagMetrics("tag", t), j.tagMetrics("kind", e.kind))));
|
|
1019
|
+
}, hn = /* @__PURE__ */ new Map(), U = (e, t) => {
|
|
1020
|
+
let n = pn(e), r = Math.max(0, (hn.get(n) ?? 0) + t);
|
|
1021
|
+
r === 0 ? hn.delete(n) : hn.set(n, r), j.runSync(N.set(dn, r).pipe(j.tagMetrics("tag", n)));
|
|
1022
|
+
}, gn = (e, t) => N.counter(e, t === void 0 ? {} : { description: t }), _n = (e, t) => N.gauge(e, t === void 0 ? {} : { description: t }), vn = (e, t = en, n) => N.histogram(e, t, n), yn = (e) => {
|
|
1023
1023
|
let t = {};
|
|
1024
1024
|
for (let n of e) t[n.key] = n.value;
|
|
1025
1025
|
return t;
|
|
1026
|
-
},
|
|
1027
|
-
let t = e.metricKey.name, n =
|
|
1028
|
-
if (
|
|
1026
|
+
}, bn = N.snapshot.pipe(j.map((e) => e.map((e) => {
|
|
1027
|
+
let t = e.metricKey.name, n = yn(e.metricKey.tags), r = P.getOrUndefined(e.metricKey.description), i = r === void 0 ? {} : { description: r }, a = e.metricState;
|
|
1028
|
+
if (Ue.isHistogramState(a)) return {
|
|
1029
1029
|
name: t,
|
|
1030
1030
|
labels: n,
|
|
1031
1031
|
...i,
|
|
@@ -1037,14 +1037,14 @@ var _t = class {
|
|
|
1037
1037
|
sum: a.sum,
|
|
1038
1038
|
count: a.count
|
|
1039
1039
|
};
|
|
1040
|
-
if (
|
|
1040
|
+
if (Ue.isGaugeState(a)) return {
|
|
1041
1041
|
name: t,
|
|
1042
1042
|
labels: n,
|
|
1043
1043
|
...i,
|
|
1044
1044
|
type: "gauge",
|
|
1045
1045
|
value: Number(a.value)
|
|
1046
1046
|
};
|
|
1047
|
-
if (
|
|
1047
|
+
if (Ue.isSummaryState(a)) return {
|
|
1048
1048
|
name: t,
|
|
1049
1049
|
labels: n,
|
|
1050
1050
|
...i,
|
|
@@ -1056,7 +1056,7 @@ var _t = class {
|
|
|
1056
1056
|
value: t.value
|
|
1057
1057
|
}] : [])
|
|
1058
1058
|
};
|
|
1059
|
-
if (
|
|
1059
|
+
if (Ue.isFrequencyState(a)) {
|
|
1060
1060
|
let e = {};
|
|
1061
1061
|
for (let [t, n] of a.occurrences) e[t] = n;
|
|
1062
1062
|
return {
|
|
@@ -1074,7 +1074,7 @@ var _t = class {
|
|
|
1074
1074
|
type: "counter",
|
|
1075
1075
|
value: Number(a.count)
|
|
1076
1076
|
};
|
|
1077
|
-
}))),
|
|
1077
|
+
}))), xn = () => j.runSync(bn), W = O({ scope: "voltro:dispatcher" }), Sn = (e) => typeof e == "object" && !!e && e._tag === "ScopeError", Cn = class {
|
|
1078
1078
|
deps;
|
|
1079
1079
|
subscriptionRegistry;
|
|
1080
1080
|
matcher;
|
|
@@ -1084,63 +1084,95 @@ var _t = class {
|
|
|
1084
1084
|
computedSubs = /* @__PURE__ */ new Map();
|
|
1085
1085
|
computedByTable = /* @__PURE__ */ new Map();
|
|
1086
1086
|
constructor(e) {
|
|
1087
|
-
this.deps = e, this.matcher = new
|
|
1087
|
+
this.deps = e, this.matcher = new Et(), this.subscriptionRegistry = new kt(this.matcher), this.unsubscribeChange = e.store.onChange((e) => {
|
|
1088
1088
|
this.handleChange(e);
|
|
1089
1089
|
});
|
|
1090
1090
|
}
|
|
1091
|
-
async subscribe(e, t, n, r, i, a) {
|
|
1092
|
-
let
|
|
1093
|
-
e.predicate !== void 0 && this.subscriptionRegistry.subscribe(
|
|
1094
|
-
for (let e of
|
|
1091
|
+
async subscribe(e, t, n, r, i, a, o) {
|
|
1092
|
+
let s = `sub_${he()}`, c = i ?? `subscription.${e.table}`, l = Ut(e), u = Zt(e);
|
|
1093
|
+
e.predicate !== void 0 && this.subscriptionRegistry.subscribe(s, e.table, e.predicate, r);
|
|
1094
|
+
for (let e of l) {
|
|
1095
1095
|
let t = this.dependentByTable.get(e);
|
|
1096
|
-
t === void 0 && (t = /* @__PURE__ */ new Set(), this.dependentByTable.set(e, t)), t.add(
|
|
1096
|
+
t === void 0 && (t = /* @__PURE__ */ new Set(), this.dependentByTable.set(e, t)), t.add(s);
|
|
1097
1097
|
}
|
|
1098
|
-
let
|
|
1099
|
-
this.subscriptions.set(
|
|
1100
|
-
id:
|
|
1098
|
+
let d = Date.now(), f = Array.from(l), p = this.deps.cache !== void 0 && a !== void 0 ? await this.deps.cache.wrap(a, f, () => this.deps.store.query(e)) : await this.deps.store.query(e);
|
|
1099
|
+
this.subscriptions.set(s, {
|
|
1100
|
+
id: s,
|
|
1101
1101
|
descriptor: e,
|
|
1102
1102
|
context: n,
|
|
1103
1103
|
emit: t,
|
|
1104
|
-
label:
|
|
1105
|
-
dependentTables:
|
|
1106
|
-
relevantFields:
|
|
1107
|
-
lastDelivered:
|
|
1108
|
-
cacheBinding: a
|
|
1109
|
-
|
|
1104
|
+
label: c,
|
|
1105
|
+
dependentTables: l,
|
|
1106
|
+
relevantFields: u,
|
|
1107
|
+
lastDelivered: p,
|
|
1108
|
+
cacheBinding: a,
|
|
1109
|
+
reauthorize: o
|
|
1110
|
+
}), U(c, 1), t({
|
|
1110
1111
|
_tag: "snapshot",
|
|
1111
1112
|
revision: 0,
|
|
1112
|
-
data:
|
|
1113
|
+
data: p
|
|
1113
1114
|
});
|
|
1114
|
-
let
|
|
1115
|
+
let m = Date.now();
|
|
1115
1116
|
return this.deps.recordDelivery?.({
|
|
1116
1117
|
traceId: n.traceId,
|
|
1117
1118
|
parentSpanId: n.spanId,
|
|
1118
|
-
label:
|
|
1119
|
+
label: c,
|
|
1119
1120
|
kind: "snapshot",
|
|
1120
|
-
startMs:
|
|
1121
|
-
endMs:
|
|
1122
|
-
durationMs:
|
|
1123
|
-
rowCount:
|
|
1121
|
+
startMs: d,
|
|
1122
|
+
endMs: m,
|
|
1123
|
+
durationMs: m - d,
|
|
1124
|
+
rowCount: p.length
|
|
1124
1125
|
}), () => {
|
|
1125
|
-
this.subscriptions.delete(
|
|
1126
|
-
for (let e of
|
|
1126
|
+
this.subscriptions.delete(s), U(c, -1), this.subscriptionRegistry.unsubscribe(s);
|
|
1127
|
+
for (let e of l) {
|
|
1127
1128
|
let t = this.dependentByTable.get(e);
|
|
1128
|
-
t !== void 0 && (t.delete(
|
|
1129
|
+
t !== void 0 && (t.delete(s), t.size === 0 && this.dependentByTable.delete(e));
|
|
1129
1130
|
}
|
|
1130
1131
|
};
|
|
1131
1132
|
}
|
|
1133
|
+
revokeSubscription(e, t) {
|
|
1134
|
+
this.subscriptions.delete(e.id), U(e.label, -1), this.subscriptionRegistry.unsubscribe(e.id);
|
|
1135
|
+
for (let t of e.dependentTables) {
|
|
1136
|
+
let n = this.dependentByTable.get(t);
|
|
1137
|
+
n !== void 0 && (n.delete(e.id), n.size === 0 && this.dependentByTable.delete(t));
|
|
1138
|
+
}
|
|
1139
|
+
W.warn("subscription revoked mid-stream — guards no longer satisfied", {
|
|
1140
|
+
id: e.id,
|
|
1141
|
+
label: e.label,
|
|
1142
|
+
traceId: e.context.traceId
|
|
1143
|
+
}), e.emit({
|
|
1144
|
+
_tag: "error",
|
|
1145
|
+
error: t
|
|
1146
|
+
});
|
|
1147
|
+
}
|
|
1148
|
+
revokeComputed(e, t) {
|
|
1149
|
+
this.computedSubs.delete(e.id), U(e.label, -1);
|
|
1150
|
+
for (let t of e.tables) {
|
|
1151
|
+
let n = this.computedByTable.get(t);
|
|
1152
|
+
n !== void 0 && (n.delete(e.id), n.size === 0 && this.computedByTable.delete(t));
|
|
1153
|
+
}
|
|
1154
|
+
W.warn("computed subscription revoked mid-stream — guards no longer satisfied", {
|
|
1155
|
+
id: e.id,
|
|
1156
|
+
label: e.label,
|
|
1157
|
+
traceId: e.context.traceId
|
|
1158
|
+
}), e.emit({
|
|
1159
|
+
_tag: "error",
|
|
1160
|
+
error: t
|
|
1161
|
+
});
|
|
1162
|
+
}
|
|
1132
1163
|
async subscribeComputed(e, t, n, r) {
|
|
1133
|
-
let i = `csub_${
|
|
1164
|
+
let i = `csub_${he()}`, a = e.dependentTables, o = {
|
|
1134
1165
|
id: i,
|
|
1135
1166
|
recompute: e.recompute,
|
|
1136
1167
|
tenantId: e.tenantId,
|
|
1137
1168
|
emit: t,
|
|
1138
1169
|
context: n,
|
|
1139
1170
|
label: r ?? "subscription.computed",
|
|
1140
|
-
|
|
1171
|
+
tables: a,
|
|
1172
|
+
lastJson: wn(e.value),
|
|
1141
1173
|
revision: 0
|
|
1142
1174
|
};
|
|
1143
|
-
this.computedSubs.set(i, o),
|
|
1175
|
+
this.computedSubs.set(i, o), U(o.label, 1);
|
|
1144
1176
|
for (let e of a) {
|
|
1145
1177
|
let t = this.computedByTable.get(e);
|
|
1146
1178
|
t === void 0 && (t = /* @__PURE__ */ new Set(), this.computedByTable.set(e, t)), t.add(i);
|
|
@@ -1160,7 +1192,7 @@ var _t = class {
|
|
|
1160
1192
|
durationMs: Date.now() - s,
|
|
1161
1193
|
rowCount: 1
|
|
1162
1194
|
}), () => {
|
|
1163
|
-
this.computedSubs.delete(i),
|
|
1195
|
+
this.computedSubs.delete(i), U(o.label, -1);
|
|
1164
1196
|
for (let e of a) {
|
|
1165
1197
|
let t = this.computedByTable.get(e);
|
|
1166
1198
|
t !== void 0 && (t.delete(i), t.size === 0 && this.computedByTable.delete(e));
|
|
@@ -1170,7 +1202,7 @@ var _t = class {
|
|
|
1170
1202
|
async recomputeComputed(e) {
|
|
1171
1203
|
let t = Date.now();
|
|
1172
1204
|
try {
|
|
1173
|
-
let n = await e.recompute(), r =
|
|
1205
|
+
let n = await e.recompute(), r = wn(n);
|
|
1174
1206
|
if (r === e.lastJson) return;
|
|
1175
1207
|
e.lastJson = r, e.revision += 1;
|
|
1176
1208
|
let i = Date.now();
|
|
@@ -1189,7 +1221,11 @@ var _t = class {
|
|
|
1189
1221
|
rowCount: 1
|
|
1190
1222
|
});
|
|
1191
1223
|
} catch (t) {
|
|
1192
|
-
|
|
1224
|
+
if (Sn(t)) {
|
|
1225
|
+
this.revokeComputed(e, t);
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1228
|
+
W.warn("computed recompute failed; subscriber left on last value", {
|
|
1193
1229
|
id: e.id,
|
|
1194
1230
|
label: e.label,
|
|
1195
1231
|
traceId: e.context.traceId
|
|
@@ -1224,7 +1260,7 @@ var _t = class {
|
|
|
1224
1260
|
for (let e of n) r.add(e.subscriberId);
|
|
1225
1261
|
let i = this.dependentByTable.get(e.table);
|
|
1226
1262
|
if (i !== void 0) for (let e of i) r.add(e);
|
|
1227
|
-
if (
|
|
1263
|
+
if (W.trace("handleChange", {
|
|
1228
1264
|
table: e.table,
|
|
1229
1265
|
op: e.op,
|
|
1230
1266
|
matcher: n.length,
|
|
@@ -1235,28 +1271,35 @@ var _t = class {
|
|
|
1235
1271
|
for (let t of r) {
|
|
1236
1272
|
let n = this.subscriptions.get(t);
|
|
1237
1273
|
if (!n) {
|
|
1238
|
-
|
|
1274
|
+
W.trace("missing subscription", { subscriberId: t });
|
|
1239
1275
|
continue;
|
|
1240
1276
|
}
|
|
1241
|
-
if (
|
|
1277
|
+
if (!$t(e, n.relevantFields)) {
|
|
1242
1278
|
o++;
|
|
1243
1279
|
continue;
|
|
1244
1280
|
}
|
|
1245
1281
|
let r = Date.now();
|
|
1246
1282
|
try {
|
|
1283
|
+
if (n.reauthorize !== void 0) {
|
|
1284
|
+
let e = await n.reauthorize();
|
|
1285
|
+
if (e) {
|
|
1286
|
+
this.revokeSubscription(n, e);
|
|
1287
|
+
continue;
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1247
1290
|
let i = await this.deps.store.query(n.descriptor), o = n.lastDelivered;
|
|
1248
|
-
if (
|
|
1249
|
-
|
|
1291
|
+
if (Tn(i, o)) {
|
|
1292
|
+
W.trace("suppressed no-op delta", {
|
|
1250
1293
|
subscriberId: t,
|
|
1251
1294
|
table: e.table
|
|
1252
1295
|
});
|
|
1253
1296
|
continue;
|
|
1254
1297
|
}
|
|
1255
|
-
n.lastDelivered = i, this.deps.cache !== void 0 && n.cacheBinding !== void 0 && this.deps.cache.put(n.cacheBinding, Array.from(n.dependentTables), i),
|
|
1298
|
+
n.lastDelivered = i, this.deps.cache !== void 0 && n.cacheBinding !== void 0 && this.deps.cache.put(n.cacheBinding, Array.from(n.dependentTables), i), ke(o) && ke(i) ? n.emit({
|
|
1256
1299
|
_tag: "delta",
|
|
1257
1300
|
revision: a,
|
|
1258
1301
|
emittedAt: a,
|
|
1259
|
-
patch:
|
|
1302
|
+
patch: Ee(o, i)
|
|
1260
1303
|
}) : n.emit({
|
|
1261
1304
|
_tag: "snapshot",
|
|
1262
1305
|
revision: a,
|
|
@@ -1274,7 +1317,7 @@ var _t = class {
|
|
|
1274
1317
|
rowCount: i.length
|
|
1275
1318
|
});
|
|
1276
1319
|
} catch (r) {
|
|
1277
|
-
|
|
1320
|
+
W.warn("reactive re-query failed; subscriber left on last snapshot", {
|
|
1278
1321
|
subscriberId: t,
|
|
1279
1322
|
label: n.label,
|
|
1280
1323
|
table: e.table,
|
|
@@ -1282,66 +1325,66 @@ var _t = class {
|
|
|
1282
1325
|
}, r);
|
|
1283
1326
|
}
|
|
1284
1327
|
}
|
|
1285
|
-
o > 0 &&
|
|
1328
|
+
o > 0 && W.trace("handleChange/prefiltered", {
|
|
1286
1329
|
table: e.table,
|
|
1287
1330
|
op: e.op,
|
|
1288
1331
|
skipped: o
|
|
1289
1332
|
});
|
|
1290
1333
|
}
|
|
1291
|
-
},
|
|
1334
|
+
}, wn = (e) => {
|
|
1292
1335
|
try {
|
|
1293
1336
|
return JSON.stringify(e) ?? "null";
|
|
1294
1337
|
} catch {
|
|
1295
1338
|
return String(e);
|
|
1296
1339
|
}
|
|
1297
|
-
},
|
|
1340
|
+
}, Tn = (e, t) => {
|
|
1298
1341
|
if (e === t) return !0;
|
|
1299
1342
|
if (e.length !== t.length) return !1;
|
|
1300
1343
|
for (let n = 0; n < e.length; n++) if (JSON.stringify(e[n]) !== JSON.stringify(t[n])) return !1;
|
|
1301
1344
|
return !0;
|
|
1302
|
-
},
|
|
1303
|
-
|
|
1345
|
+
}, En = (e) => typeof e == "object" && !!e && e.__voltroComputed === !0, Dn = 1440 * 60 * 1e3, On = 3600 * 1e3, G = /* @__PURE__ */ new Map(), kn = /* @__PURE__ */ new Set(), An = (e, t) => {
|
|
1346
|
+
G.set(e, {
|
|
1304
1347
|
subject: t,
|
|
1305
1348
|
touchedAt: Date.now()
|
|
1306
1349
|
});
|
|
1307
|
-
for (let n of
|
|
1350
|
+
for (let n of kn) try {
|
|
1308
1351
|
n(e, t);
|
|
1309
1352
|
} catch {}
|
|
1310
|
-
},
|
|
1311
|
-
let t =
|
|
1353
|
+
}, jn = (e) => {
|
|
1354
|
+
let t = G.get(e);
|
|
1312
1355
|
if (t) return t.touchedAt = Date.now(), t.subject;
|
|
1313
|
-
}, On = (e) => {
|
|
1314
|
-
K.delete(e);
|
|
1315
|
-
}, kn = (e) => (Tn.add(e), () => {
|
|
1316
|
-
Tn.delete(e);
|
|
1317
|
-
}), An = setInterval(() => {
|
|
1318
|
-
let e = Date.now() - Cn;
|
|
1319
|
-
for (let [t, n] of K) n.touchedAt < e && K.delete(t);
|
|
1320
|
-
}, wn);
|
|
1321
|
-
typeof An == "object" && An && "unref" in An && An.unref();
|
|
1322
|
-
var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
1323
|
-
let n = q.get(e);
|
|
1324
|
-
return n || (n = /* @__PURE__ */ new Set(), q.set(e, n)), n.add(t), () => {
|
|
1325
|
-
let n = q.get(e);
|
|
1326
|
-
n && (n.delete(t), n.size === 0 && q.delete(e));
|
|
1327
|
-
};
|
|
1328
1356
|
}, Mn = (e) => {
|
|
1329
|
-
|
|
1357
|
+
G.delete(e);
|
|
1358
|
+
}, Nn = (e) => (kn.add(e), () => {
|
|
1359
|
+
kn.delete(e);
|
|
1360
|
+
}), Pn = setInterval(() => {
|
|
1361
|
+
let e = Date.now() - Dn;
|
|
1362
|
+
for (let [t, n] of G) n.touchedAt < e && G.delete(t);
|
|
1363
|
+
}, On);
|
|
1364
|
+
typeof Pn == "object" && Pn && "unref" in Pn && Pn.unref();
|
|
1365
|
+
var K = /* @__PURE__ */ new Map(), Fn = (e, t) => {
|
|
1366
|
+
let n = K.get(e);
|
|
1367
|
+
return n || (n = /* @__PURE__ */ new Set(), K.set(e, n)), n.add(t), () => {
|
|
1368
|
+
let n = K.get(e);
|
|
1369
|
+
n && (n.delete(t), n.size === 0 && K.delete(e));
|
|
1370
|
+
};
|
|
1371
|
+
}, In = (e) => {
|
|
1372
|
+
let t = K.get(e);
|
|
1330
1373
|
if (t) {
|
|
1331
1374
|
for (let e of [...t]) try {
|
|
1332
1375
|
e();
|
|
1333
1376
|
} catch {}
|
|
1334
|
-
|
|
1377
|
+
K.delete(e);
|
|
1335
1378
|
}
|
|
1336
|
-
},
|
|
1337
|
-
|
|
1338
|
-
},
|
|
1379
|
+
}, Ln = (e) => K.get(e)?.size ?? 0, Rn = () => {
|
|
1380
|
+
G.clear(), K.clear();
|
|
1381
|
+
}, zn = () => [...G.entries()].map(([e, t]) => ({
|
|
1339
1382
|
clientId: e,
|
|
1340
1383
|
subjectType: t.subject.type,
|
|
1341
1384
|
tenantId: t.subject.tenantId
|
|
1342
|
-
})),
|
|
1385
|
+
})), Bn = /^00-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/, Vn = (e) => `00-${e.traceId}-${e.spanId}-${e.sampled ? "01" : "00"}`, Hn = (e) => {
|
|
1343
1386
|
if (typeof e != "string") return null;
|
|
1344
|
-
let t =
|
|
1387
|
+
let t = Bn.exec(e.trim().toLowerCase());
|
|
1345
1388
|
if (t === null) return null;
|
|
1346
1389
|
let [, n, r, i] = t;
|
|
1347
1390
|
return n === "0".repeat(32) || r === "0".repeat(16) ? null : {
|
|
@@ -1349,14 +1392,14 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1349
1392
|
spanId: r,
|
|
1350
1393
|
sampled: (parseInt(i, 16) & 1) == 1
|
|
1351
1394
|
};
|
|
1352
|
-
},
|
|
1353
|
-
let t =
|
|
1354
|
-
if (t !== null) return
|
|
1395
|
+
}, Un = (e) => {
|
|
1396
|
+
let t = Hn(e);
|
|
1397
|
+
if (t !== null) return We.externalSpan({
|
|
1355
1398
|
traceId: t.traceId,
|
|
1356
1399
|
spanId: t.spanId,
|
|
1357
1400
|
sampled: t.sampled
|
|
1358
1401
|
});
|
|
1359
|
-
},
|
|
1402
|
+
}, Wn = new at(), Gn = (e, t) => Wn.run(e, t), Kn = () => Wn.getStore(), qn = (e = {}) => {
|
|
1360
1403
|
let t = e.random ?? Math.random, n = /* @__PURE__ */ new Map(), r = (e) => n.get(e) ?? 0;
|
|
1361
1404
|
return {
|
|
1362
1405
|
pick(e) {
|
|
@@ -1381,7 +1424,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1381
1424
|
}));
|
|
1382
1425
|
}
|
|
1383
1426
|
};
|
|
1384
|
-
},
|
|
1427
|
+
}, Jn = (e = {}) => {
|
|
1385
1428
|
let t = e.thresholdFailures ?? 3, n = e.windowMs ?? 1e4, r = e.blackoutMs ?? 6e4, i = e.now ?? Date.now, a = /* @__PURE__ */ new Map(), o = (e) => {
|
|
1386
1429
|
let t = a.get(e);
|
|
1387
1430
|
return t === void 0 && (t = {
|
|
@@ -1415,7 +1458,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1415
1458
|
}));
|
|
1416
1459
|
}
|
|
1417
1460
|
};
|
|
1418
|
-
},
|
|
1461
|
+
}, Yn = (e = {}) => {
|
|
1419
1462
|
let t = e.now ?? Date.now, n = /* @__PURE__ */ new Map();
|
|
1420
1463
|
return {
|
|
1421
1464
|
get(e) {
|
|
@@ -1438,7 +1481,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1438
1481
|
return n.size;
|
|
1439
1482
|
}
|
|
1440
1483
|
};
|
|
1441
|
-
},
|
|
1484
|
+
}, Xn = (e, t) => e === null ? t === void 0 ? "anon:bg" : `anon:${t}` : `subject:${e}`, Zn = (e) => {
|
|
1442
1485
|
let t = e.now ?? Date.now, n = e.keyPrefix ?? "voltro:ryw", r = e.channel ?? `${n}:bus`, i = e.onError ?? ((e, t) => {
|
|
1443
1486
|
process.stderr.write(`[voltro:ryw] redis ${t} failed: ${String(e)}\n`);
|
|
1444
1487
|
}), a = `${process.pid ?? 0}:${Math.random() * 1e9 | 0}:${t()}`, o = /* @__PURE__ */ new Map(), s = (e) => {
|
|
@@ -1497,7 +1540,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1497
1540
|
return o.size;
|
|
1498
1541
|
}
|
|
1499
1542
|
};
|
|
1500
|
-
},
|
|
1543
|
+
}, Qn = O({ scope: "voltro:replication" }), $n = new at(), er = (e, t) => $n.run(e, t), tr = () => $n.getStore(), nr = class {
|
|
1501
1544
|
primary;
|
|
1502
1545
|
replicas;
|
|
1503
1546
|
adapter;
|
|
@@ -1510,10 +1553,10 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1510
1553
|
recordRouting;
|
|
1511
1554
|
now;
|
|
1512
1555
|
constructor(e) {
|
|
1513
|
-
this.primary = e.primary, this.replicas = e.replicas, this.adapter = e.replicationAdapter, this.policy = e.rywPolicy ?? "fallback", this.rywTtlMs = e.rywTtlMs ?? 3e4, this.rywMaxWaitMs = e.rywMaxWaitMs ?? 500, this.now = e.now ?? Date.now, this.rywStore = e.rywStore ??
|
|
1556
|
+
this.primary = e.primary, this.replicas = e.replicas, this.adapter = e.replicationAdapter, this.policy = e.rywPolicy ?? "fallback", this.rywTtlMs = e.rywTtlMs ?? 3e4, this.rywMaxWaitMs = e.rywMaxWaitMs ?? 500, this.now = e.now ?? Date.now, this.rywStore = e.rywStore ?? Yn({ now: this.now }), this.selector = e.replicaSelector ?? qn(), this.health = e.replicaHealth ?? Jn({ now: this.now }), e.recordRouting !== void 0 && (this.recordRouting = e.recordRouting);
|
|
1514
1557
|
}
|
|
1515
1558
|
async query(e) {
|
|
1516
|
-
let t =
|
|
1559
|
+
let t = $n.getStore(), n = t?.subjectKey ?? "anon:bg";
|
|
1517
1560
|
if (t?.forcePrimary === !0) return this.emitRouting({
|
|
1518
1561
|
target: "primary",
|
|
1519
1562
|
replicaIndex: null,
|
|
@@ -1577,7 +1620,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1577
1620
|
waitMs: 0
|
|
1578
1621
|
}), r;
|
|
1579
1622
|
} catch (r) {
|
|
1580
|
-
return this.health.reportFailure(i, String(r)),
|
|
1623
|
+
return this.health.reportFailure(i, String(r)), Qn.warn("replica query failed; falling back to primary", {
|
|
1581
1624
|
idx: a,
|
|
1582
1625
|
err: r
|
|
1583
1626
|
}), this.emitRouting({
|
|
@@ -1646,7 +1689,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1646
1689
|
fallbackReason: "wait-timeout"
|
|
1647
1690
|
}), this.primary.query(e);
|
|
1648
1691
|
}
|
|
1649
|
-
await
|
|
1692
|
+
await rr(10);
|
|
1650
1693
|
}
|
|
1651
1694
|
}
|
|
1652
1695
|
async insert(e, t) {
|
|
@@ -1686,8 +1729,8 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1686
1729
|
return await this.stampPostWrite(), r;
|
|
1687
1730
|
}
|
|
1688
1731
|
async transactional(e) {
|
|
1689
|
-
let t = await
|
|
1690
|
-
subjectKey:
|
|
1732
|
+
let t = await er({
|
|
1733
|
+
subjectKey: $n.getStore()?.subjectKey ?? "anon:bg",
|
|
1691
1734
|
forcePrimary: !0
|
|
1692
1735
|
}, () => this.primary.transactional(e));
|
|
1693
1736
|
return await this.stampPostWrite(), t;
|
|
@@ -1703,7 +1746,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1703
1746
|
}
|
|
1704
1747
|
async stampPostWrite() {
|
|
1705
1748
|
if (this.replicas.length === 0) return;
|
|
1706
|
-
let e =
|
|
1749
|
+
let e = $n.getStore()?.subjectKey ?? "anon:bg";
|
|
1707
1750
|
try {
|
|
1708
1751
|
let t = await this.adapter.capturePrimaryPosition(this.primary);
|
|
1709
1752
|
this.rywStore.set(e, {
|
|
@@ -1711,59 +1754,59 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1711
1754
|
expiresAt: this.now() + this.rywTtlMs
|
|
1712
1755
|
});
|
|
1713
1756
|
} catch (e) {
|
|
1714
|
-
|
|
1757
|
+
Qn.warn("failed to capture primary position; RYW skipped", { err: e });
|
|
1715
1758
|
}
|
|
1716
1759
|
}
|
|
1717
1760
|
emitRouting(e) {
|
|
1718
1761
|
this.recordRouting?.(e);
|
|
1719
1762
|
}
|
|
1720
|
-
},
|
|
1763
|
+
}, rr = (e) => new Promise((t) => setTimeout(t, e)), ir = (e, t, n) => ({
|
|
1721
1764
|
subject: e,
|
|
1722
|
-
traceId: t?.traceId ??
|
|
1765
|
+
traceId: t?.traceId ?? he(),
|
|
1723
1766
|
...t?.spanId === void 0 ? {} : { spanId: t.spanId },
|
|
1724
1767
|
...n === void 0 ? {} : { clientId: n }
|
|
1725
|
-
}),
|
|
1768
|
+
}), ar = j.currentSpan.pipe(j.catchAll(() => j.succeed(void 0))), or = (e) => ({
|
|
1726
1769
|
traceId: e.traceId,
|
|
1727
1770
|
...e.spanId === void 0 ? {} : { spanId: e.spanId }
|
|
1728
|
-
}),
|
|
1771
|
+
}), sr = (e, t, n) => {
|
|
1729
1772
|
e !== void 0 && (e.attribute("rpc.tag", t), e.attribute("subject.type", n.type), n.tenantId !== void 0 && n.tenantId !== null && e.attribute("tenant.id", n.tenantId));
|
|
1730
|
-
},
|
|
1731
|
-
let
|
|
1732
|
-
|
|
1733
|
-
}, n, r, i, a)).pipe(j.matchCause({
|
|
1734
|
-
onFailure: (e) => (
|
|
1773
|
+
}, cr = (e, t, n, r, i, a, o) => L.asyncScoped((s) => j.gen(function* () {
|
|
1774
|
+
let c = yield* j.tryPromise(() => t.subscribe(e, (e) => {
|
|
1775
|
+
s.single(e);
|
|
1776
|
+
}, n, r, i, a, o)).pipe(j.matchCause({
|
|
1777
|
+
onFailure: (e) => (mr(`subscription.${i}`, n.traceId, e), {
|
|
1735
1778
|
ok: !1,
|
|
1736
|
-
error:
|
|
1779
|
+
error: vr(e)
|
|
1737
1780
|
}),
|
|
1738
1781
|
onSuccess: (e) => ({
|
|
1739
1782
|
ok: !0,
|
|
1740
1783
|
unsubscribe: e
|
|
1741
1784
|
})
|
|
1742
1785
|
}));
|
|
1743
|
-
if (!
|
|
1744
|
-
|
|
1786
|
+
if (!c.ok) {
|
|
1787
|
+
s.single({
|
|
1745
1788
|
_tag: "error",
|
|
1746
|
-
error:
|
|
1747
|
-
}),
|
|
1789
|
+
error: c.error
|
|
1790
|
+
}), s.end();
|
|
1748
1791
|
return;
|
|
1749
1792
|
}
|
|
1750
|
-
let
|
|
1751
|
-
if (yield* j.addFinalizer(() => j.sync(() =>
|
|
1752
|
-
let e =
|
|
1753
|
-
|
|
1793
|
+
let l = c.unsubscribe;
|
|
1794
|
+
if (yield* j.addFinalizer(() => j.sync(() => l())), n.clientId !== void 0) {
|
|
1795
|
+
let e = Fn(n.clientId, () => {
|
|
1796
|
+
s.end();
|
|
1754
1797
|
});
|
|
1755
1798
|
yield* j.addFinalizer(() => j.sync(() => e()));
|
|
1756
1799
|
}
|
|
1757
|
-
})),
|
|
1800
|
+
})), lr = (e, t, n, r) => L.asyncScoped((i) => j.gen(function* () {
|
|
1758
1801
|
let a = yield* j.tryPromise(() => t.subscribeComputed(e, (e) => {
|
|
1759
1802
|
i.single(e._tag === "snapshot" ? {
|
|
1760
1803
|
...e,
|
|
1761
1804
|
computed: !0
|
|
1762
1805
|
} : e);
|
|
1763
1806
|
}, n, r)).pipe(j.matchCause({
|
|
1764
|
-
onFailure: (e) => (
|
|
1807
|
+
onFailure: (e) => (mr(`subscription.${r}`, n.traceId, e), {
|
|
1765
1808
|
ok: !1,
|
|
1766
|
-
error:
|
|
1809
|
+
error: vr(e)
|
|
1767
1810
|
}),
|
|
1768
1811
|
onSuccess: (e) => ({
|
|
1769
1812
|
ok: !0,
|
|
@@ -1779,21 +1822,21 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1779
1822
|
}
|
|
1780
1823
|
let o = a.unsubscribe;
|
|
1781
1824
|
if (yield* j.addFinalizer(() => j.sync(() => o())), n.clientId !== void 0) {
|
|
1782
|
-
let e =
|
|
1825
|
+
let e = Fn(n.clientId, () => {
|
|
1783
1826
|
i.end();
|
|
1784
1827
|
});
|
|
1785
1828
|
yield* j.addFinalizer(() => j.sync(() => e()));
|
|
1786
1829
|
}
|
|
1787
|
-
})),
|
|
1788
|
-
let
|
|
1789
|
-
|
|
1790
|
-
let
|
|
1791
|
-
traceId:
|
|
1792
|
-
...
|
|
1793
|
-
}, () => e(
|
|
1794
|
-
onFailure: (e) => (
|
|
1830
|
+
})), ur = (e, t, n = "rpc.subscription", r, i, a) => L.unwrap(j.gen(function* () {
|
|
1831
|
+
let o = yield* be, s = yield* ye, c = yield* ar;
|
|
1832
|
+
sr(c, n, o);
|
|
1833
|
+
let l = ir(o, c, s.clientId), u = Xn(o.id, s.clientId), d = er({ subjectKey: u }, () => Gn({
|
|
1834
|
+
traceId: l.traceId,
|
|
1835
|
+
...l.spanId === void 0 ? {} : { spanId: l.spanId }
|
|
1836
|
+
}, () => e(l))), f = j.isEffect(d) ? yield* d.pipe(j.matchCause({
|
|
1837
|
+
onFailure: (e) => (mr(`subscription.${n}`, l.traceId, e), {
|
|
1795
1838
|
ok: !1,
|
|
1796
|
-
error:
|
|
1839
|
+
error: vr(e)
|
|
1797
1840
|
}),
|
|
1798
1841
|
onSuccess: (e) => ({
|
|
1799
1842
|
ok: !0,
|
|
@@ -1801,45 +1844,45 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1801
1844
|
})
|
|
1802
1845
|
})) : {
|
|
1803
1846
|
ok: !0,
|
|
1804
|
-
value:
|
|
1847
|
+
value: d
|
|
1805
1848
|
};
|
|
1806
|
-
if (!
|
|
1849
|
+
if (!f.ok) return L.make({
|
|
1807
1850
|
_tag: "error",
|
|
1808
|
-
error:
|
|
1851
|
+
error: f.error
|
|
1809
1852
|
});
|
|
1810
|
-
let
|
|
1811
|
-
if (
|
|
1812
|
-
let
|
|
1813
|
-
return
|
|
1814
|
-
key: i.scope === "subject" ? `${i.baseKey}:s:${
|
|
1853
|
+
let p = f.value;
|
|
1854
|
+
if (En(p)) return lr(p, t, l, n);
|
|
1855
|
+
let m = p, h = r?.(m);
|
|
1856
|
+
return cr(m, t, l, h, n, i === void 0 ? void 0 : {
|
|
1857
|
+
key: i.scope === "subject" ? `${i.baseKey}:s:${u}` : `${i.baseKey}:global`,
|
|
1815
1858
|
ttlMs: i.ttlMs,
|
|
1816
1859
|
swrMs: i.swrMs
|
|
1817
|
-
});
|
|
1818
|
-
}).pipe(j.withSpan(n, { attributes: { "framework.kind": "subscription" } }))),
|
|
1819
|
-
let n = yield*
|
|
1820
|
-
|
|
1821
|
-
let a =
|
|
1860
|
+
}, a?.(o));
|
|
1861
|
+
}).pipe(j.withSpan(n, { attributes: { "framework.kind": "subscription" } }))), dr = (e, t = "rpc.stream") => L.unwrap(j.gen(function* () {
|
|
1862
|
+
let n = yield* be, r = yield* ye, i = yield* ar;
|
|
1863
|
+
sr(i, t, n);
|
|
1864
|
+
let a = ir(n, i, r.clientId), o = e(a), s = j.isEffect(o) ? yield* o.pipe(j.orDie) : o;
|
|
1822
1865
|
if (a.clientId === void 0) return s;
|
|
1823
1866
|
let c = a.clientId;
|
|
1824
1867
|
return L.unwrapScoped(j.gen(function* () {
|
|
1825
|
-
let e = yield*
|
|
1826
|
-
|
|
1868
|
+
let e = yield* Le.make(), t = Fn(c, () => {
|
|
1869
|
+
Le.unsafeDone(e, j.void);
|
|
1827
1870
|
});
|
|
1828
|
-
return yield* j.addFinalizer(() => j.sync(() => t())), s.pipe(L.interruptWhen(
|
|
1871
|
+
return yield* j.addFinalizer(() => j.sync(() => t())), s.pipe(L.interruptWhen(Le.await(e)));
|
|
1829
1872
|
}));
|
|
1830
|
-
}).pipe(j.withSpan(t, { attributes: { "framework.kind": "stream" } }))),
|
|
1873
|
+
}).pipe(j.withSpan(t, { attributes: { "framework.kind": "stream" } }))), fr = O({ scope: "voltro:rpc" }), pr = O({ scope: "voltro:http" }), mr = (e, t, n) => {
|
|
1831
1874
|
if (k.isInterruptedOnly(n)) return;
|
|
1832
|
-
let r = k.squash(n), i = r?._tag, a = r instanceof Error ? r.message : r?.message ?? String(r), o = k.dieOption(n)._tag === "Some", s =
|
|
1875
|
+
let r = k.squash(n), i = r?._tag, a = r instanceof Error ? r.message : r?.message ?? String(r), o = k.dieOption(n)._tag === "Some", s = Bt(r), c = {
|
|
1833
1876
|
traceId: t,
|
|
1834
1877
|
...i === void 0 ? {} : { errorTag: i },
|
|
1835
1878
|
...s
|
|
1836
1879
|
}, l = a === "Failed to execute statement" && typeof s.dbMessage == "string" ? s.dbMessage : a;
|
|
1837
|
-
o ?
|
|
1838
|
-
},
|
|
1880
|
+
o ? fr.error(`${e} failed: ${l}`, c) : fr.warn(`${e} failed: ${l}`, c);
|
|
1881
|
+
}, hr = /* @__PURE__ */ new Set(["SqlError", "ResultLengthMismatch"]), gr = (e) => typeof e == "object" && !!e && typeof e._tag == "string" && hr.has(e._tag), _r = (e) => ({
|
|
1839
1882
|
_tag: "InternalError",
|
|
1840
1883
|
message: "internal server error",
|
|
1841
1884
|
traceId: e
|
|
1842
|
-
}),
|
|
1885
|
+
}), vr = (e) => {
|
|
1843
1886
|
let t = k.squash(e);
|
|
1844
1887
|
t && typeof t == "object" && t._tag === "UnknownException" && (t = t.error ?? t.cause ?? t);
|
|
1845
1888
|
let n = t && typeof t == "object" ? t : {}, r = {};
|
|
@@ -1850,19 +1893,19 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1850
1893
|
...typeof i == "string" ? { _tag: i } : {},
|
|
1851
1894
|
message: typeof a == "string" ? a : String(t)
|
|
1852
1895
|
};
|
|
1853
|
-
},
|
|
1854
|
-
let r = yield*
|
|
1855
|
-
|
|
1856
|
-
let o =
|
|
1896
|
+
}, yr = (e, t, n = "rpc.mutation") => j.gen(function* () {
|
|
1897
|
+
let r = yield* be, i = yield* ye, a = yield* ar;
|
|
1898
|
+
sr(a, n, r);
|
|
1899
|
+
let o = ir(r, a, i.clientId), s = er({ subjectKey: Xn(r.id, i.clientId) }, () => Gn({
|
|
1857
1900
|
traceId: o.traceId,
|
|
1858
1901
|
...o.spanId === void 0 ? {} : { spanId: o.spanId }
|
|
1859
1902
|
}, () => e(t, o)));
|
|
1860
1903
|
return yield* (j.isEffect(s) ? s : j.tryPromise({
|
|
1861
1904
|
try: () => Promise.resolve(s),
|
|
1862
1905
|
catch: (e) => e
|
|
1863
|
-
})).pipe(j.tapErrorCause((e) => j.sync(() =>
|
|
1864
|
-
}).pipe(j.withSpan(n, { attributes: { "framework.kind": "mutation" } })),
|
|
1865
|
-
let t = e.port ?? 4e3, n = e.path ?? "/ws", r =
|
|
1906
|
+
})).pipe(j.tapErrorCause((e) => j.sync(() => mr(n, o.traceId, e))), j.catchIf(gr, () => j.die(_r(o.traceId))), j.annotateLogs(or(o)));
|
|
1907
|
+
}).pipe(j.withSpan(n, { attributes: { "framework.kind": "mutation" } })), br = 8 * 1024 * 1024, xr = (e) => {
|
|
1908
|
+
let t = e.port ?? 4e3, n = e.path ?? "/ws", r = Ke(), i = (t) => z.HttpServerRequest.pipe(j.flatMap((t) => j.gen(function* () {
|
|
1866
1909
|
if (!e.inspectRoute) return B.text("inspect route not configured", { status: 404 });
|
|
1867
1910
|
let n = {};
|
|
1868
1911
|
for (let [e, r] of Object.entries(t.headers)) r !== void 0 && (n[e.toLowerCase()] = Array.isArray(r) ? r.join(", ") : r);
|
|
@@ -1938,7 +1981,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1938
1981
|
let t = (e) => z.HttpServerRequest.pipe(j.flatMap((t) => j.gen(function* () {
|
|
1939
1982
|
let n = {};
|
|
1940
1983
|
for (let [e, r] of Object.entries(t.headers)) r !== void 0 && (n[e.toLowerCase()] = Array.isArray(r) ? r.join(", ") : r);
|
|
1941
|
-
let r = t.method !== "GET" && t.method !== "HEAD" ? yield* t.text.pipe(j.orElseSucceed(() => "")) : "", i = new TextEncoder().encode(r), a = t.url.split("?")[0], o =
|
|
1984
|
+
let r = t.method !== "GET" && t.method !== "HEAD" ? yield* t.text.pipe(j.orElseSucceed(() => "")) : "", i = new TextEncoder().encode(r), a = t.url.split("?")[0], o = Un(n.traceparent), s = yield* j.promise(() => e.handle({
|
|
1942
1985
|
method: t.method,
|
|
1943
1986
|
path: a,
|
|
1944
1987
|
headers: n,
|
|
@@ -1968,8 +2011,8 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1968
2011
|
query: a,
|
|
1969
2012
|
headers: n,
|
|
1970
2013
|
rawBody: o
|
|
1971
|
-
}, c = yield* j.promise(() =>
|
|
1972
|
-
c.status >= 500 &&
|
|
2014
|
+
}, c = yield* j.promise(() => rt(e, s));
|
|
2015
|
+
c.status >= 500 && pr.warn(`${t.method} ${i} → ${c.status}`, {
|
|
1973
2016
|
method: t.method,
|
|
1974
2017
|
path: i,
|
|
1975
2018
|
status: c.status,
|
|
@@ -1981,7 +2024,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1981
2024
|
headers: l
|
|
1982
2025
|
};
|
|
1983
2026
|
return c.body instanceof Uint8Array ? B.uint8Array(c.body, u) : B.text(c.body ?? "", u);
|
|
1984
|
-
})), j.tapErrorCause((t) => k.isInterruptedOnly(t) ? j.void : j.sync(() =>
|
|
2027
|
+
})), j.tapErrorCause((t) => k.isInterruptedOnly(t) ? j.void : j.sync(() => pr.error(`${e.map((e) => e.method).join("|")} ${e[0].path} threw`, { path: e[0].path }, k.squash(t))))), n = /* @__PURE__ */ new Map();
|
|
1985
2028
|
for (let t of e.httpRoutes) {
|
|
1986
2029
|
let e = n.get(t.path);
|
|
1987
2030
|
e ? e.push(t) : n.set(t.path, [t]);
|
|
@@ -1992,13 +2035,13 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
1992
2035
|
});
|
|
1993
2036
|
l = M.mergeAll(...r);
|
|
1994
2037
|
}
|
|
1995
|
-
let u =
|
|
1996
|
-
let e = yield*
|
|
2038
|
+
let u = tt.layerProtocolWebsocketRouter({ path: n }), d = tt.layer(e.group), f = tt.layer(e.group).pipe(M.provide(tt.layerProtocolHttpRouter({ path: "/rpc" })), M.provide(et.layerJson), M.provide(e.httpHandlersLayer ?? e.handlersLayer)), p = M.scopedDiscard(j.gen(function* () {
|
|
2039
|
+
let e = yield* tt.Protocol;
|
|
1997
2040
|
yield* j.forkScoped(j.gen(function* () {
|
|
1998
2041
|
let t = yield* e.disconnects.take;
|
|
1999
|
-
|
|
2042
|
+
Mn(t), In(t);
|
|
2000
2043
|
}).pipe(j.forever));
|
|
2001
|
-
})), m = M.mergeAll(d, p).pipe(M.provide(u), M.provide(
|
|
2044
|
+
})), m = M.mergeAll(d, p).pipe(M.provide(u), M.provide(et.layerJson), M.provide(e.handlersLayer)), h = M.mergeAll(m, f, s, c, l), g = e.pluginHttpInterceptor, _ = e.healthCheck, v = Number(process.env.VOLTRO_MAX_RPC_BODY_BYTES), y = e.maxRpcBodyBytes ?? (Number.isFinite(v) && v > 0 ? v : 8388608), b = { "cache-control": "no-store" }, x = (e) => j.gen(function* () {
|
|
2002
2045
|
let t = yield* z.HttpServerRequest, n = {};
|
|
2003
2046
|
for (let [e, r] of Object.entries(t.headers)) r !== void 0 && (n[e.toLowerCase()] = Array.isArray(r) ? r.join(", ") : r);
|
|
2004
2047
|
let r = t.url.indexOf("?"), i = r === -1 ? t.url : t.url.slice(0, r);
|
|
@@ -2039,13 +2082,13 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2039
2082
|
status: l.status,
|
|
2040
2083
|
...l.headers ? { headers: l.headers } : {}
|
|
2041
2084
|
});
|
|
2042
|
-
}), S = M.unwrapEffect(R.toHttpEffect(h).pipe(j.map((e) =>
|
|
2085
|
+
}), S = M.unwrapEffect(R.toHttpEffect(h).pipe(j.map((e) => Ye.serve(x(e))))).pipe(M.provide(Ze.layer(() => r, { port: t })), M.provide(Xe.layer));
|
|
2043
2086
|
e.tracerLayer && (S = S.pipe(M.provide(e.tracerLayer)));
|
|
2044
|
-
let C =
|
|
2087
|
+
let C = O({ scope: "voltro:rpc" }), ee = M.launch(S).pipe(j.catchAllCause((e) => j.sync(() => {
|
|
2045
2088
|
C.error("rpc server crashed", {}, k.squash(e)), process.exit(1);
|
|
2046
2089
|
})));
|
|
2047
|
-
return
|
|
2048
|
-
},
|
|
2090
|
+
return Qe.runMain(ee, { disableErrorReporting: !0 }), r;
|
|
2091
|
+
}, Sr = (e, t = 1e4) => new Promise((n, r) => {
|
|
2049
2092
|
if (e.listening) {
|
|
2050
2093
|
n();
|
|
2051
2094
|
return;
|
|
@@ -2061,13 +2104,13 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2061
2104
|
o(e);
|
|
2062
2105
|
}
|
|
2063
2106
|
a = setTimeout(() => o(/* @__PURE__ */ Error(`rpc server did not bind within ${t}ms`)), t), e.on("listening", s), e.on("error", c);
|
|
2064
|
-
}),
|
|
2107
|
+
}), Cr = () => {
|
|
2065
2108
|
let e = process.env.FRAMEWORK_TRACING?.toLowerCase();
|
|
2066
2109
|
return e === "console" || e === "otlp" || e === "off" ? e : process.env.OTEL_EXPORTER_OTLP_ENDPOINT || process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ? "otlp" : "off";
|
|
2067
|
-
},
|
|
2110
|
+
}, wr = () => {
|
|
2068
2111
|
let e = process.env.FRAMEWORK_METRICS?.toLowerCase();
|
|
2069
2112
|
return e === "console" || e === "otlp" || e === "off" ? e : process.env.OTEL_EXPORTER_OTLP_ENDPOINT || process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT ? "otlp" : "off";
|
|
2070
|
-
},
|
|
2113
|
+
}, Tr = async () => {
|
|
2071
2114
|
let [e, t, n, r, i] = await Promise.all([
|
|
2072
2115
|
import("@opentelemetry/sdk-trace-base"),
|
|
2073
2116
|
import("@opentelemetry/sdk-metrics"),
|
|
@@ -2082,7 +2125,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2082
2125
|
otlpMetrics: r,
|
|
2083
2126
|
nodeSdk: i
|
|
2084
2127
|
};
|
|
2085
|
-
},
|
|
2128
|
+
}, Er = (e, t, n) => {
|
|
2086
2129
|
let { PeriodicExportingMetricReader: r, ConsoleMetricExporter: i, InMemoryMetricExporter: a, AggregationTemporality: o } = e.sdkMetrics;
|
|
2087
2130
|
if (t === "off") return {
|
|
2088
2131
|
reader: void 0,
|
|
@@ -2105,8 +2148,8 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2105
2148
|
}),
|
|
2106
2149
|
inMemory: void 0
|
|
2107
2150
|
};
|
|
2108
|
-
},
|
|
2109
|
-
let t = e.mode ??
|
|
2151
|
+
}, Dr = async (e = {}) => {
|
|
2152
|
+
let t = e.mode ?? Cr(), n = e.metricsMode ?? wr(), r = e.extraSpanProcessors ?? [], i = e.extraMetricReaders ?? [];
|
|
2110
2153
|
if (t === "off" && e.traceSink === void 0 && n === "off" && r.length === 0 && i.length === 0) return {
|
|
2111
2154
|
layer: M.empty,
|
|
2112
2155
|
mode: t,
|
|
@@ -2115,13 +2158,13 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2115
2158
|
metricsMode: n,
|
|
2116
2159
|
inMemoryMetricExporter: void 0
|
|
2117
2160
|
};
|
|
2118
|
-
let a = await
|
|
2161
|
+
let a = await Tr(), { ConsoleSpanExporter: o, InMemorySpanExporter: s, SimpleSpanProcessor: c, BatchSpanProcessor: l } = a.sdkTrace, u = t === "off", d = e.serviceName ?? process.env.OTEL_SERVICE_NAME ?? "voltro-app", f, p;
|
|
2119
2162
|
e.spanProcessor ? p = e.spanProcessor : u ? p = void 0 : t === "memory" ? (f = new s(), p = new c(f)) : p = t === "console" ? new c(new o()) : new l(new a.otlpTrace.OTLPTraceExporter());
|
|
2120
2163
|
let m = [
|
|
2121
2164
|
...e.traceSink ? [e.traceSink] : [],
|
|
2122
2165
|
...p ? [p] : [],
|
|
2123
2166
|
...r
|
|
2124
|
-
], h = m.length === 1 ? m[0] : m, { reader: g, inMemory: _ } =
|
|
2167
|
+
], h = m.length === 1 ? m[0] : m, { reader: g, inMemory: _ } = Er(a, n, e.metricExportIntervalMillis ?? (process.env.OTEL_METRIC_EXPORT_INTERVAL ? Number(process.env.OTEL_METRIC_EXPORT_INTERVAL) : 6e4)), v = [...g ? [g] : [], ...i], y = v.length === 0 ? void 0 : v.length === 1 ? v[0] : v, b = {
|
|
2125
2168
|
serviceName: d,
|
|
2126
2169
|
...e.serviceVersion ? { serviceVersion: e.serviceVersion } : {},
|
|
2127
2170
|
...e.resourceAttributes ? { attributes: e.resourceAttributes } : {}
|
|
@@ -2139,18 +2182,18 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2139
2182
|
metricsMode: n,
|
|
2140
2183
|
inMemoryMetricExporter: _
|
|
2141
2184
|
};
|
|
2142
|
-
},
|
|
2143
|
-
[
|
|
2144
|
-
[
|
|
2145
|
-
[
|
|
2146
|
-
[
|
|
2147
|
-
[
|
|
2148
|
-
},
|
|
2185
|
+
}, Or = {
|
|
2186
|
+
[ot.INTERNAL]: "internal",
|
|
2187
|
+
[ot.SERVER]: "server",
|
|
2188
|
+
[ot.CLIENT]: "client",
|
|
2189
|
+
[ot.PRODUCER]: "producer",
|
|
2190
|
+
[ot.CONSUMER]: "consumer"
|
|
2191
|
+
}, kr = (e) => e[0] * 1e3 + e[1] / 1e6, Ar = 512, jr = 48, Mr = (e) => {
|
|
2149
2192
|
let t = {}, n = 0;
|
|
2150
2193
|
for (let r in e) {
|
|
2151
|
-
if (n >=
|
|
2194
|
+
if (n >= jr) break;
|
|
2152
2195
|
let i = e[r];
|
|
2153
|
-
if (typeof i == "string") t[r] = i.length >
|
|
2196
|
+
if (typeof i == "string") t[r] = i.length > Ar ? `${i.slice(0, Ar)}…` : i;
|
|
2154
2197
|
else if (typeof i == "number" || typeof i == "boolean" || i == null) t[r] = i;
|
|
2155
2198
|
else {
|
|
2156
2199
|
let e;
|
|
@@ -2159,49 +2202,49 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2159
2202
|
} catch {
|
|
2160
2203
|
e = String(i);
|
|
2161
2204
|
}
|
|
2162
|
-
t[r] = e.length >
|
|
2205
|
+
t[r] = e.length > Ar ? `${e.slice(0, Ar)}…` : e;
|
|
2163
2206
|
}
|
|
2164
2207
|
n++;
|
|
2165
2208
|
}
|
|
2166
2209
|
return t;
|
|
2167
|
-
},
|
|
2168
|
-
[
|
|
2169
|
-
[
|
|
2170
|
-
[
|
|
2171
|
-
},
|
|
2210
|
+
}, Nr = {
|
|
2211
|
+
[st.UNSET]: "unset",
|
|
2212
|
+
[st.OK]: "ok",
|
|
2213
|
+
[st.ERROR]: "error"
|
|
2214
|
+
}, Pr = (e) => {
|
|
2172
2215
|
let t = e.spanContext(), n = e.events.length > 0 ? e.events.slice(0, 16).map((e) => ({
|
|
2173
2216
|
name: e.name,
|
|
2174
|
-
tsMs:
|
|
2175
|
-
...e.attributes ? { attributes:
|
|
2217
|
+
tsMs: kr(e.time),
|
|
2218
|
+
...e.attributes ? { attributes: Mr(e.attributes) } : {}
|
|
2176
2219
|
})) : void 0;
|
|
2177
2220
|
return {
|
|
2178
2221
|
traceId: t.traceId,
|
|
2179
2222
|
spanId: t.spanId,
|
|
2180
2223
|
parentSpanId: e.parentSpanContext?.spanId ?? null,
|
|
2181
2224
|
name: e.name,
|
|
2182
|
-
kind:
|
|
2183
|
-
attributes:
|
|
2184
|
-
startMs:
|
|
2185
|
-
endMs:
|
|
2186
|
-
durationMs:
|
|
2187
|
-
status:
|
|
2225
|
+
kind: Or[e.kind] ?? "internal",
|
|
2226
|
+
attributes: Mr(e.attributes),
|
|
2227
|
+
startMs: kr(e.startTime),
|
|
2228
|
+
endMs: kr(e.endTime),
|
|
2229
|
+
durationMs: kr(e.duration),
|
|
2230
|
+
status: Nr[e.status.code] ?? "unset",
|
|
2188
2231
|
...e.status.message ? { statusMessage: e.status.message } : {},
|
|
2189
2232
|
...n ? { events: n } : {}
|
|
2190
2233
|
};
|
|
2191
|
-
},
|
|
2234
|
+
}, Fr = (e) => ({
|
|
2192
2235
|
onStart: () => {},
|
|
2193
2236
|
onEnd: (t) => {
|
|
2194
2237
|
try {
|
|
2195
|
-
e(
|
|
2238
|
+
e(Pr(t));
|
|
2196
2239
|
} catch {}
|
|
2197
2240
|
},
|
|
2198
2241
|
forceFlush: () => Promise.resolve(),
|
|
2199
2242
|
shutdown: () => Promise.resolve()
|
|
2200
|
-
}),
|
|
2201
|
-
|
|
2202
|
-
},
|
|
2203
|
-
|
|
2204
|
-
},
|
|
2243
|
+
}), Ir = { get: (e) => Promise.resolve(process.env[e]) }, Lr = Ir, Rr = (e) => {
|
|
2244
|
+
Lr = e;
|
|
2245
|
+
}, zr = () => {
|
|
2246
|
+
Lr = Ir;
|
|
2247
|
+
}, Br = async (e) => await Lr.get(e) ?? process.env[e], Vr = (e) => process.env[e], Hr = (e, t = 6e4, n = () => Date.now()) => {
|
|
2205
2248
|
let r = /* @__PURE__ */ new Map();
|
|
2206
2249
|
return { get: async (i) => {
|
|
2207
2250
|
let a = r.get(i);
|
|
@@ -2212,12 +2255,12 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2212
2255
|
at: n()
|
|
2213
2256
|
}), o;
|
|
2214
2257
|
} };
|
|
2215
|
-
},
|
|
2258
|
+
}, Ur = (e) => {
|
|
2216
2259
|
let t = {
|
|
2217
2260
|
accept: "application/json",
|
|
2218
2261
|
...e.headers ?? {}
|
|
2219
2262
|
};
|
|
2220
|
-
if (e.perKey) return
|
|
2263
|
+
if (e.perKey) return Hr({ get: async (n) => {
|
|
2221
2264
|
let r = await fetch(`${e.url.replace(/\/$/, "")}/${encodeURIComponent(n)}`, { headers: t });
|
|
2222
2265
|
if (!r.ok) return;
|
|
2223
2266
|
let i = await r.json();
|
|
@@ -2228,50 +2271,59 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2228
2271
|
let t = (await a())[e];
|
|
2229
2272
|
return typeof t == "string" ? t : void 0;
|
|
2230
2273
|
} };
|
|
2231
|
-
},
|
|
2274
|
+
}, Wr = (e) => e === void 0 || e === "env" || typeof e == "object" && e.kind === "env" ? Ir : e.kind === "custom" ? e.backend : e.kind === "http" ? Ur(e) : Ir, Gr = (e) => /^[0-9a-f]{64}$/i.test(e) ? Buffer.from(e, "hex") : ge(e, "voltro:field-encryption:v1", 32), Kr = (t) => {
|
|
2232
2275
|
if (t.length !== 32) throw Error(`field cipher key must be 32 bytes, got ${t.length}`);
|
|
2233
2276
|
return {
|
|
2234
2277
|
encrypt: (n) => {
|
|
2235
|
-
let r =
|
|
2278
|
+
let r = me(12), i = de("aes-256-gcm", t, r), a = Buffer.concat([i.update(n, "utf8"), i.final()]), o = i.getAuthTag();
|
|
2236
2279
|
return `${e}${r.toString("base64")}:${o.toString("base64")}:${a.toString("base64")}`;
|
|
2237
2280
|
},
|
|
2238
2281
|
decrypt: (n) => {
|
|
2239
2282
|
let [r, i, a] = n.slice(e.length).split(":");
|
|
2240
2283
|
if (!r || !i || a === void 0) throw Error("field cipher: malformed ciphertext");
|
|
2241
|
-
let o =
|
|
2284
|
+
let o = fe("aes-256-gcm", t, Buffer.from(r, "base64"));
|
|
2242
2285
|
return o.setAuthTag(Buffer.from(i, "base64")), Buffer.concat([o.update(Buffer.from(a, "base64")), o.final()]).toString("utf8");
|
|
2243
2286
|
}
|
|
2244
2287
|
};
|
|
2245
|
-
},
|
|
2246
|
-
|
|
2247
|
-
},
|
|
2288
|
+
}, qr = (e) => Kr(Gr(e)), Jr, Yr = (e) => {
|
|
2289
|
+
Jr = e;
|
|
2290
|
+
}, Xr = () => Jr, Zr = "no field cipher registered — enable `@voltro/plugin-governance` `governancePlugin({ fieldEncryption: { key } })` (or call setFieldCipher) so a key is available.", Qr = (e) => {
|
|
2291
|
+
let t = Xr();
|
|
2292
|
+
if (!t) throw Error(`encryptField: ${Zr}`);
|
|
2293
|
+
return t.encrypt(e);
|
|
2294
|
+
}, $r = (e) => {
|
|
2295
|
+
if (!x(e)) return e;
|
|
2296
|
+
let t = Xr();
|
|
2297
|
+
if (!t) throw Error(`decryptField: ${Zr}`);
|
|
2298
|
+
return t.decrypt(e);
|
|
2299
|
+
}, q = "_voltro_idempotency", ei = (e) => {
|
|
2248
2300
|
if (e == null) return null;
|
|
2249
2301
|
let t = typeof e == "string" ? JSON.parse(e) : e;
|
|
2250
2302
|
return t && typeof t == "object" && "status" in t ? t : null;
|
|
2251
|
-
},
|
|
2303
|
+
}, ti = (e) => ({
|
|
2252
2304
|
scope: e.scope,
|
|
2253
2305
|
key: e.key,
|
|
2254
2306
|
status: e.status === "completed" ? "completed" : "in_flight",
|
|
2255
|
-
response:
|
|
2256
|
-
createdAt:
|
|
2257
|
-
}),
|
|
2258
|
-
table:
|
|
2307
|
+
response: ei(e.response),
|
|
2308
|
+
createdAt: Pe(e.createdAt)
|
|
2309
|
+
}), ni = async (e, n, r) => (await e.query({
|
|
2310
|
+
table: q,
|
|
2259
2311
|
predicate: t(u("scope", n), u("key", r)),
|
|
2260
2312
|
order: [],
|
|
2261
2313
|
take: 1,
|
|
2262
2314
|
skip: void 0,
|
|
2263
2315
|
projection: void 0
|
|
2264
|
-
}))[0] ?? null,
|
|
2316
|
+
}))[0] ?? null, ri = (e) => ({
|
|
2265
2317
|
get: async (t, n) => {
|
|
2266
|
-
let r = await
|
|
2267
|
-
return r ?
|
|
2318
|
+
let r = await ni(e, t, n);
|
|
2319
|
+
return r ? ti(r) : null;
|
|
2268
2320
|
},
|
|
2269
2321
|
claim: async (t, n, r, i) => {
|
|
2270
2322
|
for (let a = 0; a < 2; a++) {
|
|
2271
2323
|
let a = f({
|
|
2272
2324
|
kind: "typeid",
|
|
2273
2325
|
prefix: "idem"
|
|
2274
|
-
},
|
|
2326
|
+
}, q), o = await e.insertIgnore(q, {
|
|
2275
2327
|
id: a,
|
|
2276
2328
|
scope: t,
|
|
2277
2329
|
key: n,
|
|
@@ -2280,11 +2332,11 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2280
2332
|
createdAt: new Date(r)
|
|
2281
2333
|
}, { conflictColumns: ["scope", "key"] });
|
|
2282
2334
|
if (o.id === a) return "claimed";
|
|
2283
|
-
if (r -
|
|
2284
|
-
await e.delete(
|
|
2335
|
+
if (r - Pe(o.createdAt) < i) return ti(o);
|
|
2336
|
+
await e.delete(q, o.id);
|
|
2285
2337
|
}
|
|
2286
|
-
let a = await
|
|
2287
|
-
return a ?
|
|
2338
|
+
let a = await ni(e, t, n);
|
|
2339
|
+
return a ? ti(a) : {
|
|
2288
2340
|
scope: t,
|
|
2289
2341
|
key: n,
|
|
2290
2342
|
status: "in_flight",
|
|
@@ -2293,36 +2345,36 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2293
2345
|
};
|
|
2294
2346
|
},
|
|
2295
2347
|
complete: async (t, n, r, i) => {
|
|
2296
|
-
let a = await
|
|
2297
|
-
a && await e.update(
|
|
2348
|
+
let a = await ni(e, t, n);
|
|
2349
|
+
a && await e.update(q, a.id, {
|
|
2298
2350
|
status: "completed",
|
|
2299
2351
|
response: r
|
|
2300
2352
|
});
|
|
2301
2353
|
},
|
|
2302
2354
|
release: async (t, n) => {
|
|
2303
|
-
let r = await
|
|
2304
|
-
r && await e.delete(
|
|
2355
|
+
let r = await ni(e, t, n);
|
|
2356
|
+
r && await e.delete(q, r.id);
|
|
2305
2357
|
}
|
|
2306
|
-
}),
|
|
2358
|
+
}), J = "_voltro_kv", ii = (e) => {
|
|
2307
2359
|
if (e == null) return null;
|
|
2308
2360
|
if (e instanceof Date) return e.getTime();
|
|
2309
2361
|
if (typeof e == "number") return e;
|
|
2310
2362
|
let t = Date.parse(String(e));
|
|
2311
2363
|
return Number.isNaN(t) ? null : t;
|
|
2312
|
-
},
|
|
2313
|
-
let n =
|
|
2364
|
+
}, ai = (e, t) => {
|
|
2365
|
+
let n = ii(e.expiresAt);
|
|
2314
2366
|
return n !== null && n <= t;
|
|
2315
|
-
},
|
|
2316
|
-
table:
|
|
2367
|
+
}, oi = (e) => e === null ? null : JSON.parse(e), si = async (e, t) => (await e.query({
|
|
2368
|
+
table: J,
|
|
2317
2369
|
predicate: u("key", t),
|
|
2318
2370
|
order: [],
|
|
2319
2371
|
take: 1,
|
|
2320
2372
|
skip: void 0,
|
|
2321
2373
|
projection: void 0
|
|
2322
|
-
}))[0] ?? null,
|
|
2374
|
+
}))[0] ?? null, ci = (e) => {
|
|
2323
2375
|
let n = (e, t, n) => j.tryPromise({
|
|
2324
2376
|
try: n,
|
|
2325
|
-
catch: (n) => new
|
|
2377
|
+
catch: (n) => new lt({
|
|
2326
2378
|
operation: e,
|
|
2327
2379
|
key: t,
|
|
2328
2380
|
cause: String(n)
|
|
@@ -2330,15 +2382,15 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2330
2382
|
});
|
|
2331
2383
|
return {
|
|
2332
2384
|
get: (t) => n("get", t, async () => {
|
|
2333
|
-
let n = await
|
|
2334
|
-
return n === null ? P.none() :
|
|
2385
|
+
let n = await si(e, t);
|
|
2386
|
+
return n === null ? P.none() : ai(n, Date.now()) ? (await e.delete(J, n.id), P.none()) : P.some(oi(n.value));
|
|
2335
2387
|
}),
|
|
2336
2388
|
set: (t, r, i) => n("set", t, async () => {
|
|
2337
2389
|
let n = Date.now(), a = i?.ttlMs !== void 0 && i.ttlMs > 0 ? new Date(n + i.ttlMs) : null, o = f({
|
|
2338
2390
|
kind: "typeid",
|
|
2339
2391
|
prefix: "kv"
|
|
2340
|
-
},
|
|
2341
|
-
await e.upsert(
|
|
2392
|
+
}, J);
|
|
2393
|
+
await e.upsert(J, {
|
|
2342
2394
|
id: o,
|
|
2343
2395
|
key: t,
|
|
2344
2396
|
value: JSON.stringify(r),
|
|
@@ -2354,36 +2406,36 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2354
2406
|
});
|
|
2355
2407
|
}),
|
|
2356
2408
|
delete: (t) => n("delete", t, async () => {
|
|
2357
|
-
let n = await
|
|
2409
|
+
let n = await si(e, t);
|
|
2358
2410
|
if (n === null) return !1;
|
|
2359
|
-
let r = !
|
|
2360
|
-
return await e.delete(
|
|
2411
|
+
let r = !ai(n, Date.now());
|
|
2412
|
+
return await e.delete(J, n.id), r;
|
|
2361
2413
|
}),
|
|
2362
2414
|
has: (t) => n("has", t, async () => {
|
|
2363
|
-
let n = await
|
|
2364
|
-
return n === null ? !1 :
|
|
2415
|
+
let n = await si(e, t);
|
|
2416
|
+
return n === null ? !1 : ai(n, Date.now()) ? (await e.delete(J, n.id), !1) : !0;
|
|
2365
2417
|
}),
|
|
2366
2418
|
list: (r) => n("list", "", async () => {
|
|
2367
|
-
let n = Date.now(), i =
|
|
2368
|
-
table:
|
|
2419
|
+
let n = Date.now(), i = re(S("expiresAt"), h("expiresAt", new Date(n))), a = r === "" ? i : t(o("key", r), i), s = await e.query({
|
|
2420
|
+
table: J,
|
|
2369
2421
|
predicate: a,
|
|
2370
2422
|
order: [],
|
|
2371
2423
|
take: void 0,
|
|
2372
2424
|
skip: void 0,
|
|
2373
2425
|
projection: void 0
|
|
2374
2426
|
}), c = [];
|
|
2375
|
-
for (let e of s)
|
|
2427
|
+
for (let e of s) ai(e, n) || (r === "" || e.key.startsWith(r)) && c.push(e.key);
|
|
2376
2428
|
return c;
|
|
2377
2429
|
}),
|
|
2378
2430
|
clear: () => n("clear", "", async () => {
|
|
2379
|
-
await e.deleteMany(
|
|
2431
|
+
await e.deleteMany(J, { where: {
|
|
2380
2432
|
column: "id",
|
|
2381
2433
|
op: "isNotNull"
|
|
2382
2434
|
} });
|
|
2383
2435
|
})
|
|
2384
2436
|
};
|
|
2385
|
-
},
|
|
2386
|
-
let n = (t.KV_BACKEND ?? "database").toLowerCase(), r = n === "redis" ? "redis" : n === "memory" ? "memory" : "database", i = r === "redis" ?
|
|
2437
|
+
}, li = async ({ store: e, env: t = process.env }) => {
|
|
2438
|
+
let n = (t.KV_BACKEND ?? "database").toLowerCase(), r = n === "redis" ? "redis" : n === "memory" ? "memory" : "database", i = r === "redis" ? pt(t.KV_KEY_PREFIX ? { keyPrefix: t.KV_KEY_PREFIX } : {}).pipe(M.provide(dt)) : r === "memory" ? ft() : M.succeed(ut, ut.of(ci(e))), a = Ve.make(ct.Default.pipe(M.provide(i))), o = await a.runPromise(ct);
|
|
2387
2439
|
return {
|
|
2388
2440
|
kv: {
|
|
2389
2441
|
get: (e) => a.runPromise(o.get(e)).then((e) => P.getOrUndefined(e)),
|
|
@@ -2398,7 +2450,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2398
2450
|
backend: r,
|
|
2399
2451
|
dispose: () => a.dispose()
|
|
2400
2452
|
};
|
|
2401
|
-
},
|
|
2453
|
+
}, ui = {
|
|
2402
2454
|
get: () => Promise.resolve(void 0),
|
|
2403
2455
|
getOrElse: (e, t) => Promise.resolve(t()),
|
|
2404
2456
|
set: () => Promise.resolve(),
|
|
@@ -2406,7 +2458,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2406
2458
|
has: () => Promise.resolve(!1),
|
|
2407
2459
|
list: () => Promise.resolve([]),
|
|
2408
2460
|
clear: () => Promise.resolve()
|
|
2409
|
-
},
|
|
2461
|
+
}, di = "_voltro_api_keys", fi = (e) => pe("sha256").update(e, "utf8").digest("hex"), pi = (e = "voltro_") => `${e}${me(30).toString("base64url")}`, mi = (e) => ({
|
|
2410
2462
|
id: e.id,
|
|
2411
2463
|
name: e.name,
|
|
2412
2464
|
keyPrefix: e.keyPrefix,
|
|
@@ -2416,17 +2468,17 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2416
2468
|
expiresAt: e.expiresAt,
|
|
2417
2469
|
revokedAt: e.revokedAt,
|
|
2418
2470
|
createdAt: e.createdAt
|
|
2419
|
-
}),
|
|
2471
|
+
}), hi = (e, t) => e.revokedAt === null && (e.expiresAt === null || e.expiresAt > t), gi = (e, t = {}) => {
|
|
2420
2472
|
let n = t.prefix ?? "voltro_", r = async (t) => {
|
|
2421
|
-
let r =
|
|
2473
|
+
let r = pi(n), i = f({
|
|
2422
2474
|
kind: "typeid",
|
|
2423
2475
|
prefix: "apikey"
|
|
2424
|
-
},
|
|
2476
|
+
}, di), a = t.scopes ?? [], o = t.expiresAt == null ? null : t.expiresAt instanceof Date ? t.expiresAt.getTime() : t.expiresAt;
|
|
2425
2477
|
return await e.insert({
|
|
2426
2478
|
id: i,
|
|
2427
2479
|
tenantId: t.tenantId ?? null,
|
|
2428
2480
|
name: t.name,
|
|
2429
|
-
hashedKey:
|
|
2481
|
+
hashedKey: fi(r),
|
|
2430
2482
|
keyPrefix: r.slice(0, n.length + 6),
|
|
2431
2483
|
scopes: a,
|
|
2432
2484
|
lastUsedAt: null,
|
|
@@ -2444,7 +2496,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2444
2496
|
};
|
|
2445
2497
|
}, i = async (t, n = Date.now()) => {
|
|
2446
2498
|
let r = await e.findByHash(t);
|
|
2447
|
-
return !r || !
|
|
2499
|
+
return !r || !hi(r, n) ? null : (await e.patch(r.id, { lastUsedAt: n }), {
|
|
2448
2500
|
id: r.id,
|
|
2449
2501
|
tenantId: r.tenantId ?? "",
|
|
2450
2502
|
scopes: r.scopes ?? []
|
|
@@ -2453,7 +2505,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2453
2505
|
return {
|
|
2454
2506
|
issue: r,
|
|
2455
2507
|
resolveByHash: i,
|
|
2456
|
-
verify: (e, t) => i(
|
|
2508
|
+
verify: (e, t) => i(fi(e), t),
|
|
2457
2509
|
revoke: async (t, n = Date.now()) => await e.findById(t) ? (await e.patch(t, { revokedAt: n }), !0) : !1,
|
|
2458
2510
|
rotate: async (t, n = Date.now()) => {
|
|
2459
2511
|
let i = await e.findById(t);
|
|
@@ -2464,9 +2516,9 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2464
2516
|
createdBy: i.createdBy
|
|
2465
2517
|
})) : null;
|
|
2466
2518
|
},
|
|
2467
|
-
list: async (t) => (await e.listByTenant(t)).map(
|
|
2519
|
+
list: async (t) => (await e.listByTenant(t)).map(mi)
|
|
2468
2520
|
};
|
|
2469
|
-
},
|
|
2521
|
+
}, _i = () => {
|
|
2470
2522
|
let e = /* @__PURE__ */ new Map();
|
|
2471
2523
|
return {
|
|
2472
2524
|
insert: async (t) => {
|
|
@@ -2483,21 +2535,21 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2483
2535
|
});
|
|
2484
2536
|
}
|
|
2485
2537
|
};
|
|
2486
|
-
},
|
|
2538
|
+
}, vi = (e) => e == null ? null : e instanceof Date ? e.getTime() : typeof e == "number" ? e : typeof e == "string" ? new Date(e).getTime() : null, yi = (e) => ({
|
|
2487
2539
|
id: String(e.id),
|
|
2488
2540
|
tenantId: e.tenantId ?? null,
|
|
2489
2541
|
name: String(e.name),
|
|
2490
2542
|
hashedKey: String(e.hashedKey),
|
|
2491
2543
|
keyPrefix: String(e.keyPrefix),
|
|
2492
2544
|
scopes: e.scopes ?? null,
|
|
2493
|
-
lastUsedAt:
|
|
2494
|
-
expiresAt:
|
|
2495
|
-
revokedAt:
|
|
2545
|
+
lastUsedAt: vi(e.lastUsedAt),
|
|
2546
|
+
expiresAt: vi(e.expiresAt),
|
|
2547
|
+
revokedAt: vi(e.revokedAt),
|
|
2496
2548
|
createdBy: e.createdBy ?? null,
|
|
2497
|
-
createdAt:
|
|
2498
|
-
}),
|
|
2549
|
+
createdAt: vi(e.createdAt) ?? 0
|
|
2550
|
+
}), bi = (e) => {
|
|
2499
2551
|
let t = async (t) => await e.query({
|
|
2500
|
-
table:
|
|
2552
|
+
table: di,
|
|
2501
2553
|
predicate: t,
|
|
2502
2554
|
order: [],
|
|
2503
2555
|
take: void 0,
|
|
@@ -2515,32 +2567,32 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2515
2567
|
};
|
|
2516
2568
|
return {
|
|
2517
2569
|
insert: async (t) => {
|
|
2518
|
-
await e.insert(
|
|
2570
|
+
await e.insert(di, n(t));
|
|
2519
2571
|
},
|
|
2520
2572
|
findByHash: async (e) => {
|
|
2521
2573
|
let n = await t(u("hashedKey", e));
|
|
2522
|
-
return n[0] ?
|
|
2574
|
+
return n[0] ? yi(n[0]) : null;
|
|
2523
2575
|
},
|
|
2524
2576
|
findById: async (e) => {
|
|
2525
2577
|
let n = await t(u("id", e));
|
|
2526
|
-
return n[0] ?
|
|
2578
|
+
return n[0] ? yi(n[0]) : null;
|
|
2527
2579
|
},
|
|
2528
|
-
listByTenant: async (e) => (await t(e === null ? void 0 : u("tenantId", e))).map(
|
|
2580
|
+
listByTenant: async (e) => (await t(e === null ? void 0 : u("tenantId", e))).map(yi).filter((t) => e === null || t.tenantId === e),
|
|
2529
2581
|
patch: async (t, r) => {
|
|
2530
|
-
await e.update(
|
|
2582
|
+
await e.update(di, t, n(r));
|
|
2531
2583
|
}
|
|
2532
2584
|
};
|
|
2533
|
-
},
|
|
2585
|
+
}, xi = (e, t = {}) => mt({
|
|
2534
2586
|
id: "voltro-apikey",
|
|
2535
2587
|
...t.prefix ? { prefix: t.prefix } : {},
|
|
2536
2588
|
resolveKey: (t) => e.resolveByHash(t)
|
|
2537
|
-
}),
|
|
2589
|
+
}), Si = (e) => {
|
|
2538
2590
|
let t = e.subject;
|
|
2539
2591
|
return {
|
|
2540
2592
|
id: t.id ?? null,
|
|
2541
2593
|
tenantId: t.tenantId ?? null
|
|
2542
2594
|
};
|
|
2543
|
-
},
|
|
2595
|
+
}, Ci = (e, t = "/v1/api-keys") => {
|
|
2544
2596
|
let n = I.Struct({
|
|
2545
2597
|
id: I.String,
|
|
2546
2598
|
name: I.String,
|
|
@@ -2553,11 +2605,11 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2553
2605
|
createdAt: I.Number
|
|
2554
2606
|
});
|
|
2555
2607
|
return [
|
|
2556
|
-
|
|
2608
|
+
nt({
|
|
2557
2609
|
method: "POST",
|
|
2558
2610
|
path: `${t}/issue`,
|
|
2559
2611
|
summary: "Issue an API key (the token is returned ONCE).",
|
|
2560
|
-
guards: [
|
|
2612
|
+
guards: [it(ve)],
|
|
2561
2613
|
input: I.Struct({ body: I.Struct({
|
|
2562
2614
|
name: I.String,
|
|
2563
2615
|
scopes: I.optional(I.Array(I.String)),
|
|
@@ -2569,7 +2621,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2569
2621
|
keyPrefix: I.String
|
|
2570
2622
|
}),
|
|
2571
2623
|
handler: async (t, n) => {
|
|
2572
|
-
let r = t.body, i =
|
|
2624
|
+
let r = t.body, i = Si(n), a = await e.issue({
|
|
2573
2625
|
tenantId: i.tenantId,
|
|
2574
2626
|
name: r.name,
|
|
2575
2627
|
...r.scopes ? { scopes: r.scopes } : {},
|
|
@@ -2583,41 +2635,68 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2583
2635
|
};
|
|
2584
2636
|
}
|
|
2585
2637
|
}),
|
|
2586
|
-
|
|
2638
|
+
nt({
|
|
2587
2639
|
method: "GET",
|
|
2588
2640
|
path: t,
|
|
2589
2641
|
summary: "List the caller tenant's API keys (no secrets).",
|
|
2590
|
-
guards: [
|
|
2642
|
+
guards: [it(ve)],
|
|
2591
2643
|
input: I.Struct({}),
|
|
2592
2644
|
output: I.Struct({ keys: I.Array(n) }),
|
|
2593
|
-
handler: async (t, n) => ({ keys: [...await e.list(
|
|
2645
|
+
handler: async (t, n) => ({ keys: [...await e.list(Si(n).tenantId)] })
|
|
2594
2646
|
}),
|
|
2595
|
-
|
|
2647
|
+
nt({
|
|
2596
2648
|
method: "POST",
|
|
2597
2649
|
path: `${t}/revoke`,
|
|
2598
2650
|
summary: "Revoke an API key by id.",
|
|
2599
|
-
guards: [
|
|
2651
|
+
guards: [it(ve)],
|
|
2600
2652
|
input: I.Struct({ body: I.Struct({ id: I.String }) }),
|
|
2601
2653
|
output: I.Struct({ ok: I.Boolean }),
|
|
2602
2654
|
handler: async (t, n) => ({ ok: await e.revoke(t.body.id) })
|
|
2603
2655
|
})
|
|
2604
2656
|
];
|
|
2605
|
-
},
|
|
2657
|
+
}, wi = class extends I.TaggedError()("TenantScopeViolation", {
|
|
2658
|
+
table: I.String,
|
|
2659
|
+
reason: I.String
|
|
2660
|
+
}) {}, Ti = class extends I.TaggedError()("StoreOperationFailed", {
|
|
2661
|
+
operation: I.String,
|
|
2662
|
+
table: I.String,
|
|
2663
|
+
cause: I.String
|
|
2664
|
+
}) {}, Ei = class extends I.TaggedError()("TableValidationFailed", {
|
|
2665
|
+
table: I.String,
|
|
2666
|
+
summary: I.String,
|
|
2667
|
+
issues: I.Array(I.Struct({
|
|
2668
|
+
path: I.String,
|
|
2669
|
+
message: I.String
|
|
2670
|
+
}))
|
|
2671
|
+
}) {}, Di = class extends Ie.Tag("@voltro/EffectStore")() {}, Oi = (e, t) => (n) => n instanceof wi ? n : new Ti({
|
|
2672
|
+
operation: e,
|
|
2673
|
+
table: t,
|
|
2674
|
+
cause: String(n)
|
|
2675
|
+
}), ki = (e, t, n) => j.tryPromise({
|
|
2676
|
+
try: n,
|
|
2677
|
+
catch: Oi(e, t)
|
|
2678
|
+
}), Ai = (e) => M.succeed(Di, {
|
|
2679
|
+
query: ((t) => ki("query", t.table, () => e.query(t))),
|
|
2680
|
+
insert: (t, n) => ki("insert", t, () => e.insert(t, n)),
|
|
2681
|
+
update: (t, n, r) => ki("update", t, () => e.update(t, n, r)),
|
|
2682
|
+
delete: (t, n) => ki("delete", t, () => e.delete(t, n)),
|
|
2683
|
+
hardDelete: (t, n) => ki("hardDelete", t, () => e.hardDelete(t, n))
|
|
2684
|
+
}), ji = (e) => $e.make(e.name, {
|
|
2606
2685
|
payload: e.payloadSchema,
|
|
2607
|
-
success:
|
|
2686
|
+
success: we,
|
|
2608
2687
|
error: e.errorSchema
|
|
2609
|
-
}),
|
|
2688
|
+
}), Y = (e, t) => ({
|
|
2610
2689
|
id: t,
|
|
2611
2690
|
workflowName: e,
|
|
2612
2691
|
executionId: t,
|
|
2613
2692
|
status: "running"
|
|
2614
|
-
}),
|
|
2693
|
+
}), Mi = Y, Ni = (e) => {
|
|
2615
2694
|
let t = k.failureOption(e), n = t._tag === "Some" ? t.value : k.squash(e);
|
|
2616
2695
|
return {
|
|
2617
2696
|
tag: n && typeof n == "object" && "_tag" in n ? String(n._tag) : null,
|
|
2618
2697
|
message: n?.message ?? String(n)
|
|
2619
2698
|
};
|
|
2620
|
-
},
|
|
2699
|
+
}, Pi = (e, t, n) => {
|
|
2621
2700
|
if (n === void 0) return {
|
|
2622
2701
|
id: t,
|
|
2623
2702
|
workflowName: e,
|
|
@@ -2632,7 +2711,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2632
2711
|
};
|
|
2633
2712
|
if (typeof n == "object" && n && n._tag === "Complete") {
|
|
2634
2713
|
let r = n.exit;
|
|
2635
|
-
return
|
|
2714
|
+
return Be.isSuccess(r) ? {
|
|
2636
2715
|
id: t,
|
|
2637
2716
|
workflowName: e,
|
|
2638
2717
|
executionId: t,
|
|
@@ -2643,7 +2722,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2643
2722
|
workflowName: e,
|
|
2644
2723
|
executionId: t,
|
|
2645
2724
|
status: "failed",
|
|
2646
|
-
error:
|
|
2725
|
+
error: Ni(r.cause)
|
|
2647
2726
|
};
|
|
2648
2727
|
}
|
|
2649
2728
|
return {
|
|
@@ -2652,17 +2731,17 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2652
2731
|
executionId: t,
|
|
2653
2732
|
status: "running"
|
|
2654
2733
|
};
|
|
2655
|
-
},
|
|
2734
|
+
}, Fi = (e) => new Promise((t) => setTimeout(t, e)), Ii = (e) => {
|
|
2656
2735
|
let t = new Map(e.workflows.map((e) => [e.definition.name, e.definition])), n = (e) => {
|
|
2657
2736
|
let n = t.get(e);
|
|
2658
2737
|
if (!n) throw Error(`Unknown workflow: ${e}`);
|
|
2659
2738
|
return n;
|
|
2660
2739
|
}, r = async (t, r) => {
|
|
2661
2740
|
let i = n(t);
|
|
2662
|
-
return
|
|
2663
|
-
}, i = async () => e.runEffect(
|
|
2741
|
+
return Pi(t, r, await e.runEffect(i.poll(r)));
|
|
2742
|
+
}, i = async () => e.runEffect(ht()), a = async (t, r, i) => {
|
|
2664
2743
|
let a = n(t), o;
|
|
2665
|
-
return i?.callerContext !== void 0 && (o = await e.runEffect(a.executionId(r)), await e.rememberStartContext?.(t, o, i.callerContext)), i?.wait ? (await e.runEffect(a.execute(r)),
|
|
2744
|
+
return i?.callerContext !== void 0 && (o = await e.runEffect(a.executionId(r)), await e.rememberStartContext?.(t, o, i.callerContext)), i?.wait ? (await e.runEffect(a.execute(r)), Y(t, o ?? await e.runEffect(a.executionId(r)))) : Y(t, await e.runEffect(a.execute(r, { discard: !0 })));
|
|
2666
2745
|
};
|
|
2667
2746
|
return {
|
|
2668
2747
|
start: a,
|
|
@@ -2700,7 +2779,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2700
2779
|
let e = await r(i, a);
|
|
2701
2780
|
if (e.status === "succeeded" || e.status === "failed" || e.status === "cancelled") return e;
|
|
2702
2781
|
if (o?.timeoutMs !== void 0 && Date.now() - s >= o.timeoutMs) throw Error(`Timed out waiting for workflow '${i}' run '${a}'`);
|
|
2703
|
-
await
|
|
2782
|
+
await Fi(c);
|
|
2704
2783
|
}
|
|
2705
2784
|
}),
|
|
2706
2785
|
cancel: async (t, r) => {
|
|
@@ -2738,22 +2817,22 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2738
2817
|
return e.retry(t, n);
|
|
2739
2818
|
}
|
|
2740
2819
|
};
|
|
2741
|
-
},
|
|
2820
|
+
}, Li = (e, t) => ({
|
|
2742
2821
|
...e,
|
|
2743
2822
|
start: async (n, r, i) => {
|
|
2744
2823
|
if (i?.wait) throw Error("ctx.workflows.start(..., { wait: true }) is not allowed inside a mutation transaction; start the workflow and wait after commit.");
|
|
2745
2824
|
let a = await e.executionId(n, r);
|
|
2746
|
-
return t(() => e.start(n, r)),
|
|
2825
|
+
return t(() => e.start(n, r)), Y(n, a);
|
|
2747
2826
|
},
|
|
2748
2827
|
child: async (n, r, i) => {
|
|
2749
2828
|
if (i?.wait) throw Error("ctx.workflows.child(..., { wait: true }) is not allowed inside a mutation transaction; start the child workflow and wait after commit.");
|
|
2750
2829
|
let a = await e.executionId(n, r);
|
|
2751
|
-
return t(() => e.child(n, r, i)),
|
|
2830
|
+
return t(() => e.child(n, r, i)), Y(n, a);
|
|
2752
2831
|
},
|
|
2753
2832
|
run: async () => {
|
|
2754
2833
|
throw Error("ctx.workflows.run(...) is not allowed inside a mutation transaction; use ctx.workflows.start(...) so the workflow starts after commit.");
|
|
2755
2834
|
}
|
|
2756
|
-
}),
|
|
2835
|
+
}), Ri = (e, t) => ({
|
|
2757
2836
|
...e,
|
|
2758
2837
|
start: (n, r, i) => e.start(n, r, {
|
|
2759
2838
|
...i,
|
|
@@ -2767,7 +2846,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2767
2846
|
...i,
|
|
2768
2847
|
callerContext: t
|
|
2769
2848
|
})
|
|
2770
|
-
}),
|
|
2849
|
+
}), zi = (e) => {
|
|
2771
2850
|
let t = () => {
|
|
2772
2851
|
let t = e();
|
|
2773
2852
|
if (!t) throw Error("Workflow runtime is not ready yet");
|
|
@@ -2788,55 +2867,55 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2788
2867
|
listRuns: ((e) => t().listRuns(e)),
|
|
2789
2868
|
retry: (e, n) => t().retry(e, n)
|
|
2790
2869
|
};
|
|
2791
|
-
},
|
|
2870
|
+
}, Bi = (e, t) => {
|
|
2792
2871
|
let n = {};
|
|
2793
|
-
for (let r of e) n[r.definition.name] = (e) => (t ? j.promise(() => t.start(r.definition.name, e)) : r.definition.execute(e, { discard: !0 }).pipe(j.map((e) =>
|
|
2872
|
+
for (let r of e) n[r.definition.name] = (e) => (t ? j.promise(() => t.start(r.definition.name, e)) : r.definition.execute(e, { discard: !0 }).pipe(j.map((e) => Y(r.definition.name, e)))).pipe(j.withSpan(`workflow.${r.definition.name}`, { attributes: { "framework.kind": "workflow" } }));
|
|
2794
2873
|
return n;
|
|
2795
|
-
},
|
|
2874
|
+
}, Vi = (e, t, n) => e.map((e) => e.definition.toLayer(((r, i) => {
|
|
2796
2875
|
let a = t.resolveStartContext?.(e.definition.name, i);
|
|
2797
2876
|
return (a === void 0 ? j.succeed(void 0) : j.promise(() => Promise.resolve(a))).pipe(j.flatMap((a) => {
|
|
2798
|
-
let o =
|
|
2877
|
+
let o = t.buildContext(a, {
|
|
2799
2878
|
workflowName: e.definition.name,
|
|
2800
2879
|
executionId: i,
|
|
2801
2880
|
parentExecutionId: a?.parentExecutionId ?? null,
|
|
2802
2881
|
parentClosePolicy: a?.parentClosePolicy ?? null
|
|
2803
|
-
}));
|
|
2804
|
-
return
|
|
2882
|
+
}), s = e.buildExecute(o), c = (n?.(e, s, a) ?? s)(r, i), l = o?.store;
|
|
2883
|
+
return l === void 0 ? c : j.provide(c, Ai(l));
|
|
2805
2884
|
}));
|
|
2806
|
-
}))),
|
|
2885
|
+
}))), Hi = (e) => ({
|
|
2807
2886
|
_tag: "workflowEventTrigger",
|
|
2808
2887
|
...e
|
|
2809
|
-
}),
|
|
2888
|
+
}), Ui = Hi, Wi = (e) => typeof e == "object" && !!e && e._tag === "workflowEventTrigger", Gi = () => {
|
|
2810
2889
|
let e = globalThis.crypto;
|
|
2811
2890
|
return typeof e?.randomUUID == "function" ? e.randomUUID() : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
|
|
2812
|
-
},
|
|
2891
|
+
}, Ki = (e) => `${e}_${Gi()}`, qi = (e) => e.id ?? `${e.event}->${e.workflow}`, Ji = T("_voltro_workflow_events", {
|
|
2813
2892
|
id: v({ prefix: "wfe" }),
|
|
2814
|
-
name:
|
|
2815
|
-
payload:
|
|
2816
|
-
source:
|
|
2817
|
-
subject:
|
|
2818
|
-
traceId:
|
|
2819
|
-
occurredAt:
|
|
2820
|
-
}).index(["name"]).index(["source"]).index(["occurredAt"]).reactive(),
|
|
2893
|
+
name: E(),
|
|
2894
|
+
payload: C(),
|
|
2895
|
+
source: E(),
|
|
2896
|
+
subject: C().nullable(),
|
|
2897
|
+
traceId: E().nullable(),
|
|
2898
|
+
occurredAt: D().default("now")
|
|
2899
|
+
}).index(["name"]).index(["source"]).index(["occurredAt"]).reactive(), Yi = T("_voltro_workflow_event_deliveries", {
|
|
2821
2900
|
id: v({ prefix: "wfed" }),
|
|
2822
|
-
eventId:
|
|
2823
|
-
eventName:
|
|
2824
|
-
triggerId:
|
|
2825
|
-
workflowName:
|
|
2826
|
-
executionId:
|
|
2827
|
-
status:
|
|
2901
|
+
eventId: E(),
|
|
2902
|
+
eventName: E(),
|
|
2903
|
+
triggerId: E(),
|
|
2904
|
+
workflowName: E(),
|
|
2905
|
+
executionId: E().nullable(),
|
|
2906
|
+
status: E().oneOf([
|
|
2828
2907
|
"starting",
|
|
2829
2908
|
"started",
|
|
2830
2909
|
"skipped",
|
|
2831
2910
|
"failed"
|
|
2832
2911
|
]).default("starting"),
|
|
2833
|
-
idempotencyKey:
|
|
2912
|
+
idempotencyKey: E().unique(),
|
|
2834
2913
|
skipped: r().default(!1),
|
|
2835
|
-
errorMessage:
|
|
2836
|
-
createdAt:
|
|
2837
|
-
completedAt:
|
|
2838
|
-
}).index(["eventId"]).index(["eventName"]).index(["triggerId"]).index(["workflowName"]).index(["status"]).reactive(),
|
|
2839
|
-
let t = e.makeId ??
|
|
2914
|
+
errorMessage: E().nullable(),
|
|
2915
|
+
createdAt: D().default("now"),
|
|
2916
|
+
completedAt: D().nullable()
|
|
2917
|
+
}).index(["eventId"]).index(["eventName"]).index(["triggerId"]).index(["workflowName"]).index(["status"]).reactive(), Xi = (e) => {
|
|
2918
|
+
let t = e.makeId ?? Ki, n = /* @__PURE__ */ new Map();
|
|
2840
2919
|
for (let t of e.triggers) {
|
|
2841
2920
|
let e = n.get(t.event);
|
|
2842
2921
|
e ? e.push(t) : n.set(t.event, [t]);
|
|
@@ -2877,7 +2956,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2877
2956
|
});
|
|
2878
2957
|
let p = o(n), m = [];
|
|
2879
2958
|
for (let o of p) {
|
|
2880
|
-
let s =
|
|
2959
|
+
let s = qi(o), l = o.workflow, d;
|
|
2881
2960
|
try {
|
|
2882
2961
|
let p = o.idempotencyKey?.(f) ?? `${c}:${s}`;
|
|
2883
2962
|
if (o.filter && !await o.filter(f)) {
|
|
@@ -2980,11 +3059,266 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
2980
3059
|
triggered: m
|
|
2981
3060
|
};
|
|
2982
3061
|
} };
|
|
2983
|
-
},
|
|
3062
|
+
}, Zi = O({ scope: "voltro:outbox" }), X = "_voltro_outbox", Qi = {
|
|
3063
|
+
kind: "typeid",
|
|
3064
|
+
prefix: "obx"
|
|
3065
|
+
}, $i = T(X, {
|
|
3066
|
+
id: v({ prefix: "obx" }),
|
|
3067
|
+
effect: E(),
|
|
3068
|
+
payload: C(),
|
|
3069
|
+
status: E(),
|
|
3070
|
+
attempts: b(),
|
|
3071
|
+
maxAttempts: b(),
|
|
3072
|
+
nextAttemptAt: D(),
|
|
3073
|
+
idempotencyKey: E().nullable(),
|
|
3074
|
+
lastError: E().nullable(),
|
|
3075
|
+
subjectId: E().nullable(),
|
|
3076
|
+
tenantId: E().nullable(),
|
|
3077
|
+
traceId: E().nullable(),
|
|
3078
|
+
createdAt: D(),
|
|
3079
|
+
deliveredAt: D().nullable()
|
|
3080
|
+
}), ea = (e) => {
|
|
3081
|
+
if (e.effect.trim() === "") throw Error("defineOutboxHandler: `effect` must be a non-empty name");
|
|
3082
|
+
if (e.maxAttempts !== void 0 && e.maxAttempts < 1) throw Error(`defineOutboxHandler("${e.effect}"): maxAttempts must be >= 1`);
|
|
3083
|
+
return e;
|
|
3084
|
+
}, ta = 8, na = (e) => ({ enqueue: async (n, r, i) => {
|
|
3085
|
+
let a = (e.now ?? (() => /* @__PURE__ */ new Date()))(), o = i?.idempotencyKey;
|
|
3086
|
+
if (o !== void 0) {
|
|
3087
|
+
let n = (await e.store.query({
|
|
3088
|
+
table: X,
|
|
3089
|
+
predicate: t(u("idempotencyKey", o), u("status", "pending")),
|
|
3090
|
+
order: [],
|
|
3091
|
+
take: 1,
|
|
3092
|
+
skip: void 0,
|
|
3093
|
+
projection: void 0
|
|
3094
|
+
}))[0];
|
|
3095
|
+
if (n !== void 0) return n.id;
|
|
3096
|
+
}
|
|
3097
|
+
let s = {
|
|
3098
|
+
id: f(Qi, X),
|
|
3099
|
+
effect: n,
|
|
3100
|
+
payload: r,
|
|
3101
|
+
status: "pending",
|
|
3102
|
+
attempts: 0,
|
|
3103
|
+
maxAttempts: i?.maxAttempts ?? ta,
|
|
3104
|
+
nextAttemptAt: new Date(a.getTime() + (i?.delayMs ?? 0)),
|
|
3105
|
+
idempotencyKey: o ?? null,
|
|
3106
|
+
lastError: null,
|
|
3107
|
+
subjectId: e.subject.id ?? null,
|
|
3108
|
+
tenantId: e.subject.tenantId ?? null,
|
|
3109
|
+
traceId: e.traceId,
|
|
3110
|
+
createdAt: a,
|
|
3111
|
+
deliveredAt: null
|
|
3112
|
+
}, c = await e.store.insert(X, s);
|
|
3113
|
+
if (e.afterCommit !== void 0 && e.nudge !== void 0) {
|
|
3114
|
+
let t = e.nudge;
|
|
3115
|
+
e.afterCommit(async () => {
|
|
3116
|
+
t();
|
|
3117
|
+
});
|
|
3118
|
+
}
|
|
3119
|
+
return c.id ?? s.id;
|
|
3120
|
+
} }), ra = (e) => Math.min(1e3 * 2 ** Math.max(0, e - 1), 5 * 6e4), ia = async (e) => {
|
|
3121
|
+
let n = (e.now ?? (() => /* @__PURE__ */ new Date()))(), r = await e.store.query({
|
|
3122
|
+
table: X,
|
|
3123
|
+
predicate: t(u("status", "pending"), ne("nextAttemptAt", n)),
|
|
3124
|
+
order: [{
|
|
3125
|
+
column: "nextAttemptAt",
|
|
3126
|
+
direction: "asc"
|
|
3127
|
+
}],
|
|
3128
|
+
take: e.batchSize ?? 50,
|
|
3129
|
+
skip: void 0,
|
|
3130
|
+
projection: void 0
|
|
3131
|
+
}), i = 0, a = 0, o = 0, s = 0;
|
|
3132
|
+
for (let t of r) {
|
|
3133
|
+
let r = t.id, c = t.effect, l = e.handlers.get(c);
|
|
3134
|
+
if (l === void 0) {
|
|
3135
|
+
s++;
|
|
3136
|
+
continue;
|
|
3137
|
+
}
|
|
3138
|
+
let u = t.attempts + 1, d = t.maxAttempts ?? ta;
|
|
3139
|
+
try {
|
|
3140
|
+
await l.handler({
|
|
3141
|
+
payload: t.payload ?? {},
|
|
3142
|
+
attempt: u,
|
|
3143
|
+
subjectId: t.subjectId ?? null,
|
|
3144
|
+
tenantId: t.tenantId ?? null,
|
|
3145
|
+
traceId: t.traceId ?? null
|
|
3146
|
+
}), await e.store.update(X, r, {
|
|
3147
|
+
status: "delivered",
|
|
3148
|
+
attempts: u,
|
|
3149
|
+
deliveredAt: /* @__PURE__ */ new Date(),
|
|
3150
|
+
lastError: null
|
|
3151
|
+
}), i++;
|
|
3152
|
+
} catch (t) {
|
|
3153
|
+
let i = t instanceof Error ? t.message : String(t), s = u >= d;
|
|
3154
|
+
await e.store.update(X, r, {
|
|
3155
|
+
status: s ? "dead" : "pending",
|
|
3156
|
+
attempts: u,
|
|
3157
|
+
lastError: i,
|
|
3158
|
+
nextAttemptAt: new Date(n.getTime() + ra(u))
|
|
3159
|
+
}), s ? (o++, Zi.error("outbox effect dead-lettered after exhausting attempts", {
|
|
3160
|
+
id: r,
|
|
3161
|
+
effect: c,
|
|
3162
|
+
attempts: u,
|
|
3163
|
+
maxAttempts: d
|
|
3164
|
+
}, t)) : (a++, Zi.warn("outbox delivery failed; will retry", {
|
|
3165
|
+
id: r,
|
|
3166
|
+
effect: c,
|
|
3167
|
+
attempt: u,
|
|
3168
|
+
maxAttempts: d,
|
|
3169
|
+
retryInMs: ra(u)
|
|
3170
|
+
}));
|
|
3171
|
+
}
|
|
3172
|
+
}
|
|
3173
|
+
return {
|
|
3174
|
+
delivered: i,
|
|
3175
|
+
failed: a,
|
|
3176
|
+
dead: o,
|
|
3177
|
+
skipped: s
|
|
3178
|
+
};
|
|
3179
|
+
}, aa = "admin:full", oa = class extends I.TaggedError()("AccessDenied", {
|
|
3180
|
+
action: I.String,
|
|
3181
|
+
resourceType: I.String,
|
|
3182
|
+
resourceId: I.String
|
|
3183
|
+
}) {}, sa = /* @__PURE__ */ new Map(), ca = (e) => {
|
|
3184
|
+
if (typeof e.resourceType != "string" || e.resourceType.length === 0) throw Error("defineResourcePolicy: a non-empty `resourceType` is required");
|
|
3185
|
+
if (e.actions === void 0 || Object.keys(e.actions).length === 0) throw Error(`resource policy '${e.resourceType}': at least one action is required`);
|
|
3186
|
+
if (sa.has(e.resourceType)) throw Error(`resource policy '${e.resourceType}' is already registered — types must be unique`);
|
|
3187
|
+
return sa.set(e.resourceType, e), e;
|
|
3188
|
+
}, la = (e) => sa.get(e), ua = () => [...sa.values()], da = () => sa.clear(), fa = () => ua().map((e) => {
|
|
3189
|
+
let t = /* @__PURE__ */ new Set();
|
|
3190
|
+
for (let n of Object.values(e.actions)) for (let e of n) t.add(e);
|
|
3191
|
+
for (let [n, r] of Object.entries(e.implies ?? {})) {
|
|
3192
|
+
t.add(n);
|
|
3193
|
+
for (let e of r) t.add(e);
|
|
3194
|
+
}
|
|
3195
|
+
return {
|
|
3196
|
+
resourceType: e.resourceType,
|
|
3197
|
+
actions: e.actions,
|
|
3198
|
+
relations: [...t],
|
|
3199
|
+
implies: e.implies ?? {}
|
|
3200
|
+
};
|
|
3201
|
+
}), pa = (e, t) => {
|
|
3202
|
+
let n = new Set(e);
|
|
3203
|
+
if (t === void 0) return n;
|
|
3204
|
+
let r = [...e];
|
|
3205
|
+
for (; r.length > 0;) {
|
|
3206
|
+
let e = r.pop();
|
|
3207
|
+
for (let i of t[e] ?? []) n.has(i) || (n.add(i), r.push(i));
|
|
3208
|
+
}
|
|
3209
|
+
return n;
|
|
3210
|
+
}, ma = (e, t, n, r) => e.id === null ? /* @__PURE__ */ new Set() : pa(n.filter((n) => n.subjectId === e.id && n.resourceType === t.type && n.resourceId === t.id).map((e) => e.relation), r.implies), ha = (e, t, n, r) => {
|
|
3211
|
+
if (e.scopes?.includes("admin:full")) return !0;
|
|
3212
|
+
if (e.id === null || n.tenantId != null && e.tenantId !== n.tenantId) return !1;
|
|
3213
|
+
let i = r.policy.actions[t];
|
|
3214
|
+
if (i === void 0 || i.length === 0) return !1;
|
|
3215
|
+
let a = ma(e, n, r.tuples, r.policy);
|
|
3216
|
+
return i.some((e) => a.has(e));
|
|
3217
|
+
}, ga = (e, t, n, r) => {
|
|
3218
|
+
if (!ha(e, t, n, r)) throw new oa({
|
|
3219
|
+
action: t,
|
|
3220
|
+
resourceType: n.type,
|
|
3221
|
+
resourceId: n.id
|
|
3222
|
+
});
|
|
3223
|
+
}, _a = (e, t, n, r, i) => r.filter((r) => ha(e, t, {
|
|
3224
|
+
type: n,
|
|
3225
|
+
id: r.id,
|
|
3226
|
+
...r.tenantId === void 0 ? {} : { tenantId: r.tenantId }
|
|
3227
|
+
}, i)), va = (e, t) => {
|
|
3228
|
+
let n = new Set(t.map((e) => e.id));
|
|
3229
|
+
return e.filter((e) => !n.has(e.id)).map((e) => e.id);
|
|
3230
|
+
}, ya = O({ scope: "voltro:policy" }), ba, xa = (e) => {
|
|
3231
|
+
ba = e;
|
|
3232
|
+
}, Sa = () => ba, Ca = () => {
|
|
3233
|
+
Me((e) => j.gen(function* () {
|
|
3234
|
+
let t = la(e.resourceType);
|
|
3235
|
+
if (t === void 0) return ya.warn("policy guard denied — no resource policy registered for this type", {
|
|
3236
|
+
resourceType: e.resourceType,
|
|
3237
|
+
action: e.action
|
|
3238
|
+
}), !1;
|
|
3239
|
+
let n = ba;
|
|
3240
|
+
if (n === void 0) return ya.warn("policy guard denied — no tuple source registered (call setTupleSource at boot)", {
|
|
3241
|
+
resourceType: e.resourceType,
|
|
3242
|
+
action: e.action
|
|
3243
|
+
}), !1;
|
|
3244
|
+
let r = yield* j.tryPromise({
|
|
3245
|
+
try: async () => n({
|
|
3246
|
+
subjectId: e.subject.id,
|
|
3247
|
+
resourceType: e.resourceType,
|
|
3248
|
+
resourceId: e.resourceId
|
|
3249
|
+
}),
|
|
3250
|
+
catch: (e) => e
|
|
3251
|
+
}).pipe(j.catchAll((t) => (ya.error("policy guard denied — tuple source failed", {
|
|
3252
|
+
resourceType: e.resourceType,
|
|
3253
|
+
resourceId: e.resourceId
|
|
3254
|
+
}, t), j.succeed([])))), i = e.subject;
|
|
3255
|
+
return ha({
|
|
3256
|
+
id: e.subject.id,
|
|
3257
|
+
tenantId: i.tenantId ?? null,
|
|
3258
|
+
...i.scopes === void 0 ? {} : { scopes: i.scopes }
|
|
3259
|
+
}, e.action, {
|
|
3260
|
+
type: e.resourceType,
|
|
3261
|
+
id: e.resourceId,
|
|
3262
|
+
tenantId: i.tenantId ?? null
|
|
3263
|
+
}, {
|
|
3264
|
+
policy: t,
|
|
3265
|
+
tuples: r
|
|
3266
|
+
});
|
|
3267
|
+
}));
|
|
3268
|
+
}, wa = (e) => {
|
|
3269
|
+
Promise.resolve().then(e);
|
|
3270
|
+
}, Ta = (e) => {
|
|
3271
|
+
let t = e.schedule ?? wa, n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map(), i = (e, t) => `${e}${t}`, a = async (t) => {
|
|
3272
|
+
let a = r.get(t);
|
|
3273
|
+
if (a === void 0) return;
|
|
3274
|
+
r.delete(t);
|
|
3275
|
+
let o = [...a.ids].filter((e) => !n.has(i(t, e)));
|
|
3276
|
+
try {
|
|
3277
|
+
if (o.length > 0) {
|
|
3278
|
+
let r = await e.store.query({
|
|
3279
|
+
table: t,
|
|
3280
|
+
predicate: y("id", o),
|
|
3281
|
+
order: [],
|
|
3282
|
+
take: void 0,
|
|
3283
|
+
skip: void 0,
|
|
3284
|
+
projection: void 0
|
|
3285
|
+
}), a = new Map(r.map((e) => [String(e.id), e]));
|
|
3286
|
+
for (let e of o) n.set(i(t, e), a.get(e) ?? null);
|
|
3287
|
+
}
|
|
3288
|
+
for (let e of a.waiters) e.resolve(e.ids.map((e) => n.get(i(t, e)) ?? null));
|
|
3289
|
+
} catch (e) {
|
|
3290
|
+
for (let t of a.waiters) t.reject(e);
|
|
3291
|
+
}
|
|
3292
|
+
}, o = (e, o) => {
|
|
3293
|
+
if (o.length === 0) return Promise.resolve([]);
|
|
3294
|
+
if (o.every((t) => n.has(i(e, t)))) return Promise.resolve(o.map((t) => n.get(i(e, t)) ?? null));
|
|
3295
|
+
let s = r.get(e);
|
|
3296
|
+
s === void 0 && (s = {
|
|
3297
|
+
ids: /* @__PURE__ */ new Set(),
|
|
3298
|
+
waiters: [],
|
|
3299
|
+
scheduled: !1
|
|
3300
|
+
}, r.set(e, s));
|
|
3301
|
+
for (let e of o) s.ids.add(e);
|
|
3302
|
+
let c = new Promise((e, t) => {
|
|
3303
|
+
s.waiters.push({
|
|
3304
|
+
ids: o,
|
|
3305
|
+
resolve: e,
|
|
3306
|
+
reject: t
|
|
3307
|
+
});
|
|
3308
|
+
});
|
|
3309
|
+
return s.scheduled || (s.scheduled = !0, t(() => {
|
|
3310
|
+
a(e);
|
|
3311
|
+
})), c;
|
|
3312
|
+
};
|
|
3313
|
+
return {
|
|
3314
|
+
load: async (e, t) => (await o(e, [t]))[0] ?? null,
|
|
3315
|
+
loadMany: (e, t) => o(e, t)
|
|
3316
|
+
};
|
|
3317
|
+
}, Ea = M.effect(qe.HttpClient, j.map(qe.HttpClient, (e) => e.pipe(qe.mapRequestEffect((e) => j.currentSpan.pipe(j.map((t) => e.headers.traceparent === void 0 ? Je.setHeader(e, "traceparent", Vn({
|
|
2984
3318
|
traceId: t.traceId,
|
|
2985
3319
|
spanId: t.spanId,
|
|
2986
3320
|
sampled: t.sampled
|
|
2987
|
-
})) : e), j.catchAll(() => j.succeed(e))))))),
|
|
3321
|
+
})) : e), j.catchAll(() => j.succeed(e))))))), Da = "voltro/audit", Oa = "voltro/softDelete", ka = "voltro/tenant", Aa = (e) => {
|
|
2988
3322
|
let t = /* @__PURE__ */ new Map();
|
|
2989
3323
|
for (let n of e) {
|
|
2990
3324
|
let e = /* @__PURE__ */ new Set();
|
|
@@ -3027,48 +3361,49 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3027
3361
|
return !1;
|
|
3028
3362
|
},
|
|
3029
3363
|
idScheme: (e) => t.get(e)?.idScheme,
|
|
3030
|
-
defaultFactories: (e) => t.get(e)?.defaultFactories ??
|
|
3031
|
-
computedFields: (e) => t.get(e)?.computedFields ??
|
|
3364
|
+
defaultFactories: (e) => t.get(e)?.defaultFactories ?? ja,
|
|
3365
|
+
computedFields: (e) => t.get(e)?.computedFields ?? Ma,
|
|
3032
3366
|
insertSchema: (e) => t.get(e)?.insertSchema,
|
|
3033
3367
|
validatePatchSchema: (e) => t.get(e)?.validatePatchSchema
|
|
3034
3368
|
};
|
|
3035
|
-
},
|
|
3036
|
-
table
|
|
3037
|
-
|
|
3038
|
-
|
|
3039
|
-
|
|
3369
|
+
}, ja = /* @__PURE__ */ new Map(), Ma = /* @__PURE__ */ new Map(), Na = Aa([]), Pa = class extends I.TaggedError()("NoRowFound", {
|
|
3370
|
+
table: I.String,
|
|
3371
|
+
found: I.Number
|
|
3372
|
+
}) {
|
|
3373
|
+
get message() {
|
|
3374
|
+
return this.found === 0 ? `expected exactly one row in '${this.table}', found none` : `expected exactly one row in '${this.table}', found more than one`;
|
|
3040
3375
|
}
|
|
3041
|
-
},
|
|
3042
|
-
table
|
|
3043
|
-
expected
|
|
3044
|
-
|
|
3045
|
-
|
|
3046
|
-
|
|
3376
|
+
}, Fa = class extends I.TaggedError()("OptimisticLockError", {
|
|
3377
|
+
table: I.String,
|
|
3378
|
+
expected: I.Number
|
|
3379
|
+
}) {
|
|
3380
|
+
get message() {
|
|
3381
|
+
return `optimistic lock failed on '${this.table}': expected version ${this.expected}`;
|
|
3047
3382
|
}
|
|
3048
|
-
},
|
|
3049
|
-
if (e.length === 1 &&
|
|
3383
|
+
}, Ia = (e) => typeof e == "object" && !!e && ("and" in e || "or" in e || "not" in e || "op" in e || "subquery" in e), La = (e) => {
|
|
3384
|
+
if (e.length === 1 && Ia(e[0])) return e[0];
|
|
3050
3385
|
let t = e[0];
|
|
3051
3386
|
if (e.length === 2) return u(t, e[1]);
|
|
3052
3387
|
let n = e[1], r = e[2];
|
|
3053
3388
|
switch (n) {
|
|
3054
3389
|
case "=": return u(t, r);
|
|
3055
3390
|
case "!=":
|
|
3056
|
-
case "<>": return
|
|
3391
|
+
case "<>": return w(t, r);
|
|
3057
3392
|
case ">": return h(t, r);
|
|
3058
3393
|
case ">=": return g(t, r);
|
|
3059
|
-
case "<": return
|
|
3060
|
-
case "<=": return
|
|
3394
|
+
case "<": return te(t, r);
|
|
3395
|
+
case "<=": return ne(t, r);
|
|
3061
3396
|
case "in": return y(t, r);
|
|
3062
3397
|
case "like":
|
|
3063
3398
|
case "contains":
|
|
3064
3399
|
case "fts": return o(t, r);
|
|
3065
3400
|
default: return u(t, r);
|
|
3066
3401
|
}
|
|
3067
|
-
},
|
|
3402
|
+
}, Ra = (e) => {
|
|
3068
3403
|
let t = m(e);
|
|
3069
3404
|
if (t === void 0) throw Error(`unknown table '${e}' — is it declared with table()?`);
|
|
3070
|
-
return
|
|
3071
|
-
},
|
|
3405
|
+
return ie(t);
|
|
3406
|
+
}, za = class e {
|
|
3072
3407
|
backend;
|
|
3073
3408
|
scope;
|
|
3074
3409
|
table;
|
|
@@ -3082,7 +3417,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3082
3417
|
return new e(this.backend, this.scope, this.table, t, this.skipTenant, this.skipSoftDelete);
|
|
3083
3418
|
}
|
|
3084
3419
|
where(...e) {
|
|
3085
|
-
return this.clone(this.query.where(
|
|
3420
|
+
return this.clone(this.query.where(La(e)));
|
|
3086
3421
|
}
|
|
3087
3422
|
orderBy(e, t = "asc") {
|
|
3088
3423
|
return this.clone(this.query.orderBy(e, t));
|
|
@@ -3116,7 +3451,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3116
3451
|
}
|
|
3117
3452
|
scopedQuery() {
|
|
3118
3453
|
let e = this.query, { subject: t, schemaRegistry: n } = this.scope;
|
|
3119
|
-
return !this.skipTenant && n.hasTenant(this.table) && t.tenantId != null && (e = e.where(u("tenantId", t.tenantId))), !this.skipSoftDelete && n.hasSoftDelete(this.table) && (e = e.where(
|
|
3454
|
+
return !this.skipTenant && n.hasTenant(this.table) && t.tenantId != null && (e = e.where(u("tenantId", t.tenantId))), !this.skipSoftDelete && n.hasSoftDelete(this.table) && (e = e.where(S("deletedAt"))), e;
|
|
3120
3455
|
}
|
|
3121
3456
|
async all() {
|
|
3122
3457
|
return this.backend.query(this.scopedQuery().descriptor);
|
|
@@ -3128,9 +3463,16 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3128
3463
|
return this.maybeOne();
|
|
3129
3464
|
}
|
|
3130
3465
|
async one() {
|
|
3131
|
-
let e = await this.
|
|
3132
|
-
if (
|
|
3133
|
-
|
|
3466
|
+
let e = await this.backend.query(this.scopedQuery().limit(2).descriptor), t = e[0];
|
|
3467
|
+
if (t === void 0) throw new Pa({
|
|
3468
|
+
table: this.table,
|
|
3469
|
+
found: 0
|
|
3470
|
+
});
|
|
3471
|
+
if (e.length > 1) throw new Pa({
|
|
3472
|
+
table: this.table,
|
|
3473
|
+
found: e.length
|
|
3474
|
+
});
|
|
3475
|
+
return t;
|
|
3134
3476
|
}
|
|
3135
3477
|
async count() {
|
|
3136
3478
|
let e = (await this.backend.query(this.scopedQuery().count().descriptor))[0]?.count;
|
|
@@ -3142,7 +3484,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3142
3484
|
get descriptor() {
|
|
3143
3485
|
return this.scopedQuery().descriptor;
|
|
3144
3486
|
}
|
|
3145
|
-
},
|
|
3487
|
+
}, Ba = class {
|
|
3146
3488
|
backend;
|
|
3147
3489
|
scope;
|
|
3148
3490
|
table;
|
|
@@ -3153,7 +3495,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3153
3495
|
this.backend = e, this.scope = t, this.table = n;
|
|
3154
3496
|
}
|
|
3155
3497
|
where(...e) {
|
|
3156
|
-
let n =
|
|
3498
|
+
let n = La(e);
|
|
3157
3499
|
return this.predicate = this.predicate ? t(this.predicate, n) : n, this;
|
|
3158
3500
|
}
|
|
3159
3501
|
unscoped() {
|
|
@@ -3177,13 +3519,16 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3177
3519
|
}
|
|
3178
3520
|
async set(e) {
|
|
3179
3521
|
let t = await this.backend.updateMany(this.table, e, { where: this.scopedWhere() });
|
|
3180
|
-
if (this.expectedVersion !== void 0 && t === 0) throw new
|
|
3522
|
+
if (this.expectedVersion !== void 0 && t === 0) throw new Fa({
|
|
3523
|
+
table: this.table,
|
|
3524
|
+
expected: this.expectedVersion
|
|
3525
|
+
});
|
|
3181
3526
|
return t;
|
|
3182
3527
|
}
|
|
3183
3528
|
async restore() {
|
|
3184
3529
|
return this.backend.updateMany(this.table, { deletedAt: null }, { where: this.scopedWhere() });
|
|
3185
3530
|
}
|
|
3186
|
-
},
|
|
3531
|
+
}, Va = class {
|
|
3187
3532
|
backend;
|
|
3188
3533
|
scope;
|
|
3189
3534
|
table;
|
|
@@ -3193,7 +3538,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3193
3538
|
this.backend = e, this.scope = t, this.table = n;
|
|
3194
3539
|
}
|
|
3195
3540
|
where(...e) {
|
|
3196
|
-
let n =
|
|
3541
|
+
let n = La(e);
|
|
3197
3542
|
return this.predicate = this.predicate ? t(this.predicate, n) : n, this;
|
|
3198
3543
|
}
|
|
3199
3544
|
unscoped() {
|
|
@@ -3214,46 +3559,32 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3214
3559
|
async hard() {
|
|
3215
3560
|
return this.backend.deleteMany(this.table, { where: this.scopedWhere() });
|
|
3216
3561
|
}
|
|
3217
|
-
},
|
|
3218
|
-
select: (n) => new
|
|
3219
|
-
updateWhere: (n) => new
|
|
3220
|
-
deleteWhere: (n) => new
|
|
3221
|
-
}),
|
|
3222
|
-
table: I.String,
|
|
3223
|
-
reason: I.String
|
|
3224
|
-
}) {}, ta = class extends I.TaggedError()("StoreOperationFailed", {
|
|
3225
|
-
operation: I.String,
|
|
3226
|
-
table: I.String,
|
|
3227
|
-
cause: I.String
|
|
3228
|
-
}) {}, na = class extends I.TaggedError()("TableValidationFailed", {
|
|
3229
|
-
table: I.String,
|
|
3230
|
-
summary: I.String,
|
|
3231
|
-
issues: I.Array(I.Struct({
|
|
3232
|
-
path: I.String,
|
|
3233
|
-
message: I.String
|
|
3234
|
-
}))
|
|
3235
|
-
}) {}, ra = "id", ia = (e, t) => {
|
|
3562
|
+
}, Ha = (e, t) => ({
|
|
3563
|
+
select: (n) => new za(e, t, n, Ra(n)),
|
|
3564
|
+
updateWhere: (n) => new Ba(e, t, n),
|
|
3565
|
+
deleteWhere: (n) => new Va(e, t, n)
|
|
3566
|
+
}), Ua = "id", Wa = (e, t) => {
|
|
3236
3567
|
let n = {};
|
|
3237
3568
|
for (let r of t) e[r] !== void 0 && (n[r] = e[r]);
|
|
3238
3569
|
return n;
|
|
3239
|
-
},
|
|
3240
|
-
throw new
|
|
3570
|
+
}, Ga = "cannot insert into tenant-scoped table without an authenticated tenant — subject.tenantId is null. Either authenticate first or pass tenantId explicitly in the row (admin tooling).", Ka = (e) => {
|
|
3571
|
+
throw new wi({
|
|
3241
3572
|
table: e,
|
|
3242
|
-
reason:
|
|
3573
|
+
reason: Ga
|
|
3243
3574
|
});
|
|
3244
|
-
},
|
|
3575
|
+
}, qa = (e, n) => {
|
|
3245
3576
|
let r = n.subject.id, i = n.subject.tenantId, a = (e, t) => {
|
|
3246
3577
|
let a = { ...t }, o = n.schemaRegistry, s = o.idScheme(e);
|
|
3247
|
-
if (s !== void 0 && a[
|
|
3578
|
+
if (s !== void 0 && a[Ua] == null) if (s.kind === "numeric") delete a[Ua];
|
|
3248
3579
|
else {
|
|
3249
3580
|
let t = f(s, e);
|
|
3250
|
-
t !== null && (a[
|
|
3581
|
+
t !== null && (a[Ua] = t);
|
|
3251
3582
|
}
|
|
3252
3583
|
if (o.hasAudit(e)) {
|
|
3253
3584
|
let e = /* @__PURE__ */ new Date();
|
|
3254
3585
|
"createdAt" in a || (a.createdAt = e), "updatedAt" in a || (a.updatedAt = e), r !== null && ("createdBy" in a || (a.createdBy = r), "updatedBy" in a || (a.updatedBy = r));
|
|
3255
3586
|
}
|
|
3256
|
-
o.hasTenant(e) && ("tenantId" in a || (i === null &&
|
|
3587
|
+
o.hasTenant(e) && ("tenantId" in a || (i === null && Ka(e), a.tenantId = i));
|
|
3257
3588
|
let c = o.defaultFactories(e);
|
|
3258
3589
|
if (c.size > 0) for (let [e, t] of c) (!(e in a) || a[e] === void 0) && (a[e] = t());
|
|
3259
3590
|
let l = o.computedFields(e);
|
|
@@ -3268,10 +3599,10 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3268
3599
|
try {
|
|
3269
3600
|
return await r();
|
|
3270
3601
|
} catch (n) {
|
|
3271
|
-
let r =
|
|
3272
|
-
if (
|
|
3602
|
+
let r = Bt(n);
|
|
3603
|
+
if (Vt(r)) {
|
|
3273
3604
|
let n = t.tenantId, i = `${r.dbConstraint ?? ""} ${r.dbColumn ?? ""} ${r.dbMessage ?? ""} ${r.dbCauseChain ?? ""}`.toLowerCase();
|
|
3274
|
-
if (i.includes("tenantid") || /\btenants\b/.test(i) || n != null && i.includes(String(n).toLowerCase())) throw new
|
|
3605
|
+
if (i.includes("tenantid") || /\btenants\b/.test(i) || n != null && i.includes(String(n).toLowerCase())) throw new wi({
|
|
3275
3606
|
table: e,
|
|
3276
3607
|
reason: n == null ? "write references a tenant that does not exist" : `tenant '${String(n)}' does not exist — seed the row in \`tenants\`, or fix how the request resolved this tenant (subject.tenantId / the x-tenant header / the dev TENANT fallback)`
|
|
3277
3608
|
});
|
|
@@ -3292,11 +3623,11 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3292
3623
|
if (r === void 0) return t;
|
|
3293
3624
|
let i = I.decodeUnknownEither(r)(t);
|
|
3294
3625
|
if (i._tag === "Right") return t;
|
|
3295
|
-
let a =
|
|
3626
|
+
let a = _t.formatErrorSync(i.left).map((e) => ({
|
|
3296
3627
|
path: e.path.length === 0 ? "<root>" : e.path.join("."),
|
|
3297
3628
|
message: e.message
|
|
3298
3629
|
})), o = a[0];
|
|
3299
|
-
throw new
|
|
3630
|
+
throw new Ei({
|
|
3300
3631
|
table: e,
|
|
3301
3632
|
summary: o === void 0 ? "patch validation failed" : `${o.path}: ${o.message}`,
|
|
3302
3633
|
issues: a
|
|
@@ -3309,29 +3640,29 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3309
3640
|
if (r === void 0) return t;
|
|
3310
3641
|
let i = I.decodeUnknownEither(r)(t);
|
|
3311
3642
|
if (i._tag === "Right") return t;
|
|
3312
|
-
let a =
|
|
3643
|
+
let a = _t.formatErrorSync(i.left).map((e) => ({
|
|
3313
3644
|
path: e.path.length === 0 ? "<root>" : e.path.join("."),
|
|
3314
3645
|
message: e.message
|
|
3315
3646
|
})), o = a[0];
|
|
3316
|
-
throw new
|
|
3647
|
+
throw new Ei({
|
|
3317
3648
|
table: e,
|
|
3318
3649
|
summary: o === void 0 ? "row validation failed" : `${o.path}: ${o.message}`,
|
|
3319
3650
|
issues: a
|
|
3320
3651
|
});
|
|
3321
3652
|
}, v = n.dialect, y = (e, t) => {
|
|
3322
3653
|
let n = m(e);
|
|
3323
|
-
return l(v ?
|
|
3654
|
+
return l(v ? ce(t, n, v) : t, n, Xr());
|
|
3324
3655
|
}, b = (e, t) => {
|
|
3325
|
-
let n = m(e), r = s(t, n,
|
|
3656
|
+
let n = m(e), r = s(t, n, Xr());
|
|
3326
3657
|
return v ? c(r, n, v) : r;
|
|
3327
|
-
},
|
|
3658
|
+
}, x = (e) => {
|
|
3328
3659
|
let r = e.table, a = e.predicate;
|
|
3329
3660
|
if (!e.crossTenant && i != null && n.schemaRegistry.hasTenant(r)) {
|
|
3330
3661
|
let e = u("tenantId", i);
|
|
3331
3662
|
a = a ? t(a, e) : e;
|
|
3332
3663
|
}
|
|
3333
3664
|
if (!e.includeDeleted && n.schemaRegistry.hasSoftDelete(r)) {
|
|
3334
|
-
let e =
|
|
3665
|
+
let e = S("deletedAt");
|
|
3335
3666
|
a = a ? t(a, e) : e;
|
|
3336
3667
|
}
|
|
3337
3668
|
return a === e.predicate ? e : {
|
|
@@ -3341,13 +3672,13 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3341
3672
|
}, C = async (t) => {
|
|
3342
3673
|
let n = await e.query(t);
|
|
3343
3674
|
return b(t.table, n);
|
|
3344
|
-
},
|
|
3675
|
+
}, ee = async (e) => C(x(e)), te = async (t, r, i) => {
|
|
3345
3676
|
let a = o(t, i);
|
|
3346
3677
|
if (n.schemaRegistry.computedFields(t).size > 0) {
|
|
3347
3678
|
let n = (await e.query({
|
|
3348
3679
|
table: t,
|
|
3349
3680
|
predicate: {
|
|
3350
|
-
column:
|
|
3681
|
+
column: Ua,
|
|
3351
3682
|
op: "eq",
|
|
3352
3683
|
value: r
|
|
3353
3684
|
},
|
|
@@ -3362,23 +3693,23 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3362
3693
|
a = h(t, a);
|
|
3363
3694
|
let s = await e.update(t, r, y(t, a));
|
|
3364
3695
|
return s === null ? null : b(t, [s])[0];
|
|
3365
|
-
},
|
|
3696
|
+
}, ne = async (t, r) => n.schemaRegistry.hasSoftDelete(t) ? await e.update(t, r, g()) !== null : e.delete(t, r), w = async (t, n, r) => e.updateMany(t, y(t, o(t, n)), r), re = async (t, n) => e.deleteMany(t, n), ie = (e, r) => i != null && n.schemaRegistry.hasTenant(e) ? t(r, u("tenantId", i)) : r, ae = async (e, t, n) => w(e, t, {
|
|
3366
3697
|
...n,
|
|
3367
|
-
where:
|
|
3368
|
-
}),
|
|
3698
|
+
where: ie(e, n.where)
|
|
3699
|
+
}), oe = async (e, t) => re(e, {
|
|
3369
3700
|
...t,
|
|
3370
|
-
where:
|
|
3371
|
-
}), se =
|
|
3701
|
+
where: ie(e, t.where)
|
|
3702
|
+
}), se = Ha({
|
|
3372
3703
|
query: C,
|
|
3373
|
-
updateMany:
|
|
3374
|
-
deleteMany:
|
|
3704
|
+
updateMany: w,
|
|
3705
|
+
deleteMany: re,
|
|
3375
3706
|
delete: (t, n) => e.delete(t, n)
|
|
3376
3707
|
}, {
|
|
3377
3708
|
subject: n.subject,
|
|
3378
3709
|
schemaRegistry: n.schemaRegistry
|
|
3379
3710
|
});
|
|
3380
3711
|
return {
|
|
3381
|
-
query:
|
|
3712
|
+
query: ee,
|
|
3382
3713
|
insert: async (t, n) => {
|
|
3383
3714
|
let r = a(t, n), i = await d(t, r, () => e.insert(t, y(t, _(t, r))));
|
|
3384
3715
|
return b(t, [i])[0];
|
|
@@ -3392,12 +3723,12 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3392
3723
|
return a === null ? null : b(t, [a])[0];
|
|
3393
3724
|
},
|
|
3394
3725
|
select: se.select,
|
|
3395
|
-
update: ((e, t, n) => t === void 0 ? se.updateWhere(e) :
|
|
3396
|
-
delete: ((e, t) => t === void 0 ? se.deleteWhere(e) :
|
|
3397
|
-
applyDefined:
|
|
3726
|
+
update: ((e, t, n) => t === void 0 ? se.updateWhere(e) : te(e, t, n)),
|
|
3727
|
+
delete: ((e, t) => t === void 0 ? se.deleteWhere(e) : ne(e, t)),
|
|
3728
|
+
applyDefined: Wa,
|
|
3398
3729
|
hardDelete: async (t, n) => e.delete(t, n),
|
|
3399
|
-
updateMany:
|
|
3400
|
-
deleteMany:
|
|
3730
|
+
updateMany: ae,
|
|
3731
|
+
deleteMany: oe,
|
|
3401
3732
|
upsert: async (t, n, r) => {
|
|
3402
3733
|
let i = a(t, n), o = await d(t, i, () => e.upsert(t, y(t, _(t, i)), r));
|
|
3403
3734
|
return b(t, [o])[0];
|
|
@@ -3406,34 +3737,34 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3406
3737
|
let i = a(t, n), o = await d(t, i, () => e.insertIgnore(t, y(t, _(t, i)), r));
|
|
3407
3738
|
return b(t, [o])[0];
|
|
3408
3739
|
},
|
|
3409
|
-
transactional: (t) => e.transactional(async (e) => t(
|
|
3740
|
+
transactional: (t) => e.transactional(async (e) => t(qa(e, n))),
|
|
3410
3741
|
...e.raw ? { raw: e.raw.bind(e) } : {},
|
|
3411
3742
|
onChange: (t) => e.onChange(t),
|
|
3412
3743
|
injectExternalChange: (t) => e.injectExternalChange(t),
|
|
3413
3744
|
...e.changeScope === void 0 ? {} : { changeScope: e.changeScope }
|
|
3414
3745
|
};
|
|
3415
|
-
},
|
|
3746
|
+
}, Ja = class extends I.TaggedError()("CircuitOpen", {
|
|
3416
3747
|
name: I.String,
|
|
3417
3748
|
retryAfterMs: I.Number
|
|
3418
|
-
}) {},
|
|
3749
|
+
}) {}, Ya = {
|
|
3419
3750
|
tag: "closed",
|
|
3420
3751
|
failureCount: 0,
|
|
3421
3752
|
halfOpenSuccesses: 0,
|
|
3422
3753
|
openedAt: 0
|
|
3423
|
-
},
|
|
3424
|
-
let t = e.name ?? "circuit", n =
|
|
3754
|
+
}, Xa = { make: (e) => j.gen(function* () {
|
|
3755
|
+
let t = e.name ?? "circuit", n = Re.toMillis(Re.decode(e.resetTimeout)), r = e.halfOpenSuccessThreshold ?? 1, i = e.isFailure ?? (() => !0), a = yield* F.make(Ya), o = j.gen(function* () {
|
|
3425
3756
|
let e = yield* F.get(a);
|
|
3426
3757
|
if (e.tag === "half-open") {
|
|
3427
3758
|
let t = e.halfOpenSuccesses + 1;
|
|
3428
|
-
yield* F.set(a, t >= r ?
|
|
3759
|
+
yield* F.set(a, t >= r ? Ya : {
|
|
3429
3760
|
...e,
|
|
3430
3761
|
halfOpenSuccesses: t
|
|
3431
3762
|
});
|
|
3432
3763
|
return;
|
|
3433
3764
|
}
|
|
3434
|
-
e.failureCount !== 0 && (yield* F.set(a,
|
|
3765
|
+
e.failureCount !== 0 && (yield* F.set(a, Ya));
|
|
3435
3766
|
}), s = j.gen(function* () {
|
|
3436
|
-
let t = yield*
|
|
3767
|
+
let t = yield* Fe.currentTimeMillis, n = yield* F.get(a);
|
|
3437
3768
|
if (n.tag === "half-open" || n.tag === "open") {
|
|
3438
3769
|
yield* F.set(a, {
|
|
3439
3770
|
tag: "open",
|
|
@@ -3456,7 +3787,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3456
3787
|
}), c = j.gen(function* () {
|
|
3457
3788
|
let e = yield* F.get(a);
|
|
3458
3789
|
if (e.tag !== "open") return null;
|
|
3459
|
-
let t = (yield*
|
|
3790
|
+
let t = (yield* Fe.currentTimeMillis) - e.openedAt;
|
|
3460
3791
|
return t >= n ? (yield* F.set(a, {
|
|
3461
3792
|
tag: "half-open",
|
|
3462
3793
|
failureCount: 0,
|
|
@@ -3469,7 +3800,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3469
3800
|
if (k.isInterruptedOnly(e)) return j.void;
|
|
3470
3801
|
let t = k.failureOption(e), n = t._tag === "Some" ? t.value : void 0;
|
|
3471
3802
|
return i(n) ? s : j.void;
|
|
3472
|
-
})) : yield* j.fail(new
|
|
3803
|
+
})) : yield* j.fail(new Ja({
|
|
3473
3804
|
name: t,
|
|
3474
3805
|
retryAfterMs: n
|
|
3475
3806
|
}));
|
|
@@ -3478,38 +3809,25 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3478
3809
|
value: F.get(a).pipe(j.map((e) => e.tag)),
|
|
3479
3810
|
enumerable: !0
|
|
3480
3811
|
}), Object.defineProperty(u, "reset", {
|
|
3481
|
-
value: F.set(a,
|
|
3812
|
+
value: F.set(a, Ya),
|
|
3482
3813
|
enumerable: !0
|
|
3483
3814
|
}), u;
|
|
3484
|
-
}) },
|
|
3485
|
-
|
|
3486
|
-
},
|
|
3487
|
-
|
|
3488
|
-
},
|
|
3489
|
-
let n = t.scopes === void 0 ?
|
|
3815
|
+
}) }, Za, Qa = (e) => {
|
|
3816
|
+
Za = e;
|
|
3817
|
+
}, $a = () => {
|
|
3818
|
+
Za = void 0;
|
|
3819
|
+
}, eo = async (e, t = {}) => {
|
|
3820
|
+
let n = t.scopes === void 0 ? Ne(t.id ?? "system") : Ne(t.id ?? "system", t.scopes), r = t.store ?? Za?.dataStore, i = t.schemaRegistry ?? Za?.schemaRegistry, a = t.dialect ?? Za?.dialect;
|
|
3490
3821
|
if (r === void 0 || i === void 0) throw Error("runAsSystem: no data store available — register one at boot via setSystemStoreHandle({ dataStore, schemaRegistry }) or pass { store, schemaRegistry } in the options.");
|
|
3491
3822
|
return e({
|
|
3492
3823
|
subject: n,
|
|
3493
|
-
store:
|
|
3824
|
+
store: qa(r, {
|
|
3494
3825
|
subject: n,
|
|
3495
3826
|
schemaRegistry: i,
|
|
3496
3827
|
...a === void 0 ? {} : { dialect: a }
|
|
3497
3828
|
})
|
|
3498
3829
|
});
|
|
3499
|
-
},
|
|
3500
|
-
operation: e,
|
|
3501
|
-
table: t,
|
|
3502
|
-
cause: String(n)
|
|
3503
|
-
}), _a = (e, t, n) => j.tryPromise({
|
|
3504
|
-
try: n,
|
|
3505
|
-
catch: ga(e, t)
|
|
3506
|
-
}), va = (e) => M.succeed(ha, {
|
|
3507
|
-
query: (t) => _a("query", t.table, () => e.query(t)),
|
|
3508
|
-
insert: (t, n) => _a("insert", t, () => e.insert(t, n)),
|
|
3509
|
-
update: (t, n, r) => _a("update", t, () => e.update(t, n, r)),
|
|
3510
|
-
delete: (t, n) => _a("delete", t, () => e.delete(t, n)),
|
|
3511
|
-
hardDelete: (t, n) => _a("hardDelete", t, () => e.hardDelete(t, n))
|
|
3512
|
-
}), ya = (e) => {
|
|
3830
|
+
}, to = (e) => {
|
|
3513
3831
|
let { currentRegion: t, replicaRegions: n, inner: r } = e, i = (e) => {
|
|
3514
3832
|
if (t === void 0) return {
|
|
3515
3833
|
sameRegion: [],
|
|
@@ -3537,7 +3855,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3537
3855
|
return r.loadSnapshot();
|
|
3538
3856
|
}
|
|
3539
3857
|
};
|
|
3540
|
-
},
|
|
3858
|
+
}, no = (e = process.env) => {
|
|
3541
3859
|
for (let t of [
|
|
3542
3860
|
"VOLTRO_REGION",
|
|
3543
3861
|
"AWS_REGION",
|
|
@@ -3549,7 +3867,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3549
3867
|
let n = e[t];
|
|
3550
3868
|
if (typeof n == "string" && n.length > 0) return n;
|
|
3551
3869
|
}
|
|
3552
|
-
},
|
|
3870
|
+
}, ro = () => {
|
|
3553
3871
|
let e = {
|
|
3554
3872
|
primary: 0,
|
|
3555
3873
|
lagByReplica: /* @__PURE__ */ new Map()
|
|
@@ -3574,27 +3892,27 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3574
3892
|
e.lagByReplica.set(t, n);
|
|
3575
3893
|
}
|
|
3576
3894
|
};
|
|
3577
|
-
},
|
|
3895
|
+
}, io = Symbol.for("@voltro/ScheduleDefinition"), ao = (e) => typeof e == "object" && !!e && io in e, oo = 30 * 6e4, so = (e) => {
|
|
3578
3896
|
let t = A.parse(e.cron, e.timezone);
|
|
3579
|
-
if (
|
|
3897
|
+
if (ze.isLeft(t)) throw Error(`defineSchedule("${e.name}"): invalid cron expression "${e.cron}" (tz="${e.timezone}") — ${String(t.left)}`);
|
|
3580
3898
|
if (!e.timezone || e.timezone.trim() === "") throw Error(`defineSchedule("${e.name}"): timezone is required (e.g. "UTC", "Europe/Berlin")`);
|
|
3581
3899
|
if (e.handler === void 0 && e.workflow === void 0) throw Error(`defineSchedule("${e.name}"): define either handler or workflow`);
|
|
3582
3900
|
return {
|
|
3583
3901
|
...e,
|
|
3584
3902
|
onOverlap: e.onOverlap ?? "skip",
|
|
3585
3903
|
backfill: e.backfill ?? "skip",
|
|
3586
|
-
maxRuntimeMs: e.maxRuntimeMs ??
|
|
3587
|
-
[
|
|
3904
|
+
maxRuntimeMs: e.maxRuntimeMs ?? oo,
|
|
3905
|
+
[io]: !0
|
|
3588
3906
|
};
|
|
3589
|
-
},
|
|
3907
|
+
}, co = (e) => A.unsafeParse(e.cron, e.timezone), lo = (e, t = /* @__PURE__ */ new Date()) => A.next(co(e), t), Z = "_voltro_wakeups", uo = (e) => `${e.tenantId}:${e.kind}:${e.refId}`, fo = (e) => ({
|
|
3590
3908
|
tenantId: String(e.tenantId),
|
|
3591
3909
|
kind: String(e.kind),
|
|
3592
3910
|
refId: String(e.refId),
|
|
3593
3911
|
wakeAt: e.wakeAt instanceof Date ? e.wakeAt : new Date(String(e.wakeAt)),
|
|
3594
3912
|
status: e.status === "fired" ? "fired" : "pending"
|
|
3595
|
-
}),
|
|
3913
|
+
}), po = async (e, t) => {
|
|
3596
3914
|
await e.upsert(Z, {
|
|
3597
|
-
id:
|
|
3915
|
+
id: uo(t),
|
|
3598
3916
|
tenantId: t.tenantId,
|
|
3599
3917
|
kind: t.kind,
|
|
3600
3918
|
refId: t.refId,
|
|
@@ -3604,7 +3922,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3604
3922
|
conflictColumns: ["id"],
|
|
3605
3923
|
update: ["wakeAt", "status"]
|
|
3606
3924
|
});
|
|
3607
|
-
},
|
|
3925
|
+
}, mo = async (e, t) => e.delete(Z, uo(t)), ho = async (e, t) => await e.update(Z, uo(t), { status: "fired" }) !== null, go = (e, t) => ({ and: [{
|
|
3608
3926
|
column: "id",
|
|
3609
3927
|
op: "eq",
|
|
3610
3928
|
value: e
|
|
@@ -3612,16 +3930,16 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3612
3930
|
column: "status",
|
|
3613
3931
|
op: "eq",
|
|
3614
3932
|
value: t
|
|
3615
|
-
}] }),
|
|
3616
|
-
await e.updateMany(Z, { status: "pending" }, { where:
|
|
3617
|
-
},
|
|
3933
|
+
}] }), _o = async (e, t) => await e.updateMany(Z, { status: "fired" }, { where: go(uo(t), "pending") }) > 0, vo = async (e, t) => {
|
|
3934
|
+
await e.updateMany(Z, { status: "pending" }, { where: go(uo(t), "fired") });
|
|
3935
|
+
}, yo = {
|
|
3618
3936
|
column: "status",
|
|
3619
3937
|
op: "eq",
|
|
3620
3938
|
value: "pending"
|
|
3621
|
-
},
|
|
3939
|
+
}, bo = async (e, t) => {
|
|
3622
3940
|
let n = {
|
|
3623
3941
|
table: Z,
|
|
3624
|
-
predicate:
|
|
3942
|
+
predicate: yo,
|
|
3625
3943
|
order: [{
|
|
3626
3944
|
column: "wakeAt",
|
|
3627
3945
|
direction: "asc"
|
|
@@ -3630,18 +3948,18 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3630
3948
|
skip: void 0,
|
|
3631
3949
|
projection: void 0
|
|
3632
3950
|
};
|
|
3633
|
-
return (await e.query(n)).map(
|
|
3634
|
-
},
|
|
3635
|
-
let r = await
|
|
3951
|
+
return (await e.query(n)).map(fo);
|
|
3952
|
+
}, xo = async (e, t, n = 500) => {
|
|
3953
|
+
let r = await bo(e, n), i = t.getTime();
|
|
3636
3954
|
return r.filter((e) => e.wakeAt.getTime() <= i);
|
|
3637
|
-
},
|
|
3955
|
+
}, So = async (e) => (await bo(e, 1))[0] ?? null, Co = {
|
|
3638
3956
|
column: "status",
|
|
3639
3957
|
op: "eq",
|
|
3640
3958
|
value: "fired"
|
|
3641
|
-
},
|
|
3959
|
+
}, wo = async (e, t = {}) => {
|
|
3642
3960
|
let n = {
|
|
3643
3961
|
table: Z,
|
|
3644
|
-
predicate:
|
|
3962
|
+
predicate: Co,
|
|
3645
3963
|
order: [{
|
|
3646
3964
|
column: "wakeAt",
|
|
3647
3965
|
direction: "asc"
|
|
@@ -3652,12 +3970,12 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3652
3970
|
}, r = await e.query(n), i = t.firedOlderThan?.getTime(), a = 0;
|
|
3653
3971
|
for (let t of r) i !== void 0 && (t.wakeAt instanceof Date ? t.wakeAt : new Date(String(t.wakeAt))).getTime() >= i || await e.delete(Z, String(t.id)) && a++;
|
|
3654
3972
|
return a;
|
|
3655
|
-
},
|
|
3973
|
+
}, To = {
|
|
3656
3974
|
kind: "single",
|
|
3657
3975
|
tryClaim: async () => !0
|
|
3658
|
-
},
|
|
3976
|
+
}, Eo = "_voltro_schedule_claims", Do = (e, t, n) => {
|
|
3659
3977
|
let r = async (t) => (await e.query({
|
|
3660
|
-
table:
|
|
3978
|
+
table: Eo,
|
|
3661
3979
|
order: [],
|
|
3662
3980
|
predicate: void 0,
|
|
3663
3981
|
projection: ["id"],
|
|
@@ -3672,7 +3990,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3672
3990
|
if (await r(s)) return !1;
|
|
3673
3991
|
} catch {}
|
|
3674
3992
|
try {
|
|
3675
|
-
return await e.insert(
|
|
3993
|
+
return await e.insert(Eo, {
|
|
3676
3994
|
id: s,
|
|
3677
3995
|
scheduleName: i,
|
|
3678
3996
|
bucket: o,
|
|
@@ -3690,12 +4008,12 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3690
4008
|
}
|
|
3691
4009
|
}
|
|
3692
4010
|
};
|
|
3693
|
-
},
|
|
4011
|
+
}, Oo = "_voltro_schedule_runs", ko = async (e, t) => {
|
|
3694
4012
|
let { store: n, coordinator: r, buildContext: i, replicaId: a, log: o, onRunEvent: s, interceptFire: c } = t, l = t.dormancy === "sleep", u = t.dormancyTenantId ?? "default", d = /* @__PURE__ */ new Map(), f = /* @__PURE__ */ new Set(), p = /* @__PURE__ */ new Map(), m = !1, h = new Map(e.map((e) => [e.name, e])), g = (e, t) => {
|
|
3695
|
-
s?.(e,
|
|
4013
|
+
s?.(e, jo(t));
|
|
3696
4014
|
}, _ = async (e, t, r, i, s, c) => {
|
|
3697
4015
|
try {
|
|
3698
|
-
let o = `sr_${
|
|
4016
|
+
let o = `sr_${he()}`, l = await n.insert(Oo, {
|
|
3699
4017
|
id: o,
|
|
3700
4018
|
name: e.name,
|
|
3701
4019
|
status: i,
|
|
@@ -3720,7 +4038,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3720
4038
|
}
|
|
3721
4039
|
}, v = async (e, t) => {
|
|
3722
4040
|
try {
|
|
3723
|
-
let r = await n.update(
|
|
4041
|
+
let r = await n.update(Oo, e, t);
|
|
3724
4042
|
r && g("update", r);
|
|
3725
4043
|
} catch (t) {
|
|
3726
4044
|
o.warn("schedule: failed to record run finish", {
|
|
@@ -3731,7 +4049,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3731
4049
|
}, y = async (e) => {
|
|
3732
4050
|
try {
|
|
3733
4051
|
let t = await n.query({
|
|
3734
|
-
table:
|
|
4052
|
+
table: Oo,
|
|
3735
4053
|
predicate: {
|
|
3736
4054
|
_tag: "leaf",
|
|
3737
4055
|
column: "status",
|
|
@@ -3796,7 +4114,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3796
4114
|
let n = Q(t).includes("exceeded maxRuntimeMs");
|
|
3797
4115
|
s && await v(s, {
|
|
3798
4116
|
status: "failed",
|
|
3799
|
-
errorTag: n ? "timeout" :
|
|
4117
|
+
errorTag: n ? "timeout" : Ao(t),
|
|
3800
4118
|
errorMessage: Q(t),
|
|
3801
4119
|
completedAt: /* @__PURE__ */ new Date(),
|
|
3802
4120
|
durationMs: Date.now() - l
|
|
@@ -3804,7 +4122,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3804
4122
|
name: e.name,
|
|
3805
4123
|
reason: Q(t),
|
|
3806
4124
|
timeout: n
|
|
3807
|
-
}),
|
|
4125
|
+
}), Ae({
|
|
3808
4126
|
error: t,
|
|
3809
4127
|
source: "schedule",
|
|
3810
4128
|
name: e.name,
|
|
@@ -3853,8 +4171,8 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3853
4171
|
}
|
|
3854
4172
|
}, C = async (e) => {
|
|
3855
4173
|
try {
|
|
3856
|
-
let t = A.next(
|
|
3857
|
-
await
|
|
4174
|
+
let t = A.next(co(e), /* @__PURE__ */ new Date());
|
|
4175
|
+
await po(n, {
|
|
3858
4176
|
tenantId: u,
|
|
3859
4177
|
kind: "schedule",
|
|
3860
4178
|
refId: e.name,
|
|
@@ -3866,13 +4184,13 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3866
4184
|
reason: Q(t)
|
|
3867
4185
|
});
|
|
3868
4186
|
}
|
|
3869
|
-
},
|
|
4187
|
+
}, ee = 2147483647, te = (e) => {
|
|
3870
4188
|
if (m) return;
|
|
3871
|
-
let n =
|
|
4189
|
+
let n = co(e), r = A.next(n, /* @__PURE__ */ new Date()), i = () => {
|
|
3872
4190
|
if (m) return;
|
|
3873
4191
|
let n = r.getTime() - Date.now();
|
|
3874
|
-
if (n >
|
|
3875
|
-
let t = setTimeout(i,
|
|
4192
|
+
if (n > ee) {
|
|
4193
|
+
let t = setTimeout(i, ee);
|
|
3876
4194
|
d.set(e.name, t);
|
|
3877
4195
|
return;
|
|
3878
4196
|
}
|
|
@@ -3880,17 +4198,17 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3880
4198
|
x(e, r, e.trigger ?? t.defaultTrigger).catch((t) => o.warn("schedule: fire rejected", {
|
|
3881
4199
|
name: e.name,
|
|
3882
4200
|
reason: Q(t)
|
|
3883
|
-
})).finally(() =>
|
|
4201
|
+
})).finally(() => te(e));
|
|
3884
4202
|
}, Math.max(0, n));
|
|
3885
4203
|
d.set(e.name, a);
|
|
3886
4204
|
};
|
|
3887
4205
|
i();
|
|
3888
|
-
},
|
|
4206
|
+
}, ne = async (e) => {
|
|
3889
4207
|
if (e.backfill === "skip") return;
|
|
3890
4208
|
let r;
|
|
3891
4209
|
try {
|
|
3892
4210
|
let t = (await n.query({
|
|
3893
|
-
table:
|
|
4211
|
+
table: Oo,
|
|
3894
4212
|
order: [{
|
|
3895
4213
|
column: "scheduledAt",
|
|
3896
4214
|
direction: "desc"
|
|
@@ -3909,7 +4227,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3909
4227
|
return;
|
|
3910
4228
|
}
|
|
3911
4229
|
if (!r) return;
|
|
3912
|
-
let i =
|
|
4230
|
+
let i = co(e), a = [], s = A.next(i, r), c = Date.now();
|
|
3913
4231
|
for (; s.getTime() < c && a.length < 1e3;) a.push(s), s = A.next(i, s);
|
|
3914
4232
|
if (a.length !== 0) if (o.info("schedule: backfill", {
|
|
3915
4233
|
name: e.name,
|
|
@@ -3920,20 +4238,20 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3920
4238
|
let n = a[a.length - 1];
|
|
3921
4239
|
await x(e, n, e.trigger ?? t.defaultTrigger);
|
|
3922
4240
|
} else for (let n of a) await x(e, n, e.trigger ?? t.defaultTrigger);
|
|
3923
|
-
},
|
|
4241
|
+
}, w = e.filter((e) => (e.trigger ?? t.defaultTrigger) === "self");
|
|
3924
4242
|
o.info("scheduler: starting", {
|
|
3925
4243
|
total: e.length,
|
|
3926
|
-
self:
|
|
3927
|
-
external: e.length -
|
|
4244
|
+
self: w.length,
|
|
4245
|
+
external: e.length - w.length,
|
|
3928
4246
|
coordinator: r.kind
|
|
3929
4247
|
});
|
|
3930
|
-
let
|
|
4248
|
+
let re = (t.armSelf ?? !0) && !l;
|
|
3931
4249
|
if (l) {
|
|
3932
|
-
o.info("scheduler: sleep mode — registering wakeups, not arming timers", { count:
|
|
3933
|
-
for (let e of
|
|
3934
|
-
} else if (
|
|
3935
|
-
for (let e of
|
|
3936
|
-
for (let e of
|
|
4250
|
+
o.info("scheduler: sleep mode — registering wakeups, not arming timers", { count: w.length });
|
|
4251
|
+
for (let e of w) await C(e);
|
|
4252
|
+
} else if (re) {
|
|
4253
|
+
for (let e of w) await ne(e);
|
|
4254
|
+
for (let e of w) te(e);
|
|
3937
4255
|
}
|
|
3938
4256
|
return {
|
|
3939
4257
|
fireNow: async (e, t) => {
|
|
@@ -3954,11 +4272,11 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3954
4272
|
d.clear(), o.info("scheduler: stopped");
|
|
3955
4273
|
}
|
|
3956
4274
|
};
|
|
3957
|
-
}, Q = (e) => e?.message ?? String(e),
|
|
4275
|
+
}, Q = (e) => e?.message ?? String(e), Ao = (e) => e && typeof e == "object" && "_tag" in e ? String(e._tag) : null, jo = (e) => {
|
|
3958
4276
|
let t = {};
|
|
3959
4277
|
for (let [n, r] of Object.entries(e)) t[n] = r instanceof Date ? r.toISOString() : r;
|
|
3960
4278
|
return t;
|
|
3961
|
-
},
|
|
4279
|
+
}, Mo = (e, t, n, r) => {
|
|
3962
4280
|
let i = !1, a, o = async () => {
|
|
3963
4281
|
if (i) return;
|
|
3964
4282
|
let a = new Date(Math.floor(Date.now() / t) * t), o = !1;
|
|
@@ -3988,96 +4306,96 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
3988
4306
|
i || (i = !0, a && clearInterval(a), a = void 0);
|
|
3989
4307
|
}
|
|
3990
4308
|
};
|
|
3991
|
-
},
|
|
4309
|
+
}, No = (e) => (t, n, r) => Mo(t, n, r, e), Po = T("_voltro_schedule_runs", {
|
|
3992
4310
|
id: v({ prefix: "schrun" }),
|
|
3993
|
-
name:
|
|
3994
|
-
status:
|
|
4311
|
+
name: E(),
|
|
4312
|
+
status: E().oneOf([
|
|
3995
4313
|
"running",
|
|
3996
4314
|
"succeeded",
|
|
3997
4315
|
"failed",
|
|
3998
4316
|
"skipped",
|
|
3999
4317
|
"missed"
|
|
4000
4318
|
]).default("running"),
|
|
4001
|
-
trigger:
|
|
4319
|
+
trigger: E().oneOf([
|
|
4002
4320
|
"self",
|
|
4003
4321
|
"external",
|
|
4004
4322
|
"manual"
|
|
4005
4323
|
]).default("self"),
|
|
4006
|
-
scheduledAt:
|
|
4007
|
-
firedAt:
|
|
4008
|
-
completedAt:
|
|
4324
|
+
scheduledAt: D(),
|
|
4325
|
+
firedAt: D().nullable(),
|
|
4326
|
+
completedAt: D().nullable(),
|
|
4009
4327
|
durationMs: b().nullable(),
|
|
4010
|
-
errorTag:
|
|
4011
|
-
errorMessage:
|
|
4012
|
-
coordinationOutcome:
|
|
4328
|
+
errorTag: E().nullable(),
|
|
4329
|
+
errorMessage: E().nullable(),
|
|
4330
|
+
coordinationOutcome: E().oneOf([
|
|
4013
4331
|
"single",
|
|
4014
4332
|
"wonLock",
|
|
4015
4333
|
"lostLock",
|
|
4016
4334
|
"external",
|
|
4017
4335
|
"cluster"
|
|
4018
4336
|
]).nullable(),
|
|
4019
|
-
replicaId:
|
|
4020
|
-
result:
|
|
4021
|
-
}).index(["name", "scheduledAt"]).index(["status"]),
|
|
4337
|
+
replicaId: E().nullable(),
|
|
4338
|
+
result: C().nullable()
|
|
4339
|
+
}).index(["name", "scheduledAt"]).index(["status"]), Fo = T("_voltro_schedule_claims", {
|
|
4022
4340
|
id: v({ prefix: "schclaim" }),
|
|
4023
|
-
scheduleName:
|
|
4024
|
-
bucket:
|
|
4025
|
-
claimedBy:
|
|
4026
|
-
claimedAt:
|
|
4027
|
-
}).index(["scheduleName", "bucket"]).index(["claimedAt"]),
|
|
4341
|
+
scheduleName: E(),
|
|
4342
|
+
bucket: E(),
|
|
4343
|
+
claimedBy: E(),
|
|
4344
|
+
claimedAt: D()
|
|
4345
|
+
}).index(["scheduleName", "bucket"]).index(["claimedAt"]), Io = T("_voltro_traces", {
|
|
4028
4346
|
id: v({ prefix: "span" }),
|
|
4029
|
-
traceId:
|
|
4030
|
-
spanId:
|
|
4031
|
-
parentSpanId:
|
|
4032
|
-
name:
|
|
4033
|
-
kind:
|
|
4347
|
+
traceId: E(),
|
|
4348
|
+
spanId: E(),
|
|
4349
|
+
parentSpanId: E().nullable(),
|
|
4350
|
+
name: E(),
|
|
4351
|
+
kind: E().oneOf([
|
|
4034
4352
|
"internal",
|
|
4035
4353
|
"server",
|
|
4036
4354
|
"client",
|
|
4037
4355
|
"producer",
|
|
4038
4356
|
"consumer"
|
|
4039
4357
|
]).default("internal"),
|
|
4040
|
-
status:
|
|
4358
|
+
status: E().oneOf([
|
|
4041
4359
|
"ok",
|
|
4042
4360
|
"error",
|
|
4043
4361
|
"unset"
|
|
4044
4362
|
]).default("unset"),
|
|
4045
|
-
statusMessage:
|
|
4046
|
-
startedAt:
|
|
4047
|
-
endedAt:
|
|
4363
|
+
statusMessage: E().nullable(),
|
|
4364
|
+
startedAt: D(),
|
|
4365
|
+
endedAt: D(),
|
|
4048
4366
|
durationMs: b(),
|
|
4049
|
-
attributes:
|
|
4050
|
-
events:
|
|
4051
|
-
}).index(["traceId", "startedAt"]).index(["startedAt"]).index(["status"]),
|
|
4367
|
+
attributes: C().nullable(),
|
|
4368
|
+
events: C().nullable()
|
|
4369
|
+
}).index(["traceId", "startedAt"]).index(["startedAt"]).index(["status"]), Lo = T("_voltro_undo_log", {
|
|
4052
4370
|
id: v({ prefix: "undo" }),
|
|
4053
|
-
tag:
|
|
4054
|
-
label:
|
|
4055
|
-
subjectId:
|
|
4056
|
-
tenantId:
|
|
4057
|
-
traceId:
|
|
4058
|
-
changes:
|
|
4371
|
+
tag: E(),
|
|
4372
|
+
label: E().nullable(),
|
|
4373
|
+
subjectId: E().nullable(),
|
|
4374
|
+
tenantId: E().nullable(),
|
|
4375
|
+
traceId: E().nullable(),
|
|
4376
|
+
changes: E(),
|
|
4059
4377
|
crossesAction: r().default(!1),
|
|
4060
4378
|
undone: r().default(!1),
|
|
4061
|
-
createdAt:
|
|
4062
|
-
}).index(["subjectId", "createdAt"]).reactive(),
|
|
4379
|
+
createdAt: D().default("now")
|
|
4380
|
+
}).index(["subjectId", "createdAt"]).reactive(), Ro = (e = process.env) => {
|
|
4063
4381
|
let t = (e.VOLTRO_UNDO ?? "").toLowerCase();
|
|
4064
4382
|
return t === "on" || t === "1" || t === "true" ? !0 : t === "off" || t === "0" || t === "false" ? !1 : e.NODE_ENV !== "production";
|
|
4065
|
-
},
|
|
4383
|
+
}, zo = (e) => e.startsWith("_voltro"), Bo = async (e, t, n) => (await e.query({
|
|
4066
4384
|
table: t,
|
|
4067
4385
|
predicate: u("id", n),
|
|
4068
4386
|
order: []
|
|
4069
|
-
}))[0] ?? null,
|
|
4387
|
+
}))[0] ?? null, Vo = (e, t) => new Proxy(e, { get(e, n, r) {
|
|
4070
4388
|
if (n === "insert") return async (n, r) => {
|
|
4071
4389
|
let i = await e.insert(n, r);
|
|
4072
|
-
return
|
|
4390
|
+
return zo(n) || t({
|
|
4073
4391
|
table: n,
|
|
4074
4392
|
op: "insert",
|
|
4075
4393
|
next: i
|
|
4076
4394
|
}), i;
|
|
4077
4395
|
};
|
|
4078
4396
|
if (n === "update") return async (n, r, i) => {
|
|
4079
|
-
let a =
|
|
4080
|
-
return
|
|
4397
|
+
let a = zo(n) ? null : await Bo(e, n, r), o = await e.update(n, r, i);
|
|
4398
|
+
return zo(n) || t({
|
|
4081
4399
|
table: n,
|
|
4082
4400
|
op: "update",
|
|
4083
4401
|
id: r,
|
|
@@ -4086,8 +4404,8 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4086
4404
|
}), o;
|
|
4087
4405
|
};
|
|
4088
4406
|
if (n === "delete") return async (n, r) => {
|
|
4089
|
-
let i =
|
|
4090
|
-
return !
|
|
4407
|
+
let i = zo(n) ? null : await Bo(e, n, r), a = await e.delete(n, r);
|
|
4408
|
+
return !zo(n) && a && t({
|
|
4091
4409
|
table: n,
|
|
4092
4410
|
op: "delete",
|
|
4093
4411
|
id: r,
|
|
@@ -4096,10 +4414,10 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4096
4414
|
};
|
|
4097
4415
|
let i = Reflect.get(e, n, r);
|
|
4098
4416
|
return typeof i == "function" ? i.bind(e) : i;
|
|
4099
|
-
} }),
|
|
4417
|
+
} }), Ho = (e) => {
|
|
4100
4418
|
let t = [];
|
|
4101
4419
|
return {
|
|
4102
|
-
tx:
|
|
4420
|
+
tx: Vo(e, (e) => t.push(e)),
|
|
4103
4421
|
persist: async (e, n) => {
|
|
4104
4422
|
if (t.length === 0 || n.tag.startsWith("__voltro")) return;
|
|
4105
4423
|
let r = n.subject;
|
|
@@ -4115,14 +4433,14 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4115
4433
|
});
|
|
4116
4434
|
}
|
|
4117
4435
|
};
|
|
4118
|
-
},
|
|
4436
|
+
}, Uo = (e) => {
|
|
4119
4437
|
if (e.id !== void 0) return e.id;
|
|
4120
4438
|
let t = e.next?.id;
|
|
4121
4439
|
if (typeof t == "string") return t;
|
|
4122
4440
|
let n = e.prev?.id;
|
|
4123
4441
|
return typeof n == "string" ? n : void 0;
|
|
4124
|
-
},
|
|
4125
|
-
let t =
|
|
4442
|
+
}, Wo = (e) => {
|
|
4443
|
+
let t = Uo(e);
|
|
4126
4444
|
switch (e.op) {
|
|
4127
4445
|
case "insert": return t === void 0 ? null : {
|
|
4128
4446
|
table: e.table,
|
|
@@ -4146,28 +4464,28 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4146
4464
|
row: e.prev
|
|
4147
4465
|
};
|
|
4148
4466
|
}
|
|
4149
|
-
},
|
|
4150
|
-
if (e.crossesAction) throw new
|
|
4467
|
+
}, Go = (e) => {
|
|
4468
|
+
if (e.crossesAction) throw new Ko(e.invocationId, "action");
|
|
4151
4469
|
let t = [];
|
|
4152
4470
|
for (let n = e.changes.length - 1; n >= 0; --n) {
|
|
4153
|
-
let r =
|
|
4471
|
+
let r = Wo(e.changes[n]);
|
|
4154
4472
|
r !== null && t.push(r);
|
|
4155
4473
|
}
|
|
4156
4474
|
return t;
|
|
4157
|
-
},
|
|
4475
|
+
}, Ko = class extends Error {
|
|
4158
4476
|
invocationId;
|
|
4159
4477
|
boundary;
|
|
4160
4478
|
_tag = "UndoBoundaryError";
|
|
4161
4479
|
constructor(e, t) {
|
|
4162
4480
|
super(t === "action" ? `cannot undo invocation ${e}: it crossed an action (external side effect)` : `cannot undo invocation ${e}: the row changed since (conflict)`), this.invocationId = e, this.boundary = t, this.name = "UndoBoundaryError";
|
|
4163
4481
|
}
|
|
4164
|
-
},
|
|
4482
|
+
}, qo = (e, t, n = ["updatedAt", "updatedBy"]) => {
|
|
4165
4483
|
if (t == null) return e == null;
|
|
4166
4484
|
if (e == null) return !1;
|
|
4167
4485
|
let r = new Set(n);
|
|
4168
4486
|
for (let [n, i] of Object.entries(t)) if (!r.has(n) && !Object.is(e[n], i) && JSON.stringify(e[n]) !== JSON.stringify(i)) return !1;
|
|
4169
4487
|
return !0;
|
|
4170
|
-
},
|
|
4488
|
+
}, Jo = class {
|
|
4171
4489
|
capacity;
|
|
4172
4490
|
done = [];
|
|
4173
4491
|
undone = [];
|
|
@@ -4203,7 +4521,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4203
4521
|
redo: [...this.undone]
|
|
4204
4522
|
};
|
|
4205
4523
|
}
|
|
4206
|
-
},
|
|
4524
|
+
}, Yo = (e, t = /* @__PURE__ */ new Set()) => e.op === "insert" ? {
|
|
4207
4525
|
table: e.table,
|
|
4208
4526
|
op: "insert",
|
|
4209
4527
|
next: e.new ?? null
|
|
@@ -4220,7 +4538,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4220
4538
|
table: e.table,
|
|
4221
4539
|
op: "delete",
|
|
4222
4540
|
prev: e.old ?? null
|
|
4223
|
-
},
|
|
4541
|
+
}, Xo = async (e, t) => {
|
|
4224
4542
|
switch (t.op) {
|
|
4225
4543
|
case "delete":
|
|
4226
4544
|
await e.delete(t.table, t.id);
|
|
@@ -4238,21 +4556,21 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4238
4556
|
await e.insert(t.table, t.row);
|
|
4239
4557
|
return;
|
|
4240
4558
|
}
|
|
4241
|
-
},
|
|
4242
|
-
for (let n of t) await
|
|
4243
|
-
},
|
|
4559
|
+
}, Zo = async (e, t) => {
|
|
4560
|
+
for (let n of t) await Xo(e, n);
|
|
4561
|
+
}, Qo = (e) => e.request?.subject?.id ?? null, $o = (e) => e === !0 || e === 1, es = async (e, t, n) => (await e.query({
|
|
4244
4562
|
table: t,
|
|
4245
4563
|
predicate: u("id", n),
|
|
4246
4564
|
order: []
|
|
4247
|
-
}))[0] ?? null,
|
|
4565
|
+
}))[0] ?? null, ts = (e) => {
|
|
4248
4566
|
try {
|
|
4249
4567
|
let t = JSON.parse(String(e ?? "[]"));
|
|
4250
4568
|
return Array.isArray(t) ? t : [];
|
|
4251
4569
|
} catch {
|
|
4252
4570
|
return [];
|
|
4253
4571
|
}
|
|
4254
|
-
},
|
|
4255
|
-
let n =
|
|
4572
|
+
}, ns = (e) => e.id ?? e.next?.id ?? e.prev?.id, rs = async (e, t) => {
|
|
4573
|
+
let n = Qo(t);
|
|
4256
4574
|
return [...await t.store.query({
|
|
4257
4575
|
table: "_voltro_undo_log",
|
|
4258
4576
|
predicate: u("subjectId", n),
|
|
@@ -4261,68 +4579,68 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4261
4579
|
id: String(e.id),
|
|
4262
4580
|
tag: String(e.tag ?? ""),
|
|
4263
4581
|
label: e.label ?? null,
|
|
4264
|
-
undone:
|
|
4265
|
-
crossesAction:
|
|
4582
|
+
undone: $o(e.undone),
|
|
4583
|
+
crossesAction: $o(e.crossesAction),
|
|
4266
4584
|
createdAt: String(e.createdAt ?? "")
|
|
4267
4585
|
}));
|
|
4268
|
-
},
|
|
4269
|
-
let n = await
|
|
4270
|
-
if (!n) throw new
|
|
4271
|
-
if ((n.subjectId ?? null) !==
|
|
4586
|
+
}, is = async (e, t) => {
|
|
4587
|
+
let n = await es(t.store, "_voltro_undo_log", e.invocationId);
|
|
4588
|
+
if (!n) throw new Ce({ invocationId: e.invocationId });
|
|
4589
|
+
if ((n.subjectId ?? null) !== Qo(t)) throw new Se({ invocationId: e.invocationId });
|
|
4272
4590
|
return n;
|
|
4273
|
-
},
|
|
4274
|
-
let n = await
|
|
4275
|
-
if (
|
|
4276
|
-
if (
|
|
4591
|
+
}, as = async (e, t) => {
|
|
4592
|
+
let n = await is(e, t);
|
|
4593
|
+
if ($o(n.undone)) return { ok: !0 };
|
|
4594
|
+
if ($o(n.crossesAction)) throw new xe({
|
|
4277
4595
|
invocationId: e.invocationId,
|
|
4278
4596
|
reason: "action"
|
|
4279
4597
|
});
|
|
4280
|
-
let r =
|
|
4598
|
+
let r = ts(n.changes);
|
|
4281
4599
|
for (let n of r) {
|
|
4282
|
-
let r =
|
|
4283
|
-
if (r !== void 0 && !
|
|
4600
|
+
let r = ns(n);
|
|
4601
|
+
if (r !== void 0 && !qo(await es(t.store, n.table, r), n.next ?? null)) throw new xe({
|
|
4284
4602
|
invocationId: e.invocationId,
|
|
4285
4603
|
reason: "conflict"
|
|
4286
4604
|
});
|
|
4287
4605
|
}
|
|
4288
4606
|
let i = {
|
|
4289
4607
|
invocationId: e.invocationId,
|
|
4290
|
-
subject:
|
|
4608
|
+
subject: Qo(t),
|
|
4291
4609
|
changes: r,
|
|
4292
4610
|
crossesAction: !1
|
|
4293
4611
|
};
|
|
4294
|
-
return await
|
|
4295
|
-
},
|
|
4296
|
-
let n = await
|
|
4297
|
-
if (
|
|
4298
|
-
for (let e of
|
|
4299
|
-
let n =
|
|
4612
|
+
return await Zo(t.store, Go(i)), await t.store.update("_voltro_undo_log", e.invocationId, { undone: !0 }), { ok: !0 };
|
|
4613
|
+
}, os = async (e, t) => {
|
|
4614
|
+
let n = await is(e, t);
|
|
4615
|
+
if (!$o(n.undone)) return { ok: !0 };
|
|
4616
|
+
for (let e of ts(n.changes)) {
|
|
4617
|
+
let n = ns(e);
|
|
4300
4618
|
e.op === "insert" && e.next ? await t.store.insert(e.table, e.next) : e.op === "update" && n !== void 0 && e.next ? await t.store.update(e.table, n, e.next) : e.op === "delete" && n !== void 0 && await t.store.delete(e.table, n);
|
|
4301
4619
|
}
|
|
4302
4620
|
return await t.store.update("_voltro_undo_log", e.invocationId, { undone: !1 }), { ok: !0 };
|
|
4303
|
-
},
|
|
4621
|
+
}, ss = (e = process.env) => {
|
|
4304
4622
|
let t = (e.VOLTRO_TIMELINE ?? "").toLowerCase();
|
|
4305
4623
|
return t === "off" || t === "0" || t === "false" ? "off" : t === "all" ? "all" : t === "interesting" || t === "on" || t === "1" || t === "true" ? "interesting" : e.NODE_ENV === "production" ? "off" : "interesting";
|
|
4306
|
-
},
|
|
4624
|
+
}, cs = /pass(word)?|secret|token|api[_-]?key|authorization|cookie|ssn|credit[_-]?card|card[_-]?number|cvv|encrypted/i, ls = "«redacted»", us = (e) => {
|
|
4307
4625
|
if (e == null) return null;
|
|
4308
4626
|
let t = {};
|
|
4309
|
-
for (let [n, r] of Object.entries(e)) t[n] =
|
|
4627
|
+
for (let [n, r] of Object.entries(e)) t[n] = cs.test(n) ? ls : r;
|
|
4310
4628
|
return t;
|
|
4311
|
-
},
|
|
4629
|
+
}, ds = (e) => {
|
|
4312
4630
|
let t = e?.id;
|
|
4313
4631
|
return typeof t == "string" ? t : void 0;
|
|
4314
|
-
},
|
|
4632
|
+
}, fs = (e, t) => {
|
|
4315
4633
|
if (t.op === "insert") {
|
|
4316
|
-
let n =
|
|
4634
|
+
let n = ds(t.new);
|
|
4317
4635
|
return n === void 0 ? e : e.filter((e) => e.id !== n);
|
|
4318
4636
|
}
|
|
4319
4637
|
if (t.op === "update") {
|
|
4320
4638
|
if (t.old == null) return e;
|
|
4321
|
-
let n =
|
|
4639
|
+
let n = ds(t.new) ?? ds(t.old);
|
|
4322
4640
|
return e.map((e) => e.id === n ? t.old : e);
|
|
4323
4641
|
}
|
|
4324
4642
|
return t.old == null ? e : [...e, t.old];
|
|
4325
|
-
},
|
|
4643
|
+
}, ps = class {
|
|
4326
4644
|
mode;
|
|
4327
4645
|
capacity;
|
|
4328
4646
|
now;
|
|
@@ -4342,8 +4660,8 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4342
4660
|
ts: this.now(),
|
|
4343
4661
|
table: e.table,
|
|
4344
4662
|
op: e.op,
|
|
4345
|
-
old:
|
|
4346
|
-
new:
|
|
4663
|
+
old: us(e.old),
|
|
4664
|
+
new: us(e.new),
|
|
4347
4665
|
tenantId: n
|
|
4348
4666
|
}), this.ring.length > this.capacity && this.ring.shift(), t;
|
|
4349
4667
|
}
|
|
@@ -4356,23 +4674,23 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4356
4674
|
}
|
|
4357
4675
|
replay(e, t, n) {
|
|
4358
4676
|
let r = this.ring.filter((n) => n.table === e && n.seq > t).sort((e, t) => t.seq - e.seq), i = n;
|
|
4359
|
-
for (let e of r) i =
|
|
4677
|
+
for (let e of r) i = fs(i, e);
|
|
4360
4678
|
return i;
|
|
4361
4679
|
}
|
|
4362
|
-
},
|
|
4363
|
-
|
|
4364
|
-
},
|
|
4365
|
-
let t =
|
|
4680
|
+
}, ms, hs = () => (ms === void 0 && (ms = new ps(ss())), ms), gs = (e) => {
|
|
4681
|
+
ms = e;
|
|
4682
|
+
}, _s = (e) => {
|
|
4683
|
+
let t = hs();
|
|
4366
4684
|
if (t.enabled) try {
|
|
4367
4685
|
t.record(e);
|
|
4368
4686
|
} catch {}
|
|
4369
|
-
},
|
|
4687
|
+
}, vs = /* @__PURE__ */ new Set([
|
|
4370
4688
|
"count",
|
|
4371
4689
|
"sum",
|
|
4372
4690
|
"avg",
|
|
4373
4691
|
"min",
|
|
4374
4692
|
"max"
|
|
4375
|
-
]),
|
|
4693
|
+
]), ys = (e) => {
|
|
4376
4694
|
if (e.joins !== void 0 && e.joins.length > 0) return {
|
|
4377
4695
|
maintainable: !1,
|
|
4378
4696
|
reason: "joins are not maintainable in v1"
|
|
@@ -4394,7 +4712,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4394
4712
|
reason: "v1 maintains exactly one aggregation"
|
|
4395
4713
|
};
|
|
4396
4714
|
let t = e.aggregations[0];
|
|
4397
|
-
return
|
|
4715
|
+
return vs.has(t.op) ? t.op !== "count" && (t.column === void 0 || t.column.length === 0) ? {
|
|
4398
4716
|
maintainable: !1,
|
|
4399
4717
|
reason: `op '${t.op}' requires a column`
|
|
4400
4718
|
} : {
|
|
@@ -4408,7 +4726,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4408
4726
|
maintainable: !1,
|
|
4409
4727
|
reason: `op '${t.op}' is not maintainable`
|
|
4410
4728
|
};
|
|
4411
|
-
},
|
|
4729
|
+
}, bs = "\0", $ = (e, t) => t === void 0 || t.length === 0 ? "" : t.map((t) => JSON.stringify(e[t] ?? null)).join(bs), xs = (e, t) => t === void 0 ? 0 : Number(e[t] ?? 0), Ss = (e, t) => {
|
|
4412
4730
|
switch (e.op) {
|
|
4413
4731
|
case "count": return t.count;
|
|
4414
4732
|
case "sum": return t.sum ?? 0;
|
|
@@ -4416,10 +4734,10 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4416
4734
|
case "min":
|
|
4417
4735
|
case "max": return t.count > 0 ? t.extreme ?? null : null;
|
|
4418
4736
|
}
|
|
4419
|
-
},
|
|
4737
|
+
}, Cs = (e, t) => {
|
|
4420
4738
|
let n = /* @__PURE__ */ new Map();
|
|
4421
4739
|
for (let r of t) {
|
|
4422
|
-
let t = $(r, e.groupBy), i = n.get(t), a =
|
|
4740
|
+
let t = $(r, e.groupBy), i = n.get(t), a = xs(r, e.column);
|
|
4423
4741
|
if (i === void 0) n.set(t, {
|
|
4424
4742
|
count: 1,
|
|
4425
4743
|
...e.op === "sum" || e.op === "avg" ? { sum: a } : {},
|
|
@@ -4435,10 +4753,10 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4435
4753
|
}
|
|
4436
4754
|
}
|
|
4437
4755
|
return n;
|
|
4438
|
-
},
|
|
4756
|
+
}, ws = (e, t) => [...t.entries()].map(([t, n]) => ({
|
|
4439
4757
|
groupKey: t,
|
|
4440
|
-
value:
|
|
4441
|
-
})),
|
|
4758
|
+
value: Ss(e, n)
|
|
4759
|
+
})), Ts = (e, t, n) => {
|
|
4442
4760
|
let r = new Map(t), i = /* @__PURE__ */ new Set(), a = (t) => {
|
|
4443
4761
|
let n = $(t, e.groupBy), a = r.get(n);
|
|
4444
4762
|
if (a === void 0) return;
|
|
@@ -4447,7 +4765,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4447
4765
|
r.delete(n);
|
|
4448
4766
|
return;
|
|
4449
4767
|
}
|
|
4450
|
-
let s =
|
|
4768
|
+
let s = xs(t, e.column);
|
|
4451
4769
|
e.op === "min" || e.op === "max" ? (a.extreme !== void 0 && s === a.extreme && i.add(n), r.set(n, {
|
|
4452
4770
|
count: o,
|
|
4453
4771
|
...a.extreme === void 0 ? {} : { extreme: a.extreme }
|
|
@@ -4456,7 +4774,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4456
4774
|
...e.op === "sum" || e.op === "avg" ? { sum: (a.sum ?? 0) - s } : {}
|
|
4457
4775
|
});
|
|
4458
4776
|
}, o = (t) => {
|
|
4459
|
-
let n = $(t, e.groupBy), i = r.get(n), a =
|
|
4777
|
+
let n = $(t, e.groupBy), i = r.get(n), a = xs(t, e.column);
|
|
4460
4778
|
if (i === void 0) {
|
|
4461
4779
|
r.set(n, {
|
|
4462
4780
|
count: 1,
|
|
@@ -4476,15 +4794,15 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4476
4794
|
state: r,
|
|
4477
4795
|
rescanGroups: [...i]
|
|
4478
4796
|
};
|
|
4479
|
-
},
|
|
4797
|
+
}, Es = (e, t, n, r) => {
|
|
4480
4798
|
if (n.length === 0) return t;
|
|
4481
|
-
let i = new Set(n), a =
|
|
4799
|
+
let i = new Set(n), a = Cs(e, r.filter((t) => i.has($(t, e.groupBy)))), o = new Map(t);
|
|
4482
4800
|
for (let e of i) {
|
|
4483
4801
|
let t = a.get(e);
|
|
4484
4802
|
t === void 0 ? o.delete(e) : o.set(e, t);
|
|
4485
4803
|
}
|
|
4486
4804
|
return o;
|
|
4487
|
-
},
|
|
4805
|
+
}, Ds = class {
|
|
4488
4806
|
shape;
|
|
4489
4807
|
state = /* @__PURE__ */ new Map();
|
|
4490
4808
|
groups = /* @__PURE__ */ new Map();
|
|
@@ -4492,7 +4810,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4492
4810
|
this.shape = e;
|
|
4493
4811
|
}
|
|
4494
4812
|
seed(e) {
|
|
4495
|
-
this.state =
|
|
4813
|
+
this.state = Cs(this.shape, e), this.groups.clear();
|
|
4496
4814
|
for (let t of e) {
|
|
4497
4815
|
let e = $(t, this.shape.groupBy);
|
|
4498
4816
|
this.groups.has(e) || this.groups.set(e, this.groupValues(t));
|
|
@@ -4504,14 +4822,14 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4504
4822
|
let e = $(t, this.shape.groupBy);
|
|
4505
4823
|
this.groups.has(e) || this.groups.set(e, this.groupValues(t));
|
|
4506
4824
|
}
|
|
4507
|
-
let n =
|
|
4825
|
+
let n = Ts(this.shape, this.state, e);
|
|
4508
4826
|
this.state = n.state;
|
|
4509
4827
|
for (let e of this.groups.keys()) this.state.has(e) || this.groups.delete(e);
|
|
4510
4828
|
return n.rescanGroups;
|
|
4511
4829
|
}
|
|
4512
4830
|
resolveRescan(e, t) {
|
|
4513
4831
|
if (e.length === 0) return;
|
|
4514
|
-
this.state =
|
|
4832
|
+
this.state = Es(this.shape, this.state, e, t);
|
|
4515
4833
|
let n = new Set(e);
|
|
4516
4834
|
for (let e of t) {
|
|
4517
4835
|
let t = $(e, this.shape.groupBy);
|
|
@@ -4520,7 +4838,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4520
4838
|
for (let e of n) this.state.has(e) || this.groups.delete(e);
|
|
4521
4839
|
}
|
|
4522
4840
|
materialize() {
|
|
4523
|
-
return
|
|
4841
|
+
return ws(this.shape, this.state).map((e) => ({
|
|
4524
4842
|
groupKey: e.groupKey,
|
|
4525
4843
|
group: this.groups.get(e.groupKey) ?? {},
|
|
4526
4844
|
value: e.value
|
|
@@ -4533,70 +4851,19 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4533
4851
|
for (let r of t) n[r] = e[r];
|
|
4534
4852
|
return n;
|
|
4535
4853
|
}
|
|
4536
|
-
},
|
|
4537
|
-
action: I.String,
|
|
4538
|
-
resourceType: I.String,
|
|
4539
|
-
resourceId: I.String
|
|
4540
|
-
}) {}, Jo = /* @__PURE__ */ new Map(), Yo = (e) => {
|
|
4541
|
-
if (typeof e.resourceType != "string" || e.resourceType.length === 0) throw Error("defineResourcePolicy: a non-empty `resourceType` is required");
|
|
4542
|
-
if (e.actions === void 0 || Object.keys(e.actions).length === 0) throw Error(`resource policy '${e.resourceType}': at least one action is required`);
|
|
4543
|
-
if (Jo.has(e.resourceType)) throw Error(`resource policy '${e.resourceType}' is already registered — types must be unique`);
|
|
4544
|
-
return Jo.set(e.resourceType, e), e;
|
|
4545
|
-
}, Xo = (e) => Jo.get(e), Zo = () => [...Jo.values()], Qo = () => Jo.clear(), $o = () => Zo().map((e) => {
|
|
4546
|
-
let t = /* @__PURE__ */ new Set();
|
|
4547
|
-
for (let n of Object.values(e.actions)) for (let e of n) t.add(e);
|
|
4548
|
-
for (let [n, r] of Object.entries(e.implies ?? {})) {
|
|
4549
|
-
t.add(n);
|
|
4550
|
-
for (let e of r) t.add(e);
|
|
4551
|
-
}
|
|
4552
|
-
return {
|
|
4553
|
-
resourceType: e.resourceType,
|
|
4554
|
-
actions: e.actions,
|
|
4555
|
-
relations: [...t],
|
|
4556
|
-
implies: e.implies ?? {}
|
|
4557
|
-
};
|
|
4558
|
-
}), es = (e, t) => {
|
|
4559
|
-
let n = new Set(e);
|
|
4560
|
-
if (t === void 0) return n;
|
|
4561
|
-
let r = [...e];
|
|
4562
|
-
for (; r.length > 0;) {
|
|
4563
|
-
let e = r.pop();
|
|
4564
|
-
for (let i of t[e] ?? []) n.has(i) || (n.add(i), r.push(i));
|
|
4565
|
-
}
|
|
4566
|
-
return n;
|
|
4567
|
-
}, ts = (e, t, n, r) => e.id === null ? /* @__PURE__ */ new Set() : es(n.filter((n) => n.subjectId === e.id && n.resourceType === t.type && n.resourceId === t.id).map((e) => e.relation), r.implies), ns = (e, t, n, r) => {
|
|
4568
|
-
if (e.scopes?.includes("admin:full")) return !0;
|
|
4569
|
-
if (e.id === null || n.tenantId != null && e.tenantId !== n.tenantId) return !1;
|
|
4570
|
-
let i = r.policy.actions[t];
|
|
4571
|
-
if (i === void 0 || i.length === 0) return !1;
|
|
4572
|
-
let a = ts(e, n, r.tuples, r.policy);
|
|
4573
|
-
return i.some((e) => a.has(e));
|
|
4574
|
-
}, rs = (e, t, n, r) => {
|
|
4575
|
-
if (!ns(e, t, n, r)) throw new qo({
|
|
4576
|
-
action: t,
|
|
4577
|
-
resourceType: n.type,
|
|
4578
|
-
resourceId: n.id
|
|
4579
|
-
});
|
|
4580
|
-
}, is = (e, t, n, r, i) => r.filter((r) => ns(e, t, {
|
|
4581
|
-
type: n,
|
|
4582
|
-
id: r.id,
|
|
4583
|
-
...r.tenantId === void 0 ? {} : { tenantId: r.tenantId }
|
|
4584
|
-
}, i)), as = (e, t) => {
|
|
4585
|
-
let n = new Set(t.map((e) => e.id));
|
|
4586
|
-
return e.filter((e) => !n.has(e.id)).map((e) => e.id);
|
|
4587
|
-
}, os = E("_voltro_rebac_tuples", {
|
|
4854
|
+
}, Os = T("_voltro_rebac_tuples", {
|
|
4588
4855
|
id: v({ prefix: "rbct" }),
|
|
4589
|
-
subjectId:
|
|
4590
|
-
relation:
|
|
4591
|
-
resourceType:
|
|
4592
|
-
resourceId:
|
|
4593
|
-
tenantId:
|
|
4594
|
-
createdAt:
|
|
4856
|
+
subjectId: E(),
|
|
4857
|
+
relation: E(),
|
|
4858
|
+
resourceType: E(),
|
|
4859
|
+
resourceId: E(),
|
|
4860
|
+
tenantId: E().nullable(),
|
|
4861
|
+
createdAt: D().default("now")
|
|
4595
4862
|
}).index([
|
|
4596
4863
|
"subjectId",
|
|
4597
4864
|
"resourceType",
|
|
4598
4865
|
"resourceId"
|
|
4599
|
-
]).reactive(),
|
|
4866
|
+
]).reactive(), ks = async (e, n, r, i) => n === null ? [] : (await e.query({
|
|
4600
4867
|
table: "_voltro_rebac_tuples",
|
|
4601
4868
|
predicate: t(u("subjectId", n), u("resourceType", r), u("resourceId", i)),
|
|
4602
4869
|
order: [],
|
|
@@ -4608,16 +4875,16 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4608
4875
|
relation: e.relation,
|
|
4609
4876
|
resourceType: e.resourceType,
|
|
4610
4877
|
resourceId: e.resourceId
|
|
4611
|
-
})),
|
|
4878
|
+
})), As = (e) => ({
|
|
4612
4879
|
id: e.id,
|
|
4613
4880
|
tenantId: e.tenantId,
|
|
4614
4881
|
...e.scopes === void 0 ? {} : { scopes: e.scopes }
|
|
4615
|
-
}),
|
|
4616
|
-
let n = t.getPolicy ??
|
|
4882
|
+
}), js = (e, t) => {
|
|
4883
|
+
let n = t.getPolicy ?? la;
|
|
4617
4884
|
return (r, i) => {
|
|
4618
4885
|
let a = e[i.tag];
|
|
4619
4886
|
if (a === void 0) return r;
|
|
4620
|
-
let o = n(a.resourceType), s = (e) => j.fail(new
|
|
4887
|
+
let o = n(a.resourceType), s = (e) => j.fail(new oa({
|
|
4621
4888
|
action: a.action,
|
|
4622
4889
|
resourceType: a.resourceType,
|
|
4623
4890
|
resourceId: e
|
|
@@ -4625,17 +4892,17 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4625
4892
|
if (o === void 0) return s("");
|
|
4626
4893
|
let c = a.resourceId(i.input);
|
|
4627
4894
|
if (c === null || c === "") return s("");
|
|
4628
|
-
let l =
|
|
4895
|
+
let l = As(i.subject), u = {
|
|
4629
4896
|
type: a.resourceType,
|
|
4630
4897
|
id: c,
|
|
4631
4898
|
tenantId: i.subject.tenantId
|
|
4632
4899
|
};
|
|
4633
|
-
return j.flatMap(j.promise(async () => t.loadTuples(l.id, a.resourceType, c)), (e) =>
|
|
4900
|
+
return j.flatMap(j.promise(async () => t.loadTuples(l.id, a.resourceType, c)), (e) => ha(l, a.action, u, {
|
|
4634
4901
|
policy: o,
|
|
4635
4902
|
tuples: e
|
|
4636
4903
|
}) ? r : s(c));
|
|
4637
4904
|
};
|
|
4638
|
-
},
|
|
4905
|
+
}, Ms = async (e, n, r) => n === null ? [] : (await e.query({
|
|
4639
4906
|
table: "_voltro_rebac_tuples",
|
|
4640
4907
|
predicate: t(u("subjectId", n), u("resourceType", r)),
|
|
4641
4908
|
order: [],
|
|
@@ -4647,18 +4914,18 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4647
4914
|
relation: e.relation,
|
|
4648
4915
|
resourceType: e.resourceType,
|
|
4649
4916
|
resourceId: e.resourceId
|
|
4650
|
-
})),
|
|
4651
|
-
let t = e.getPolicy ??
|
|
4917
|
+
})), Ns = (e) => {
|
|
4918
|
+
let t = e.getPolicy ?? la;
|
|
4652
4919
|
return async (n, r, i, a) => {
|
|
4653
4920
|
let o = t(r);
|
|
4654
4921
|
if (o === void 0) return [];
|
|
4655
|
-
let s =
|
|
4656
|
-
return
|
|
4922
|
+
let s = As(n);
|
|
4923
|
+
return _a(s, i, r, a, {
|
|
4657
4924
|
policy: o,
|
|
4658
4925
|
tuples: await e.loadSubjectTuples(s.id, r)
|
|
4659
4926
|
});
|
|
4660
4927
|
};
|
|
4661
|
-
},
|
|
4928
|
+
}, Ps = (e) => {
|
|
4662
4929
|
if (typeof e.name != "string" || e.name.length === 0) throw Error("defineReaction: a non-empty `name` is required");
|
|
4663
4930
|
if (e.watch === void 0 || typeof e.watch.table != "string" || e.watch.table.length === 0) throw Error(`reaction '${e.name}': watch.table is required`);
|
|
4664
4931
|
if (e.act === void 0 || e.act.kind !== "agent" && e.act.kind !== "workflow") throw Error(`reaction '${e.name}': act must be { kind: 'agent' | 'workflow', … }`);
|
|
@@ -4666,14 +4933,14 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4666
4933
|
if (e.guards.rateLimit !== void 0 && (e.guards.rateLimit.limit <= 0 || e.guards.rateLimit.windowMs <= 0)) throw Error(`reaction '${e.name}': guards.rateLimit needs positive limit + windowMs`);
|
|
4667
4934
|
if (e.guards.costBudgetUsd !== void 0 && e.guards.costBudgetUsd < 0) throw Error(`reaction '${e.name}': guards.costBudgetUsd must be >= 0`);
|
|
4668
4935
|
return e;
|
|
4669
|
-
},
|
|
4936
|
+
}, Fs = (e, t) => e === void 0 ? !0 : Array.isArray(e) ? e.includes(t) : e === t, Is = (e) => e.new?.tenantId ?? e.old?.tenantId ?? null, Ls = class {
|
|
4670
4937
|
hits = /* @__PURE__ */ new Map();
|
|
4671
4938
|
allow(e, t, n, r) {
|
|
4672
4939
|
let i = r - n, a = (this.hits.get(e) ?? []).filter((e) => e > i);
|
|
4673
4940
|
return a.length >= t ? (this.hits.set(e, a), !1) : (a.push(r), this.hits.set(e, a), !0);
|
|
4674
4941
|
}
|
|
4675
|
-
},
|
|
4676
|
-
if (t.table !== e.watch.table || !
|
|
4942
|
+
}, Rs = async (e, t, n) => {
|
|
4943
|
+
if (t.table !== e.watch.table || !Fs(e.watch.on, t.op)) return "skipped-op";
|
|
4677
4944
|
if (e.when !== void 0 && !e.when(t)) return "skipped-when";
|
|
4678
4945
|
let r = `${e.name}:${e.guards.dedupeKey(t)}`;
|
|
4679
4946
|
if (await n.dedupe.has(r)) return "skipped-dedupe";
|
|
@@ -4682,26 +4949,26 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4682
4949
|
let t = n.now?.() ?? Date.now();
|
|
4683
4950
|
if (!n.rateLimiter.allow(e.name, i.limit, i.windowMs, t)) return "skipped-ratelimit";
|
|
4684
4951
|
}
|
|
4685
|
-
let a =
|
|
4952
|
+
let a = Is(t);
|
|
4686
4953
|
return e.guards.costBudgetUsd !== void 0 && n.checkBudget !== void 0 && !await n.checkBudget(a, e.guards.costBudgetUsd) ? "skipped-budget" : (await n.runAct(e.act, t, {
|
|
4687
4954
|
id: a,
|
|
4688
4955
|
via: "agent"
|
|
4689
4956
|
}), await n.dedupe.add(r), "acted");
|
|
4690
|
-
},
|
|
4957
|
+
}, zs = T("_voltro_wakeups", {
|
|
4691
4958
|
id: v({ prefix: "wakeup" }),
|
|
4692
|
-
tenantId:
|
|
4693
|
-
kind:
|
|
4694
|
-
refId:
|
|
4695
|
-
wakeAt:
|
|
4696
|
-
status:
|
|
4697
|
-
}).index(["status", "wakeAt"]).index(["tenantId"]),
|
|
4698
|
-
let t = e.now?.() ?? /* @__PURE__ */ new Date(), n = await
|
|
4959
|
+
tenantId: E(),
|
|
4960
|
+
kind: E(),
|
|
4961
|
+
refId: E(),
|
|
4962
|
+
wakeAt: D(),
|
|
4963
|
+
status: E()
|
|
4964
|
+
}).index(["status", "wakeAt"]).index(["tenantId"]), Bs = async (e) => {
|
|
4965
|
+
let t = e.now?.() ?? /* @__PURE__ */ new Date(), n = await xo(e.store, t, e.batchLimit ?? 100);
|
|
4699
4966
|
if (n.length === 0) return 0;
|
|
4700
4967
|
let r = 0;
|
|
4701
|
-
for (let t of n) if (await
|
|
4968
|
+
for (let t of n) if (await _o(e.store, t)) try {
|
|
4702
4969
|
await e.adapter.wake(t), r++;
|
|
4703
4970
|
} catch (n) {
|
|
4704
|
-
await
|
|
4971
|
+
await vo(e.store, t), e.log?.warn("wake: adapter failed — released for retry", {
|
|
4705
4972
|
tenantId: t.tenantId,
|
|
4706
4973
|
kind: t.kind,
|
|
4707
4974
|
refId: t.refId,
|
|
@@ -4709,11 +4976,11 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4709
4976
|
});
|
|
4710
4977
|
}
|
|
4711
4978
|
return r > 0 && e.log?.info("wake: woke due deployments", { count: r }), r;
|
|
4712
|
-
},
|
|
4979
|
+
}, Vs = (e, t = 1e3) => {
|
|
4713
4980
|
let n = !1, r, i = async () => {
|
|
4714
4981
|
if (!n) {
|
|
4715
4982
|
try {
|
|
4716
|
-
await
|
|
4983
|
+
await Bs(e);
|
|
4717
4984
|
} catch (t) {
|
|
4718
4985
|
e.log?.warn("wake: tick failed", { reason: t instanceof Error ? t.message : String(t) });
|
|
4719
4986
|
}
|
|
@@ -4723,10 +4990,10 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4723
4990
|
return i(), { stop: () => {
|
|
4724
4991
|
n = !0, r !== void 0 && clearTimeout(r);
|
|
4725
4992
|
} };
|
|
4726
|
-
},
|
|
4993
|
+
}, Hs = (e) => ({ wake: async () => {
|
|
4727
4994
|
await e.start();
|
|
4728
|
-
} }),
|
|
4729
|
-
let t = e.fetchImpl ?? fetch, n = e.now ?? Date.now, r = e.sleep ??
|
|
4995
|
+
} }), Us = (e) => new Promise((t) => setTimeout(t, e)), Ws = (e) => {
|
|
4996
|
+
let t = e.fetchImpl ?? fetch, n = e.now ?? Date.now, r = e.sleep ?? Us, i = e.spawnImpl ?? vt, a = e.startTimeoutMs ?? 3e4, o = e.healthPollMs ?? 200, s = e.stopSignal ?? "SIGTERM", c = e.stopGraceMs ?? 1e4, l, u, d = e.healthCheck ?? ((e) => e.ok), f = async () => {
|
|
4730
4997
|
try {
|
|
4731
4998
|
let n = await t(e.healthUrl);
|
|
4732
4999
|
return d(n);
|
|
@@ -4780,11 +5047,11 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4780
5047
|
},
|
|
4781
5048
|
stop: m
|
|
4782
5049
|
};
|
|
4783
|
-
},
|
|
5050
|
+
}, Gs = async (e) => {
|
|
4784
5051
|
if (e.signals.connectedClients() > 0 || e.signals.inFlightRequests() > 0 || e.signals.activeWorkflowExecutions() > 0) return !1;
|
|
4785
|
-
let t = (e.now?.() ?? /* @__PURE__ */ new Date()).getTime() + (e.wakeLookaheadMs ?? 3e4), n = await
|
|
5052
|
+
let t = (e.now?.() ?? /* @__PURE__ */ new Date()).getTime() + (e.wakeLookaheadMs ?? 3e4), n = await So(e.store);
|
|
4786
5053
|
return !(n !== null && n.wakeAt.getTime() <= t);
|
|
4787
|
-
},
|
|
5054
|
+
}, Ks = (e, t = Date.now) => {
|
|
4788
5055
|
let n;
|
|
4789
5056
|
return {
|
|
4790
5057
|
update: (r) => {
|
|
@@ -4796,7 +5063,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4796
5063
|
n = void 0;
|
|
4797
5064
|
}
|
|
4798
5065
|
};
|
|
4799
|
-
},
|
|
5066
|
+
}, qs = () => {
|
|
4800
5067
|
let e = 0, t = 0;
|
|
4801
5068
|
return {
|
|
4802
5069
|
onRequestStart: () => {
|
|
@@ -4814,8 +5081,8 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4814
5081
|
inFlightRequests: () => e,
|
|
4815
5082
|
openConnections: () => t
|
|
4816
5083
|
};
|
|
4817
|
-
},
|
|
4818
|
-
let o =
|
|
5084
|
+
}, Js = (e) => ({ run: async (t) => (e.onActivity?.(), await e.ensureAwake(), t()) }), Ys = (e, t, n, r) => new Promise((i, a) => {
|
|
5085
|
+
let o = Ge.request({
|
|
4819
5086
|
host: n,
|
|
4820
5087
|
port: r,
|
|
4821
5088
|
method: e.method,
|
|
@@ -4825,8 +5092,8 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4825
5092
|
t.writeHead(e.statusCode ?? 502, e.headers), e.pipe(t), e.on("end", i), e.on("error", a);
|
|
4826
5093
|
});
|
|
4827
5094
|
o.on("error", a), e.pipe(o);
|
|
4828
|
-
}),
|
|
4829
|
-
let s =
|
|
5095
|
+
}), Xs = (e, t, n, r, i) => new Promise((a, o) => {
|
|
5096
|
+
let s = Ge.request({
|
|
4830
5097
|
host: r,
|
|
4831
5098
|
port: i,
|
|
4832
5099
|
method: e.method,
|
|
@@ -4840,21 +5107,21 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4840
5107
|
};
|
|
4841
5108
|
t.on("close", s), r.on("close", s), r.on("error", o);
|
|
4842
5109
|
}), s.on("error", o), s.end();
|
|
4843
|
-
}),
|
|
4844
|
-
let t =
|
|
5110
|
+
}), Zs = (e) => {
|
|
5111
|
+
let t = Js({
|
|
4845
5112
|
ensureAwake: () => e.supervisor.start(),
|
|
4846
5113
|
...e.onActivity === void 0 ? {} : { onActivity: e.onActivity }
|
|
4847
|
-
}), n = e.activity, r =
|
|
4848
|
-
n?.onRequestStart(), i.on("close", () => n?.onRequestEnd()), t.run(() =>
|
|
5114
|
+
}), n = e.activity, r = Ge.createServer((r, i) => {
|
|
5115
|
+
n?.onRequestStart(), i.on("close", () => n?.onRequestEnd()), t.run(() => Ys(r, i, e.targetHost, e.targetPort)).catch((t) => {
|
|
4849
5116
|
e.log?.warn("wake-router: proxy failed", { reason: t instanceof Error ? t.message : String(t) }), i.headersSent || i.writeHead(502), i.end("wake/proxy failed");
|
|
4850
5117
|
});
|
|
4851
5118
|
});
|
|
4852
5119
|
return r.on("upgrade", (r, i, a) => {
|
|
4853
|
-
n?.onConnect(), i.on("close", () => n?.onDisconnect()), t.run(() =>
|
|
5120
|
+
n?.onConnect(), i.on("close", () => n?.onDisconnect()), t.run(() => Xs(r, i, a, e.targetHost, e.targetPort)).catch((t) => {
|
|
4854
5121
|
e.log?.warn("wake-router: upgrade proxy failed", { reason: t instanceof Error ? t.message : String(t) }), i.destroy();
|
|
4855
5122
|
});
|
|
4856
5123
|
}), r;
|
|
4857
|
-
},
|
|
5124
|
+
}, Qs = async (e) => {
|
|
4858
5125
|
try {
|
|
4859
5126
|
return (await e.query({
|
|
4860
5127
|
table: "_voltro_workflow_runs",
|
|
@@ -4871,15 +5138,15 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4871
5138
|
} catch {
|
|
4872
5139
|
return 0;
|
|
4873
5140
|
}
|
|
4874
|
-
},
|
|
4875
|
-
let t =
|
|
5141
|
+
}, $s = async (e) => {
|
|
5142
|
+
let t = Hs(e.supervisor), n = await Bs({
|
|
4876
5143
|
store: e.store,
|
|
4877
5144
|
adapter: t,
|
|
4878
5145
|
...e.now === void 0 ? {} : { now: e.now },
|
|
4879
5146
|
...e.log === void 0 ? {} : { log: e.log }
|
|
4880
5147
|
});
|
|
4881
5148
|
n > 0 && e.idleGate.reset();
|
|
4882
|
-
let r = await
|
|
5149
|
+
let r = await Gs({
|
|
4883
5150
|
store: e.store,
|
|
4884
5151
|
signals: e.signals,
|
|
4885
5152
|
...e.wakeLookaheadMs === void 0 ? {} : { wakeLookaheadMs: e.wakeLookaheadMs },
|
|
@@ -4889,12 +5156,12 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4889
5156
|
woke: n,
|
|
4890
5157
|
stopped: i
|
|
4891
5158
|
};
|
|
4892
|
-
},
|
|
4893
|
-
let t =
|
|
5159
|
+
}, ec = async (e) => {
|
|
5160
|
+
let t = Ks(e.idleGraceMs ?? 6e4), n = e.tickMs ?? 1e3, r = qs(), i = 0, a = e.signals === void 0, o = e.signals ?? {
|
|
4894
5161
|
connectedClients: () => r.openConnections(),
|
|
4895
5162
|
inFlightRequests: () => r.inFlightRequests(),
|
|
4896
5163
|
activeWorkflowExecutions: () => i
|
|
4897
|
-
}, s =
|
|
5164
|
+
}, s = Zs({
|
|
4898
5165
|
supervisor: e.supervisor,
|
|
4899
5166
|
targetHost: e.targetHost,
|
|
4900
5167
|
targetPort: e.targetPort,
|
|
@@ -4913,7 +5180,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4913
5180
|
let l = !1, u, d = e.firedRetentionMs ?? 10 * 6e4, f = 0, p = async () => {
|
|
4914
5181
|
if (!l) {
|
|
4915
5182
|
try {
|
|
4916
|
-
if (a && (i = await
|
|
5183
|
+
if (a && (i = await Qs(e.store)), await $s({
|
|
4917
5184
|
store: e.store,
|
|
4918
5185
|
supervisor: e.supervisor,
|
|
4919
5186
|
signals: o,
|
|
@@ -4921,7 +5188,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4921
5188
|
...e.wakeLookaheadMs === void 0 ? {} : { wakeLookaheadMs: e.wakeLookaheadMs },
|
|
4922
5189
|
...e.log === void 0 ? {} : { log: e.log }
|
|
4923
5190
|
}), f++ % 60 == 0) {
|
|
4924
|
-
let t = await
|
|
5191
|
+
let t = await wo(e.store, { firedOlderThan: new Date(Date.now() - d) });
|
|
4925
5192
|
t > 0 && e.log?.info("orchestrator: pruned fired wakeups", { count: t });
|
|
4926
5193
|
}
|
|
4927
5194
|
} catch (t) {
|
|
@@ -4936,14 +5203,14 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4936
5203
|
l = !0, u !== void 0 && clearTimeout(u), await new Promise((e) => s.close(() => e()));
|
|
4937
5204
|
}
|
|
4938
5205
|
};
|
|
4939
|
-
},
|
|
5206
|
+
}, tc = (e) => e, nc = class extends I.TaggedError()("AnalyticsError", {
|
|
4940
5207
|
provider: I.String,
|
|
4941
5208
|
operation: I.String,
|
|
4942
5209
|
cause: I.String
|
|
4943
|
-
}) {},
|
|
5210
|
+
}) {}, rc = class extends I.TaggedError()("AnalyticsCapabilityNotSupported", {
|
|
4944
5211
|
provider: I.String,
|
|
4945
5212
|
capability: I.String
|
|
4946
|
-
}) {},
|
|
5213
|
+
}) {}, ic = class extends Ie.Tag("@voltro/AnalyticsSink")() {}, ac = (e, t) => ({
|
|
4947
5214
|
info: e.info,
|
|
4948
5215
|
track: (n) => e.track(n.tenantId === void 0 ? {
|
|
4949
5216
|
...n,
|
|
@@ -4962,20 +5229,20 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4962
5229
|
tenantId: t
|
|
4963
5230
|
} : n),
|
|
4964
5231
|
...e.mirror === void 0 ? {} : { mirror: e.mirror }
|
|
4965
|
-
}),
|
|
4966
|
-
let e = yield*
|
|
5232
|
+
}), oc = () => j.gen(function* () {
|
|
5233
|
+
let e = yield* ic, t = yield* j.serviceOption(be), n = P.match(t, {
|
|
4967
5234
|
onNone: () => null,
|
|
4968
5235
|
onSome: (e) => e.tenantId ?? null
|
|
4969
5236
|
});
|
|
4970
|
-
return n === null ? e :
|
|
4971
|
-
}),
|
|
4972
|
-
let e = (e) => j.fail(new
|
|
4973
|
-
provider:
|
|
5237
|
+
return n === null ? e : ac(e, n);
|
|
5238
|
+
}), sc = "noop", cc = () => {
|
|
5239
|
+
let e = (e) => j.fail(new rc({
|
|
5240
|
+
provider: sc,
|
|
4974
5241
|
capability: e
|
|
4975
5242
|
}));
|
|
4976
5243
|
return {
|
|
4977
5244
|
info: {
|
|
4978
|
-
provider:
|
|
5245
|
+
provider: sc,
|
|
4979
5246
|
capabilities: {
|
|
4980
5247
|
track: !0,
|
|
4981
5248
|
aggregate: !1,
|
|
@@ -4989,8 +5256,8 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
4989
5256
|
timeseries: () => e("timeseries"),
|
|
4990
5257
|
topN: () => e("topN")
|
|
4991
5258
|
};
|
|
4992
|
-
},
|
|
4993
|
-
if (e.length === 0) return
|
|
5259
|
+
}, lc = (e) => {
|
|
5260
|
+
if (e.length === 0) return cc();
|
|
4994
5261
|
if (e.length === 1) return e[0];
|
|
4995
5262
|
let t = {
|
|
4996
5263
|
provider: "compose",
|
|
@@ -5007,7 +5274,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5007
5274
|
discard: !0
|
|
5008
5275
|
}), r = (t, n) => {
|
|
5009
5276
|
let r = e.find((e) => e.info.capabilities[t]);
|
|
5010
|
-
return r === void 0 ? j.fail(new
|
|
5277
|
+
return r === void 0 ? j.fail(new rc({
|
|
5011
5278
|
provider: "compose",
|
|
5012
5279
|
capability: t
|
|
5013
5280
|
})) : n(r);
|
|
@@ -5030,11 +5297,11 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5030
5297
|
topN: (e) => r("topN", (t) => t.topN(e)),
|
|
5031
5298
|
...a === void 0 ? {} : { mirror: a }
|
|
5032
5299
|
};
|
|
5033
|
-
},
|
|
5300
|
+
}, uc = (e) => {
|
|
5034
5301
|
let t = e.filter((e) => e.dispose !== void 0);
|
|
5035
5302
|
return {
|
|
5036
5303
|
kind: "compose",
|
|
5037
|
-
build: (t) =>
|
|
5304
|
+
build: (t) => lc(e.map((e) => e.build(t))),
|
|
5038
5305
|
tables: e.flatMap((e) => e.tables ?? []),
|
|
5039
5306
|
initialize: (t) => j.forEach(e, (e) => e.initialize ? e.initialize(t) : j.void, {
|
|
5040
5307
|
concurrency: 1,
|
|
@@ -5045,15 +5312,15 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5045
5312
|
discard: !0
|
|
5046
5313
|
}) } : {}
|
|
5047
5314
|
};
|
|
5048
|
-
},
|
|
5315
|
+
}, dc = {
|
|
5049
5316
|
kind: "noop",
|
|
5050
|
-
build: () =>
|
|
5051
|
-
},
|
|
5317
|
+
build: () => cc()
|
|
5318
|
+
}, fc = {
|
|
5052
5319
|
tables: [],
|
|
5053
5320
|
detach: () => {}
|
|
5054
|
-
},
|
|
5321
|
+
}, pc = (e) => {
|
|
5055
5322
|
let { store: t, sink: n, log: r } = e, i = n.mirror;
|
|
5056
|
-
if (i === void 0 || i.tables.length === 0) return
|
|
5323
|
+
if (i === void 0 || i.tables.length === 0) return fc;
|
|
5057
5324
|
let a = e.run ?? ((e) => j.runPromise(e)), o = i.primaryKey ?? "id", s = new Set(i.tables), c = (e) => {
|
|
5058
5325
|
if (e.op === "delete") {
|
|
5059
5326
|
let t = e.old;
|
|
@@ -5077,11 +5344,11 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5077
5344
|
tables: i.tables,
|
|
5078
5345
|
detach: l
|
|
5079
5346
|
};
|
|
5080
|
-
},
|
|
5347
|
+
}, mc = (e) => {
|
|
5081
5348
|
let t = typeof e.refresh == "string" ? { interval: e.refresh } : e.refresh, n = e.strategy ?? "replace";
|
|
5082
5349
|
if (n === "merge" && (e.mergeKey === void 0 || e.mergeKey.length === 0)) throw Error(`defineAggregate("${e.name}"): strategy: 'merge' requires mergeKey — the property on each row to upsert by`);
|
|
5083
5350
|
if (e.incremental !== void 0) {
|
|
5084
|
-
let t =
|
|
5351
|
+
let t = ys({
|
|
5085
5352
|
aggregations: [{
|
|
5086
5353
|
op: e.incremental.op,
|
|
5087
5354
|
...e.incremental.column === void 0 ? {} : { column: e.incremental.column }
|
|
@@ -5103,38 +5370,38 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5103
5370
|
build: e.build,
|
|
5104
5371
|
...e.incremental === void 0 ? {} : { incremental: e.incremental }
|
|
5105
5372
|
};
|
|
5106
|
-
},
|
|
5373
|
+
}, hc = (e) => typeof e == "object" && !!e && e._voltroAggregate === !0, gc = class extends I.TaggedError()("AggregateStale", {
|
|
5107
5374
|
name: I.String,
|
|
5108
5375
|
ageMs: I.Number,
|
|
5109
5376
|
maxAgeMs: I.Number
|
|
5110
|
-
}) {},
|
|
5377
|
+
}) {}, _c = class extends I.TaggedError()("AggregateNotFound", { name: I.String }) {}, vc = class extends I.TaggedError()("AggregateError", {
|
|
5111
5378
|
name: I.String,
|
|
5112
5379
|
operation: I.String,
|
|
5113
5380
|
cause: I.String
|
|
5114
|
-
}) {},
|
|
5115
|
-
return (yield*
|
|
5116
|
-
}),
|
|
5381
|
+
}) {}, yc = class extends Ie.Tag("@voltro/AggregateRegistry")() {}, bc = (e) => j.gen(function* () {
|
|
5382
|
+
return (yield* yc).getHandle(e);
|
|
5383
|
+
}), xc = (e, n, r) => {
|
|
5117
5384
|
if (e.crossTenant || !n.has(e.table) || r == null) return e;
|
|
5118
5385
|
let i = u("tenantId", r);
|
|
5119
5386
|
return {
|
|
5120
5387
|
...e,
|
|
5121
5388
|
predicate: e.predicate ? t(e.predicate, i) : i
|
|
5122
5389
|
};
|
|
5123
|
-
},
|
|
5390
|
+
}, Sc = (e, n) => {
|
|
5124
5391
|
if (e.includeDeleted || !n.has(e.table)) return e;
|
|
5125
|
-
let r =
|
|
5392
|
+
let r = S("deletedAt");
|
|
5126
5393
|
return {
|
|
5127
5394
|
...e,
|
|
5128
5395
|
predicate: e.predicate ? t(e.predicate, r) : r
|
|
5129
5396
|
};
|
|
5130
|
-
},
|
|
5131
|
-
if (
|
|
5397
|
+
}, Cc = (e) => j.runPromiseExit(e).then((e) => {
|
|
5398
|
+
if (Be.isSuccess(e)) return e.value;
|
|
5132
5399
|
let t = k.failureOption(e.cause);
|
|
5133
5400
|
throw P.isSome(t) ? t.value : k.squash(e.cause);
|
|
5134
|
-
}),
|
|
5135
|
-
let
|
|
5136
|
-
if (
|
|
5137
|
-
},
|
|
5401
|
+
}), wc = (e, t) => e.pipe(j.provideService(be, t)), Tc = async (e, t, n) => {
|
|
5402
|
+
let r = await j.runPromise(Te(t, e.guards, n));
|
|
5403
|
+
if (r) throw r;
|
|
5404
|
+
}, Ec = async (e) => {
|
|
5138
5405
|
let t = `${e.kind}.${e.name}`, n = Date.now(), r = "ok";
|
|
5139
5406
|
try {
|
|
5140
5407
|
if (e.interceptor) {
|
|
@@ -5149,7 +5416,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5149
5416
|
traceId: e.requestContext.traceId,
|
|
5150
5417
|
...e.requestContext.spanId === void 0 ? {} : { spanId: e.requestContext.spanId }
|
|
5151
5418
|
}), r = await j.runPromiseExit(n);
|
|
5152
|
-
if (
|
|
5419
|
+
if (Be.isSuccess(r)) return r.value;
|
|
5153
5420
|
throw k.squash(r.cause);
|
|
5154
5421
|
}
|
|
5155
5422
|
return await e.runExecutor();
|
|
@@ -5163,27 +5430,27 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5163
5430
|
status: r
|
|
5164
5431
|
});
|
|
5165
5432
|
}
|
|
5166
|
-
},
|
|
5433
|
+
}, Dc = /* @__PURE__ */ new Set([1213, 1205]), Oc = /* @__PURE__ */ new Set([
|
|
5167
5434
|
"ER_LOCK_DEADLOCK",
|
|
5168
5435
|
"ER_LOCK_WAIT_TIMEOUT",
|
|
5169
5436
|
"40001",
|
|
5170
5437
|
"40P01"
|
|
5171
|
-
]),
|
|
5438
|
+
]), kc = (e) => {
|
|
5172
5439
|
let t = e;
|
|
5173
5440
|
for (let e = 0; e < 6 && typeof t == "object" && t; e++) {
|
|
5174
5441
|
let e = t;
|
|
5175
|
-
if (typeof e.errno == "number" &&
|
|
5442
|
+
if (typeof e.errno == "number" && Dc.has(e.errno) || typeof e.code == "string" && Oc.has(e.code) || typeof e.sqlState == "string" && Oc.has(e.sqlState)) return !0;
|
|
5176
5443
|
t = e.cause;
|
|
5177
5444
|
}
|
|
5178
5445
|
return !1;
|
|
5179
|
-
},
|
|
5446
|
+
}, Ac = 3, jc = (e) => new Promise((t) => setTimeout(t, e)), Mc = async (e) => {
|
|
5180
5447
|
for (let t = 1;; t++) try {
|
|
5181
5448
|
return await e();
|
|
5182
5449
|
} catch (e) {
|
|
5183
|
-
if (t >=
|
|
5184
|
-
await
|
|
5450
|
+
if (t >= Ac || !kc(e)) throw e;
|
|
5451
|
+
await jc(t * 20 + Math.floor(Math.random() * 30));
|
|
5185
5452
|
}
|
|
5186
|
-
},
|
|
5453
|
+
}, Nc = (e) => (t, n, r) => Ec({
|
|
5187
5454
|
name: t.descriptor.name,
|
|
5188
5455
|
kind: "mutation",
|
|
5189
5456
|
input: n,
|
|
@@ -5191,11 +5458,11 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5191
5458
|
...e.interceptor ? { interceptor: e.interceptor } : {},
|
|
5192
5459
|
...e.recordMetric ? { recordMetric: e.recordMetric } : {},
|
|
5193
5460
|
runExecutor: async () => {
|
|
5194
|
-
|
|
5195
|
-
let i = [], a = await
|
|
5461
|
+
await Tc(t.descriptor, r.subject, n);
|
|
5462
|
+
let i = [], a = await Mc(async () => (i.length = 0, e.store.transactional(async (a) => {
|
|
5196
5463
|
let o = e.undoCapture?.(a), s = o ? o.tx : a, c = e.buildContext(r, s, { afterCommit: (e) => {
|
|
5197
5464
|
i.push(e);
|
|
5198
|
-
} }), l = t.executor(n, c), u = j.isEffect(l) ? await e.runEffect(
|
|
5465
|
+
} }), l = t.executor(n, c), u = j.isEffect(l) ? await e.runEffect(wc(l, r.subject), c.store) : await l;
|
|
5199
5466
|
return o && await o.persist(c.store, {
|
|
5200
5467
|
tag: t.descriptor.name,
|
|
5201
5468
|
subject: r.subject,
|
|
@@ -5205,34 +5472,44 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5205
5472
|
for (let e of i) await e();
|
|
5206
5473
|
return a;
|
|
5207
5474
|
}
|
|
5208
|
-
}),
|
|
5475
|
+
}), Pc = (e) => e && typeof e == "object" && "descriptor" in e ? e.descriptor : e, Fc = (e) => typeof e == "object" && !!e && !Array.isArray(e) && "table" in e && "order" in e, Ic = (e) => {
|
|
5209
5476
|
let t = e.descriptor.source;
|
|
5210
5477
|
return t == null ? [] : typeof t == "string" ? [t] : [...t];
|
|
5211
|
-
},
|
|
5212
|
-
let
|
|
5213
|
-
|
|
5214
|
-
|
|
5215
|
-
|
|
5216
|
-
let i =
|
|
5217
|
-
|
|
5478
|
+
}, Lc = (e, t) => (n) => () => {
|
|
5479
|
+
let r = e.descriptor.guards;
|
|
5480
|
+
return !r || r.length === 0 ? Promise.resolve(null) : j.runPromise(Te(n, r, t));
|
|
5481
|
+
}, Rc = (e) => (t, n) => (r) => {
|
|
5482
|
+
let i = e.buildContext(r), a = Lc(t, n)(r.subject), o = async () => {
|
|
5483
|
+
let i = await a();
|
|
5484
|
+
if (i) throw i;
|
|
5485
|
+
let o = e.buildContext(r), s = t.executor(n, o);
|
|
5486
|
+
return j.isEffect(s) ? j.runPromise(e.provideEffect(wc(s, r.subject), o.store)) : Pc(await Promise.resolve(s));
|
|
5487
|
+
}, s = (n) => {
|
|
5488
|
+
let i = Pc(n);
|
|
5489
|
+
return Fc(i) ? e.finalize(i, r) : {
|
|
5218
5490
|
__voltroComputed: !0,
|
|
5219
5491
|
value: i,
|
|
5220
|
-
dependentTables:
|
|
5492
|
+
dependentTables: Ic(t),
|
|
5221
5493
|
tenantId: r.subject?.tenantId ?? null,
|
|
5222
|
-
recompute:
|
|
5494
|
+
recompute: o
|
|
5223
5495
|
};
|
|
5224
|
-
},
|
|
5225
|
-
let a =
|
|
5226
|
-
|
|
5227
|
-
|
|
5228
|
-
|
|
5496
|
+
}, c = () => {
|
|
5497
|
+
let a = t.executor(n, i);
|
|
5498
|
+
return j.isEffect(a) ? e.provideEffect(wc(a, r.subject), i.store).pipe(j.map(s)) : a instanceof Promise ? j.promise(() => a).pipe(j.map(s)) : s(a);
|
|
5499
|
+
}, l = () => {
|
|
5500
|
+
let e = t.descriptor.guards;
|
|
5501
|
+
return !e || e.length === 0 ? c() : Te(r.subject, e, n).pipe(j.flatMap((e) => {
|
|
5502
|
+
if (e) return j.fail(e);
|
|
5503
|
+
let t = c();
|
|
5504
|
+
return j.isEffect(t) ? t : j.succeed(t);
|
|
5505
|
+
}));
|
|
5229
5506
|
};
|
|
5230
|
-
if (!e.interceptor) return
|
|
5231
|
-
let
|
|
5232
|
-
let e =
|
|
5507
|
+
if (!e.interceptor) return l();
|
|
5508
|
+
let u = j.suspend(() => {
|
|
5509
|
+
let e = l();
|
|
5233
5510
|
return j.isEffect(e) ? e : j.succeed(e);
|
|
5234
5511
|
});
|
|
5235
|
-
return e.interceptor(
|
|
5512
|
+
return e.interceptor(u, {
|
|
5236
5513
|
tag: t.descriptor.name,
|
|
5237
5514
|
kind: "query",
|
|
5238
5515
|
input: n,
|
|
@@ -5240,7 +5517,7 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5240
5517
|
traceId: r.traceId,
|
|
5241
5518
|
...r.spanId === void 0 ? {} : { spanId: r.spanId }
|
|
5242
5519
|
});
|
|
5243
|
-
},
|
|
5520
|
+
}, zc = (e) => (t, n, r) => Ec({
|
|
5244
5521
|
name: t.descriptor.name,
|
|
5245
5522
|
kind: "action",
|
|
5246
5523
|
input: n,
|
|
@@ -5248,16 +5525,16 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5248
5525
|
...e.interceptor ? { interceptor: e.interceptor } : {},
|
|
5249
5526
|
...e.recordMetric ? { recordMetric: e.recordMetric } : {},
|
|
5250
5527
|
runExecutor: async () => {
|
|
5251
|
-
|
|
5528
|
+
await Tc(t.descriptor, r.subject, n);
|
|
5252
5529
|
let i = e.buildContext(r), a = t.executor(n, i);
|
|
5253
|
-
return j.isEffect(a) ? e.runEffect(
|
|
5530
|
+
return j.isEffect(a) ? e.runEffect(wc(a, r.subject), i.store) : a;
|
|
5254
5531
|
}
|
|
5255
|
-
}),
|
|
5532
|
+
}), Bc = (e) => e instanceof Date ? e.toISOString() : typeof e == "string" && e.length > 0 ? e : null, Vc = (e) => typeof e == "string" && e.length > 0 ? e : null, Hc = [
|
|
5256
5533
|
"updatedAt",
|
|
5257
5534
|
"createdAt",
|
|
5258
5535
|
"updatedBy",
|
|
5259
5536
|
"createdBy"
|
|
5260
|
-
],
|
|
5537
|
+
], Uc = (e) => Hc.some((t) => t in e), Wc = (e, t, n) => {
|
|
5261
5538
|
let r = {
|
|
5262
5539
|
table: t.table,
|
|
5263
5540
|
id: t.id,
|
|
@@ -5272,14 +5549,14 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5272
5549
|
found: !1
|
|
5273
5550
|
};
|
|
5274
5551
|
let i = t.column === void 0 ? void 0 : e[t.column];
|
|
5275
|
-
if (!
|
|
5552
|
+
if (!Uc(e)) return {
|
|
5276
5553
|
...r,
|
|
5277
5554
|
value: i,
|
|
5278
5555
|
lastWrite: null,
|
|
5279
5556
|
attribution: "none",
|
|
5280
5557
|
found: !0
|
|
5281
5558
|
};
|
|
5282
|
-
let a =
|
|
5559
|
+
let a = Vc(e.updatedBy) ?? Vc(e.createdBy), o = Bc(e.updatedAt) ?? Bc(e.createdAt);
|
|
5283
5560
|
return {
|
|
5284
5561
|
...r,
|
|
5285
5562
|
value: i,
|
|
@@ -5291,12 +5568,12 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5291
5568
|
attribution: "audit",
|
|
5292
5569
|
found: !0
|
|
5293
5570
|
};
|
|
5294
|
-
},
|
|
5571
|
+
}, Gc = (e, t) => {
|
|
5295
5572
|
let n = e.map((e) => {
|
|
5296
5573
|
let n = e.newValue ?? e.value, r = t.column !== void 0 && n && typeof n == "object" ? n[t.column] : e.newValue ?? e.value;
|
|
5297
5574
|
return {
|
|
5298
|
-
actor: { id:
|
|
5299
|
-
at:
|
|
5575
|
+
actor: { id: Vc(e.actor) ?? Vc(e.changedBy) },
|
|
5576
|
+
at: Bc(e.at) ?? Bc(e.changedAt),
|
|
5300
5577
|
...e.traceId === void 0 ? {} : { traceId: e.traceId },
|
|
5301
5578
|
value: r
|
|
5302
5579
|
};
|
|
@@ -5311,12 +5588,12 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5311
5588
|
history: n,
|
|
5312
5589
|
found: n.length > 0
|
|
5313
5590
|
};
|
|
5314
|
-
},
|
|
5591
|
+
}, Kc = (e) => {
|
|
5315
5592
|
let t = e.new?.id;
|
|
5316
5593
|
if (typeof t == "string") return t;
|
|
5317
5594
|
let n = e.old?.id;
|
|
5318
5595
|
return typeof n == "string" ? n : void 0;
|
|
5319
|
-
},
|
|
5596
|
+
}, qc = (e) => {
|
|
5320
5597
|
let t = {};
|
|
5321
5598
|
if (e.op === "insert") for (let [n, r] of Object.entries(e.new ?? {})) t[n] = {
|
|
5322
5599
|
from: void 0,
|
|
@@ -5336,11 +5613,11 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5336
5613
|
return {
|
|
5337
5614
|
table: e.table,
|
|
5338
5615
|
op: e.op,
|
|
5339
|
-
id:
|
|
5616
|
+
id: Kc(e),
|
|
5340
5617
|
fields: t
|
|
5341
5618
|
};
|
|
5342
|
-
},
|
|
5343
|
-
let t = e.map(
|
|
5619
|
+
}, Jc = (e) => {
|
|
5620
|
+
let t = e.map(qc);
|
|
5344
5621
|
return {
|
|
5345
5622
|
rows: t,
|
|
5346
5623
|
summary: {
|
|
@@ -5349,21 +5626,21 @@ var q = /* @__PURE__ */ new Map(), jn = (e, t) => {
|
|
|
5349
5626
|
deletes: t.filter((e) => e.op === "delete").length
|
|
5350
5627
|
}
|
|
5351
5628
|
};
|
|
5352
|
-
},
|
|
5629
|
+
}, Yc = class extends Error {
|
|
5353
5630
|
constructor() {
|
|
5354
5631
|
super("voltro:preview-rollback"), this.name = "PreviewRollback";
|
|
5355
5632
|
}
|
|
5356
|
-
},
|
|
5633
|
+
}, Xc = async (e, t) => {
|
|
5357
5634
|
let n, r = !1;
|
|
5358
5635
|
try {
|
|
5359
5636
|
await e.transactional(async (e) => {
|
|
5360
|
-
throw n = await t(e), r = !0, new
|
|
5637
|
+
throw n = await t(e), r = !0, new Yc();
|
|
5361
5638
|
});
|
|
5362
5639
|
} catch (e) {
|
|
5363
|
-
if (!(e instanceof
|
|
5640
|
+
if (!(e instanceof Yc)) throw e;
|
|
5364
5641
|
}
|
|
5365
5642
|
if (!r) throw Error("preview: handler did not complete");
|
|
5366
5643
|
return n;
|
|
5367
|
-
},
|
|
5644
|
+
}, Zc = "framework-runtime";
|
|
5368
5645
|
//#endregion
|
|
5369
|
-
export {
|
|
5646
|
+
export { di as API_KEYS_TABLE, oa as AccessDenied, vc as AggregateError, Ds as AggregateMaintainer, _c as AggregateNotFound, yc as AggregateRegistry, gc as AggregateStale, rc as AnalyticsCapabilityNotSupported, nc as AnalyticsError, ic as AnalyticsSink, Xa as CircuitBreaker, Ja as CircuitOpen, br as DEFAULT_MAX_RPC_BODY_BYTES, Va as DeleteBuilder, Cn as Dispatcher, Di as EffectStore, Rt as InMemoryDataStore, Et as IndexedMatcher, yt as LinearScanMatcher, He as MetricBoundaries, sc as NOOP_ANALYTICS_PROVIDER, Pa as NoRowFound, X as OUTBOX_TABLE, Fa as OptimisticLockError, aa as REBAC_ADMIN_SCOPE, Zc as RUNTIME_NAME, Ls as ReactionRateLimiter, nr as ReplicatedDataStore, za as SelectBuilder, Ti as StoreOperationFailed, kt as SubscriptionRegistry, Ei as TableValidationFailed, wi as TenantScopeViolation, ps as TimelineRecorder, Ko as UndoBoundaryError, Jo as UndoStack, Ba as UpdateBuilder, Da as VOLTRO_AUDIT_MIXIN_ID, Oa as VOLTRO_SOFT_DELETE_MIXIN_ID, ka as VOLTRO_TENANT_MIXIN_ID, Ln as _connectionStreamCount, Rn as _resetConnectionSubjectsForTest, Os as _voltroRebacTuplesTable, Fo as _voltroScheduleClaimsTable, Po as _voltroScheduleRunsTable, Io as _voltroTracesTable, Lo as _voltroUndoLogTable, zs as _voltroWakeupsTable, Yi as _voltroWorkflowEventDeliveriesTable, Ji as _voltroWorkflowEventsTable, Ci as apiKeyManagementRoutes, Wa as applyDefined, Ts as applyDelta, Xo as applyInverse, Zo as applyInverses, Sc as applySoftDeleteScope, xc as applyTenantScope, as as applyUndoInvocation, ga as assertCan, pc as attachAnalyticsMirror, Sr as awaitServerListening, ra as backoffMs, An as bindConnectionSubject, yr as bindMutation, dr as bindStream, ur as bindSubscription, cr as bindSubscriptionUntyped, Cs as buildIvmState, Jc as buildPreview, js as buildRebacInterceptor, Ns as buildRebacReadFilter, Xn as buildSubjectKey, Dr as buildTracingLayer, Hr as cachedBackend, ha as can, mo as cancelWakeup, ys as classifyShape, da as clearResourcePolicies, i as clearRetentions, $a as clearSystemStoreHandle, co as compileCron, uc as composeAnalytics, lc as composeAnalyticsSinks, zn as connectionSubjectsSnapshot, Qs as countRunningWorkflows, gn as counter, tr as currentRoutingContext, Kn as currentTraceContext, bi as dataStoreApiKeyStore, ri as dataStoreIdempotencyStore, ci as dataStoreKvStore, $r as decryptField, mc as defineAggregate, Ui as defineEventTrigger, ea as defineOutboxHandler, Ps as defineReaction, ca as defineResourcePolicy, so as defineSchedule, tc as defineSubscriber, Gr as deriveKey, qc as diffChange, ia as drainOutbox, xo as dueWakeups, ma as effectiveRelations, Na as emptySchemaRegistry, Qr as encryptField, Ir as envSecretsBackend, Un as externalSpanFromTraceparent, Bt as extractDbCause, Ot as fingerprintFor, Vn as formatTraceparent, Yo as forwardChangeFromCdc, xi as frameworkApiKeyStrategy, _n as gauge, pi as generateApiKeyToken, jn as getConnectionSubject, Xr as getFieldCipher, la as getResourcePolicy, hs as getTimelineRecorder, Sa as getTupleSource, $ as groupKeyOf, vn as histogramMetric, Gc as historyProvenance, Ur as httpSecretsBackend, gt as inspectWorkflow, Ca as installPolicyGuardResolver, In as interruptConnectionStreams, Wo as invertChange, hc as isAggregateDefinition, Vt as isForeignKeyViolation, Gs as isIdleNow, gr as isInfraError, qo as isSafeToApply, ao as isScheduleDefinition, Wi as isWorkflowEventTriggerDefinition, Ss as ivmValue, Wc as lastWriteProvenance, ua as listResourcePolicies, ee as listRetentions, ks as loadResourceTuples, Ms as loadSubjectTuples, to as localityAwareSelector, zc as makeActionRunner, Do as makeAdvisoryLockCoordinator, Kr as makeAesCipher, gi as makeApiKeyService, Ht as makeAppAccess, li as makeAsyncKv, Fr as makeBufferingSpanProcessor, No as makeCoordinatedScheduler, Ta as makeDataLoader, Ai as makeEffectStoreLayer, Xi as makeEventsFacade, qr as makeFieldCipher, Ha as makeFluentStore, Ks as makeIdleGate, zi as makeLazyWorkflowFacade, Nc as makeMutationRunner, na as makeOutboxFacade, Li as makePostCommitWorkflowFacade, Hs as makeProcessAdapter, Rc as makeQueryDescriptorProducer, Lc as makeQueryReauthorizer, qs as makeRouterActivity, Aa as makeSchemaRegistry, Ho as makeUndoCapture, Js as makeWakeGate, Zs as makeWakeProxyServer, Ii as makeWorkflowFacade, Ri as makeWorkflowFacadeWithCallerContext, Bi as makeWorkflowHandlers, Vi as makeWorkflowLayers, Mi as makeWorkflowRunHandle, ho as markWakeupFired, ws as materializeIvm, _i as memoryApiKeyStore, ro as memoryReplicationAdapter, Yn as memoryRywPositionStore, lo as nextFiring, So as nextWakeup, Ws as nodeProcessSupervisor, cc as noopAnalytics, dc as noopAnalyticsSpec, ui as noopKv, Nn as onBindConnectionSubject, $i as outboxTable, Hn as parseTraceparent, qn as powerOfTwoSelector, Xc as previewInRollback, wo as pruneWakeups, fa as rebacPolicyGraph, fn as recordSample, U as recordSubscriptionActive, mn as recordSubscriptionDelivery, _s as recordTimelineEvent, us as redactRow, Zn as redisRywPositionStore, os as redoUndoInvocation, Fn as registerConnectionStream, ae as registerRetention, po as registerWakeup, vo as releaseWakeup, Jn as replicaHealth, zr as resetSecretsBackend, no as resolveCurrentRegion, Ut as resolveDependentTables, Es as resolveRescan, Br as resolveSecret, Vr as resolveSecretSync, Wr as resolveSecretsBackend, ss as resolveTimelineMode, se as retentionTtlMsFromEnv, fs as reverseEventOverRows, va as revokedIds, eo as runAsSystem, $s as runOrchestratorTick, Cc as runProvidedEffect, Rs as runReaction, ec as runSingleNodeOrchestrator, Vs as runWakeLoop, er as runWithRoutingContext, Gn as runWithTraceContext, Mo as scheduleCoordinated, Yr as setFieldCipher, Rr as setSecretsBackend, Qa as setSystemStoreHandle, gs as setTimelineRecorderForTest, xa as setTupleSource, fi as sha256Hex, To as singleCoordinator, bn as snapshotMetrics, xn as snapshotMetricsSync, xr as startRpcServer, ko as startScheduler, le as sweepRetention, Go as synthesizeInverse, Ea as tracingHttpClientLayer, Hi as triggerWorkflow, _o as tryClaimWakeup, Mn as unbindConnectionSubject, Ro as undoCaptureEnabled, rs as undoLogExecutor, bc as useAggregate, oc as useAnalytics, _a as visibleRows, Bs as wakeDueOnce, ji as workflowToRpc, Vo as wrapCaptureStore, qa as wrapStoreWithMixinBehaviour };
|