@adonis-agora/durable 0.49.1 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +251 -0
- package/README.md +53 -22
- package/dist/assets/spa/assets/index-DupjrK7N.js +16 -0
- package/dist/assets/spa/assets/index-DupjrK7N.js.map +1 -0
- package/dist/assets/spa/index.html +1 -1
- package/dist/commands/durable_worker.d.ts.map +1 -1
- package/dist/commands/durable_worker.js +9 -8
- package/dist/commands/durable_worker.js.map +1 -1
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +1 -0
- package/dist/configure.js.map +1 -1
- package/dist/providers/dashboard_provider.d.ts +2 -0
- package/dist/providers/dashboard_provider.d.ts.map +1 -1
- package/dist/providers/dashboard_provider.js +50 -6
- package/dist/providers/dashboard_provider.js.map +1 -1
- package/dist/providers/durable_provider.d.ts.map +1 -1
- package/dist/providers/durable_provider.js +143 -34
- package/dist/providers/durable_provider.js.map +1 -1
- package/dist/src/admission-redis/redis-admission-backend.d.ts.map +1 -1
- package/dist/src/admission-redis/redis-admission-backend.js +3 -1
- package/dist/src/admission-redis/redis-admission-backend.js.map +1 -1
- package/dist/src/ambient-step.d.ts +24 -0
- package/dist/src/ambient-step.d.ts.map +1 -0
- package/dist/src/ambient-step.js +42 -0
- package/dist/src/ambient-step.js.map +1 -0
- package/dist/src/base-workflow.d.ts +10 -1
- package/dist/src/base-workflow.d.ts.map +1 -1
- package/dist/src/base-workflow.js.map +1 -1
- package/dist/src/codec-state-store.d.ts +28 -2
- package/dist/src/codec-state-store.d.ts.map +1 -1
- package/dist/src/codec-state-store.js +61 -3
- package/dist/src/codec-state-store.js.map +1 -1
- package/dist/src/commands/worker.d.ts +4 -1
- package/dist/src/commands/worker.d.ts.map +1 -1
- package/dist/src/commands/worker.js +27 -3
- package/dist/src/commands/worker.js.map +1 -1
- package/dist/src/config_types.d.ts +6 -0
- package/dist/src/config_types.d.ts.map +1 -1
- package/dist/src/control-plane-redis/redis-control-plane.d.ts.map +1 -1
- package/dist/src/control-plane-redis/redis-control-plane.js +22 -6
- package/dist/src/control-plane-redis/redis-control-plane.js.map +1 -1
- package/dist/src/control-planes/factory.d.ts +6 -0
- package/dist/src/control-planes/factory.d.ts.map +1 -1
- package/dist/src/control-planes/factory.js +1 -0
- package/dist/src/control-planes/factory.js.map +1 -1
- package/dist/src/dashboard/gateway-adapter.d.ts +15 -5
- package/dist/src/dashboard/gateway-adapter.d.ts.map +1 -1
- package/dist/src/dashboard/gateway-adapter.js +71 -7
- package/dist/src/dashboard/gateway-adapter.js.map +1 -1
- package/dist/src/dashboard/handlers.d.ts +53 -1
- package/dist/src/dashboard/handlers.d.ts.map +1 -1
- package/dist/src/dashboard/handlers.js +200 -20
- package/dist/src/dashboard/handlers.js.map +1 -1
- package/dist/src/dashboard/index.d.ts +2 -2
- package/dist/src/dashboard/index.d.ts.map +1 -1
- package/dist/src/dashboard/index.js +2 -2
- package/dist/src/dashboard/index.js.map +1 -1
- package/dist/src/dashboard/openapi.d.ts.map +1 -1
- package/dist/src/dashboard/openapi.js +71 -1
- package/dist/src/dashboard/openapi.js.map +1 -1
- package/dist/src/define_config.d.ts +122 -8
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/diagnostics-bridge.d.ts +16 -3
- package/dist/src/diagnostics-bridge.d.ts.map +1 -1
- package/dist/src/diagnostics-bridge.js +9 -3
- package/dist/src/diagnostics-bridge.js.map +1 -1
- package/dist/src/discovery-roots.d.ts +92 -0
- package/dist/src/discovery-roots.d.ts.map +1 -0
- package/dist/src/discovery-roots.js +150 -0
- package/dist/src/discovery-roots.js.map +1 -0
- package/dist/src/engine.d.ts +418 -20
- package/dist/src/engine.d.ts.map +1 -1
- package/dist/src/engine.js +1523 -159
- package/dist/src/engine.js.map +1 -1
- package/dist/src/entities.d.ts +36 -1
- package/dist/src/entities.d.ts.map +1 -1
- package/dist/src/entities.js +65 -4
- package/dist/src/entities.js.map +1 -1
- package/dist/src/errors.d.ts +36 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +44 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/event-trigger-bridge.d.ts +8 -0
- package/dist/src/event-trigger-bridge.d.ts.map +1 -1
- package/dist/src/event-trigger-bridge.js +24 -3
- package/dist/src/event-trigger-bridge.js.map +1 -1
- package/dist/src/handshake/announced.d.ts +27 -0
- package/dist/src/handshake/announced.d.ts.map +1 -1
- package/dist/src/handshake/announced.js +62 -0
- package/dist/src/handshake/announced.js.map +1 -1
- package/dist/src/handshake/directory.d.ts +92 -0
- package/dist/src/handshake/directory.d.ts.map +1 -0
- package/dist/src/handshake/directory.js +139 -0
- package/dist/src/handshake/directory.js.map +1 -0
- package/dist/src/hooks/barrel-sources.d.ts +28 -0
- package/dist/src/hooks/barrel-sources.d.ts.map +1 -0
- package/dist/src/hooks/barrel-sources.js +92 -0
- package/dist/src/hooks/barrel-sources.js.map +1 -0
- package/dist/src/hooks/steps.d.ts +12 -3
- package/dist/src/hooks/steps.d.ts.map +1 -1
- package/dist/src/hooks/steps.js +7 -11
- package/dist/src/hooks/steps.js.map +1 -1
- package/dist/src/hooks/workflows.d.ts +12 -3
- package/dist/src/hooks/workflows.d.ts.map +1 -1
- package/dist/src/hooks/workflows.js +7 -13
- package/dist/src/hooks/workflows.js.map +1 -1
- package/dist/src/index.d.ts +12 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +12 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/interfaces.d.ts +309 -21
- package/dist/src/interfaces.d.ts.map +1 -1
- package/dist/src/interfaces.js +10 -0
- package/dist/src/interfaces.js.map +1 -1
- package/dist/src/metrics.d.ts.map +1 -1
- package/dist/src/metrics.js +5 -0
- package/dist/src/metrics.js.map +1 -1
- package/dist/src/namespaces.d.ts +17 -0
- package/dist/src/namespaces.d.ts.map +1 -0
- package/dist/src/namespaces.js +24 -0
- package/dist/src/namespaces.js.map +1 -0
- package/dist/src/otel/durable-metrics.d.ts.map +1 -1
- package/dist/src/otel/durable-metrics.js +5 -0
- package/dist/src/otel/durable-metrics.js.map +1 -1
- package/dist/src/otel/durable-otel.d.ts.map +1 -1
- package/dist/src/otel/durable-otel.js +5 -0
- package/dist/src/otel/durable-otel.js.map +1 -1
- package/dist/src/pollers.d.ts +10 -1
- package/dist/src/pollers.d.ts.map +1 -1
- package/dist/src/pollers.js +15 -5
- package/dist/src/pollers.js.map +1 -1
- package/dist/src/protocol.d.ts +12 -0
- package/dist/src/protocol.d.ts.map +1 -1
- package/dist/src/protocol.js +27 -1
- package/dist/src/protocol.js.map +1 -1
- package/dist/src/remote-event.d.ts +6 -0
- package/dist/src/remote-event.d.ts.map +1 -0
- package/dist/src/remote-event.js +19 -0
- package/dist/src/remote-event.js.map +1 -0
- package/dist/src/remote-workflow-executor.d.ts +34 -12
- package/dist/src/remote-workflow-executor.d.ts.map +1 -1
- package/dist/src/remote-workflow-executor.js +42 -40
- package/dist/src/remote-workflow-executor.js.map +1 -1
- package/dist/src/run-detail-summary.d.ts +90 -3
- package/dist/src/run-detail-summary.d.ts.map +1 -1
- package/dist/src/run-detail-summary.js +360 -2
- package/dist/src/run-detail-summary.js.map +1 -1
- package/dist/src/run-facets.d.ts +48 -0
- package/dist/src/run-facets.d.ts.map +1 -0
- package/dist/src/run-facets.js +100 -0
- package/dist/src/run-facets.js.map +1 -0
- package/dist/src/run-gateway/interface.d.ts +27 -1
- package/dist/src/run-gateway/interface.d.ts.map +1 -1
- package/dist/src/run-gateway/proxy-run-gateway.d.ts +32 -4
- package/dist/src/run-gateway/proxy-run-gateway.d.ts.map +1 -1
- package/dist/src/run-gateway/proxy-run-gateway.js +101 -5
- package/dist/src/run-gateway/proxy-run-gateway.js.map +1 -1
- package/dist/src/run-gateway/run-request-responder.d.ts +18 -5
- package/dist/src/run-gateway/run-request-responder.d.ts.map +1 -1
- package/dist/src/run-gateway/run-request-responder.js +155 -32
- package/dist/src/run-gateway/run-request-responder.js.map +1 -1
- package/dist/src/run-gateway/store-run-gateway.d.ts +23 -1
- package/dist/src/run-gateway/store-run-gateway.d.ts.map +1 -1
- package/dist/src/run-gateway/store-run-gateway.js +38 -0
- package/dist/src/run-gateway/store-run-gateway.js.map +1 -1
- package/dist/src/search-attributes-schema.d.ts +44 -0
- package/dist/src/search-attributes-schema.d.ts.map +1 -0
- package/dist/src/search-attributes-schema.js +51 -0
- package/dist/src/search-attributes-schema.js.map +1 -0
- package/dist/src/singleton-admission.d.ts +75 -0
- package/dist/src/singleton-admission.d.ts.map +1 -0
- package/dist/src/singleton-admission.js +156 -0
- package/dist/src/singleton-admission.js.map +1 -0
- package/dist/src/singleton-gate.d.ts +23 -8
- package/dist/src/singleton-gate.d.ts.map +1 -1
- package/dist/src/singleton-gate.js +59 -12
- package/dist/src/singleton-gate.js.map +1 -1
- package/dist/src/standard-schema.d.ts +83 -0
- package/dist/src/standard-schema.d.ts.map +1 -0
- package/dist/src/standard-schema.js +31 -0
- package/dist/src/standard-schema.js.map +1 -0
- package/dist/src/step-discovery.d.ts +21 -11
- package/dist/src/step-discovery.d.ts.map +1 -1
- package/dist/src/step-discovery.js +86 -45
- package/dist/src/step-discovery.js.map +1 -1
- package/dist/src/step-ref.d.ts +38 -12
- package/dist/src/step-ref.d.ts.map +1 -1
- package/dist/src/step-ref.js +5 -13
- package/dist/src/step-ref.js.map +1 -1
- package/dist/src/stores/factory.d.ts +6 -0
- package/dist/src/stores/factory.d.ts.map +1 -1
- package/dist/src/stores/factory.js +4 -1
- package/dist/src/stores/factory.js.map +1 -1
- package/dist/src/stores/lucid-helpers.d.ts +2 -0
- package/dist/src/stores/lucid-helpers.d.ts.map +1 -1
- package/dist/src/stores/lucid-helpers.js +7 -0
- package/dist/src/stores/lucid-helpers.js.map +1 -1
- package/dist/src/stores/lucid-mappers.d.ts +25 -0
- package/dist/src/stores/lucid-mappers.d.ts.map +1 -1
- package/dist/src/stores/lucid-mappers.js +81 -18
- package/dist/src/stores/lucid-mappers.js.map +1 -1
- package/dist/src/stores/lucid-schema.d.ts +59 -1
- package/dist/src/stores/lucid-schema.d.ts.map +1 -1
- package/dist/src/stores/lucid-schema.js +271 -25
- package/dist/src/stores/lucid-schema.js.map +1 -1
- package/dist/src/stores/lucid.d.ts +61 -2
- package/dist/src/stores/lucid.d.ts.map +1 -1
- package/dist/src/stores/lucid.js +346 -41
- package/dist/src/stores/lucid.js.map +1 -1
- package/dist/src/telescope/dashboard.d.ts.map +1 -1
- package/dist/src/telescope/dashboard.js +30 -1
- package/dist/src/telescope/dashboard.js.map +1 -1
- package/dist/src/telescope/data-providers.d.ts +19 -1
- package/dist/src/telescope/data-providers.d.ts.map +1 -1
- package/dist/src/telescope/data-providers.js +119 -3
- package/dist/src/telescope/data-providers.js.map +1 -1
- package/dist/src/telescope/extension.d.ts.map +1 -1
- package/dist/src/telescope/extension.js +2 -1
- package/dist/src/telescope/extension.js.map +1 -1
- package/dist/src/telescope/index.d.ts +1 -1
- package/dist/src/telescope/index.d.ts.map +1 -1
- package/dist/src/telescope/index.js +1 -1
- package/dist/src/telescope/index.js.map +1 -1
- package/dist/src/testing/in-memory-state-store.d.ts +44 -15
- package/dist/src/testing/in-memory-state-store.d.ts.map +1 -1
- package/dist/src/testing/in-memory-state-store.js +204 -41
- package/dist/src/testing/in-memory-state-store.js.map +1 -1
- package/dist/src/testing-kit/checkpoint-aggregation-contract.d.ts +16 -0
- package/dist/src/testing-kit/checkpoint-aggregation-contract.d.ts.map +1 -0
- package/dist/src/testing-kit/checkpoint-aggregation-contract.js +228 -0
- package/dist/src/testing-kit/checkpoint-aggregation-contract.js.map +1 -0
- package/dist/src/testing-kit/state-store-conformance.d.ts.map +1 -1
- package/dist/src/testing-kit/state-store-conformance.js +355 -3
- package/dist/src/testing-kit/state-store-conformance.js.map +1 -1
- package/dist/src/transport-pool.d.ts +15 -1
- package/dist/src/transport-pool.d.ts.map +1 -1
- package/dist/src/transport-pool.js +50 -4
- package/dist/src/transport-pool.js.map +1 -1
- package/dist/src/transports/adaptive-concurrency.d.ts +168 -0
- package/dist/src/transports/adaptive-concurrency.d.ts.map +1 -0
- package/dist/src/transports/adaptive-concurrency.js +353 -0
- package/dist/src/transports/adaptive-concurrency.js.map +1 -0
- package/dist/src/transports/bullmq/adaptive-concurrency.d.ts +1 -165
- package/dist/src/transports/bullmq/adaptive-concurrency.d.ts.map +1 -1
- package/dist/src/transports/bullmq/adaptive-concurrency.js +3 -351
- package/dist/src/transports/bullmq/adaptive-concurrency.js.map +1 -1
- package/dist/src/transports/bullmq/bullmq-transport.d.ts +49 -1
- package/dist/src/transports/bullmq/bullmq-transport.d.ts.map +1 -1
- package/dist/src/transports/bullmq/bullmq-transport.js +330 -38
- package/dist/src/transports/bullmq/bullmq-transport.js.map +1 -1
- package/dist/src/transports/bullmq/deps.d.ts +18 -2
- package/dist/src/transports/bullmq/deps.d.ts.map +1 -1
- package/dist/src/transports/bullmq/deps.js +44 -2
- package/dist/src/transports/bullmq/deps.js.map +1 -1
- package/dist/src/transports/db-helpers.d.ts +39 -0
- package/dist/src/transports/db-helpers.d.ts.map +1 -1
- package/dist/src/transports/db-helpers.js +73 -0
- package/dist/src/transports/db-helpers.js.map +1 -1
- package/dist/src/transports/db-remote.d.ts +53 -0
- package/dist/src/transports/db-remote.d.ts.map +1 -0
- package/dist/src/transports/db-remote.js +147 -0
- package/dist/src/transports/db-remote.js.map +1 -0
- package/dist/src/transports/db-schema.d.ts +44 -1
- package/dist/src/transports/db-schema.d.ts.map +1 -1
- package/dist/src/transports/db-schema.js +227 -88
- package/dist/src/transports/db-schema.js.map +1 -1
- package/dist/src/transports/db.d.ts +189 -6
- package/dist/src/transports/db.d.ts.map +1 -1
- package/dist/src/transports/db.js +1291 -137
- package/dist/src/transports/db.js.map +1 -1
- package/dist/src/transports/event-emitter.d.ts +8 -0
- package/dist/src/transports/event-emitter.d.ts.map +1 -1
- package/dist/src/transports/event-emitter.js +36 -3
- package/dist/src/transports/event-emitter.js.map +1 -1
- package/dist/src/transports/factory.d.ts +110 -5
- package/dist/src/transports/factory.d.ts.map +1 -1
- package/dist/src/transports/factory.js +56 -9
- package/dist/src/transports/factory.js.map +1 -1
- package/dist/src/transports/queue-mock-adapter.d.ts +7 -2
- package/dist/src/transports/queue-mock-adapter.d.ts.map +1 -1
- package/dist/src/transports/queue-mock-adapter.js +18 -2
- package/dist/src/transports/queue-mock-adapter.js.map +1 -1
- package/dist/src/transports/queue-remote.d.ts +146 -0
- package/dist/src/transports/queue-remote.d.ts.map +1 -0
- package/dist/src/transports/queue-remote.js +398 -0
- package/dist/src/transports/queue-remote.js.map +1 -0
- package/dist/src/transports/queue.d.ts +159 -6
- package/dist/src/transports/queue.d.ts.map +1 -1
- package/dist/src/transports/queue.js +747 -37
- package/dist/src/transports/queue.js.map +1 -1
- package/dist/src/transports/task-failure.d.ts +31 -0
- package/dist/src/transports/task-failure.d.ts.map +1 -0
- package/dist/src/transports/task-failure.js +50 -0
- package/dist/src/transports/task-failure.js.map +1 -0
- package/dist/src/workflow-als.d.ts +1 -1
- package/dist/src/workflow-als.d.ts.map +1 -1
- package/dist/src/workflow-ctx.d.ts +10 -0
- package/dist/src/workflow-ctx.d.ts.map +1 -1
- package/dist/src/workflow-ctx.js +97 -15
- package/dist/src/workflow-ctx.js.map +1 -1
- package/dist/src/workflow-discovery.d.ts +32 -41
- package/dist/src/workflow-discovery.d.ts.map +1 -1
- package/dist/src/workflow-discovery.js +65 -88
- package/dist/src/workflow-discovery.js.map +1 -1
- package/dist/src/workflow-ref.d.ts +24 -0
- package/dist/src/workflow-ref.d.ts.map +1 -1
- package/dist/src/workflow-ref.js.map +1 -1
- package/dist/stubs/config/durable.stub +6 -0
- package/dist/stubs/config/durable_dashboard.stub +7 -3
- package/dist/stubs/database/migrations/create_durable_tables.stub +2 -1
- package/dist/stubs/database/migrations/create_durable_transport_messages.stub +43 -0
- package/dist/stubs/database/migrations/create_durable_transport_tables.stub +12 -9
- package/dist/stubs/database/migrations/create_durable_transport_worker_keys.stub +1 -1
- package/dist/stubs/make/workflow/main.stub +1 -1
- package/package.json +6 -4
- package/skills/durable-cluster/SKILL.md +80 -11
- package/skills/durable-determinism/SKILL.md +11 -5
- package/skills/durable-reliability/SKILL.md +77 -37
- package/skills/durable-setup/SKILL.md +51 -22
- package/skills/durable-transports-stores/SKILL.md +128 -18
- package/skills/durable-workflows/SKILL.md +71 -18
- package/dist/assets/spa/assets/index-DdB9zxuX.js +0 -16
- package/dist/assets/spa/assets/index-DdB9zxuX.js.map +0 -1
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
import { widenMysqlLongtextColumns } from '../stores/lucid-schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create `name` unless it exists. Every instance runs this on first use, so two of them starting
|
|
4
|
+
* together race the same CREATE: the loser's statement fails although the table is there — which is
|
|
5
|
+
* success. Only an error that leaves the table missing is rethrown.
|
|
6
|
+
*/
|
|
7
|
+
async function createTableIfMissing(db, name, build) {
|
|
8
|
+
const schema = () => db.connection().schema;
|
|
9
|
+
if (await schema().hasTable(name))
|
|
10
|
+
return;
|
|
11
|
+
try {
|
|
12
|
+
await schema().createTable(name, build);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
if (!(await schema().hasTable(name)))
|
|
16
|
+
throw err;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
1
19
|
/**
|
|
2
20
|
* The DB transport's table names. Distinct from the durable *store* tables (`durable_workflow_runs`
|
|
3
21
|
* etc.) — these carry the point-to-point work channels (tasks / results / heartbeats / control), so
|
|
@@ -8,6 +26,21 @@ export const TRANSPORT_TABLES = {
|
|
|
8
26
|
results: 'durable_transport_results',
|
|
9
27
|
heartbeats: 'durable_transport_heartbeats',
|
|
10
28
|
control: 'durable_transport_control',
|
|
29
|
+
/** Remote-workflow decisions and step events, and the store-less (tenant pod) protocol's start-run,
|
|
30
|
+
* run-request, run-reply and tenant-event rows — one table told apart by `kind`. */
|
|
31
|
+
messages: 'durable_transport_messages',
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* The `kind`s of a {@link TRANSPORT_TABLES.messages} row. `recipient` is `''` for a row any consumer
|
|
35
|
+
* of the kind may claim, or the instance id of the one consumer it is addressed to.
|
|
36
|
+
*/
|
|
37
|
+
export const MESSAGE_KINDS = {
|
|
38
|
+
decision: 'decision',
|
|
39
|
+
stepEvent: 'stepEvent',
|
|
40
|
+
startRun: 'startRun',
|
|
41
|
+
runRequest: 'runRequest',
|
|
42
|
+
runReply: 'runReply',
|
|
43
|
+
tenantEvent: 'tenantEvent',
|
|
11
44
|
};
|
|
12
45
|
/**
|
|
13
46
|
* The worker advertisement keys (design §7.2) — the descriptor and heartbeat keys a worker runtime
|
|
@@ -21,18 +54,39 @@ export const WORKER_KEYS_TABLE = 'durable_transport_worker_keys';
|
|
|
21
54
|
* the db transport's other tables.
|
|
22
55
|
*/
|
|
23
56
|
export async function createWorkerKeysTable(db) {
|
|
24
|
-
|
|
25
|
-
|
|
57
|
+
await createTableIfMissing(db, WORKER_KEYS_TABLE, buildWorkerKeysTable);
|
|
58
|
+
await widenPayloadColumns(db, [WORKER_KEYS_TABLE]);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The columns that hold free-form JSON payloads (a step's input/output/error/events, the control and
|
|
62
|
+
* message payloads, a worker key's value). They are `longtext` on MySQL, where `text` stops at 64KB
|
|
63
|
+
* and a bigger step input or output fails to write (strict mode) or is cut off; an existing `text`
|
|
64
|
+
* one is widened in place on boot. Postgres and SQLite `text` has no limit and is unchanged.
|
|
65
|
+
* `notNull` lists the `NOT NULL` ones, which a MySQL `MODIFY` must restate.
|
|
66
|
+
*/
|
|
67
|
+
export const TRANSPORT_JSON_COLUMNS = {
|
|
68
|
+
durable_transport_tasks: { columns: ['input', 'context'] },
|
|
69
|
+
durable_transport_results: { columns: ['output', 'error', 'events'] },
|
|
70
|
+
durable_transport_control: { columns: ['payload'], notNull: ['payload'] },
|
|
71
|
+
durable_transport_messages: { columns: ['payload'], notNull: ['payload'] },
|
|
72
|
+
durable_transport_worker_keys: { columns: ['value'], notNull: ['value'] },
|
|
73
|
+
};
|
|
74
|
+
/** MySQL only: widen the {@link TRANSPORT_JSON_COLUMNS} of `tables` that are still `text`. */
|
|
75
|
+
async function widenPayloadColumns(db, tables) {
|
|
76
|
+
const client = db.connection();
|
|
77
|
+
if (client.dialect.name !== 'mysql')
|
|
26
78
|
return;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
79
|
+
const spec = Object.fromEntries(tables.flatMap((t) => (TRANSPORT_JSON_COLUMNS[t] ? [[t, TRANSPORT_JSON_COLUMNS[t]]] : [])));
|
|
80
|
+
await widenMysqlLongtextColumns(client, spec);
|
|
81
|
+
}
|
|
82
|
+
function buildWorkerKeysTable(table) {
|
|
83
|
+
table.string('key', 512).primary();
|
|
84
|
+
table.text('value', 'longtext').notNullable();
|
|
85
|
+
table.bigInteger('expires_at').notNullable();
|
|
86
|
+
table.index(['expires_at'], 'durable_transport_worker_keys_expires_idx');
|
|
33
87
|
}
|
|
34
88
|
/**
|
|
35
|
-
* Idempotent DDL for the
|
|
89
|
+
* Idempotent DDL for the transport tables, via Lucid's schema builder (Knex). Portable across
|
|
36
90
|
* SQLite / Postgres / MySQL: JSON payloads (`input`/`output`/`error`/`payload`) are stored as TEXT
|
|
37
91
|
* and (de)serialized by the transport, and every timestamp is an epoch-ms `bigInteger`, so there's
|
|
38
92
|
* no dependency on a dialect's native JSON/date type.
|
|
@@ -44,96 +98,181 @@ export async function createWorkerKeysTable(db) {
|
|
|
44
98
|
* (`node ace configure @adonis-agora/durable`); this helper is for standalone use and tests.
|
|
45
99
|
*/
|
|
46
100
|
export async function createDurableTransportTables(db) {
|
|
47
|
-
// Knex's schema builder is stateful —
|
|
48
|
-
// so each DDL statement executes exactly once.
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
table.string('name').notNullable();
|
|
57
|
-
table.string('grp').notNullable();
|
|
58
|
-
table.string('namespace').notNullable().defaultTo('default');
|
|
59
|
-
table.text('input');
|
|
60
|
-
table.string('traceparent');
|
|
61
|
-
table.text('context');
|
|
62
|
-
table.string('transport');
|
|
63
|
-
table.integer('attempt').notNullable();
|
|
64
|
-
table.string('claimed_by');
|
|
65
|
-
table.bigInteger('claimed_at');
|
|
66
|
-
table.bigInteger('created_at').notNullable();
|
|
67
|
-
table.index(['namespace', 'grp', 'claimed_at', 'created_at'], 'durable_transport_tasks_grp_idx');
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
// ── results: worker → engine (a StepResult) ────────────────────────────────
|
|
71
|
-
if (!(await conn().hasTable(TRANSPORT_TABLES.results))) {
|
|
72
|
-
await conn().createTable(TRANSPORT_TABLES.results, (table) => {
|
|
73
|
-
table.string('step_id').primary();
|
|
74
|
-
table.string('run_id').notNullable();
|
|
75
|
-
table.integer('seq').notNullable();
|
|
76
|
-
table.string('status').notNullable();
|
|
77
|
-
table.string('namespace').notNullable().defaultTo('default');
|
|
78
|
-
table.text('output');
|
|
79
|
-
table.text('error');
|
|
80
|
-
table.bigInteger('started_at');
|
|
81
|
-
table.text('events');
|
|
82
|
-
table.string('claimed_by');
|
|
83
|
-
table.bigInteger('claimed_at');
|
|
84
|
-
table.bigInteger('created_at').notNullable();
|
|
85
|
-
table.index(['namespace', 'claimed_at', 'created_at'], 'durable_transport_results_idx');
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
// ── heartbeats: worker → engine (liveness for a long step) ─────────────────
|
|
89
|
-
if (!(await conn().hasTable(TRANSPORT_TABLES.heartbeats))) {
|
|
90
|
-
await conn().createTable(TRANSPORT_TABLES.heartbeats, (table) => {
|
|
91
|
-
table.increments('id').primary();
|
|
92
|
-
table.string('run_id').notNullable();
|
|
93
|
-
table.integer('seq').notNullable();
|
|
94
|
-
table.string('step_id').notNullable();
|
|
95
|
-
table.string('grp').notNullable();
|
|
96
|
-
table.string('namespace').notNullable().defaultTo('default');
|
|
97
|
-
table.string('claimed_by');
|
|
98
|
-
table.bigInteger('claimed_at');
|
|
99
|
-
table.bigInteger('created_at').notNullable();
|
|
100
|
-
table.index(['namespace', 'claimed_at', 'created_at'], 'durable_transport_heartbeats_idx');
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
// ── control: best-effort control-plane messages (single-consumer) ──────────
|
|
104
|
-
if (!(await conn().hasTable(TRANSPORT_TABLES.control))) {
|
|
105
|
-
await conn().createTable(TRANSPORT_TABLES.control, (table) => {
|
|
106
|
-
table.increments('id').primary();
|
|
107
|
-
table.text('payload').notNullable();
|
|
108
|
-
table.string('namespace').notNullable().defaultTo('default');
|
|
109
|
-
table.string('claimed_by');
|
|
110
|
-
table.bigInteger('claimed_at');
|
|
111
|
-
table.bigInteger('created_at').notNullable();
|
|
112
|
-
table.index(['namespace', 'claimed_at', 'created_at'], 'durable_transport_control_idx');
|
|
113
|
-
});
|
|
101
|
+
// Knex's schema builder is stateful — createTableIfMissing takes a FRESH `db.connection().schema`
|
|
102
|
+
// per hasTable/createTable so each DDL statement executes exactly once.
|
|
103
|
+
for (const table of [
|
|
104
|
+
TRANSPORT_TABLES.tasks,
|
|
105
|
+
TRANSPORT_TABLES.results,
|
|
106
|
+
TRANSPORT_TABLES.heartbeats,
|
|
107
|
+
TRANSPORT_TABLES.control,
|
|
108
|
+
]) {
|
|
109
|
+
await createTableIfMissing(db, table, TRANSPORT_TABLE_DEFS[table]);
|
|
114
110
|
}
|
|
111
|
+
await createMessagesTable(db);
|
|
115
112
|
await createWorkerKeysTable(db);
|
|
116
|
-
// Upgrade path: a deployment created
|
|
117
|
-
//
|
|
118
|
-
// `
|
|
119
|
-
//
|
|
120
|
-
await
|
|
113
|
+
// Upgrade path: a deployment created by an older version already has these tables (so the guards
|
|
114
|
+
// above skipped them) but lacks the columns added since. Back-fill them — idempotent via
|
|
115
|
+
// `hasColumn`, and every added column is `notNullable` with a default, so legacy in-flight rows
|
|
116
|
+
// read exactly as they did before.
|
|
117
|
+
await ensureAddedColumns(db);
|
|
118
|
+
// MySQL: a table created while the payload columns were `text` gets them widened to `longtext`.
|
|
119
|
+
await widenPayloadColumns(db, Object.keys(TRANSPORT_JSON_COLUMNS));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Idempotent DDL for the messages table: one-shot rows like the other channels (claimed by one
|
|
123
|
+
* consumer, deleted once handled), told apart by `kind` and addressed by `recipient` — `''` for any
|
|
124
|
+
* consumer of the kind, else the instance id of the one it is for (a run reply, a tenant event, a
|
|
125
|
+
* decision for the engine that dispatched the turn). `reply_to` carries a request's requester.
|
|
126
|
+
*/
|
|
127
|
+
export async function createMessagesTable(db) {
|
|
128
|
+
await createTableIfMissing(db, TRANSPORT_TABLES.messages, buildMessagesTable);
|
|
129
|
+
}
|
|
130
|
+
function buildMessagesTable(table) {
|
|
131
|
+
table.increments('id').primary();
|
|
132
|
+
table.string('kind', 32).notNullable();
|
|
133
|
+
table.string('namespace').notNullable().defaultTo('default');
|
|
134
|
+
table.string('recipient').notNullable().defaultTo('');
|
|
135
|
+
table.string('reply_to');
|
|
136
|
+
table.text('payload', 'longtext').notNullable();
|
|
137
|
+
table.string('claimed_by');
|
|
138
|
+
table.bigInteger('claimed_at');
|
|
139
|
+
table.bigInteger('created_at').notNullable();
|
|
140
|
+
table.index(['namespace', 'kind', 'recipient', 'claimed_at', 'id'], 'durable_transport_messages_idx');
|
|
121
141
|
}
|
|
122
|
-
/**
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
142
|
+
/**
|
|
143
|
+
* Columns added to the transport tables after their first release, with the default that makes a
|
|
144
|
+
* legacy row behave as before:
|
|
145
|
+
*
|
|
146
|
+
* - `namespace` on every channel table, `'default'` — a default engine's `WHERE namespace='default'`
|
|
147
|
+
* claims exactly the rows it did before namespaces existed.
|
|
148
|
+
* - `reclaims` on the tasks table, `0` — the count of lapsed claims taken over (the poison-task
|
|
149
|
+
* bound, see `DbTransportOptions.maxStalledCount`); a legacy row starts uncounted.
|
|
150
|
+
* - `priority` on the tasks table, `0` — the dispatch priority rows are claimed by (higher first);
|
|
151
|
+
* a legacy row is "normal", like a dispatch without a priority.
|
|
152
|
+
* - `kind` on the tasks table, `'step'` — what a row carries: a step, or a remote workflow turn; a
|
|
153
|
+
* legacy row is a step, the only kind there was.
|
|
154
|
+
*/
|
|
155
|
+
async function ensureAddedColumns(db) {
|
|
156
|
+
const added = [
|
|
157
|
+
...Object.values(TRANSPORT_TABLES).map((table) => ({
|
|
158
|
+
table,
|
|
159
|
+
column: 'namespace',
|
|
160
|
+
add: (t) => {
|
|
128
161
|
t.string('namespace').notNullable().defaultTo('default');
|
|
129
|
-
}
|
|
162
|
+
},
|
|
163
|
+
})),
|
|
164
|
+
{
|
|
165
|
+
table: TRANSPORT_TABLES.tasks,
|
|
166
|
+
column: 'reclaims',
|
|
167
|
+
add: (t) => {
|
|
168
|
+
t.integer('reclaims').notNullable().defaultTo(0);
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
table: TRANSPORT_TABLES.tasks,
|
|
173
|
+
column: 'priority',
|
|
174
|
+
add: (t) => {
|
|
175
|
+
t.integer('priority').notNullable().defaultTo(0);
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
table: TRANSPORT_TABLES.tasks,
|
|
180
|
+
column: 'kind',
|
|
181
|
+
add: (t) => {
|
|
182
|
+
t.string('kind', 16).notNullable().defaultTo('step');
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
];
|
|
186
|
+
for (const { table, column, add } of added) {
|
|
187
|
+
if (await db.connection().schema.hasColumn(table, column))
|
|
188
|
+
continue;
|
|
189
|
+
try {
|
|
190
|
+
await db.connection().schema.alterTable(table, add);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
// Another instance added it first (the same race as createTableIfMissing).
|
|
194
|
+
if (!(await db.connection().schema.hasColumn(table, column)))
|
|
195
|
+
throw err;
|
|
130
196
|
}
|
|
131
197
|
}
|
|
132
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* The CREATE TABLE body of every transport table (Knex schema builder), shared by
|
|
201
|
+
* {@link createDurableTransportTables} and the dialect tests. Payload columns are `longtext`, which
|
|
202
|
+
* Knex emits on MySQL only (Postgres and SQLite get `text`). See {@link TRANSPORT_JSON_COLUMNS}.
|
|
203
|
+
*/
|
|
204
|
+
export const TRANSPORT_TABLE_DEFS = {
|
|
205
|
+
// ── tasks: engine → worker (a RemoteTask) ──────────────────────────────────
|
|
206
|
+
[TRANSPORT_TABLES.tasks]: (table) => {
|
|
207
|
+
table.string('step_id').primary();
|
|
208
|
+
table.string('run_id').notNullable();
|
|
209
|
+
table.integer('seq').notNullable();
|
|
210
|
+
table.string('name').notNullable();
|
|
211
|
+
table.string('grp').notNullable();
|
|
212
|
+
table.string('namespace').notNullable().defaultTo('default');
|
|
213
|
+
table.text('input', 'longtext');
|
|
214
|
+
table.string('traceparent');
|
|
215
|
+
table.text('context', 'longtext');
|
|
216
|
+
table.string('transport');
|
|
217
|
+
table.integer('attempt').notNullable();
|
|
218
|
+
// How many times a lapsed claim on this row was taken over — the poison-task bound.
|
|
219
|
+
table.integer('reclaims').notNullable().defaultTo(0);
|
|
220
|
+
// Dispatch priority, higher first (the engine's convention); absent = 0, "normal".
|
|
221
|
+
table.integer('priority').notNullable().defaultTo(0);
|
|
222
|
+
// `step` (a RemoteTask) or `workflow` (a remote workflow turn: a WorkflowTask in `input`).
|
|
223
|
+
table.string('kind', 16).notNullable().defaultTo('step');
|
|
224
|
+
table.string('claimed_by');
|
|
225
|
+
table.bigInteger('claimed_at');
|
|
226
|
+
table.bigInteger('created_at').notNullable();
|
|
227
|
+
table.index(['namespace', 'grp', 'claimed_at', 'created_at'], 'durable_transport_tasks_grp_idx');
|
|
228
|
+
},
|
|
229
|
+
// ── results: worker → engine (a StepResult) ────────────────────────────────
|
|
230
|
+
[TRANSPORT_TABLES.results]: (table) => {
|
|
231
|
+
table.string('step_id').primary();
|
|
232
|
+
table.string('run_id').notNullable();
|
|
233
|
+
table.integer('seq').notNullable();
|
|
234
|
+
table.string('status').notNullable();
|
|
235
|
+
table.string('namespace').notNullable().defaultTo('default');
|
|
236
|
+
table.text('output', 'longtext');
|
|
237
|
+
table.text('error', 'longtext');
|
|
238
|
+
table.bigInteger('started_at');
|
|
239
|
+
table.text('events', 'longtext');
|
|
240
|
+
table.string('claimed_by');
|
|
241
|
+
table.bigInteger('claimed_at');
|
|
242
|
+
table.bigInteger('created_at').notNullable();
|
|
243
|
+
table.index(['namespace', 'claimed_at', 'created_at'], 'durable_transport_results_idx');
|
|
244
|
+
},
|
|
245
|
+
// ── heartbeats: worker → engine (liveness for a long step) ─────────────────
|
|
246
|
+
[TRANSPORT_TABLES.heartbeats]: (table) => {
|
|
247
|
+
table.increments('id').primary();
|
|
248
|
+
table.string('run_id').notNullable();
|
|
249
|
+
table.integer('seq').notNullable();
|
|
250
|
+
table.string('step_id').notNullable();
|
|
251
|
+
table.string('grp').notNullable();
|
|
252
|
+
table.string('namespace').notNullable().defaultTo('default');
|
|
253
|
+
table.string('claimed_by');
|
|
254
|
+
table.bigInteger('claimed_at');
|
|
255
|
+
table.bigInteger('created_at').notNullable();
|
|
256
|
+
table.index(['namespace', 'claimed_at', 'created_at'], 'durable_transport_heartbeats_idx');
|
|
257
|
+
},
|
|
258
|
+
// ── control: best-effort control-plane messages (single-consumer) ──────────
|
|
259
|
+
[TRANSPORT_TABLES.control]: (table) => {
|
|
260
|
+
table.increments('id').primary();
|
|
261
|
+
table.text('payload', 'longtext').notNullable();
|
|
262
|
+
table.string('namespace').notNullable().defaultTo('default');
|
|
263
|
+
table.string('claimed_by');
|
|
264
|
+
table.bigInteger('claimed_at');
|
|
265
|
+
table.bigInteger('created_at').notNullable();
|
|
266
|
+
table.index(['namespace', 'claimed_at', 'created_at'], 'durable_transport_control_idx');
|
|
267
|
+
},
|
|
268
|
+
[TRANSPORT_TABLES.messages]: buildMessagesTable,
|
|
269
|
+
[WORKER_KEYS_TABLE]: buildWorkerKeysTable,
|
|
270
|
+
};
|
|
133
271
|
/** Drop every transport table. Used by tests and the migration `down`. */
|
|
134
272
|
export async function dropDurableTransportTables(db) {
|
|
135
273
|
const conn = () => db.connection().schema;
|
|
136
274
|
await conn().dropTableIfExists(WORKER_KEYS_TABLE);
|
|
275
|
+
await conn().dropTableIfExists(TRANSPORT_TABLES.messages);
|
|
137
276
|
await conn().dropTableIfExists(TRANSPORT_TABLES.control);
|
|
138
277
|
await conn().dropTableIfExists(TRANSPORT_TABLES.heartbeats);
|
|
139
278
|
await conn().dropTableIfExists(TRANSPORT_TABLES.results);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-schema.js","sourceRoot":"","sources":["../../../src/transports/db-schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db-schema.js","sourceRoot":"","sources":["../../../src/transports/db-schema.ts"],"names":[],"mappings":"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"}
|