@sixb/core 0.1.9 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/index.js +9 -9
- package/dist/agents/index.js +17 -16
- package/dist/agents/index.js.map +1 -1
- package/dist/blob-storage/types.d.ts +4 -1
- package/dist/blob-storage/types.d.ts.map +1 -1
- package/dist/bootstrap/index.js +21 -20
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/broker/in-memory.d.ts +8 -2
- package/dist/broker/in-memory.d.ts.map +1 -1
- package/dist/broker/index.d.ts +4 -2
- package/dist/broker/index.d.ts.map +1 -1
- package/dist/broker/index.js +7 -3
- package/dist/broker/index.js.map +1 -1
- package/dist/broker/retention.d.ts +4 -0
- package/dist/broker/retention.d.ts.map +1 -0
- package/dist/broker/subscriber.d.ts +10 -0
- package/dist/broker/subscriber.d.ts.map +1 -0
- package/dist/broker/types.d.ts +14 -1
- package/dist/broker/types.d.ts.map +1 -1
- package/dist/{chunk-ypbtykv6.js → chunk-01kj2pbh.js} +1 -1
- package/dist/{chunk-k3cqkkn2.js → chunk-1824gssz.js} +30 -65
- package/dist/chunk-1824gssz.js.map +12 -0
- package/dist/{chunk-xyr8kppc.js → chunk-1yefycb1.js} +1 -1
- package/dist/chunk-2c4j899j.js.map +1 -1
- package/dist/{chunk-ppytyr6w.js → chunk-358caqf5.js} +4 -4
- package/dist/chunk-358caqf5.js.map +12 -0
- package/dist/{chunk-m3z3x9v0.js → chunk-3ckk0xfj.js} +2 -2
- package/dist/{chunk-kxwa347f.js → chunk-3qms4nax.js} +2 -2
- package/dist/{chunk-kxwa347f.js.map → chunk-3qms4nax.js.map} +3 -3
- package/dist/{chunk-52hbv0ak.js → chunk-4zhmdsx6.js} +141 -55
- package/dist/chunk-4zhmdsx6.js.map +36 -0
- package/dist/{chunk-zcnq6105.js → chunk-85cd7e8c.js} +2 -1
- package/dist/chunk-85cd7e8c.js.map +10 -0
- package/dist/{chunk-3f7veca0.js → chunk-9x8dybsb.js} +3 -3
- package/dist/chunk-9x8dybsb.js.map +10 -0
- package/dist/{chunk-0w35wavj.js → chunk-a0e6x5hd.js} +1 -1
- package/dist/{chunk-r29fxdhn.js → chunk-aa6z4a19.js} +160 -44
- package/dist/chunk-aa6z4a19.js.map +12 -0
- package/dist/{chunk-emyyk7dx.js → chunk-cfvakeax.js} +22 -145
- package/dist/chunk-cfvakeax.js.map +12 -0
- package/dist/chunk-d62kjtbg.js.map +1 -1
- package/dist/{chunk-h1gfhhbh.js → chunk-d63nnr5b.js} +2 -2
- package/dist/{chunk-r4tfx1sf.js → chunk-fh8kgex1.js} +5 -5
- package/dist/{chunk-an5tt9y0.js → chunk-ftv470j8.js} +42 -4
- package/dist/{chunk-an5tt9y0.js.map → chunk-ftv470j8.js.map} +7 -7
- package/dist/{chunk-jjy0fhrn.js → chunk-g91qxjj0.js} +20 -3
- package/dist/chunk-g91qxjj0.js.map +12 -0
- package/dist/{chunk-hpr1r6av.js → chunk-gq8vhakp.js} +51 -40
- package/dist/{chunk-hpr1r6av.js.map → chunk-gq8vhakp.js.map} +6 -6
- package/dist/{chunk-x57ycxq0.js → chunk-gqh45d2n.js} +42 -3
- package/dist/{chunk-x57ycxq0.js.map → chunk-gqh45d2n.js.map} +3 -3
- package/dist/{chunk-mjbk2djy.js → chunk-gqm76kse.js} +231 -125
- package/dist/{chunk-mjbk2djy.js.map → chunk-gqm76kse.js.map} +9 -8
- package/dist/{chunk-e0d1rzef.js → chunk-jsy70480.js} +16 -3
- package/dist/chunk-jsy70480.js.map +15 -0
- package/dist/{chunk-0rdrecsb.js → chunk-kfee1h52.js} +116 -32
- package/dist/chunk-kfee1h52.js.map +13 -0
- package/dist/{chunk-3frsnm7x.js → chunk-qma80ych.js} +4 -6
- package/dist/chunk-qma80ych.js.map +11 -0
- package/dist/{chunk-vf691g1r.js → chunk-sepyxgpc.js} +3 -3
- package/dist/chunk-v2vcg0w6.js +151 -0
- package/dist/chunk-v2vcg0w6.js.map +11 -0
- package/dist/{chunk-3tgwrcyh.js → chunk-wf88w4kp.js} +17 -23
- package/dist/chunk-wf88w4kp.js.map +14 -0
- package/dist/{chunk-xfbydgzy.js → chunk-x9m9x2eq.js} +7 -8
- package/dist/{chunk-xfbydgzy.js.map → chunk-x9m9x2eq.js.map} +3 -3
- package/dist/{chunk-qhcpj9wc.js → chunk-z0271qkp.js} +98 -2
- package/dist/chunk-z0271qkp.js.map +15 -0
- package/dist/{chunk-1enhpacz.js → chunk-z0s4axeh.js} +6 -6
- package/dist/connectors/connections/authorizations.d.ts.map +1 -1
- package/dist/connectors/connections/command-context.d.ts +2 -0
- package/dist/connectors/connections/command-context.d.ts.map +1 -1
- package/dist/connectors/connections/contracts.d.ts +4 -1
- package/dist/connectors/connections/contracts.d.ts.map +1 -1
- package/dist/connectors/connections/execution.d.ts +1 -0
- package/dist/connectors/connections/execution.d.ts.map +1 -1
- package/dist/connectors/connections/internal.js +1 -1
- package/dist/connectors/connections/request.d.ts +3 -1
- package/dist/connectors/connections/request.d.ts.map +1 -1
- package/dist/connectors/connections/runs.d.ts +1 -0
- package/dist/connectors/connections/runs.d.ts.map +1 -1
- package/dist/connectors/connections/service.d.ts +2 -0
- package/dist/connectors/connections/service.d.ts.map +1 -1
- package/dist/connectors/connections/tokens.d.ts.map +1 -1
- package/dist/connectors/connections/validation.d.ts +5 -1
- package/dist/connectors/connections/validation.d.ts.map +1 -1
- package/dist/connectors/types.d.ts +19 -4
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/events/execution.d.ts +1 -1
- package/dist/events/execution.d.ts.map +1 -1
- package/dist/events/index.js +1 -1
- package/dist/events/outbox-dispatcher.d.ts +2 -2
- package/dist/events/outbox-dispatcher.d.ts.map +1 -1
- package/dist/events/service.d.ts +2 -2
- package/dist/events/service.d.ts.map +1 -1
- package/dist/execution/agent.js +17 -16
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/primitive.js +17 -16
- package/dist/execution/primitive.js.map +2 -2
- package/dist/execution/request.js +17 -16
- package/dist/execution/request.js.map +2 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -29
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/changes.d.ts +5 -0
- package/dist/lake-storage/changes.d.ts.map +1 -0
- package/dist/lake-storage/in-memory.d.ts +2 -1
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.d.ts +2 -1
- package/dist/lake-storage/index.d.ts.map +1 -1
- package/dist/lake-storage/index.js +4 -2
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/lake-storage/types.d.ts +38 -0
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/logging/internal.js +1 -1
- package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
- package/dist/maintenance/types.d.ts +1 -1
- package/dist/maintenance/types.d.ts.map +1 -1
- package/dist/materialization/index.d.ts +1 -1
- package/dist/materialization/index.d.ts.map +1 -1
- package/dist/materialization/model.d.ts +12 -1
- package/dist/materialization/model.d.ts.map +1 -1
- package/dist/materializer/index.d.ts +1 -1
- package/dist/materializer/index.d.ts.map +1 -1
- package/dist/materializer/index.js +6 -6
- package/dist/materializer/materializer.d.ts +5 -1
- package/dist/materializer/materializer.d.ts.map +1 -1
- package/dist/materializer/projections/entry-validator.d.ts +2 -1
- package/dist/materializer/projections/entry-validator.d.ts.map +1 -1
- package/dist/materializer/projections/replace.d.ts.map +1 -1
- package/dist/materializer/projections/source-materialization.d.ts +4 -3
- package/dist/materializer/projections/source-materialization.d.ts.map +1 -1
- package/dist/materializer/shared/normalize.d.ts +2 -1
- package/dist/materializer/shared/normalize.d.ts.map +1 -1
- package/dist/models/definitions.d.ts +7 -0
- package/dist/models/definitions.d.ts.map +1 -1
- package/dist/models/execution/index.js +6 -6
- package/dist/models/index.js +1 -1
- package/dist/objects/index.js +10 -10
- package/dist/objects/query/index.js +6 -6
- package/dist/pipelines/index.js +7 -7
- package/dist/pipelines/run-dispatch.d.ts.map +1 -1
- package/dist/projections/internal.js +7 -9
- package/dist/projections/internal.js.map +1 -1
- package/dist/projections/run-dispatch.d.ts.map +1 -1
- package/dist/queues/in-memory.d.ts +7 -3
- package/dist/queues/in-memory.d.ts.map +1 -1
- package/dist/queues/index.js +1 -1
- package/dist/queues/indexed-heap.d.ts +15 -0
- package/dist/queues/indexed-heap.d.ts.map +1 -0
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/internal.js +1 -1
- package/dist/runtime/ontology-mutations.d.ts +3 -1
- package/dist/runtime/ontology-mutations.d.ts.map +1 -1
- package/dist/shares/internal.js +5 -5
- package/dist/storage/agents/provider.js +1 -1
- package/dist/storage/connector-connections/in-memory.d.ts +1 -0
- package/dist/storage/connector-connections/in-memory.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider/connections.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider/runs.d.ts +1 -0
- package/dist/storage/connector-connections/provider/runs.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider/shared.d.ts +1 -0
- package/dist/storage/connector-connections/provider/shared.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.d.ts +1 -0
- package/dist/storage/connector-connections/provider.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +11 -17
- package/dist/storage/connector-connections/provider.js.map +6 -6
- package/dist/storage/connector-connections/types.d.ts +6 -3
- package/dist/storage/connector-connections/types.d.ts.map +1 -1
- package/dist/storage/index.d.ts +1 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +5 -5
- package/dist/storage/internal.js +1 -1
- package/dist/storage/ontology/in-memory/materializations-state.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/shared-state.d.ts +15 -2
- package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/source-roots.d.ts +6 -0
- package/dist/storage/ontology/in-memory/source-roots.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
- package/dist/storage/ontology/index.d.ts +1 -1
- package/dist/storage/ontology/index.d.ts.map +1 -1
- package/dist/storage/ontology/outbox.d.ts +1 -0
- package/dist/storage/ontology/outbox.d.ts.map +1 -1
- package/dist/storage/ontology/provider.d.ts +16 -0
- package/dist/storage/ontology/provider.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +4 -2
- package/dist/storage/ontology/provider.js.map +1 -1
- package/dist/storage/ontology/sources.d.ts +13 -4
- package/dist/storage/ontology/sources.d.ts.map +1 -1
- package/dist/storage/projection-runs/lifecycle.d.ts.map +1 -1
- package/dist/storage/projection-runs/provider.js +2 -2
- package/dist/storage/projection-runs/types.d.ts +2 -0
- package/dist/storage/projection-runs/types.d.ts.map +1 -1
- package/dist/syncs/index.js +9 -8
- package/dist/syncs/index.js.map +1 -1
- package/dist/syncs/run-dispatch.d.ts.map +1 -1
- package/dist/testing/broker-contract.d.ts.map +1 -1
- package/dist/testing/connector-connection-storage-contract.d.ts.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1499 -963
- package/dist/testing/index.js.map +10 -9
- package/dist/testing/lake-changes-contract.d.ts +6 -0
- package/dist/testing/lake-changes-contract.d.ts.map +1 -0
- package/dist/testing/lake-storage-contract.d.ts.map +1 -1
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
- package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
- package/dist/webhooks/connections.d.ts +6 -0
- package/dist/webhooks/connections.d.ts.map +1 -0
- package/dist/webhooks/index.d.ts +1 -1
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/internal.d.ts +2 -0
- package/dist/webhooks/internal.d.ts.map +1 -1
- package/dist/webhooks/internal.js +55 -10
- package/dist/webhooks/internal.js.map +4 -3
- package/dist/webhooks/registry.d.ts +1 -1
- package/dist/webhooks/registry.d.ts.map +1 -1
- package/dist/webhooks/types.d.ts +15 -4
- package/dist/webhooks/types.d.ts.map +1 -1
- package/dist/workflows/index.js +18 -17
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/run-dispatch.d.ts +3 -1
- package/dist/workflows/run-dispatch.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/agents/model-loop.ts +7 -0
- package/src/blob-storage/types.ts +4 -1
- package/src/broker/in-memory.ts +104 -39
- package/src/broker/index.ts +4 -1
- package/src/broker/retention.ts +28 -0
- package/src/broker/subscriber.ts +21 -0
- package/src/broker/types.ts +15 -1
- package/src/connectors/builders.ts +0 -6
- package/src/connectors/connections/authorizations.ts +11 -5
- package/src/connectors/connections/command-context.ts +21 -4
- package/src/connectors/connections/contracts.ts +7 -1
- package/src/connectors/connections/execution.ts +3 -0
- package/src/connectors/connections/request.ts +56 -22
- package/src/connectors/connections/runs.ts +39 -1
- package/src/connectors/connections/service.ts +6 -0
- package/src/connectors/connections/tokens.ts +4 -0
- package/src/connectors/connections/validation.ts +91 -5
- package/src/connectors/types.ts +19 -4
- package/src/events/execution.ts +2 -2
- package/src/events/outbox-dispatcher.ts +20 -26
- package/src/events/service.ts +3 -3
- package/src/index.ts +10 -2
- package/src/lake-storage/changes.ts +43 -0
- package/src/lake-storage/in-memory.ts +75 -0
- package/src/lake-storage/index.ts +4 -0
- package/src/lake-storage/types.ts +42 -0
- package/src/logging/service.ts +1 -1
- package/src/maintenance/ontology-maintenance.ts +6 -2
- package/src/maintenance/types.ts +1 -1
- package/src/materialization/index.ts +2 -0
- package/src/materialization/model.ts +14 -1
- package/src/materializer/README.md +1 -1
- package/src/materializer/index.ts +2 -0
- package/src/materializer/materializer.ts +10 -0
- package/src/materializer/projections/entry-validator.ts +19 -1
- package/src/materializer/projections/replace.ts +36 -1
- package/src/materializer/projections/source-materialization.ts +26 -6
- package/src/materializer/shared/normalize.ts +1 -1
- package/src/models/definitions.ts +19 -0
- package/src/models/pricing.ts +6 -2
- package/src/pipelines/run-dispatch.ts +21 -1
- package/src/projections/run-dispatch.ts +30 -68
- package/src/queues/in-memory.ts +105 -62
- package/src/queues/indexed-heap.ts +74 -0
- package/src/runtime/host.ts +0 -14
- package/src/runtime/ontology-mutations.ts +4 -0
- package/src/storage/connector-connections/in-memory.ts +19 -19
- package/src/storage/connector-connections/provider/connections.ts +1 -15
- package/src/storage/connector-connections/provider/runs.ts +9 -1
- package/src/storage/connector-connections/provider/shared.ts +2 -3
- package/src/storage/connector-connections/provider.ts +6 -0
- package/src/storage/connector-connections/types.ts +8 -3
- package/src/storage/index.ts +1 -0
- package/src/storage/ontology/in-memory/materializations-state.ts +5 -18
- package/src/storage/ontology/in-memory/materializations.ts +73 -92
- package/src/storage/ontology/in-memory/shared-state.ts +36 -4
- package/src/storage/ontology/in-memory/source-roots.ts +123 -0
- package/src/storage/ontology/in-memory/sources.ts +78 -23
- package/src/storage/ontology/index.ts +1 -0
- package/src/storage/ontology/outbox.ts +1 -0
- package/src/storage/ontology/provider.ts +70 -0
- package/src/storage/ontology/sources.ts +14 -3
- package/src/storage/projection-runs/lifecycle.ts +5 -2
- package/src/storage/projection-runs/types.ts +4 -3
- package/src/syncs/run-dispatch.ts +19 -1
- package/src/testing/broker-contract.ts +95 -0
- package/src/testing/connector-connection-storage-contract.ts +29 -12
- package/src/testing/index.ts +1 -0
- package/src/testing/lake-changes-contract.ts +240 -0
- package/src/testing/lake-storage-contract.ts +29 -0
- package/src/testing/materializer-storage-contract.ts +172 -1
- package/src/testing/ontology-storage-contract.ts +15 -3
- package/src/testing/projection-run-storage-contract.ts +34 -0
- package/src/webhooks/connections.ts +56 -0
- package/src/webhooks/index.ts +2 -0
- package/src/webhooks/internal.ts +2 -0
- package/src/webhooks/registry.ts +3 -4
- package/src/webhooks/types.ts +17 -4
- package/src/workflows/run-dispatch.ts +42 -29
- package/dist/chunk-0rdrecsb.js.map +0 -11
- package/dist/chunk-3f7veca0.js.map +0 -10
- package/dist/chunk-3frsnm7x.js.map +0 -11
- package/dist/chunk-3tgwrcyh.js.map +0 -14
- package/dist/chunk-52hbv0ak.js.map +0 -36
- package/dist/chunk-e0d1rzef.js.map +0 -15
- package/dist/chunk-emyyk7dx.js.map +0 -14
- package/dist/chunk-jjy0fhrn.js.map +0 -12
- package/dist/chunk-k3cqkkn2.js.map +0 -12
- package/dist/chunk-ppytyr6w.js.map +0 -12
- package/dist/chunk-qhcpj9wc.js.map +0 -14
- package/dist/chunk-r29fxdhn.js.map +0 -11
- package/dist/chunk-zcnq6105.js.map +0 -10
- /package/dist/{chunk-ypbtykv6.js.map → chunk-01kj2pbh.js.map} +0 -0
- /package/dist/{chunk-xyr8kppc.js.map → chunk-1yefycb1.js.map} +0 -0
- /package/dist/{chunk-m3z3x9v0.js.map → chunk-3ckk0xfj.js.map} +0 -0
- /package/dist/{chunk-0w35wavj.js.map → chunk-a0e6x5hd.js.map} +0 -0
- /package/dist/{chunk-h1gfhhbh.js.map → chunk-d63nnr5b.js.map} +0 -0
- /package/dist/{chunk-r4tfx1sf.js.map → chunk-fh8kgex1.js.map} +0 -0
- /package/dist/{chunk-vf691g1r.js.map → chunk-sepyxgpc.js.map} +0 -0
- /package/dist/{chunk-1enhpacz.js.map → chunk-z0s4axeh.js.map} +0 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
createSixbError2,
|
|
4
|
+
isSixbError2
|
|
5
|
+
} from "./chunk-f4w3yp4f.js";
|
|
6
|
+
import {
|
|
7
|
+
resolveExecutionScopeAuthorization,
|
|
8
|
+
AuthorizationError2,
|
|
9
|
+
assertProviderAccess2
|
|
10
|
+
} from "./chunk-dz5h08xv.js";
|
|
11
|
+
import {
|
|
12
|
+
isOAuthConnectorDefinition2
|
|
13
|
+
} from "./chunk-9x8dybsb.js";
|
|
14
|
+
import {
|
|
15
|
+
ConnectorConnectionStorageError2
|
|
16
|
+
} from "./chunk-2c4j899j.js";
|
|
17
|
+
|
|
18
|
+
// src/connectors/errors.ts
|
|
19
|
+
class ConnectorError2 extends Error {
|
|
20
|
+
name = "ConnectorError";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
class ConnectorNotFoundError2 extends ConnectorError2 {
|
|
24
|
+
connectorId;
|
|
25
|
+
name = "ConnectorNotFoundError";
|
|
26
|
+
constructor(connectorId) {
|
|
27
|
+
super(`Unknown connector '${connectorId}'`);
|
|
28
|
+
this.connectorId = connectorId;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
class ConnectorOAuthError2 extends ConnectorError2 {
|
|
33
|
+
kind;
|
|
34
|
+
name = "ConnectorOAuthError";
|
|
35
|
+
constructor(kind, message, options) {
|
|
36
|
+
super(message, options);
|
|
37
|
+
this.kind = kind;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function createConnectorCodedError(code, message, options = {}) {
|
|
41
|
+
return createSixbError2(code, message.startsWith("[Sixb]") ? message : `[Sixb] ${message}`, options);
|
|
42
|
+
}
|
|
43
|
+
function createAmbiguousProviderOperationError(options = {}) {
|
|
44
|
+
return createConnectorCodedError("connector.provider_failed", "Connector provider operation outcome is ambiguous.", options);
|
|
45
|
+
}
|
|
46
|
+
function oauthErrorKind(error) {
|
|
47
|
+
return error instanceof ConnectorOAuthError2 ? error.kind : "ambiguous";
|
|
48
|
+
}
|
|
49
|
+
function providerFailureCode(error) {
|
|
50
|
+
return oauthErrorKind(error) === "retryable" ? "connector.provider_unavailable" : "connector.provider_failed";
|
|
51
|
+
}
|
|
52
|
+
function providerBoundaryError(error, code, message) {
|
|
53
|
+
if (isSixbError2(error) && error.code.startsWith("connector."))
|
|
54
|
+
return error;
|
|
55
|
+
return createConnectorCodedError(code, message, { cause: error });
|
|
56
|
+
}
|
|
57
|
+
function isConnectorStorageError(error, code) {
|
|
58
|
+
return error instanceof ConnectorConnectionStorageError2 && (code === undefined || error.code === code);
|
|
59
|
+
}
|
|
60
|
+
function storageBoundaryError(error, message) {
|
|
61
|
+
return createConnectorCodedError("internal.unexpected", message, { cause: error });
|
|
62
|
+
}
|
|
63
|
+
async function recoverConnectorFailure(primaryError, message, recovery) {
|
|
64
|
+
try {
|
|
65
|
+
return await recovery();
|
|
66
|
+
} catch (recoveryError) {
|
|
67
|
+
throw createConnectorCodedError("internal.unexpected", message, {
|
|
68
|
+
cause: new AggregateError([primaryError, recoveryError], message)
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// src/connectors/execution.ts
|
|
74
|
+
var sourceResolvers = new WeakMap;
|
|
75
|
+
function createConnectorRuntime(runtime, execution, service) {
|
|
76
|
+
const connector = (definition, selector) => {
|
|
77
|
+
if (isOAuthConnectorDefinition2(definition)) {
|
|
78
|
+
assertConnectorConnectionAccess(runtime, execution);
|
|
79
|
+
if (!selector) {
|
|
80
|
+
throw createConnectorCodedError("connector.configuration_invalid", `[Sixb] Connector '${definition.id}' uses persistent connections and requires an explicit owner and slot.`);
|
|
81
|
+
}
|
|
82
|
+
return service.connectConnection(definition, selector);
|
|
83
|
+
}
|
|
84
|
+
if (selector) {
|
|
85
|
+
throw createConnectorCodedError("connector.configuration_invalid", `[Sixb] Static connector '${definition.id}' does not accept a connection.`);
|
|
86
|
+
}
|
|
87
|
+
assertProviderAccess2(runtime, execution, "connector.connect");
|
|
88
|
+
return service.connect(definition);
|
|
89
|
+
};
|
|
90
|
+
registerConnectorExecutionSourceResolver(connector, {
|
|
91
|
+
async list(definition) {
|
|
92
|
+
if (!isOAuthConnectorDefinition2(definition)) {
|
|
93
|
+
return [
|
|
94
|
+
{
|
|
95
|
+
connect: (_signal) => connector(definition)
|
|
96
|
+
}
|
|
97
|
+
];
|
|
98
|
+
}
|
|
99
|
+
assertConnectorConnectionAccess(runtime, execution);
|
|
100
|
+
const connections = await service.listExecutionConnections(definition);
|
|
101
|
+
return connections.map((connection) => ({
|
|
102
|
+
connection: {
|
|
103
|
+
id: connection.id,
|
|
104
|
+
connectorId: connection.connectorId,
|
|
105
|
+
owner: connection.owner,
|
|
106
|
+
slot: connection.slot,
|
|
107
|
+
account: connection.account
|
|
108
|
+
},
|
|
109
|
+
connect: (signal) => service.connectExecutionConnection(definition, connection, signal)
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
return connector;
|
|
114
|
+
}
|
|
115
|
+
function registerConnectorExecutionSourceResolver(connector, resolver) {
|
|
116
|
+
const registered = sourceResolvers.get(connector);
|
|
117
|
+
if (registered && registered !== resolver) {
|
|
118
|
+
throw new Error("[Sixb] Connector source resolver is already registered for this execution.");
|
|
119
|
+
}
|
|
120
|
+
sourceResolvers.set(connector, resolver);
|
|
121
|
+
}
|
|
122
|
+
function getConnectorExecutionSourceResolver(connector) {
|
|
123
|
+
const resolver = sourceResolvers.get(connector);
|
|
124
|
+
if (resolver)
|
|
125
|
+
return resolver;
|
|
126
|
+
return {
|
|
127
|
+
async list(definition) {
|
|
128
|
+
if (isOAuthConnectorDefinition2(definition)) {
|
|
129
|
+
throw createConnectorCodedError("connector.configuration_invalid", `[Sixb] OAuth connector '${definition.id}' cannot be resolved without the managed connection runtime.`);
|
|
130
|
+
}
|
|
131
|
+
return [
|
|
132
|
+
{
|
|
133
|
+
connect: (_signal) => connector(definition)
|
|
134
|
+
}
|
|
135
|
+
];
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function assertConnectorConnectionAccess(runtime, execution) {
|
|
140
|
+
const resolved = resolveExecutionScopeAuthorization(runtime.projectId, {
|
|
141
|
+
execution,
|
|
142
|
+
authorization: runtime.runtimeAuthorization
|
|
143
|
+
});
|
|
144
|
+
if (resolved.type === "unrestricted" && resolved.ref.type === "trustedPrimitive")
|
|
145
|
+
return;
|
|
146
|
+
throw new AuthorizationError2("privileged:connector-connection.connect", "[Sixb] Connector connection clients are restricted to trusted primitive executions.");
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export { ConnectorError2, ConnectorNotFoundError2, ConnectorOAuthError2, createConnectorCodedError, createAmbiguousProviderOperationError, oauthErrorKind, providerFailureCode, providerBoundaryError, isConnectorStorageError, storageBoundaryError, recoverConnectorFailure, createConnectorRuntime, getConnectorExecutionSourceResolver };
|
|
150
|
+
|
|
151
|
+
//# debugId=B7B09D22E526C3CB64756E2164756E21
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/connectors/errors.ts", "../src/connectors/execution.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n createSixbError,\n isSixbError,\n type SixbCodedError,\n type SixbErrorOptions,\n} from \"../errors/internal\"\nimport type { SixbErrorCode } from \"../errors/types\"\nimport { ConnectorConnectionStorageError } from \"../storage/connector-connections/errors\"\n\ntype ConnectorCodedErrorCode = Extract<SixbErrorCode, `connector.${string}`> | \"internal.unexpected\"\n\n/**\n * Legacy authoring error for static connector definitions and lookup.\n *\n * Persistent connection lifecycle failures use the global `SixbErrorCode` contract instead.\n * `ConnectorOAuthError` remains a class because adapters and Core need `instanceof` control flow at\n * the provider-effect boundary.\n */\nexport class ConnectorError extends Error {\n readonly name: string = \"ConnectorError\"\n}\n\nexport class ConnectorNotFoundError extends ConnectorError {\n override readonly name = \"ConnectorNotFoundError\"\n constructor(readonly connectorId: string) {\n super(`Unknown connector '${connectorId}'`)\n }\n}\n\n/**\n * Provider mutation outcome reported by an OAuth adapter.\n *\n * `retryable` guarantees that the provider made no change. `terminal` means the current grant can\n * no longer progress. `ambiguous` means the provider may have changed state; Core fails closed.\n * This classifies the provider effect, not the final Sixb error retry policy: Core also accounts for\n * one-use state, consumed authorization codes, and durable mutation phase before choosing a code.\n */\nexport type ConnectorOAuthErrorKind = \"retryable\" | \"terminal\" | \"ambiguous\"\n\n/** Adapter signal used by Core to decide whether a provider operation can be retried safely. */\nexport class ConnectorOAuthError extends ConnectorError {\n override readonly name = \"ConnectorOAuthError\"\n\n constructor(\n readonly kind: ConnectorOAuthErrorKind,\n message: string,\n options?: ErrorOptions\n ) {\n super(message, options)\n }\n}\n\n/** Internal factory for connector failures that cross a Sixb boundary. */\nexport function createConnectorCodedError(\n code: ConnectorCodedErrorCode,\n message: string,\n options: SixbErrorOptions = {}\n): SixbCodedError {\n return createSixbError(\n code,\n message.startsWith(\"[Sixb]\") ? message : `[Sixb] ${message}`,\n options\n )\n}\n\n/** Internal failure used when a provider operation may have completed after Core lost its fence. */\nexport function createAmbiguousProviderOperationError(\n options: SixbErrorOptions = {}\n): SixbCodedError {\n return createConnectorCodedError(\n \"connector.provider_failed\",\n \"Connector provider operation outcome is ambiguous.\",\n options\n )\n}\n\nexport function oauthErrorKind(error: unknown): ConnectorOAuthErrorKind {\n return error instanceof ConnectorOAuthError ? error.kind : \"ambiguous\"\n}\n\nexport function providerFailureCode(\n error: unknown\n): \"connector.provider_failed\" | \"connector.provider_unavailable\" {\n return oauthErrorKind(error) === \"retryable\"\n ? \"connector.provider_unavailable\"\n : \"connector.provider_failed\"\n}\n\nexport function providerBoundaryError(\n error: unknown,\n code: \"connector.provider_failed\" | \"connector.provider_unavailable\",\n message: string\n): Error {\n if (isSixbError(error) && error.code.startsWith(\"connector.\")) return error\n return createConnectorCodedError(code, message, { cause: error })\n}\n\nexport function isConnectorStorageError(\n error: unknown,\n code?: ConnectorConnectionStorageError[\"code\"]\n): error is ConnectorConnectionStorageError {\n return (\n error instanceof ConnectorConnectionStorageError && (code === undefined || error.code === code)\n )\n}\n\nexport function storageBoundaryError(error: unknown, message: string): SixbCodedError {\n return createConnectorCodedError(\"internal.unexpected\", message, { cause: error })\n}\n\nexport async function recoverConnectorFailure<T>(\n primaryError: unknown,\n message: string,\n recovery: () => Promise<T>\n): Promise<T> {\n try {\n return await recovery()\n } catch (recoveryError) {\n throw createConnectorCodedError(\"internal.unexpected\", message, {\n cause: new AggregateError([primaryError, recoveryError], message),\n })\n }\n}\n",
|
|
6
|
+
"import { AuthorizationError, assertProviderAccess } from \"../authorization\"\nimport type { ExecutionContext } from \"../execution\"\nimport { resolveExecutionScopeAuthorization } from \"../execution/authorization\"\nimport type { SixbRuntimeContext } from \"../runtime/types\"\nimport { createConnectorCodedError } from \"./errors\"\nimport type { ConnectorService } from \"./service\"\nimport type {\n AnyConnectorAdapter,\n ConnectorAdapter,\n ConnectorClient,\n ConnectorConnectionMetadata,\n ConnectorConnectionSelector,\n ConnectorDefinition,\n OAuthConnectorAdapter,\n} from \"./types\"\nimport { isOAuthConnectorDefinition } from \"./types\"\n\n/** Resolve a registered connector through one authorized execution. */\nexport interface ConnectorRuntime {\n <TAdapter extends ConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>\n ): Promise<ConnectorClient<TAdapter>>\n <TAdapter extends OAuthConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>,\n selector: ConnectorConnectionSelector\n ): Promise<ConnectorClient<TAdapter>>\n}\n\nexport interface ConnectorExecutionSource<\n TAdapter extends AnyConnectorAdapter = AnyConnectorAdapter,\n> {\n readonly connection?: ConnectorConnectionMetadata\n connect(signal: AbortSignal): Promise<ConnectorClient<TAdapter>>\n}\n\nexport interface ConnectorExecutionSourceResolver {\n list<TAdapter extends AnyConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>\n ): Promise<readonly ConnectorExecutionSource<TAdapter>[]>\n}\n\nconst sourceResolvers = new WeakMap<ConnectorRuntime, ConnectorExecutionSourceResolver>()\n\nexport function createConnectorRuntime(\n runtime: SixbRuntimeContext,\n execution: ExecutionContext,\n service: ConnectorService\n): ConnectorRuntime {\n const connector = ((definition: ConnectorDefinition, selector?: ConnectorConnectionSelector) => {\n if (isOAuthConnectorDefinition(definition)) {\n assertConnectorConnectionAccess(runtime, execution)\n if (!selector) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n `[Sixb] Connector '${definition.id}' uses persistent connections and requires an explicit owner and slot.`\n )\n }\n return service.connectConnection(definition, selector)\n }\n if (selector) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n `[Sixb] Static connector '${definition.id}' does not accept a connection.`\n )\n }\n assertProviderAccess(runtime, execution, \"connector.connect\")\n return service.connect(definition as ConnectorDefinition<string, ConnectorAdapter>)\n }) as ConnectorRuntime\n\n registerConnectorExecutionSourceResolver(connector, {\n async list<TAdapter extends AnyConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>\n ): Promise<readonly ConnectorExecutionSource<TAdapter>[]> {\n if (!isOAuthConnectorDefinition(definition)) {\n return [\n {\n connect: (_signal) =>\n connector(definition as ConnectorDefinition<string, ConnectorAdapter>) as Promise<\n ConnectorClient<TAdapter>\n >,\n },\n ]\n }\n\n assertConnectorConnectionAccess(runtime, execution)\n const connections = await service.listExecutionConnections(definition)\n return connections.map((connection) => ({\n connection: {\n id: connection.id,\n connectorId: connection.connectorId,\n owner: connection.owner,\n slot: connection.slot,\n account: connection.account,\n },\n connect: (signal) =>\n service.connectExecutionConnection(definition, connection, signal) as Promise<\n ConnectorClient<TAdapter>\n >,\n }))\n },\n })\n return connector\n}\n\nfunction registerConnectorExecutionSourceResolver(\n connector: ConnectorRuntime,\n resolver: ConnectorExecutionSourceResolver\n): void {\n const registered = sourceResolvers.get(connector)\n if (registered && registered !== resolver) {\n throw new Error(\"[Sixb] Connector source resolver is already registered for this execution.\")\n }\n sourceResolvers.set(connector, resolver)\n}\n\nexport function getConnectorExecutionSourceResolver(\n connector: ConnectorRuntime\n): ConnectorExecutionSourceResolver {\n const resolver = sourceResolvers.get(connector)\n if (resolver) return resolver\n\n return {\n async list<TAdapter extends AnyConnectorAdapter>(\n definition: ConnectorDefinition<string, TAdapter>\n ): Promise<readonly ConnectorExecutionSource<TAdapter>[]> {\n if (isOAuthConnectorDefinition(definition)) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n `[Sixb] OAuth connector '${definition.id}' cannot be resolved without the managed connection runtime.`\n )\n }\n return [\n {\n connect: (_signal) =>\n connector(definition as ConnectorDefinition<string, ConnectorAdapter>) as Promise<\n ConnectorClient<TAdapter>\n >,\n },\n ]\n },\n }\n}\n\nfunction assertConnectorConnectionAccess(\n runtime: SixbRuntimeContext,\n execution: ExecutionContext\n): void {\n const resolved = resolveExecutionScopeAuthorization(runtime.projectId, {\n execution,\n authorization: runtime.runtimeAuthorization,\n })\n if (resolved.type === \"unrestricted\" && resolved.ref.type === \"trustedPrimitive\") return\n throw new AuthorizationError(\n \"privileged:connector-connection.connect\",\n \"[Sixb] Connector connection clients are restricted to trusted primitive executions.\"\n )\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "B7B09D22E526C3CB64756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -251,10 +251,10 @@ class OntologyOutboxDispatcher2 {
|
|
|
251
251
|
createLeaseId;
|
|
252
252
|
onDeliveryFailure;
|
|
253
253
|
onError;
|
|
254
|
-
inFlight = new Set;
|
|
255
254
|
draining = null;
|
|
256
255
|
pendingDrain = null;
|
|
257
256
|
stopping = null;
|
|
257
|
+
closing = false;
|
|
258
258
|
stopRequested = false;
|
|
259
259
|
forcedStop = new AbortController;
|
|
260
260
|
constructor(options) {
|
|
@@ -283,7 +283,7 @@ class OntologyOutboxDispatcher2 {
|
|
|
283
283
|
this.onError = options.onError ?? ((error) => console.error("[Sixb] Outbox dispatcher error:", error));
|
|
284
284
|
}
|
|
285
285
|
drain() {
|
|
286
|
-
if (this.stopRequested)
|
|
286
|
+
if (this.closing || this.stopRequested)
|
|
287
287
|
return Promise.resolve();
|
|
288
288
|
if (!this.draining)
|
|
289
289
|
return this.startDrainPass();
|
|
@@ -295,7 +295,7 @@ class OntologyOutboxDispatcher2 {
|
|
|
295
295
|
return this.pendingDrain;
|
|
296
296
|
}
|
|
297
297
|
notify() {
|
|
298
|
-
if (this.stopRequested)
|
|
298
|
+
if (this.closing || this.stopRequested)
|
|
299
299
|
return;
|
|
300
300
|
this.drain().catch((error) => this.reportError(error));
|
|
301
301
|
}
|
|
@@ -307,15 +307,16 @@ class OntologyOutboxDispatcher2 {
|
|
|
307
307
|
if (this.stopRequested)
|
|
308
308
|
return;
|
|
309
309
|
const gracefulDrain = this.drain().catch((error) => this.reportError(error));
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
310
|
+
this.closing = true;
|
|
311
|
+
const finished = await settlesWithin(gracefulDrain, this.shutdownTimeoutMs);
|
|
314
312
|
this.stopRequested = true;
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
this.
|
|
313
|
+
if (!finished)
|
|
314
|
+
this.forcedStop.abort();
|
|
315
|
+
await gracefulDrain;
|
|
316
|
+
if (this.draining)
|
|
317
|
+
await settled(this.draining);
|
|
318
|
+
if (this.pendingDrain)
|
|
319
|
+
await settled(this.pendingDrain);
|
|
319
320
|
}
|
|
320
321
|
startDrainPass() {
|
|
321
322
|
const pass = this.drainAvailable();
|
|
@@ -336,8 +337,9 @@ class OntologyOutboxDispatcher2 {
|
|
|
336
337
|
const publishedCount = await this.publishClaim(rows);
|
|
337
338
|
if (this.stopRequested || publishedCount === 0 || rows.length < this.batchSize)
|
|
338
339
|
return;
|
|
340
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
339
341
|
}
|
|
340
|
-
if (!this.stopRequested)
|
|
342
|
+
if (!this.closing && !this.stopRequested)
|
|
341
343
|
this.notify();
|
|
342
344
|
}
|
|
343
345
|
claimBatch() {
|
|
@@ -353,7 +355,6 @@ class OntologyOutboxDispatcher2 {
|
|
|
353
355
|
async publishClaim(rows) {
|
|
354
356
|
const claim = new ClaimedBatch(rows);
|
|
355
357
|
const failures = new DeliveryFailureAccumulator;
|
|
356
|
-
this.inFlight.add(claim);
|
|
357
358
|
const pending = [{ rows }];
|
|
358
359
|
let publishAttempts = 0;
|
|
359
360
|
let publishedCount = 0;
|
|
@@ -387,7 +388,6 @@ class OntologyOutboxDispatcher2 {
|
|
|
387
388
|
if (this.stopRequested) {
|
|
388
389
|
await this.rescheduleClaimedForShutdown(claim.close());
|
|
389
390
|
}
|
|
390
|
-
this.inFlight.delete(claim);
|
|
391
391
|
for (const failure of failures.list()) {
|
|
392
392
|
this.reportDeliveryFailure(failure.error, failure.context);
|
|
393
393
|
}
|
|
@@ -458,14 +458,8 @@ class OntologyOutboxDispatcher2 {
|
|
|
458
458
|
this.reportError(error);
|
|
459
459
|
}
|
|
460
460
|
}
|
|
461
|
-
async rescheduleUnsettledForShutdown() {
|
|
462
|
-
for (const claim of [...this.inFlight]) {
|
|
463
|
-
await this.rescheduleClaimedForShutdown(claim.close());
|
|
464
|
-
this.inFlight.delete(claim);
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
461
|
withOutbox(run) {
|
|
468
|
-
return
|
|
462
|
+
return Promise.resolve(run(this.storage.ontology.outbox));
|
|
469
463
|
}
|
|
470
464
|
reportDeliveryFailure(error, failure) {
|
|
471
465
|
try {
|
|
@@ -722,7 +716,7 @@ class DomainEventService2 {
|
|
|
722
716
|
return;
|
|
723
717
|
}
|
|
724
718
|
try {
|
|
725
|
-
handler(events);
|
|
719
|
+
return handler(events);
|
|
726
720
|
} catch {}
|
|
727
721
|
});
|
|
728
722
|
}
|
|
@@ -837,4 +831,4 @@ function toStoredEvent2(params) {
|
|
|
837
831
|
}
|
|
838
832
|
export { EventsError2, OBJECT_EVENT_DEFINITIONS2, TELEMETRY_EVENT_DEFINITIONS2, LINK_EVENT_DEFINITIONS2, ACTION_EVENT_DEFINITIONS2, SCHEDULE_EVENT_DEFINITIONS2, RULE_EVENT_DEFINITIONS2, SYNC_EVENT_DEFINITIONS2, PIPELINE_EVENT_DEFINITIONS2, WORKFLOW_EVENT_DEFINITIONS2, DATASET_EVENT_DEFINITIONS2, EVENT_DEFINITIONS2, EVENT_TYPES2, EVENT_TOPICS2, isDomainEventType2, isOntologyFactType2, resolveEventStorage2, OntologyOutboxDispatcher2, DEFAULT_EVENTS_RETENTION_MS2, EVENTS_STREAM2, DomainEventService2, createDomainEventService2, toStoredEvent2 };
|
|
839
833
|
|
|
840
|
-
//# debugId=
|
|
834
|
+
//# debugId=D60791393813ED9264756E2164756E21
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/events/errors.ts", "../src/events/definitions.ts", "../src/events/outbox-dispatcher.ts", "../src/events/service.ts", "../src/events/toStoredEvent.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Error for event runtime invariants and failures (e.g., unknown event\n * types encountered when converting new events to their stored form).\n */\nexport class EventsError extends Error {\n readonly name = \"EventsError\"\n}\n",
|
|
6
|
+
"import { EventsError } from \"./errors\"\nimport type { ActionEvent } from \"./types/actions\"\nimport type { DatasetEvent } from \"./types/datasets\"\nimport type { DomainEvent, DomainEventDraft } from \"./types/index\"\nimport type { LinkEvent } from \"./types/links\"\nimport type { ObjectEvent } from \"./types/objects\"\nimport type { PipelineEvent } from \"./types/pipelines\"\nimport type { RuleEvent } from \"./types/rules\"\nimport type { ScheduleEvent } from \"./types/schedules\"\nimport type { SyncEvent } from \"./types/syncs\"\nimport type { TelemetryEvent } from \"./types/telemetry\"\nimport type { WorkflowEvent } from \"./types/workflows\"\n\nexport type EventDefinition<Event extends DomainEvent = DomainEvent> = {\n readonly topic: Event[\"topic\"]\n readonly partitionKey: (payload: Event[\"payload\"]) => string\n}\n\nexport type EventDefinitionGroup<Event extends DomainEvent> = {\n readonly [Type in Event[\"type\"]]: EventDefinition<Extract<Event, { type: Type }>>\n}\n\nexport type EventDefinitionMap = {\n readonly [Type in DomainEvent[\"type\"]]: EventDefinition<Extract<DomainEvent, { type: Type }>>\n}\n\nfunction defineEventGroup<Event extends DomainEvent>(\n definitions: EventDefinitionGroup<Event>\n): EventDefinitionGroup<Event> {\n return definitions\n}\n\nexport const OBJECT_EVENT_DEFINITIONS = defineEventGroup<ObjectEvent>({\n \"object.created\": {\n topic: \"objects\",\n partitionKey: (payload) => `${payload.objectTypeId}:${payload.primaryId}`,\n },\n \"object.updated\": {\n topic: \"objects\",\n partitionKey: (payload) => `${payload.objectTypeId}:${payload.primaryId}`,\n },\n \"object.deleted\": {\n topic: \"objects\",\n partitionKey: (payload) => `${payload.objectTypeId}:${payload.primaryId}`,\n },\n})\n\nexport const TELEMETRY_EVENT_DEFINITIONS = defineEventGroup<TelemetryEvent>({\n \"telemetry.appended\": {\n topic: \"telemetry\",\n partitionKey: (payload) => `${payload.objectTypeId}:${payload.objectId}:${payload.propertyId}`,\n },\n})\n\nexport const LINK_EVENT_DEFINITIONS = defineEventGroup<LinkEvent>({\n \"link.created\": {\n topic: \"links\",\n partitionKey: (payload) => `${payload.sourceTypeId}:${payload.sourceId}:${payload.linkId}`,\n },\n \"link.updated\": {\n topic: \"links\",\n partitionKey: (payload) => `${payload.sourceTypeId}:${payload.sourceId}:${payload.linkId}`,\n },\n \"link.deleted\": {\n topic: \"links\",\n partitionKey: (payload) => `${payload.sourceTypeId}:${payload.sourceId}:${payload.linkId}`,\n },\n})\n\nexport const ACTION_EVENT_DEFINITIONS = defineEventGroup<ActionEvent>({\n \"action.requested\": {\n topic: \"actions\",\n partitionKey: (payload) => payload.actionId,\n },\n \"action.completed\": {\n topic: \"actions\",\n partitionKey: (payload) => payload.actionId,\n },\n \"action.failed\": {\n topic: \"actions\",\n partitionKey: (payload) => payload.actionId,\n },\n})\n\nexport const SCHEDULE_EVENT_DEFINITIONS = defineEventGroup<ScheduleEvent>({\n \"schedule.triggered\": {\n topic: \"schedules\",\n partitionKey: (payload) => payload.scheduleId,\n },\n})\n\nexport const RULE_EVENT_DEFINITIONS = defineEventGroup<RuleEvent>({\n \"rule.triggered\": {\n topic: \"rules\",\n partitionKey: (payload) =>\n `${payload.ruleId}:${payload.subject.objectTypeId}:${payload.subject.primaryId}`,\n },\n \"rule.resolved\": {\n topic: \"rules\",\n partitionKey: (payload) =>\n `${payload.ruleId}:${payload.subject.objectTypeId}:${payload.subject.primaryId}`,\n },\n})\n\nexport const SYNC_EVENT_DEFINITIONS = defineEventGroup<SyncEvent>({\n \"sync.run.started\": {\n topic: \"syncs\",\n partitionKey: (payload) => `${payload.syncId}:${payload.runId}`,\n },\n \"sync.run.finished\": {\n topic: \"syncs\",\n partitionKey: (payload) => `${payload.syncId}:${payload.runId}`,\n },\n})\n\nexport const PIPELINE_EVENT_DEFINITIONS = defineEventGroup<PipelineEvent>({\n \"pipeline.run.started\": {\n topic: \"pipelines\",\n partitionKey: (payload) => `${payload.pipelineId}:${payload.runId}`,\n },\n \"pipeline.run.step.started\": {\n topic: \"pipelines\",\n partitionKey: (payload) => `${payload.pipelineId}:${payload.runId}`,\n },\n \"pipeline.run.step.finished\": {\n topic: \"pipelines\",\n partitionKey: (payload) => `${payload.pipelineId}:${payload.runId}`,\n },\n \"pipeline.run.finished\": {\n topic: \"pipelines\",\n partitionKey: (payload) => `${payload.pipelineId}:${payload.runId}`,\n },\n})\n\nexport const WORKFLOW_EVENT_DEFINITIONS = defineEventGroup<WorkflowEvent>({\n \"workflow.run.queued\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.run.started\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.run.node.started\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.run.waiting\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.run.node.waiting\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.run.node.finished\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.run.finished\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.intervention.requested\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.intervention.submitted\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.intervention.cancelled\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n \"workflow.intervention.expired\": {\n topic: \"workflows\",\n partitionKey: (payload) => `${payload.workflowId}:${payload.runId}`,\n },\n})\n\nexport const DATASET_EVENT_DEFINITIONS = defineEventGroup<DatasetEvent>({\n \"dataset.version.committed\": {\n topic: \"datasets\",\n partitionKey: (payload) => payload.datasetId,\n },\n})\n\nexport const EVENT_DEFINITIONS = {\n ...OBJECT_EVENT_DEFINITIONS,\n ...TELEMETRY_EVENT_DEFINITIONS,\n ...LINK_EVENT_DEFINITIONS,\n ...ACTION_EVENT_DEFINITIONS,\n ...SCHEDULE_EVENT_DEFINITIONS,\n ...SYNC_EVENT_DEFINITIONS,\n ...PIPELINE_EVENT_DEFINITIONS,\n ...WORKFLOW_EVENT_DEFINITIONS,\n ...DATASET_EVENT_DEFINITIONS,\n ...RULE_EVENT_DEFINITIONS,\n} as const satisfies EventDefinitionMap\n\nexport const EVENT_TYPES = Object.keys(EVENT_DEFINITIONS) as readonly DomainEvent[\"type\"][]\nexport const EVENT_TOPICS = [\n ...new Set(\n Object.values(EVENT_DEFINITIONS).map((definition): DomainEvent[\"topic\"] => definition.topic)\n ),\n] as readonly DomainEvent[\"topic\"][]\n\nexport function isDomainEventType(value: string): value is DomainEvent[\"type\"] {\n return Object.hasOwn(EVENT_DEFINITIONS, value)\n}\n\nexport function isOntologyFactType(\n value: string\n): value is ObjectEvent[\"type\"] | LinkEvent[\"type\"] | TelemetryEvent[\"type\"] {\n return (\n Object.hasOwn(OBJECT_EVENT_DEFINITIONS, value) ||\n Object.hasOwn(LINK_EVENT_DEFINITIONS, value) ||\n Object.hasOwn(TELEMETRY_EVENT_DEFINITIONS, value)\n )\n}\n\nexport function resolveEventStorage(event: DomainEventDraft): {\n readonly topic: DomainEvent[\"topic\"]\n readonly partitionKey: string\n} {\n const eventType = event.type as string\n if (!isDomainEventType(eventType)) {\n throw new EventsError(`Unknown event type: ${eventType}`)\n }\n\n const definition = EVENT_DEFINITIONS[eventType] as EventDefinition\n return {\n topic: definition.topic,\n partitionKey: definition.partitionKey(event.payload),\n }\n}\n",
|
|
7
|
+
"import { randomUUID } from \"node:crypto\"\nimport { createSixbError, serializeSixbFailure, toSixbFailure } from \"../errors/internal\"\nimport type {\n ClaimedOntologyOutboxRow,\n OntologyOutboxFailure,\n OntologyOutboxStorage,\n Storage,\n} from \"../storage\"\nimport { ONTOLOGY_OUTBOX_FAILURE_CODES } from \"../storage/ontology/outbox\"\nimport type { StableEventPublisher } from \"./service\"\n\nconst DEFAULT_BATCH_SIZE = 1_000\nconst DEFAULT_LEASE_DURATION_MS = 30_000\nconst DEFAULT_INITIAL_RETRY_DELAY_MS = 1_000\nconst DEFAULT_MAX_RETRY_DELAY_MS = 5 * 60_000\nconst DEFAULT_RETRY_JITTER_RATIO = 0.2\n// Isolating one poison row from a 1,000-row batch needs up to 21 broker calls: one failed call\n// and, at each split depth, one healthy sibling plus the failing half. Keep bounded headroom for\n// uneven splits while rescheduling unresolved groups once this pass reaches the cap.\nconst DEFAULT_MAX_ISOLATION_ATTEMPTS = 32\nconst DEFAULT_MAX_CLAIMS_PER_DRAIN = 10\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 30_000\n\nexport interface OntologyOutboxDeliveryFailure {\n readonly occurredAt: string\n /** Exact failure persisted on every envelope represented by this report. */\n readonly failure: OntologyOutboxFailure\n readonly attempts: number\n readonly eventIds: readonly string[]\n /** Types of the undelivered envelopes. The one field both delivery paths can always report. */\n readonly eventTypes: readonly string[]\n}\n\nexport interface OntologyOutboxDispatcherOptions {\n readonly projectId: string\n readonly storage: Storage\n /** Internal publisher port. It cannot author or mutate persisted ontology facts. */\n readonly events: StableEventPublisher\n readonly batchSize?: number\n readonly leaseDurationMs?: number\n readonly initialRetryDelayMs?: number\n readonly maxRetryDelayMs?: number\n /** Symmetric jitter ratio in the inclusive range 0..1. */\n readonly retryJitterRatio?: number\n /** Maximum broker calls used to isolate poison envelopes in one claimed batch. */\n readonly maxIsolationAttempts?: number\n /** Maximum claimed batches handled by one drain pass. */\n readonly maxClaimsPerDrain?: number\n /** Broker grace period. Shutdown still waits for outstanding storage operations afterward. */\n readonly shutdownTimeoutMs?: number\n readonly now?: () => Date\n readonly random?: () => number\n readonly createLeaseId?: () => string\n readonly onDeliveryFailure?: (error: unknown, failure: OntologyOutboxDeliveryFailure) => void\n readonly onError?: (error: unknown) => void\n}\n\n/**\n * One claimed batch whose unsettled rows remain recoverable during shutdown.\n *\n * Rows leave the set immediately before their lease is settled in storage. If storage settlement\n * itself fails, lease expiry remains the durable recovery path.\n */\nclass ClaimedBatch {\n private readonly unsettled = new Map<string, ClaimedOntologyOutboxRow>()\n private closed = false\n\n constructor(rows: readonly ClaimedOntologyOutboxRow[]) {\n for (const row of rows) this.unsettled.set(row.envelope.id, row)\n }\n\n take(rows: readonly ClaimedOntologyOutboxRow[]): readonly ClaimedOntologyOutboxRow[] {\n if (this.closed || rows.some((row) => !this.unsettled.has(row.envelope.id))) return []\n for (const row of rows) this.unsettled.delete(row.envelope.id)\n return rows\n }\n\n close(): readonly ClaimedOntologyOutboxRow[] {\n this.closed = true\n const rows = [...this.unsettled.values()]\n this.unsettled.clear()\n return rows\n }\n}\n\n/** Lease-based, at-least-once publisher for the authoritative ontology outbox. */\nexport class OntologyOutboxDispatcher {\n private readonly projectId: string\n private readonly storage: Storage\n private readonly events: StableEventPublisher\n private readonly batchSize: number\n private readonly leaseDurationMs: number\n private readonly initialRetryDelayMs: number\n private readonly maxRetryDelayMs: number\n private readonly retryJitterRatio: number\n private readonly maxIsolationAttempts: number\n private readonly maxClaimsPerDrain: number\n private readonly shutdownTimeoutMs: number\n private readonly now: () => Date\n private readonly random: () => number\n private readonly createLeaseId: () => string\n private readonly onDeliveryFailure?: OntologyOutboxDispatcherOptions[\"onDeliveryFailure\"]\n private readonly onError: (error: unknown) => void\n private draining: Promise<void> | null = null\n private pendingDrain: Promise<void> | null = null\n private stopping: Promise<void> | null = null\n private closing = false\n private stopRequested = false\n private readonly forcedStop = new AbortController()\n\n constructor(options: OntologyOutboxDispatcherOptions) {\n assertNonblank(options.projectId, \"projectId\")\n this.projectId = options.projectId\n this.storage = options.storage\n this.events = options.events\n this.batchSize = positiveInteger(options.batchSize ?? DEFAULT_BATCH_SIZE, \"batchSize\")\n this.leaseDurationMs = positiveInteger(\n options.leaseDurationMs ?? DEFAULT_LEASE_DURATION_MS,\n \"leaseDurationMs\"\n )\n this.initialRetryDelayMs = positiveInteger(\n options.initialRetryDelayMs ?? DEFAULT_INITIAL_RETRY_DELAY_MS,\n \"initialRetryDelayMs\"\n )\n this.maxRetryDelayMs = positiveInteger(\n options.maxRetryDelayMs ?? DEFAULT_MAX_RETRY_DELAY_MS,\n \"maxRetryDelayMs\"\n )\n if (this.maxRetryDelayMs < this.initialRetryDelayMs) {\n throw new Error(\n \"[Sixb] Ontology outbox dispatcher maxRetryDelayMs must be at least initialRetryDelayMs.\"\n )\n }\n this.retryJitterRatio = options.retryJitterRatio ?? DEFAULT_RETRY_JITTER_RATIO\n if (\n !Number.isFinite(this.retryJitterRatio) ||\n this.retryJitterRatio < 0 ||\n this.retryJitterRatio > 1\n ) {\n throw new Error(\"[Sixb] Ontology outbox dispatcher retryJitterRatio must be between 0 and 1.\")\n }\n this.maxIsolationAttempts = positiveInteger(\n options.maxIsolationAttempts ?? DEFAULT_MAX_ISOLATION_ATTEMPTS,\n \"maxIsolationAttempts\"\n )\n this.maxClaimsPerDrain = positiveInteger(\n options.maxClaimsPerDrain ?? DEFAULT_MAX_CLAIMS_PER_DRAIN,\n \"maxClaimsPerDrain\"\n )\n this.shutdownTimeoutMs = nonnegativeInteger(\n options.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS,\n \"shutdownTimeoutMs\"\n )\n this.now = options.now ?? (() => new Date())\n this.random = options.random ?? Math.random\n this.createLeaseId = options.createLeaseId ?? randomUUID\n this.onDeliveryFailure = options.onDeliveryFailure\n this.onError =\n options.onError ?? ((error) => console.error(\"[Sixb] Outbox dispatcher error:\", error))\n }\n\n /**\n * Publishes one bounded pass of currently due rows without starting an idle polling loop.\n *\n * Concurrent callers share one pass and at most one coalesced follow-up pass. This gives every\n * post-commit notification a chance to observe its own rows without serializing one pass per\n * mutation.\n */\n drain(): Promise<void> {\n if (this.closing || this.stopRequested) return Promise.resolve()\n if (!this.draining) return this.startDrainPass()\n\n this.pendingDrain ??= settled(this.draining).then(() => {\n this.pendingDrain = null\n if (!this.stopRequested) return this.startDrainPass()\n })\n return this.pendingDrain\n }\n\n /** Starts a tracked, best-effort drain without extending mutation latency. */\n notify(): void {\n if (this.closing || this.stopRequested) return\n void this.drain().catch((error) => this.reportError(error))\n }\n\n stop(): Promise<void> {\n this.stopping ??= this.stopOnce()\n return this.stopping\n }\n\n private async stopOnce(): Promise<void> {\n if (this.stopRequested) return\n\n // Include one final bounded pass so commits whose notifications were coalesced immediately\n // before shutdown are not left pending merely because the process is stopping.\n const gracefulDrain = this.drain().catch((error) => this.reportError(error))\n this.closing = true\n const finished = await settlesWithin(gracefulDrain, this.shutdownTimeoutMs)\n this.stopRequested = true\n if (!finished) this.forcedStop.abort()\n // Storage operations cannot be cancelled by this contract. A late claim must release its\n // lease, and an acknowledgement already started must finish before callers close storage.\n // publishClaim owns settlement, including forced stop; never race a second cleanup against it.\n await gracefulDrain\n if (this.draining) await settled(this.draining)\n if (this.pendingDrain) await settled(this.pendingDrain)\n }\n\n private startDrainPass(): Promise<void> {\n const pass = this.drainAvailable()\n this.draining = pass\n void settled(pass).then(() => {\n if (this.draining === pass) this.draining = null\n })\n return pass\n }\n\n private async drainAvailable(): Promise<void> {\n for (let claimCount = 0; claimCount < this.maxClaimsPerDrain; claimCount += 1) {\n if (this.stopRequested) return\n const rows = await this.claimBatch()\n if (rows.length === 0) return\n const publishedCount = await this.publishClaim(rows)\n if (this.stopRequested || publishedCount === 0 || rows.length < this.batchSize) return\n // In-memory/SQLite can resolve without I/O. Yield between full batches so catch-up cannot\n // monopolize the event loop, while keeping small post-commit deliveries immediate.\n await new Promise<void>((resolve) => setImmediate(resolve))\n }\n\n // A healthy full slice means more due rows may remain. Reuse the existing coalescing path so\n // catch-up continues without recursion, an idle polling loop, or an unbounded individual pass.\n if (!this.closing && !this.stopRequested) this.notify()\n }\n\n private claimBatch(): Promise<readonly ClaimedOntologyOutboxRow[]> {\n const now = this.now().getTime()\n return this.withOutbox((outbox) =>\n outbox.claim({\n projectId: this.projectId,\n now: new Date(now).toISOString(),\n limit: this.batchSize,\n leaseId: this.createLeaseId(),\n leaseExpiresAt: new Date(now + this.leaseDurationMs).toISOString(),\n })\n )\n }\n\n private async publishClaim(rows: readonly ClaimedOntologyOutboxRow[]): Promise<number> {\n const claim = new ClaimedBatch(rows)\n const failures = new DeliveryFailureAccumulator()\n const pending: PublicationGroup[] = [{ rows }]\n let publishAttempts = 0\n let publishedCount = 0\n\n try {\n while (pending.length > 0 && !this.stopRequested) {\n const group = pending.shift()\n if (!group || group.rows.length === 0) continue\n if (publishAttempts >= this.maxIsolationAttempts && group.failure) {\n await this.rescheduleFailed(claim, group.rows, group.failure.error, failures)\n continue\n }\n publishAttempts += 1\n\n try {\n const publication = await publishUntilStopped(\n this.events.publishEnvelopes(group.rows.map((row) => row.envelope)),\n this.forcedStop.signal\n )\n if (publication === \"stopped\") break\n } catch (error) {\n if (group.rows.length > 1 && publishAttempts < this.maxIsolationAttempts) {\n const middle = Math.ceil(group.rows.length / 2)\n pending.unshift(\n { rows: group.rows.slice(middle), failure: { error } },\n { rows: group.rows.slice(0, middle), failure: { error } }\n )\n continue\n }\n await this.rescheduleFailed(claim, group.rows, error, failures)\n continue\n }\n\n await this.markPublished(claim, group.rows)\n publishedCount += group.rows.length\n }\n } finally {\n if (this.stopRequested) {\n await this.rescheduleClaimedForShutdown(claim.close())\n }\n for (const failure of failures.list()) {\n this.reportDeliveryFailure(failure.error, failure.context)\n }\n }\n return publishedCount\n }\n\n private async markPublished(\n claim: ClaimedBatch,\n rows: readonly ClaimedOntologyOutboxRow[]\n ): Promise<void> {\n const settling = claim.take(rows)\n if (settling.length === 0) return\n try {\n await this.withOutbox((outbox) =>\n outbox.markPublished({\n projectId: this.projectId,\n ids: eventIds(settling),\n leaseId: sharedLeaseId(settling),\n publishedAt: this.now().toISOString(),\n })\n )\n } catch (error) {\n this.reportError(error)\n throw error\n }\n }\n\n private async rescheduleFailed(\n claim: ClaimedBatch,\n rows: readonly ClaimedOntologyOutboxRow[],\n error: unknown,\n failures: DeliveryFailureAccumulator\n ): Promise<void> {\n const settling = claim.take(rows)\n if (settling.length === 0) return\n const failedAt = this.now()\n\n for (const [attempts, attemptRows] of rowsByAttempts(settling)) {\n const deliveryError = createEventDeliveryError(error, attempts)\n const failure = toSixbFailure(deliveryError, {\n allowedCodes: ONTOLOGY_OUTBOX_FAILURE_CODES,\n at: failedAt,\n })\n failures.add(deliveryError, failure, failedAt.toISOString(), attempts, attemptRows)\n try {\n await this.withOutbox((outbox) =>\n outbox.reschedule({\n projectId: this.projectId,\n ids: eventIds(attemptRows),\n leaseId: sharedLeaseId(attemptRows),\n availableAt: new Date(failedAt.getTime() + this.retryDelayMs(attempts)).toISOString(),\n failure,\n })\n )\n } catch (rescheduleError) {\n this.reportError(rescheduleError)\n throw rescheduleError\n }\n }\n }\n\n private retryDelayMs(attempts: number): number {\n const exponent = Math.max(0, Math.min(52, attempts - 1))\n const exponential = Math.min(this.maxRetryDelayMs, this.initialRetryDelayMs * 2 ** exponent)\n const random = this.random()\n const unitRandom = Number.isFinite(random) ? Math.max(0, Math.min(1, random)) : 0.5\n const jitterFactor = 1 - this.retryJitterRatio + 2 * this.retryJitterRatio * unitRandom\n return Math.min(this.maxRetryDelayMs, Math.max(0, Math.round(exponential * jitterFactor)))\n }\n\n private async rescheduleClaimedForShutdown(\n rows: readonly ClaimedOntologyOutboxRow[]\n ): Promise<void> {\n if (rows.length === 0) return\n try {\n await this.withOutbox((outbox) =>\n outbox.reschedule({\n projectId: this.projectId,\n ids: eventIds(rows),\n leaseId: sharedLeaseId(rows),\n availableAt: this.now().toISOString(),\n })\n )\n } catch (error) {\n this.reportError(error)\n }\n }\n\n private withOutbox<T>(run: (outbox: OntologyOutboxStorage) => Promise<T> | T): Promise<T> {\n // Every outbox method owns its atomic provider operation. A framework-wide transaction\n // adds no guarantee here and copies the entire InMemoryStorage state for every batch.\n return Promise.resolve(run(this.storage.ontology.outbox))\n }\n\n private reportDeliveryFailure(error: unknown, failure: OntologyOutboxDeliveryFailure): void {\n try {\n this.onDeliveryFailure?.(error, failure)\n } catch {\n // Failure observers cannot stop delivery or create an unhandled rejection.\n }\n }\n\n private reportError(error: unknown): void {\n try {\n this.onError(error)\n } catch {\n // Error observers cannot stop delivery or create an unhandled rejection.\n }\n }\n}\n\ninterface PublicationGroup {\n readonly rows: readonly ClaimedOntologyOutboxRow[]\n readonly failure?: { readonly error: unknown }\n}\n\ninterface AccumulatedDeliveryFailure {\n readonly error: unknown\n readonly context: OntologyOutboxDeliveryFailure\n}\n\n/** Coalesces bisection failures so one claimed row is reported once per delivery attempt. */\nclass DeliveryFailureAccumulator {\n private readonly groups = new Map<\n string,\n {\n error: unknown\n failure: OntologyOutboxFailure\n occurredAt: string\n attempts: number\n eventIds: Set<string>\n eventTypes: Set<string>\n }\n >()\n\n add(\n error: unknown,\n failure: OntologyOutboxFailure,\n occurredAt: string,\n attempts: number,\n rows: readonly ClaimedOntologyOutboxRow[]\n ): void {\n const key = serializeSixbFailure(failure, ONTOLOGY_OUTBOX_FAILURE_CODES)\n const group = this.groups.get(key) ?? {\n error,\n failure,\n occurredAt,\n attempts,\n eventIds: new Set<string>(),\n eventTypes: new Set<string>(),\n }\n for (const row of rows) {\n group.eventIds.add(row.envelope.id)\n group.eventTypes.add(row.envelope.type)\n }\n this.groups.set(key, group)\n }\n\n list(): readonly AccumulatedDeliveryFailure[] {\n return [...this.groups.values()].map((group) => ({\n error: group.error,\n context: {\n occurredAt: group.occurredAt,\n failure: group.failure,\n attempts: group.attempts,\n eventIds: [...group.eventIds].sort(),\n eventTypes: [...group.eventTypes].sort(),\n },\n }))\n }\n}\n\nfunction positiveInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(`[Sixb] Ontology outbox dispatcher ${name} must be a positive integer.`)\n }\n return value\n}\n\nfunction nonnegativeInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`[Sixb] Ontology outbox dispatcher ${name} must be a nonnegative integer.`)\n }\n return value\n}\n\nfunction assertNonblank(value: string, name: string): void {\n if (value.trim().length === 0) {\n throw new Error(`[Sixb] Ontology outbox dispatcher ${name} must not be blank.`)\n }\n}\n\nfunction rowsByAttempts(\n rows: readonly ClaimedOntologyOutboxRow[]\n): ReadonlyMap<number, readonly ClaimedOntologyOutboxRow[]> {\n const groups = new Map<number, ClaimedOntologyOutboxRow[]>()\n for (const row of rows) {\n const group = groups.get(row.attempts) ?? []\n group.push(row)\n groups.set(row.attempts, group)\n }\n return groups\n}\n\nfunction eventIds(rows: readonly ClaimedOntologyOutboxRow[]): string[] {\n return rows.map((row) => row.envelope.id)\n}\n\nfunction sharedLeaseId(rows: readonly ClaimedOntologyOutboxRow[]): string {\n const leaseId = rows[0]?.leaseId\n if (!leaseId || rows.some((row) => row.leaseId !== leaseId)) {\n throw new Error(\"[Sixb] Claimed ontology outbox batch does not share one lease.\")\n }\n return leaseId\n}\n\nfunction createEventDeliveryError(cause: unknown, attempts: number) {\n return createSixbError(\n \"event.delivery_failed\",\n \"[Sixb] Could not deliver persisted ontology events.\",\n {\n cause,\n details: {\n attempts,\n },\n }\n )\n}\n\nasync function publishUntilStopped(\n publication: Promise<unknown>,\n signal: AbortSignal\n): Promise<\"published\" | \"stopped\"> {\n if (signal.aborted) return \"stopped\"\n\n return new Promise((resolve, reject) => {\n const stop = () => finish(() => resolve(\"stopped\"))\n const finish = (settle: () => void) => {\n signal.removeEventListener(\"abort\", stop)\n settle()\n }\n signal.addEventListener(\"abort\", stop, { once: true })\n void publication.then(\n () => finish(() => resolve(\"published\")),\n (error) => finish(() => reject(error))\n )\n })\n}\n\n/** Awaits a pass without adopting its failure, so one failed drain cannot reject the next. */\nfunction settled(promise: Promise<void>): Promise<void> {\n return promise.then(\n () => undefined,\n () => undefined\n )\n}\n\nasync function settlesWithin(promise: Promise<void>, timeoutMs: number): Promise<boolean> {\n let timer: ReturnType<typeof setTimeout> | undefined\n const timedOut = new Promise<false>((resolve) => {\n timer = setTimeout(() => resolve(false), timeoutMs)\n })\n const result = await Promise.race([\n promise.then(\n () => true as const,\n () => true as const\n ),\n timedOut,\n ])\n if (timer !== undefined) clearTimeout(timer)\n return result\n}\n",
|
|
8
|
+
"import { randomUUID } from \"node:crypto\"\nimport type { Broker, BrokerCursor, BrokerRecord, BrokerStreamDefinition } from \"../broker\"\nimport { type ErrorReporter, SixbErrorReporter } from \"../error-reporting/reporter\"\nimport { reportEventDeliveryFailure } from \"../error-reporting/reports\"\nimport { getInvalidJsonValueReason, type JsonValue } from \"../json\"\nimport type { OntologyMaterializationEvent } from \"../materialization/events\"\nimport {\n EVENT_DEFINITIONS,\n EVENT_TYPES,\n isDomainEventType,\n isOntologyFactType,\n resolveEventStorage,\n} from \"./definitions\"\nimport { EventsError } from \"./errors\"\nimport type {\n DomainEvent,\n EventActor,\n EventDraft,\n StoredAuthorableEvent,\n StoredDomainEvent,\n} from \"./types\"\n\n// Keep domain events as a short recent log. This is 2 days in milliseconds.\nexport const DEFAULT_EVENTS_RETENTION_MS = 2 * 24 * 60 * 60 * 1000\n\nexport const EVENTS_STREAM: BrokerStreamDefinition = {\n id: \"__events\",\n retention: { maxAgeMs: DEFAULT_EVENTS_RETENTION_MS },\n}\n\nexport interface DomainEventServiceOptions {\n readonly projectId: string\n readonly broker: Broker\n readonly stream?: BrokerStreamDefinition\n /** Internal failure reporter. Defaults to the console when this runtime is used standalone. */\n readonly errorReporter?: ErrorReporter\n}\n\nexport interface EventsAppendInput {\n readonly actor?: EventActor\n readonly correlationId?: string\n readonly causationId?: string\n readonly events: readonly EventDraft[]\n}\n\nexport interface EventsEmitOptions {\n /** Framework component that initiated the emission, such as `SixbPipelineWorker`. */\n readonly source: string\n}\n\nexport interface EventsReadInput {\n readonly afterCursor?: string\n readonly limit?: number\n readonly topics?: readonly DomainEvent[\"topic\"][]\n readonly types?: readonly DomainEvent[\"type\"][]\n}\n\nexport interface EventsSubscribeInput {\n /** Defaults to live-only delivery. `afterCursor` takes precedence when provided. */\n readonly from?: \"latest\" | \"earliest\"\n readonly afterCursor?: BrokerCursor\n readonly types?: readonly DomainEvent[\"type\"][]\n}\n\n/** Exact, already-identified materialization event persisted before broker publication. @internal */\nexport type StableEventEnvelope = OntologyMaterializationEvent\n\n/** Public domain-event log. Stable ontology envelopes are intentionally absent. */\nexport interface DomainEventLog {\n append(input: EventsAppendInput): Promise<readonly StoredDomainEvent[]>\n /**\n * Append events after the work that produced them has already succeeded.\n *\n * Contract: this never rejects. The caller's unit of work is done, so a delivery failure must not\n * turn a successful run into a failed one — the implementation escalates the loss instead.\n */\n emit(input: EventsAppendInput, options: EventsEmitOptions): Promise<void>\n read(input?: EventsReadInput): Promise<readonly StoredDomainEvent[]>\n latestCursor(): Promise<string | undefined>\n subscribe(\n input: EventsSubscribeInput,\n handler: (events: readonly StoredDomainEvent[]) => unknown\n ): Promise<() => void>\n}\n\n/** Narrow internal port used to publish envelopes already persisted in the ontology outbox. */\nexport interface StableEventPublisher {\n publishEnvelopes(envelopes: readonly StableEventEnvelope[]): Promise<readonly StoredDomainEvent[]>\n}\n\n/** Project-scoped domain event service backed by the shared broker provider. */\nexport class DomainEventService implements DomainEventLog, StableEventPublisher {\n private readonly projectId: string\n private readonly broker: Broker\n private readonly stream: BrokerStreamDefinition\n private readonly errorReporter: ErrorReporter\n private readonly ensureStreamPromises = new Map<string, Promise<void>>()\n\n constructor(options: DomainEventServiceOptions) {\n this.projectId = options.projectId\n this.broker = options.broker\n this.stream = options.stream ?? EVENTS_STREAM\n this.errorReporter = options.errorReporter ?? new SixbErrorReporter()\n }\n\n /**\n * Append events after the work that produced them has already succeeded.\n *\n * Unlike `append`, this never rejects: the caller's unit of work is done, so a broker outage must not\n * turn a successful run into a failed one. It is not a swallow either — every event Sixb publishes is\n * a potential trigger edge (a rule's `.when()`, an event schedule, a workflow's wait node), so a lost\n * batch is a handler that silently never runs. The loss is escalated to `onError` as\n * `event.delivery.failed`, or to the default console reporter when no handler was configured.\n *\n * Framework emit sites want this. Application code wants `append`, which reports failure to the\n * caller and returns the stored envelopes.\n */\n async emit(input: EventsAppendInput, _options: EventsEmitOptions): Promise<void> {\n try {\n await this.append(input)\n } catch (error) {\n try {\n const eventTypes = input.events.map((event) => event.type)\n reportEventDeliveryFailure(this.errorReporter, error, {\n projectId: this.projectId,\n eventTypes,\n })\n } catch {\n // The contract above is absolute, so escalation cannot be the thing that breaks it.\n }\n }\n }\n\n async append(input: EventsAppendInput): Promise<readonly StoredDomainEvent[]> {\n if (input.events.length === 0) {\n return []\n }\n for (const event of input.events) {\n if (isOntologyFactType(event.type)) {\n throw new EventsError(\n `Event type '${event.type}' is an authoritative ontology fact and cannot be appended directly.`\n )\n }\n }\n\n const payloads = input.events.map((event) =>\n toStoredEventPayload({\n projectId: this.projectId,\n actor: input.actor,\n correlationId: input.correlationId,\n causationId: input.causationId,\n event,\n })\n )\n\n await this.ensureStream()\n const records = await this.broker.append({\n projectId: this.projectId,\n streamId: this.stream.id,\n records: payloads.map((payload) => ({\n name: payload.type,\n key: payload.partitionKey,\n payload: toBrokerRecordPayload(payload),\n idempotencyKey: payload.idempotencyKey,\n })),\n })\n\n if (records.length !== payloads.length) {\n throw new EventsError(\n `Broker returned ${records.length} record(s) for ${payloads.length} appended event(s).`\n )\n }\n\n return records.map(hydrateEventRecord)\n }\n\n /** Publishes persisted envelopes without changing their stable event identity. @internal */\n async publishEnvelopes(\n envelopes: readonly StableEventEnvelope[]\n ): Promise<readonly StoredDomainEvent[]> {\n if (envelopes.length === 0) {\n return []\n }\n\n for (const envelope of envelopes) {\n if (envelope.projectId !== this.projectId) {\n throw new EventsError(\n `Event '${envelope.id}' belongs to project '${envelope.projectId}', not '${this.projectId}'.`\n )\n }\n if (!isDomainEventType(envelope.type)) {\n throw new EventsError(`Event '${envelope.id}' has unknown event type.`)\n }\n if (EVENT_DEFINITIONS[envelope.type].topic !== envelope.topic) {\n throw new EventsError(\n `Event '${envelope.id}' topic '${envelope.topic}' does not match type '${envelope.type}'.`\n )\n }\n }\n\n await this.ensureStream()\n const records = await this.broker.append({\n projectId: this.projectId,\n streamId: this.stream.id,\n records: envelopes.map((envelope) => ({\n name: envelope.type,\n key: envelope.partitionKey,\n payload: toBrokerRecordPayload(envelope),\n idempotencyKey: envelope.id,\n })),\n })\n\n if (records.length !== envelopes.length) {\n throw new EventsError(\n `Broker returned ${records.length} record(s) for ${envelopes.length} published event(s).`\n )\n }\n\n return records.map(hydrateEventRecord)\n }\n\n async read(input: EventsReadInput = {}): Promise<readonly StoredDomainEvent[]> {\n if (input.limit !== undefined && input.limit <= 0) {\n return []\n }\n\n const names = resolveTypeFilter(input)\n if (names && names.length === 0) {\n return []\n }\n\n await this.ensureStream()\n const page = await this.broker.read({\n projectId: this.projectId,\n streamId: this.stream.id,\n afterCursor: input.afterCursor,\n limit: input.limit,\n names,\n })\n\n return page.records.map(hydrateEventRecord)\n }\n\n async latestCursor(): Promise<string | undefined> {\n await this.ensureStream()\n return this.broker.latestCursor({\n projectId: this.projectId,\n streamId: this.stream.id,\n })\n }\n\n async subscribe(\n input: EventsSubscribeInput,\n handler: (events: readonly StoredDomainEvent[]) => unknown\n ): Promise<() => void> {\n await this.ensureStream()\n return this.broker.subscribe(\n {\n projectId: this.projectId,\n streamId: this.stream.id,\n from: input.from,\n afterCursor: input.afterCursor,\n names: input.types && input.types.length > 0 ? input.types : EVENT_TYPES,\n },\n (records) => {\n const events = records.map(hydrateEventRecord)\n if (events.length === 0) {\n return\n }\n\n try {\n return handler(events)\n } catch {\n // Preserve fire-and-forget subscriber semantics.\n }\n }\n )\n }\n\n private ensureStream(): Promise<void> {\n const key = `${this.projectId}\\0${this.stream.id}`\n let promise = this.ensureStreamPromises.get(key)\n if (!promise) {\n promise = this.broker\n .ensureStream({\n projectId: this.projectId,\n stream: this.stream,\n })\n .catch((error) => {\n if (this.ensureStreamPromises.get(key) === promise) {\n this.ensureStreamPromises.delete(key)\n }\n throw error\n })\n this.ensureStreamPromises.set(key, promise)\n }\n return promise\n }\n}\n\nexport function createDomainEventService(options: DomainEventServiceOptions): DomainEventService {\n return new DomainEventService(options)\n}\n\ntype StoredEventPayload = Omit<StoredAuthorableEvent, \"cursor\">\n\nfunction toStoredEventPayload(params: {\n projectId: string\n actor?: EventActor\n correlationId?: string\n causationId?: string\n event: EventDraft\n}): StoredEventPayload {\n const storage = resolveEventStorage(params.event)\n const payload: Record<string, unknown> = {\n id: randomUUID(),\n schemaVersion: 1,\n projectId: params.projectId,\n occurredAt: params.event.occurredAt ?? new Date().toISOString(),\n type: params.event.type,\n topic: storage.topic,\n partitionKey: storage.partitionKey,\n payload: params.event.payload,\n }\n\n setIfDefined(payload, \"correlationId\", params.correlationId)\n setIfDefined(payload, \"causationId\", params.causationId)\n setIfDefined(payload, \"idempotencyKey\", params.event.idempotencyKey)\n setIfDefined(payload, \"actor\", params.actor)\n setIfDefined(payload, \"origin\", params.event.origin)\n setIfDefined(payload, \"metadata\", params.event.metadata)\n\n return payload as StoredEventPayload\n}\n\nfunction toBrokerRecordPayload(payload: StoredEventPayload | StableEventEnvelope): JsonValue {\n const reason = getInvalidJsonValueReason(payload, `event '${payload.type}' payload`)\n if (reason) {\n throw new EventsError(`Event '${payload.type}' cannot be stored in broker; ${reason}`)\n }\n\n return payload as unknown as JsonValue\n}\n\nfunction hydrateEventRecord(record: BrokerRecord): StoredDomainEvent {\n const payload = record.payload\n if (!isObjectRecord(payload)) {\n throw new EventsError(`Broker record at cursor '${record.cursor}' is not an event object.`)\n }\n\n const eventType = payload.type\n if (typeof eventType !== \"string\" || !isDomainEventType(eventType)) {\n throw new EventsError(`Broker record at cursor '${record.cursor}' has unknown event type.`)\n }\n\n if (record.name !== undefined && record.name !== eventType) {\n throw new EventsError(\n `Broker record name '${record.name}' does not match event type '${eventType}'.`\n )\n }\n\n return {\n ...payload,\n cursor: record.cursor,\n } as StoredDomainEvent\n}\n\nfunction resolveTypeFilter(input: {\n topics?: readonly DomainEvent[\"topic\"][]\n types?: readonly DomainEvent[\"type\"][]\n}): readonly DomainEvent[\"type\"][] {\n const topicTypes =\n input.topics && input.topics.length > 0\n ? EVENT_TYPES.filter((type) => input.topics?.includes(EVENT_DEFINITIONS[type].topic))\n : undefined\n\n if (!topicTypes) {\n return input.types && input.types.length > 0 ? input.types : EVENT_TYPES\n }\n\n if (!input.types || input.types.length === 0) {\n return topicTypes\n }\n\n const requestedTypes = new Set(input.types)\n return topicTypes.filter((type) => requestedTypes.has(type))\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null\n}\n\nfunction setIfDefined(target: Record<string, unknown>, key: string, value: unknown): void {\n if (value !== undefined) {\n target[key] = value\n }\n}\n",
|
|
9
|
+
"import { randomUUID } from \"node:crypto\"\nimport { resolveEventStorage } from \"./definitions\"\nimport type { EventActor, EventDraft, StoredAuthorableEvent } from \"./types/index\"\n\nexport function toStoredEvent(params: {\n projectId: string\n actor?: EventActor\n correlationId?: string\n causationId?: string\n event: EventDraft\n cursor: string\n}): StoredAuthorableEvent {\n const base = {\n id: randomUUID(),\n schemaVersion: 1 as const,\n projectId: params.projectId,\n occurredAt: params.event.occurredAt ?? new Date().toISOString(),\n correlationId: params.correlationId,\n causationId: params.causationId,\n idempotencyKey: params.event.idempotencyKey,\n actor: params.actor,\n origin: params.event.origin,\n metadata: params.event.metadata,\n cursor: params.cursor,\n }\n\n const storage = resolveEventStorage(params.event)\n return {\n ...base,\n type: params.event.type,\n topic: storage.topic,\n partitionKey: storage.partitionKey,\n payload: params.event.payload,\n } as StoredAuthorableEvent\n}\n"
|
|
10
|
+
],
|
|
11
|
+
"mappings": "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",
|
|
12
|
+
"debugId": "D60791393813ED9264756E2164756E21",
|
|
13
|
+
"names": []
|
|
14
|
+
}
|
|
@@ -6,16 +6,18 @@ import {
|
|
|
6
6
|
import {
|
|
7
7
|
ConnectorError2,
|
|
8
8
|
createConnectorCodedError,
|
|
9
|
-
getConnectorExecutionSourceResolver
|
|
10
|
-
|
|
11
|
-
} from "./chunk-emyyk7dx.js";
|
|
9
|
+
getConnectorExecutionSourceResolver
|
|
10
|
+
} from "./chunk-v2vcg0w6.js";
|
|
12
11
|
import {
|
|
13
12
|
isDatasetDefinition2
|
|
14
13
|
} from "./chunk-860dwwy0.js";
|
|
14
|
+
import {
|
|
15
|
+
SyncValidationError2
|
|
16
|
+
} from "./chunk-cfvakeax.js";
|
|
15
17
|
import {
|
|
16
18
|
isOAuthConnectorAdapter,
|
|
17
19
|
isConnectorDefinition
|
|
18
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-9x8dybsb.js";
|
|
19
21
|
|
|
20
22
|
// src/syncs/builders.ts
|
|
21
23
|
function assertNonEmpty(value, field) {
|
|
@@ -103,9 +105,6 @@ function defineConnector2(id, adapter) {
|
|
|
103
105
|
if (!isOAuthConnectorAdapter(adapter) || typeof adapter.authentication.authorizationUrl !== "function" || typeof adapter.authentication.exchangeCode !== "function" || typeof adapter.authentication.refresh !== "function" || typeof adapter.discoverAccounts !== "function") {
|
|
104
106
|
throw createConnectorCodedError("connector.configuration_invalid", "OAuth connector adapters must define oauth2 authentication and implement authorizationUrl, exchangeCode, refresh, and discoverAccounts.");
|
|
105
107
|
}
|
|
106
|
-
if (adapter.webhooks !== undefined) {
|
|
107
|
-
throw createConnectorCodedError("connector.configuration_invalid", "OAuth connector adapters cannot register webhooks until connection routing is defined.");
|
|
108
|
-
}
|
|
109
108
|
}
|
|
110
109
|
return {
|
|
111
110
|
kind: "connector",
|
|
@@ -125,4 +124,4 @@ function isRecord(value) {
|
|
|
125
124
|
}
|
|
126
125
|
export { defineConnector2, defineSync2, resolveSyncConnectorSources2, isSyncDefinition2 };
|
|
127
126
|
|
|
128
|
-
//# debugId=
|
|
127
|
+
//# debugId=99DD47F6247AC4A364756E2164756E21
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import type { AnyConnectorAdapter, ConnectorDefinition } from \"../connectors\"\nimport type { DatasetDefinition } from \"../datasets\"\nimport type { ScheduleDefinition, ScheduleReference } from \"../schedules\"\nimport { isScheduleDefinition } from \"../schedules\"\nimport { SyncValidationError } from \"./errors\"\nimport type {\n BatchSyncConfig,\n BatchSyncDefinitionConfig,\n SyncBuilder,\n SyncDefinition,\n SyncMode,\n SyncReadBuilder,\n SyncTargetBuilder,\n} from \"./types\"\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (!value.trim()) {\n throw new SyncValidationError(`Sync ${field} must not be empty.`)\n }\n}\n\nfunction assertDataset(dataset: DatasetDefinition, mode: SyncMode): void {\n assertNonEmpty(dataset.id, \"dataset id\")\n if (mode === \"merge\" && dataset.primaryKey === undefined) {\n throw new SyncValidationError(`Merge sync dataset '${dataset.id}' must define a primaryKey.`)\n }\n}\n\nfunction normalizeBatchSyncConfig(options: BatchSyncConfig | undefined): BatchSyncDefinitionConfig {\n const mode = options?.mode ?? \"snapshot\"\n\n if (mode !== \"snapshot\" && mode !== \"append\" && mode !== \"merge\") {\n throw new SyncValidationError(\n `Invalid sync mode '${String(mode)}'. Expected 'snapshot', 'append', or 'merge'.`\n )\n }\n\n return {\n kind: \"batch\",\n mode,\n }\n}\n\ntype DefaultBatchSyncConfig = Omit<BatchSyncConfig, \"mode\"> & { readonly mode?: undefined }\n\n/**\n * Define a batch sync that reads from one connector and writes into one dataset.\n *\n * The returned definition is inert and safe to export from `syncs/` modules.\n * Supports `snapshot`, `append`, and keyed `merge` modes with optional triggers and checkpoints.\n */\nexport function defineSync<TId extends string>(\n id: TId,\n options?: DefaultBatchSyncConfig\n): SyncBuilder<TId, never, \"snapshot\">\nexport function defineSync<TId extends string, const TMode extends SyncMode>(\n id: TId,\n options: BatchSyncConfig<TMode> & { readonly mode: TMode }\n): SyncBuilder<TId, never, TMode>\nexport function defineSync<TId extends string>(\n id: TId,\n options: BatchSyncConfig\n): SyncBuilder<TId, never, SyncMode>\nexport function defineSync<TId extends string>(\n id: TId,\n options?: BatchSyncConfig\n): SyncBuilder<TId, never, SyncMode> {\n assertNonEmpty(id, \"id\")\n\n const config = normalizeBatchSyncConfig(options)\n const triggers: ScheduleReference[] = []\n\n function createBuilder<TCheckpoint>(): SyncBuilder<TId, TCheckpoint, SyncMode> {\n const builder: SyncBuilder<TId, TCheckpoint, SyncMode> = {\n when(schedule: ScheduleDefinition): SyncBuilder<TId, TCheckpoint, SyncMode> {\n if (!isScheduleDefinition(schedule)) {\n throw new SyncValidationError(\"Sync .when(...) only accepts schedules.\")\n }\n triggers.push({ type: \"schedule\", scheduleId: schedule.id })\n return builder\n },\n checkpoint<TNextCheckpoint>(): SyncBuilder<TId, TNextCheckpoint, SyncMode> {\n return createBuilder<TNextCheckpoint>()\n },\n from<TConnector extends ConnectorDefinition<string, AnyConnectorAdapter>>(\n connector: TConnector\n ): SyncReadBuilder<TId, TConnector, TCheckpoint, SyncMode> {\n return {\n read(handler): SyncTargetBuilder<TId, TConnector, TCheckpoint, SyncMode> {\n return {\n intoDataset(\n dataset: DatasetDefinition\n ): SyncDefinition<TId, TConnector, TCheckpoint, SyncMode> {\n assertDataset(dataset, config.mode)\n\n return {\n kind: \"sync\",\n id,\n config,\n triggers,\n connector,\n read: handler,\n target: {\n kind: \"dataset\",\n dataset,\n },\n }\n },\n }\n },\n }\n },\n }\n\n return builder\n }\n\n return createBuilder<never>()\n}\n",
|
|
6
6
|
"import type { AnyConnectorAdapter, ConnectorDefinition, ConnectorRuntime } from \"../connectors\"\nimport {\n type ConnectorExecutionSource,\n type ConnectorExecutionSourceResolver,\n getConnectorExecutionSourceResolver,\n} from \"../connectors/execution\"\n\n/** One connector client invocation contributing values to a Sync run. */\nexport type SyncConnectorSource<TAdapter extends AnyConnectorAdapter = AnyConnectorAdapter> =\n ConnectorExecutionSource<TAdapter>\n\nexport type SyncConnectorSourceResolver = ConnectorExecutionSourceResolver\n\n/** Resolve the source invocations owned by one connector definition for a Sync execution. */\nexport function resolveSyncConnectorSources<TAdapter extends AnyConnectorAdapter>(\n connector: ConnectorRuntime,\n definition: ConnectorDefinition<string, TAdapter>\n): Promise<readonly SyncConnectorSource<TAdapter>[]> {\n return getConnectorExecutionSourceResolver(connector).list(definition)\n}\n",
|
|
7
|
-
"import { ConnectorError, createConnectorCodedError } from \"./errors\"\nimport type {\n AnyConnectorAdapter,\n ConnectorAdapter,\n ConnectorDefinition,\n OAuthConnectorAdapter,\n} from \"./types\"\nimport { isOAuthConnectorAdapter } from \"./types\"\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (!value.trim()) {\n throw new ConnectorError(`Connector ${field} must not be empty.`)\n }\n}\n\n/**\n * Define a connector instance for an external system.\n *\n * The returned definition is inert and can be exported from a project-level\n * `connectors/` module. Use `await sixb.connector(definition)` at runtime to\n * resolve it to a connected client.\n */\nexport function defineConnector<TId extends string, TAdapter extends OAuthConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter>\nexport function defineConnector<TId extends string, TAdapter extends ConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter>\nexport function defineConnector<TId extends string, TAdapter extends AnyConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter> {\n assertNonEmpty(id, \"id\")\n assertNonEmpty(adapter.type, \"type\")\n\n if (typeof adapter.connect !== \"function\") {\n throw new ConnectorError(\"Connector adapter connect must be a function.\")\n }\n\n if (adapter.authentication !== undefined) {\n if (\n !isOAuthConnectorAdapter(adapter) ||\n typeof adapter.authentication.authorizationUrl !== \"function\" ||\n typeof adapter.authentication.exchangeCode !== \"function\" ||\n typeof adapter.authentication.refresh !== \"function\" ||\n typeof adapter.discoverAccounts !== \"function\"\n ) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"OAuth connector adapters must define oauth2 authentication and implement authorizationUrl, exchangeCode, refresh, and discoverAccounts.\"\n )\n }\n
|
|
7
|
+
"import { ConnectorError, createConnectorCodedError } from \"./errors\"\nimport type {\n AnyConnectorAdapter,\n ConnectorAdapter,\n ConnectorDefinition,\n OAuthConnectorAdapter,\n} from \"./types\"\nimport { isOAuthConnectorAdapter } from \"./types\"\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (!value.trim()) {\n throw new ConnectorError(`Connector ${field} must not be empty.`)\n }\n}\n\n/**\n * Define a connector instance for an external system.\n *\n * The returned definition is inert and can be exported from a project-level\n * `connectors/` module. Use `await sixb.connector(definition)` at runtime to\n * resolve it to a connected client.\n */\nexport function defineConnector<TId extends string, TAdapter extends OAuthConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter>\nexport function defineConnector<TId extends string, TAdapter extends ConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter>\nexport function defineConnector<TId extends string, TAdapter extends AnyConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter> {\n assertNonEmpty(id, \"id\")\n assertNonEmpty(adapter.type, \"type\")\n\n if (typeof adapter.connect !== \"function\") {\n throw new ConnectorError(\"Connector adapter connect must be a function.\")\n }\n\n if (adapter.authentication !== undefined) {\n if (\n !isOAuthConnectorAdapter(adapter) ||\n typeof adapter.authentication.authorizationUrl !== \"function\" ||\n typeof adapter.authentication.exchangeCode !== \"function\" ||\n typeof adapter.authentication.refresh !== \"function\" ||\n typeof adapter.discoverAccounts !== \"function\"\n ) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"OAuth connector adapters must define oauth2 authentication and implement authorizationUrl, exchangeCode, refresh, and discoverAccounts.\"\n )\n }\n }\n\n return {\n kind: \"connector\",\n id,\n adapter,\n }\n}\n",
|
|
8
8
|
"import type { BlobStorage } from \"../blob-storage\"\nimport {\n type AnyConnectorAdapter,\n type ConnectorAdapter,\n type ConnectorClient,\n type ConnectorConnectionMetadata,\n type ConnectorDefinition,\n isConnectorDefinition,\n type OAuthConnectorAdapter,\n} from \"../connectors\"\nimport type { DatasetDefinition, DatasetPrimaryKey, MergeChange } from \"../datasets\"\nimport { isDatasetDefinition } from \"../datasets\"\nimport type { Logger } from \"../logging\"\nimport type { ScheduleDefinition, ScheduleReference } from \"../schedules\"\nimport { isScheduleReference } from \"../schedules\"\n\n/** Blob operations available to sync read handlers. */\nexport type SyncBlobContext = Pick<BlobStorage, \"put\" | \"open\" | \"stat\">\n\n/** Non-secret connector connection metadata available to OAuth-backed Sync handlers. */\nexport type SyncConnectorConnection = ConnectorConnectionMetadata\n\ntype SyncConnectionContext<TAdapter extends AnyConnectorAdapter> =\n TAdapter extends OAuthConnectorAdapter\n ? { readonly connection: SyncConnectorConnection }\n : { readonly connection?: undefined }\n\n/** Context passed to a sync read handler. */\nexport type SyncReadContext<\n TCheckpoint = never,\n TAdapter extends AnyConnectorAdapter = ConnectorAdapter,\n> = {\n readonly projectId: string\n readonly syncId: string\n readonly signal: AbortSignal\n readonly blobs: SyncBlobContext\n readonly logger: Logger\n} & ([TCheckpoint] extends [never]\n ? { readonly checkpoint?: undefined }\n : {\n readonly checkpoint?: TCheckpoint\n setCheckpoint(next: TCheckpoint): void\n }) &\n SyncConnectionContext<TAdapter>\n\nexport type SyncMode = \"snapshot\" | \"append\" | \"merge\"\n\ntype MergeSyncChange = MergeChange<\n Readonly<Record<string, unknown>>,\n Readonly<Record<string, unknown>>\n>\n\n/** A sync read handler may return one item, a sync iterable, or an async iterable. */\nexport type SyncReadResult<TMode extends SyncMode = SyncMode> = TMode extends \"merge\"\n ? MergeSyncChange | Iterable<MergeSyncChange> | AsyncIterable<MergeSyncChange>\n : unknown | Iterable<unknown> | AsyncIterable<unknown>\n\n/** User-facing batch sync options accepted by `defineSync(...)`. */\nexport interface BatchSyncConfig<TMode extends SyncMode = SyncMode> {\n readonly mode?: TMode\n}\n\n/** Normalized batch sync config stored on the final sync definition. */\nexport interface BatchSyncDefinitionConfig<TMode extends SyncMode = SyncMode> {\n readonly kind: \"batch\"\n readonly mode: TMode\n}\n\n/** V1 syncs always target a named raw dataset. */\nexport interface DatasetSyncTarget {\n readonly kind: \"dataset\"\n readonly dataset: DatasetDefinition\n}\n\n/**\n * Connector-scoped read handler used by batch sync definitions.\n *\n * This intentionally uses TypeScript's method-parameter bivariance behavior so syncs with\n * different checkpoint types can still be stored as general `SyncDefinition[]` values. The\n * builder still gives users precise `context.checkpoint` and `setCheckpoint(...)` types when\n * they author a sync.\n */\nexport type SyncReadHandler<\n TAdapter extends AnyConnectorAdapter,\n TCheckpoint = never,\n TMode extends SyncMode = SyncMode,\n> = {\n bivarianceHack(\n client: ConnectorClient<TAdapter>,\n context: SyncReadContext<TCheckpoint, TAdapter>\n ): SyncReadResult<TMode> | Promise<SyncReadResult<TMode>>\n}[\"bivarianceHack\"]\n\n/**\n * Inert sync definition registered with Sixb.\n *\n * V1 supports batch syncs only. Definitions are declarative metadata and do not\n * start any background work on their own.\n */\nexport interface SyncDefinition<\n TId extends string = string,\n TConnector extends ConnectorDefinition<string, AnyConnectorAdapter> = ConnectorDefinition<\n string,\n AnyConnectorAdapter\n >,\n TCheckpoint = unknown,\n TMode extends SyncMode = SyncMode,\n> {\n readonly kind: \"sync\"\n readonly id: TId\n readonly config: BatchSyncDefinitionConfig<TMode>\n readonly triggers: readonly ScheduleReference[]\n readonly connector: TConnector\n readonly read: SyncReadHandler<TConnector[\"adapter\"], TCheckpoint, TMode>\n readonly target: DatasetSyncTarget\n}\n\nexport interface SyncTargetBuilder<\n TId extends string = string,\n TConnector extends ConnectorDefinition<string, AnyConnectorAdapter> = ConnectorDefinition<\n string,\n AnyConnectorAdapter\n >,\n TCheckpoint = never,\n TMode extends SyncMode = SyncMode,\n> {\n intoDataset<TDataset extends DatasetDefinition>(\n dataset: TMode extends \"merge\"\n ? TDataset & { readonly primaryKey: DatasetPrimaryKey }\n : TDataset\n ): SyncDefinition<TId, TConnector, TCheckpoint, TMode>\n}\n\nexport interface SyncReadBuilder<\n TId extends string = string,\n TConnector extends ConnectorDefinition<string, AnyConnectorAdapter> = ConnectorDefinition<\n string,\n AnyConnectorAdapter\n >,\n TCheckpoint = never,\n TMode extends SyncMode = SyncMode,\n> {\n read(\n handler: SyncReadHandler<TConnector[\"adapter\"], TCheckpoint, TMode>\n ): SyncTargetBuilder<TId, TConnector, TCheckpoint, TMode>\n}\n\nexport interface SyncBuilder<\n TId extends string = string,\n TCheckpoint = never,\n TMode extends SyncMode = SyncMode,\n> {\n when(schedule: ScheduleDefinition): SyncBuilder<TId, TCheckpoint, TMode>\n checkpoint<TNextCheckpoint>(): SyncBuilder<TId, TNextCheckpoint, TMode>\n from<TConnector extends ConnectorDefinition<string, AnyConnectorAdapter>>(\n connector: TConnector\n ): SyncReadBuilder<TId, TConnector, TCheckpoint, TMode>\n}\n\n/** Runtime type guard for values discovered from `syncs/` modules. */\nexport function isSyncDefinition(value: unknown): value is SyncDefinition {\n if (!isRecord(value)) {\n return false\n }\n\n return (\n value.kind === \"sync\" &&\n typeof value.id === \"string\" &&\n isRecord(value.config) &&\n value.config.kind === \"batch\" &&\n (value.config.mode === \"snapshot\" ||\n value.config.mode === \"append\" ||\n value.config.mode === \"merge\") &&\n Array.isArray(value.triggers) &&\n (value.triggers as unknown[]).every((reference) => isScheduleReference(reference)) &&\n isConnectorDefinition(value.connector) &&\n typeof value.read === \"function\" &&\n isRecord(value.target) &&\n value.target.kind === \"dataset\" &&\n isDatasetDefinition(value.target.dataset)\n )\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": "
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "99DD47F6247AC4A364756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|