@qlever-llc/trellis 0.10.2 → 0.10.3-rc.4
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/_dnt.polyfills.d.ts.map +1 -0
- package/esm/_dnt.shims.d.ts.map +1 -0
- package/esm/auth/browser/login.d.ts +3 -3
- package/esm/auth/browser/login.d.ts.map +1 -1
- package/esm/auth/browser/portal.d.ts +5 -5
- package/esm/auth/browser/portal.d.ts.map +1 -1
- package/esm/auth/browser/session.d.ts.map +1 -1
- package/esm/auth/browser/storage.d.ts.map +1 -1
- package/esm/auth/browser.d.ts +8 -7
- package/esm/auth/browser.d.ts.map +1 -1
- package/esm/auth/browser.js +1 -0
- package/esm/auth/device_activation.d.ts +3 -3
- package/esm/auth/device_activation.d.ts.map +1 -1
- package/esm/auth/keys.d.ts.map +1 -1
- package/esm/auth/mod.d.ts +9 -9
- package/esm/auth/mod.d.ts.map +1 -1
- package/esm/auth/proof.d.ts.map +1 -1
- package/esm/auth/protocol.d.ts +245 -5
- package/esm/auth/protocol.d.ts.map +1 -1
- package/esm/auth/protocol.js +1 -1
- package/esm/auth/schemas.d.ts.map +1 -1
- package/esm/auth/session_auth.d.ts.map +1 -1
- package/esm/auth/time.d.ts.map +1 -1
- package/esm/auth/trellis_id.d.ts.map +1 -1
- package/esm/auth/types.d.ts +1 -1
- package/esm/auth/types.d.ts.map +1 -1
- package/esm/auth/utils.d.ts.map +1 -1
- package/esm/auth.d.ts +2 -1
- package/esm/auth.d.ts.map +1 -1
- package/esm/auth.js +1 -0
- package/esm/browser.d.ts.map +1 -0
- package/esm/client.d.ts +6 -6
- package/esm/client.d.ts.map +1 -1
- package/esm/client.js +1 -1
- package/esm/client_connect.d.ts +8 -8
- package/esm/client_connect.d.ts.map +1 -1
- package/esm/client_connect.js +4 -3
- package/esm/codec.d.ts +2 -2
- package/esm/codec.d.ts.map +1 -1
- package/esm/connection.d.ts +1 -1
- package/esm/connection.d.ts.map +1 -1
- package/esm/contract.d.ts +2 -2
- package/esm/contract.d.ts.map +1 -1
- package/esm/contract_support/canonical.d.ts.map +1 -1
- package/esm/contract_support/mod.d.ts +13 -13
- package/esm/contract_support/mod.d.ts.map +1 -1
- package/esm/contract_support/protocol.d.ts.map +1 -1
- package/esm/contract_support/runtime.d.ts +1 -1
- package/esm/contract_support/runtime.d.ts.map +1 -1
- package/esm/contract_support/schema_pointers.d.ts.map +1 -1
- package/esm/contracts.d.ts +4 -3
- package/esm/contracts.d.ts.map +1 -1
- package/esm/contracts.js +1 -0
- package/esm/device/deno.d.ts.map +1 -0
- package/esm/device.d.ts +9 -8
- package/esm/device.d.ts.map +1 -1
- package/esm/device.js +1 -0
- package/esm/env.d.ts.map +1 -0
- package/esm/errors/AuthError.d.ts +1 -1
- package/esm/errors/AuthError.d.ts.map +1 -1
- package/esm/errors/KVError.d.ts +1 -1
- package/esm/errors/KVError.d.ts.map +1 -1
- package/esm/errors/OperationLifecycleError.d.ts +1 -1
- package/esm/errors/OperationLifecycleError.d.ts.map +1 -1
- package/esm/errors/RemoteError.d.ts +10 -10
- package/esm/errors/RemoteError.d.ts.map +1 -1
- package/esm/errors/StoreError.d.ts +1 -1
- package/esm/errors/StoreError.d.ts.map +1 -1
- package/esm/errors/TransferError.d.ts +1 -1
- package/esm/errors/TransferError.d.ts.map +1 -1
- package/esm/errors/TransportError.d.ts +1 -1
- package/esm/errors/TransportError.d.ts.map +1 -1
- package/esm/errors/TrellisError.d.ts.map +1 -1
- package/esm/errors/ValidationError.d.ts +1 -1
- package/esm/errors/ValidationError.d.ts.map +1 -1
- package/esm/errors/index.d.ts +33 -32
- package/esm/errors/index.d.ts.map +1 -1
- package/esm/errors/index.js +1 -0
- package/esm/generate.d.ts.map +1 -0
- package/esm/{npm/src/generate.js → generate.js} +1 -0
- package/esm/generated-sdk/auth/api.d.ts +604 -3
- package/esm/generated-sdk/auth/api.d.ts.map +1 -1
- package/esm/generated-sdk/auth/api.js +4 -1
- package/esm/generated-sdk/auth/client.d.ts +8 -0
- package/esm/generated-sdk/auth/client.d.ts.map +1 -1
- package/esm/generated-sdk/auth/contract.d.ts +600 -2
- package/esm/generated-sdk/auth/contract.d.ts.map +1 -1
- package/esm/generated-sdk/auth/mod.d.ts.map +1 -1
- package/esm/generated-sdk/auth/owned_api.d.ts +601 -2
- package/esm/generated-sdk/auth/owned_api.d.ts.map +1 -1
- package/esm/generated-sdk/auth/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/auth/types.d.ts.map +1 -1
- package/esm/generated-sdk/health/api.d.ts +14 -2
- package/esm/generated-sdk/health/api.d.ts.map +1 -1
- package/esm/generated-sdk/health/client.d.ts.map +1 -1
- package/esm/generated-sdk/health/contract.d.ts +14 -2
- package/esm/generated-sdk/health/contract.d.ts.map +1 -1
- package/esm/generated-sdk/health/mod.d.ts.map +1 -1
- package/esm/generated-sdk/health/owned_api.d.ts +15 -2
- package/esm/generated-sdk/health/owned_api.d.ts.map +1 -1
- package/esm/generated-sdk/health/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/health/types.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/api.d.ts +105 -2
- package/esm/generated-sdk/jobs/api.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/client.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/contract.d.ts +105 -2
- package/esm/generated-sdk/jobs/contract.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/mod.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/owned_api.d.ts +106 -2
- package/esm/generated-sdk/jobs/owned_api.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/types.d.ts.map +1 -1
- package/esm/generated-sdk/state/api.d.ts +64 -2
- package/esm/generated-sdk/state/api.d.ts.map +1 -1
- package/esm/generated-sdk/state/client.d.ts.map +1 -1
- package/esm/generated-sdk/state/contract.d.ts +64 -2
- package/esm/generated-sdk/state/contract.d.ts.map +1 -1
- package/esm/generated-sdk/state/mod.d.ts.map +1 -1
- package/esm/generated-sdk/state/owned_api.d.ts +65 -2
- package/esm/generated-sdk/state/owned_api.d.ts.map +1 -1
- package/esm/generated-sdk/state/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/state/types.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/api.d.ts +44 -3
- package/esm/generated-sdk/trellis-core/api.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/api.js +4 -1
- package/esm/generated-sdk/trellis-core/client.d.ts +14 -2
- package/esm/generated-sdk/trellis-core/client.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/contract.d.ts +40 -2
- package/esm/generated-sdk/trellis-core/contract.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/mod.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/owned_api.d.ts +41 -2
- package/esm/generated-sdk/trellis-core/owned_api.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/types.d.ts.map +1 -1
- package/esm/globals.d.ts.map +1 -1
- package/esm/health.d.ts +4 -3
- package/esm/health.d.ts.map +1 -1
- package/esm/health.js +1 -0
- package/esm/helpers.d.ts.map +1 -1
- package/esm/host/mod.d.ts.map +1 -0
- package/esm/host/node.d.ts.map +1 -0
- package/esm/index.d.ts +33 -32
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -0
- package/esm/jobs.d.ts.map +1 -1
- package/esm/kv.d.ts +1 -1
- package/esm/kv.d.ts.map +1 -1
- package/esm/models/auth/rpc/Logout.d.ts.map +1 -1
- package/esm/models/trellis/Page.d.ts +1 -1
- package/esm/models/trellis/Page.d.ts.map +1 -1
- package/esm/models/trellis/State.d.ts +1 -1
- package/esm/models/trellis/State.d.ts.map +1 -1
- package/esm/models/trellis/TrellisError.d.ts.map +1 -1
- package/esm/models/trellis/rpc/StateDelete.d.ts.map +1 -1
- package/esm/models/trellis/rpc/StateGet.d.ts +1 -1
- package/esm/models/trellis/rpc/StateGet.d.ts.map +1 -1
- package/esm/models/trellis/rpc/StateList.d.ts.map +1 -1
- package/esm/models/trellis/rpc/StatePut.d.ts +1 -1
- package/esm/models/trellis/rpc/StatePut.d.ts.map +1 -1
- package/esm/operations.d.ts +4 -4
- package/esm/operations.d.ts.map +1 -1
- package/esm/runtime_transport.d.ts.map +1 -1
- package/esm/runtime_transport.js +2 -1
- package/esm/sdk/auth.d.ts +2 -0
- package/esm/sdk/auth.d.ts.map +1 -0
- package/esm/sdk/auth.js +1 -0
- package/esm/sdk/core.d.ts +2 -0
- package/esm/sdk/core.d.ts.map +1 -0
- package/esm/sdk/core.js +1 -0
- package/esm/sdk/health.d.ts +2 -0
- package/esm/sdk/health.d.ts.map +1 -0
- package/esm/sdk/health.js +1 -0
- package/esm/sdk/jobs.d.ts +2 -0
- package/esm/sdk/jobs.d.ts.map +1 -0
- package/esm/sdk/jobs.js +1 -0
- package/esm/sdk/state.d.ts +2 -0
- package/esm/sdk/state.d.ts.map +1 -0
- package/esm/sdk/state.js +1 -0
- package/esm/server/health.d.ts +2 -11
- package/esm/server/health.d.ts.map +1 -1
- package/esm/server/health.js +12 -11
- package/{script/npm/src → esm}/server/health_rpc.d.ts +1 -1
- package/esm/server/health_rpc.d.ts.map +1 -0
- package/esm/server/health_schemas.d.ts.map +1 -1
- package/esm/server/internal_jobs/active-job.d.ts.map +1 -0
- package/esm/server/internal_jobs/bindings.d.ts.map +1 -0
- package/esm/server/internal_jobs/cancellation-registry.d.ts.map +1 -0
- package/esm/server/internal_jobs/heartbeat.d.ts.map +1 -0
- package/esm/server/internal_jobs/job-manager.d.ts.map +1 -0
- package/esm/server/internal_jobs/projection.d.ts.map +1 -0
- package/esm/server/internal_jobs/runtime-worker.d.ts.map +1 -0
- package/esm/server/internal_jobs/types.d.ts.map +1 -0
- package/esm/server/runtime.d.ts.map +1 -0
- package/{script/npm/src → esm}/server/service.d.ts +4 -4
- package/esm/server/service.d.ts.map +1 -0
- package/esm/{npm/src/server → server}/service.js +3 -3
- package/esm/{npm/src/server → server}/subscription.d.ts +1 -1
- package/esm/server/subscription.d.ts.map +1 -0
- package/esm/server/transfer.d.ts.map +1 -0
- package/esm/server.d.ts.map +1 -0
- package/esm/server_logger.d.ts.map +1 -0
- package/esm/service/deno.d.ts.map +1 -0
- package/esm/service/mod.d.ts.map +1 -0
- package/esm/service/node.d.ts.map +1 -0
- package/esm/service/outbox_inbox.d.ts.map +1 -0
- package/esm/store.d.ts +2 -2
- package/esm/store.d.ts.map +1 -1
- package/esm/tasks.d.ts +1 -1
- package/esm/tasks.d.ts.map +1 -1
- package/esm/telemetry/carrier.d.ts.map +1 -1
- package/esm/telemetry/core.d.ts.map +1 -1
- package/esm/telemetry/env.d.ts.map +1 -1
- package/esm/telemetry/env.js +3 -2
- package/esm/telemetry/mod.d.ts +9 -9
- package/esm/telemetry/mod.d.ts.map +1 -1
- package/esm/telemetry/nats.d.ts +1 -1
- package/esm/telemetry/nats.d.ts.map +1 -1
- package/esm/telemetry/result.d.ts.map +1 -1
- package/esm/telemetry/trace.d.ts.map +1 -1
- package/esm/telemetry/trellis.d.ts +1 -1
- package/esm/telemetry/trellis.d.ts.map +1 -1
- package/esm/tracing.d.ts +3 -2
- package/esm/tracing.d.ts.map +1 -1
- package/esm/tracing.js +3 -0
- package/esm/transfer.d.ts +1 -1
- package/esm/transfer.d.ts.map +1 -1
- package/esm/trellis.d.ts +13 -13
- package/esm/trellis.d.ts.map +1 -1
- package/package.json +28 -28
- package/script/_dnt.polyfills.d.ts.map +1 -0
- package/script/_dnt.shims.d.ts.map +1 -0
- package/script/auth/browser/login.d.ts +3 -3
- package/script/auth/browser/login.d.ts.map +1 -1
- package/script/auth/browser/login.js +12 -12
- package/script/auth/browser/portal.d.ts +5 -5
- package/script/auth/browser/portal.d.ts.map +1 -1
- package/script/auth/browser/portal.js +3 -3
- package/script/auth/browser/session.d.ts.map +1 -1
- package/script/auth/browser/session.js +21 -21
- package/script/auth/browser/storage.d.ts.map +1 -1
- package/script/auth/browser.d.ts +8 -7
- package/script/auth/browser.d.ts.map +1 -1
- package/script/auth/browser.js +47 -46
- package/script/auth/device_activation.d.ts +3 -3
- package/script/auth/device_activation.d.ts.map +1 -1
- package/script/auth/device_activation.js +36 -36
- package/script/auth/keys.d.ts.map +1 -1
- package/script/auth/keys.js +6 -6
- package/script/auth/mod.d.ts +9 -9
- package/script/auth/mod.d.ts.map +1 -1
- package/script/auth/mod.js +232 -232
- package/script/auth/proof.d.ts.map +1 -1
- package/script/auth/proof.js +13 -13
- package/script/auth/protocol.d.ts +245 -5
- package/script/auth/protocol.d.ts.map +1 -1
- package/script/auth/protocol.js +29 -29
- package/script/auth/schemas.d.ts.map +1 -1
- package/script/auth/session_auth.d.ts.map +1 -1
- package/script/auth/session_auth.js +15 -15
- package/script/auth/time.d.ts.map +1 -1
- package/script/auth/trellis_id.d.ts.map +1 -1
- package/script/auth/trellis_id.js +3 -3
- package/script/auth/types.d.ts +1 -1
- package/script/auth/types.d.ts.map +1 -1
- package/script/auth/utils.d.ts.map +1 -1
- package/script/auth.d.ts +2 -1
- package/script/auth.d.ts.map +1 -1
- package/script/auth.js +1 -0
- package/script/browser.d.ts.map +1 -0
- package/script/client.d.ts +6 -6
- package/script/client.d.ts.map +1 -1
- package/script/client.js +6 -6
- package/script/client_connect.d.ts +8 -8
- package/script/client_connect.d.ts.map +1 -1
- package/script/client_connect.js +88 -54
- package/script/codec.d.ts +2 -2
- package/script/codec.d.ts.map +1 -1
- package/script/codec.js +15 -15
- package/script/connection.d.ts +1 -1
- package/script/connection.d.ts.map +1 -1
- package/script/connection.js +2 -2
- package/script/contract.d.ts +2 -2
- package/script/contract.d.ts.map +1 -1
- package/script/contract.js +5 -5
- package/script/contract_support/canonical.d.ts.map +1 -1
- package/script/contract_support/mod.d.ts +13 -13
- package/script/contract_support/mod.d.ts.map +1 -1
- package/script/contract_support/mod.js +64 -64
- package/script/contract_support/protocol.d.ts.map +1 -1
- package/script/contract_support/runtime.d.ts +1 -1
- package/script/contract_support/runtime.d.ts.map +1 -1
- package/script/contract_support/schema_pointers.d.ts.map +1 -1
- package/script/contracts.d.ts +4 -3
- package/script/contracts.d.ts.map +1 -1
- package/script/contracts.js +6 -5
- package/script/device/deno.d.ts.map +1 -0
- package/script/device.d.ts +9 -8
- package/script/device.d.ts.map +1 -1
- package/script/device.js +41 -40
- package/script/env.d.ts.map +1 -0
- package/script/errors/AuthError.d.ts +1 -1
- package/script/errors/AuthError.d.ts.map +1 -1
- package/script/errors/AuthError.js +2 -2
- package/script/errors/KVError.d.ts +1 -1
- package/script/errors/KVError.d.ts.map +1 -1
- package/script/errors/KVError.js +2 -2
- package/script/errors/OperationLifecycleError.d.ts +1 -1
- package/script/errors/OperationLifecycleError.d.ts.map +1 -1
- package/script/errors/OperationLifecycleError.js +4 -4
- package/script/errors/RemoteError.d.ts +10 -10
- package/script/errors/RemoteError.d.ts.map +1 -1
- package/script/errors/RemoteError.js +7 -7
- package/script/errors/StoreError.d.ts +1 -1
- package/script/errors/StoreError.d.ts.map +1 -1
- package/script/errors/StoreError.js +2 -2
- package/script/errors/TransferError.d.ts +1 -1
- package/script/errors/TransferError.d.ts.map +1 -1
- package/script/errors/TransferError.js +2 -2
- package/script/errors/TransportError.d.ts +1 -1
- package/script/errors/TransportError.d.ts.map +1 -1
- package/script/errors/TransportError.js +2 -2
- package/script/errors/TrellisError.d.ts.map +1 -1
- package/script/errors/ValidationError.d.ts +1 -1
- package/script/errors/ValidationError.d.ts.map +1 -1
- package/script/errors/ValidationError.js +2 -2
- package/script/errors/index.d.ts +33 -32
- package/script/errors/index.d.ts.map +1 -1
- package/script/errors/index.js +84 -83
- package/script/generate.d.ts.map +1 -0
- package/script/{npm/src/generate.js → generate.js} +1 -0
- package/script/generated-sdk/auth/api.d.ts +604 -3
- package/script/generated-sdk/auth/api.d.ts.map +1 -1
- package/script/generated-sdk/auth/api.js +4 -1
- package/script/generated-sdk/auth/client.d.ts +8 -0
- package/script/generated-sdk/auth/client.d.ts.map +1 -1
- package/script/generated-sdk/auth/contract.d.ts +600 -1
- package/script/generated-sdk/auth/contract.d.ts.map +1 -1
- package/script/generated-sdk/auth/mod.d.ts.map +1 -1
- package/script/generated-sdk/auth/owned_api.d.ts +601 -2
- package/script/generated-sdk/auth/owned_api.d.ts.map +1 -1
- package/script/generated-sdk/auth/owned_api.js +144 -144
- package/script/generated-sdk/auth/schemas.d.ts.map +1 -1
- package/script/generated-sdk/auth/types.d.ts.map +1 -1
- package/script/generated-sdk/health/api.d.ts +14 -2
- package/script/generated-sdk/health/api.d.ts.map +1 -1
- package/script/generated-sdk/health/client.d.ts.map +1 -1
- package/script/generated-sdk/health/contract.d.ts +14 -1
- package/script/generated-sdk/health/contract.d.ts.map +1 -1
- package/script/generated-sdk/health/mod.d.ts.map +1 -1
- package/script/generated-sdk/health/owned_api.d.ts +15 -2
- package/script/generated-sdk/health/owned_api.d.ts.map +1 -1
- package/script/generated-sdk/health/owned_api.js +2 -2
- package/script/generated-sdk/health/schemas.d.ts.map +1 -1
- package/script/generated-sdk/health/types.d.ts.map +1 -1
- package/script/generated-sdk/jobs/api.d.ts +105 -2
- package/script/generated-sdk/jobs/api.d.ts.map +1 -1
- package/script/generated-sdk/jobs/api.js +7 -7
- package/script/generated-sdk/jobs/client.d.ts.map +1 -1
- package/script/generated-sdk/jobs/contract.d.ts +105 -1
- package/script/generated-sdk/jobs/contract.d.ts.map +1 -1
- package/script/generated-sdk/jobs/mod.d.ts.map +1 -1
- package/script/generated-sdk/jobs/owned_api.d.ts +106 -2
- package/script/generated-sdk/jobs/owned_api.d.ts.map +1 -1
- package/script/generated-sdk/jobs/owned_api.js +24 -24
- package/script/generated-sdk/jobs/schemas.d.ts.map +1 -1
- package/script/generated-sdk/jobs/types.d.ts.map +1 -1
- package/script/generated-sdk/jobs/types.js +2 -2
- package/script/generated-sdk/state/api.d.ts +64 -2
- package/script/generated-sdk/state/api.d.ts.map +1 -1
- package/script/generated-sdk/state/api.js +2 -2
- package/script/generated-sdk/state/client.d.ts.map +1 -1
- package/script/generated-sdk/state/contract.d.ts +64 -1
- package/script/generated-sdk/state/contract.d.ts.map +1 -1
- package/script/generated-sdk/state/mod.d.ts.map +1 -1
- package/script/generated-sdk/state/owned_api.d.ts +65 -2
- package/script/generated-sdk/state/owned_api.d.ts.map +1 -1
- package/script/generated-sdk/state/owned_api.js +15 -15
- package/script/generated-sdk/state/schemas.d.ts.map +1 -1
- package/script/generated-sdk/state/types.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/api.d.ts +44 -3
- package/script/generated-sdk/trellis-core/api.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/api.js +4 -1
- package/script/generated-sdk/trellis-core/client.d.ts +14 -2
- package/script/generated-sdk/trellis-core/client.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/contract.d.ts +40 -1
- package/script/generated-sdk/trellis-core/contract.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/mod.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/owned_api.d.ts +41 -2
- package/script/generated-sdk/trellis-core/owned_api.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/owned_api.js +9 -9
- package/script/generated-sdk/trellis-core/schemas.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/types.d.ts.map +1 -1
- package/script/globals.d.ts.map +1 -1
- package/script/health.d.ts +4 -3
- package/script/health.d.ts.map +1 -1
- package/script/health.js +16 -15
- package/script/helpers.d.ts.map +1 -1
- package/script/host/mod.d.ts.map +1 -0
- package/script/host/node.d.ts.map +1 -0
- package/script/index.d.ts +33 -32
- package/script/index.d.ts.map +1 -1
- package/script/index.js +86 -85
- package/script/jobs.d.ts.map +1 -1
- package/script/jobs.js +3 -3
- package/script/kv.d.ts +1 -1
- package/script/kv.d.ts.map +1 -1
- package/script/kv.js +22 -22
- package/script/models/auth/rpc/Logout.d.ts.map +1 -1
- package/script/models/trellis/Page.d.ts +1 -1
- package/script/models/trellis/Page.d.ts.map +1 -1
- package/script/models/trellis/Page.js +3 -3
- package/script/models/trellis/State.d.ts +1 -1
- package/script/models/trellis/State.d.ts.map +1 -1
- package/script/models/trellis/TrellisError.d.ts.map +1 -1
- package/script/models/trellis/rpc/StateDelete.d.ts.map +1 -1
- package/script/models/trellis/rpc/StateGet.d.ts +1 -1
- package/script/models/trellis/rpc/StateGet.d.ts.map +1 -1
- package/script/models/trellis/rpc/StateGet.js +3 -3
- package/script/models/trellis/rpc/StateList.d.ts.map +1 -1
- package/script/models/trellis/rpc/StateList.js +3 -3
- package/script/models/trellis/rpc/StatePut.d.ts +1 -1
- package/script/models/trellis/rpc/StatePut.d.ts.map +1 -1
- package/script/models/trellis/rpc/StatePut.js +5 -5
- package/script/operations.d.ts +4 -4
- package/script/operations.d.ts.map +1 -1
- package/script/operations.js +16 -16
- package/script/runtime_transport.d.ts.map +1 -1
- package/script/runtime_transport.js +2 -1
- package/script/sdk/auth.d.ts +2 -0
- package/script/sdk/auth.d.ts.map +1 -0
- package/script/{npm/src/sdk → sdk}/auth.js +1 -1
- package/script/sdk/core.d.ts +2 -0
- package/script/sdk/core.d.ts.map +1 -0
- package/script/{npm/src/sdk/health.js → sdk/core.js} +1 -1
- package/script/sdk/health.d.ts +2 -0
- package/script/sdk/health.d.ts.map +1 -0
- package/script/sdk/health.js +17 -0
- package/script/sdk/jobs.d.ts +2 -0
- package/script/sdk/jobs.d.ts.map +1 -0
- package/script/{npm/src/sdk → sdk}/jobs.js +1 -1
- package/script/sdk/state.d.ts +2 -0
- package/script/sdk/state.d.ts.map +1 -0
- package/script/{npm/src/sdk → sdk}/state.js +1 -1
- package/script/server/health.d.ts +2 -11
- package/script/server/health.d.ts.map +1 -1
- package/script/server/health.js +45 -11
- package/{esm/npm/src → script}/server/health_rpc.d.ts +1 -1
- package/script/server/health_rpc.d.ts.map +1 -0
- package/script/server/health_schemas.d.ts.map +1 -1
- package/script/server/internal_jobs/active-job.d.ts.map +1 -0
- package/script/server/internal_jobs/bindings.d.ts.map +1 -0
- package/script/server/internal_jobs/cancellation-registry.d.ts.map +1 -0
- package/script/server/internal_jobs/heartbeat.d.ts.map +1 -0
- package/script/server/internal_jobs/job-manager.d.ts.map +1 -0
- package/script/server/internal_jobs/projection.d.ts.map +1 -0
- package/script/server/internal_jobs/runtime-worker.d.ts.map +1 -0
- package/script/server/internal_jobs/types.d.ts.map +1 -0
- package/script/server/runtime.d.ts.map +1 -0
- package/{esm/npm/src → script}/server/service.d.ts +4 -4
- package/script/server/service.d.ts.map +1 -0
- package/script/{npm/src/server → server}/service.js +19 -19
- package/script/{npm/src/server → server}/subscription.d.ts +1 -1
- package/script/server/subscription.d.ts.map +1 -0
- package/script/server/transfer.d.ts.map +1 -0
- package/script/server.d.ts.map +1 -0
- package/script/server_logger.d.ts.map +1 -0
- package/script/service/deno.d.ts.map +1 -0
- package/script/service/mod.d.ts.map +1 -0
- package/script/service/node.d.ts.map +1 -0
- package/script/service/outbox_inbox.d.ts.map +1 -0
- package/script/store.d.ts +2 -2
- package/script/store.d.ts.map +1 -1
- package/script/store.js +20 -20
- package/script/tasks.d.ts +1 -1
- package/script/tasks.d.ts.map +1 -1
- package/script/tasks.js +2 -2
- package/script/telemetry/carrier.d.ts.map +1 -1
- package/script/telemetry/core.d.ts.map +1 -1
- package/script/telemetry/env.d.ts.map +1 -1
- package/script/telemetry/env.js +36 -2
- package/script/telemetry/mod.d.ts +9 -9
- package/script/telemetry/mod.d.ts.map +1 -1
- package/script/telemetry/mod.js +23 -23
- package/script/telemetry/nats.d.ts +1 -1
- package/script/telemetry/nats.d.ts.map +1 -1
- package/script/telemetry/result.d.ts.map +1 -1
- package/script/telemetry/trace.d.ts.map +1 -1
- package/script/telemetry/trace.js +2 -2
- package/script/telemetry/trellis.d.ts +1 -1
- package/script/telemetry/trellis.d.ts.map +1 -1
- package/script/telemetry/trellis.js +4 -4
- package/script/tracing.d.ts +3 -2
- package/script/tracing.d.ts.map +1 -1
- package/script/tracing.js +19 -16
- package/script/transfer.d.ts +1 -1
- package/script/transfer.d.ts.map +1 -1
- package/script/transfer.js +26 -26
- package/script/trellis.d.ts +13 -13
- package/script/trellis.d.ts.map +1 -1
- package/script/trellis.js +127 -127
- package/src/auth/protocol.ts +1 -1
- package/src/generate.ts +1 -0
- package/src/sdk/_generated/auth/api.ts +3 -0
- package/src/sdk/_generated/auth/client.ts +5 -1
- package/src/sdk/_generated/auth/contract.ts +1 -1
- package/src/sdk/_generated/auth/owned_api.ts +2 -2
- package/src/sdk/_generated/auth/types.ts +1 -1
- package/src/sdk/_generated/core/api.ts +3 -0
- package/src/sdk/_generated/core/client.ts +7 -2
- package/src/sdk/_generated/core/contract.ts +1 -1
- package/src/sdk/_generated/core/owned_api.ts +2 -2
- package/src/sdk/_generated/core/types.ts +1 -1
- package/src/sdk/_generated/health/client.ts +1 -1
- package/src/sdk/_generated/health/contract.ts +1 -1
- package/src/sdk/_generated/health/owned_api.ts +2 -2
- package/src/sdk/_generated/jobs/api.ts +3 -3
- package/src/sdk/_generated/jobs/client.ts +4 -4
- package/src/sdk/_generated/jobs/contract.ts +1 -1
- package/src/sdk/_generated/jobs/owned_api.ts +2 -2
- package/src/sdk/_generated/jobs/types.ts +2 -2
- package/src/sdk/_generated/state/api.ts +1 -1
- package/src/sdk/_generated/state/client.ts +2 -2
- package/src/sdk/_generated/state/contract.ts +1 -1
- package/src/sdk/_generated/state/owned_api.ts +2 -2
- package/src/sdk/_generated/state/types.ts +1 -1
- package/src/server/health.ts +2 -2
- package/src/server/health_rpc.ts +1 -1
- package/src/server/service.ts +5 -5
- package/src/server/subscription.ts +1 -4
- package/esm/npm/src/_dnt.polyfills.d.ts.map +0 -1
- package/esm/npm/src/_dnt.shims.d.ts.map +0 -1
- package/esm/npm/src/auth/browser/login.d.ts +0 -34
- package/esm/npm/src/auth/browser/login.d.ts.map +0 -1
- package/esm/npm/src/auth/browser/login.js +0 -141
- package/esm/npm/src/auth/browser/portal.d.ts +0 -11
- package/esm/npm/src/auth/browser/portal.d.ts.map +0 -1
- package/esm/npm/src/auth/browser/portal.js +0 -37
- package/esm/npm/src/auth/browser/session.d.ts +0 -29
- package/esm/npm/src/auth/browser/session.d.ts.map +0 -1
- package/esm/npm/src/auth/browser/session.js +0 -109
- package/esm/npm/src/auth/browser/storage.d.ts +0 -17
- package/esm/npm/src/auth/browser/storage.d.ts.map +0 -1
- package/esm/npm/src/auth/browser/storage.js +0 -73
- package/esm/npm/src/auth/browser.d.ts +0 -14
- package/esm/npm/src/auth/browser.d.ts.map +0 -1
- package/esm/npm/src/auth/browser.js +0 -12
- package/esm/npm/src/auth/device_activation.d.ts +0 -146
- package/esm/npm/src/auth/device_activation.d.ts.map +0 -1
- package/esm/npm/src/auth/device_activation.js +0 -369
- package/esm/npm/src/auth/keys.d.ts +0 -8
- package/esm/npm/src/auth/keys.d.ts.map +0 -1
- package/esm/npm/src/auth/keys.js +0 -70
- package/esm/npm/src/auth/mod.d.ts +0 -19
- package/esm/npm/src/auth/mod.d.ts.map +0 -1
- package/esm/npm/src/auth/mod.js +0 -18
- package/esm/npm/src/auth/proof.d.ts +0 -11
- package/esm/npm/src/auth/proof.d.ts.map +0 -1
- package/esm/npm/src/auth/proof.js +0 -49
- package/esm/npm/src/auth/protocol.d.ts +0 -3108
- package/esm/npm/src/auth/protocol.d.ts.map +0 -1
- package/esm/npm/src/auth/protocol.js +0 -1329
- package/esm/npm/src/auth/schemas.d.ts +0 -163
- package/esm/npm/src/auth/schemas.d.ts.map +0 -1
- package/esm/npm/src/auth/schemas.js +0 -89
- package/esm/npm/src/auth/session_auth.d.ts +0 -26
- package/esm/npm/src/auth/session_auth.d.ts.map +0 -1
- package/esm/npm/src/auth/session_auth.js +0 -70
- package/esm/npm/src/auth/time.d.ts +0 -7
- package/esm/npm/src/auth/time.d.ts.map +0 -1
- package/esm/npm/src/auth/time.js +0 -7
- package/esm/npm/src/auth/trellis_id.d.ts +0 -2
- package/esm/npm/src/auth/trellis_id.d.ts.map +0 -1
- package/esm/npm/src/auth/trellis_id.js +0 -5
- package/esm/npm/src/auth/types.d.ts +0 -4
- package/esm/npm/src/auth/types.d.ts.map +0 -1
- package/esm/npm/src/auth/types.js +0 -1
- package/esm/npm/src/auth/utils.d.ts +0 -11
- package/esm/npm/src/auth/utils.d.ts.map +0 -1
- package/esm/npm/src/auth/utils.js +0 -69
- package/esm/npm/src/auth.d.ts +0 -3
- package/esm/npm/src/auth.d.ts.map +0 -1
- package/esm/npm/src/auth.js +0 -2
- package/esm/npm/src/browser.d.ts.map +0 -1
- package/esm/npm/src/client.d.ts +0 -60
- package/esm/npm/src/client.d.ts.map +0 -1
- package/esm/npm/src/client.js +0 -39
- package/esm/npm/src/client_connect.d.ts +0 -87
- package/esm/npm/src/client_connect.d.ts.map +0 -1
- package/esm/npm/src/client_connect.js +0 -839
- package/esm/npm/src/codec.d.ts +0 -13
- package/esm/npm/src/codec.d.ts.map +0 -1
- package/esm/npm/src/codec.js +0 -73
- package/esm/npm/src/connection.d.ts +0 -91
- package/esm/npm/src/connection.d.ts.map +0 -1
- package/esm/npm/src/connection.js +0 -305
- package/esm/npm/src/contract.d.ts +0 -23
- package/esm/npm/src/contract.d.ts.map +0 -1
- package/esm/npm/src/contract.js +0 -1
- package/esm/npm/src/contract_support/canonical.d.ts +0 -14
- package/esm/npm/src/contract_support/canonical.d.ts.map +0 -1
- package/esm/npm/src/contract_support/canonical.js +0 -190
- package/esm/npm/src/contract_support/mod.d.ts +0 -1188
- package/esm/npm/src/contract_support/mod.d.ts.map +0 -1
- package/esm/npm/src/contract_support/mod.js +0 -2182
- package/esm/npm/src/contract_support/protocol.d.ts +0 -384
- package/esm/npm/src/contract_support/protocol.d.ts.map +0 -1
- package/esm/npm/src/contract_support/protocol.js +0 -164
- package/esm/npm/src/contract_support/runtime.d.ts +0 -84
- package/esm/npm/src/contract_support/runtime.d.ts.map +0 -1
- package/esm/npm/src/contract_support/runtime.js +0 -9
- package/esm/npm/src/contract_support/schema_pointers.d.ts +0 -18
- package/esm/npm/src/contract_support/schema_pointers.d.ts.map +0 -1
- package/esm/npm/src/contract_support/schema_pointers.js +0 -79
- package/esm/npm/src/contracts.d.ts +0 -5
- package/esm/npm/src/contracts.d.ts.map +0 -1
- package/esm/npm/src/contracts.js +0 -3
- package/esm/npm/src/device/deno.d.ts.map +0 -1
- package/esm/npm/src/device.d.ts +0 -150
- package/esm/npm/src/device.d.ts.map +0 -1
- package/esm/npm/src/device.js +0 -549
- package/esm/npm/src/env.d.ts.map +0 -1
- package/esm/npm/src/errors/AuthError.d.ts +0 -31
- package/esm/npm/src/errors/AuthError.d.ts.map +0 -1
- package/esm/npm/src/errors/AuthError.js +0 -79
- package/esm/npm/src/errors/KVError.d.ts +0 -31
- package/esm/npm/src/errors/KVError.d.ts.map +0 -1
- package/esm/npm/src/errors/KVError.js +0 -46
- package/esm/npm/src/errors/OperationLifecycleError.d.ts +0 -111
- package/esm/npm/src/errors/OperationLifecycleError.d.ts.map +0 -1
- package/esm/npm/src/errors/OperationLifecycleError.js +0 -207
- package/esm/npm/src/errors/RemoteError.d.ts +0 -55
- package/esm/npm/src/errors/RemoteError.d.ts.map +0 -1
- package/esm/npm/src/errors/RemoteError.js +0 -81
- package/esm/npm/src/errors/StoreError.d.ts +0 -22
- package/esm/npm/src/errors/StoreError.d.ts.map +0 -1
- package/esm/npm/src/errors/StoreError.js +0 -41
- package/esm/npm/src/errors/TransferError.d.ts +0 -22
- package/esm/npm/src/errors/TransferError.d.ts.map +0 -1
- package/esm/npm/src/errors/TransferError.js +0 -41
- package/esm/npm/src/errors/TransportError.d.ts +0 -30
- package/esm/npm/src/errors/TransportError.d.ts.map +0 -1
- package/esm/npm/src/errors/TransportError.js +0 -48
- package/esm/npm/src/errors/TrellisError.d.ts +0 -16
- package/esm/npm/src/errors/TrellisError.d.ts.map +0 -1
- package/esm/npm/src/errors/TrellisError.js +0 -15
- package/esm/npm/src/errors/ValidationError.d.ts +0 -51
- package/esm/npm/src/errors/ValidationError.d.ts.map +0 -1
- package/esm/npm/src/errors/ValidationError.js +0 -77
- package/esm/npm/src/errors/index.d.ts +0 -212
- package/esm/npm/src/errors/index.d.ts.map +0 -1
- package/esm/npm/src/errors/index.js +0 -190
- package/esm/npm/src/generate.d.ts.map +0 -1
- package/esm/npm/src/globals.d.ts +0 -10
- package/esm/npm/src/globals.d.ts.map +0 -1
- package/esm/npm/src/globals.js +0 -16
- package/esm/npm/src/health.d.ts +0 -5
- package/esm/npm/src/health.d.ts.map +0 -1
- package/esm/npm/src/health.js +0 -3
- package/esm/npm/src/helpers.d.ts +0 -10
- package/esm/npm/src/helpers.d.ts.map +0 -1
- package/esm/npm/src/helpers.js +0 -38
- package/esm/npm/src/host/mod.d.ts.map +0 -1
- package/esm/npm/src/host/node.d.ts.map +0 -1
- package/esm/npm/src/index.d.ts +0 -37
- package/esm/npm/src/index.d.ts.map +0 -1
- package/esm/npm/src/index.js +0 -18
- package/esm/npm/src/jobs.d.ts +0 -145
- package/esm/npm/src/jobs.d.ts.map +0 -1
- package/esm/npm/src/jobs.js +0 -220
- package/esm/npm/src/kv.d.ts +0 -82
- package/esm/npm/src/kv.d.ts.map +0 -1
- package/esm/npm/src/kv.js +0 -448
- package/esm/npm/src/models/auth/rpc/Logout.d.ts +0 -8
- package/esm/npm/src/models/auth/rpc/Logout.d.ts.map +0 -1
- package/esm/npm/src/models/auth/rpc/Logout.js +0 -5
- package/esm/npm/src/models/trellis/Page.d.ts +0 -2
- package/esm/npm/src/models/trellis/Page.d.ts.map +0 -1
- package/esm/npm/src/models/trellis/Page.js +0 -1
- package/esm/npm/src/models/trellis/State.d.ts +0 -49
- package/esm/npm/src/models/trellis/State.d.ts.map +0 -1
- package/esm/npm/src/models/trellis/State.js +0 -29
- package/esm/npm/src/models/trellis/TrellisError.d.ts +0 -20
- package/esm/npm/src/models/trellis/TrellisError.d.ts.map +0 -1
- package/esm/npm/src/models/trellis/TrellisError.js +0 -15
- package/esm/npm/src/models/trellis/rpc/StateDelete.d.ts +0 -12
- package/esm/npm/src/models/trellis/rpc/StateDelete.d.ts.map +0 -1
- package/esm/npm/src/models/trellis/rpc/StateDelete.js +0 -9
- package/esm/npm/src/models/trellis/rpc/StateGet.d.ts +0 -38
- package/esm/npm/src/models/trellis/rpc/StateGet.d.ts.map +0 -1
- package/esm/npm/src/models/trellis/rpc/StateGet.js +0 -16
- package/esm/npm/src/models/trellis/rpc/StateList.d.ts +0 -35
- package/esm/npm/src/models/trellis/rpc/StateList.d.ts.map +0 -1
- package/esm/npm/src/models/trellis/rpc/StateList.js +0 -18
- package/esm/npm/src/models/trellis/rpc/StatePut.d.ts +0 -51
- package/esm/npm/src/models/trellis/rpc/StatePut.d.ts.map +0 -1
- package/esm/npm/src/models/trellis/rpc/StatePut.js +0 -26
- package/esm/npm/src/operations.d.ts +0 -171
- package/esm/npm/src/operations.d.ts.map +0 -1
- package/esm/npm/src/operations.js +0 -775
- package/esm/npm/src/runtime_transport.d.ts +0 -25
- package/esm/npm/src/runtime_transport.d.ts.map +0 -1
- package/esm/npm/src/runtime_transport.js +0 -84
- package/esm/npm/src/sdk/auth.d.ts +0 -2
- package/esm/npm/src/sdk/auth.d.ts.map +0 -1
- package/esm/npm/src/sdk/auth.js +0 -1
- package/esm/npm/src/sdk/core.d.ts +0 -2
- package/esm/npm/src/sdk/core.d.ts.map +0 -1
- package/esm/npm/src/sdk/core.js +0 -1
- package/esm/npm/src/sdk/health.d.ts +0 -2
- package/esm/npm/src/sdk/health.d.ts.map +0 -1
- package/esm/npm/src/sdk/health.js +0 -1
- package/esm/npm/src/sdk/jobs.d.ts +0 -2
- package/esm/npm/src/sdk/jobs.d.ts.map +0 -1
- package/esm/npm/src/sdk/jobs.js +0 -1
- package/esm/npm/src/sdk/state.d.ts +0 -2
- package/esm/npm/src/sdk/state.d.ts.map +0 -1
- package/esm/npm/src/sdk/state.js +0 -1
- package/esm/npm/src/server/health.d.ts +0 -161
- package/esm/npm/src/server/health.d.ts.map +0 -1
- package/esm/npm/src/server/health.js +0 -262
- package/esm/npm/src/server/health_rpc.d.ts.map +0 -1
- package/esm/npm/src/server/health_schemas.d.ts +0 -71
- package/esm/npm/src/server/health_schemas.d.ts.map +0 -1
- package/esm/npm/src/server/health_schemas.js +0 -54
- package/esm/npm/src/server/internal_jobs/active-job.d.ts.map +0 -1
- package/esm/npm/src/server/internal_jobs/bindings.d.ts.map +0 -1
- package/esm/npm/src/server/internal_jobs/cancellation-registry.d.ts.map +0 -1
- package/esm/npm/src/server/internal_jobs/heartbeat.d.ts.map +0 -1
- package/esm/npm/src/server/internal_jobs/job-manager.d.ts.map +0 -1
- package/esm/npm/src/server/internal_jobs/projection.d.ts.map +0 -1
- package/esm/npm/src/server/internal_jobs/runtime-worker.d.ts.map +0 -1
- package/esm/npm/src/server/internal_jobs/types.d.ts.map +0 -1
- package/esm/npm/src/server/runtime.d.ts.map +0 -1
- package/esm/npm/src/server/service.d.ts.map +0 -1
- package/esm/npm/src/server/subscription.d.ts.map +0 -1
- package/esm/npm/src/server/transfer.d.ts.map +0 -1
- package/esm/npm/src/server.d.ts.map +0 -1
- package/esm/npm/src/server_logger.d.ts.map +0 -1
- package/esm/npm/src/service/deno.d.ts.map +0 -1
- package/esm/npm/src/service/mod.d.ts.map +0 -1
- package/esm/npm/src/service/node.d.ts.map +0 -1
- package/esm/npm/src/service/outbox_inbox.d.ts.map +0 -1
- package/esm/npm/src/store.d.ts +0 -67
- package/esm/npm/src/store.d.ts.map +0 -1
- package/esm/npm/src/store.js +0 -474
- package/esm/npm/src/tasks.d.ts +0 -11
- package/esm/npm/src/tasks.d.ts.map +0 -1
- package/esm/npm/src/tasks.js +0 -41
- package/esm/npm/src/telemetry/carrier.d.ts +0 -9
- package/esm/npm/src/telemetry/carrier.d.ts.map +0 -1
- package/esm/npm/src/telemetry/carrier.js +0 -20
- package/esm/npm/src/telemetry/core.d.ts +0 -8
- package/esm/npm/src/telemetry/core.d.ts.map +0 -1
- package/esm/npm/src/telemetry/core.js +0 -14
- package/esm/npm/src/telemetry/env.d.ts +0 -2
- package/esm/npm/src/telemetry/env.d.ts.map +0 -1
- package/esm/npm/src/telemetry/env.js +0 -10
- package/esm/npm/src/telemetry/mod.d.ts +0 -10
- package/esm/npm/src/telemetry/mod.d.ts.map +0 -1
- package/esm/npm/src/telemetry/mod.js +0 -6
- package/esm/npm/src/telemetry/nats.d.ts +0 -7
- package/esm/npm/src/telemetry/nats.d.ts.map +0 -1
- package/esm/npm/src/telemetry/nats.js +0 -6
- package/esm/npm/src/telemetry/result.d.ts +0 -2
- package/esm/npm/src/telemetry/result.d.ts.map +0 -1
- package/esm/npm/src/telemetry/result.js +0 -18
- package/esm/npm/src/telemetry/trace.d.ts +0 -5
- package/esm/npm/src/telemetry/trace.d.ts.map +0 -1
- package/esm/npm/src/telemetry/trace.js +0 -26
- package/esm/npm/src/telemetry/trellis.d.ts +0 -2
- package/esm/npm/src/telemetry/trellis.d.ts.map +0 -1
- package/esm/npm/src/telemetry/trellis.js +0 -1
- package/esm/npm/src/tracing.d.ts +0 -5
- package/esm/npm/src/tracing.d.ts.map +0 -1
- package/esm/npm/src/tracing.js +0 -8
- package/esm/npm/src/transfer.d.ts +0 -118
- package/esm/npm/src/transfer.d.ts.map +0 -1
- package/esm/npm/src/transfer.js +0 -407
- package/esm/npm/src/trellis.d.ts +0 -678
- package/esm/npm/src/trellis.d.ts.map +0 -1
- package/esm/npm/src/trellis.js +0 -2284
- package/script/npm/src/_dnt.polyfills.d.ts.map +0 -1
- package/script/npm/src/_dnt.shims.d.ts.map +0 -1
- package/script/npm/src/auth/browser/login.d.ts +0 -34
- package/script/npm/src/auth/browser/login.d.ts.map +0 -1
- package/script/npm/src/auth/browser/login.js +0 -147
- package/script/npm/src/auth/browser/portal.d.ts +0 -11
- package/script/npm/src/auth/browser/portal.d.ts.map +0 -1
- package/script/npm/src/auth/browser/portal.js +0 -44
- package/script/npm/src/auth/browser/session.d.ts +0 -29
- package/script/npm/src/auth/browser/session.d.ts.map +0 -1
- package/script/npm/src/auth/browser/session.js +0 -122
- package/script/npm/src/auth/browser/storage.d.ts +0 -17
- package/script/npm/src/auth/browser/storage.d.ts.map +0 -1
- package/script/npm/src/auth/browser/storage.js +0 -79
- package/script/npm/src/auth/browser.d.ts +0 -14
- package/script/npm/src/auth/browser.d.ts.map +0 -1
- package/script/npm/src/auth/browser.js +0 -53
- package/script/npm/src/auth/device_activation.d.ts +0 -146
- package/script/npm/src/auth/device_activation.d.ts.map +0 -1
- package/script/npm/src/auth/device_activation.js +0 -387
- package/script/npm/src/auth/keys.d.ts +0 -8
- package/script/npm/src/auth/keys.d.ts.map +0 -1
- package/script/npm/src/auth/keys.js +0 -82
- package/script/npm/src/auth/mod.d.ts +0 -19
- package/script/npm/src/auth/mod.d.ts.map +0 -1
- package/script/npm/src/auth/mod.js +0 -248
- package/script/npm/src/auth/proof.d.ts +0 -11
- package/script/npm/src/auth/proof.d.ts.map +0 -1
- package/script/npm/src/auth/proof.js +0 -54
- package/script/npm/src/auth/protocol.d.ts +0 -3108
- package/script/npm/src/auth/protocol.d.ts.map +0 -1
- package/script/npm/src/auth/protocol.js +0 -1335
- package/script/npm/src/auth/schemas.d.ts +0 -163
- package/script/npm/src/auth/schemas.d.ts.map +0 -1
- package/script/npm/src/auth/schemas.js +0 -93
- package/script/npm/src/auth/session_auth.d.ts +0 -26
- package/script/npm/src/auth/session_auth.d.ts.map +0 -1
- package/script/npm/src/auth/session_auth.js +0 -74
- package/script/npm/src/auth/time.d.ts +0 -7
- package/script/npm/src/auth/time.d.ts.map +0 -1
- package/script/npm/src/auth/time.js +0 -11
- package/script/npm/src/auth/trellis_id.d.ts +0 -2
- package/script/npm/src/auth/trellis_id.d.ts.map +0 -1
- package/script/npm/src/auth/trellis_id.js +0 -8
- package/script/npm/src/auth/types.d.ts +0 -4
- package/script/npm/src/auth/types.d.ts.map +0 -1
- package/script/npm/src/auth/types.js +0 -2
- package/script/npm/src/auth/utils.d.ts +0 -11
- package/script/npm/src/auth/utils.d.ts.map +0 -1
- package/script/npm/src/auth/utils.js +0 -78
- package/script/npm/src/auth.d.ts +0 -3
- package/script/npm/src/auth.d.ts.map +0 -1
- package/script/npm/src/auth.js +0 -18
- package/script/npm/src/browser.d.ts.map +0 -1
- package/script/npm/src/client.d.ts +0 -60
- package/script/npm/src/client.d.ts.map +0 -1
- package/script/npm/src/client.js +0 -76
- package/script/npm/src/client_connect.d.ts +0 -87
- package/script/npm/src/client_connect.d.ts.map +0 -1
- package/script/npm/src/client_connect.js +0 -878
- package/script/npm/src/codec.d.ts +0 -13
- package/script/npm/src/codec.d.ts.map +0 -1
- package/script/npm/src/codec.js +0 -80
- package/script/npm/src/connection.d.ts +0 -91
- package/script/npm/src/connection.d.ts.map +0 -1
- package/script/npm/src/connection.js +0 -311
- package/script/npm/src/contract.d.ts +0 -23
- package/script/npm/src/contract.d.ts.map +0 -1
- package/script/npm/src/contract.js +0 -8
- package/script/npm/src/contract_support/canonical.d.ts +0 -14
- package/script/npm/src/contract_support/canonical.d.ts.map +0 -1
- package/script/npm/src/contract_support/canonical.js +0 -199
- package/script/npm/src/contract_support/mod.d.ts +0 -1188
- package/script/npm/src/contract_support/mod.d.ts.map +0 -1
- package/script/npm/src/contract_support/mod.js +0 -2225
- package/script/npm/src/contract_support/protocol.d.ts +0 -384
- package/script/npm/src/contract_support/protocol.d.ts.map +0 -1
- package/script/npm/src/contract_support/protocol.js +0 -171
- package/script/npm/src/contract_support/runtime.d.ts +0 -84
- package/script/npm/src/contract_support/runtime.d.ts.map +0 -1
- package/script/npm/src/contract_support/runtime.js +0 -13
- package/script/npm/src/contract_support/schema_pointers.d.ts +0 -18
- package/script/npm/src/contract_support/schema_pointers.d.ts.map +0 -1
- package/script/npm/src/contract_support/schema_pointers.js +0 -83
- package/script/npm/src/contracts.d.ts +0 -5
- package/script/npm/src/contracts.d.ts.map +0 -1
- package/script/npm/src/contracts.js +0 -24
- package/script/npm/src/device/deno.d.ts.map +0 -1
- package/script/npm/src/device.d.ts +0 -150
- package/script/npm/src/device.d.ts.map +0 -1
- package/script/npm/src/device.js +0 -555
- package/script/npm/src/env.d.ts.map +0 -1
- package/script/npm/src/errors/AuthError.d.ts +0 -31
- package/script/npm/src/errors/AuthError.d.ts.map +0 -1
- package/script/npm/src/errors/AuthError.js +0 -86
- package/script/npm/src/errors/KVError.d.ts +0 -31
- package/script/npm/src/errors/KVError.d.ts.map +0 -1
- package/script/npm/src/errors/KVError.js +0 -53
- package/script/npm/src/errors/OperationLifecycleError.d.ts +0 -111
- package/script/npm/src/errors/OperationLifecycleError.d.ts.map +0 -1
- package/script/npm/src/errors/OperationLifecycleError.js +0 -216
- package/script/npm/src/errors/RemoteError.d.ts +0 -55
- package/script/npm/src/errors/RemoteError.d.ts.map +0 -1
- package/script/npm/src/errors/RemoteError.js +0 -88
- package/script/npm/src/errors/StoreError.d.ts +0 -22
- package/script/npm/src/errors/StoreError.d.ts.map +0 -1
- package/script/npm/src/errors/StoreError.js +0 -48
- package/script/npm/src/errors/TransferError.d.ts +0 -22
- package/script/npm/src/errors/TransferError.d.ts.map +0 -1
- package/script/npm/src/errors/TransferError.js +0 -48
- package/script/npm/src/errors/TransportError.d.ts +0 -30
- package/script/npm/src/errors/TransportError.d.ts.map +0 -1
- package/script/npm/src/errors/TransportError.js +0 -55
- package/script/npm/src/errors/TrellisError.d.ts +0 -16
- package/script/npm/src/errors/TrellisError.d.ts.map +0 -1
- package/script/npm/src/errors/TrellisError.js +0 -19
- package/script/npm/src/errors/ValidationError.d.ts +0 -51
- package/script/npm/src/errors/ValidationError.d.ts.map +0 -1
- package/script/npm/src/errors/ValidationError.js +0 -84
- package/script/npm/src/errors/index.d.ts +0 -212
- package/script/npm/src/errors/index.d.ts.map +0 -1
- package/script/npm/src/errors/index.js +0 -217
- package/script/npm/src/generate.d.ts.map +0 -1
- package/script/npm/src/globals.d.ts +0 -10
- package/script/npm/src/globals.d.ts.map +0 -1
- package/script/npm/src/globals.js +0 -19
- package/script/npm/src/health.d.ts +0 -5
- package/script/npm/src/health.d.ts.map +0 -1
- package/script/npm/src/health.js +0 -19
- package/script/npm/src/helpers.d.ts +0 -10
- package/script/npm/src/helpers.d.ts.map +0 -1
- package/script/npm/src/helpers.js +0 -44
- package/script/npm/src/host/mod.d.ts.map +0 -1
- package/script/npm/src/host/node.d.ts.map +0 -1
- package/script/npm/src/index.d.ts +0 -37
- package/script/npm/src/index.d.ts.map +0 -1
- package/script/npm/src/index.js +0 -98
- package/script/npm/src/jobs.d.ts +0 -145
- package/script/npm/src/jobs.d.ts.map +0 -1
- package/script/npm/src/jobs.js +0 -227
- package/script/npm/src/kv.d.ts +0 -82
- package/script/npm/src/kv.d.ts.map +0 -1
- package/script/npm/src/kv.js +0 -486
- package/script/npm/src/models/auth/rpc/Logout.d.ts +0 -8
- package/script/npm/src/models/auth/rpc/Logout.d.ts.map +0 -1
- package/script/npm/src/models/auth/rpc/Logout.js +0 -11
- package/script/npm/src/models/trellis/Page.d.ts +0 -2
- package/script/npm/src/models/trellis/Page.d.ts.map +0 -1
- package/script/npm/src/models/trellis/Page.js +0 -6
- package/script/npm/src/models/trellis/State.d.ts +0 -49
- package/script/npm/src/models/trellis/State.d.ts.map +0 -1
- package/script/npm/src/models/trellis/State.js +0 -35
- package/script/npm/src/models/trellis/TrellisError.d.ts +0 -20
- package/script/npm/src/models/trellis/TrellisError.d.ts.map +0 -1
- package/script/npm/src/models/trellis/TrellisError.js +0 -21
- package/script/npm/src/models/trellis/rpc/StateDelete.d.ts +0 -12
- package/script/npm/src/models/trellis/rpc/StateDelete.d.ts.map +0 -1
- package/script/npm/src/models/trellis/rpc/StateDelete.js +0 -15
- package/script/npm/src/models/trellis/rpc/StateGet.d.ts +0 -38
- package/script/npm/src/models/trellis/rpc/StateGet.d.ts.map +0 -1
- package/script/npm/src/models/trellis/rpc/StateGet.js +0 -22
- package/script/npm/src/models/trellis/rpc/StateList.d.ts +0 -35
- package/script/npm/src/models/trellis/rpc/StateList.d.ts.map +0 -1
- package/script/npm/src/models/trellis/rpc/StateList.js +0 -24
- package/script/npm/src/models/trellis/rpc/StatePut.d.ts +0 -51
- package/script/npm/src/models/trellis/rpc/StatePut.d.ts.map +0 -1
- package/script/npm/src/models/trellis/rpc/StatePut.js +0 -32
- package/script/npm/src/operations.d.ts +0 -171
- package/script/npm/src/operations.d.ts.map +0 -1
- package/script/npm/src/operations.js +0 -780
- package/script/npm/src/runtime_transport.d.ts +0 -25
- package/script/npm/src/runtime_transport.d.ts.map +0 -1
- package/script/npm/src/runtime_transport.js +0 -122
- package/script/npm/src/sdk/auth.d.ts +0 -2
- package/script/npm/src/sdk/auth.d.ts.map +0 -1
- package/script/npm/src/sdk/core.d.ts +0 -2
- package/script/npm/src/sdk/core.d.ts.map +0 -1
- package/script/npm/src/sdk/core.js +0 -17
- package/script/npm/src/sdk/health.d.ts +0 -2
- package/script/npm/src/sdk/health.d.ts.map +0 -1
- package/script/npm/src/sdk/jobs.d.ts +0 -2
- package/script/npm/src/sdk/jobs.d.ts.map +0 -1
- package/script/npm/src/sdk/state.d.ts +0 -2
- package/script/npm/src/sdk/state.d.ts.map +0 -1
- package/script/npm/src/server/health.d.ts +0 -161
- package/script/npm/src/server/health.d.ts.map +0 -1
- package/script/npm/src/server/health.js +0 -304
- package/script/npm/src/server/health_rpc.d.ts.map +0 -1
- package/script/npm/src/server/health_schemas.d.ts +0 -71
- package/script/npm/src/server/health_schemas.d.ts.map +0 -1
- package/script/npm/src/server/health_schemas.js +0 -57
- package/script/npm/src/server/internal_jobs/active-job.d.ts.map +0 -1
- package/script/npm/src/server/internal_jobs/bindings.d.ts.map +0 -1
- package/script/npm/src/server/internal_jobs/cancellation-registry.d.ts.map +0 -1
- package/script/npm/src/server/internal_jobs/heartbeat.d.ts.map +0 -1
- package/script/npm/src/server/internal_jobs/job-manager.d.ts.map +0 -1
- package/script/npm/src/server/internal_jobs/projection.d.ts.map +0 -1
- package/script/npm/src/server/internal_jobs/runtime-worker.d.ts.map +0 -1
- package/script/npm/src/server/internal_jobs/types.d.ts.map +0 -1
- package/script/npm/src/server/runtime.d.ts.map +0 -1
- package/script/npm/src/server/service.d.ts.map +0 -1
- package/script/npm/src/server/subscription.d.ts.map +0 -1
- package/script/npm/src/server/transfer.d.ts.map +0 -1
- package/script/npm/src/server.d.ts.map +0 -1
- package/script/npm/src/server_logger.d.ts.map +0 -1
- package/script/npm/src/service/deno.d.ts.map +0 -1
- package/script/npm/src/service/mod.d.ts.map +0 -1
- package/script/npm/src/service/node.d.ts.map +0 -1
- package/script/npm/src/service/outbox_inbox.d.ts.map +0 -1
- package/script/npm/src/store.d.ts +0 -67
- package/script/npm/src/store.d.ts.map +0 -1
- package/script/npm/src/store.js +0 -480
- package/script/npm/src/tasks.d.ts +0 -11
- package/script/npm/src/tasks.d.ts.map +0 -1
- package/script/npm/src/tasks.js +0 -45
- package/script/npm/src/telemetry/carrier.d.ts +0 -9
- package/script/npm/src/telemetry/carrier.d.ts.map +0 -1
- package/script/npm/src/telemetry/carrier.js +0 -25
- package/script/npm/src/telemetry/core.d.ts +0 -8
- package/script/npm/src/telemetry/core.d.ts.map +0 -1
- package/script/npm/src/telemetry/core.js +0 -24
- package/script/npm/src/telemetry/env.d.ts +0 -2
- package/script/npm/src/telemetry/env.d.ts.map +0 -1
- package/script/npm/src/telemetry/env.js +0 -46
- package/script/npm/src/telemetry/mod.d.ts +0 -10
- package/script/npm/src/telemetry/mod.d.ts.map +0 -1
- package/script/npm/src/telemetry/mod.js +0 -26
- package/script/npm/src/telemetry/nats.d.ts +0 -7
- package/script/npm/src/telemetry/nats.d.ts.map +0 -1
- package/script/npm/src/telemetry/nats.js +0 -9
- package/script/npm/src/telemetry/result.d.ts +0 -2
- package/script/npm/src/telemetry/result.d.ts.map +0 -1
- package/script/npm/src/telemetry/result.js +0 -21
- package/script/npm/src/telemetry/trace.d.ts +0 -5
- package/script/npm/src/telemetry/trace.d.ts.map +0 -1
- package/script/npm/src/telemetry/trace.js +0 -31
- package/script/npm/src/telemetry/trellis.d.ts +0 -2
- package/script/npm/src/telemetry/trellis.d.ts.map +0 -1
- package/script/npm/src/telemetry/trellis.js +0 -7
- package/script/npm/src/tracing.d.ts +0 -5
- package/script/npm/src/tracing.d.ts.map +0 -1
- package/script/npm/src/tracing.js +0 -27
- package/script/npm/src/transfer.d.ts +0 -118
- package/script/npm/src/transfer.d.ts.map +0 -1
- package/script/npm/src/transfer.js +0 -417
- package/script/npm/src/trellis.d.ts +0 -678
- package/script/npm/src/trellis.d.ts.map +0 -1
- package/script/npm/src/trellis.js +0 -2299
- /package/esm/{npm/src/_dnt.polyfills.d.ts → _dnt.polyfills.d.ts} +0 -0
- /package/esm/{npm/src/_dnt.polyfills.js → _dnt.polyfills.js} +0 -0
- /package/esm/{npm/src/_dnt.shims.d.ts → _dnt.shims.d.ts} +0 -0
- /package/esm/{npm/src/_dnt.shims.js → _dnt.shims.js} +0 -0
- /package/esm/{npm/src/browser.d.ts → browser.d.ts} +0 -0
- /package/esm/{npm/src/browser.js → browser.js} +0 -0
- /package/esm/{npm/src/device → device}/deno.d.ts +0 -0
- /package/esm/{npm/src/device → device}/deno.js +0 -0
- /package/esm/{npm/src/env.d.ts → env.d.ts} +0 -0
- /package/esm/{npm/src/env.js → env.js} +0 -0
- /package/esm/{npm/src/generate.d.ts → generate.d.ts} +0 -0
- /package/esm/{npm/src/host → host}/mod.d.ts +0 -0
- /package/esm/{npm/src/host → host}/mod.js +0 -0
- /package/esm/{npm/src/host → host}/node.d.ts +0 -0
- /package/esm/{npm/src/host → host}/node.js +0 -0
- /package/esm/{npm/src/server → server}/health_rpc.js +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/active-job.d.ts +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/active-job.js +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/bindings.d.ts +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/bindings.js +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/cancellation-registry.d.ts +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/cancellation-registry.js +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/heartbeat.d.ts +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/heartbeat.js +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/job-manager.d.ts +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/job-manager.js +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/projection.d.ts +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/projection.js +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/runtime-worker.d.ts +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/runtime-worker.js +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/types.d.ts +0 -0
- /package/esm/{npm/src/server → server}/internal_jobs/types.js +0 -0
- /package/esm/{npm/src/server → server}/runtime.d.ts +0 -0
- /package/esm/{npm/src/server → server}/runtime.js +0 -0
- /package/esm/{npm/src/server → server}/subscription.js +0 -0
- /package/esm/{npm/src/server → server}/transfer.d.ts +0 -0
- /package/esm/{npm/src/server → server}/transfer.js +0 -0
- /package/esm/{npm/src/server.d.ts → server.d.ts} +0 -0
- /package/esm/{npm/src/server.js → server.js} +0 -0
- /package/esm/{npm/src/server_logger.d.ts → server_logger.d.ts} +0 -0
- /package/esm/{npm/src/server_logger.js → server_logger.js} +0 -0
- /package/esm/{npm/src/service → service}/deno.d.ts +0 -0
- /package/esm/{npm/src/service → service}/deno.js +0 -0
- /package/esm/{npm/src/service → service}/mod.d.ts +0 -0
- /package/esm/{npm/src/service → service}/mod.js +0 -0
- /package/esm/{npm/src/service → service}/node.d.ts +0 -0
- /package/esm/{npm/src/service → service}/node.js +0 -0
- /package/esm/{npm/src/service → service}/outbox_inbox.d.ts +0 -0
- /package/esm/{npm/src/service → service}/outbox_inbox.js +0 -0
- /package/script/{npm/src/_dnt.polyfills.d.ts → _dnt.polyfills.d.ts} +0 -0
- /package/script/{npm/src/_dnt.polyfills.js → _dnt.polyfills.js} +0 -0
- /package/script/{npm/src/_dnt.shims.d.ts → _dnt.shims.d.ts} +0 -0
- /package/script/{npm/src/_dnt.shims.js → _dnt.shims.js} +0 -0
- /package/script/{npm/src/browser.d.ts → browser.d.ts} +0 -0
- /package/script/{npm/src/browser.js → browser.js} +0 -0
- /package/script/{npm/src/device → device}/deno.d.ts +0 -0
- /package/script/{npm/src/device → device}/deno.js +0 -0
- /package/script/{npm/src/env.d.ts → env.d.ts} +0 -0
- /package/script/{npm/src/env.js → env.js} +0 -0
- /package/script/{npm/src/generate.d.ts → generate.d.ts} +0 -0
- /package/script/{npm/src/host → host}/mod.d.ts +0 -0
- /package/script/{npm/src/host → host}/mod.js +0 -0
- /package/script/{npm/src/host → host}/node.d.ts +0 -0
- /package/script/{npm/src/host → host}/node.js +0 -0
- /package/script/{npm/src/server → server}/health_rpc.js +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/active-job.d.ts +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/active-job.js +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/bindings.d.ts +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/bindings.js +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/cancellation-registry.d.ts +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/cancellation-registry.js +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/heartbeat.d.ts +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/heartbeat.js +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/job-manager.d.ts +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/job-manager.js +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/projection.d.ts +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/projection.js +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/runtime-worker.d.ts +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/runtime-worker.js +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/types.d.ts +0 -0
- /package/script/{npm/src/server → server}/internal_jobs/types.js +0 -0
- /package/script/{npm/src/server → server}/runtime.d.ts +0 -0
- /package/script/{npm/src/server → server}/runtime.js +0 -0
- /package/script/{npm/src/server → server}/subscription.js +0 -0
- /package/script/{npm/src/server → server}/transfer.d.ts +0 -0
- /package/script/{npm/src/server → server}/transfer.js +0 -0
- /package/script/{npm/src/server.d.ts → server.d.ts} +0 -0
- /package/script/{npm/src/server.js → server.js} +0 -0
- /package/script/{npm/src/server_logger.d.ts → server_logger.d.ts} +0 -0
- /package/script/{npm/src/server_logger.js → server_logger.js} +0 -0
- /package/script/{npm/src/service → service}/deno.d.ts +0 -0
- /package/script/{npm/src/service → service}/deno.js +0 -0
- /package/script/{npm/src/service → service}/mod.d.ts +0 -0
- /package/script/{npm/src/service → service}/mod.js +0 -0
- /package/script/{npm/src/service → service}/node.d.ts +0 -0
- /package/script/{npm/src/service → service}/node.js +0 -0
- /package/script/{npm/src/service → service}/outbox_inbox.d.ts +0 -0
- /package/script/{npm/src/service → service}/outbox_inbox.js +0 -0
package/esm/npm/src/trellis.js
DELETED
|
@@ -1,2284 +0,0 @@
|
|
|
1
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
-
};
|
|
7
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
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
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
-
};
|
|
12
|
-
var _Trellis_instances, _Trellis_log, _Trellis_tasks, _Trellis_hasExplicitApi, _Trellis_noResponderMaxRetries, _Trellis_noResponderRetryMs, _Trellis_onSessionNotFound, _Trellis_operationStore, _Trellis_eventConsumers, _Trellis_durableEventLoops, _Trellis_createStateFacade, _Trellis_createRpcFacade, _Trellis_createRpcHandleFacade, _Trellis_createEventFacade, _Trellis_createEventPublishFacade, _Trellis_createFeedFacade, _Trellis_createHandlerTrellis, _Trellis_createOperationFacade, _Trellis_unknownApiError, _Trellis_requestBuiltRpcUnknown, _Trellis_requestBuiltRpc, _Trellis_handleBrowserAuthRequired, _Trellis_authenticateFeedRequest, _Trellis_subscribeFeed, _Trellis_handleFeed, _Trellis_processFeedMessage, _Trellis_handleRPC, _Trellis_processRPCMessage, _Trellis_respondWithPayload, _Trellis_respondWithError, _Trellis_startEphemeralEvent, _Trellis_resolveEventConsumerGroup, _Trellis_registerDurableEventHandler, _Trellis_startDurableEventConsumer, _Trellis_durableEventConsumerGroupReady, _Trellis_runDurableEventConsumer, _Trellis_handleDurableEvent, _Trellis_handleDurableEventConsumer, _Trellis_parseEventMessage, _Trellis_escapeSubjectToken, _Trellis_currentIat, _Trellis_createProof, _Trellis_requestMessageWithRetry, _Trellis_requestJson, _Trellis_watchJson;
|
|
13
|
-
import { jetstream, jetstreamManager, } from "@nats-io/jetstream";
|
|
14
|
-
import { createInbox, headers as natsHeaders, } from "@nats-io/nats-core";
|
|
15
|
-
import { CONTRACT_JOBS_METADATA, CONTRACT_KV_METADATA, CONTRACT_STATE_METADATA, } from "./contract_support/mod.js";
|
|
16
|
-
import { AsyncResult, BaseError, err, isErr, ok, Result, } from "@qlever-llc/result";
|
|
17
|
-
import { createNatsHeaderCarrier, extractTraceContext, injectTraceContext, SpanStatusCode, startClientSpan, startServerSpan, withSpanAsync, } from "./tracing.js";
|
|
18
|
-
import { Type } from "typebox";
|
|
19
|
-
import { Pointer } from "typebox/value";
|
|
20
|
-
import { ulid } from "ulid";
|
|
21
|
-
import { encodeSchema, parse, parseUnknownSchema, } from "./codec.js";
|
|
22
|
-
import { AuthError, getBuiltinRpcError, TransferError, TransportError, UnexpectedError, ValidationError, } from "./errors/index.js";
|
|
23
|
-
import { RemoteError } from "./errors/RemoteError.js";
|
|
24
|
-
import { logger } from "./globals.js";
|
|
25
|
-
import { TypedKV } from "./kv.js";
|
|
26
|
-
import { TrellisErrorDataSchema } from "./models/trellis/TrellisError.js";
|
|
27
|
-
import { OperationInvoker, } from "./operations.js";
|
|
28
|
-
import { StateDeleteResponseSchema, StateDeleteSchema, } from "./models/trellis/rpc/StateDelete.js";
|
|
29
|
-
import { StateGetResponseSchema, StateGetSchema, } from "./models/trellis/rpc/StateGet.js";
|
|
30
|
-
import { StateListResponseSchema, StateListSchema, } from "./models/trellis/rpc/StateList.js";
|
|
31
|
-
import { StatePutResponseSchema, StatePutSchema, } from "./models/trellis/rpc/StatePut.js";
|
|
32
|
-
import { createTransferHandle, } from "./transfer.js";
|
|
33
|
-
import { TrellisTasks } from "./tasks.js";
|
|
34
|
-
import { TrellisConnection } from "./connection.js";
|
|
35
|
-
/**
|
|
36
|
-
* Safely extract JSON from a NATS message.
|
|
37
|
-
* The .json() method can throw if the message data is not valid JSON.
|
|
38
|
-
*/
|
|
39
|
-
export function safeJson(msg) {
|
|
40
|
-
return Result.try(() => msg.json());
|
|
41
|
-
}
|
|
42
|
-
function transportCauseContext(cause) {
|
|
43
|
-
if (cause instanceof Error) {
|
|
44
|
-
return {
|
|
45
|
-
causeName: cause.name,
|
|
46
|
-
causeMessage: cause.message,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
return { cause: String(cause) };
|
|
50
|
-
}
|
|
51
|
-
function createTransportError(args) {
|
|
52
|
-
return new TransportError({
|
|
53
|
-
code: args.code,
|
|
54
|
-
message: args.message,
|
|
55
|
-
hint: args.hint,
|
|
56
|
-
cause: args.cause,
|
|
57
|
-
context: {
|
|
58
|
-
...(args.context ?? {}),
|
|
59
|
-
...(args.cause === undefined ? {} : transportCauseContext(args.cause)),
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
function requestFailedTransportError(args) {
|
|
64
|
-
return createTransportError({
|
|
65
|
-
code: args.code,
|
|
66
|
-
message: args.message,
|
|
67
|
-
hint: args.hint,
|
|
68
|
-
cause: args.cause,
|
|
69
|
-
context: {
|
|
70
|
-
subject: args.subject,
|
|
71
|
-
...(args.method === undefined ? {} : { method: args.method }),
|
|
72
|
-
...(args.context ?? {}),
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
function classifyRequestTransportFailure(args) {
|
|
77
|
-
const message = args.cause instanceof Error
|
|
78
|
-
? args.cause.message
|
|
79
|
-
: String(args.cause);
|
|
80
|
-
const isNoResponders = message.includes("no responders");
|
|
81
|
-
const isNatsPermission = message.includes("Permissions Violation");
|
|
82
|
-
return requestFailedTransportError({
|
|
83
|
-
code: isNoResponders
|
|
84
|
-
? "trellis.request.unavailable"
|
|
85
|
-
: isNatsPermission
|
|
86
|
-
? "trellis.request.denied"
|
|
87
|
-
: "trellis.request.failed",
|
|
88
|
-
message: isNoResponders
|
|
89
|
-
? "Trellis could not reach the requested capability."
|
|
90
|
-
: isNatsPermission
|
|
91
|
-
? "Trellis denied this request."
|
|
92
|
-
: "Trellis could not complete the request.",
|
|
93
|
-
hint: isNoResponders
|
|
94
|
-
? "Check that the target service is installed and reachable, then try again."
|
|
95
|
-
: isNatsPermission
|
|
96
|
-
? "Sign in with a profile that has the required capability, then try again."
|
|
97
|
-
: "Retry the request. If it keeps failing, check Trellis runtime health.",
|
|
98
|
-
cause: args.cause,
|
|
99
|
-
method: args.method,
|
|
100
|
-
subject: args.subject,
|
|
101
|
-
context: {
|
|
102
|
-
...(args.callerCapabilities === undefined
|
|
103
|
-
? {}
|
|
104
|
-
: { requiredCapabilities: args.callerCapabilities }),
|
|
105
|
-
noResponders: isNoResponders,
|
|
106
|
-
lowLevelMessage: message,
|
|
107
|
-
},
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
function encodeRuntimeSchema(schema, data) {
|
|
111
|
-
return encodeSchema(schema, data);
|
|
112
|
-
}
|
|
113
|
-
function parseRuntimeSchema(schema, data) {
|
|
114
|
-
return parseUnknownSchema(schema, data);
|
|
115
|
-
}
|
|
116
|
-
export function base64urlEncode(data) {
|
|
117
|
-
const b64 = btoa(String.fromCharCode(...data));
|
|
118
|
-
return b64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
|
|
119
|
-
}
|
|
120
|
-
export function base64urlDecode(s) {
|
|
121
|
-
const normalized = s.replace(/-/g, "+").replace(/_/g, "/");
|
|
122
|
-
const padLen = (4 - (normalized.length % 4)) % 4;
|
|
123
|
-
const padded = normalized + "=".repeat(padLen);
|
|
124
|
-
const bin = atob(padded);
|
|
125
|
-
const out = new Uint8Array(bin.length);
|
|
126
|
-
for (let i = 0; i < bin.length; i++)
|
|
127
|
-
out[i] = bin.charCodeAt(i);
|
|
128
|
-
return out;
|
|
129
|
-
}
|
|
130
|
-
export function toArrayBuffer(data) {
|
|
131
|
-
const buf = data.buffer;
|
|
132
|
-
if (buf instanceof ArrayBuffer) {
|
|
133
|
-
return buf.slice(data.byteOffset, data.byteOffset + data.byteLength);
|
|
134
|
-
}
|
|
135
|
-
const copy = new Uint8Array(data.byteLength);
|
|
136
|
-
copy.set(data);
|
|
137
|
-
return copy.buffer;
|
|
138
|
-
}
|
|
139
|
-
export async function sha256(data) {
|
|
140
|
-
const digest = await crypto.subtle.digest("SHA-256", toArrayBuffer(data));
|
|
141
|
-
return new Uint8Array(digest);
|
|
142
|
-
}
|
|
143
|
-
export function buildProofInput(sessionKey, subject, payloadHash, iat, requestId) {
|
|
144
|
-
const enc = new TextEncoder();
|
|
145
|
-
const sessionKeyBytes = enc.encode(sessionKey);
|
|
146
|
-
const subjectBytes = enc.encode(subject);
|
|
147
|
-
const iatBytes = enc.encode(String(iat));
|
|
148
|
-
const requestIdBytes = enc.encode(requestId);
|
|
149
|
-
const buf = new Uint8Array(4 +
|
|
150
|
-
sessionKeyBytes.length +
|
|
151
|
-
4 +
|
|
152
|
-
subjectBytes.length +
|
|
153
|
-
4 +
|
|
154
|
-
payloadHash.length +
|
|
155
|
-
4 +
|
|
156
|
-
iatBytes.length +
|
|
157
|
-
4 +
|
|
158
|
-
requestIdBytes.length);
|
|
159
|
-
const view = new DataView(buf.buffer);
|
|
160
|
-
let offset = 0;
|
|
161
|
-
view.setUint32(offset, sessionKeyBytes.length);
|
|
162
|
-
offset += 4;
|
|
163
|
-
buf.set(sessionKeyBytes, offset);
|
|
164
|
-
offset += sessionKeyBytes.length;
|
|
165
|
-
view.setUint32(offset, subjectBytes.length);
|
|
166
|
-
offset += 4;
|
|
167
|
-
buf.set(subjectBytes, offset);
|
|
168
|
-
offset += subjectBytes.length;
|
|
169
|
-
view.setUint32(offset, payloadHash.length);
|
|
170
|
-
offset += 4;
|
|
171
|
-
buf.set(payloadHash, offset);
|
|
172
|
-
offset += payloadHash.length;
|
|
173
|
-
view.setUint32(offset, iatBytes.length);
|
|
174
|
-
offset += 4;
|
|
175
|
-
buf.set(iatBytes, offset);
|
|
176
|
-
offset += iatBytes.length;
|
|
177
|
-
view.setUint32(offset, requestIdBytes.length);
|
|
178
|
-
offset += 4;
|
|
179
|
-
buf.set(requestIdBytes, offset);
|
|
180
|
-
return buf;
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Returns true when a handler result explicitly leaves operation completion to
|
|
184
|
-
* an external control path.
|
|
185
|
-
*/
|
|
186
|
-
export function isOperationDeferred(value) {
|
|
187
|
-
return !!value && typeof value === "object" &&
|
|
188
|
-
"kind" in value && value.kind === "deferred";
|
|
189
|
-
}
|
|
190
|
-
export function isResultLike(value) {
|
|
191
|
-
return value instanceof Result;
|
|
192
|
-
}
|
|
193
|
-
const DurableOperationSignalSchema = Type.Object({
|
|
194
|
-
operationId: Type.String(),
|
|
195
|
-
sequence: Type.Number(),
|
|
196
|
-
signal: Type.String(),
|
|
197
|
-
input: Type.Optional(Type.Any()),
|
|
198
|
-
acceptedAt: Type.String(),
|
|
199
|
-
});
|
|
200
|
-
const DurableOperationSnapshotSchema = Type.Object({
|
|
201
|
-
id: Type.String(),
|
|
202
|
-
service: Type.String(),
|
|
203
|
-
operation: Type.String(),
|
|
204
|
-
revision: Type.Number(),
|
|
205
|
-
state: Type.Union([
|
|
206
|
-
Type.Literal("pending"),
|
|
207
|
-
Type.Literal("running"),
|
|
208
|
-
Type.Literal("completed"),
|
|
209
|
-
Type.Literal("failed"),
|
|
210
|
-
Type.Literal("cancelled"),
|
|
211
|
-
]),
|
|
212
|
-
createdAt: Type.String(),
|
|
213
|
-
updatedAt: Type.String(),
|
|
214
|
-
completedAt: Type.Optional(Type.String()),
|
|
215
|
-
progress: Type.Optional(Type.Any()),
|
|
216
|
-
transfer: Type.Optional(Type.Object({
|
|
217
|
-
chunkIndex: Type.Number(),
|
|
218
|
-
chunkBytes: Type.Number(),
|
|
219
|
-
transferredBytes: Type.Number(),
|
|
220
|
-
})),
|
|
221
|
-
output: Type.Optional(Type.Any()),
|
|
222
|
-
error: Type.Optional(Type.Object({
|
|
223
|
-
type: Type.String(),
|
|
224
|
-
message: Type.String(),
|
|
225
|
-
})),
|
|
226
|
-
});
|
|
227
|
-
export const DurableOperationRecordSchema = Type.Object({
|
|
228
|
-
ownerSessionKey: Type.String(),
|
|
229
|
-
sequence: Type.Number(),
|
|
230
|
-
signalSequence: Type.Optional(Type.Number()),
|
|
231
|
-
signals: Type.Optional(Type.Array(DurableOperationSignalSchema)),
|
|
232
|
-
snapshot: DurableOperationSnapshotSchema,
|
|
233
|
-
});
|
|
234
|
-
export function buildRuntimeOperationSnapshot(runtime, state, patch) {
|
|
235
|
-
const updatedAt = new Date().toISOString();
|
|
236
|
-
const completedAt = state === "completed" || state === "failed" || state === "cancelled"
|
|
237
|
-
? (patch?.completedAt ?? updatedAt)
|
|
238
|
-
: patch?.completedAt;
|
|
239
|
-
return {
|
|
240
|
-
id: runtime.id,
|
|
241
|
-
service: runtime.service,
|
|
242
|
-
operation: runtime.operation,
|
|
243
|
-
revision: patch?.revision ?? runtime.snapshot.revision + 1,
|
|
244
|
-
state,
|
|
245
|
-
createdAt: patch?.createdAt ?? runtime.snapshot.createdAt,
|
|
246
|
-
updatedAt,
|
|
247
|
-
...(completedAt ? { completedAt } : {}),
|
|
248
|
-
...(patch?.progress !== undefined
|
|
249
|
-
? { progress: patch.progress }
|
|
250
|
-
: runtime.snapshot.progress !== undefined
|
|
251
|
-
? { progress: runtime.snapshot.progress }
|
|
252
|
-
: {}),
|
|
253
|
-
...(patch?.transfer !== undefined
|
|
254
|
-
? { transfer: patch.transfer }
|
|
255
|
-
: runtime.snapshot.transfer !== undefined
|
|
256
|
-
? { transfer: runtime.snapshot.transfer }
|
|
257
|
-
: {}),
|
|
258
|
-
...(patch?.output !== undefined
|
|
259
|
-
? { output: patch.output }
|
|
260
|
-
: runtime.snapshot.output !== undefined
|
|
261
|
-
? { output: runtime.snapshot.output }
|
|
262
|
-
: {}),
|
|
263
|
-
...(patch?.error
|
|
264
|
-
? { error: patch.error }
|
|
265
|
-
: runtime.snapshot.error
|
|
266
|
-
? { error: runtime.snapshot.error }
|
|
267
|
-
: {}),
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
function isRuntimeOperationSnapshot(value) {
|
|
271
|
-
return !!value && typeof value === "object" &&
|
|
272
|
-
typeof value.id === "string" &&
|
|
273
|
-
typeof value.service === "string" &&
|
|
274
|
-
typeof value.operation === "string" &&
|
|
275
|
-
typeof value.revision === "number" &&
|
|
276
|
-
typeof value.state === "string" &&
|
|
277
|
-
typeof value.createdAt === "string" &&
|
|
278
|
-
typeof value.updatedAt === "string";
|
|
279
|
-
}
|
|
280
|
-
export function isTerminalRuntimeOperationSnapshot(value) {
|
|
281
|
-
return isRuntimeOperationSnapshot(value) && (value.state === "completed" || value.state === "failed" ||
|
|
282
|
-
value.state === "cancelled");
|
|
283
|
-
}
|
|
284
|
-
let pendingInternalEventConsumers;
|
|
285
|
-
/**
|
|
286
|
-
* Creates a Trellis runtime with bootstrap-resolved bindings.
|
|
287
|
-
*
|
|
288
|
-
* @internal
|
|
289
|
-
*/
|
|
290
|
-
export function createTrellisInternal(name, nats, auth, opts) {
|
|
291
|
-
const { eventConsumers, ...publicOpts } = opts ?? {};
|
|
292
|
-
pendingInternalEventConsumers = eventConsumers;
|
|
293
|
-
try {
|
|
294
|
-
return new Trellis(name, nats, auth, publicOpts);
|
|
295
|
-
}
|
|
296
|
-
finally {
|
|
297
|
-
pendingInternalEventConsumers = undefined;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
function surfaceGroupName(key) {
|
|
301
|
-
return lowerCamelIdent(key.split(".")[0] ?? key);
|
|
302
|
-
}
|
|
303
|
-
function surfaceLeafName(key) {
|
|
304
|
-
const parts = key.split(".");
|
|
305
|
-
parts.shift();
|
|
306
|
-
return lowerCamelIdent(parts.length === 0 ? key : parts.join("."));
|
|
307
|
-
}
|
|
308
|
-
function lowerCamelIdent(value) {
|
|
309
|
-
const pascal = value
|
|
310
|
-
.split(/[^A-Za-z0-9]+/)
|
|
311
|
-
.filter((part) => part.length > 0)
|
|
312
|
-
.map((part) => part[0].toUpperCase() + part.slice(1))
|
|
313
|
-
.join("");
|
|
314
|
-
return pascal.length === 0 ? "_" : pascal[0].toLowerCase() + pascal.slice(1);
|
|
315
|
-
}
|
|
316
|
-
function addSurfaceLeaf(surface, key, leaf) {
|
|
317
|
-
const group = surfaceGroupName(key);
|
|
318
|
-
surface[group] ??= {};
|
|
319
|
-
surface[group][surfaceLeafName(key)] = leaf;
|
|
320
|
-
}
|
|
321
|
-
function natsSubjectMatches(pattern, subject) {
|
|
322
|
-
const patternParts = pattern.split(".");
|
|
323
|
-
const subjectParts = subject.split(".");
|
|
324
|
-
for (let index = 0; index < patternParts.length; index += 1) {
|
|
325
|
-
const part = patternParts[index];
|
|
326
|
-
if (part === ">")
|
|
327
|
-
return true;
|
|
328
|
-
const subjectPart = subjectParts[index];
|
|
329
|
-
if (subjectPart === undefined)
|
|
330
|
-
return false;
|
|
331
|
-
if (part !== "*" && part !== subjectPart)
|
|
332
|
-
return false;
|
|
333
|
-
}
|
|
334
|
-
return patternParts.length === subjectParts.length;
|
|
335
|
-
}
|
|
336
|
-
const DEFAULT_STATE_LIST_LIMIT = 100;
|
|
337
|
-
const STATE_RUNTIME_RPC = {
|
|
338
|
-
get: {
|
|
339
|
-
subject: "rpc.v1.State.Get",
|
|
340
|
-
input: StateGetSchema,
|
|
341
|
-
output: StateGetResponseSchema,
|
|
342
|
-
callerCapabilities: [],
|
|
343
|
-
errors: ["AuthError", "ValidationError", "UnexpectedError"],
|
|
344
|
-
declaredErrorTypes: [
|
|
345
|
-
"AuthError",
|
|
346
|
-
"ValidationError",
|
|
347
|
-
"UnexpectedError",
|
|
348
|
-
],
|
|
349
|
-
},
|
|
350
|
-
put: {
|
|
351
|
-
subject: "rpc.v1.State.Put",
|
|
352
|
-
input: StatePutSchema,
|
|
353
|
-
output: StatePutResponseSchema,
|
|
354
|
-
callerCapabilities: [],
|
|
355
|
-
errors: ["AuthError", "ValidationError", "UnexpectedError"],
|
|
356
|
-
declaredErrorTypes: [
|
|
357
|
-
"AuthError",
|
|
358
|
-
"ValidationError",
|
|
359
|
-
"UnexpectedError",
|
|
360
|
-
],
|
|
361
|
-
},
|
|
362
|
-
delete: {
|
|
363
|
-
subject: "rpc.v1.State.Delete",
|
|
364
|
-
input: StateDeleteSchema,
|
|
365
|
-
output: StateDeleteResponseSchema,
|
|
366
|
-
callerCapabilities: [],
|
|
367
|
-
errors: ["AuthError", "ValidationError", "UnexpectedError"],
|
|
368
|
-
declaredErrorTypes: [
|
|
369
|
-
"AuthError",
|
|
370
|
-
"ValidationError",
|
|
371
|
-
"UnexpectedError",
|
|
372
|
-
],
|
|
373
|
-
},
|
|
374
|
-
list: {
|
|
375
|
-
subject: "rpc.v1.State.List",
|
|
376
|
-
input: StateListSchema,
|
|
377
|
-
output: StateListResponseSchema,
|
|
378
|
-
callerCapabilities: [],
|
|
379
|
-
errors: ["AuthError", "ValidationError", "UnexpectedError"],
|
|
380
|
-
declaredErrorTypes: [
|
|
381
|
-
"AuthError",
|
|
382
|
-
"ValidationError",
|
|
383
|
-
"UnexpectedError",
|
|
384
|
-
],
|
|
385
|
-
},
|
|
386
|
-
};
|
|
387
|
-
function joinStatePath(prefix, key) {
|
|
388
|
-
return [prefix, key]
|
|
389
|
-
.flatMap((value) => value?.split("/") ?? [])
|
|
390
|
-
.filter((segment) => segment.length > 0)
|
|
391
|
-
.join("/");
|
|
392
|
-
}
|
|
393
|
-
function validateStateValue(schema, value) {
|
|
394
|
-
return parseRuntimeSchema(schema, value);
|
|
395
|
-
}
|
|
396
|
-
function validateStateGetResult(descriptor, result) {
|
|
397
|
-
if ("migrationRequired" in result) {
|
|
398
|
-
const schema = descriptor.acceptedVersions?.[result.stateVersion];
|
|
399
|
-
if (!schema) {
|
|
400
|
-
return Result.err(new ValidationError({
|
|
401
|
-
errors: [{
|
|
402
|
-
path: "/stateVersion",
|
|
403
|
-
message: `state version '${result.stateVersion}' is not accepted by the runtime store`,
|
|
404
|
-
}],
|
|
405
|
-
}));
|
|
406
|
-
}
|
|
407
|
-
const parsed = validateStateValue(schema, result.entry.value);
|
|
408
|
-
if (parsed.isErr())
|
|
409
|
-
return Result.err(parsed.error);
|
|
410
|
-
return Result.ok({
|
|
411
|
-
...result,
|
|
412
|
-
entry: {
|
|
413
|
-
...result.entry,
|
|
414
|
-
value: parsed.unwrapOrElse(() => {
|
|
415
|
-
throw new Error("state value validation unexpectedly failed");
|
|
416
|
-
}),
|
|
417
|
-
},
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
if (!result.found) {
|
|
421
|
-
return Result.ok(result);
|
|
422
|
-
}
|
|
423
|
-
const parsed = validateStateValue(descriptor.schema, result.entry.value);
|
|
424
|
-
if (parsed.isErr()) {
|
|
425
|
-
return Result.err(parsed.error);
|
|
426
|
-
}
|
|
427
|
-
return Result.ok({
|
|
428
|
-
...result,
|
|
429
|
-
entry: {
|
|
430
|
-
...result.entry,
|
|
431
|
-
value: parsed.unwrapOrElse(() => {
|
|
432
|
-
throw new Error("state value validation unexpectedly failed");
|
|
433
|
-
}),
|
|
434
|
-
},
|
|
435
|
-
});
|
|
436
|
-
}
|
|
437
|
-
function validateStatePutResult(descriptor, result) {
|
|
438
|
-
if (result.applied) {
|
|
439
|
-
const parsed = validateStateValue(descriptor.schema, result.entry.value);
|
|
440
|
-
if (parsed.isErr())
|
|
441
|
-
return Result.err(parsed.error);
|
|
442
|
-
return Result.ok({
|
|
443
|
-
...result,
|
|
444
|
-
entry: {
|
|
445
|
-
...result.entry,
|
|
446
|
-
value: parsed.unwrapOrElse(() => {
|
|
447
|
-
throw new Error("state value validation unexpectedly failed");
|
|
448
|
-
}),
|
|
449
|
-
},
|
|
450
|
-
});
|
|
451
|
-
}
|
|
452
|
-
if (!result.entry) {
|
|
453
|
-
return Result.ok(result);
|
|
454
|
-
}
|
|
455
|
-
if ("migrationRequired" in result.entry) {
|
|
456
|
-
const schema = descriptor.acceptedVersions?.[result.entry.stateVersion];
|
|
457
|
-
if (!schema) {
|
|
458
|
-
return Result.err(new ValidationError({
|
|
459
|
-
errors: [{
|
|
460
|
-
path: "/stateVersion",
|
|
461
|
-
message: `state version '${result.entry.stateVersion}' is not accepted by the runtime store`,
|
|
462
|
-
}],
|
|
463
|
-
}));
|
|
464
|
-
}
|
|
465
|
-
const parsed = validateStateValue(schema, result.entry.entry.value);
|
|
466
|
-
if (parsed.isErr())
|
|
467
|
-
return Result.err(parsed.error);
|
|
468
|
-
return Result.ok({
|
|
469
|
-
...result,
|
|
470
|
-
entry: {
|
|
471
|
-
...result.entry,
|
|
472
|
-
entry: {
|
|
473
|
-
...result.entry.entry,
|
|
474
|
-
value: parsed.unwrapOrElse(() => {
|
|
475
|
-
throw new Error("state value validation unexpectedly failed");
|
|
476
|
-
}),
|
|
477
|
-
},
|
|
478
|
-
},
|
|
479
|
-
});
|
|
480
|
-
}
|
|
481
|
-
const parsed = validateStateValue(descriptor.schema, result.entry.value);
|
|
482
|
-
if (parsed.isErr()) {
|
|
483
|
-
return Result.err(parsed.error);
|
|
484
|
-
}
|
|
485
|
-
return Result.ok({
|
|
486
|
-
...result,
|
|
487
|
-
entry: {
|
|
488
|
-
...result.entry,
|
|
489
|
-
value: parsed.unwrapOrElse(() => {
|
|
490
|
-
throw new Error("state value validation unexpectedly failed");
|
|
491
|
-
}),
|
|
492
|
-
},
|
|
493
|
-
});
|
|
494
|
-
}
|
|
495
|
-
function validateStateListResult(descriptor, result) {
|
|
496
|
-
const entries = [];
|
|
497
|
-
for (const entry of result.entries) {
|
|
498
|
-
if ("migrationRequired" in entry) {
|
|
499
|
-
const schema = descriptor.acceptedVersions?.[entry.stateVersion];
|
|
500
|
-
if (!schema) {
|
|
501
|
-
return Result.err(new ValidationError({
|
|
502
|
-
errors: [{
|
|
503
|
-
path: "/stateVersion",
|
|
504
|
-
message: `state version '${entry.stateVersion}' is not accepted by the runtime store`,
|
|
505
|
-
}],
|
|
506
|
-
}));
|
|
507
|
-
}
|
|
508
|
-
const parsed = validateStateValue(schema, entry.entry.value);
|
|
509
|
-
if (parsed.isErr())
|
|
510
|
-
return Result.err(parsed.error);
|
|
511
|
-
entries.push({
|
|
512
|
-
...entry,
|
|
513
|
-
entry: {
|
|
514
|
-
...entry.entry,
|
|
515
|
-
value: parsed.unwrapOrElse(() => {
|
|
516
|
-
throw new Error("state value validation unexpectedly failed");
|
|
517
|
-
}),
|
|
518
|
-
},
|
|
519
|
-
});
|
|
520
|
-
continue;
|
|
521
|
-
}
|
|
522
|
-
const parsed = validateStateValue(descriptor.schema, entry.value);
|
|
523
|
-
if (parsed.isErr()) {
|
|
524
|
-
return Result.err(parsed.error);
|
|
525
|
-
}
|
|
526
|
-
entries.push({
|
|
527
|
-
...entry,
|
|
528
|
-
value: parsed.unwrapOrElse(() => {
|
|
529
|
-
throw new Error("state value validation unexpectedly failed");
|
|
530
|
-
}),
|
|
531
|
-
});
|
|
532
|
-
}
|
|
533
|
-
return Result.ok({ ...result, entries });
|
|
534
|
-
}
|
|
535
|
-
const NATS_SUBJECT_TOKEN_FORBIDDEN = /[\u0000\s.*>~]/gu;
|
|
536
|
-
const DEFAULT_NO_RESPONDER_MAX_RETRIES = 2;
|
|
537
|
-
const DEFAULT_NO_RESPONDER_RETRY_MS = 200;
|
|
538
|
-
const DEFAULT_AUTH_VALIDATE_SESSION_RETRY_ATTEMPTS = 3;
|
|
539
|
-
const DEFAULT_AUTH_VALIDATE_SESSION_RETRY_MS = 25;
|
|
540
|
-
function activeTraceId(span) {
|
|
541
|
-
const traceId = span.spanContext().traceId;
|
|
542
|
-
return traceId === "00000000000000000000000000000000" ? undefined : traceId;
|
|
543
|
-
}
|
|
544
|
-
function traceIdFromTraceparent(traceparent) {
|
|
545
|
-
const [version, traceId, parentId, flags, extra] = traceparent?.split("-") ??
|
|
546
|
-
[];
|
|
547
|
-
if (extra !== undefined ||
|
|
548
|
-
!/^[0-9a-f]{2}$/u.test(version ?? "") ||
|
|
549
|
-
version === "ff" ||
|
|
550
|
-
!/^[0-9a-f]{32}$/u.test(traceId ?? "") ||
|
|
551
|
-
traceId === "00000000000000000000000000000000" ||
|
|
552
|
-
!/^[0-9a-f]{16}$/u.test(parentId ?? "") ||
|
|
553
|
-
parentId === "0000000000000000" ||
|
|
554
|
-
!/^[0-9a-f]{2}$/u.test(flags ?? "")) {
|
|
555
|
-
return undefined;
|
|
556
|
-
}
|
|
557
|
-
return traceId;
|
|
558
|
-
}
|
|
559
|
-
const EMPTY_TRELLIS_API = {
|
|
560
|
-
rpc: {},
|
|
561
|
-
operations: {},
|
|
562
|
-
events: {},
|
|
563
|
-
feeds: {},
|
|
564
|
-
subjects: {},
|
|
565
|
-
};
|
|
566
|
-
function isBrowserAuthRequiredError(error) {
|
|
567
|
-
const isAuthRequiredReason = (reason) => reason === "session_not_found";
|
|
568
|
-
if (error instanceof AuthError) {
|
|
569
|
-
return isAuthRequiredReason(error.reason);
|
|
570
|
-
}
|
|
571
|
-
if (error instanceof RemoteError &&
|
|
572
|
-
error.remoteError.type === "AuthError") {
|
|
573
|
-
const reason = Reflect.get(error.remoteError, "reason");
|
|
574
|
-
return isAuthRequiredReason(reason);
|
|
575
|
-
}
|
|
576
|
-
return false;
|
|
577
|
-
}
|
|
578
|
-
function isTransientAuthValidateSessionError(error) {
|
|
579
|
-
if (error instanceof AuthError) {
|
|
580
|
-
return error.reason === "session_not_found";
|
|
581
|
-
}
|
|
582
|
-
if (error instanceof RemoteError &&
|
|
583
|
-
error.remoteError.type === "AuthError") {
|
|
584
|
-
const reason = Reflect.get(error.remoteError, "reason");
|
|
585
|
-
return reason === "session_not_found";
|
|
586
|
-
}
|
|
587
|
-
return false;
|
|
588
|
-
}
|
|
589
|
-
function isDeclaredRpcError(errorNames, type) {
|
|
590
|
-
return !!errorNames?.includes(type);
|
|
591
|
-
}
|
|
592
|
-
function isRuntimeRpcErrorDesc(value) {
|
|
593
|
-
return !!value && typeof value === "object" &&
|
|
594
|
-
typeof Reflect.get(value, "type") === "string" &&
|
|
595
|
-
typeof Reflect.get(value, "fromSerializable") === "function";
|
|
596
|
-
}
|
|
597
|
-
const payloadSizeEncoder = new TextEncoder();
|
|
598
|
-
function payloadByteLength(payload) {
|
|
599
|
-
return typeof payload === "string"
|
|
600
|
-
? payloadSizeEncoder.encode(payload).byteLength
|
|
601
|
-
: payload.byteLength;
|
|
602
|
-
}
|
|
603
|
-
function causeMessage(cause) {
|
|
604
|
-
return cause instanceof Error ? cause.message : String(cause);
|
|
605
|
-
}
|
|
606
|
-
function causeLogData(cause) {
|
|
607
|
-
return cause instanceof Error
|
|
608
|
-
? { message: cause.message, stack: cause.stack, name: cause.name }
|
|
609
|
-
: cause;
|
|
610
|
-
}
|
|
611
|
-
function reconstructDeclaredRpcError(errorNames, runtimeErrors, data, json) {
|
|
612
|
-
if (!isDeclaredRpcError(errorNames, data.type)) {
|
|
613
|
-
return null;
|
|
614
|
-
}
|
|
615
|
-
const runtimeError = getBuiltinRpcError(data.type) ??
|
|
616
|
-
runtimeErrors?.find((candidate) => candidate.type === data.type);
|
|
617
|
-
if (!runtimeError) {
|
|
618
|
-
return null;
|
|
619
|
-
}
|
|
620
|
-
const parsed = runtimeError.schema
|
|
621
|
-
? parseRuntimeSchema(runtimeError.schema, json).take()
|
|
622
|
-
: data;
|
|
623
|
-
if (isErr(parsed)) {
|
|
624
|
-
return parsed.error instanceof ValidationError ||
|
|
625
|
-
parsed.error instanceof UnexpectedError
|
|
626
|
-
? parsed.error
|
|
627
|
-
: new UnexpectedError({ cause: parsed.error });
|
|
628
|
-
}
|
|
629
|
-
try {
|
|
630
|
-
const reconstructed = runtimeError.fromSerializable(parsed);
|
|
631
|
-
if (reconstructed instanceof BaseError) {
|
|
632
|
-
return reconstructed;
|
|
633
|
-
}
|
|
634
|
-
return new UnexpectedError({
|
|
635
|
-
cause: new Error(`RPC error '${data.type}' reconstructed to a non-Trellis error instance`),
|
|
636
|
-
});
|
|
637
|
-
}
|
|
638
|
-
catch (cause) {
|
|
639
|
-
return new UnexpectedError({ cause });
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
async function sleep(ms) {
|
|
643
|
-
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
644
|
-
}
|
|
645
|
-
export class Trellis {
|
|
646
|
-
constructor(name, // Must be unique for a service
|
|
647
|
-
nats, auth, opts) {
|
|
648
|
-
_Trellis_instances.add(this);
|
|
649
|
-
Object.defineProperty(this, "name", {
|
|
650
|
-
enumerable: true,
|
|
651
|
-
configurable: true,
|
|
652
|
-
writable: true,
|
|
653
|
-
value: void 0
|
|
654
|
-
});
|
|
655
|
-
Object.defineProperty(this, "timeout", {
|
|
656
|
-
enumerable: true,
|
|
657
|
-
configurable: true,
|
|
658
|
-
writable: true,
|
|
659
|
-
value: void 0
|
|
660
|
-
});
|
|
661
|
-
Object.defineProperty(this, "stream", {
|
|
662
|
-
enumerable: true,
|
|
663
|
-
configurable: true,
|
|
664
|
-
writable: true,
|
|
665
|
-
value: void 0
|
|
666
|
-
});
|
|
667
|
-
Object.defineProperty(this, "state", {
|
|
668
|
-
enumerable: true,
|
|
669
|
-
configurable: true,
|
|
670
|
-
writable: true,
|
|
671
|
-
value: void 0
|
|
672
|
-
});
|
|
673
|
-
Object.defineProperty(this, "rpc", {
|
|
674
|
-
enumerable: true,
|
|
675
|
-
configurable: true,
|
|
676
|
-
writable: true,
|
|
677
|
-
value: void 0
|
|
678
|
-
});
|
|
679
|
-
Object.defineProperty(this, "event", {
|
|
680
|
-
enumerable: true,
|
|
681
|
-
configurable: true,
|
|
682
|
-
writable: true,
|
|
683
|
-
value: void 0
|
|
684
|
-
});
|
|
685
|
-
Object.defineProperty(this, "feed", {
|
|
686
|
-
enumerable: true,
|
|
687
|
-
configurable: true,
|
|
688
|
-
writable: true,
|
|
689
|
-
value: void 0
|
|
690
|
-
});
|
|
691
|
-
Object.defineProperty(this, "operation", {
|
|
692
|
-
enumerable: true,
|
|
693
|
-
configurable: true,
|
|
694
|
-
writable: true,
|
|
695
|
-
value: void 0
|
|
696
|
-
});
|
|
697
|
-
Object.defineProperty(this, "handle", {
|
|
698
|
-
enumerable: true,
|
|
699
|
-
configurable: true,
|
|
700
|
-
writable: true,
|
|
701
|
-
value: void 0
|
|
702
|
-
});
|
|
703
|
-
/** Framework-neutral lifecycle handle for this Trellis runtime connection. */
|
|
704
|
-
Object.defineProperty(this, "connection", {
|
|
705
|
-
enumerable: true,
|
|
706
|
-
configurable: true,
|
|
707
|
-
writable: true,
|
|
708
|
-
value: void 0
|
|
709
|
-
});
|
|
710
|
-
Object.defineProperty(this, "nats", {
|
|
711
|
-
enumerable: true,
|
|
712
|
-
configurable: true,
|
|
713
|
-
writable: true,
|
|
714
|
-
value: void 0
|
|
715
|
-
});
|
|
716
|
-
Object.defineProperty(this, "js", {
|
|
717
|
-
enumerable: true,
|
|
718
|
-
configurable: true,
|
|
719
|
-
writable: true,
|
|
720
|
-
value: void 0
|
|
721
|
-
});
|
|
722
|
-
Object.defineProperty(this, "auth", {
|
|
723
|
-
enumerable: true,
|
|
724
|
-
configurable: true,
|
|
725
|
-
writable: true,
|
|
726
|
-
value: void 0
|
|
727
|
-
});
|
|
728
|
-
Object.defineProperty(this, "api", {
|
|
729
|
-
enumerable: true,
|
|
730
|
-
configurable: true,
|
|
731
|
-
writable: true,
|
|
732
|
-
value: void 0
|
|
733
|
-
});
|
|
734
|
-
_Trellis_log.set(this, void 0);
|
|
735
|
-
_Trellis_tasks.set(this, void 0);
|
|
736
|
-
_Trellis_hasExplicitApi.set(this, void 0);
|
|
737
|
-
_Trellis_noResponderMaxRetries.set(this, void 0);
|
|
738
|
-
_Trellis_noResponderRetryMs.set(this, void 0);
|
|
739
|
-
_Trellis_onSessionNotFound.set(this, void 0);
|
|
740
|
-
_Trellis_operationStore.set(this, void 0);
|
|
741
|
-
_Trellis_eventConsumers.set(this, void 0);
|
|
742
|
-
_Trellis_durableEventLoops.set(this, new Map());
|
|
743
|
-
const api = opts?.api;
|
|
744
|
-
this.name = name;
|
|
745
|
-
this.nats = nats;
|
|
746
|
-
this.js = jetstream(this.nats);
|
|
747
|
-
this.auth = auth;
|
|
748
|
-
this.api = (api ?? EMPTY_TRELLIS_API);
|
|
749
|
-
__classPrivateFieldSet(this, _Trellis_log, (opts?.log ?? logger).child({ lib: "trellis" }), "f");
|
|
750
|
-
this.timeout = opts?.timeout ?? 3000;
|
|
751
|
-
this.stream = opts?.stream ?? "trellis";
|
|
752
|
-
__classPrivateFieldSet(this, _Trellis_hasExplicitApi, api !== undefined, "f");
|
|
753
|
-
__classPrivateFieldSet(this, _Trellis_noResponderMaxRetries, opts?.noResponderRetry?.maxAttempts ??
|
|
754
|
-
DEFAULT_NO_RESPONDER_MAX_RETRIES, "f");
|
|
755
|
-
__classPrivateFieldSet(this, _Trellis_noResponderRetryMs, opts?.noResponderRetry?.baseDelayMs ??
|
|
756
|
-
DEFAULT_NO_RESPONDER_RETRY_MS, "f");
|
|
757
|
-
__classPrivateFieldSet(this, _Trellis_onSessionNotFound, opts?.onSessionNotFound, "f");
|
|
758
|
-
__classPrivateFieldSet(this, _Trellis_eventConsumers, pendingInternalEventConsumers ?? {}, "f");
|
|
759
|
-
this.connection = opts?.connection ??
|
|
760
|
-
new TrellisConnection({ kind: "client" });
|
|
761
|
-
__classPrivateFieldSet(this, _Trellis_tasks, new TrellisTasks({ log: __classPrivateFieldGet(this, _Trellis_log, "f") }), "f");
|
|
762
|
-
this.state = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createStateFacade).call(this, opts?.state);
|
|
763
|
-
this.rpc = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createRpcFacade).call(this);
|
|
764
|
-
this.handle = { rpc: __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createRpcHandleFacade).call(this) };
|
|
765
|
-
this.event = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createEventFacade).call(this);
|
|
766
|
-
this.feed = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createFeedFacade).call(this);
|
|
767
|
-
this.operation = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createOperationFacade).call(this);
|
|
768
|
-
}
|
|
769
|
-
/**
|
|
770
|
-
* Returns the underlying NATS connection.
|
|
771
|
-
*/
|
|
772
|
-
get natsConnection() {
|
|
773
|
-
return this.nats;
|
|
774
|
-
}
|
|
775
|
-
async operationStoreHandle() {
|
|
776
|
-
if (!__classPrivateFieldGet(this, _Trellis_operationStore, "f")) {
|
|
777
|
-
const bucket = `trellis_operations_${this.auth.sessionKey.slice(0, 16)}`;
|
|
778
|
-
__classPrivateFieldSet(this, _Trellis_operationStore, (async () => {
|
|
779
|
-
const result = await TypedKV.open(this.nats, bucket, DurableOperationRecordSchema, {
|
|
780
|
-
history: 5,
|
|
781
|
-
ttl: 0,
|
|
782
|
-
});
|
|
783
|
-
const value = result.take();
|
|
784
|
-
if (isErr(value)) {
|
|
785
|
-
throw value.error;
|
|
786
|
-
}
|
|
787
|
-
return value;
|
|
788
|
-
})(), "f");
|
|
789
|
-
}
|
|
790
|
-
return __classPrivateFieldGet(this, _Trellis_operationStore, "f");
|
|
791
|
-
}
|
|
792
|
-
async loadOperationRecord(operationId) {
|
|
793
|
-
const store = await this.operationStoreHandle();
|
|
794
|
-
const entry = await store.get(operationId);
|
|
795
|
-
const value = entry.take();
|
|
796
|
-
if (isErr(value)) {
|
|
797
|
-
return null;
|
|
798
|
-
}
|
|
799
|
-
return value.value;
|
|
800
|
-
}
|
|
801
|
-
async saveOperationRecord(runtime) {
|
|
802
|
-
const store = await this.operationStoreHandle();
|
|
803
|
-
const record = {
|
|
804
|
-
ownerSessionKey: runtime.ownerSessionKey,
|
|
805
|
-
sequence: runtime.sequence,
|
|
806
|
-
signalSequence: runtime.signalSequence,
|
|
807
|
-
signals: runtime.signals,
|
|
808
|
-
snapshot: runtime.snapshot,
|
|
809
|
-
};
|
|
810
|
-
await store.put(runtime.id, record);
|
|
811
|
-
}
|
|
812
|
-
request(method, input, opts) {
|
|
813
|
-
const rpcApi = this.api["rpc"];
|
|
814
|
-
const ctx = rpcApi[method];
|
|
815
|
-
if (!ctx) {
|
|
816
|
-
return AsyncResult.from(Promise.resolve(err(new UnexpectedError({
|
|
817
|
-
cause: __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_unknownApiError).call(this, "RPC method", method.toString()),
|
|
818
|
-
context: { method: method.toString() },
|
|
819
|
-
}))));
|
|
820
|
-
}
|
|
821
|
-
return __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestBuiltRpcUnknown).call(this, method, input, ctx, opts);
|
|
822
|
-
}
|
|
823
|
-
feedHandle(feed) {
|
|
824
|
-
const descriptor = this.api.feeds?.[feed];
|
|
825
|
-
if (!descriptor) {
|
|
826
|
-
throw __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_unknownApiError).call(this, "feed", feed.toString());
|
|
827
|
-
}
|
|
828
|
-
return {
|
|
829
|
-
input: (input) => ({
|
|
830
|
-
subscribe: (opts) => __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_subscribeFeed).call(this, feed.toString(), descriptor, input, opts),
|
|
831
|
-
}),
|
|
832
|
-
handle: (handler) => __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_handleFeed).call(this, feed.toString(), descriptor, handler),
|
|
833
|
-
};
|
|
834
|
-
}
|
|
835
|
-
operationHandle(operation) {
|
|
836
|
-
const descriptor = this.api["operations"]?.[operation];
|
|
837
|
-
if (!descriptor) {
|
|
838
|
-
throw __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_unknownApiError).call(this, "operation", operation.toString());
|
|
839
|
-
}
|
|
840
|
-
const transport = {
|
|
841
|
-
requestJson: (subject, body) => __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestJson).call(this, subject, body),
|
|
842
|
-
watchJson: (subject, body) => __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_watchJson).call(this, subject, body),
|
|
843
|
-
putTransfer: (grant, body) => AsyncResult.from((async () => {
|
|
844
|
-
const handle = createTransferHandle(this.nats, this.auth, this.timeout, grant);
|
|
845
|
-
if (!(handle instanceof Object) || !("send" in handle)) {
|
|
846
|
-
return err(new TransferError({
|
|
847
|
-
operation: "transfer",
|
|
848
|
-
context: { reason: "invalid_operation_transfer_grant" },
|
|
849
|
-
}));
|
|
850
|
-
}
|
|
851
|
-
return await handle.send(body);
|
|
852
|
-
})()),
|
|
853
|
-
};
|
|
854
|
-
return new OperationInvoker(transport, descriptor);
|
|
855
|
-
}
|
|
856
|
-
transfer(grant) {
|
|
857
|
-
return createTransferHandle(this.nats, this.auth, this.timeout, grant);
|
|
858
|
-
}
|
|
859
|
-
/*
|
|
860
|
-
* Mount a handler to process requests made to a specific Trellis API
|
|
861
|
-
*/
|
|
862
|
-
async mount(method, fn) {
|
|
863
|
-
const methodName = method;
|
|
864
|
-
const ctx = this.api["rpc"][methodName];
|
|
865
|
-
if (!ctx) {
|
|
866
|
-
throw __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_unknownApiError).call(this, "RPC method", method.toString());
|
|
867
|
-
}
|
|
868
|
-
const task = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_handleRPC).call(this, methodName, fn);
|
|
869
|
-
__classPrivateFieldGet(this, _Trellis_tasks, "f").add(methodName, task);
|
|
870
|
-
}
|
|
871
|
-
respondWithError(msg, error) {
|
|
872
|
-
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithError).call(this, msg, error);
|
|
873
|
-
}
|
|
874
|
-
/**
|
|
875
|
-
* Builds a stable event subject, encoded payload, and publish headers.
|
|
876
|
-
*
|
|
877
|
-
* The prepared event intentionally carries no contract id or digest so callers
|
|
878
|
-
* can persist it in a service-owned outbox without coupling storage to the
|
|
879
|
-
* publisher's current deployment metadata.
|
|
880
|
-
*/
|
|
881
|
-
prepare(event, data) {
|
|
882
|
-
try {
|
|
883
|
-
const eventName = event;
|
|
884
|
-
const ctx = this.api["events"][eventName];
|
|
885
|
-
if (!ctx) {
|
|
886
|
-
return err(new UnexpectedError({
|
|
887
|
-
cause: __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_unknownApiError).call(this, "event", event.toString()),
|
|
888
|
-
context: { event: event.toString() },
|
|
889
|
-
}));
|
|
890
|
-
}
|
|
891
|
-
const subject = this.template(ctx.subject, data).take();
|
|
892
|
-
if (isErr(subject)) {
|
|
893
|
-
logger.error({ err: subject.error }, "Failed to template event.");
|
|
894
|
-
return subject;
|
|
895
|
-
}
|
|
896
|
-
const header = {
|
|
897
|
-
id: ulid(),
|
|
898
|
-
time: new Date().toISOString(),
|
|
899
|
-
};
|
|
900
|
-
const payload = Object.freeze({
|
|
901
|
-
...data,
|
|
902
|
-
header: Object.freeze(header),
|
|
903
|
-
});
|
|
904
|
-
const msg = encodeSchema(ctx.event, payload).take();
|
|
905
|
-
if (isErr(msg)) {
|
|
906
|
-
logger.error({ err: msg.error }, "Failed to encode event.");
|
|
907
|
-
return err(new UnexpectedError({ cause: msg.error }));
|
|
908
|
-
}
|
|
909
|
-
const headers = natsHeaders();
|
|
910
|
-
headers.set("Nats-Msg-Id", header.id);
|
|
911
|
-
injectTraceContext(createNatsHeaderCarrier(headers));
|
|
912
|
-
const headerRecord = {};
|
|
913
|
-
for (const [key, value] of headers) {
|
|
914
|
-
headerRecord[key] = value.join(",");
|
|
915
|
-
}
|
|
916
|
-
return ok(Object.freeze({
|
|
917
|
-
event: event.toString(),
|
|
918
|
-
subject,
|
|
919
|
-
payload,
|
|
920
|
-
encodedPayload: msg,
|
|
921
|
-
headers: Object.freeze(headerRecord),
|
|
922
|
-
}));
|
|
923
|
-
}
|
|
924
|
-
catch (cause) {
|
|
925
|
-
return err(new UnexpectedError({ cause, context: { event: event.toString() } }));
|
|
926
|
-
}
|
|
927
|
-
}
|
|
928
|
-
/**
|
|
929
|
-
* Publishes a previously prepared event without regenerating its id, time,
|
|
930
|
-
* subject, payload, or headers.
|
|
931
|
-
*/
|
|
932
|
-
publishPrepared(event) {
|
|
933
|
-
return AsyncResult.from((async () => {
|
|
934
|
-
try {
|
|
935
|
-
const headers = natsHeaders();
|
|
936
|
-
for (const [key, value] of Object.entries(event.headers)) {
|
|
937
|
-
headers.set(key, value);
|
|
938
|
-
}
|
|
939
|
-
logger.trace({ subject: event.subject }, `Publishing ${event.event} event.`);
|
|
940
|
-
await this.js.publish(event.subject, event.encodedPayload, { headers });
|
|
941
|
-
return ok(undefined);
|
|
942
|
-
}
|
|
943
|
-
catch (cause) {
|
|
944
|
-
return err(new UnexpectedError({ cause, context: { event: event.event } }));
|
|
945
|
-
}
|
|
946
|
-
})());
|
|
947
|
-
}
|
|
948
|
-
publish(event, data) {
|
|
949
|
-
return AsyncResult.from((async () => {
|
|
950
|
-
const prepared = this.prepare(event, data).take();
|
|
951
|
-
if (isErr(prepared))
|
|
952
|
-
return prepared;
|
|
953
|
-
return await this.publishPrepared(prepared);
|
|
954
|
-
})());
|
|
955
|
-
}
|
|
956
|
-
listenEvent(event, subjectData, fn, opts) {
|
|
957
|
-
return AsyncResult.from((async () => {
|
|
958
|
-
try {
|
|
959
|
-
const eventName = event;
|
|
960
|
-
const ctx = this.api["events"][eventName];
|
|
961
|
-
if (!ctx) {
|
|
962
|
-
return err(new UnexpectedError({
|
|
963
|
-
cause: __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_unknownApiError).call(this, "event", event.toString()),
|
|
964
|
-
context: { event: event.toString() },
|
|
965
|
-
}));
|
|
966
|
-
}
|
|
967
|
-
const subject = this.template(ctx.subject, subjectData, true).take();
|
|
968
|
-
if (isErr(subject))
|
|
969
|
-
return subject;
|
|
970
|
-
if (opts?.mode === "ephemeral") {
|
|
971
|
-
return __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_startEphemeralEvent).call(this, eventName, ctx, subject, fn, opts.signal);
|
|
972
|
-
}
|
|
973
|
-
if (opts?.durableName) {
|
|
974
|
-
return err(new UnexpectedError({
|
|
975
|
-
cause: new Error("Durable event listener names are provisioned by Trellis event consumer bindings; use opts.group instead."),
|
|
976
|
-
context: {
|
|
977
|
-
event: event.toString(),
|
|
978
|
-
durableName: opts.durableName,
|
|
979
|
-
},
|
|
980
|
-
}));
|
|
981
|
-
}
|
|
982
|
-
const groupResult = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_resolveEventConsumerGroup).call(this, eventName, opts);
|
|
983
|
-
const group = groupResult.take();
|
|
984
|
-
if (isErr(group))
|
|
985
|
-
return group;
|
|
986
|
-
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_registerDurableEventHandler).call(this, {
|
|
987
|
-
group,
|
|
988
|
-
event: eventName,
|
|
989
|
-
ctx,
|
|
990
|
-
subject,
|
|
991
|
-
fn,
|
|
992
|
-
signal: opts?.signal,
|
|
993
|
-
});
|
|
994
|
-
return ok(undefined);
|
|
995
|
-
}
|
|
996
|
-
catch (cause) {
|
|
997
|
-
return err(new UnexpectedError({ cause, context: { event: event.toString() } }));
|
|
998
|
-
}
|
|
999
|
-
})());
|
|
1000
|
-
}
|
|
1001
|
-
wait() {
|
|
1002
|
-
return __classPrivateFieldGet(this, _Trellis_tasks, "f").wait();
|
|
1003
|
-
}
|
|
1004
|
-
// FIXME: If are validating things twice in most cases...
|
|
1005
|
-
template(subject, data, allowWildcards = false) {
|
|
1006
|
-
// Find all template placeholders and check if values exist
|
|
1007
|
-
const placeholders = subject.match(/\{([^}]+)\}/g) || [];
|
|
1008
|
-
for (const placeholder of placeholders) {
|
|
1009
|
-
const key = placeholder.slice(1, -1); // Remove { and }
|
|
1010
|
-
const value = Pointer.Get(data, key);
|
|
1011
|
-
if ((value === undefined || value === null) && !allowWildcards) {
|
|
1012
|
-
return err(new ValidationError({
|
|
1013
|
-
errors: [
|
|
1014
|
-
{
|
|
1015
|
-
path: key,
|
|
1016
|
-
message: "Missing required data for subject template",
|
|
1017
|
-
},
|
|
1018
|
-
],
|
|
1019
|
-
context: { key },
|
|
1020
|
-
}));
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
const result = subject.replace(/\{([^}]+)\}/g, (_, key) => {
|
|
1024
|
-
const value = Pointer.Get(data, key);
|
|
1025
|
-
if (allowWildcards && value === "*") {
|
|
1026
|
-
return "*";
|
|
1027
|
-
}
|
|
1028
|
-
if (allowWildcards && (value === undefined || value === null)) {
|
|
1029
|
-
return "*";
|
|
1030
|
-
}
|
|
1031
|
-
return __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_escapeSubjectToken).call(this, `${value}`);
|
|
1032
|
-
});
|
|
1033
|
-
return ok(result);
|
|
1034
|
-
}
|
|
1035
|
-
requestAuthValidate(input) {
|
|
1036
|
-
const request = this.request.bind(this);
|
|
1037
|
-
return request("Auth.Requests.Validate", input);
|
|
1038
|
-
}
|
|
1039
|
-
}
|
|
1040
|
-
_Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplicitApi = new WeakMap(), _Trellis_noResponderMaxRetries = new WeakMap(), _Trellis_noResponderRetryMs = new WeakMap(), _Trellis_onSessionNotFound = new WeakMap(), _Trellis_operationStore = new WeakMap(), _Trellis_eventConsumers = new WeakMap(), _Trellis_durableEventLoops = new WeakMap(), _Trellis_instances = new WeakSet(), _Trellis_createStateFacade = function _Trellis_createStateFacade(state) {
|
|
1041
|
-
const stores = (state ?? {});
|
|
1042
|
-
const facade = Object.fromEntries(Object.entries(stores).map(([store, descriptor]) => {
|
|
1043
|
-
if (descriptor.kind === "value") {
|
|
1044
|
-
const client = {
|
|
1045
|
-
get: () => AsyncResult.from((async () => {
|
|
1046
|
-
const result = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestBuiltRpc).call(this, "State.Get", { store }, STATE_RUNTIME_RPC.get);
|
|
1047
|
-
if (result.isErr())
|
|
1048
|
-
return result;
|
|
1049
|
-
return validateStateGetResult(descriptor, result.unwrapOrElse(() => {
|
|
1050
|
-
throw new Error("state get unexpectedly failed");
|
|
1051
|
-
}));
|
|
1052
|
-
})()),
|
|
1053
|
-
put: (value, opts) => AsyncResult.from((async () => {
|
|
1054
|
-
const encoded = encodeRuntimeSchema(descriptor.schema, value)
|
|
1055
|
-
.take();
|
|
1056
|
-
if (isErr(encoded)) {
|
|
1057
|
-
return Result.err(encoded.error);
|
|
1058
|
-
}
|
|
1059
|
-
const result = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestBuiltRpc).call(this, "State.Put", { store, value, ...opts }, STATE_RUNTIME_RPC.put);
|
|
1060
|
-
if (result.isErr())
|
|
1061
|
-
return result;
|
|
1062
|
-
return validateStatePutResult(descriptor, result.unwrapOrElse(() => {
|
|
1063
|
-
throw new Error("state put unexpectedly failed");
|
|
1064
|
-
}));
|
|
1065
|
-
})()),
|
|
1066
|
-
delete: (opts) => __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestBuiltRpc).call(this, "State.Delete", { store, ...opts }, STATE_RUNTIME_RPC.delete),
|
|
1067
|
-
};
|
|
1068
|
-
return [store, client];
|
|
1069
|
-
}
|
|
1070
|
-
const mapClient = (prefix) => ({
|
|
1071
|
-
get: (key) => AsyncResult.from((async () => {
|
|
1072
|
-
const result = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestBuiltRpc).call(this, "State.Get", { store, key: joinStatePath(prefix, key) }, STATE_RUNTIME_RPC.get);
|
|
1073
|
-
if (result.isErr())
|
|
1074
|
-
return result;
|
|
1075
|
-
return validateStateGetResult(descriptor, result.unwrapOrElse(() => {
|
|
1076
|
-
throw new Error("state get unexpectedly failed");
|
|
1077
|
-
}));
|
|
1078
|
-
})()),
|
|
1079
|
-
put: (key, value, opts) => AsyncResult.from((async () => {
|
|
1080
|
-
const encoded = encodeRuntimeSchema(descriptor.schema, value)
|
|
1081
|
-
.take();
|
|
1082
|
-
if (isErr(encoded)) {
|
|
1083
|
-
return Result.err(encoded.error);
|
|
1084
|
-
}
|
|
1085
|
-
const result = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestBuiltRpc).call(this, "State.Put", { store, key: joinStatePath(prefix, key), value, ...opts }, STATE_RUNTIME_RPC.put);
|
|
1086
|
-
if (result.isErr())
|
|
1087
|
-
return result;
|
|
1088
|
-
return validateStatePutResult(descriptor, result.unwrapOrElse(() => {
|
|
1089
|
-
throw new Error("state put unexpectedly failed");
|
|
1090
|
-
}));
|
|
1091
|
-
})()),
|
|
1092
|
-
delete: (key, opts) => __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestBuiltRpc).call(this, "State.Delete", { store, key: joinStatePath(prefix, key), ...opts }, STATE_RUNTIME_RPC.delete),
|
|
1093
|
-
list: (opts) => AsyncResult.from((async () => {
|
|
1094
|
-
const result = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestBuiltRpc).call(this, "State.List", {
|
|
1095
|
-
store,
|
|
1096
|
-
...(prefix ? { prefix } : {}),
|
|
1097
|
-
offset: opts?.offset ?? 0,
|
|
1098
|
-
limit: opts?.limit ?? DEFAULT_STATE_LIST_LIMIT,
|
|
1099
|
-
}, STATE_RUNTIME_RPC.list);
|
|
1100
|
-
if (result.isErr())
|
|
1101
|
-
return result;
|
|
1102
|
-
return validateStateListResult(descriptor, result.unwrapOrElse(() => {
|
|
1103
|
-
throw new Error("state list unexpectedly failed");
|
|
1104
|
-
}));
|
|
1105
|
-
})()),
|
|
1106
|
-
prefix: (path) => mapClient(joinStatePath(prefix, path)),
|
|
1107
|
-
});
|
|
1108
|
-
return [store, mapClient()];
|
|
1109
|
-
}));
|
|
1110
|
-
return facade;
|
|
1111
|
-
}, _Trellis_createRpcFacade = function _Trellis_createRpcFacade() {
|
|
1112
|
-
const surface = {};
|
|
1113
|
-
for (const method of Object.keys(this.api.rpc ?? {})) {
|
|
1114
|
-
const leaf = (input, opts) => this.request(method, input, opts);
|
|
1115
|
-
addSurfaceLeaf(surface, method, leaf);
|
|
1116
|
-
}
|
|
1117
|
-
return surface;
|
|
1118
|
-
}, _Trellis_createRpcHandleFacade = function _Trellis_createRpcHandleFacade() {
|
|
1119
|
-
const surface = {};
|
|
1120
|
-
for (const method of Object.keys(this.api.rpc ?? {})) {
|
|
1121
|
-
addSurfaceLeaf(surface, method, (handler) => this.mount(method, handler));
|
|
1122
|
-
}
|
|
1123
|
-
return surface;
|
|
1124
|
-
}, _Trellis_createEventFacade = function _Trellis_createEventFacade() {
|
|
1125
|
-
const surface = {};
|
|
1126
|
-
for (const event of Object.keys(this.api.events ?? {})) {
|
|
1127
|
-
addSurfaceLeaf(surface, event, {
|
|
1128
|
-
prepare: (payload) => this.prepare(event, payload),
|
|
1129
|
-
publish: (payload) => this.publish(event, payload),
|
|
1130
|
-
listen: (handler, subjectData = {}, opts) => this.listenEvent(event, subjectData, handler, opts),
|
|
1131
|
-
});
|
|
1132
|
-
}
|
|
1133
|
-
return surface;
|
|
1134
|
-
}, _Trellis_createEventPublishFacade = function _Trellis_createEventPublishFacade() {
|
|
1135
|
-
const surface = {};
|
|
1136
|
-
for (const event of Object.keys(this.api.events ?? {})) {
|
|
1137
|
-
addSurfaceLeaf(surface, event, {
|
|
1138
|
-
prepare: (payload) => this.prepare(event, payload),
|
|
1139
|
-
publish: (payload) => this.publish(event, payload),
|
|
1140
|
-
});
|
|
1141
|
-
}
|
|
1142
|
-
return surface;
|
|
1143
|
-
}, _Trellis_createFeedFacade = function _Trellis_createFeedFacade() {
|
|
1144
|
-
const surface = {};
|
|
1145
|
-
for (const feed of Object.keys(this.api.feeds ?? {})) {
|
|
1146
|
-
const leaf = (input, opts) => this.feedHandle(feed).input(input).subscribe(opts);
|
|
1147
|
-
addSurfaceLeaf(surface, feed, leaf);
|
|
1148
|
-
}
|
|
1149
|
-
return surface;
|
|
1150
|
-
}, _Trellis_createHandlerTrellis = function _Trellis_createHandlerTrellis() {
|
|
1151
|
-
return {
|
|
1152
|
-
rpc: this.rpc,
|
|
1153
|
-
event: __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createEventPublishFacade).call(this),
|
|
1154
|
-
feed: this.feed,
|
|
1155
|
-
operation: this.operation,
|
|
1156
|
-
request: this.request.bind(this),
|
|
1157
|
-
prepare: (event, data) => this.prepare(event, data),
|
|
1158
|
-
publish: (event, data) => this.publish(event, data),
|
|
1159
|
-
publishPrepared: (event) => this.publishPrepared(event),
|
|
1160
|
-
};
|
|
1161
|
-
}, _Trellis_createOperationFacade = function _Trellis_createOperationFacade() {
|
|
1162
|
-
const surface = {};
|
|
1163
|
-
for (const operation of Object.keys(this.api.operations ?? {})) {
|
|
1164
|
-
addSurfaceLeaf(surface, operation, this.operationHandle(operation));
|
|
1165
|
-
}
|
|
1166
|
-
return surface;
|
|
1167
|
-
}, _Trellis_unknownApiError = function _Trellis_unknownApiError(kind, name) {
|
|
1168
|
-
const base = `Unknown ${kind} '${name}'.`;
|
|
1169
|
-
if (__classPrivateFieldGet(this, _Trellis_hasExplicitApi, "f")) {
|
|
1170
|
-
return new Error(`${base} Did you forget to include its API module?`);
|
|
1171
|
-
}
|
|
1172
|
-
return new Error(`${base} No API surface was provided. Pass opts.api, use createClient(contract, ...), or await createCoreClient(...) instead.`);
|
|
1173
|
-
}, _Trellis_requestBuiltRpcUnknown = function _Trellis_requestBuiltRpcUnknown(method, input, ctx, opts) {
|
|
1174
|
-
return __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestBuiltRpc).call(this, method, input, ctx, opts);
|
|
1175
|
-
}, _Trellis_requestBuiltRpc = function _Trellis_requestBuiltRpc(method, input, ctx, opts) {
|
|
1176
|
-
return AsyncResult.from((async () => {
|
|
1177
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").trace({ method: String(method) }, `Calling ${method.toString()}.`);
|
|
1178
|
-
const msg = encodeRuntimeSchema(ctx.input, input).take();
|
|
1179
|
-
if (isErr(msg)) {
|
|
1180
|
-
return msg;
|
|
1181
|
-
}
|
|
1182
|
-
const subject = this.template(ctx.subject, input).take();
|
|
1183
|
-
if (isErr(subject)) {
|
|
1184
|
-
return subject;
|
|
1185
|
-
}
|
|
1186
|
-
const span = startClientSpan(method, subject);
|
|
1187
|
-
const attempt = async () => {
|
|
1188
|
-
const authHeaders = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createProof).call(this, subject, msg);
|
|
1189
|
-
const headers = natsHeaders();
|
|
1190
|
-
headers.set("session-key", this.auth.sessionKey);
|
|
1191
|
-
headers.set("proof", authHeaders.proof);
|
|
1192
|
-
headers.set("iat", String(authHeaders.iat));
|
|
1193
|
-
headers.set("request-id", authHeaders.requestId);
|
|
1194
|
-
injectTraceContext(createNatsHeaderCarrier(headers), span);
|
|
1195
|
-
const msgResult = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestMessageWithRetry).call(this, {
|
|
1196
|
-
method,
|
|
1197
|
-
subject,
|
|
1198
|
-
payload: msg,
|
|
1199
|
-
headers,
|
|
1200
|
-
timeout: opts?.timeout ?? this.timeout,
|
|
1201
|
-
callerCapabilities: ctx.callerCapabilities,
|
|
1202
|
-
});
|
|
1203
|
-
const response = msgResult.take();
|
|
1204
|
-
if (isErr(response)) {
|
|
1205
|
-
return response;
|
|
1206
|
-
}
|
|
1207
|
-
if (response.headers?.get("status") === "error") {
|
|
1208
|
-
const json = safeJson(response).take();
|
|
1209
|
-
if (isErr(json)) {
|
|
1210
|
-
return err(requestFailedTransportError({
|
|
1211
|
-
code: "trellis.request.invalid_response",
|
|
1212
|
-
message: "Trellis returned an invalid response.",
|
|
1213
|
-
hint: "Retry the request. If it keeps happening, check the Trellis capability handling this request.",
|
|
1214
|
-
method,
|
|
1215
|
-
subject,
|
|
1216
|
-
cause: json.error.cause,
|
|
1217
|
-
}));
|
|
1218
|
-
}
|
|
1219
|
-
const errorData = parse(TrellisErrorDataSchema, json).take();
|
|
1220
|
-
if (isErr(errorData)) {
|
|
1221
|
-
return err(requestFailedTransportError({
|
|
1222
|
-
code: "trellis.request.invalid_response",
|
|
1223
|
-
message: "Trellis returned an invalid response.",
|
|
1224
|
-
hint: "Retry the request. If it keeps happening, check the Trellis capability handling this request.",
|
|
1225
|
-
method,
|
|
1226
|
-
subject,
|
|
1227
|
-
cause: errorData.error,
|
|
1228
|
-
}));
|
|
1229
|
-
}
|
|
1230
|
-
const declaredErrorTypes = Array.isArray(ctx.declaredErrorTypes)
|
|
1231
|
-
? ctx.declaredErrorTypes.filter((value) => typeof value === "string")
|
|
1232
|
-
: ctx.errors;
|
|
1233
|
-
const runtimeErrors = Array.isArray(ctx.runtimeErrors)
|
|
1234
|
-
? ctx.runtimeErrors.filter(isRuntimeRpcErrorDesc)
|
|
1235
|
-
: undefined;
|
|
1236
|
-
const reconstructed = reconstructDeclaredRpcError(declaredErrorTypes, runtimeErrors, errorData, json);
|
|
1237
|
-
if (reconstructed) {
|
|
1238
|
-
await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_handleBrowserAuthRequired).call(this, reconstructed);
|
|
1239
|
-
return err(reconstructed);
|
|
1240
|
-
}
|
|
1241
|
-
const remoteError = new RemoteError({ error: errorData });
|
|
1242
|
-
await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_handleBrowserAuthRequired).call(this, remoteError);
|
|
1243
|
-
return err(remoteError);
|
|
1244
|
-
}
|
|
1245
|
-
const json = safeJson(response).take();
|
|
1246
|
-
if (isErr(json)) {
|
|
1247
|
-
return err(requestFailedTransportError({
|
|
1248
|
-
code: "trellis.request.invalid_response",
|
|
1249
|
-
message: "Trellis returned an invalid response.",
|
|
1250
|
-
hint: "Retry the request. If it keeps happening, check the Trellis capability handling this request.",
|
|
1251
|
-
method,
|
|
1252
|
-
subject,
|
|
1253
|
-
cause: json.error.cause,
|
|
1254
|
-
}));
|
|
1255
|
-
}
|
|
1256
|
-
const outputResult = parseRuntimeSchema(ctx.output, json).take();
|
|
1257
|
-
if (isErr(outputResult)) {
|
|
1258
|
-
return err(outputResult.error);
|
|
1259
|
-
}
|
|
1260
|
-
return ok(outputResult);
|
|
1261
|
-
};
|
|
1262
|
-
return await withSpanAsync(span, async () => {
|
|
1263
|
-
try {
|
|
1264
|
-
const result = await attempt();
|
|
1265
|
-
const value = result.take();
|
|
1266
|
-
if (isErr(value)) {
|
|
1267
|
-
span.setStatus({
|
|
1268
|
-
code: SpanStatusCode.ERROR,
|
|
1269
|
-
message: value.error.message,
|
|
1270
|
-
});
|
|
1271
|
-
}
|
|
1272
|
-
else {
|
|
1273
|
-
span.setStatus({ code: SpanStatusCode.OK });
|
|
1274
|
-
}
|
|
1275
|
-
return result;
|
|
1276
|
-
}
|
|
1277
|
-
catch (cause) {
|
|
1278
|
-
const unexpected = cause instanceof TransportError
|
|
1279
|
-
? cause
|
|
1280
|
-
: new UnexpectedError({ cause });
|
|
1281
|
-
span.setStatus({
|
|
1282
|
-
code: SpanStatusCode.ERROR,
|
|
1283
|
-
message: unexpected.message,
|
|
1284
|
-
});
|
|
1285
|
-
span.recordException(unexpected);
|
|
1286
|
-
return err(unexpected);
|
|
1287
|
-
}
|
|
1288
|
-
finally {
|
|
1289
|
-
span.end();
|
|
1290
|
-
}
|
|
1291
|
-
});
|
|
1292
|
-
})());
|
|
1293
|
-
}, _Trellis_handleBrowserAuthRequired = async function _Trellis_handleBrowserAuthRequired(error) {
|
|
1294
|
-
if (!__classPrivateFieldGet(this, _Trellis_onSessionNotFound, "f") || !isBrowserAuthRequiredError(error)) {
|
|
1295
|
-
return;
|
|
1296
|
-
}
|
|
1297
|
-
await __classPrivateFieldGet(this, _Trellis_onSessionNotFound, "f").call(this);
|
|
1298
|
-
}, _Trellis_authenticateFeedRequest = async function _Trellis_authenticateFeedRequest(args) {
|
|
1299
|
-
const sessionKey = args.msg.headers?.get("session-key");
|
|
1300
|
-
const proof = args.msg.headers?.get("proof");
|
|
1301
|
-
const iatHeader = args.msg.headers?.get("iat");
|
|
1302
|
-
const requestId = args.msg.headers?.get("request-id");
|
|
1303
|
-
if (!sessionKey) {
|
|
1304
|
-
return err(new AuthError({ reason: "missing_session_key" }));
|
|
1305
|
-
}
|
|
1306
|
-
if (!proof)
|
|
1307
|
-
return err(new AuthError({ reason: "missing_proof" }));
|
|
1308
|
-
const iat = Number(iatHeader);
|
|
1309
|
-
if (!Number.isSafeInteger(iat) || !requestId) {
|
|
1310
|
-
return err(new AuthError({ reason: "invalid_signature" }));
|
|
1311
|
-
}
|
|
1312
|
-
const proofInput = buildProofInput(sessionKey, args.subject, args.payloadHash, iat, requestId);
|
|
1313
|
-
const digest = await sha256(proofInput);
|
|
1314
|
-
const verifyResult = await AsyncResult.try(async () => {
|
|
1315
|
-
const publicKeyRaw = base64urlDecode(sessionKey);
|
|
1316
|
-
const pub = await crypto.subtle.importKey("raw", toArrayBuffer(publicKeyRaw), { name: "Ed25519" }, true, ["verify"]);
|
|
1317
|
-
return crypto.subtle.verify({ name: "Ed25519" }, pub, toArrayBuffer(base64urlDecode(proof)), toArrayBuffer(digest));
|
|
1318
|
-
});
|
|
1319
|
-
if (!verifyResult.isOk() || verifyResult.take() !== true) {
|
|
1320
|
-
return err(new AuthError({ reason: "invalid_signature", context: { sessionKey } }));
|
|
1321
|
-
}
|
|
1322
|
-
const auth = await this.requestAuthValidate({
|
|
1323
|
-
sessionKey,
|
|
1324
|
-
proof,
|
|
1325
|
-
subject: args.subject,
|
|
1326
|
-
payloadHash: base64urlEncode(args.payloadHash),
|
|
1327
|
-
iat,
|
|
1328
|
-
requestId,
|
|
1329
|
-
capabilities: [...args.requiredCapabilities],
|
|
1330
|
-
}).take();
|
|
1331
|
-
if (isErr(auth))
|
|
1332
|
-
return err(auth.error);
|
|
1333
|
-
if (!auth.allowed) {
|
|
1334
|
-
return err(new AuthError({
|
|
1335
|
-
reason: "insufficient_permissions",
|
|
1336
|
-
context: {
|
|
1337
|
-
feed: args.feed,
|
|
1338
|
-
requiredCapabilities: args.requiredCapabilities,
|
|
1339
|
-
userCapabilities: auth.caller.capabilities,
|
|
1340
|
-
},
|
|
1341
|
-
}));
|
|
1342
|
-
}
|
|
1343
|
-
if (typeof args.msg.reply !== "string" ||
|
|
1344
|
-
!args.msg.reply.startsWith(`${auth.inboxPrefix}.`)) {
|
|
1345
|
-
return err(new AuthError({
|
|
1346
|
-
reason: "reply_subject_mismatch",
|
|
1347
|
-
context: { expected: auth.inboxPrefix, actual: args.msg.reply },
|
|
1348
|
-
}));
|
|
1349
|
-
}
|
|
1350
|
-
return ok(auth.caller);
|
|
1351
|
-
}, _Trellis_subscribeFeed = function _Trellis_subscribeFeed(feed, descriptor, input, opts) {
|
|
1352
|
-
return AsyncResult.from((async () => {
|
|
1353
|
-
const payload = encodeRuntimeSchema(descriptor.input, input).take();
|
|
1354
|
-
if (isErr(payload))
|
|
1355
|
-
return payload;
|
|
1356
|
-
const subject = this.template(descriptor.subject, input).take();
|
|
1357
|
-
if (isErr(subject))
|
|
1358
|
-
return subject;
|
|
1359
|
-
const authHeaders = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createProof).call(this, subject, payload);
|
|
1360
|
-
const headers = natsHeaders();
|
|
1361
|
-
headers.set("session-key", this.auth.sessionKey);
|
|
1362
|
-
headers.set("proof", authHeaders.proof);
|
|
1363
|
-
headers.set("iat", String(authHeaders.iat));
|
|
1364
|
-
headers.set("request-id", authHeaders.requestId);
|
|
1365
|
-
injectTraceContext(createNatsHeaderCarrier(headers));
|
|
1366
|
-
const inbox = createInbox(`_INBOX.${this.auth.sessionKey.slice(0, 16)}`);
|
|
1367
|
-
const sub = this.nats.subscribe(inbox);
|
|
1368
|
-
const iterator = sub[Symbol.asyncIterator]();
|
|
1369
|
-
const abort = () => sub.unsubscribe();
|
|
1370
|
-
opts?.signal?.addEventListener("abort", abort, { once: true });
|
|
1371
|
-
try {
|
|
1372
|
-
this.nats.publish(subject, payload, { headers, reply: inbox });
|
|
1373
|
-
await this.nats.flush();
|
|
1374
|
-
}
|
|
1375
|
-
catch (cause) {
|
|
1376
|
-
opts?.signal?.removeEventListener("abort", abort);
|
|
1377
|
-
sub.unsubscribe();
|
|
1378
|
-
return err(createTransportError({
|
|
1379
|
-
code: "trellis.feed.subscribe_failed",
|
|
1380
|
-
message: "Trellis could not subscribe to the feed.",
|
|
1381
|
-
hint: "Retry the subscription. If it keeps failing, check Trellis runtime health.",
|
|
1382
|
-
cause,
|
|
1383
|
-
context: { feed, subject },
|
|
1384
|
-
}));
|
|
1385
|
-
}
|
|
1386
|
-
let timeoutId;
|
|
1387
|
-
let abortHandler;
|
|
1388
|
-
const handshakePromises = [
|
|
1389
|
-
iterator.next(),
|
|
1390
|
-
new Promise((resolve) => {
|
|
1391
|
-
timeoutId = setTimeout(() => resolve("timeout"), this.timeout);
|
|
1392
|
-
}),
|
|
1393
|
-
];
|
|
1394
|
-
const signal = opts?.signal;
|
|
1395
|
-
if (signal) {
|
|
1396
|
-
handshakePromises.push(new Promise((resolve) => {
|
|
1397
|
-
abortHandler = () => resolve("aborted");
|
|
1398
|
-
signal.addEventListener("abort", abortHandler, { once: true });
|
|
1399
|
-
}));
|
|
1400
|
-
}
|
|
1401
|
-
const firstFrame = await Promise.race(handshakePromises);
|
|
1402
|
-
if (timeoutId !== undefined)
|
|
1403
|
-
clearTimeout(timeoutId);
|
|
1404
|
-
if (signal && abortHandler) {
|
|
1405
|
-
signal.removeEventListener("abort", abortHandler);
|
|
1406
|
-
}
|
|
1407
|
-
if (firstFrame === "timeout" || firstFrame === "aborted") {
|
|
1408
|
-
opts?.signal?.removeEventListener("abort", abort);
|
|
1409
|
-
sub.unsubscribe();
|
|
1410
|
-
return err(createTransportError({
|
|
1411
|
-
code: firstFrame === "timeout"
|
|
1412
|
-
? "trellis.feed.subscribe_timeout"
|
|
1413
|
-
: "trellis.feed.subscribe_aborted",
|
|
1414
|
-
message: firstFrame === "timeout"
|
|
1415
|
-
? "Trellis did not receive a feed acknowledgement."
|
|
1416
|
-
: "The feed subscription was aborted before Trellis acknowledged it.",
|
|
1417
|
-
hint: firstFrame === "timeout"
|
|
1418
|
-
? "Check that the target service is running and has the current deployment digest, then retry."
|
|
1419
|
-
: "Retry the subscription if the feed is still needed.",
|
|
1420
|
-
context: { feed, subject },
|
|
1421
|
-
}));
|
|
1422
|
-
}
|
|
1423
|
-
if (firstFrame.done) {
|
|
1424
|
-
opts?.signal?.removeEventListener("abort", abort);
|
|
1425
|
-
sub.unsubscribe();
|
|
1426
|
-
return err(createTransportError({
|
|
1427
|
-
code: "trellis.feed.subscribe_closed",
|
|
1428
|
-
message: "Trellis closed the feed before acknowledging it.",
|
|
1429
|
-
hint: "Retry the subscription. If it keeps failing, check Trellis runtime health.",
|
|
1430
|
-
context: { feed, subject },
|
|
1431
|
-
}));
|
|
1432
|
-
}
|
|
1433
|
-
const firstMessage = firstFrame.value;
|
|
1434
|
-
if (firstMessage.headers?.get("status") === "error") {
|
|
1435
|
-
opts?.signal?.removeEventListener("abort", abort);
|
|
1436
|
-
sub.unsubscribe();
|
|
1437
|
-
return err(createTransportError({
|
|
1438
|
-
code: "trellis.feed.failed",
|
|
1439
|
-
message: "Trellis rejected the feed subscription.",
|
|
1440
|
-
hint: "Retry the subscription. If it keeps failing, check Trellis runtime health and permissions.",
|
|
1441
|
-
context: { feed, subject, frame: firstMessage.string() },
|
|
1442
|
-
}));
|
|
1443
|
-
}
|
|
1444
|
-
const firstEvent = firstMessage.headers?.get("feed-status") === "ready"
|
|
1445
|
-
? undefined
|
|
1446
|
-
: firstMessage;
|
|
1447
|
-
const eventSchema = descriptor.event;
|
|
1448
|
-
return ok((async function* () {
|
|
1449
|
-
try {
|
|
1450
|
-
const parseFeedFrame = (msg) => {
|
|
1451
|
-
if (msg.headers?.get("status") === "error") {
|
|
1452
|
-
throw createTransportError({
|
|
1453
|
-
code: "trellis.feed.failed",
|
|
1454
|
-
message: "Trellis stopped the feed.",
|
|
1455
|
-
hint: "Retry the subscription. If it keeps failing, check Trellis runtime health.",
|
|
1456
|
-
context: { feed, subject, frame: msg.string() },
|
|
1457
|
-
});
|
|
1458
|
-
}
|
|
1459
|
-
const json = safeJson(msg).take();
|
|
1460
|
-
if (isErr(json))
|
|
1461
|
-
throw json.error;
|
|
1462
|
-
const parsed = parseRuntimeSchema(eventSchema, json).take();
|
|
1463
|
-
if (isErr(parsed))
|
|
1464
|
-
throw parsed.error;
|
|
1465
|
-
return parsed;
|
|
1466
|
-
};
|
|
1467
|
-
if (firstEvent)
|
|
1468
|
-
yield parseFeedFrame(firstEvent);
|
|
1469
|
-
while (true) {
|
|
1470
|
-
const next = await iterator.next();
|
|
1471
|
-
if (next.done)
|
|
1472
|
-
break;
|
|
1473
|
-
yield parseFeedFrame(next.value);
|
|
1474
|
-
}
|
|
1475
|
-
}
|
|
1476
|
-
finally {
|
|
1477
|
-
opts?.signal?.removeEventListener("abort", abort);
|
|
1478
|
-
sub.unsubscribe();
|
|
1479
|
-
}
|
|
1480
|
-
})());
|
|
1481
|
-
})());
|
|
1482
|
-
}, _Trellis_handleFeed = async function _Trellis_handleFeed(feed, descriptor, handler) {
|
|
1483
|
-
const subject = this.template(descriptor.subject, {}, true).take();
|
|
1484
|
-
if (isErr(subject))
|
|
1485
|
-
throw subject.error;
|
|
1486
|
-
let sub;
|
|
1487
|
-
try {
|
|
1488
|
-
sub = this.nats.subscribe(subject);
|
|
1489
|
-
await this.nats.flush();
|
|
1490
|
-
}
|
|
1491
|
-
catch (cause) {
|
|
1492
|
-
throw createTransportError({
|
|
1493
|
-
code: "trellis.feed.listen_failed",
|
|
1494
|
-
message: "Trellis could not listen for feed requests.",
|
|
1495
|
-
hint: "Check the service deployment digest and runtime permissions, then restart the service.",
|
|
1496
|
-
cause,
|
|
1497
|
-
context: { feed, subject },
|
|
1498
|
-
});
|
|
1499
|
-
}
|
|
1500
|
-
const task = AsyncResult.try(async () => {
|
|
1501
|
-
for await (const msg of sub) {
|
|
1502
|
-
void (async () => {
|
|
1503
|
-
try {
|
|
1504
|
-
const result = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_processFeedMessage).call(this, feed, descriptor, msg, handler);
|
|
1505
|
-
const value = result.take();
|
|
1506
|
-
if (isErr(value)) {
|
|
1507
|
-
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithError).call(this, msg, value.error);
|
|
1508
|
-
}
|
|
1509
|
-
}
|
|
1510
|
-
catch (cause) {
|
|
1511
|
-
const error = cause instanceof BaseError
|
|
1512
|
-
? cause
|
|
1513
|
-
: new UnexpectedError({ cause });
|
|
1514
|
-
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithError).call(this, msg, error);
|
|
1515
|
-
}
|
|
1516
|
-
})();
|
|
1517
|
-
}
|
|
1518
|
-
});
|
|
1519
|
-
__classPrivateFieldGet(this, _Trellis_tasks, "f").add(`feed:${feed}`, task);
|
|
1520
|
-
}, _Trellis_processFeedMessage = async function _Trellis_processFeedMessage(feed, descriptor, msg, handler) {
|
|
1521
|
-
const json = safeJson(msg).take();
|
|
1522
|
-
if (isErr(json))
|
|
1523
|
-
return json;
|
|
1524
|
-
const parsed = parseRuntimeSchema(descriptor.input, json).take();
|
|
1525
|
-
if (isErr(parsed))
|
|
1526
|
-
return parsed;
|
|
1527
|
-
const caller = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_authenticateFeedRequest).call(this, {
|
|
1528
|
-
feed,
|
|
1529
|
-
subject: msg.subject,
|
|
1530
|
-
msg,
|
|
1531
|
-
payloadHash: await sha256(msg.data ?? new Uint8Array()),
|
|
1532
|
-
requiredCapabilities: descriptor.subscribeCapabilities,
|
|
1533
|
-
});
|
|
1534
|
-
const callerValue = caller.take();
|
|
1535
|
-
if (isErr(callerValue))
|
|
1536
|
-
return callerValue;
|
|
1537
|
-
if (!msg.reply) {
|
|
1538
|
-
return err(new UnexpectedError({
|
|
1539
|
-
context: { feed, reason: "missing_reply" },
|
|
1540
|
-
}));
|
|
1541
|
-
}
|
|
1542
|
-
const readyHeaders = natsHeaders();
|
|
1543
|
-
readyHeaders.set("feed-status", "ready");
|
|
1544
|
-
this.nats.publish(msg.reply, new Uint8Array(), { headers: readyHeaders });
|
|
1545
|
-
await this.nats.flush();
|
|
1546
|
-
const controller = new AbortController();
|
|
1547
|
-
try {
|
|
1548
|
-
await handler({
|
|
1549
|
-
input: parsed,
|
|
1550
|
-
caller: callerValue,
|
|
1551
|
-
signal: controller.signal,
|
|
1552
|
-
emit: (event) => AsyncResult.from((async () => {
|
|
1553
|
-
const payload = encodeRuntimeSchema(descriptor.event, event).take();
|
|
1554
|
-
if (isErr(payload))
|
|
1555
|
-
return payload;
|
|
1556
|
-
if (!msg.reply) {
|
|
1557
|
-
return err(new UnexpectedError({
|
|
1558
|
-
context: { feed, reason: "missing_reply" },
|
|
1559
|
-
}));
|
|
1560
|
-
}
|
|
1561
|
-
this.nats.publish(msg.reply, payload);
|
|
1562
|
-
await this.nats.flush();
|
|
1563
|
-
return ok(undefined);
|
|
1564
|
-
})()),
|
|
1565
|
-
});
|
|
1566
|
-
return ok(undefined);
|
|
1567
|
-
}
|
|
1568
|
-
finally {
|
|
1569
|
-
controller.abort();
|
|
1570
|
-
}
|
|
1571
|
-
}, _Trellis_handleRPC = function _Trellis_handleRPC(method, fn, subjectData = {}) {
|
|
1572
|
-
// Get API details
|
|
1573
|
-
const ctx = this.api["rpc"][method];
|
|
1574
|
-
const subject = this.template(ctx.subject, subjectData, true).take();
|
|
1575
|
-
if (isErr(subject)) {
|
|
1576
|
-
return AsyncResult.lift(subject);
|
|
1577
|
-
}
|
|
1578
|
-
const handlerTrellis = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createHandlerTrellis).call(this);
|
|
1579
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").info({ method: String(method) }, `Mounting ${method.toString()} RPC handler`);
|
|
1580
|
-
const sub = this.nats.subscribe(subject);
|
|
1581
|
-
return AsyncResult.try(async () => {
|
|
1582
|
-
for await (const msg of sub) {
|
|
1583
|
-
const resultPromise = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_processRPCMessage).call(this, method, ctx, msg, fn, handlerTrellis);
|
|
1584
|
-
const result = resultPromise.take();
|
|
1585
|
-
if (isErr(result)) {
|
|
1586
|
-
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithError).call(this, msg, result.error, { method: String(method) });
|
|
1587
|
-
continue;
|
|
1588
|
-
}
|
|
1589
|
-
const sent = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithPayload).call(this, msg, result, undefined, {
|
|
1590
|
-
method: String(method),
|
|
1591
|
-
responseKind: "success",
|
|
1592
|
-
});
|
|
1593
|
-
if (sent.isErr()) {
|
|
1594
|
-
const responseBytes = payloadByteLength(result);
|
|
1595
|
-
const message = causeMessage(sent.error.cause);
|
|
1596
|
-
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithError).call(this, msg, new TransportError({
|
|
1597
|
-
code: "trellis.rpc.response_send_failed",
|
|
1598
|
-
message: message.includes("max_payload")
|
|
1599
|
-
? "Trellis RPC response exceeded NATS max_payload."
|
|
1600
|
-
: "Trellis could not send the RPC response.",
|
|
1601
|
-
hint: "Reduce the requested page size or use a narrower RPC that does not include large detail payloads.",
|
|
1602
|
-
cause: sent.error.cause,
|
|
1603
|
-
context: {
|
|
1604
|
-
method: String(method),
|
|
1605
|
-
subject: msg.subject,
|
|
1606
|
-
responseBytes,
|
|
1607
|
-
causeMessage: message,
|
|
1608
|
-
},
|
|
1609
|
-
}), { method: String(method), responseBytes });
|
|
1610
|
-
}
|
|
1611
|
-
}
|
|
1612
|
-
});
|
|
1613
|
-
}, _Trellis_processRPCMessage = async function _Trellis_processRPCMessage(method, ctx, msg, fn, handlerTrellis) {
|
|
1614
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").debug({ method: String(method), subject: msg.subject }, "Processing RPC message");
|
|
1615
|
-
// Extract trace context from incoming NATS headers
|
|
1616
|
-
const parentContext = extractTraceContext(createNatsHeaderCarrier({
|
|
1617
|
-
get: (k) => msg.headers?.get(k) ?? undefined,
|
|
1618
|
-
set: () => { }, // Server doesn't need to set headers on incoming messages
|
|
1619
|
-
}));
|
|
1620
|
-
// Start a server span for this RPC handler
|
|
1621
|
-
const span = startServerSpan(method, msg.subject, parentContext);
|
|
1622
|
-
const incomingTraceId = traceIdFromTraceparent(msg.headers?.get("traceparent"));
|
|
1623
|
-
// Execute the handler within the span's context
|
|
1624
|
-
return withSpanAsync(span, async () => {
|
|
1625
|
-
const execute = async () => {
|
|
1626
|
-
const jsonData = safeJson(msg).take();
|
|
1627
|
-
if (isErr(jsonData)) {
|
|
1628
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").warn({ method, error: jsonData.error.message }, "Failed to parse JSON");
|
|
1629
|
-
span.setStatus({
|
|
1630
|
-
code: SpanStatusCode.ERROR,
|
|
1631
|
-
message: "Failed to parse JSON",
|
|
1632
|
-
});
|
|
1633
|
-
return jsonData;
|
|
1634
|
-
}
|
|
1635
|
-
const parsedInput = parseRuntimeSchema(ctx.input, jsonData).take();
|
|
1636
|
-
if (isErr(parsedInput)) {
|
|
1637
|
-
span.setStatus({
|
|
1638
|
-
code: SpanStatusCode.ERROR,
|
|
1639
|
-
message: "Input validation failed",
|
|
1640
|
-
});
|
|
1641
|
-
return parsedInput;
|
|
1642
|
-
}
|
|
1643
|
-
let caller;
|
|
1644
|
-
const callerSessionKey = msg.headers?.get("session-key") ?? "";
|
|
1645
|
-
const authRequired = ctx.authRequired ?? true;
|
|
1646
|
-
if (!authRequired) {
|
|
1647
|
-
caller = {
|
|
1648
|
-
type: "service",
|
|
1649
|
-
id: "system",
|
|
1650
|
-
active: true,
|
|
1651
|
-
name: "System",
|
|
1652
|
-
capabilities: ["service"],
|
|
1653
|
-
};
|
|
1654
|
-
}
|
|
1655
|
-
else {
|
|
1656
|
-
const sessionKey = msg.headers?.get("session-key");
|
|
1657
|
-
const proof = msg.headers?.get("proof");
|
|
1658
|
-
const iatHeader = msg.headers?.get("iat");
|
|
1659
|
-
const requestId = msg.headers?.get("request-id");
|
|
1660
|
-
if (!sessionKey) {
|
|
1661
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").warn({ method }, "Missing session-key header");
|
|
1662
|
-
span.setStatus({
|
|
1663
|
-
code: SpanStatusCode.ERROR,
|
|
1664
|
-
message: "Missing session-key",
|
|
1665
|
-
});
|
|
1666
|
-
return err(new AuthError({ reason: "missing_session_key" }));
|
|
1667
|
-
}
|
|
1668
|
-
if (!proof) {
|
|
1669
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").warn({ method }, "Missing proof in request");
|
|
1670
|
-
span.setStatus({
|
|
1671
|
-
code: SpanStatusCode.ERROR,
|
|
1672
|
-
message: "Missing proof",
|
|
1673
|
-
});
|
|
1674
|
-
return err(new AuthError({ reason: "missing_proof" }));
|
|
1675
|
-
}
|
|
1676
|
-
const iat = Number(iatHeader);
|
|
1677
|
-
if (!Number.isSafeInteger(iat) || !requestId) {
|
|
1678
|
-
return err(new AuthError({ reason: "invalid_signature" }));
|
|
1679
|
-
}
|
|
1680
|
-
// Verify proof signature locally using the raw request bytes we received.
|
|
1681
|
-
const payloadBytes = msg.data ?? new Uint8Array();
|
|
1682
|
-
const payloadHash = await sha256(payloadBytes);
|
|
1683
|
-
const proofInput = buildProofInput(sessionKey, msg.subject, payloadHash, iat, requestId);
|
|
1684
|
-
const digest = await sha256(proofInput);
|
|
1685
|
-
const verifyResult = await AsyncResult.try(async () => {
|
|
1686
|
-
const publicKeyRaw = base64urlDecode(sessionKey);
|
|
1687
|
-
const pub = await crypto.subtle.importKey("raw", toArrayBuffer(publicKeyRaw), { name: "Ed25519" }, true, ["verify"]);
|
|
1688
|
-
return crypto.subtle.verify({ name: "Ed25519" }, pub, toArrayBuffer(base64urlDecode(proof)), toArrayBuffer(digest));
|
|
1689
|
-
});
|
|
1690
|
-
const signatureOk = verifyResult.isOk() &&
|
|
1691
|
-
verifyResult.take() === true;
|
|
1692
|
-
if (!signatureOk) {
|
|
1693
|
-
span.setStatus({
|
|
1694
|
-
code: SpanStatusCode.ERROR,
|
|
1695
|
-
message: "Invalid signature",
|
|
1696
|
-
});
|
|
1697
|
-
return err(new AuthError({
|
|
1698
|
-
reason: "invalid_signature",
|
|
1699
|
-
context: { sessionKey },
|
|
1700
|
-
}));
|
|
1701
|
-
}
|
|
1702
|
-
let auth;
|
|
1703
|
-
for (let attempt = 0; attempt < DEFAULT_AUTH_VALIDATE_SESSION_RETRY_ATTEMPTS; attempt++) {
|
|
1704
|
-
const authValue = await this.requestAuthValidate({
|
|
1705
|
-
sessionKey,
|
|
1706
|
-
proof,
|
|
1707
|
-
subject: msg.subject,
|
|
1708
|
-
payloadHash: base64urlEncode(payloadHash),
|
|
1709
|
-
iat,
|
|
1710
|
-
requestId,
|
|
1711
|
-
capabilities: [...ctx.callerCapabilities],
|
|
1712
|
-
}).take();
|
|
1713
|
-
if (!isErr(authValue)) {
|
|
1714
|
-
auth = authValue;
|
|
1715
|
-
break;
|
|
1716
|
-
}
|
|
1717
|
-
const authError = authValue.error;
|
|
1718
|
-
if (!isTransientAuthValidateSessionError(authError) ||
|
|
1719
|
-
attempt === DEFAULT_AUTH_VALIDATE_SESSION_RETRY_ATTEMPTS - 1) {
|
|
1720
|
-
auth = authError;
|
|
1721
|
-
break;
|
|
1722
|
-
}
|
|
1723
|
-
await sleep(DEFAULT_AUTH_VALIDATE_SESSION_RETRY_MS * (attempt + 1));
|
|
1724
|
-
}
|
|
1725
|
-
if (!auth) {
|
|
1726
|
-
return err(new UnexpectedError({
|
|
1727
|
-
context: { reason: "missing_auth_validate_result" },
|
|
1728
|
-
}));
|
|
1729
|
-
}
|
|
1730
|
-
if (auth instanceof Error) {
|
|
1731
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").warn({
|
|
1732
|
-
method,
|
|
1733
|
-
error: auth.message,
|
|
1734
|
-
errorType: auth.name,
|
|
1735
|
-
remoteError: auth instanceof RemoteError
|
|
1736
|
-
? auth.toSerializable()
|
|
1737
|
-
: undefined,
|
|
1738
|
-
}, "Auth.Requests.Validate failed");
|
|
1739
|
-
span.setStatus({
|
|
1740
|
-
code: SpanStatusCode.ERROR,
|
|
1741
|
-
message: "Auth.Requests.Validate failed",
|
|
1742
|
-
});
|
|
1743
|
-
if (auth instanceof BaseError) {
|
|
1744
|
-
return err(auth);
|
|
1745
|
-
}
|
|
1746
|
-
return err(new UnexpectedError({ cause: auth }));
|
|
1747
|
-
}
|
|
1748
|
-
if (!auth.allowed) {
|
|
1749
|
-
span.setStatus({
|
|
1750
|
-
code: SpanStatusCode.ERROR,
|
|
1751
|
-
message: "Insufficient permissions",
|
|
1752
|
-
});
|
|
1753
|
-
return err(new AuthError({
|
|
1754
|
-
reason: "insufficient_permissions",
|
|
1755
|
-
context: {
|
|
1756
|
-
requiredCapabilities: ctx.callerCapabilities,
|
|
1757
|
-
userCapabilities: auth.caller.capabilities,
|
|
1758
|
-
},
|
|
1759
|
-
}));
|
|
1760
|
-
}
|
|
1761
|
-
if (typeof msg.reply !== "string" ||
|
|
1762
|
-
!msg.reply.startsWith(`${auth.inboxPrefix}.`)) {
|
|
1763
|
-
span.setStatus({
|
|
1764
|
-
code: SpanStatusCode.ERROR,
|
|
1765
|
-
message: "Reply subject mismatch",
|
|
1766
|
-
});
|
|
1767
|
-
return err(new AuthError({
|
|
1768
|
-
reason: "reply_subject_mismatch",
|
|
1769
|
-
context: { expected: auth.inboxPrefix, actual: msg.reply },
|
|
1770
|
-
}));
|
|
1771
|
-
}
|
|
1772
|
-
caller = auth.caller;
|
|
1773
|
-
}
|
|
1774
|
-
span.setAttribute("auth.caller.type", caller.type);
|
|
1775
|
-
if (caller.type === "user") {
|
|
1776
|
-
span.setAttribute("user.id", caller.userId);
|
|
1777
|
-
span.setAttribute("user.identity.provider", caller.identity.provider);
|
|
1778
|
-
span.setAttribute("user.identity.subject", caller.identity.subject);
|
|
1779
|
-
}
|
|
1780
|
-
if (caller.type === "service") {
|
|
1781
|
-
const { id } = caller;
|
|
1782
|
-
span.setAttribute("service.id", id);
|
|
1783
|
-
}
|
|
1784
|
-
if (caller.type === "device") {
|
|
1785
|
-
span.setAttribute("device.id", caller.deviceId);
|
|
1786
|
-
span.setAttribute("device.deployment_id", caller.deploymentId);
|
|
1787
|
-
}
|
|
1788
|
-
const invokeHandler = fn;
|
|
1789
|
-
const handlerResultWrapped = await AsyncResult.try(async () => await Promise.resolve(invokeHandler({
|
|
1790
|
-
input: parsedInput,
|
|
1791
|
-
context: {
|
|
1792
|
-
caller,
|
|
1793
|
-
sessionKey: callerSessionKey,
|
|
1794
|
-
},
|
|
1795
|
-
client: handlerTrellis,
|
|
1796
|
-
})));
|
|
1797
|
-
if (handlerResultWrapped.isErr()) {
|
|
1798
|
-
const error = handlerResultWrapped.error.withContext({ method });
|
|
1799
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({
|
|
1800
|
-
method,
|
|
1801
|
-
error: error.message,
|
|
1802
|
-
cause: error.cause instanceof Error
|
|
1803
|
-
? { message: error.cause.message, stack: error.cause.stack }
|
|
1804
|
-
: error.cause,
|
|
1805
|
-
}, "Handler threw unexpectedly.");
|
|
1806
|
-
span.setStatus({
|
|
1807
|
-
code: SpanStatusCode.ERROR,
|
|
1808
|
-
message: error.message,
|
|
1809
|
-
});
|
|
1810
|
-
span.recordException(error);
|
|
1811
|
-
return err(error);
|
|
1812
|
-
}
|
|
1813
|
-
const handlerResult = handlerResultWrapped.take();
|
|
1814
|
-
const handlerOutcome = handlerResult.take();
|
|
1815
|
-
if (isErr(handlerOutcome)) {
|
|
1816
|
-
const handlerError = handlerOutcome.error;
|
|
1817
|
-
const error = handlerError instanceof BaseError &&
|
|
1818
|
-
!(handlerError instanceof RemoteError)
|
|
1819
|
-
? handlerError
|
|
1820
|
-
: new UnexpectedError({ cause: handlerError });
|
|
1821
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({
|
|
1822
|
-
method,
|
|
1823
|
-
error: error.message,
|
|
1824
|
-
errorType: error.name,
|
|
1825
|
-
cause: error.cause instanceof Error
|
|
1826
|
-
? { message: error.cause.message, stack: error.cause.stack }
|
|
1827
|
-
: error.cause,
|
|
1828
|
-
}, "Handler returned error.");
|
|
1829
|
-
span.setStatus({
|
|
1830
|
-
code: SpanStatusCode.ERROR,
|
|
1831
|
-
message: error.message,
|
|
1832
|
-
});
|
|
1833
|
-
return err(error);
|
|
1834
|
-
}
|
|
1835
|
-
const encoded = encodeSchema(ctx.output, handlerOutcome).take();
|
|
1836
|
-
if (isErr(encoded)) {
|
|
1837
|
-
span.setStatus({
|
|
1838
|
-
code: SpanStatusCode.ERROR,
|
|
1839
|
-
message: "Output encoding failed",
|
|
1840
|
-
});
|
|
1841
|
-
return encoded;
|
|
1842
|
-
}
|
|
1843
|
-
span.setStatus({ code: SpanStatusCode.OK });
|
|
1844
|
-
return ok(encoded);
|
|
1845
|
-
};
|
|
1846
|
-
const result = await execute();
|
|
1847
|
-
if (isErr(result)) {
|
|
1848
|
-
result.error.withTraceId(activeTraceId(span) ?? incomingTraceId);
|
|
1849
|
-
}
|
|
1850
|
-
span.end();
|
|
1851
|
-
return result;
|
|
1852
|
-
});
|
|
1853
|
-
}, _Trellis_respondWithPayload = function _Trellis_respondWithPayload(msg, payload, options, context) {
|
|
1854
|
-
const responseBytes = payloadByteLength(payload);
|
|
1855
|
-
try {
|
|
1856
|
-
msg.respond(payload, options);
|
|
1857
|
-
return ok(undefined);
|
|
1858
|
-
}
|
|
1859
|
-
catch (cause) {
|
|
1860
|
-
const error = new UnexpectedError({
|
|
1861
|
-
cause,
|
|
1862
|
-
context: {
|
|
1863
|
-
method: context.method,
|
|
1864
|
-
responseKind: context.responseKind,
|
|
1865
|
-
subject: msg.subject,
|
|
1866
|
-
reply: msg.reply,
|
|
1867
|
-
responseBytes,
|
|
1868
|
-
causeMessage: causeMessage(cause),
|
|
1869
|
-
},
|
|
1870
|
-
});
|
|
1871
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({
|
|
1872
|
-
method: context.method,
|
|
1873
|
-
responseKind: context.responseKind,
|
|
1874
|
-
subject: msg.subject,
|
|
1875
|
-
reply: msg.reply,
|
|
1876
|
-
responseBytes,
|
|
1877
|
-
cause: causeLogData(cause),
|
|
1878
|
-
}, "Failed to send RPC response");
|
|
1879
|
-
return err(error);
|
|
1880
|
-
}
|
|
1881
|
-
}, _Trellis_respondWithError = function _Trellis_respondWithError(msg, error, context = {}) {
|
|
1882
|
-
const trellisError = error instanceof BaseError &&
|
|
1883
|
-
!(error instanceof RemoteError)
|
|
1884
|
-
? error
|
|
1885
|
-
: new UnexpectedError({ cause: error });
|
|
1886
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({
|
|
1887
|
-
method: context.method,
|
|
1888
|
-
subject: msg.subject,
|
|
1889
|
-
responseBytes: context.responseBytes,
|
|
1890
|
-
error: trellisError.toSerializable(),
|
|
1891
|
-
}, "RPC error");
|
|
1892
|
-
const errorData = trellisError.toSerializable();
|
|
1893
|
-
const hdrs = natsHeaders();
|
|
1894
|
-
hdrs.set("status", "error");
|
|
1895
|
-
const serialized = Result.try(() => JSON.stringify(errorData));
|
|
1896
|
-
if (serialized.isErr()) {
|
|
1897
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({ error: serialized.error }, "Failed to serialize error response");
|
|
1898
|
-
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithPayload).call(this, msg, '{"type":"UnexpectedError","message":"Failed to serialize error"}', { headers: hdrs }, { method: context.method, responseKind: "error" });
|
|
1899
|
-
return;
|
|
1900
|
-
}
|
|
1901
|
-
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithPayload).call(this, msg, serialized.take(), { headers: hdrs }, { method: context.method, responseKind: "error" });
|
|
1902
|
-
}, _Trellis_startEphemeralEvent = function _Trellis_startEphemeralEvent(event, ctx, subject, fn, signal) {
|
|
1903
|
-
const sub = this.nats.subscribe(subject);
|
|
1904
|
-
if (signal) {
|
|
1905
|
-
if (signal.aborted) {
|
|
1906
|
-
sub.unsubscribe();
|
|
1907
|
-
return ok(undefined);
|
|
1908
|
-
}
|
|
1909
|
-
signal.addEventListener("abort", () => sub.unsubscribe(), { once: true });
|
|
1910
|
-
}
|
|
1911
|
-
const task = AsyncResult.try(async () => {
|
|
1912
|
-
for await (const msg of sub) {
|
|
1913
|
-
const parsedEvent = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_parseEventMessage).call(this, event, ctx, msg);
|
|
1914
|
-
const m = parsedEvent.take();
|
|
1915
|
-
if (isErr(m)) {
|
|
1916
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({ error: m.error }, "Event validation failed");
|
|
1917
|
-
continue;
|
|
1918
|
-
}
|
|
1919
|
-
const handlerResult = await AsyncResult.lift(fn(m));
|
|
1920
|
-
if (handlerResult.isErr()) {
|
|
1921
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({
|
|
1922
|
-
error: handlerResult.error.toSerializable(),
|
|
1923
|
-
event,
|
|
1924
|
-
subject: msg.subject,
|
|
1925
|
-
}, "Event handler failed");
|
|
1926
|
-
}
|
|
1927
|
-
}
|
|
1928
|
-
});
|
|
1929
|
-
__classPrivateFieldGet(this, _Trellis_tasks, "f").add(`event:${event}:${ulid()}`, task);
|
|
1930
|
-
return ok(undefined);
|
|
1931
|
-
}, _Trellis_resolveEventConsumerGroup = function _Trellis_resolveEventConsumerGroup(event, opts) {
|
|
1932
|
-
const metadata = __classPrivateFieldGet(this, _Trellis_eventConsumers, "f").metadata;
|
|
1933
|
-
const bindings = __classPrivateFieldGet(this, _Trellis_eventConsumers, "f").bindings ?? {};
|
|
1934
|
-
const groups = Object.entries(metadata ?? {})
|
|
1935
|
-
.filter(([, group]) => group.events.some((entry) => entry.event === String(event)))
|
|
1936
|
-
.map(([group]) => group);
|
|
1937
|
-
if (opts?.group) {
|
|
1938
|
-
if (!groups.includes(opts.group)) {
|
|
1939
|
-
return err(new UnexpectedError({
|
|
1940
|
-
cause: new Error(`Event '${String(event)}' is not declared in event consumer group '${opts.group}'.`),
|
|
1941
|
-
context: { event: String(event), group: opts.group },
|
|
1942
|
-
}));
|
|
1943
|
-
}
|
|
1944
|
-
if (!bindings[opts.group]) {
|
|
1945
|
-
return err(new UnexpectedError({
|
|
1946
|
-
cause: new Error(`Event consumer group '${opts.group}' has no Trellis-provisioned binding.`),
|
|
1947
|
-
context: { event: String(event), group: opts.group },
|
|
1948
|
-
}));
|
|
1949
|
-
}
|
|
1950
|
-
return ok(opts.group);
|
|
1951
|
-
}
|
|
1952
|
-
if (groups.length === 0) {
|
|
1953
|
-
return err(new UnexpectedError({
|
|
1954
|
-
cause: new Error(`Event '${String(event)}' is not declared in any event consumer group.`),
|
|
1955
|
-
context: { event: String(event) },
|
|
1956
|
-
}));
|
|
1957
|
-
}
|
|
1958
|
-
if (groups.length > 1) {
|
|
1959
|
-
return err(new UnexpectedError({
|
|
1960
|
-
cause: new Error(`Event '${String(event)}' is declared in multiple event consumer groups; pass opts.group.`),
|
|
1961
|
-
context: { event: String(event), groups },
|
|
1962
|
-
}));
|
|
1963
|
-
}
|
|
1964
|
-
const group = groups[0];
|
|
1965
|
-
if (!bindings[group]) {
|
|
1966
|
-
return err(new UnexpectedError({
|
|
1967
|
-
cause: new Error(`Event consumer group '${group}' has no Trellis-provisioned binding.`),
|
|
1968
|
-
context: { event: String(event), group },
|
|
1969
|
-
}));
|
|
1970
|
-
}
|
|
1971
|
-
return ok(group);
|
|
1972
|
-
}, _Trellis_registerDurableEventHandler = function _Trellis_registerDurableEventHandler(args) {
|
|
1973
|
-
if (args.signal?.aborted)
|
|
1974
|
-
return;
|
|
1975
|
-
const loop = __classPrivateFieldGet(this, _Trellis_durableEventLoops, "f").get(args.group) ?? {
|
|
1976
|
-
registrations: [],
|
|
1977
|
-
started: false,
|
|
1978
|
-
};
|
|
1979
|
-
const registration = {
|
|
1980
|
-
event: args.event,
|
|
1981
|
-
ctx: args.ctx,
|
|
1982
|
-
subject: args.subject,
|
|
1983
|
-
fn: args.fn,
|
|
1984
|
-
};
|
|
1985
|
-
loop.registrations.push(registration);
|
|
1986
|
-
__classPrivateFieldGet(this, _Trellis_durableEventLoops, "f").set(args.group, loop);
|
|
1987
|
-
args.signal?.addEventListener("abort", () => {
|
|
1988
|
-
const index = loop.registrations.indexOf(registration);
|
|
1989
|
-
if (index >= 0)
|
|
1990
|
-
loop.registrations.splice(index, 1);
|
|
1991
|
-
if (!__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_durableEventConsumerGroupReady).call(this, args.group, loop)) {
|
|
1992
|
-
loop.messages?.stop();
|
|
1993
|
-
}
|
|
1994
|
-
}, { once: true });
|
|
1995
|
-
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_startDurableEventConsumer).call(this, args.group, loop);
|
|
1996
|
-
}, _Trellis_startDurableEventConsumer = function _Trellis_startDurableEventConsumer(group, loop) {
|
|
1997
|
-
if (loop.started || !__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_durableEventConsumerGroupReady).call(this, group, loop)) {
|
|
1998
|
-
return;
|
|
1999
|
-
}
|
|
2000
|
-
loop.started = true;
|
|
2001
|
-
__classPrivateFieldGet(this, _Trellis_tasks, "f").add(`event-consumer:${group}:${ulid()}`, __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_runDurableEventConsumer).call(this, group, loop));
|
|
2002
|
-
}, _Trellis_durableEventConsumerGroupReady = function _Trellis_durableEventConsumerGroupReady(group, loop) {
|
|
2003
|
-
const metadata = __classPrivateFieldGet(this, _Trellis_eventConsumers, "f").metadata?.[group];
|
|
2004
|
-
if (!metadata)
|
|
2005
|
-
return false;
|
|
2006
|
-
return metadata.events.every((entry) => loop.registrations.some((registration) => String(registration.event) === entry.event));
|
|
2007
|
-
}, _Trellis_runDurableEventConsumer = function _Trellis_runDurableEventConsumer(group, loop) {
|
|
2008
|
-
return AsyncResult.from((async () => {
|
|
2009
|
-
const binding = __classPrivateFieldGet(this, _Trellis_eventConsumers, "f").bindings?.[group];
|
|
2010
|
-
if (!binding) {
|
|
2011
|
-
return err(new UnexpectedError({
|
|
2012
|
-
cause: new Error(`Event consumer group '${group}' has no Trellis-provisioned binding.`),
|
|
2013
|
-
context: { group },
|
|
2014
|
-
}));
|
|
2015
|
-
}
|
|
2016
|
-
try {
|
|
2017
|
-
const infoResult = await AsyncResult.try(async () => {
|
|
2018
|
-
const jsm = await jetstreamManager(this.nats);
|
|
2019
|
-
return await jsm.consumers.info(binding.stream, binding.consumerName);
|
|
2020
|
-
});
|
|
2021
|
-
const info = infoResult.take();
|
|
2022
|
-
if (isErr(info))
|
|
2023
|
-
return info;
|
|
2024
|
-
const consumer = this.js.consumers.getConsumerFromInfo(info);
|
|
2025
|
-
while (__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_durableEventConsumerGroupReady).call(this, group, loop)) {
|
|
2026
|
-
const messages = await consumer.fetch({
|
|
2027
|
-
max_messages: 1,
|
|
2028
|
-
expires: 30_000,
|
|
2029
|
-
});
|
|
2030
|
-
loop.messages = messages;
|
|
2031
|
-
if (!__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_durableEventConsumerGroupReady).call(this, group, loop)) {
|
|
2032
|
-
messages.stop();
|
|
2033
|
-
break;
|
|
2034
|
-
}
|
|
2035
|
-
await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_handleDurableEventConsumer).call(this, group, loop, messages)
|
|
2036
|
-
.orThrow();
|
|
2037
|
-
}
|
|
2038
|
-
}
|
|
2039
|
-
finally {
|
|
2040
|
-
loop.started = false;
|
|
2041
|
-
loop.messages = undefined;
|
|
2042
|
-
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_startDurableEventConsumer).call(this, group, loop);
|
|
2043
|
-
}
|
|
2044
|
-
return ok(undefined);
|
|
2045
|
-
})());
|
|
2046
|
-
}, _Trellis_handleDurableEvent = function _Trellis_handleDurableEvent(event, ctx, messages, fn) {
|
|
2047
|
-
return AsyncResult.try(async () => {
|
|
2048
|
-
for await (const msg of messages) {
|
|
2049
|
-
const parsedEvent = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_parseEventMessage).call(this, event, ctx, msg);
|
|
2050
|
-
const m = parsedEvent.take();
|
|
2051
|
-
if (isErr(m)) {
|
|
2052
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({ error: m.error }, "Event validation failed");
|
|
2053
|
-
msg.term();
|
|
2054
|
-
continue;
|
|
2055
|
-
}
|
|
2056
|
-
const handlerResult = await AsyncResult.lift(fn(m));
|
|
2057
|
-
if (handlerResult.isErr()) {
|
|
2058
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({
|
|
2059
|
-
error: handlerResult.error.toSerializable(),
|
|
2060
|
-
event,
|
|
2061
|
-
subject: msg.subject,
|
|
2062
|
-
}, "Event handler failed");
|
|
2063
|
-
msg.nak();
|
|
2064
|
-
continue;
|
|
2065
|
-
}
|
|
2066
|
-
msg.ack();
|
|
2067
|
-
}
|
|
2068
|
-
});
|
|
2069
|
-
}, _Trellis_handleDurableEventConsumer = function _Trellis_handleDurableEventConsumer(group, loop, messages) {
|
|
2070
|
-
return AsyncResult.try(async () => {
|
|
2071
|
-
for await (const msg of messages) {
|
|
2072
|
-
if (!__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_durableEventConsumerGroupReady).call(this, group, loop)) {
|
|
2073
|
-
messages.stop();
|
|
2074
|
-
break;
|
|
2075
|
-
}
|
|
2076
|
-
const matching = loop.registrations.filter((registration) => natsSubjectMatches(registration.subject, msg.subject));
|
|
2077
|
-
if (matching.length === 0) {
|
|
2078
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").warn({ group, subject: msg.subject }, "Durable event consumer received message without registered handler");
|
|
2079
|
-
msg.nak();
|
|
2080
|
-
continue;
|
|
2081
|
-
}
|
|
2082
|
-
let failed = false;
|
|
2083
|
-
for (const registration of matching) {
|
|
2084
|
-
const parsedEvent = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_parseEventMessage).call(this, registration.event, registration.ctx, msg);
|
|
2085
|
-
const eventPayload = parsedEvent.take();
|
|
2086
|
-
if (isErr(eventPayload)) {
|
|
2087
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({ error: eventPayload.error }, "Event validation failed");
|
|
2088
|
-
msg.term();
|
|
2089
|
-
failed = true;
|
|
2090
|
-
break;
|
|
2091
|
-
}
|
|
2092
|
-
const handlerResult = await AsyncResult.lift(registration.fn(eventPayload));
|
|
2093
|
-
if (handlerResult.isErr()) {
|
|
2094
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({
|
|
2095
|
-
error: handlerResult.error.toSerializable(),
|
|
2096
|
-
event: registration.event,
|
|
2097
|
-
subject: msg.subject,
|
|
2098
|
-
}, "Event handler failed");
|
|
2099
|
-
msg.nak();
|
|
2100
|
-
failed = true;
|
|
2101
|
-
break;
|
|
2102
|
-
}
|
|
2103
|
-
}
|
|
2104
|
-
if (!failed)
|
|
2105
|
-
msg.ack();
|
|
2106
|
-
}
|
|
2107
|
-
});
|
|
2108
|
-
}, _Trellis_parseEventMessage = function _Trellis_parseEventMessage(event, ctx, msg) {
|
|
2109
|
-
const jsonData = Result.try(() => msg.json());
|
|
2110
|
-
const json = jsonData.take();
|
|
2111
|
-
if (isErr(json)) {
|
|
2112
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({ error: json.error, event, subject: msg.subject }, "Event parse failed");
|
|
2113
|
-
return json;
|
|
2114
|
-
}
|
|
2115
|
-
return parseRuntimeSchema(ctx.event, json);
|
|
2116
|
-
}, _Trellis_escapeSubjectToken = function _Trellis_escapeSubjectToken(token) {
|
|
2117
|
-
const out = token.replace(NATS_SUBJECT_TOKEN_FORBIDDEN, (ch) => `~${ch.codePointAt(0).toString(16).toUpperCase()}~`);
|
|
2118
|
-
// Protect stapRet with $ due to NATS internal use of it
|
|
2119
|
-
if (out.length === 0 || out.startsWith("$")) {
|
|
2120
|
-
return `_${out}`;
|
|
2121
|
-
}
|
|
2122
|
-
return out;
|
|
2123
|
-
}, _Trellis_currentIat = function _Trellis_currentIat() {
|
|
2124
|
-
return this.auth.currentIat?.() ?? Math.floor(Date.now() / 1000);
|
|
2125
|
-
}, _Trellis_createProof = async function _Trellis_createProof(subject, payload) {
|
|
2126
|
-
const payloadBytes = new TextEncoder().encode(payload);
|
|
2127
|
-
const payloadHash = await sha256(payloadBytes);
|
|
2128
|
-
const iat = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_currentIat).call(this);
|
|
2129
|
-
const requestId = ulid();
|
|
2130
|
-
const input = buildProofInput(this.auth.sessionKey, subject, payloadHash, iat, requestId);
|
|
2131
|
-
const digest = await sha256(input);
|
|
2132
|
-
const sigBytes = await this.auth.sign(digest);
|
|
2133
|
-
return { proof: base64urlEncode(sigBytes), iat, requestId };
|
|
2134
|
-
}, _Trellis_requestMessageWithRetry = async function _Trellis_requestMessageWithRetry(args) {
|
|
2135
|
-
for (let retry = 0; retry <= __classPrivateFieldGet(this, _Trellis_noResponderMaxRetries, "f"); retry++) {
|
|
2136
|
-
const result = await AsyncResult.try(() => this.nats.request(args.subject, args.payload, {
|
|
2137
|
-
headers: args.headers,
|
|
2138
|
-
timeout: args.timeout,
|
|
2139
|
-
}));
|
|
2140
|
-
if (result.isOk()) {
|
|
2141
|
-
return ok(result.take());
|
|
2142
|
-
}
|
|
2143
|
-
const cause = result.error.cause;
|
|
2144
|
-
const message = cause instanceof Error ? cause.message : String(cause);
|
|
2145
|
-
const isNoResponders = message.includes("no responders");
|
|
2146
|
-
if (isNoResponders && retry < __classPrivateFieldGet(this, _Trellis_noResponderMaxRetries, "f")) {
|
|
2147
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").debug({ method: args.method, subject: args.subject, retry }, "No responders, retrying...");
|
|
2148
|
-
await new Promise((resolve) => setTimeout(resolve, __classPrivateFieldGet(this, _Trellis_noResponderRetryMs, "f") * (retry + 1)));
|
|
2149
|
-
continue;
|
|
2150
|
-
}
|
|
2151
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").warn({ method: args.method, subject: args.subject, error: message }, "NATS request failed");
|
|
2152
|
-
return err(classifyRequestTransportFailure({
|
|
2153
|
-
method: args.method,
|
|
2154
|
-
subject: args.subject,
|
|
2155
|
-
callerCapabilities: args.callerCapabilities,
|
|
2156
|
-
cause,
|
|
2157
|
-
}));
|
|
2158
|
-
}
|
|
2159
|
-
return err(requestFailedTransportError({
|
|
2160
|
-
code: "trellis.request.retry_exhausted",
|
|
2161
|
-
message: "Trellis could not complete the request after retrying.",
|
|
2162
|
-
hint: "Retry the request. If it keeps failing, check that the target service is available.",
|
|
2163
|
-
method: args.method,
|
|
2164
|
-
subject: args.subject,
|
|
2165
|
-
context: { retries: __classPrivateFieldGet(this, _Trellis_noResponderMaxRetries, "f") + 1 },
|
|
2166
|
-
}));
|
|
2167
|
-
}, _Trellis_requestJson = function _Trellis_requestJson(subject, body) {
|
|
2168
|
-
return AsyncResult.from((async () => {
|
|
2169
|
-
const span = startClientSpan(subject, subject);
|
|
2170
|
-
return await withSpanAsync(span, async () => {
|
|
2171
|
-
try {
|
|
2172
|
-
const payload = JSON.stringify(body);
|
|
2173
|
-
const authHeaders = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createProof).call(this, subject, payload);
|
|
2174
|
-
const headers = natsHeaders();
|
|
2175
|
-
headers.set("session-key", this.auth.sessionKey);
|
|
2176
|
-
headers.set("proof", authHeaders.proof);
|
|
2177
|
-
headers.set("iat", String(authHeaders.iat));
|
|
2178
|
-
headers.set("request-id", authHeaders.requestId);
|
|
2179
|
-
injectTraceContext(createNatsHeaderCarrier(headers), span);
|
|
2180
|
-
const response = (await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestMessageWithRetry).call(this, {
|
|
2181
|
-
subject,
|
|
2182
|
-
payload,
|
|
2183
|
-
headers,
|
|
2184
|
-
timeout: this.timeout,
|
|
2185
|
-
})).take();
|
|
2186
|
-
if (isErr(response)) {
|
|
2187
|
-
span.setStatus({
|
|
2188
|
-
code: SpanStatusCode.ERROR,
|
|
2189
|
-
message: response.error.message,
|
|
2190
|
-
});
|
|
2191
|
-
return response;
|
|
2192
|
-
}
|
|
2193
|
-
const json = safeJson(response).take();
|
|
2194
|
-
if (isErr(json)) {
|
|
2195
|
-
const error = createTransportError({
|
|
2196
|
-
code: "trellis.request.invalid_response",
|
|
2197
|
-
message: "Trellis returned an invalid response.",
|
|
2198
|
-
hint: "Retry the request. If it keeps happening, reconnect to Trellis and try again.",
|
|
2199
|
-
cause: json.error.cause,
|
|
2200
|
-
context: { subject },
|
|
2201
|
-
});
|
|
2202
|
-
span.setStatus({
|
|
2203
|
-
code: SpanStatusCode.ERROR,
|
|
2204
|
-
message: error.message,
|
|
2205
|
-
});
|
|
2206
|
-
return err(error);
|
|
2207
|
-
}
|
|
2208
|
-
span.setStatus({ code: SpanStatusCode.OK });
|
|
2209
|
-
return ok(json);
|
|
2210
|
-
}
|
|
2211
|
-
catch (cause) {
|
|
2212
|
-
const error = new UnexpectedError({ cause });
|
|
2213
|
-
span.setStatus({
|
|
2214
|
-
code: SpanStatusCode.ERROR,
|
|
2215
|
-
message: error.message,
|
|
2216
|
-
});
|
|
2217
|
-
span.recordException(error);
|
|
2218
|
-
return err(error);
|
|
2219
|
-
}
|
|
2220
|
-
finally {
|
|
2221
|
-
span.end();
|
|
2222
|
-
}
|
|
2223
|
-
});
|
|
2224
|
-
})());
|
|
2225
|
-
}, _Trellis_watchJson = function _Trellis_watchJson(subject, body) {
|
|
2226
|
-
return AsyncResult.from((async () => {
|
|
2227
|
-
const payload = JSON.stringify(body);
|
|
2228
|
-
const authHeaders = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createProof).call(this, subject, payload);
|
|
2229
|
-
const headers = natsHeaders();
|
|
2230
|
-
headers.set("session-key", this.auth.sessionKey);
|
|
2231
|
-
headers.set("proof", authHeaders.proof);
|
|
2232
|
-
headers.set("iat", String(authHeaders.iat));
|
|
2233
|
-
headers.set("request-id", authHeaders.requestId);
|
|
2234
|
-
const inbox = createInbox(`_INBOX.${this.auth.sessionKey.slice(0, 16)}`);
|
|
2235
|
-
const sub = this.nats.subscribe(inbox);
|
|
2236
|
-
try {
|
|
2237
|
-
this.nats.publish(subject, payload, {
|
|
2238
|
-
headers,
|
|
2239
|
-
reply: inbox,
|
|
2240
|
-
});
|
|
2241
|
-
await this.nats.flush();
|
|
2242
|
-
}
|
|
2243
|
-
catch (cause) {
|
|
2244
|
-
sub.unsubscribe();
|
|
2245
|
-
return err(createTransportError({
|
|
2246
|
-
code: "trellis.watch.failed",
|
|
2247
|
-
message: "Trellis could not start the operation watch.",
|
|
2248
|
-
hint: "Retry watching the operation. If it keeps failing, reconnect to Trellis and try again.",
|
|
2249
|
-
cause,
|
|
2250
|
-
context: { subject },
|
|
2251
|
-
}));
|
|
2252
|
-
}
|
|
2253
|
-
return ok((async function* () {
|
|
2254
|
-
try {
|
|
2255
|
-
for await (const msg of sub) {
|
|
2256
|
-
if (msg.headers?.get("status") === "error") {
|
|
2257
|
-
yield err(createTransportError({
|
|
2258
|
-
code: "trellis.watch.failed",
|
|
2259
|
-
message: "Trellis stopped the operation watch.",
|
|
2260
|
-
hint: "Retry watching the operation. If it keeps happening, reconnect to Trellis and try again.",
|
|
2261
|
-
context: { subject, frame: msg.string() },
|
|
2262
|
-
}));
|
|
2263
|
-
continue;
|
|
2264
|
-
}
|
|
2265
|
-
const json = safeJson(msg).take();
|
|
2266
|
-
if (isErr(json)) {
|
|
2267
|
-
yield err(createTransportError({
|
|
2268
|
-
code: "trellis.watch.invalid_response",
|
|
2269
|
-
message: "Trellis returned an invalid watch update.",
|
|
2270
|
-
hint: "Retry watching the operation. If it keeps happening, reconnect to Trellis and try again.",
|
|
2271
|
-
cause: json.error.cause,
|
|
2272
|
-
context: { subject },
|
|
2273
|
-
}));
|
|
2274
|
-
continue;
|
|
2275
|
-
}
|
|
2276
|
-
yield ok(json);
|
|
2277
|
-
}
|
|
2278
|
-
}
|
|
2279
|
-
finally {
|
|
2280
|
-
sub.unsubscribe();
|
|
2281
|
-
}
|
|
2282
|
-
})());
|
|
2283
|
-
})());
|
|
2284
|
-
};
|