@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
package/esm/server/service.js
CHANGED
|
@@ -9,7 +9,7 @@ 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 _InternalStoreHandle_nc, _TrellisService_instances, _TrellisService_server, _TrellisService_nc, _TrellisService_handlerTrellis, _TrellisService_operationTransfer, _TrellisService_stopHealthPublishing, _TrellisService_managedJobWorkers,
|
|
12
|
+
var _InternalStoreHandle_nc, _TrellisService_instances, _TrellisService_server, _TrellisService_nc, _TrellisService_handlerTrellis, _TrellisService_operationTransfer, _TrellisService_stopHealthPublishing, _TrellisService_managedJobWorkers, _TrellisService_contractJobs, _TrellisService_jobsBinding, _TrellisService_ownedOutboxDispatchers, _TrellisService_waitPromise, _TrellisService_stopPromise, _TrellisService_createHandleFacade, _TrellisService_createSqlOutboxBinding, _TrellisService_createSqlOutbox, _TrellisService_operation;
|
|
13
13
|
import { headers as natsHeaders, jwtAuthenticator, } from "@nats-io/nats-core";
|
|
14
14
|
import { TypedKV } from "../kv.js";
|
|
15
15
|
import { TypedStore, } from "../store.js";
|
|
@@ -28,13 +28,72 @@ import { ServiceTransfer } from "./transfer.js";
|
|
|
28
28
|
import { logger as noopLogger } from "../globals.js";
|
|
29
29
|
import { DEFAULT_RUNTIME_MAX_RECONNECT_ATTEMPTS, DEFAULT_SERVICE_RUNTIME_WAIT_ON_FIRST_CONNECT, loadDefaultRuntimeTransport, selectRuntimeTransportServers, } from "../runtime_transport.js";
|
|
30
30
|
import { serverLogger } from "../server_logger.js";
|
|
31
|
-
import { TransportError, UnexpectedError, } from "../errors/index.js";
|
|
32
|
-
import { ActiveJob as PublicActiveJob, JobRef, JobWorkerHostAdapter, } from "../jobs.js";
|
|
33
|
-
import {
|
|
31
|
+
import { TransportError, UnexpectedError, ValidationError, } from "../errors/index.js";
|
|
32
|
+
import { ActiveJob as PublicActiveJob, JobNotEnqueuedError, JobRef, JobWorkerHostAdapter, } from "../jobs.js";
|
|
33
|
+
import { ulid } from "ulid";
|
|
34
|
+
import { createJobContext, JobManager as InternalJobManager, JobProcessError as InternalJobProcessError, } from "./internal_jobs/job-manager.js";
|
|
34
35
|
import { startNatsWorkerHostFromBinding } from "./internal_jobs/runtime-worker.js";
|
|
36
|
+
import { createNatsJobKeyCoordinator, normalizeJobKeyPolicy, } from "./internal_jobs/key-coordinator.js";
|
|
35
37
|
import { JobEventSchema, } from "./internal_jobs/types.js";
|
|
36
38
|
import { observeNatsTrellisConnection, } from "../connection.js";
|
|
37
39
|
import { initTelemetry } from "../telemetry/init.js";
|
|
40
|
+
import { recordTrellisDuration } from "../telemetry/mod.js";
|
|
41
|
+
import { defaultSqlOutboxTables, OutboxDispatcher, preparedTrellisEventToOutboxRecord, SqlOutboxRepository, } from "../service/outbox_inbox.js";
|
|
42
|
+
function normalizeResourceJobsBinding(binding) {
|
|
43
|
+
const queues = {};
|
|
44
|
+
for (const [name, queue] of Object.entries(binding.queues)) {
|
|
45
|
+
const baseQueue = baseJobsQueueBinding(queue);
|
|
46
|
+
if (!queue.keyConcurrency) {
|
|
47
|
+
queues[name] = {
|
|
48
|
+
...baseQueue,
|
|
49
|
+
...(queue.queue ? { queue: normalizeQueuePolicy(queue.queue) } : {}),
|
|
50
|
+
};
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const policy = normalizeJobKeyPolicy({
|
|
54
|
+
keyConcurrency: queue.keyConcurrency,
|
|
55
|
+
queue: queue.queue,
|
|
56
|
+
});
|
|
57
|
+
queues[name] = {
|
|
58
|
+
...baseQueue,
|
|
59
|
+
keyConcurrency: {
|
|
60
|
+
key: policy.key,
|
|
61
|
+
maxActive: policy.maxActive,
|
|
62
|
+
heartbeatIntervalMs: policy.heartbeatIntervalMs,
|
|
63
|
+
heartbeatTtlMs: policy.heartbeatTtlMs,
|
|
64
|
+
stalePolicy: policy.stalePolicy,
|
|
65
|
+
},
|
|
66
|
+
queue: policy.queue,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return { namespace: binding.namespace, queues };
|
|
70
|
+
}
|
|
71
|
+
function baseJobsQueueBinding(queue) {
|
|
72
|
+
return {
|
|
73
|
+
queueType: queue.queueType,
|
|
74
|
+
publishPrefix: queue.publishPrefix,
|
|
75
|
+
workSubject: queue.workSubject,
|
|
76
|
+
consumerName: queue.consumerName,
|
|
77
|
+
payload: queue.payload,
|
|
78
|
+
...(queue.result ? { result: queue.result } : {}),
|
|
79
|
+
maxDeliver: queue.maxDeliver,
|
|
80
|
+
backoffMs: queue.backoffMs,
|
|
81
|
+
ackWaitMs: queue.ackWaitMs,
|
|
82
|
+
...(queue.defaultDeadlineMs !== undefined
|
|
83
|
+
? { defaultDeadlineMs: queue.defaultDeadlineMs }
|
|
84
|
+
: {}),
|
|
85
|
+
progress: queue.progress,
|
|
86
|
+
logs: queue.logs,
|
|
87
|
+
dlq: queue.dlq,
|
|
88
|
+
concurrency: queue.concurrency,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function normalizeQueuePolicy(queue) {
|
|
92
|
+
return {
|
|
93
|
+
maxQueuedPerKey: queue.maxQueuedPerKey ?? 0,
|
|
94
|
+
whenFull: queue.whenFull ?? "reject",
|
|
95
|
+
};
|
|
96
|
+
}
|
|
38
97
|
const ClientTransportEndpointsSchema = Type.Object({
|
|
39
98
|
natsServers: Type.Array(Type.String({ minLength: 1 }), { minItems: 1 }),
|
|
40
99
|
});
|
|
@@ -509,6 +568,7 @@ export async function createConnectedService(args) {
|
|
|
509
568
|
metadata: args.contractEventConsumers,
|
|
510
569
|
bindings: args.bindings.eventConsumers,
|
|
511
570
|
},
|
|
571
|
+
durableEventConsumerBeforeReadinessCheck: args.durableEventConsumerBeforeReadinessCheck,
|
|
512
572
|
connection,
|
|
513
573
|
});
|
|
514
574
|
let transfer;
|
|
@@ -534,6 +594,7 @@ export async function createConnectedService(args) {
|
|
|
534
594
|
prepare: (event, data) => outbound.prepare(event, data),
|
|
535
595
|
publish: (event, data) => outbound.publish(event, data),
|
|
536
596
|
publishPrepared: (event) => outbound.publishPrepared(event),
|
|
597
|
+
stopEventListeners: () => outbound.stopEventListeners(),
|
|
537
598
|
get kv() {
|
|
538
599
|
return getHandlerResources().kv;
|
|
539
600
|
},
|
|
@@ -637,6 +698,147 @@ function toUnexpectedError(cause) {
|
|
|
637
698
|
? cause
|
|
638
699
|
: new UnexpectedError({ cause });
|
|
639
700
|
}
|
|
701
|
+
function resolveSqlOutboxTables(tables) {
|
|
702
|
+
return {
|
|
703
|
+
outbox: tables?.outbox ?? defaultSqlOutboxTables.outbox,
|
|
704
|
+
inbox: tables?.inbox ?? defaultSqlOutboxTables.inbox,
|
|
705
|
+
};
|
|
706
|
+
}
|
|
707
|
+
function createSqlOutboxBaseExecutor(options) {
|
|
708
|
+
return options.executor;
|
|
709
|
+
}
|
|
710
|
+
function createSqlOutboxTransactionRunner(options) {
|
|
711
|
+
return options.transaction;
|
|
712
|
+
}
|
|
713
|
+
function createSqlOutboxEventEnqueueFacade(args) {
|
|
714
|
+
const facade = {};
|
|
715
|
+
const source = args.event;
|
|
716
|
+
for (const [groupName, leaves] of Object.entries(source)) {
|
|
717
|
+
const group = {};
|
|
718
|
+
for (const [leafName, leaf] of Object.entries(leaves)) {
|
|
719
|
+
group[leafName] = {
|
|
720
|
+
enqueue: (payload) => AsyncResult.from((async () => {
|
|
721
|
+
const prepared = leaf.prepare(payload).take();
|
|
722
|
+
if (isErr(prepared))
|
|
723
|
+
return Result.err(prepared.error);
|
|
724
|
+
const record = preparedTrellisEventToOutboxRecord(prepared);
|
|
725
|
+
try {
|
|
726
|
+
const message = await args.repository.enqueue(record);
|
|
727
|
+
args.onEnqueued();
|
|
728
|
+
return Result.ok(message);
|
|
729
|
+
}
|
|
730
|
+
catch (cause) {
|
|
731
|
+
return Result.err(toUnexpectedError(cause));
|
|
732
|
+
}
|
|
733
|
+
})()),
|
|
734
|
+
};
|
|
735
|
+
}
|
|
736
|
+
Object.defineProperty(facade, groupName, {
|
|
737
|
+
value: group,
|
|
738
|
+
enumerable: true,
|
|
739
|
+
configurable: true,
|
|
740
|
+
});
|
|
741
|
+
}
|
|
742
|
+
return facade;
|
|
743
|
+
}
|
|
744
|
+
function createSqlOutboxJobEnqueueFacade(args) {
|
|
745
|
+
const facade = {};
|
|
746
|
+
for (const queueType of Object.keys(args.contractJobs)) {
|
|
747
|
+
const queueBinding = args.jobsBinding?.queues[queueType];
|
|
748
|
+
const queue = queueType;
|
|
749
|
+
facade[queue] = {
|
|
750
|
+
create: (payload) => {
|
|
751
|
+
if (!queueBinding) {
|
|
752
|
+
return AsyncResult.err(new ValidationError({
|
|
753
|
+
errors: [{
|
|
754
|
+
path: "/",
|
|
755
|
+
message: `Jobs binding unavailable for queue '${queue}'`,
|
|
756
|
+
}],
|
|
757
|
+
}));
|
|
758
|
+
}
|
|
759
|
+
const submissionId = ulid();
|
|
760
|
+
const jobId = ulid();
|
|
761
|
+
const context = createJobContext();
|
|
762
|
+
const record = {
|
|
763
|
+
id: submissionId,
|
|
764
|
+
kind: "job.create",
|
|
765
|
+
name: queue,
|
|
766
|
+
subject: `${queueBinding.publishPrefix}.${jobId}.created`,
|
|
767
|
+
payload: JSON.stringify({
|
|
768
|
+
...payload,
|
|
769
|
+
jobId,
|
|
770
|
+
submissionId,
|
|
771
|
+
}),
|
|
772
|
+
headers: {
|
|
773
|
+
"request-id": context.requestId,
|
|
774
|
+
"traceparent": context.traceparent,
|
|
775
|
+
...(context.tracestate ? { "tracestate": context.tracestate } : {}),
|
|
776
|
+
},
|
|
777
|
+
};
|
|
778
|
+
return AsyncResult.from((async () => {
|
|
779
|
+
try {
|
|
780
|
+
await args.repository.enqueue(record);
|
|
781
|
+
args.onEnqueued();
|
|
782
|
+
return Result.ok({
|
|
783
|
+
submissionId,
|
|
784
|
+
jobId,
|
|
785
|
+
queue,
|
|
786
|
+
mode: "create",
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
catch (cause) {
|
|
790
|
+
return Result.err(toUnexpectedError(cause));
|
|
791
|
+
}
|
|
792
|
+
})());
|
|
793
|
+
},
|
|
794
|
+
submit: (payload) => {
|
|
795
|
+
if (!queueBinding) {
|
|
796
|
+
return AsyncResult.err(new ValidationError({
|
|
797
|
+
errors: [{
|
|
798
|
+
path: "/",
|
|
799
|
+
message: `Jobs binding unavailable for queue '${queue}'`,
|
|
800
|
+
}],
|
|
801
|
+
}));
|
|
802
|
+
}
|
|
803
|
+
const submissionId = ulid();
|
|
804
|
+
const jobId = ulid();
|
|
805
|
+
const context = createJobContext();
|
|
806
|
+
const record = {
|
|
807
|
+
id: submissionId,
|
|
808
|
+
kind: "job.submit",
|
|
809
|
+
name: queue,
|
|
810
|
+
subject: `${queueBinding.publishPrefix}.${jobId}.created`,
|
|
811
|
+
payload: JSON.stringify({
|
|
812
|
+
...payload,
|
|
813
|
+
jobId,
|
|
814
|
+
submissionId,
|
|
815
|
+
}),
|
|
816
|
+
headers: {
|
|
817
|
+
"request-id": context.requestId,
|
|
818
|
+
"traceparent": context.traceparent,
|
|
819
|
+
...(context.tracestate ? { "tracestate": context.tracestate } : {}),
|
|
820
|
+
},
|
|
821
|
+
};
|
|
822
|
+
return AsyncResult.from((async () => {
|
|
823
|
+
try {
|
|
824
|
+
await args.repository.enqueue(record);
|
|
825
|
+
args.onEnqueued();
|
|
826
|
+
return Result.ok({
|
|
827
|
+
submissionId,
|
|
828
|
+
jobId,
|
|
829
|
+
queue,
|
|
830
|
+
mode: "submit",
|
|
831
|
+
});
|
|
832
|
+
}
|
|
833
|
+
catch (cause) {
|
|
834
|
+
return Result.err(toUnexpectedError(cause));
|
|
835
|
+
}
|
|
836
|
+
})());
|
|
837
|
+
},
|
|
838
|
+
};
|
|
839
|
+
}
|
|
840
|
+
return facade;
|
|
841
|
+
}
|
|
640
842
|
function serializeJobHandlerError(error) {
|
|
641
843
|
try {
|
|
642
844
|
return JSON.stringify(error.toSerializable());
|
|
@@ -661,7 +863,8 @@ function wrapVoidTask(task) {
|
|
|
661
863
|
}
|
|
662
864
|
function isTerminalJobState(state) {
|
|
663
865
|
return state === "completed" || state === "failed" || state === "cancelled" ||
|
|
664
|
-
state === "expired" || state === "
|
|
866
|
+
state === "expired" || state === "skipped" || state === "stale" ||
|
|
867
|
+
state === "dead" || state === "dismissed";
|
|
665
868
|
}
|
|
666
869
|
function isTerminalJobSnapshot(snapshot) {
|
|
667
870
|
return isTerminalJobState(snapshot.state);
|
|
@@ -759,6 +962,9 @@ function snapshotFromLifecycleEvent(current, event) {
|
|
|
759
962
|
case "failed":
|
|
760
963
|
case "cancelled":
|
|
761
964
|
case "expired":
|
|
965
|
+
case "skipped":
|
|
966
|
+
case "stale":
|
|
967
|
+
case "staleCompletionIgnored":
|
|
762
968
|
case "dead":
|
|
763
969
|
case "dismissed":
|
|
764
970
|
return event.error === undefined ? base : {
|
|
@@ -935,17 +1141,20 @@ function createJobsFacade(args) {
|
|
|
935
1141
|
const handlers = new Map();
|
|
936
1142
|
const jobsFacade = {};
|
|
937
1143
|
const lifecycle = createJobLifecycleTracker(args.nc);
|
|
1144
|
+
const keyCoordinator = createNatsJobKeyCoordinator(args.nc);
|
|
1145
|
+
const jobsBinding = args.jobsBinding
|
|
1146
|
+
? normalizeResourceJobsBinding(args.jobsBinding)
|
|
1147
|
+
: undefined;
|
|
938
1148
|
let activeHost;
|
|
939
1149
|
let startupPromise;
|
|
940
1150
|
let stopPromise;
|
|
941
1151
|
for (const queueType of Object.keys(args.contractJobs ?? {})) {
|
|
942
|
-
const queueBinding =
|
|
1152
|
+
const queueBinding = jobsBinding?.queues[queueType];
|
|
943
1153
|
if (queueBinding)
|
|
944
1154
|
lifecycle.watch(queueBinding);
|
|
945
1155
|
jobsFacade[queueType] = {
|
|
946
1156
|
create: (payload) => AsyncResult.from((async () => {
|
|
947
1157
|
try {
|
|
948
|
-
const jobsBinding = args.jobsBinding;
|
|
949
1158
|
if (!jobsBinding) {
|
|
950
1159
|
return Result.err(toUnexpectedError(new Error("Jobs bindings are unavailable")));
|
|
951
1160
|
}
|
|
@@ -956,6 +1165,7 @@ function createJobsFacade(args) {
|
|
|
956
1165
|
const manager = new InternalJobManager({
|
|
957
1166
|
nc: args.nc,
|
|
958
1167
|
jobs: jobsBinding,
|
|
1168
|
+
keyCoordinator,
|
|
959
1169
|
});
|
|
960
1170
|
await args.nc.flush();
|
|
961
1171
|
const created = await manager.create(queueType, payload);
|
|
@@ -968,6 +1178,60 @@ function createJobsFacade(args) {
|
|
|
968
1178
|
lifecycle,
|
|
969
1179
|
}));
|
|
970
1180
|
}
|
|
1181
|
+
catch (cause) {
|
|
1182
|
+
if (cause instanceof JobNotEnqueuedError) {
|
|
1183
|
+
return Result.err(cause);
|
|
1184
|
+
}
|
|
1185
|
+
return Result.err(toUnexpectedError(cause));
|
|
1186
|
+
}
|
|
1187
|
+
})()),
|
|
1188
|
+
submit: (payload) => AsyncResult.from((async () => {
|
|
1189
|
+
try {
|
|
1190
|
+
if (!jobsBinding) {
|
|
1191
|
+
return Result.err(toUnexpectedError(new Error("Jobs bindings are unavailable")));
|
|
1192
|
+
}
|
|
1193
|
+
const queueBinding = jobsBinding.queues[queueType];
|
|
1194
|
+
if (!queueBinding) {
|
|
1195
|
+
return Result.err(toUnexpectedError(new Error(`Jobs binding for queue '${queueType}' is unavailable`)));
|
|
1196
|
+
}
|
|
1197
|
+
const manager = new InternalJobManager({
|
|
1198
|
+
nc: args.nc,
|
|
1199
|
+
jobs: jobsBinding,
|
|
1200
|
+
keyCoordinator,
|
|
1201
|
+
});
|
|
1202
|
+
await args.nc.flush();
|
|
1203
|
+
const outcome = await manager.submit(queueType, payload);
|
|
1204
|
+
if (outcome.kind === "accepted") {
|
|
1205
|
+
return Result.ok({
|
|
1206
|
+
kind: "accepted",
|
|
1207
|
+
key: outcome.key,
|
|
1208
|
+
ref: createJobRef({
|
|
1209
|
+
nc: args.nc,
|
|
1210
|
+
queueType,
|
|
1211
|
+
jobsBinding,
|
|
1212
|
+
queueBinding,
|
|
1213
|
+
seed: outcome.job,
|
|
1214
|
+
lifecycle,
|
|
1215
|
+
}),
|
|
1216
|
+
});
|
|
1217
|
+
}
|
|
1218
|
+
if (outcome.kind === "replaced") {
|
|
1219
|
+
return Result.ok({
|
|
1220
|
+
kind: "replaced",
|
|
1221
|
+
key: outcome.key,
|
|
1222
|
+
replaced: outcome.replaced,
|
|
1223
|
+
ref: createJobRef({
|
|
1224
|
+
nc: args.nc,
|
|
1225
|
+
queueType,
|
|
1226
|
+
jobsBinding,
|
|
1227
|
+
queueBinding,
|
|
1228
|
+
seed: outcome.job,
|
|
1229
|
+
lifecycle,
|
|
1230
|
+
}),
|
|
1231
|
+
});
|
|
1232
|
+
}
|
|
1233
|
+
return Result.ok(outcome);
|
|
1234
|
+
}
|
|
971
1235
|
catch (cause) {
|
|
972
1236
|
return Result.err(toUnexpectedError(cause));
|
|
973
1237
|
}
|
|
@@ -1001,10 +1265,9 @@ function createJobsFacade(args) {
|
|
|
1001
1265
|
activeHost = host;
|
|
1002
1266
|
return Result.ok(host);
|
|
1003
1267
|
}
|
|
1004
|
-
if (!
|
|
1268
|
+
if (!jobsBinding || !args.workStream) {
|
|
1005
1269
|
return Result.err(toUnexpectedError(new Error("Jobs infrastructure bindings are unavailable for this service")));
|
|
1006
1270
|
}
|
|
1007
|
-
const jobsBinding = args.jobsBinding;
|
|
1008
1271
|
const workStream = args.workStream;
|
|
1009
1272
|
const hosts = [];
|
|
1010
1273
|
try {
|
|
@@ -1020,6 +1283,7 @@ function createJobsFacade(args) {
|
|
|
1020
1283
|
const manager = new InternalJobManager({
|
|
1021
1284
|
nc: args.nc,
|
|
1022
1285
|
jobs: jobsBinding,
|
|
1286
|
+
keyCoordinator,
|
|
1023
1287
|
});
|
|
1024
1288
|
const host = await startNatsWorkerHostFromBinding({
|
|
1025
1289
|
jobs: jobsBinding,
|
|
@@ -1029,6 +1293,7 @@ function createJobsFacade(args) {
|
|
|
1029
1293
|
instanceId: `${args.serviceName}-worker`,
|
|
1030
1294
|
queueTypes: [queueType],
|
|
1031
1295
|
manager,
|
|
1296
|
+
heartbeatPublisher: args.nc,
|
|
1032
1297
|
getProjectedJob: async (job) => {
|
|
1033
1298
|
return lifecycle.get({
|
|
1034
1299
|
service: job.service,
|
|
@@ -1137,24 +1402,6 @@ function createJobsFacade(args) {
|
|
|
1137
1402
|
});
|
|
1138
1403
|
return jobsFacade;
|
|
1139
1404
|
}
|
|
1140
|
-
function createBoundJobsFacade(args) {
|
|
1141
|
-
const boundJobs = {};
|
|
1142
|
-
const jobs = args.jobs;
|
|
1143
|
-
for (const queueType of Object.keys(jobs)) {
|
|
1144
|
-
const queue = jobs[queueType];
|
|
1145
|
-
if (!queue)
|
|
1146
|
-
continue;
|
|
1147
|
-
boundJobs[queueType] = {
|
|
1148
|
-
create: (payload) => queue.create(payload),
|
|
1149
|
-
handle: (handler) => queue.handle(({ job, client }) => handler({
|
|
1150
|
-
job,
|
|
1151
|
-
client,
|
|
1152
|
-
deps: args.deps,
|
|
1153
|
-
})),
|
|
1154
|
-
};
|
|
1155
|
-
}
|
|
1156
|
-
return boundJobs;
|
|
1157
|
-
}
|
|
1158
1405
|
/**
|
|
1159
1406
|
* Connects a service with caller-supplied runtime dependencies for tests and
|
|
1160
1407
|
* Trellis-owned internals. This helper is intentionally not re-exported from
|
|
@@ -1164,6 +1411,7 @@ function createBoundJobsFacade(args) {
|
|
|
1164
1411
|
*/
|
|
1165
1412
|
export function connectTrellisServiceWithRuntimeDeps(args, deps) {
|
|
1166
1413
|
return AsyncResult.from((async () => {
|
|
1414
|
+
const totalStartedAt = performance.now();
|
|
1167
1415
|
try {
|
|
1168
1416
|
const runtimeDeps = {
|
|
1169
1417
|
...(await loadDefaultServiceRuntimeDeps()),
|
|
@@ -1174,6 +1422,7 @@ export function connectTrellisServiceWithRuntimeDeps(args, deps) {
|
|
|
1174
1422
|
}
|
|
1175
1423
|
const auth = await createAuth({ sessionKeySeed: args.sessionKeySeed });
|
|
1176
1424
|
const bootstrapLog = resolveServiceLogger(args.server?.log);
|
|
1425
|
+
const bootstrapStartedAt = performance.now();
|
|
1177
1426
|
const bootstrap = await fetchServiceBootstrapInfo({
|
|
1178
1427
|
trellisUrl: args.trellisUrl,
|
|
1179
1428
|
serviceName: args.name,
|
|
@@ -1183,12 +1432,18 @@ export function connectTrellisServiceWithRuntimeDeps(args, deps) {
|
|
|
1183
1432
|
auth,
|
|
1184
1433
|
log: bootstrapLog,
|
|
1185
1434
|
});
|
|
1435
|
+
recordTrellisDuration("trellis.connect.duration", performance.now() - bootstrapStartedAt, {
|
|
1436
|
+
phase: "bootstrap",
|
|
1437
|
+
participantKind: "service",
|
|
1438
|
+
outcome: "ok",
|
|
1439
|
+
});
|
|
1186
1440
|
const { authenticator: authTokenAuthenticator, inboxPrefix } = await auth
|
|
1187
1441
|
.natsConnectOptions({
|
|
1188
1442
|
contractDigest: args.contract.CONTRACT_DIGEST,
|
|
1189
1443
|
});
|
|
1190
1444
|
let nc;
|
|
1191
1445
|
try {
|
|
1446
|
+
const natsStartedAt = performance.now();
|
|
1192
1447
|
nc = await runtimeDeps.connect({
|
|
1193
1448
|
servers: selectRuntimeTransportServers(bootstrap.connectInfo.transports),
|
|
1194
1449
|
maxReconnectAttempts: DEFAULT_RUNTIME_MAX_RECONNECT_ATTEMPTS,
|
|
@@ -1199,6 +1454,11 @@ export function connectTrellisServiceWithRuntimeDeps(args, deps) {
|
|
|
1199
1454
|
jwtAuthenticator(bootstrap.connectInfo.transport.sentinel.jwt, new TextEncoder().encode(bootstrap.connectInfo.transport.sentinel.seed)),
|
|
1200
1455
|
],
|
|
1201
1456
|
});
|
|
1457
|
+
recordTrellisDuration("trellis.connect.duration", performance.now() - natsStartedAt, {
|
|
1458
|
+
phase: "nats_connect",
|
|
1459
|
+
participantKind: "service",
|
|
1460
|
+
outcome: "ok",
|
|
1461
|
+
});
|
|
1202
1462
|
}
|
|
1203
1463
|
catch (cause) {
|
|
1204
1464
|
throw new TransportError({
|
|
@@ -1224,7 +1484,7 @@ export function connectTrellisServiceWithRuntimeDeps(args, deps) {
|
|
|
1224
1484
|
...(args.server ?? {}),
|
|
1225
1485
|
api: args.contract.API.owned,
|
|
1226
1486
|
};
|
|
1227
|
-
|
|
1487
|
+
const service = await createConnectedService({
|
|
1228
1488
|
name: args.name,
|
|
1229
1489
|
auth,
|
|
1230
1490
|
nc,
|
|
@@ -1235,7 +1495,14 @@ export function connectTrellisServiceWithRuntimeDeps(args, deps) {
|
|
|
1235
1495
|
contractEventConsumers: args.contract.CONTRACT.eventConsumers,
|
|
1236
1496
|
server,
|
|
1237
1497
|
bindings: bootstrap.binding.resources,
|
|
1238
|
-
|
|
1498
|
+
durableEventConsumerBeforeReadinessCheck: runtimeDeps.durableEventConsumerBeforeReadinessCheck,
|
|
1499
|
+
});
|
|
1500
|
+
recordTrellisDuration("trellis.connect.duration", performance.now() - totalStartedAt, {
|
|
1501
|
+
phase: "total",
|
|
1502
|
+
participantKind: "service",
|
|
1503
|
+
outcome: "ok",
|
|
1504
|
+
});
|
|
1505
|
+
return Result.ok(service);
|
|
1239
1506
|
}
|
|
1240
1507
|
catch (cause) {
|
|
1241
1508
|
await closeFailedServiceBootstrapConnection(nc);
|
|
@@ -1312,6 +1579,9 @@ export class TrellisService {
|
|
|
1312
1579
|
_TrellisService_operationTransfer.set(this, void 0);
|
|
1313
1580
|
_TrellisService_stopHealthPublishing.set(this, void 0);
|
|
1314
1581
|
_TrellisService_managedJobWorkers.set(this, void 0);
|
|
1582
|
+
_TrellisService_contractJobs.set(this, void 0);
|
|
1583
|
+
_TrellisService_jobsBinding.set(this, void 0);
|
|
1584
|
+
_TrellisService_ownedOutboxDispatchers.set(this, new Set());
|
|
1315
1585
|
_TrellisService_waitPromise.set(this, void 0);
|
|
1316
1586
|
_TrellisService_stopPromise.set(this, void 0);
|
|
1317
1587
|
if (token !== trellisServiceConstructorToken) {
|
|
@@ -1346,33 +1616,20 @@ export class TrellisService {
|
|
|
1346
1616
|
});
|
|
1347
1617
|
this.jobs = jobs;
|
|
1348
1618
|
__classPrivateFieldSet(this, _TrellisService_managedJobWorkers, jobs[MANAGED_JOB_WORKERS], "f");
|
|
1619
|
+
__classPrivateFieldSet(this, _TrellisService_contractJobs, contractJobs, "f");
|
|
1620
|
+
__classPrivateFieldSet(this, _TrellisService_jobsBinding, bindings.jobs, "f");
|
|
1349
1621
|
this.health = health;
|
|
1350
1622
|
this.handle = __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createHandleFacade).call(this);
|
|
1351
1623
|
this.connection = connection;
|
|
1352
1624
|
__classPrivateFieldSet(this, _TrellisService_stopHealthPublishing, stopHealthPublishing, "f");
|
|
1353
1625
|
}
|
|
1354
1626
|
/**
|
|
1355
|
-
*
|
|
1356
|
-
*
|
|
1627
|
+
* Creates an explicit SQL outbox helper for service-owned transactions.
|
|
1628
|
+
* Services should create this at startup and close over it in handlers.
|
|
1357
1629
|
*/
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
auth: this.auth,
|
|
1362
|
-
event: __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createBoundEventFacade).call(this, deps),
|
|
1363
|
-
kv: this.kv,
|
|
1364
|
-
store: this.store,
|
|
1365
|
-
jobs: createBoundJobsFacade({ jobs: this.jobs, deps }),
|
|
1366
|
-
health: __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createBoundHealth).call(this, deps),
|
|
1367
|
-
handle: __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createBoundHandleFacade).call(this, deps),
|
|
1368
|
-
connection: this.connection,
|
|
1369
|
-
createTransfer: (args) => this.createTransfer(args),
|
|
1370
|
-
completeOperation: (operationId, output) => this.completeOperation(operationId, output),
|
|
1371
|
-
publishPrepared: (event) => this.publishPrepared(event),
|
|
1372
|
-
wait: () => this.wait(),
|
|
1373
|
-
stop: () => this.stop(),
|
|
1374
|
-
with: (nextDeps) => this.with(nextDeps),
|
|
1375
|
-
};
|
|
1630
|
+
createSqlOutbox(options) {
|
|
1631
|
+
const binding = __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createSqlOutboxBinding).call(this, options);
|
|
1632
|
+
return __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createSqlOutbox).call(this, binding);
|
|
1376
1633
|
}
|
|
1377
1634
|
/** Publishes a prepared event through the service runtime connection. */
|
|
1378
1635
|
publishPrepared(event) {
|
|
@@ -1433,6 +1690,11 @@ export class TrellisService {
|
|
|
1433
1690
|
async stop() {
|
|
1434
1691
|
__classPrivateFieldSet(this, _TrellisService_stopPromise, __classPrivateFieldGet(this, _TrellisService_stopPromise, "f") ?? (async () => {
|
|
1435
1692
|
this.connection.stopObserving();
|
|
1693
|
+
__classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f").stopEventListeners();
|
|
1694
|
+
for (const dispatcher of __classPrivateFieldGet(this, _TrellisService_ownedOutboxDispatchers, "f")) {
|
|
1695
|
+
dispatcher.stop();
|
|
1696
|
+
}
|
|
1697
|
+
__classPrivateFieldGet(this, _TrellisService_ownedOutboxDispatchers, "f").clear();
|
|
1436
1698
|
try {
|
|
1437
1699
|
await __classPrivateFieldGet(this, _TrellisService_stopHealthPublishing, "f").call(this);
|
|
1438
1700
|
}
|
|
@@ -1459,91 +1721,13 @@ export class TrellisService {
|
|
|
1459
1721
|
await __classPrivateFieldGet(this, _TrellisService_stopPromise, "f");
|
|
1460
1722
|
}
|
|
1461
1723
|
}
|
|
1462
|
-
_TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _TrellisService_handlerTrellis = new WeakMap(), _TrellisService_operationTransfer = new WeakMap(), _TrellisService_stopHealthPublishing = new WeakMap(), _TrellisService_managedJobWorkers = new WeakMap(), _TrellisService_waitPromise = new WeakMap(), _TrellisService_stopPromise = new WeakMap(), _TrellisService_instances = new WeakSet(),
|
|
1463
|
-
const health = this.health;
|
|
1464
|
-
return {
|
|
1465
|
-
serviceName: health.serviceName,
|
|
1466
|
-
kind: health.kind,
|
|
1467
|
-
instanceId: health.instanceId,
|
|
1468
|
-
contractId: health.contractId,
|
|
1469
|
-
contractDigest: health.contractDigest,
|
|
1470
|
-
startedAt: health.startedAt,
|
|
1471
|
-
publishIntervalMs: health.publishIntervalMs,
|
|
1472
|
-
setInfo(info) {
|
|
1473
|
-
if (typeof info !== "function") {
|
|
1474
|
-
health.setInfo(info);
|
|
1475
|
-
return;
|
|
1476
|
-
}
|
|
1477
|
-
health.setInfo(() => info({ deps }));
|
|
1478
|
-
},
|
|
1479
|
-
add(name, check) {
|
|
1480
|
-
return health.add(name, () => check({ deps }));
|
|
1481
|
-
},
|
|
1482
|
-
checks: () => health.checks(),
|
|
1483
|
-
response: () => health.response(),
|
|
1484
|
-
heartbeat: () => health.heartbeat(),
|
|
1485
|
-
};
|
|
1486
|
-
}, _TrellisService_createBoundEventFacade = function _TrellisService_createBoundEventFacade(deps) {
|
|
1487
|
-
const event = {};
|
|
1488
|
-
const source = this.event;
|
|
1489
|
-
for (const [groupName, leaves] of Object.entries(source)) {
|
|
1490
|
-
const group = {};
|
|
1491
|
-
for (const [leafName, leaf] of Object.entries(leaves)) {
|
|
1492
|
-
group[leafName] = {
|
|
1493
|
-
prepare: (payload) => leaf.prepare(payload),
|
|
1494
|
-
publish: (payload) => leaf.publish(payload),
|
|
1495
|
-
listen: (handler, subjectData, opts) => leaf.listen((payload, context) => handler({
|
|
1496
|
-
event: payload,
|
|
1497
|
-
context,
|
|
1498
|
-
client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
|
|
1499
|
-
deps,
|
|
1500
|
-
}), subjectData, opts),
|
|
1501
|
-
};
|
|
1502
|
-
}
|
|
1503
|
-
Object.defineProperty(event, groupName, {
|
|
1504
|
-
value: group,
|
|
1505
|
-
enumerable: true,
|
|
1506
|
-
configurable: true,
|
|
1507
|
-
});
|
|
1508
|
-
}
|
|
1509
|
-
return event;
|
|
1510
|
-
}, _TrellisService_createHandleFacade = function _TrellisService_createHandleFacade() {
|
|
1511
|
-
const rpc = {};
|
|
1512
|
-
for (const method of Object.keys(__classPrivateFieldGet(this, _TrellisService_server, "f").api.rpc ?? {})) {
|
|
1513
|
-
addSurfaceLeaf(rpc, method, (handler) => __classPrivateFieldGet(this, _TrellisService_server, "f").mountRuntime(method, async ({ input, context }) => await Promise.resolve(handler({
|
|
1514
|
-
input,
|
|
1515
|
-
context,
|
|
1516
|
-
client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
|
|
1517
|
-
}))));
|
|
1518
|
-
}
|
|
1519
|
-
const feed = {};
|
|
1520
|
-
for (const feedName of Object.keys(__classPrivateFieldGet(this, _TrellisService_server, "f").api.feeds ?? {})) {
|
|
1521
|
-
addSurfaceLeaf(feed, feedName, (handler) => __classPrivateFieldGet(this, _TrellisService_server, "f").feedHandle(feedName).handle((context) => handler({
|
|
1522
|
-
...context,
|
|
1523
|
-
client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
|
|
1524
|
-
})));
|
|
1525
|
-
}
|
|
1526
|
-
const operation = {};
|
|
1527
|
-
for (const operationName of Object.keys(__classPrivateFieldGet(this, _TrellisService_server, "f").api.operations ?? {})) {
|
|
1528
|
-
const registration = __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_operation).call(this, operationName);
|
|
1529
|
-
const leaf = Object.assign((handler) => registration.handle((context) => handler({
|
|
1530
|
-
...context,
|
|
1531
|
-
client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
|
|
1532
|
-
})), {
|
|
1533
|
-
accept: (args) => registration.accept(args),
|
|
1534
|
-
control: (operationId) => registration.control(operationId),
|
|
1535
|
-
});
|
|
1536
|
-
addSurfaceLeaf(operation, operationName, leaf);
|
|
1537
|
-
}
|
|
1538
|
-
return { rpc, feed, operation };
|
|
1539
|
-
}, _TrellisService_createBoundHandleFacade = function _TrellisService_createBoundHandleFacade(deps) {
|
|
1724
|
+
_TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _TrellisService_handlerTrellis = new WeakMap(), _TrellisService_operationTransfer = new WeakMap(), _TrellisService_stopHealthPublishing = new WeakMap(), _TrellisService_managedJobWorkers = new WeakMap(), _TrellisService_contractJobs = new WeakMap(), _TrellisService_jobsBinding = new WeakMap(), _TrellisService_ownedOutboxDispatchers = new WeakMap(), _TrellisService_waitPromise = new WeakMap(), _TrellisService_stopPromise = new WeakMap(), _TrellisService_instances = new WeakSet(), _TrellisService_createHandleFacade = function _TrellisService_createHandleFacade() {
|
|
1540
1725
|
const rpc = {};
|
|
1541
1726
|
for (const method of Object.keys(__classPrivateFieldGet(this, _TrellisService_server, "f").api.rpc ?? {})) {
|
|
1542
1727
|
addSurfaceLeaf(rpc, method, (handler) => __classPrivateFieldGet(this, _TrellisService_server, "f").mountRuntime(method, async ({ input, context }) => await Promise.resolve(handler({
|
|
1543
1728
|
input,
|
|
1544
1729
|
context,
|
|
1545
1730
|
client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
|
|
1546
|
-
deps,
|
|
1547
1731
|
}))));
|
|
1548
1732
|
}
|
|
1549
1733
|
const feed = {};
|
|
@@ -1551,7 +1735,6 @@ _TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _Tre
|
|
|
1551
1735
|
addSurfaceLeaf(feed, feedName, (handler) => __classPrivateFieldGet(this, _TrellisService_server, "f").feedHandle(feedName).handle((context) => handler({
|
|
1552
1736
|
...context,
|
|
1553
1737
|
client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
|
|
1554
|
-
deps,
|
|
1555
1738
|
})));
|
|
1556
1739
|
}
|
|
1557
1740
|
const operation = {};
|
|
@@ -1560,7 +1743,6 @@ _TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _Tre
|
|
|
1560
1743
|
const leaf = Object.assign((handler) => registration.handle((context) => handler({
|
|
1561
1744
|
...context,
|
|
1562
1745
|
client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
|
|
1563
|
-
deps,
|
|
1564
1746
|
})), {
|
|
1565
1747
|
accept: (args) => registration.accept(args),
|
|
1566
1748
|
control: (operationId) => registration.control(operationId),
|
|
@@ -1568,6 +1750,66 @@ _TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _Tre
|
|
|
1568
1750
|
addSurfaceLeaf(operation, operationName, leaf);
|
|
1569
1751
|
}
|
|
1570
1752
|
return { rpc, feed, operation };
|
|
1753
|
+
}, _TrellisService_createSqlOutboxBinding = function _TrellisService_createSqlOutboxBinding(options) {
|
|
1754
|
+
const tables = resolveSqlOutboxTables(options.tables);
|
|
1755
|
+
const executor = createSqlOutboxBaseExecutor(options);
|
|
1756
|
+
const repository = new SqlOutboxRepository(executor, options.dialect, tables);
|
|
1757
|
+
const dispatchRuntime = {
|
|
1758
|
+
publishPreparedEvent: (event) => __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f").publishPrepared(event),
|
|
1759
|
+
// dispatchJobSubmission: stub — filled in by Phase 3
|
|
1760
|
+
};
|
|
1761
|
+
const dispatcher = new OutboxDispatcher(repository, dispatchRuntime, options.dispatcher);
|
|
1762
|
+
__classPrivateFieldGet(this, _TrellisService_ownedOutboxDispatchers, "f").add(dispatcher);
|
|
1763
|
+
return {
|
|
1764
|
+
dialect: options.dialect,
|
|
1765
|
+
tables,
|
|
1766
|
+
transaction: createSqlOutboxTransactionRunner(options),
|
|
1767
|
+
dispatcher,
|
|
1768
|
+
};
|
|
1769
|
+
}, _TrellisService_createSqlOutbox = function _TrellisService_createSqlOutbox(binding) {
|
|
1770
|
+
return {
|
|
1771
|
+
transaction: (work) => AsyncResult.from((() => {
|
|
1772
|
+
let enqueued = 0;
|
|
1773
|
+
const toResultError = (cause) => {
|
|
1774
|
+
if (cause instanceof ValidationError ||
|
|
1775
|
+
cause instanceof UnexpectedError) {
|
|
1776
|
+
return Result.err(cause);
|
|
1777
|
+
}
|
|
1778
|
+
return Result.err(toUnexpectedError(cause));
|
|
1779
|
+
};
|
|
1780
|
+
let transaction;
|
|
1781
|
+
try {
|
|
1782
|
+
transaction = binding.transaction(({ tx, executor }) => {
|
|
1783
|
+
const repository = new SqlOutboxRepository(executor, binding.dialect, binding.tables);
|
|
1784
|
+
const event = createSqlOutboxEventEnqueueFacade({
|
|
1785
|
+
event: this.event,
|
|
1786
|
+
repository,
|
|
1787
|
+
onEnqueued: () => {
|
|
1788
|
+
enqueued += 1;
|
|
1789
|
+
},
|
|
1790
|
+
});
|
|
1791
|
+
const job = createSqlOutboxJobEnqueueFacade({
|
|
1792
|
+
serviceName: this.name,
|
|
1793
|
+
contractJobs: __classPrivateFieldGet(this, _TrellisService_contractJobs, "f"),
|
|
1794
|
+
jobsBinding: __classPrivateFieldGet(this, _TrellisService_jobsBinding, "f"),
|
|
1795
|
+
repository,
|
|
1796
|
+
onEnqueued: () => {
|
|
1797
|
+
enqueued += 1;
|
|
1798
|
+
},
|
|
1799
|
+
});
|
|
1800
|
+
return work({ tx, event, job });
|
|
1801
|
+
});
|
|
1802
|
+
}
|
|
1803
|
+
catch (cause) {
|
|
1804
|
+
return Promise.resolve(toResultError(cause));
|
|
1805
|
+
}
|
|
1806
|
+
return transaction.then((result) => {
|
|
1807
|
+
if (enqueued > 0)
|
|
1808
|
+
binding.dispatcher.notify();
|
|
1809
|
+
return Result.ok(result);
|
|
1810
|
+
}, toResultError);
|
|
1811
|
+
})()),
|
|
1812
|
+
};
|
|
1571
1813
|
}, _TrellisService_operation = function _TrellisService_operation(operation) {
|
|
1572
1814
|
const registration = __classPrivateFieldGet(this, _TrellisService_server, "f").operationHandle(operation);
|
|
1573
1815
|
return {
|