@qlever-llc/trellis 0.10.22 → 0.11.0-rc.1
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/esm/auth/mod.d.ts +1 -1
- package/esm/auth/mod.d.ts.map +1 -1
- package/esm/auth/mod.js +1 -1
- package/esm/auth/protocol.d.ts +55 -0
- package/esm/auth/protocol.d.ts.map +1 -1
- package/esm/browser.d.ts +3 -3
- package/esm/browser.d.ts.map +1 -1
- package/esm/browser.js +1 -1
- package/esm/client_connect.d.ts +12 -3
- package/esm/client_connect.d.ts.map +1 -1
- package/esm/client_connect.js +112 -7
- package/esm/codec.d.ts +7 -6
- package/esm/codec.d.ts.map +1 -1
- package/esm/codec.js +125 -6
- package/esm/contract_support/canonical.d.ts +3 -0
- package/esm/contract_support/canonical.d.ts.map +1 -1
- package/esm/contract_support/canonical.js +3 -0
- package/esm/contract_support/mod.d.ts +125 -10
- package/esm/contract_support/mod.d.ts.map +1 -1
- package/esm/contract_support/mod.js +159 -5
- package/esm/contract_support/protocol.d.ts +92 -7
- package/esm/contract_support/protocol.d.ts.map +1 -1
- package/esm/contract_support/protocol.js +41 -7
- package/esm/contract_support/runtime.d.ts +4 -1
- package/esm/contract_support/runtime.d.ts.map +1 -1
- package/esm/errors/SchemaValidationError.d.ts +49 -0
- package/esm/errors/SchemaValidationError.d.ts.map +1 -0
- package/esm/errors/SchemaValidationError.js +67 -0
- package/esm/errors/index.d.ts +38 -9
- package/esm/errors/index.d.ts.map +1 -1
- package/esm/errors/index.js +16 -0
- package/esm/generated-sdk/auth/api.d.ts +33 -605
- package/esm/generated-sdk/auth/api.d.ts.map +1 -1
- package/esm/generated-sdk/auth/api.js +6 -1
- package/esm/generated-sdk/auth/client.d.ts +129 -134
- package/esm/generated-sdk/auth/client.d.ts.map +1 -1
- package/esm/generated-sdk/auth/contract.d.ts +2 -601
- package/esm/generated-sdk/auth/contract.d.ts.map +1 -1
- package/esm/generated-sdk/auth/contract.js +310 -93
- package/esm/generated-sdk/auth/mod.d.ts +1 -1
- package/esm/generated-sdk/auth/mod.d.ts.map +1 -1
- package/esm/generated-sdk/auth/owned_api.d.ts +88 -86
- package/esm/generated-sdk/auth/owned_api.d.ts.map +1 -1
- package/esm/generated-sdk/auth/owned_api.js +6 -0
- package/esm/generated-sdk/auth/schemas.d.ts +284 -136
- package/esm/generated-sdk/auth/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/auth/schemas.js +231 -92
- package/esm/generated-sdk/auth/types.d.ts +565 -89
- package/esm/generated-sdk/auth/types.d.ts.map +1 -1
- package/esm/generated-sdk/auth/types.js +1 -1
- package/esm/generated-sdk/health/api.d.ts +29 -18
- package/esm/generated-sdk/health/api.d.ts.map +1 -1
- package/esm/generated-sdk/health/client.d.ts +7 -21
- package/esm/generated-sdk/health/client.d.ts.map +1 -1
- package/esm/generated-sdk/health/contract.d.ts +2 -15
- package/esm/generated-sdk/health/contract.d.ts.map +1 -1
- package/esm/generated-sdk/health/contract.js +2 -10
- package/esm/generated-sdk/health/mod.d.ts +1 -1
- package/esm/generated-sdk/health/mod.d.ts.map +1 -1
- package/esm/generated-sdk/health/owned_api.d.ts +2 -2
- package/esm/generated-sdk/health/schemas.d.ts +1 -14
- package/esm/generated-sdk/health/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/health/schemas.js +1 -9
- package/esm/generated-sdk/health/types.d.ts +10 -5
- package/esm/generated-sdk/health/types.d.ts.map +1 -1
- package/esm/generated-sdk/health/types.js +1 -2
- package/esm/generated-sdk/jobs/api.d.ts +29 -109
- package/esm/generated-sdk/jobs/api.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/client.d.ts +21 -33
- package/esm/generated-sdk/jobs/client.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/contract.d.ts +2 -106
- package/esm/generated-sdk/jobs/contract.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/contract.js +268 -1
- package/esm/generated-sdk/jobs/mod.d.ts +1 -1
- package/esm/generated-sdk/jobs/mod.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/owned_api.d.ts +22 -9
- package/esm/generated-sdk/jobs/owned_api.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/owned_api.js +20 -1
- package/esm/generated-sdk/jobs/schemas.d.ts +437 -0
- package/esm/generated-sdk/jobs/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/schemas.js +211 -0
- package/esm/generated-sdk/jobs/types.d.ts +195 -12
- package/esm/generated-sdk/jobs/types.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/types.js +1 -1
- package/esm/generated-sdk/state/api.d.ts +29 -68
- package/esm/generated-sdk/state/api.d.ts.map +1 -1
- package/esm/generated-sdk/state/client.d.ts +17 -31
- package/esm/generated-sdk/state/client.d.ts.map +1 -1
- package/esm/generated-sdk/state/contract.d.ts +1 -64
- package/esm/generated-sdk/state/contract.d.ts.map +1 -1
- package/esm/generated-sdk/state/mod.d.ts +1 -1
- package/esm/generated-sdk/state/mod.d.ts.map +1 -1
- package/esm/generated-sdk/state/owned_api.d.ts +7 -7
- package/esm/generated-sdk/state/types.d.ts +52 -9
- package/esm/generated-sdk/state/types.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/api.d.ts +33 -45
- package/esm/generated-sdk/trellis-core/api.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/api.js +6 -1
- package/esm/generated-sdk/trellis-core/client.d.ts +31 -20
- package/esm/generated-sdk/trellis-core/client.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/contract.d.ts +2 -41
- package/esm/generated-sdk/trellis-core/contract.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/contract.js +91 -1
- package/esm/generated-sdk/trellis-core/mod.d.ts +1 -1
- package/esm/generated-sdk/trellis-core/mod.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/owned_api.d.ts +4 -4
- package/esm/generated-sdk/trellis-core/schemas.d.ts +113 -0
- package/esm/generated-sdk/trellis-core/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/schemas.js +81 -0
- package/esm/generated-sdk/trellis-core/types.d.ts +54 -7
- package/esm/generated-sdk/trellis-core/types.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/types.js +1 -1
- package/esm/health.d.ts +1 -1
- package/esm/health.d.ts.map +1 -1
- package/esm/health.js +1 -1
- package/esm/index.d.ts +4 -4
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +2 -2
- package/esm/jobs.d.ts +69 -3
- package/esm/jobs.d.ts.map +1 -1
- package/esm/jobs.js +92 -3
- package/esm/server/health.d.ts +2 -6
- package/esm/server/health.d.ts.map +1 -1
- package/esm/server/health_schemas.d.ts +0 -8
- package/esm/server/health_schemas.d.ts.map +1 -1
- package/esm/server/health_schemas.js +0 -5
- package/esm/server/internal_jobs/bindings.d.ts +11 -0
- package/esm/server/internal_jobs/bindings.d.ts.map +1 -1
- package/esm/server/internal_jobs/job-manager.d.ts +58 -2
- package/esm/server/internal_jobs/job-manager.d.ts.map +1 -1
- package/esm/server/internal_jobs/job-manager.js +429 -55
- package/esm/server/internal_jobs/key-coordinator.d.ts +269 -0
- package/esm/server/internal_jobs/key-coordinator.d.ts.map +1 -0
- package/esm/server/internal_jobs/key-coordinator.js +677 -0
- package/esm/server/internal_jobs/projection.d.ts.map +1 -1
- package/esm/server/internal_jobs/projection.js +2 -0
- package/esm/server/internal_jobs/runtime-worker.d.ts +5 -1
- package/esm/server/internal_jobs/runtime-worker.d.ts.map +1 -1
- package/esm/server/internal_jobs/runtime-worker.js +14 -2
- package/esm/server/internal_jobs/types.d.ts +5 -5
- package/esm/server/internal_jobs/types.d.ts.map +1 -1
- package/esm/server/internal_jobs/types.js +6 -0
- package/esm/server/runtime.d.ts.map +1 -1
- package/esm/server/service.d.ts +81 -112
- package/esm/server/service.d.ts.map +1 -1
- package/esm/server/service.js +372 -130
- package/esm/server.d.ts +3 -3
- package/esm/server.d.ts.map +1 -1
- package/esm/service/deno.d.ts +1 -1
- package/esm/service/deno.d.ts.map +1 -1
- package/esm/service/drizzle.d.ts +52 -0
- package/esm/service/drizzle.d.ts.map +1 -0
- package/esm/service/drizzle.js +108 -0
- package/esm/service/mod.d.ts +3 -3
- package/esm/service/mod.d.ts.map +1 -1
- package/esm/service/mod.js +2 -2
- package/esm/service/node.d.ts +1 -1
- package/esm/service/node.d.ts.map +1 -1
- package/esm/service/outbox_inbox.d.ts +76 -22
- package/esm/service/outbox_inbox.d.ts.map +1 -1
- package/esm/service/outbox_inbox.js +231 -70
- package/esm/telemetry/metrics.d.ts +55 -0
- package/esm/telemetry/metrics.d.ts.map +1 -1
- package/esm/telemetry/metrics.js +86 -0
- package/esm/telemetry/mod.d.ts +2 -1
- package/esm/telemetry/mod.d.ts.map +1 -1
- package/esm/telemetry/mod.js +1 -1
- package/esm/trellis.d.ts +62 -30
- package/esm/trellis.d.ts.map +1 -1
- package/esm/trellis.js +125 -42
- package/package.json +14 -2
- package/script/auth/mod.d.ts +1 -1
- package/script/auth/mod.d.ts.map +1 -1
- package/script/auth/mod.js +11 -4
- package/script/auth/protocol.d.ts +55 -0
- package/script/auth/protocol.d.ts.map +1 -1
- package/script/browser.d.ts +3 -3
- package/script/browser.d.ts.map +1 -1
- package/script/browser.js +3 -2
- package/script/client_connect.d.ts +12 -3
- package/script/client_connect.d.ts.map +1 -1
- package/script/client_connect.js +111 -6
- package/script/codec.d.ts +7 -6
- package/script/codec.d.ts.map +1 -1
- package/script/codec.js +124 -5
- package/script/contract_support/canonical.d.ts +3 -0
- package/script/contract_support/canonical.d.ts.map +1 -1
- package/script/contract_support/canonical.js +3 -0
- package/script/contract_support/mod.d.ts +125 -10
- package/script/contract_support/mod.d.ts.map +1 -1
- package/script/contract_support/mod.js +165 -5
- package/script/contract_support/protocol.d.ts +92 -7
- package/script/contract_support/protocol.d.ts.map +1 -1
- package/script/contract_support/protocol.js +42 -8
- package/script/contract_support/runtime.d.ts +4 -1
- package/script/contract_support/runtime.d.ts.map +1 -1
- package/script/errors/SchemaValidationError.d.ts +49 -0
- package/script/errors/SchemaValidationError.d.ts.map +1 -0
- package/script/errors/SchemaValidationError.js +74 -0
- package/script/errors/index.d.ts +38 -9
- package/script/errors/index.d.ts.map +1 -1
- package/script/errors/index.js +20 -1
- package/script/generated-sdk/auth/api.d.ts +33 -605
- package/script/generated-sdk/auth/api.d.ts.map +1 -1
- package/script/generated-sdk/auth/api.js +6 -1
- package/script/generated-sdk/auth/client.d.ts +129 -134
- package/script/generated-sdk/auth/client.d.ts.map +1 -1
- package/script/generated-sdk/auth/contract.d.ts +2 -601
- package/script/generated-sdk/auth/contract.d.ts.map +1 -1
- package/script/generated-sdk/auth/contract.js +310 -93
- package/script/generated-sdk/auth/mod.d.ts +1 -1
- package/script/generated-sdk/auth/mod.d.ts.map +1 -1
- package/script/generated-sdk/auth/owned_api.d.ts +88 -86
- package/script/generated-sdk/auth/owned_api.d.ts.map +1 -1
- package/script/generated-sdk/auth/owned_api.js +6 -0
- package/script/generated-sdk/auth/schemas.d.ts +284 -136
- package/script/generated-sdk/auth/schemas.d.ts.map +1 -1
- package/script/generated-sdk/auth/schemas.js +231 -92
- package/script/generated-sdk/auth/types.d.ts +565 -89
- package/script/generated-sdk/auth/types.d.ts.map +1 -1
- package/script/generated-sdk/auth/types.js +1 -1
- package/script/generated-sdk/health/api.d.ts +29 -18
- package/script/generated-sdk/health/api.d.ts.map +1 -1
- package/script/generated-sdk/health/client.d.ts +7 -21
- package/script/generated-sdk/health/client.d.ts.map +1 -1
- package/script/generated-sdk/health/contract.d.ts +2 -15
- package/script/generated-sdk/health/contract.d.ts.map +1 -1
- package/script/generated-sdk/health/contract.js +2 -10
- package/script/generated-sdk/health/mod.d.ts +1 -1
- package/script/generated-sdk/health/mod.d.ts.map +1 -1
- package/script/generated-sdk/health/owned_api.d.ts +2 -2
- package/script/generated-sdk/health/schemas.d.ts +1 -14
- package/script/generated-sdk/health/schemas.d.ts.map +1 -1
- package/script/generated-sdk/health/schemas.js +1 -9
- package/script/generated-sdk/health/types.d.ts +10 -5
- package/script/generated-sdk/health/types.d.ts.map +1 -1
- package/script/generated-sdk/health/types.js +1 -2
- package/script/generated-sdk/jobs/api.d.ts +29 -109
- package/script/generated-sdk/jobs/api.d.ts.map +1 -1
- package/script/generated-sdk/jobs/client.d.ts +21 -33
- package/script/generated-sdk/jobs/client.d.ts.map +1 -1
- package/script/generated-sdk/jobs/contract.d.ts +2 -106
- package/script/generated-sdk/jobs/contract.d.ts.map +1 -1
- package/script/generated-sdk/jobs/contract.js +268 -1
- package/script/generated-sdk/jobs/mod.d.ts +1 -1
- package/script/generated-sdk/jobs/mod.d.ts.map +1 -1
- package/script/generated-sdk/jobs/owned_api.d.ts +22 -9
- package/script/generated-sdk/jobs/owned_api.d.ts.map +1 -1
- package/script/generated-sdk/jobs/owned_api.js +19 -0
- package/script/generated-sdk/jobs/schemas.d.ts +437 -0
- package/script/generated-sdk/jobs/schemas.d.ts.map +1 -1
- package/script/generated-sdk/jobs/schemas.js +212 -1
- package/script/generated-sdk/jobs/types.d.ts +195 -12
- package/script/generated-sdk/jobs/types.d.ts.map +1 -1
- package/script/generated-sdk/jobs/types.js +1 -1
- package/script/generated-sdk/state/api.d.ts +29 -68
- package/script/generated-sdk/state/api.d.ts.map +1 -1
- package/script/generated-sdk/state/client.d.ts +17 -31
- package/script/generated-sdk/state/client.d.ts.map +1 -1
- package/script/generated-sdk/state/contract.d.ts +1 -64
- package/script/generated-sdk/state/contract.d.ts.map +1 -1
- package/script/generated-sdk/state/mod.d.ts +1 -1
- package/script/generated-sdk/state/mod.d.ts.map +1 -1
- package/script/generated-sdk/state/owned_api.d.ts +7 -7
- package/script/generated-sdk/state/types.d.ts +52 -9
- package/script/generated-sdk/state/types.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/api.d.ts +33 -45
- package/script/generated-sdk/trellis-core/api.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/api.js +6 -1
- package/script/generated-sdk/trellis-core/client.d.ts +31 -20
- package/script/generated-sdk/trellis-core/client.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/contract.d.ts +2 -41
- package/script/generated-sdk/trellis-core/contract.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/contract.js +91 -1
- package/script/generated-sdk/trellis-core/mod.d.ts +1 -1
- package/script/generated-sdk/trellis-core/mod.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/owned_api.d.ts +4 -4
- package/script/generated-sdk/trellis-core/schemas.d.ts +113 -0
- package/script/generated-sdk/trellis-core/schemas.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/schemas.js +81 -0
- package/script/generated-sdk/trellis-core/types.d.ts +54 -7
- package/script/generated-sdk/trellis-core/types.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/types.js +1 -1
- package/script/health.d.ts +1 -1
- package/script/health.d.ts.map +1 -1
- package/script/health.js +1 -2
- package/script/index.d.ts +4 -4
- package/script/index.d.ts.map +1 -1
- package/script/index.js +2 -2
- package/script/jobs.d.ts +69 -3
- package/script/jobs.d.ts.map +1 -1
- package/script/jobs.js +93 -3
- package/script/server/health.d.ts +2 -6
- package/script/server/health.d.ts.map +1 -1
- package/script/server/health_schemas.d.ts +0 -8
- package/script/server/health_schemas.d.ts.map +1 -1
- package/script/server/health_schemas.js +1 -6
- package/script/server/internal_jobs/bindings.d.ts +11 -0
- package/script/server/internal_jobs/bindings.d.ts.map +1 -1
- package/script/server/internal_jobs/job-manager.d.ts +58 -2
- package/script/server/internal_jobs/job-manager.d.ts.map +1 -1
- package/script/server/internal_jobs/job-manager.js +429 -54
- package/script/server/internal_jobs/key-coordinator.d.ts +269 -0
- package/script/server/internal_jobs/key-coordinator.d.ts.map +1 -0
- package/script/server/internal_jobs/key-coordinator.js +690 -0
- package/script/server/internal_jobs/projection.d.ts.map +1 -1
- package/script/server/internal_jobs/projection.js +2 -0
- package/script/server/internal_jobs/runtime-worker.d.ts +5 -1
- package/script/server/internal_jobs/runtime-worker.d.ts.map +1 -1
- package/script/server/internal_jobs/runtime-worker.js +14 -2
- package/script/server/internal_jobs/types.d.ts +5 -5
- package/script/server/internal_jobs/types.d.ts.map +1 -1
- package/script/server/internal_jobs/types.js +6 -0
- package/script/server/runtime.d.ts.map +1 -1
- package/script/server/service.d.ts +81 -112
- package/script/server/service.d.ts.map +1 -1
- package/script/server/service.js +369 -127
- package/script/server.d.ts +3 -3
- package/script/server.d.ts.map +1 -1
- package/script/service/deno.d.ts +1 -1
- package/script/service/deno.d.ts.map +1 -1
- package/script/service/drizzle.d.ts +52 -0
- package/script/service/drizzle.d.ts.map +1 -0
- package/script/service/drizzle.js +113 -0
- package/script/service/mod.d.ts +3 -3
- package/script/service/mod.d.ts.map +1 -1
- package/script/service/mod.js +4 -3
- package/script/service/node.d.ts +1 -1
- package/script/service/node.d.ts.map +1 -1
- package/script/service/outbox_inbox.d.ts +76 -22
- package/script/service/outbox_inbox.d.ts.map +1 -1
- package/script/service/outbox_inbox.js +233 -70
- package/script/telemetry/metrics.d.ts +55 -0
- package/script/telemetry/metrics.d.ts.map +1 -1
- package/script/telemetry/metrics.js +88 -0
- package/script/telemetry/mod.d.ts +2 -1
- package/script/telemetry/mod.d.ts.map +1 -1
- package/script/telemetry/mod.js +3 -1
- package/script/trellis.d.ts +62 -30
- package/script/trellis.d.ts.map +1 -1
- package/script/trellis.js +124 -41
- package/src/auth/mod.ts +7 -0
- package/src/browser.ts +5 -7
- package/src/client_connect.ts +200 -12
- package/src/codec.ts +186 -11
- package/src/contract_support/canonical.ts +3 -0
- package/src/contract_support/mod.ts +380 -9
- package/src/contract_support/protocol.ts +57 -10
- package/src/contract_support/runtime.ts +7 -0
- package/src/errors/SchemaValidationError.ts +67 -0
- package/src/errors/index.ts +28 -0
- package/src/health.ts +0 -1
- package/src/index.ts +7 -8
- package/src/jobs.ts +138 -1
- package/src/sdk/_generated/auth/api.ts +38 -7
- package/src/sdk/_generated/auth/client.ts +168 -530
- package/src/sdk/_generated/auth/contract.ts +310 -93
- package/src/sdk/_generated/auth/mod.ts +0 -1
- package/src/sdk/_generated/auth/owned_api.ts +92 -86
- package/src/sdk/_generated/auth/schemas.ts +231 -92
- package/src/sdk/_generated/auth/types.ts +1069 -273
- package/src/sdk/_generated/core/api.ts +38 -7
- package/src/sdk/_generated/core/client.ts +47 -73
- package/src/sdk/_generated/core/contract.ts +91 -1
- package/src/sdk/_generated/core/mod.ts +0 -1
- package/src/sdk/_generated/core/owned_api.ts +4 -4
- package/src/sdk/_generated/core/schemas.ts +81 -0
- package/src/sdk/_generated/core/types.ts +79 -15
- package/src/sdk/_generated/health/api.ts +29 -5
- package/src/sdk/_generated/health/client.ts +11 -58
- package/src/sdk/_generated/health/contract.ts +2 -10
- package/src/sdk/_generated/health/mod.ts +0 -1
- package/src/sdk/_generated/health/owned_api.ts +2 -2
- package/src/sdk/_generated/health/schemas.ts +1 -9
- package/src/sdk/_generated/health/types.ts +23 -2
- package/src/sdk/_generated/jobs/api.ts +29 -5
- package/src/sdk/_generated/jobs/client.ts +25 -109
- package/src/sdk/_generated/jobs/contract.ts +269 -1
- package/src/sdk/_generated/jobs/mod.ts +0 -1
- package/src/sdk/_generated/jobs/owned_api.ts +30 -9
- package/src/sdk/_generated/jobs/schemas.ts +213 -0
- package/src/sdk/_generated/jobs/types.ts +252 -18
- package/src/sdk/_generated/state/api.ts +29 -5
- package/src/sdk/_generated/state/client.ts +18 -95
- package/src/sdk/_generated/state/mod.ts +0 -1
- package/src/sdk/_generated/state/owned_api.ts +7 -7
- package/src/sdk/_generated/state/types.ts +91 -15
- package/src/server/health.ts +2 -6
- package/src/server/health_schemas.ts +0 -6
- package/src/server/internal_jobs/bindings.ts +11 -0
- package/src/server/internal_jobs/job-manager.ts +553 -24
- package/src/server/internal_jobs/key-coordinator.ts +1080 -0
- package/src/server/internal_jobs/projection.ts +2 -0
- package/src/server/internal_jobs/runtime-worker.ts +17 -1
- package/src/server/internal_jobs/types.ts +6 -0
- package/src/server/runtime.ts +4 -0
- package/src/server/service.ts +645 -625
- package/src/server.ts +14 -7
- package/src/service/deno.ts +0 -5
- package/src/service/drizzle.ts +184 -0
- package/src/service/mod.ts +17 -7
- package/src/service/node.ts +0 -5
- package/src/service/outbox_inbox.ts +354 -88
- package/src/telemetry/metrics.ts +198 -1
- package/src/telemetry/mod.ts +6 -0
- package/src/trellis.ts +286 -105
|
@@ -14,67 +14,137 @@ var _MemoryOutboxRepository_messages, _MemoryInboxRepository_seen, _OutboxDispat
|
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.OutboxDispatcher = exports.NatsKvInboxRepository = exports.NatsKvOutboxRepository = exports.KvOutboxRecordSchema = exports.SqlInboxRepository = exports.SqlOutboxRepository = exports.MemoryInboxRepository = exports.MemoryOutboxRepository = exports.defaultSqlOutboxTables = void 0;
|
|
16
16
|
exports.createSqlOutboxAdapter = createSqlOutboxAdapter;
|
|
17
|
+
exports.getSqlOutboxMigrations = getSqlOutboxMigrations;
|
|
17
18
|
exports.createSqliteOutboxSchema = createSqliteOutboxSchema;
|
|
18
19
|
exports.createPostgresOutboxSchema = createPostgresOutboxSchema;
|
|
19
20
|
exports.dispatchOutbox = dispatchOutbox;
|
|
20
|
-
exports.
|
|
21
|
+
exports.outboxMessageToPreparedEvent = outboxMessageToPreparedEvent;
|
|
22
|
+
exports.preparedTrellisEventToOutboxRecord = preparedTrellisEventToOutboxRecord;
|
|
21
23
|
const result_1 = require("@qlever-llc/result");
|
|
22
24
|
const typebox_1 = require("typebox");
|
|
23
25
|
const mod_js_1 = require("../telemetry/mod.js");
|
|
26
|
+
/** Default Trellis helper-table names for SQL outbox and inbox storage. */
|
|
24
27
|
exports.defaultSqlOutboxTables = Object.freeze({
|
|
25
28
|
outbox: "trellis_outbox",
|
|
26
29
|
inbox: "trellis_inbox",
|
|
27
30
|
});
|
|
31
|
+
const sqlIdentifierPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
28
32
|
/**
|
|
29
|
-
* Creates SQL outbox/inbox repositories plus
|
|
33
|
+
* Creates SQL outbox/inbox repositories plus current helper-table DDL.
|
|
30
34
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* equivalent Drizzle table definition using these table and column names, in
|
|
34
|
-
* their own Drizzle-managed migration flow.
|
|
35
|
+
* Use {@link getSqlOutboxMigrations} when services need versioned Trellis-owned
|
|
36
|
+
* migration artifacts for their normal database migration tooling.
|
|
35
37
|
*/
|
|
36
38
|
function createSqlOutboxAdapter(executor, dialect, tables = exports.defaultSqlOutboxTables) {
|
|
39
|
+
const sqlTables = validateSqlOutboxTables(tables);
|
|
37
40
|
return {
|
|
38
|
-
outbox: new SqlOutboxRepository(executor, dialect,
|
|
39
|
-
inbox: new SqlInboxRepository(executor, dialect,
|
|
41
|
+
outbox: new SqlOutboxRepository(executor, dialect, sqlTables),
|
|
42
|
+
inbox: new SqlInboxRepository(executor, dialect, sqlTables),
|
|
40
43
|
ddl: dialect === "postgres"
|
|
41
|
-
? createPostgresOutboxSchema(
|
|
42
|
-
: createSqliteOutboxSchema(
|
|
44
|
+
? createPostgresOutboxSchema(sqlTables)
|
|
45
|
+
: createSqliteOutboxSchema(sqlTables),
|
|
43
46
|
};
|
|
44
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Returns Trellis-owned SQL outbox/inbox migration artifacts for a dialect.
|
|
50
|
+
*
|
|
51
|
+
* Trellis generates the helper-table SQL, but services remain responsible for
|
|
52
|
+
* running these artifacts through their normal database migration tooling.
|
|
53
|
+
*/
|
|
54
|
+
function getSqlOutboxMigrations(options) {
|
|
55
|
+
const tables = resolveSqlOutboxTables(options.tables);
|
|
56
|
+
const up = options.dialect === "postgres"
|
|
57
|
+
? createPostgresOutboxSchema(tables)
|
|
58
|
+
: createSqliteOutboxSchema(tables);
|
|
59
|
+
const down = createSqlOutboxDownSchema(tables);
|
|
60
|
+
return Object.freeze([
|
|
61
|
+
Object.freeze({
|
|
62
|
+
id: `trellis_sql_outbox_inbox_${options.dialect}_v1`,
|
|
63
|
+
version: 1,
|
|
64
|
+
dialect: options.dialect,
|
|
65
|
+
up,
|
|
66
|
+
down,
|
|
67
|
+
checksum: checksumMigrationSql(up, down),
|
|
68
|
+
}),
|
|
69
|
+
]);
|
|
70
|
+
}
|
|
45
71
|
/** Returns SQLite DDL for Trellis outbox and inbox tables. */
|
|
46
72
|
function createSqliteOutboxSchema(tables = exports.defaultSqlOutboxTables) {
|
|
73
|
+
const sqlTables = validateSqlOutboxTables(tables);
|
|
47
74
|
return [
|
|
48
|
-
`CREATE TABLE IF NOT EXISTS ${
|
|
49
|
-
`CREATE INDEX IF NOT EXISTS ${
|
|
50
|
-
`CREATE TABLE IF NOT EXISTS ${
|
|
75
|
+
`CREATE TABLE IF NOT EXISTS ${sqlTables.outbox} (id TEXT PRIMARY KEY, kind TEXT NOT NULL, name TEXT NOT NULL, subject TEXT NOT NULL, payload TEXT NOT NULL, headers TEXT NOT NULL, state TEXT NOT NULL, attempts INTEGER NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, next_attempt_at TEXT, last_error TEXT, outcome TEXT)`,
|
|
76
|
+
`CREATE INDEX IF NOT EXISTS ${sqlTables.outbox}_due_idx ON ${sqlTables.outbox} (state, next_attempt_at)`,
|
|
77
|
+
`CREATE TABLE IF NOT EXISTS ${sqlTables.inbox} (message_id TEXT PRIMARY KEY, received_at TEXT NOT NULL)`,
|
|
51
78
|
];
|
|
52
79
|
}
|
|
53
80
|
/** Returns Postgres DDL for Trellis outbox and inbox tables. */
|
|
54
81
|
function createPostgresOutboxSchema(tables = exports.defaultSqlOutboxTables) {
|
|
82
|
+
const sqlTables = validateSqlOutboxTables(tables);
|
|
55
83
|
return [
|
|
56
|
-
`CREATE TABLE IF NOT EXISTS ${
|
|
57
|
-
`CREATE INDEX IF NOT EXISTS ${
|
|
58
|
-
`CREATE TABLE IF NOT EXISTS ${
|
|
84
|
+
`CREATE TABLE IF NOT EXISTS ${sqlTables.outbox} (id text PRIMARY KEY, kind text NOT NULL, name text NOT NULL, subject text NOT NULL, payload text NOT NULL, headers jsonb NOT NULL, state text NOT NULL, attempts integer NOT NULL, created_at timestamptz NOT NULL, updated_at timestamptz NOT NULL, next_attempt_at timestamptz, last_error text, outcome jsonb)`,
|
|
85
|
+
`CREATE INDEX IF NOT EXISTS ${sqlTables.outbox}_due_idx ON ${sqlTables.outbox} (state, next_attempt_at)`,
|
|
86
|
+
`CREATE TABLE IF NOT EXISTS ${sqlTables.inbox} (message_id text PRIMARY KEY, received_at timestamptz NOT NULL)`,
|
|
59
87
|
];
|
|
60
88
|
}
|
|
89
|
+
function createSqlOutboxDownSchema(tables) {
|
|
90
|
+
const sqlTables = validateSqlOutboxTables(tables);
|
|
91
|
+
return [
|
|
92
|
+
`DROP INDEX IF EXISTS ${sqlTables.outbox}_due_idx`,
|
|
93
|
+
`DROP TABLE IF EXISTS ${sqlTables.inbox}`,
|
|
94
|
+
`DROP TABLE IF EXISTS ${sqlTables.outbox}`,
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
function resolveSqlOutboxTables(tables) {
|
|
98
|
+
return validateSqlOutboxTables({
|
|
99
|
+
outbox: tables?.outbox ?? exports.defaultSqlOutboxTables.outbox,
|
|
100
|
+
inbox: tables?.inbox ?? exports.defaultSqlOutboxTables.inbox,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
function validateSqlOutboxTables(tables) {
|
|
104
|
+
validateSqlIdentifier("outbox", tables.outbox);
|
|
105
|
+
validateSqlIdentifier("inbox", tables.inbox);
|
|
106
|
+
return Object.freeze({ outbox: tables.outbox, inbox: tables.inbox });
|
|
107
|
+
}
|
|
108
|
+
function validateSqlIdentifier(kind, name) {
|
|
109
|
+
if (!sqlIdentifierPattern.test(name)) {
|
|
110
|
+
throw new Error(`Invalid SQL ${kind} table name "${name}". Use a simple identifier matching ${sqlIdentifierPattern.source}.`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function checksumMigrationSql(up, down) {
|
|
114
|
+
return `fnv1a64:${fnv1a64Hex([
|
|
115
|
+
"-- up",
|
|
116
|
+
...up,
|
|
117
|
+
"-- down",
|
|
118
|
+
...down,
|
|
119
|
+
].join("\n"))}`;
|
|
120
|
+
}
|
|
121
|
+
function fnv1a64Hex(input) {
|
|
122
|
+
let hash = 0xcbf29ce484222325n;
|
|
123
|
+
const prime = 0x100000001b3n;
|
|
124
|
+
for (const character of input) {
|
|
125
|
+
hash ^= BigInt(character.codePointAt(0) ?? 0);
|
|
126
|
+
hash = BigInt.asUintN(64, hash * prime);
|
|
127
|
+
}
|
|
128
|
+
return hash.toString(16).padStart(16, "0");
|
|
129
|
+
}
|
|
61
130
|
/** In-memory outbox repository intended for tests and local process adapters. */
|
|
62
131
|
class MemoryOutboxRepository {
|
|
63
132
|
constructor() {
|
|
64
133
|
_MemoryOutboxRepository_messages.set(this, new Map());
|
|
65
134
|
}
|
|
66
|
-
async enqueue(
|
|
135
|
+
async enqueue(record) {
|
|
67
136
|
const now = new Date().toISOString();
|
|
68
|
-
const id =
|
|
137
|
+
const id = record.id;
|
|
69
138
|
const existing = __classPrivateFieldGet(this, _MemoryOutboxRepository_messages, "f").get(id);
|
|
70
139
|
if (existing)
|
|
71
140
|
return existing;
|
|
72
141
|
const message = {
|
|
73
142
|
id,
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
143
|
+
kind: record.kind,
|
|
144
|
+
name: record.name,
|
|
145
|
+
subject: record.subject,
|
|
146
|
+
payload: record.payload,
|
|
147
|
+
headers: { ...record.headers },
|
|
78
148
|
state: "pending",
|
|
79
149
|
attempts: 0,
|
|
80
150
|
createdAt: now,
|
|
@@ -98,7 +168,7 @@ class MemoryOutboxRepository {
|
|
|
98
168
|
}
|
|
99
169
|
return claimed;
|
|
100
170
|
}
|
|
101
|
-
async markDispatched(id, now) {
|
|
171
|
+
async markDispatched(id, now, outcome) {
|
|
102
172
|
const message = __classPrivateFieldGet(this, _MemoryOutboxRepository_messages, "f").get(id);
|
|
103
173
|
if (!message)
|
|
104
174
|
return;
|
|
@@ -108,6 +178,7 @@ class MemoryOutboxRepository {
|
|
|
108
178
|
updatedAt: now.toISOString(),
|
|
109
179
|
nextAttemptAt: undefined,
|
|
110
180
|
lastError: undefined,
|
|
181
|
+
outcome: outcome ?? message.outcome,
|
|
111
182
|
});
|
|
112
183
|
}
|
|
113
184
|
async markFailed(id, failure) {
|
|
@@ -165,17 +236,19 @@ class SqlOutboxRepository {
|
|
|
165
236
|
enumerable: true,
|
|
166
237
|
configurable: true,
|
|
167
238
|
writable: true,
|
|
168
|
-
value:
|
|
239
|
+
value: void 0
|
|
169
240
|
});
|
|
241
|
+
this.tables = validateSqlOutboxTables(tables);
|
|
170
242
|
}
|
|
171
|
-
async enqueue(
|
|
243
|
+
async enqueue(record) {
|
|
172
244
|
const now = new Date().toISOString();
|
|
173
245
|
const message = {
|
|
174
|
-
id:
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
246
|
+
id: record.id,
|
|
247
|
+
kind: record.kind,
|
|
248
|
+
name: record.name,
|
|
249
|
+
subject: record.subject,
|
|
250
|
+
payload: record.payload,
|
|
251
|
+
headers: { ...record.headers },
|
|
179
252
|
state: "pending",
|
|
180
253
|
attempts: 0,
|
|
181
254
|
createdAt: now,
|
|
@@ -185,9 +258,10 @@ class SqlOutboxRepository {
|
|
|
185
258
|
const conflict = this.dialect === "postgres"
|
|
186
259
|
? "ON CONFLICT (id) DO NOTHING"
|
|
187
260
|
: "ON CONFLICT(id) DO NOTHING";
|
|
188
|
-
await this.executor.execute(`INSERT INTO ${this.tables.outbox} (id,
|
|
261
|
+
await this.executor.execute(`INSERT INTO ${this.tables.outbox} (id, kind, name, subject, payload, headers, state, attempts, created_at, updated_at, next_attempt_at, last_error, outcome) VALUES (${placeholders(this.dialect, 13)}) ${conflict}`, [
|
|
189
262
|
message.id,
|
|
190
|
-
message.
|
|
263
|
+
message.kind,
|
|
264
|
+
message.name,
|
|
191
265
|
message.subject,
|
|
192
266
|
message.payload,
|
|
193
267
|
headers,
|
|
@@ -197,15 +271,17 @@ class SqlOutboxRepository {
|
|
|
197
271
|
message.updatedAt,
|
|
198
272
|
null,
|
|
199
273
|
null,
|
|
274
|
+
null,
|
|
200
275
|
]);
|
|
201
276
|
return message;
|
|
202
277
|
}
|
|
203
278
|
async claimDue(limit, now) {
|
|
204
|
-
const rows = await this.executor.query(`SELECT id,
|
|
279
|
+
const rows = await this.executor.query(`SELECT id, kind, name, subject, payload, headers, state, attempts, created_at, updated_at, next_attempt_at, last_error, outcome FROM ${this.tables.outbox} WHERE state != ${placeholder(this.dialect, 1)} AND (next_attempt_at IS NULL OR next_attempt_at <= ${placeholder(this.dialect, 2)}) ORDER BY created_at LIMIT ${placeholder(this.dialect, 3)}`, ["dispatched", now.toISOString(), limit]);
|
|
205
280
|
return rows.map(rowToOutboxMessage);
|
|
206
281
|
}
|
|
207
|
-
async markDispatched(id, now) {
|
|
208
|
-
|
|
282
|
+
async markDispatched(id, now, outcome) {
|
|
283
|
+
const outcomeJson = outcome !== undefined ? JSON.stringify(outcome) : null;
|
|
284
|
+
await this.executor.execute(`UPDATE ${this.tables.outbox} SET state = ${placeholder(this.dialect, 1)}, updated_at = ${placeholder(this.dialect, 2)}, next_attempt_at = NULL, last_error = NULL, outcome = ${placeholder(this.dialect, 3)} WHERE id = ${placeholder(this.dialect, 4)}`, ["dispatched", now.toISOString(), outcomeJson, id]);
|
|
209
285
|
}
|
|
210
286
|
async markFailed(id, failure) {
|
|
211
287
|
await this.executor.execute(`UPDATE ${this.tables.outbox} SET state = ${placeholder(this.dialect, 1)}, attempts = attempts + 1, updated_at = ${placeholder(this.dialect, 2)}, next_attempt_at = ${placeholder(this.dialect, 3)}, last_error = ${placeholder(this.dialect, 4)} WHERE id = ${placeholder(this.dialect, 5)}`, [
|
|
@@ -237,8 +313,9 @@ class SqlInboxRepository {
|
|
|
237
313
|
enumerable: true,
|
|
238
314
|
configurable: true,
|
|
239
315
|
writable: true,
|
|
240
|
-
value:
|
|
316
|
+
value: void 0
|
|
241
317
|
});
|
|
318
|
+
this.tables = validateSqlOutboxTables(tables);
|
|
242
319
|
}
|
|
243
320
|
async record(messageId, now = new Date()) {
|
|
244
321
|
try {
|
|
@@ -266,7 +343,8 @@ const KvInboxRecordSchema = typebox_1.Type.Object({
|
|
|
266
343
|
});
|
|
267
344
|
exports.KvOutboxRecordSchema = typebox_1.Type.Object({
|
|
268
345
|
id: typebox_1.Type.String(),
|
|
269
|
-
|
|
346
|
+
kind: typebox_1.Type.String(),
|
|
347
|
+
name: typebox_1.Type.String(),
|
|
270
348
|
subject: typebox_1.Type.String(),
|
|
271
349
|
payload: typebox_1.Type.String(),
|
|
272
350
|
headers: typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.String()),
|
|
@@ -281,6 +359,7 @@ exports.KvOutboxRecordSchema = typebox_1.Type.Object({
|
|
|
281
359
|
updatedAt: typebox_1.Type.String(),
|
|
282
360
|
nextAttemptAt: typebox_1.Type.Optional(typebox_1.Type.String()),
|
|
283
361
|
lastError: typebox_1.Type.Optional(typebox_1.Type.String()),
|
|
362
|
+
outcome: typebox_1.Type.Optional(typebox_1.Type.String()),
|
|
284
363
|
});
|
|
285
364
|
/** Durable NATS KV outbox repository for services without SQL state. */
|
|
286
365
|
class NatsKvOutboxRepository {
|
|
@@ -292,14 +371,15 @@ class NatsKvOutboxRepository {
|
|
|
292
371
|
value: kv
|
|
293
372
|
});
|
|
294
373
|
}
|
|
295
|
-
async enqueue(
|
|
374
|
+
async enqueue(rec) {
|
|
296
375
|
const now = new Date().toISOString();
|
|
297
376
|
const record = {
|
|
298
|
-
id:
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
377
|
+
id: rec.id,
|
|
378
|
+
kind: rec.kind,
|
|
379
|
+
name: rec.name,
|
|
380
|
+
subject: rec.subject,
|
|
381
|
+
payload: rec.payload,
|
|
382
|
+
headers: { ...rec.headers },
|
|
303
383
|
state: "pending",
|
|
304
384
|
attempts: 0,
|
|
305
385
|
createdAt: now,
|
|
@@ -353,19 +433,23 @@ class NatsKvOutboxRepository {
|
|
|
353
433
|
}
|
|
354
434
|
return claimed;
|
|
355
435
|
}
|
|
356
|
-
async markDispatched(id, now) {
|
|
436
|
+
async markDispatched(id, now, outcome) {
|
|
357
437
|
const loaded = await this.kv.get(id).take();
|
|
358
438
|
if ((0, result_1.isErr)(loaded)) {
|
|
359
439
|
if (hasKvReason(loaded.error, "not found"))
|
|
360
440
|
return;
|
|
361
441
|
throw loaded.error;
|
|
362
442
|
}
|
|
443
|
+
const outcomeStr = outcome !== undefined
|
|
444
|
+
? JSON.stringify(outcome)
|
|
445
|
+
: undefined;
|
|
363
446
|
const stored = await loaded.put({
|
|
364
447
|
...loaded.value,
|
|
365
448
|
state: "dispatched",
|
|
366
449
|
updatedAt: now.toISOString(),
|
|
367
450
|
nextAttemptAt: undefined,
|
|
368
451
|
lastError: undefined,
|
|
452
|
+
outcome: outcomeStr ?? loaded.value.outcome,
|
|
369
453
|
}, true).take();
|
|
370
454
|
if ((0, result_1.isErr)(stored))
|
|
371
455
|
throw stored.error;
|
|
@@ -565,7 +649,7 @@ _OutboxDispatcher_repository = new WeakMap(), _OutboxDispatcher_runtime = new We
|
|
|
565
649
|
__classPrivateFieldSet(this, _OutboxDispatcher_idleTimer, undefined, "f");
|
|
566
650
|
}
|
|
567
651
|
};
|
|
568
|
-
/** Dispatches due outbox messages through a
|
|
652
|
+
/** Dispatches due outbox messages through a dispatch runtime. */
|
|
569
653
|
async function dispatchOutbox(repository, runtime, options = {}) {
|
|
570
654
|
const now = options.now ?? new Date();
|
|
571
655
|
const retryDelayMs = options.retryDelayMs ?? 1000;
|
|
@@ -573,47 +657,115 @@ async function dispatchOutbox(repository, runtime, options = {}) {
|
|
|
573
657
|
let dispatched = 0;
|
|
574
658
|
let failed = 0;
|
|
575
659
|
for (const message of messages) {
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
(0,
|
|
660
|
+
if (message.kind === "event.publish") {
|
|
661
|
+
const result = await runtime.publishPreparedEvent(outboxMessageToPreparedEvent(message));
|
|
662
|
+
const value = result.take();
|
|
663
|
+
if ((0, result_1.isErr)(value)) {
|
|
664
|
+
(0, mod_js_1.recordTrellisError)(value.error, {
|
|
665
|
+
surface: "outbox",
|
|
666
|
+
direction: "dispatcher",
|
|
667
|
+
operation: message.name,
|
|
668
|
+
phase: "publish",
|
|
669
|
+
messagingSystem: "nats",
|
|
670
|
+
});
|
|
671
|
+
failed += 1;
|
|
672
|
+
await repository.markFailed(message.id, {
|
|
673
|
+
error: value.error.message,
|
|
674
|
+
nextAttemptAt: new Date(now.getTime() + retryDelayMs),
|
|
675
|
+
now,
|
|
676
|
+
});
|
|
677
|
+
continue;
|
|
678
|
+
}
|
|
679
|
+
dispatched += 1;
|
|
680
|
+
await repository.markDispatched(message.id, now);
|
|
681
|
+
}
|
|
682
|
+
else if (message.kind === "job.create" || message.kind === "job.submit") {
|
|
683
|
+
if (runtime.dispatchJobSubmission) {
|
|
684
|
+
const result = await runtime.dispatchJobSubmission(message);
|
|
685
|
+
const value = result.take();
|
|
686
|
+
if ((0, result_1.isErr)(value)) {
|
|
687
|
+
(0, mod_js_1.recordTrellisError)(value.error, {
|
|
688
|
+
surface: "outbox",
|
|
689
|
+
direction: "dispatcher",
|
|
690
|
+
operation: message.name,
|
|
691
|
+
phase: "job.dispatch",
|
|
692
|
+
});
|
|
693
|
+
failed += 1;
|
|
694
|
+
await repository.markFailed(message.id, {
|
|
695
|
+
error: value.error.message,
|
|
696
|
+
nextAttemptAt: new Date(now.getTime() + retryDelayMs),
|
|
697
|
+
now,
|
|
698
|
+
});
|
|
699
|
+
continue;
|
|
700
|
+
}
|
|
701
|
+
dispatched += 1;
|
|
702
|
+
await repository.markDispatched(message.id, now);
|
|
703
|
+
}
|
|
704
|
+
else {
|
|
705
|
+
(0, mod_js_1.recordTrellisError)(new Error(`job dispatch not supported`), {
|
|
706
|
+
surface: "outbox",
|
|
707
|
+
direction: "dispatcher",
|
|
708
|
+
operation: message.name,
|
|
709
|
+
phase: "dispatch",
|
|
710
|
+
});
|
|
711
|
+
await repository.markDispatched(message.id, now, {
|
|
712
|
+
error: "job dispatch not supported",
|
|
713
|
+
});
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
else {
|
|
717
|
+
const error = `Unknown outbox record kind: ${message.kind}`;
|
|
718
|
+
(0, mod_js_1.recordTrellisError)(new Error(error), {
|
|
580
719
|
surface: "outbox",
|
|
581
720
|
direction: "dispatcher",
|
|
582
|
-
operation: message.
|
|
583
|
-
phase: "
|
|
584
|
-
messagingSystem: "nats",
|
|
721
|
+
operation: message.name,
|
|
722
|
+
phase: "dispatch",
|
|
585
723
|
});
|
|
586
|
-
|
|
587
|
-
await repository.markFailed(message.id, {
|
|
588
|
-
error: value.error.message,
|
|
589
|
-
nextAttemptAt: new Date(now.getTime() + retryDelayMs),
|
|
590
|
-
now,
|
|
591
|
-
});
|
|
592
|
-
continue;
|
|
724
|
+
await repository.markDispatched(message.id, now, { error });
|
|
593
725
|
}
|
|
594
|
-
dispatched += 1;
|
|
595
|
-
await repository.markDispatched(message.id, now);
|
|
596
726
|
}
|
|
597
727
|
return { dispatched, failed };
|
|
598
728
|
}
|
|
599
|
-
/** Rehydrates a persisted outbox row into a prepared event. */
|
|
600
|
-
function
|
|
729
|
+
/** Rehydrates a persisted outbox event row into a prepared event. */
|
|
730
|
+
function outboxMessageToPreparedEvent(message) {
|
|
731
|
+
if (message.kind !== "event.publish") {
|
|
732
|
+
throw new Error(`Expected event.publish kind, got ${message.kind}`);
|
|
733
|
+
}
|
|
734
|
+
const payload = JSON.parse(message.payload);
|
|
735
|
+
const header = eventHeaderFromMessage(message.headers);
|
|
601
736
|
return Object.freeze({
|
|
602
|
-
event: message.
|
|
737
|
+
event: message.name,
|
|
603
738
|
subject: message.subject,
|
|
604
|
-
|
|
739
|
+
header: Object.freeze(header),
|
|
740
|
+
payload: Object.freeze(payload),
|
|
605
741
|
encodedPayload: message.payload,
|
|
606
742
|
headers: Object.freeze({ ...message.headers }),
|
|
607
743
|
});
|
|
608
744
|
}
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
745
|
+
/** Adapts a prepared Trellis event into a generic outbox record. */
|
|
746
|
+
function preparedTrellisEventToOutboxRecord(event) {
|
|
747
|
+
return {
|
|
748
|
+
id: event.headers["Nats-Msg-Id"] ?? event.header.id,
|
|
749
|
+
kind: "event.publish",
|
|
750
|
+
name: event.event,
|
|
751
|
+
subject: event.subject,
|
|
752
|
+
payload: event.encodedPayload,
|
|
753
|
+
headers: event.headers,
|
|
754
|
+
};
|
|
755
|
+
}
|
|
756
|
+
function eventHeaderFromMessage(headers) {
|
|
757
|
+
const id = headers["Nats-Msg-Id"] ?? headers["nats-msg-id"];
|
|
758
|
+
const time = headers["Trellis-Event-Time"] ?? headers["trellis-event-time"];
|
|
759
|
+
return {
|
|
760
|
+
id: typeof id === "string" ? id : "",
|
|
761
|
+
time: typeof time === "string" ? time : new Date(0).toISOString(),
|
|
762
|
+
};
|
|
612
763
|
}
|
|
613
764
|
function rowToOutboxMessage(row) {
|
|
614
765
|
return {
|
|
615
766
|
id: stringField(row, "id"),
|
|
616
|
-
|
|
767
|
+
kind: kindField(row, "kind"),
|
|
768
|
+
name: stringField(row, "name"),
|
|
617
769
|
subject: stringField(row, "subject"),
|
|
618
770
|
payload: stringField(row, "payload"),
|
|
619
771
|
headers: parseHeaders(row["headers"]),
|
|
@@ -623,12 +775,14 @@ function rowToOutboxMessage(row) {
|
|
|
623
775
|
updatedAt: stringField(row, "updated_at"),
|
|
624
776
|
nextAttemptAt: optionalStringField(row, "next_attempt_at"),
|
|
625
777
|
lastError: optionalStringField(row, "last_error"),
|
|
778
|
+
outcome: optionalStringField(row, "outcome"),
|
|
626
779
|
};
|
|
627
780
|
}
|
|
628
781
|
function kvRecordToOutboxMessage(record) {
|
|
629
782
|
return {
|
|
630
783
|
id: record.id,
|
|
631
|
-
|
|
784
|
+
kind: record.kind,
|
|
785
|
+
name: record.name,
|
|
632
786
|
subject: record.subject,
|
|
633
787
|
payload: record.payload,
|
|
634
788
|
headers: { ...record.headers },
|
|
@@ -638,6 +792,7 @@ function kvRecordToOutboxMessage(record) {
|
|
|
638
792
|
updatedAt: record.updatedAt,
|
|
639
793
|
nextAttemptAt: record.nextAttemptAt,
|
|
640
794
|
lastError: record.lastError,
|
|
795
|
+
outcome: record.outcome,
|
|
641
796
|
};
|
|
642
797
|
}
|
|
643
798
|
function placeholder(dialect, index) {
|
|
@@ -692,6 +847,14 @@ function numberField(row, field) {
|
|
|
692
847
|
}
|
|
693
848
|
return value;
|
|
694
849
|
}
|
|
850
|
+
function kindField(row, field) {
|
|
851
|
+
const value = stringField(row, field);
|
|
852
|
+
if (value === "event.publish" || value === "job.create" ||
|
|
853
|
+
value === "job.submit") {
|
|
854
|
+
return value;
|
|
855
|
+
}
|
|
856
|
+
throw new Error(`Expected SQL field ${field} to be an outbox record kind`);
|
|
857
|
+
}
|
|
695
858
|
function stateField(row, field) {
|
|
696
859
|
const value = stringField(row, field);
|
|
697
860
|
if (value === "pending" || value === "dispatched" || value === "failed") {
|
|
@@ -20,8 +20,63 @@ export type TrellisErrorMetricAttributes = {
|
|
|
20
20
|
/** Static messaging operation name, when already known. */
|
|
21
21
|
messagingOperation?: string;
|
|
22
22
|
};
|
|
23
|
+
/** Duration metric names accepted by {@link recordTrellisDuration}. */
|
|
24
|
+
export type TrellisDurationMetricName = "trellis.connect.duration" | "trellis.auth.flow.duration" | "trellis.auth.approval_resolution.duration" | "trellis.auth.callout.duration" | "trellis.admin.workflow.duration" | "trellis.contract.analysis.duration";
|
|
25
|
+
/** Low-cardinality attributes accepted by {@link recordTrellisDuration}. */
|
|
26
|
+
export type TrellisDurationMetricAttributes = {
|
|
27
|
+
/** Stable Trellis surface name, such as `rpc`, `jobs`, or `operations`. */
|
|
28
|
+
surface?: string;
|
|
29
|
+
/** Stable operation kind or method name. Do not pass IDs, subjects, or URLs. */
|
|
30
|
+
operation?: string;
|
|
31
|
+
/** Stable lifecycle phase such as `bootstrap`, `encode`, or `total`. */
|
|
32
|
+
phase?: string;
|
|
33
|
+
/** Stable outcome label such as `ok` or `error`. */
|
|
34
|
+
outcome?: string;
|
|
35
|
+
/** Participant kind such as `admin`, `client`, `service`, or `device`. */
|
|
36
|
+
participantKind?: string;
|
|
37
|
+
/** Session kind such as `user`, `service`, or `device`. */
|
|
38
|
+
sessionKind?: string;
|
|
39
|
+
/** Auth flow such as `local`, `oauth`, `device`, or `bootstrap`. */
|
|
40
|
+
authFlow?: string;
|
|
41
|
+
/** Auth approval outcome such as `approved`, `denied`, `required`, or `none`. */
|
|
42
|
+
authApproval?: string;
|
|
43
|
+
/** Whether a deployment authority is present. */
|
|
44
|
+
authorityPresent?: boolean;
|
|
45
|
+
/** Plan classification such as `install`, `update`, `migration`, `noop`, or `unknown`. */
|
|
46
|
+
planClassification?: string;
|
|
47
|
+
/** Contract kind such as `app`, `service`, `device`, `builtin`, or `unknown`. */
|
|
48
|
+
contractKind?: string;
|
|
49
|
+
/** Static messaging system name, when already known. */
|
|
50
|
+
messagingSystem?: string;
|
|
51
|
+
/** Static messaging operation name, when already known. */
|
|
52
|
+
messagingOperation?: string;
|
|
53
|
+
};
|
|
23
54
|
/** Returns the shared Trellis OpenTelemetry meter. */
|
|
24
55
|
export declare function getTrellisMeter(): Meter;
|
|
25
56
|
/** Records one Trellis error with only stable, low-cardinality attributes. */
|
|
26
57
|
export declare function recordTrellisError(error: unknown, attributes?: TrellisErrorMetricAttributes): void;
|
|
58
|
+
/**
|
|
59
|
+
* Records one duration measurement on the given Trellis histogram.
|
|
60
|
+
*
|
|
61
|
+
* Converts `durationMs` to seconds. Negative, NaN, and infinite values are
|
|
62
|
+
* silently ignored.
|
|
63
|
+
*
|
|
64
|
+
* Histogram instruments are cached by metric name so `createHistogram` is
|
|
65
|
+
* called at most once per metric name.
|
|
66
|
+
*
|
|
67
|
+
* @param name - The duration metric name.
|
|
68
|
+
* @param durationMs - The measured duration in milliseconds.
|
|
69
|
+
* @param attributes - Optional low-cardinality attributes. Only values that
|
|
70
|
+
* pass sanitization are included.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```ts
|
|
74
|
+
* recordTrellisDuration("trellis.connect.duration", 42.5, {
|
|
75
|
+
* phase: "nats_connect",
|
|
76
|
+
* outcome: "ok",
|
|
77
|
+
* participantKind: "client",
|
|
78
|
+
* });
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare function recordTrellisDuration(name: TrellisDurationMetricName, durationMs: number, attributes?: TrellisDurationMetricAttributes): void;
|
|
27
82
|
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,KAAK,EAAW,MAAM,oBAAoB,CAAC;AAiDzE,yEAAyE;AACzE,MAAM,MAAM,4BAA4B,GAAG;IACzC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,uEAAuE;AACvE,MAAM,MAAM,yBAAyB,GACjC,0BAA0B,GAC1B,4BAA4B,GAC5B,2CAA2C,GAC3C,+BAA+B,GAC/B,iCAAiC,GACjC,oCAAoC,CAAC;AAEzC,4EAA4E;AAC5E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0FAA0F;IAC1F,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAWF,sDAAsD;AACtD,wBAAgB,eAAe,IAAI,KAAK,CAEvC;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,UAAU,GAAE,4BAAiC,GAC5C,IAAI,CAWN;AAsJD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,yBAAyB,EAC/B,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,+BAA+B,GAC3C,IAAI,CAaN"}
|