@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
|
@@ -9,12 +9,14 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _JobManager_instances, _JobManager_context, _JobManager_meta, _JobManager_getQueueBinding, _JobManager_publishJobEvent;
|
|
12
|
+
var _JobManager_instances, _JobManager_context, _JobManager_meta, _JobManager_getQueueBinding, _JobManager_publishJobEvent, _JobManager_submit, _JobManager_submitPrepared, _JobManager_admitKeyedCreate, _JobManager_removeQueuedKeyedReservation, _JobManager_restoreReplacedKeyedReservation, _JobManager_publishSkipped, _JobManager_keyedHeartbeat, _JobManager_releaseKeyedSlot, _JobManager_releaseKeyedSlotAfterPublishFailure, _JobManager_publishStaleCompletionIgnored;
|
|
13
13
|
import { headers as natsHeaders } from "@nats-io/nats-core";
|
|
14
14
|
import { ulid } from "ulid";
|
|
15
15
|
import { createMapCarrier, injectTraceContext, } from "../../telemetry/carrier.js";
|
|
16
16
|
import { recordTrellisError } from "../../telemetry/mod.js";
|
|
17
|
+
import { JobNotEnqueuedError } from "../../jobs.js";
|
|
17
18
|
import { ActiveJob, ActiveJobRuntimeError, JobCancellationToken, } from "./active-job.js";
|
|
19
|
+
import { normalizeJobKeyPolicy } from "./key-coordinator.js";
|
|
18
20
|
export class JobProcessError extends Error {
|
|
19
21
|
constructor(kind, message) {
|
|
20
22
|
super(message);
|
|
@@ -41,41 +43,83 @@ export class JobManager {
|
|
|
41
43
|
__classPrivateFieldSet(this, _JobManager_context, context, "f");
|
|
42
44
|
}
|
|
43
45
|
async create(type, payload) {
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
await __classPrivateFieldGet(this, _JobManager_instances, "m",
|
|
78
|
-
|
|
46
|
+
const outcome = await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_submit).call(this, type, payload, true);
|
|
47
|
+
if (outcome.kind === "accepted") {
|
|
48
|
+
return outcome.job;
|
|
49
|
+
}
|
|
50
|
+
if (outcome.kind === "coalesced") {
|
|
51
|
+
throw new JobNotEnqueuedError({
|
|
52
|
+
reason: "coalesced",
|
|
53
|
+
key: outcome.key,
|
|
54
|
+
active: 0,
|
|
55
|
+
queued: 1,
|
|
56
|
+
limit: 0,
|
|
57
|
+
existingJobId: outcome.existing.id,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (outcome.kind === "replaced") {
|
|
61
|
+
throw new JobNotEnqueuedError({
|
|
62
|
+
reason: "queue-depth",
|
|
63
|
+
key: outcome.key,
|
|
64
|
+
active: 0,
|
|
65
|
+
queued: 1,
|
|
66
|
+
limit: 0,
|
|
67
|
+
existingJobId: outcome.replaced.id,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
throw new JobNotEnqueuedError({
|
|
71
|
+
reason: outcome.reason,
|
|
72
|
+
key: outcome.key,
|
|
73
|
+
active: outcome.active,
|
|
74
|
+
queued: outcome.queued,
|
|
75
|
+
limit: outcome.limit,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async submit(type, payload) {
|
|
79
|
+
return await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_submit).call(this, type, payload, false);
|
|
80
|
+
}
|
|
81
|
+
async createPrepared(submission) {
|
|
82
|
+
const outcome = await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_submitPrepared).call(this, submission, true, true);
|
|
83
|
+
if (outcome.kind === "accepted") {
|
|
84
|
+
return outcome.job;
|
|
85
|
+
}
|
|
86
|
+
if (outcome.kind === "coalesced") {
|
|
87
|
+
throw new JobNotEnqueuedError({
|
|
88
|
+
reason: "coalesced",
|
|
89
|
+
key: outcome.key,
|
|
90
|
+
active: 0,
|
|
91
|
+
queued: 1,
|
|
92
|
+
limit: 0,
|
|
93
|
+
existingJobId: outcome.existing.id,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
if (outcome.kind === "replaced") {
|
|
97
|
+
throw new JobNotEnqueuedError({
|
|
98
|
+
reason: "queue-depth",
|
|
99
|
+
key: outcome.key,
|
|
100
|
+
active: 0,
|
|
101
|
+
queued: 1,
|
|
102
|
+
limit: 0,
|
|
103
|
+
existingJobId: outcome.replaced.id,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
throw new JobNotEnqueuedError({
|
|
107
|
+
reason: outcome.reason,
|
|
108
|
+
key: outcome.key,
|
|
109
|
+
active: outcome.active,
|
|
110
|
+
queued: outcome.queued,
|
|
111
|
+
limit: outcome.limit,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async submitPrepared(submission) {
|
|
115
|
+
return await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_submitPrepared).call(this, submission, false, true);
|
|
116
|
+
}
|
|
117
|
+
async cleanupQueuedKeyedJob(job) {
|
|
118
|
+
const queue = __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_getQueueBinding).call(this, job.type);
|
|
119
|
+
const keyedPolicy = getKeyPolicy(queue);
|
|
120
|
+
if (!keyedPolicy)
|
|
121
|
+
return;
|
|
122
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_removeQueuedKeyedReservation).call(this, job, keyedPolicy);
|
|
79
123
|
}
|
|
80
124
|
process(job, cancellation, handler, metadata = {}, validation = {}) {
|
|
81
125
|
return this.processWithHeartbeat(job, cancellation, () => {
|
|
@@ -83,25 +127,78 @@ export class JobManager {
|
|
|
83
127
|
}, handler, metadata, validation);
|
|
84
128
|
}
|
|
85
129
|
async processWithHeartbeat(job, cancellation, heartbeat, handler, metadata = {}, validation = {}) {
|
|
86
|
-
__classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_getQueueBinding).call(this, job.type);
|
|
87
130
|
const tries = job.tries + 1;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
131
|
+
const queue = __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_getQueueBinding).call(this, job.type);
|
|
132
|
+
const keyedPolicy = getKeyPolicy(queue);
|
|
133
|
+
let lease;
|
|
134
|
+
let staleSlots = [];
|
|
135
|
+
if (keyedPolicy) {
|
|
136
|
+
const coordinator = __classPrivateFieldGet(this, _JobManager_context, "f").keyCoordinator;
|
|
137
|
+
if (!coordinator) {
|
|
138
|
+
throw new Error(`Keyed jobs queue '${job.type}' requires the JOBS_KEYS coordinator`);
|
|
139
|
+
}
|
|
140
|
+
const acquired = await coordinator.acquireActiveSlot({
|
|
141
|
+
service: job.service,
|
|
142
|
+
jobType: job.type,
|
|
143
|
+
jobId: job.id,
|
|
144
|
+
payload: job.payload,
|
|
145
|
+
context: job.context,
|
|
146
|
+
lifecycleState: metadata.latestState ?? job.state,
|
|
147
|
+
tries,
|
|
148
|
+
instanceId: metadata.instanceId ?? "unknown",
|
|
149
|
+
now: __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_meta).call(this).nowIso(),
|
|
150
|
+
policy: keyedPolicy,
|
|
151
|
+
});
|
|
152
|
+
if (acquired.kind === "blocked") {
|
|
153
|
+
return { outcome: "deferred", tries, reason: acquired.reason };
|
|
154
|
+
}
|
|
155
|
+
lease = {
|
|
156
|
+
key: acquired.key,
|
|
157
|
+
keyHash: acquired.keyHash,
|
|
158
|
+
slotToken: acquired.slotToken,
|
|
159
|
+
policy: keyedPolicy,
|
|
160
|
+
};
|
|
161
|
+
staleSlots = acquired.stale;
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
for (const stale of staleSlots) {
|
|
165
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishJobEvent).call(this, job.type, stale.jobId, {
|
|
166
|
+
jobId: stale.jobId,
|
|
167
|
+
service: job.service,
|
|
168
|
+
jobType: job.type,
|
|
169
|
+
eventType: "stale",
|
|
170
|
+
state: "stale",
|
|
171
|
+
previousState: "active",
|
|
172
|
+
context: stale.context,
|
|
173
|
+
tries: stale.tries,
|
|
174
|
+
error: "keyed job lease expired",
|
|
175
|
+
timestamp: __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_meta).call(this).nowIso(),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishJobEvent).call(this, job.type, job.id, {
|
|
179
|
+
jobId: job.id,
|
|
180
|
+
service: job.service,
|
|
181
|
+
jobType: job.type,
|
|
182
|
+
eventType: "started",
|
|
183
|
+
state: "active",
|
|
184
|
+
previousState: job.state,
|
|
185
|
+
context: job.context,
|
|
186
|
+
tries,
|
|
187
|
+
timestamp: __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_meta).call(this).nowIso(),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_releaseKeyedSlotAfterPublishFailure).call(this, job, lease, error);
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
99
194
|
try {
|
|
100
|
-
const result = await this.withActiveJobAndHeartbeat({ ...job, state: "active", tries }, cancellation, heartbeat, handler, metadata);
|
|
195
|
+
const result = await this.withActiveJobAndHeartbeat({ ...job, state: "active", tries }, cancellation, lease ? __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_keyedHeartbeat).call(this, job, lease, heartbeat) : heartbeat, handler, metadata, lease);
|
|
101
196
|
if (cancellation.isHostShutdown()) {
|
|
197
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_releaseKeyedSlot).call(this, job, lease);
|
|
102
198
|
return { outcome: "interrupted", tries };
|
|
103
199
|
}
|
|
104
200
|
if (cancellation.isCancelled()) {
|
|
201
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_releaseKeyedSlot).call(this, job, lease);
|
|
105
202
|
return { outcome: "cancelled", tries };
|
|
106
203
|
}
|
|
107
204
|
try {
|
|
@@ -114,6 +211,11 @@ export class JobManager {
|
|
|
114
211
|
catch (error) {
|
|
115
212
|
throw JobProcessError.failed(error instanceof Error ? error.message : String(error));
|
|
116
213
|
}
|
|
214
|
+
const release = await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_releaseKeyedSlot).call(this, job, lease);
|
|
215
|
+
if (release === "staleCompletion") {
|
|
216
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishStaleCompletionIgnored).call(this, job, tries);
|
|
217
|
+
return { outcome: "stale_completion_ignored", tries };
|
|
218
|
+
}
|
|
117
219
|
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishJobEvent).call(this, job.type, job.id, {
|
|
118
220
|
jobId: job.id,
|
|
119
221
|
service: job.service,
|
|
@@ -130,9 +232,11 @@ export class JobManager {
|
|
|
130
232
|
}
|
|
131
233
|
catch (error) {
|
|
132
234
|
if (cancellation.isHostShutdown()) {
|
|
235
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_releaseKeyedSlot).call(this, job, lease);
|
|
133
236
|
return { outcome: "interrupted", tries };
|
|
134
237
|
}
|
|
135
238
|
if (cancellation.isCancelled()) {
|
|
239
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_releaseKeyedSlot).call(this, job, lease);
|
|
136
240
|
return { outcome: "cancelled", tries };
|
|
137
241
|
}
|
|
138
242
|
if (error instanceof JobProcessError) {
|
|
@@ -144,6 +248,11 @@ export class JobManager {
|
|
|
144
248
|
operation: job.type,
|
|
145
249
|
phase: "handler_result",
|
|
146
250
|
});
|
|
251
|
+
const release = await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_releaseKeyedSlot).call(this, job, lease);
|
|
252
|
+
if (release === "staleCompletion") {
|
|
253
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishStaleCompletionIgnored).call(this, job, tries);
|
|
254
|
+
return { outcome: "stale_completion_ignored", tries };
|
|
255
|
+
}
|
|
147
256
|
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishJobEvent).call(this, job.type, job.id, {
|
|
148
257
|
jobId: job.id,
|
|
149
258
|
service: job.service,
|
|
@@ -164,6 +273,11 @@ export class JobManager {
|
|
|
164
273
|
operation: job.type,
|
|
165
274
|
phase: "handler_result",
|
|
166
275
|
});
|
|
276
|
+
const release = await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_releaseKeyedSlot).call(this, job, lease);
|
|
277
|
+
if (release === "staleCompletion") {
|
|
278
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishStaleCompletionIgnored).call(this, job, tries);
|
|
279
|
+
return { outcome: "stale_completion_ignored", tries };
|
|
280
|
+
}
|
|
167
281
|
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishJobEvent).call(this, job.type, job.id, {
|
|
168
282
|
jobId: job.id,
|
|
169
283
|
service: job.service,
|
|
@@ -234,7 +348,10 @@ export class JobManager {
|
|
|
234
348
|
throw new ActiveJobRuntimeError("worker heartbeat unavailable");
|
|
235
349
|
}, f, metadata);
|
|
236
350
|
}
|
|
237
|
-
async withActiveJobAndHeartbeat(job, cancellation, heartbeat, f, metadata = {}) {
|
|
351
|
+
async withActiveJobAndHeartbeat(job, cancellation, heartbeat, f, metadata = {}, lease) {
|
|
352
|
+
const stopAutoHeartbeat = lease
|
|
353
|
+
? startAutoHeartbeat(heartbeat, lease.policy.heartbeatIntervalMs)
|
|
354
|
+
: () => { };
|
|
238
355
|
const activeJob = new ActiveJob(job, cancellation, {
|
|
239
356
|
updateProgress: (progress) => this.emitProgress(job, progress),
|
|
240
357
|
log: (entry) => this.emitLog(job, entry),
|
|
@@ -252,7 +369,12 @@ export class JobManager {
|
|
|
252
369
|
}, {
|
|
253
370
|
redeliveryCount: metadata.redeliveryCount ?? 0,
|
|
254
371
|
});
|
|
255
|
-
|
|
372
|
+
try {
|
|
373
|
+
return await f(activeJob);
|
|
374
|
+
}
|
|
375
|
+
finally {
|
|
376
|
+
stopAutoHeartbeat();
|
|
377
|
+
}
|
|
256
378
|
}
|
|
257
379
|
}
|
|
258
380
|
_JobManager_context = new WeakMap(), _JobManager_instances = new WeakSet(), _JobManager_meta = function _JobManager_meta() {
|
|
@@ -266,9 +388,9 @@ _JobManager_context = new WeakMap(), _JobManager_instances = new WeakSet(), _Job
|
|
|
266
388
|
throw new Error(`Missing jobs binding for queue '${type}'`);
|
|
267
389
|
}
|
|
268
390
|
return binding;
|
|
269
|
-
}, _JobManager_publishJobEvent = async function _JobManager_publishJobEvent(type, jobId, event) {
|
|
391
|
+
}, _JobManager_publishJobEvent = async function _JobManager_publishJobEvent(type, jobId, event, stableMessageId) {
|
|
270
392
|
const binding = __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_getQueueBinding).call(this, type);
|
|
271
|
-
const headers = headersFromJobContext(event.context);
|
|
393
|
+
const headers = headersFromJobContext(event.context, stableMessageId);
|
|
272
394
|
try {
|
|
273
395
|
await __classPrivateFieldGet(this, _JobManager_context, "f").nc.publish(`${binding.publishPrefix}.${jobId}.${event.eventType}`, new TextEncoder().encode(JSON.stringify(event)), { headers });
|
|
274
396
|
}
|
|
@@ -282,7 +404,256 @@ _JobManager_context = new WeakMap(), _JobManager_instances = new WeakSet(), _Job
|
|
|
282
404
|
});
|
|
283
405
|
throw error;
|
|
284
406
|
}
|
|
407
|
+
}, _JobManager_submit = async function _JobManager_submit(type, payload, strictCreate) {
|
|
408
|
+
const meta = __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_meta).call(this);
|
|
409
|
+
const now = meta.nowIso();
|
|
410
|
+
const id = meta.nextJobId();
|
|
411
|
+
const context = createJobContext();
|
|
412
|
+
const namespace = __classPrivateFieldGet(this, _JobManager_context, "f").jobs.namespace;
|
|
413
|
+
const submission = {
|
|
414
|
+
submissionId: id,
|
|
415
|
+
mode: strictCreate ? "create" : "submit",
|
|
416
|
+
service: namespace,
|
|
417
|
+
queue: type,
|
|
418
|
+
jobId: id,
|
|
419
|
+
payload,
|
|
420
|
+
createdAt: now,
|
|
421
|
+
context,
|
|
422
|
+
};
|
|
423
|
+
return await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_submitPrepared).call(this, submission, strictCreate);
|
|
424
|
+
}, _JobManager_submitPrepared = async function _JobManager_submitPrepared(submission, strictCreate, stableMessageIds) {
|
|
425
|
+
const { queue: type, jobId: id, createdAt: now, context, service, payload, } = submission;
|
|
426
|
+
const binding = __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_getQueueBinding).call(this, type);
|
|
427
|
+
const deadline = computeDeadline(now, binding.defaultDeadlineMs);
|
|
428
|
+
const job = {
|
|
429
|
+
id,
|
|
430
|
+
service,
|
|
431
|
+
type,
|
|
432
|
+
state: "pending",
|
|
433
|
+
context,
|
|
434
|
+
payload,
|
|
435
|
+
createdAt: now,
|
|
436
|
+
updatedAt: now,
|
|
437
|
+
tries: 0,
|
|
438
|
+
maxTries: binding.maxDeliver,
|
|
439
|
+
...(deadline ? { deadline } : {}),
|
|
440
|
+
};
|
|
441
|
+
const event = {
|
|
442
|
+
jobId: id,
|
|
443
|
+
service,
|
|
444
|
+
jobType: type,
|
|
445
|
+
eventType: "created",
|
|
446
|
+
state: "pending",
|
|
447
|
+
context,
|
|
448
|
+
tries: 0,
|
|
449
|
+
maxTries: binding.maxDeliver,
|
|
450
|
+
payload,
|
|
451
|
+
...(deadline ? { deadline } : {}),
|
|
452
|
+
timestamp: now,
|
|
453
|
+
};
|
|
454
|
+
const keyedPolicy = getKeyPolicy(binding);
|
|
455
|
+
if (keyedPolicy) {
|
|
456
|
+
const admission = await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_admitKeyedCreate).call(this, {
|
|
457
|
+
type,
|
|
458
|
+
job,
|
|
459
|
+
event,
|
|
460
|
+
policy: keyedPolicy,
|
|
461
|
+
strictCreate,
|
|
462
|
+
submissionId: submission.submissionId,
|
|
463
|
+
});
|
|
464
|
+
if (admission.kind !== "accepted" && admission.kind !== "replaced") {
|
|
465
|
+
return admission;
|
|
466
|
+
}
|
|
467
|
+
if (strictCreate && admission.kind === "replaced") {
|
|
468
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_restoreReplacedKeyedReservation).call(this, job, admission.replaced, keyedPolicy, submission.submissionId);
|
|
469
|
+
return {
|
|
470
|
+
kind: "rejected",
|
|
471
|
+
key: admission.key,
|
|
472
|
+
reason: "queue-depth",
|
|
473
|
+
active: admission.state.active.length,
|
|
474
|
+
queued: admission.state.queued.length,
|
|
475
|
+
limit: keyedPolicy.queue.maxQueuedPerKey,
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
if (admission.kind === "replaced") {
|
|
479
|
+
try {
|
|
480
|
+
const skippedMsgId = stableMessageIds
|
|
481
|
+
? `trellis-job-skipped:${submission.submissionId}:${admission.replaced.id}`
|
|
482
|
+
: undefined;
|
|
483
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishSkipped).call(this, type, admission.replaced, now, skippedMsgId);
|
|
484
|
+
}
|
|
485
|
+
catch (error) {
|
|
486
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_restoreReplacedKeyedReservation).call(this, job, admission.replaced, keyedPolicy, submission.submissionId);
|
|
487
|
+
throw error;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
try {
|
|
491
|
+
const createdMsgId = stableMessageIds
|
|
492
|
+
? `trellis-job-created:${submission.submissionId}`
|
|
493
|
+
: undefined;
|
|
494
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishJobEvent).call(this, type, id, event, createdMsgId);
|
|
495
|
+
}
|
|
496
|
+
catch (error) {
|
|
497
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_removeQueuedKeyedReservation).call(this, job, keyedPolicy);
|
|
498
|
+
throw error;
|
|
499
|
+
}
|
|
500
|
+
if (admission.kind === "replaced") {
|
|
501
|
+
return {
|
|
502
|
+
kind: "replaced",
|
|
503
|
+
key: admission.key,
|
|
504
|
+
replaced: {
|
|
505
|
+
service: admission.replaced.service,
|
|
506
|
+
jobType: admission.replaced.jobType,
|
|
507
|
+
id: admission.replaced.id,
|
|
508
|
+
},
|
|
509
|
+
job,
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
return { kind: "accepted", job, key: admission.key };
|
|
513
|
+
}
|
|
514
|
+
const createdMsgId = stableMessageIds
|
|
515
|
+
? `trellis-job-created:${submission.submissionId}`
|
|
516
|
+
: undefined;
|
|
517
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishJobEvent).call(this, type, id, event, createdMsgId);
|
|
518
|
+
return { kind: "accepted", job };
|
|
519
|
+
}, _JobManager_admitKeyedCreate = async function _JobManager_admitKeyedCreate(args) {
|
|
520
|
+
const coordinator = __classPrivateFieldGet(this, _JobManager_context, "f").keyCoordinator;
|
|
521
|
+
if (!coordinator) {
|
|
522
|
+
throw new Error(`Keyed jobs queue '${args.type}' requires the JOBS_KEYS coordinator`);
|
|
523
|
+
}
|
|
524
|
+
return await coordinator.admitCreate({
|
|
525
|
+
service: args.job.service,
|
|
526
|
+
jobType: args.type,
|
|
527
|
+
jobId: args.job.id,
|
|
528
|
+
payload: args.job.payload,
|
|
529
|
+
context: args.event.context,
|
|
530
|
+
createdAt: args.event.timestamp,
|
|
531
|
+
policy: args.policy,
|
|
532
|
+
strictCreate: args.strictCreate,
|
|
533
|
+
...(args.submissionId ? { submissionId: args.submissionId } : {}),
|
|
534
|
+
});
|
|
535
|
+
}, _JobManager_removeQueuedKeyedReservation = async function _JobManager_removeQueuedKeyedReservation(job, policy) {
|
|
536
|
+
const coordinator = __classPrivateFieldGet(this, _JobManager_context, "f").keyCoordinator;
|
|
537
|
+
if (!coordinator)
|
|
538
|
+
return;
|
|
539
|
+
await coordinator.removeQueuedJob({
|
|
540
|
+
service: job.service,
|
|
541
|
+
jobType: job.type,
|
|
542
|
+
jobId: job.id,
|
|
543
|
+
payload: job.payload,
|
|
544
|
+
now: __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_meta).call(this).nowIso(),
|
|
545
|
+
policy,
|
|
546
|
+
});
|
|
547
|
+
}, _JobManager_restoreReplacedKeyedReservation = async function _JobManager_restoreReplacedKeyedReservation(job, replaced, policy, submissionId) {
|
|
548
|
+
const coordinator = __classPrivateFieldGet(this, _JobManager_context, "f").keyCoordinator;
|
|
549
|
+
if (!coordinator)
|
|
550
|
+
return;
|
|
551
|
+
await coordinator.restoreReplacedQueuedJob({
|
|
552
|
+
service: job.service,
|
|
553
|
+
jobType: job.type,
|
|
554
|
+
replacementJobId: job.id,
|
|
555
|
+
replaced,
|
|
556
|
+
payload: job.payload,
|
|
557
|
+
now: __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_meta).call(this).nowIso(),
|
|
558
|
+
policy,
|
|
559
|
+
...(submissionId ? { submissionId } : {}),
|
|
560
|
+
});
|
|
561
|
+
}, _JobManager_publishSkipped = async function _JobManager_publishSkipped(type, replaced, timestamp, stableMessageId) {
|
|
562
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishJobEvent).call(this, type, replaced.id, {
|
|
563
|
+
jobId: replaced.id,
|
|
564
|
+
service: __classPrivateFieldGet(this, _JobManager_context, "f").jobs.namespace,
|
|
565
|
+
jobType: type,
|
|
566
|
+
eventType: "skipped",
|
|
567
|
+
state: "skipped",
|
|
568
|
+
previousState: "pending",
|
|
569
|
+
context: replaced.context,
|
|
570
|
+
tries: 0,
|
|
571
|
+
error: "replaced by newer keyed job",
|
|
572
|
+
timestamp,
|
|
573
|
+
}, stableMessageId);
|
|
574
|
+
}, _JobManager_keyedHeartbeat = function _JobManager_keyedHeartbeat(job, lease, heartbeat) {
|
|
575
|
+
return async () => {
|
|
576
|
+
await heartbeat();
|
|
577
|
+
const renewed = await __classPrivateFieldGet(this, _JobManager_context, "f").keyCoordinator.renewHeartbeat({
|
|
578
|
+
service: job.service,
|
|
579
|
+
jobType: job.type,
|
|
580
|
+
jobId: job.id,
|
|
581
|
+
lease,
|
|
582
|
+
now: __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_meta).call(this).nowIso(),
|
|
583
|
+
});
|
|
584
|
+
if (renewed.kind === "lost") {
|
|
585
|
+
recordTrellisError(new ActiveJobRuntimeError("keyed job slot lease was lost"), {
|
|
586
|
+
surface: "job",
|
|
587
|
+
direction: "worker",
|
|
588
|
+
operation: job.type,
|
|
589
|
+
phase: "heartbeat",
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
};
|
|
593
|
+
}, _JobManager_releaseKeyedSlot = async function _JobManager_releaseKeyedSlot(job, lease) {
|
|
594
|
+
if (!lease)
|
|
595
|
+
return undefined;
|
|
596
|
+
const released = await __classPrivateFieldGet(this, _JobManager_context, "f").keyCoordinator.releaseActiveSlot({
|
|
597
|
+
service: job.service,
|
|
598
|
+
jobType: job.type,
|
|
599
|
+
jobId: job.id,
|
|
600
|
+
lease,
|
|
601
|
+
now: __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_meta).call(this).nowIso(),
|
|
602
|
+
});
|
|
603
|
+
return released.kind === "released" ? "released" : "staleCompletion";
|
|
604
|
+
}, _JobManager_releaseKeyedSlotAfterPublishFailure = async function _JobManager_releaseKeyedSlotAfterPublishFailure(job, lease, publishError) {
|
|
605
|
+
try {
|
|
606
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_releaseKeyedSlot).call(this, job, lease);
|
|
607
|
+
}
|
|
608
|
+
catch (cleanupError) {
|
|
609
|
+
recordTrellisError(cleanupError, {
|
|
610
|
+
surface: "job",
|
|
611
|
+
direction: "worker",
|
|
612
|
+
operation: job.type,
|
|
613
|
+
phase: "keyed_slot_cleanup",
|
|
614
|
+
});
|
|
615
|
+
recordTrellisError(publishError, {
|
|
616
|
+
surface: "job",
|
|
617
|
+
direction: "worker",
|
|
618
|
+
operation: job.type,
|
|
619
|
+
phase: "publish",
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
}, _JobManager_publishStaleCompletionIgnored = async function _JobManager_publishStaleCompletionIgnored(job, tries) {
|
|
623
|
+
await __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_publishJobEvent).call(this, job.type, job.id, {
|
|
624
|
+
jobId: job.id,
|
|
625
|
+
service: job.service,
|
|
626
|
+
jobType: job.type,
|
|
627
|
+
eventType: "staleCompletionIgnored",
|
|
628
|
+
state: "stale",
|
|
629
|
+
previousState: "active",
|
|
630
|
+
context: job.context,
|
|
631
|
+
tries,
|
|
632
|
+
error: "keyed job slot lease was lost before completion",
|
|
633
|
+
timestamp: __classPrivateFieldGet(this, _JobManager_instances, "m", _JobManager_meta).call(this).nowIso(),
|
|
634
|
+
});
|
|
285
635
|
};
|
|
636
|
+
function getKeyPolicy(binding) {
|
|
637
|
+
if (!binding.keyConcurrency) {
|
|
638
|
+
return undefined;
|
|
639
|
+
}
|
|
640
|
+
return normalizeJobKeyPolicy({
|
|
641
|
+
keyConcurrency: binding.keyConcurrency,
|
|
642
|
+
queue: binding.queue,
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
function startAutoHeartbeat(heartbeat, intervalMs) {
|
|
646
|
+
const timer = setInterval(() => {
|
|
647
|
+
void heartbeat().catch((error) => {
|
|
648
|
+
recordTrellisError(error, {
|
|
649
|
+
surface: "job",
|
|
650
|
+
direction: "worker",
|
|
651
|
+
phase: "heartbeat",
|
|
652
|
+
});
|
|
653
|
+
});
|
|
654
|
+
}, intervalMs);
|
|
655
|
+
return () => clearInterval(timer);
|
|
656
|
+
}
|
|
286
657
|
function computeDeadline(now, deadlineMs) {
|
|
287
658
|
if (deadlineMs === undefined) {
|
|
288
659
|
return undefined;
|
|
@@ -291,7 +662,7 @@ function computeDeadline(now, deadlineMs) {
|
|
|
291
662
|
timestamp.setTime(timestamp.getTime() + deadlineMs);
|
|
292
663
|
return timestamp.toISOString();
|
|
293
664
|
}
|
|
294
|
-
function createJobContext() {
|
|
665
|
+
export function createJobContext() {
|
|
295
666
|
const carrier = createMapCarrier();
|
|
296
667
|
injectTraceContext(carrier);
|
|
297
668
|
const inheritedTraceparent = carrier.get("traceparent");
|
|
@@ -306,13 +677,16 @@ function createJobContext() {
|
|
|
306
677
|
...(tracestate ? { tracestate } : {}),
|
|
307
678
|
};
|
|
308
679
|
}
|
|
309
|
-
function headersFromJobContext(context) {
|
|
680
|
+
function headersFromJobContext(context, stableMessageId) {
|
|
310
681
|
const headers = natsHeaders();
|
|
311
682
|
headers.set("request-id", context.requestId);
|
|
312
683
|
headers.set("traceparent", context.traceparent);
|
|
313
684
|
if (context.tracestate) {
|
|
314
685
|
headers.set("tracestate", context.tracestate);
|
|
315
686
|
}
|
|
687
|
+
if (stableMessageId) {
|
|
688
|
+
headers.set("Nats-Msg-Id", stableMessageId);
|
|
689
|
+
}
|
|
316
690
|
return headers;
|
|
317
691
|
}
|
|
318
692
|
function isValidTraceparent(value) {
|