@qlever-llc/trellis 0.8.3 → 0.9.0-rc.2
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/README.md +1 -1
- package/bin/trellis-generate.js +132 -0
- package/esm/auth/browser/login.d.ts.map +1 -1
- package/esm/auth/browser/login.js +46 -3
- package/esm/auth/browser/portal.d.ts.map +1 -1
- package/esm/auth/browser/portal.js +5 -1
- package/esm/auth/browser/session.d.ts +18 -7
- package/esm/auth/browser/session.d.ts.map +1 -1
- package/esm/auth/browser/session.js +47 -11
- package/esm/auth/browser/storage.d.ts +6 -1
- package/esm/auth/browser/storage.d.ts.map +1 -1
- package/esm/auth/browser/storage.js +15 -3
- package/esm/auth/browser.d.ts +2 -2
- package/esm/auth/browser.d.ts.map +1 -1
- package/esm/auth/browser.js +1 -1
- package/esm/auth/device_activation.d.ts +36 -33
- package/esm/auth/device_activation.d.ts.map +1 -1
- package/esm/auth/device_activation.js +26 -22
- package/esm/auth/mod.d.ts +4 -4
- package/esm/auth/mod.d.ts.map +1 -1
- package/esm/auth/mod.js +2 -2
- package/esm/auth/proof.d.ts +3 -1
- package/esm/auth/proof.d.ts.map +1 -1
- package/esm/auth/proof.js +21 -15
- package/esm/auth/protocol.d.ts +2457 -941
- package/esm/auth/protocol.d.ts.map +1 -1
- package/esm/auth/protocol.js +747 -375
- package/esm/auth/schemas.d.ts +25 -4
- package/esm/auth/schemas.d.ts.map +1 -1
- package/esm/auth/schemas.js +14 -4
- package/esm/auth/session_auth.d.ts +1 -1
- package/esm/auth/session_auth.d.ts.map +1 -1
- package/esm/auth/session_auth.js +7 -1
- package/esm/client_connect.d.ts +2 -0
- package/esm/client_connect.d.ts.map +1 -1
- package/esm/client_connect.js +76 -15
- package/esm/contract.d.ts +3 -0
- package/esm/contract.d.ts.map +1 -1
- package/esm/contract_support/mod.d.ts +422 -43
- package/esm/contract_support/mod.d.ts.map +1 -1
- package/esm/contract_support/mod.js +734 -33
- package/esm/contract_support/protocol.d.ts +20 -5
- package/esm/contract_support/protocol.d.ts.map +1 -1
- package/esm/contract_support/protocol.js +18 -10
- package/esm/contract_support/runtime.d.ts +11 -0
- package/esm/contract_support/runtime.d.ts.map +1 -1
- package/esm/contract_support/schema_pointers.d.ts.map +1 -1
- package/esm/contract_support/schema_pointers.js +32 -14
- package/esm/device.d.ts +2 -0
- package/esm/device.d.ts.map +1 -1
- package/esm/device.js +3 -0
- package/esm/errors/AuthError.d.ts +1 -1
- package/esm/errors/AuthError.d.ts.map +1 -1
- package/esm/errors/AuthError.js +5 -1
- package/esm/errors/index.d.ts +4 -4
- package/esm/generated-sdk/auth/api.d.ts +27 -9
- package/esm/generated-sdk/auth/api.d.ts.map +1 -1
- package/esm/generated-sdk/auth/api.js +16 -590
- package/esm/generated-sdk/auth/client.d.ts +91 -85
- package/esm/generated-sdk/auth/client.d.ts.map +1 -1
- package/esm/generated-sdk/auth/contract.d.ts +1 -1
- package/esm/generated-sdk/auth/contract.d.ts.map +1 -1
- package/esm/generated-sdk/auth/contract.js +4 -2
- package/esm/generated-sdk/auth/mod.d.ts +1 -0
- package/esm/generated-sdk/auth/mod.d.ts.map +1 -1
- package/esm/generated-sdk/auth/owned_api.d.ts +3 -0
- package/esm/generated-sdk/auth/owned_api.d.ts.map +1 -0
- package/esm/generated-sdk/auth/owned_api.js +594 -0
- package/esm/generated-sdk/auth/schemas.d.ts +9959 -5160
- package/esm/generated-sdk/auth/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/auth/schemas.js +136 -137
- package/esm/generated-sdk/auth/types.d.ts +2418 -1557
- package/esm/generated-sdk/auth/types.d.ts.map +1 -1
- package/esm/generated-sdk/auth/types.js +1 -1
- package/esm/generated-sdk/health/api.d.ts +24 -9
- package/esm/generated-sdk/health/api.d.ts.map +1 -1
- package/esm/generated-sdk/health/api.js +12 -20
- package/esm/generated-sdk/health/client.d.ts +2 -1
- package/esm/generated-sdk/health/client.d.ts.map +1 -1
- package/esm/generated-sdk/health/contract.d.ts.map +1 -1
- package/esm/generated-sdk/health/contract.js +2 -0
- package/esm/generated-sdk/health/owned_api.d.ts +3 -0
- package/esm/generated-sdk/health/owned_api.d.ts.map +1 -0
- package/esm/generated-sdk/health/owned_api.js +16 -0
- package/esm/generated-sdk/health/types.d.ts +2 -0
- package/esm/generated-sdk/health/types.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/api.d.ts +33 -9
- package/esm/generated-sdk/jobs/api.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/api.js +22 -87
- package/esm/generated-sdk/jobs/client.d.ts +9 -2
- package/esm/generated-sdk/jobs/client.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/contract.d.ts +1 -1
- package/esm/generated-sdk/jobs/contract.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/contract.js +4 -2
- package/esm/generated-sdk/jobs/owned_api.d.ts +3 -0
- package/esm/generated-sdk/jobs/owned_api.d.ts.map +1 -0
- package/esm/generated-sdk/jobs/owned_api.js +118 -0
- package/esm/generated-sdk/jobs/schemas.d.ts +336 -123
- package/esm/generated-sdk/jobs/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/schemas.js +17 -15
- package/esm/generated-sdk/jobs/types.d.ts +144 -34
- package/esm/generated-sdk/jobs/types.d.ts.map +1 -1
- package/esm/generated-sdk/jobs/types.js +36 -1
- package/esm/generated-sdk/state/api.d.ts +27 -9
- package/esm/generated-sdk/state/api.d.ts.map +1 -1
- package/esm/generated-sdk/state/api.js +16 -71
- package/esm/generated-sdk/state/client.d.ts +4 -2
- package/esm/generated-sdk/state/client.d.ts.map +1 -1
- package/esm/generated-sdk/state/contract.d.ts +1 -1
- package/esm/generated-sdk/state/contract.d.ts.map +1 -1
- package/esm/generated-sdk/state/contract.js +4 -2
- package/esm/generated-sdk/state/owned_api.d.ts +3 -0
- package/esm/generated-sdk/state/owned_api.d.ts.map +1 -0
- package/esm/generated-sdk/state/owned_api.js +66 -0
- package/esm/generated-sdk/state/schemas.d.ts +264 -284
- package/esm/generated-sdk/state/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/state/schemas.js +6 -6
- package/esm/generated-sdk/state/types.d.ts +24 -23
- package/esm/generated-sdk/state/types.d.ts.map +1 -1
- package/esm/generated-sdk/state/types.js +1 -1
- package/esm/generated-sdk/trellis-core/api.d.ts +27 -9
- package/esm/generated-sdk/trellis-core/api.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/api.js +16 -39
- package/esm/generated-sdk/trellis-core/client.d.ts +5 -2
- package/esm/generated-sdk/trellis-core/client.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/contract.d.ts +1 -1
- package/esm/generated-sdk/trellis-core/contract.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/contract.js +4 -2
- package/esm/generated-sdk/trellis-core/owned_api.d.ts +3 -0
- package/esm/generated-sdk/trellis-core/owned_api.d.ts.map +1 -0
- package/esm/generated-sdk/trellis-core/owned_api.js +42 -0
- package/esm/generated-sdk/trellis-core/schemas.d.ts +259 -11
- package/esm/generated-sdk/trellis-core/schemas.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/schemas.js +5 -3
- package/esm/generated-sdk/trellis-core/types.d.ts +56 -1
- package/esm/generated-sdk/trellis-core/types.d.ts.map +1 -1
- package/esm/generated-sdk/trellis-core/types.js +1 -1
- package/esm/helpers.d.ts.map +1 -1
- package/esm/index.d.ts +4 -3
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -0
- package/esm/jobs.d.ts +10 -1
- package/esm/jobs.d.ts.map +1 -1
- package/esm/jobs.js +16 -1
- package/esm/kv.d.ts.map +1 -1
- package/esm/kv.js +10 -4
- package/esm/models/auth/rpc/Logout.d.ts +4 -4
- package/esm/models/auth/rpc/Logout.d.ts.map +1 -1
- package/esm/models/auth/rpc/Logout.js +2 -2
- package/esm/models/trellis/Page.d.ts +2 -0
- package/esm/models/trellis/Page.d.ts.map +1 -0
- package/esm/models/trellis/Page.js +1 -0
- package/esm/models/trellis/State.d.ts +1 -0
- package/esm/models/trellis/State.d.ts.map +1 -1
- package/esm/models/trellis/State.js +1 -0
- package/esm/models/trellis/rpc/StateList.d.ts +9 -12
- package/esm/models/trellis/rpc/StateList.d.ts.map +1 -1
- package/esm/models/trellis/rpc/StateList.js +16 -18
- package/esm/npm/src/auth/browser/login.d.ts.map +1 -1
- package/esm/npm/src/auth/browser/login.js +46 -3
- package/esm/npm/src/auth/browser/portal.d.ts.map +1 -1
- package/esm/npm/src/auth/browser/portal.js +5 -1
- package/esm/npm/src/auth/browser/session.d.ts +18 -7
- package/esm/npm/src/auth/browser/session.d.ts.map +1 -1
- package/esm/npm/src/auth/browser/session.js +47 -11
- package/esm/npm/src/auth/browser/storage.d.ts +6 -1
- package/esm/npm/src/auth/browser/storage.d.ts.map +1 -1
- package/esm/npm/src/auth/browser/storage.js +15 -3
- package/esm/npm/src/auth/browser.d.ts +2 -2
- package/esm/npm/src/auth/browser.d.ts.map +1 -1
- package/esm/npm/src/auth/browser.js +1 -1
- package/esm/npm/src/auth/device_activation.d.ts +36 -33
- package/esm/npm/src/auth/device_activation.d.ts.map +1 -1
- package/esm/npm/src/auth/device_activation.js +26 -22
- package/esm/npm/src/auth/mod.d.ts +4 -4
- package/esm/npm/src/auth/mod.d.ts.map +1 -1
- package/esm/npm/src/auth/mod.js +2 -2
- package/esm/npm/src/auth/proof.d.ts +3 -1
- package/esm/npm/src/auth/proof.d.ts.map +1 -1
- package/esm/npm/src/auth/proof.js +21 -15
- package/esm/npm/src/auth/protocol.d.ts +2457 -941
- package/esm/npm/src/auth/protocol.d.ts.map +1 -1
- package/esm/npm/src/auth/protocol.js +747 -375
- package/esm/npm/src/auth/schemas.d.ts +25 -4
- package/esm/npm/src/auth/schemas.d.ts.map +1 -1
- package/esm/npm/src/auth/schemas.js +14 -4
- package/esm/npm/src/auth/session_auth.d.ts +1 -1
- package/esm/npm/src/auth/session_auth.d.ts.map +1 -1
- package/esm/npm/src/auth/session_auth.js +7 -1
- package/esm/npm/src/client_connect.d.ts +2 -0
- package/esm/npm/src/client_connect.d.ts.map +1 -1
- package/esm/npm/src/client_connect.js +76 -15
- package/esm/npm/src/contract.d.ts +3 -0
- package/esm/npm/src/contract.d.ts.map +1 -1
- package/esm/npm/src/contract_support/mod.d.ts +422 -43
- package/esm/npm/src/contract_support/mod.d.ts.map +1 -1
- package/esm/npm/src/contract_support/mod.js +734 -33
- package/esm/npm/src/contract_support/protocol.d.ts +20 -5
- package/esm/npm/src/contract_support/protocol.d.ts.map +1 -1
- package/esm/npm/src/contract_support/protocol.js +18 -10
- package/esm/npm/src/contract_support/runtime.d.ts +11 -0
- package/esm/npm/src/contract_support/runtime.d.ts.map +1 -1
- package/esm/npm/src/contract_support/schema_pointers.d.ts.map +1 -1
- package/esm/npm/src/contract_support/schema_pointers.js +32 -14
- package/esm/npm/src/device/deno.d.ts.map +1 -1
- package/esm/npm/src/device/deno.js +6 -0
- package/esm/npm/src/device.d.ts +2 -0
- package/esm/npm/src/device.d.ts.map +1 -1
- package/esm/npm/src/device.js +3 -0
- package/esm/npm/src/errors/AuthError.d.ts +1 -1
- package/esm/npm/src/errors/AuthError.d.ts.map +1 -1
- package/esm/npm/src/errors/AuthError.js +5 -1
- package/esm/npm/src/errors/index.d.ts +4 -4
- package/esm/npm/src/helpers.d.ts.map +1 -1
- package/esm/npm/src/index.d.ts +4 -3
- package/esm/npm/src/index.d.ts.map +1 -1
- package/esm/npm/src/index.js +1 -0
- package/esm/npm/src/jobs.d.ts +10 -1
- package/esm/npm/src/jobs.d.ts.map +1 -1
- package/esm/npm/src/jobs.js +16 -1
- package/esm/npm/src/kv.d.ts.map +1 -1
- package/esm/npm/src/kv.js +10 -4
- package/esm/npm/src/models/auth/rpc/Logout.d.ts +4 -4
- package/esm/npm/src/models/auth/rpc/Logout.d.ts.map +1 -1
- package/esm/npm/src/models/auth/rpc/Logout.js +2 -2
- package/esm/npm/src/models/trellis/Page.d.ts +2 -0
- package/esm/npm/src/models/trellis/Page.d.ts.map +1 -0
- package/esm/npm/src/models/trellis/Page.js +1 -0
- package/esm/npm/src/models/trellis/State.d.ts +1 -0
- package/esm/npm/src/models/trellis/State.d.ts.map +1 -1
- package/esm/npm/src/models/trellis/State.js +1 -0
- package/esm/npm/src/models/trellis/rpc/StateList.d.ts +9 -12
- package/esm/npm/src/models/trellis/rpc/StateList.d.ts.map +1 -1
- package/esm/npm/src/models/trellis/rpc/StateList.js +16 -18
- package/esm/npm/src/operations.d.ts +16 -7
- package/esm/npm/src/operations.d.ts.map +1 -1
- package/esm/npm/src/operations.js +84 -19
- package/esm/npm/src/runtime_transport.d.ts +2 -0
- package/esm/npm/src/runtime_transport.d.ts.map +1 -1
- package/esm/npm/src/runtime_transport.js +1 -0
- package/esm/npm/src/server/internal_jobs/active-job.d.ts +2 -1
- package/esm/npm/src/server/internal_jobs/active-job.d.ts.map +1 -1
- package/esm/npm/src/server/internal_jobs/active-job.js +3 -0
- package/esm/npm/src/server/internal_jobs/job-manager.d.ts +4 -1
- package/esm/npm/src/server/internal_jobs/job-manager.d.ts.map +1 -1
- package/esm/npm/src/server/internal_jobs/job-manager.js +61 -1
- package/esm/npm/src/server/internal_jobs/projection.js +1 -0
- package/esm/npm/src/server/internal_jobs/runtime-worker.d.ts +13 -1
- package/esm/npm/src/server/internal_jobs/runtime-worker.d.ts.map +1 -1
- package/esm/npm/src/server/internal_jobs/runtime-worker.js +73 -13
- package/esm/npm/src/server/internal_jobs/types.d.ts +19 -0
- package/esm/npm/src/server/internal_jobs/types.d.ts.map +1 -1
- package/esm/npm/src/server/internal_jobs/types.js +10 -0
- package/esm/npm/src/server/runtime.d.ts +1 -0
- package/esm/npm/src/server/runtime.d.ts.map +1 -1
- package/esm/npm/src/server/service.d.ts +10 -1
- package/esm/npm/src/server/service.d.ts.map +1 -1
- package/esm/npm/src/server/service.js +190 -64
- package/esm/npm/src/server/transfer.d.ts.map +1 -1
- package/esm/npm/src/server/transfer.js +4 -0
- package/esm/npm/src/server.d.ts.map +1 -1
- package/esm/npm/src/server.js +337 -34
- package/esm/npm/src/store.d.ts +8 -1
- package/esm/npm/src/store.d.ts.map +1 -1
- package/esm/npm/src/store.js +46 -8
- package/esm/npm/src/transfer.d.ts +3 -0
- package/esm/npm/src/transfer.d.ts.map +1 -1
- package/esm/npm/src/transfer.js +20 -30
- package/esm/npm/src/trellis.d.ts +85 -22
- package/esm/npm/src/trellis.d.ts.map +1 -1
- package/esm/npm/src/trellis.js +525 -61
- package/esm/operations.d.ts +16 -7
- package/esm/operations.d.ts.map +1 -1
- package/esm/operations.js +84 -19
- package/esm/runtime_transport.d.ts +2 -0
- package/esm/runtime_transport.d.ts.map +1 -1
- package/esm/runtime_transport.js +1 -0
- package/esm/store.d.ts +8 -1
- package/esm/store.d.ts.map +1 -1
- package/esm/store.js +46 -8
- package/esm/transfer.d.ts +3 -0
- package/esm/transfer.d.ts.map +1 -1
- package/esm/transfer.js +20 -30
- package/esm/trellis.d.ts +85 -22
- package/esm/trellis.d.ts.map +1 -1
- package/esm/trellis.js +525 -61
- package/package.json +6 -4
- package/script/auth/browser/login.d.ts.map +1 -1
- package/script/auth/browser/login.js +46 -3
- package/script/auth/browser/portal.d.ts.map +1 -1
- package/script/auth/browser/portal.js +5 -1
- package/script/auth/browser/session.d.ts +18 -7
- package/script/auth/browser/session.d.ts.map +1 -1
- package/script/auth/browser/session.js +47 -11
- package/script/auth/browser/storage.d.ts +6 -1
- package/script/auth/browser/storage.d.ts.map +1 -1
- package/script/auth/browser/storage.js +15 -3
- package/script/auth/browser.d.ts +2 -2
- package/script/auth/browser.d.ts.map +1 -1
- package/script/auth/browser.js +2 -1
- package/script/auth/device_activation.d.ts +36 -33
- package/script/auth/device_activation.d.ts.map +1 -1
- package/script/auth/device_activation.js +25 -21
- package/script/auth/mod.d.ts +4 -4
- package/script/auth/mod.d.ts.map +1 -1
- package/script/auth/mod.js +132 -137
- package/script/auth/proof.d.ts +3 -1
- package/script/auth/proof.d.ts.map +1 -1
- package/script/auth/proof.js +21 -15
- package/script/auth/protocol.d.ts +2457 -941
- package/script/auth/protocol.d.ts.map +1 -1
- package/script/auth/protocol.js +749 -377
- package/script/auth/schemas.d.ts +25 -4
- package/script/auth/schemas.d.ts.map +1 -1
- package/script/auth/schemas.js +16 -5
- package/script/auth/session_auth.d.ts +1 -1
- package/script/auth/session_auth.d.ts.map +1 -1
- package/script/auth/session_auth.js +7 -1
- package/script/client_connect.d.ts +2 -0
- package/script/client_connect.d.ts.map +1 -1
- package/script/client_connect.js +76 -15
- package/script/contract.d.ts +3 -0
- package/script/contract.d.ts.map +1 -1
- package/script/contract_support/mod.d.ts +422 -43
- package/script/contract_support/mod.d.ts.map +1 -1
- package/script/contract_support/mod.js +757 -51
- package/script/contract_support/protocol.d.ts +20 -5
- package/script/contract_support/protocol.d.ts.map +1 -1
- package/script/contract_support/protocol.js +20 -11
- package/script/contract_support/runtime.d.ts +11 -0
- package/script/contract_support/runtime.d.ts.map +1 -1
- package/script/contract_support/schema_pointers.d.ts.map +1 -1
- package/script/contract_support/schema_pointers.js +32 -14
- package/script/device.d.ts +2 -0
- package/script/device.d.ts.map +1 -1
- package/script/device.js +3 -0
- package/script/errors/AuthError.d.ts +1 -1
- package/script/errors/AuthError.d.ts.map +1 -1
- package/script/errors/AuthError.js +5 -1
- package/script/errors/index.d.ts +4 -4
- package/script/generated-sdk/auth/api.d.ts +27 -9
- package/script/generated-sdk/auth/api.d.ts.map +1 -1
- package/script/generated-sdk/auth/api.js +17 -591
- package/script/generated-sdk/auth/client.d.ts +91 -85
- package/script/generated-sdk/auth/client.d.ts.map +1 -1
- package/script/generated-sdk/auth/contract.d.ts +1 -1
- package/script/generated-sdk/auth/contract.d.ts.map +1 -1
- package/script/generated-sdk/auth/contract.js +4 -2
- package/script/generated-sdk/auth/mod.d.ts +1 -0
- package/script/generated-sdk/auth/mod.d.ts.map +1 -1
- package/script/generated-sdk/auth/owned_api.d.ts +3 -0
- package/script/generated-sdk/auth/owned_api.d.ts.map +1 -0
- package/script/generated-sdk/auth/owned_api.js +597 -0
- package/script/generated-sdk/auth/schemas.d.ts +9959 -5160
- package/script/generated-sdk/auth/schemas.d.ts.map +1 -1
- package/script/generated-sdk/auth/schemas.js +139 -140
- package/script/generated-sdk/auth/types.d.ts +2418 -1557
- package/script/generated-sdk/auth/types.d.ts.map +1 -1
- package/script/generated-sdk/auth/types.js +1 -1
- package/script/generated-sdk/health/api.d.ts +24 -9
- package/script/generated-sdk/health/api.d.ts.map +1 -1
- package/script/generated-sdk/health/api.js +13 -21
- package/script/generated-sdk/health/client.d.ts +2 -1
- package/script/generated-sdk/health/client.d.ts.map +1 -1
- package/script/generated-sdk/health/contract.d.ts.map +1 -1
- package/script/generated-sdk/health/contract.js +2 -0
- package/script/generated-sdk/health/owned_api.d.ts +3 -0
- package/script/generated-sdk/health/owned_api.d.ts.map +1 -0
- package/script/generated-sdk/health/owned_api.js +19 -0
- package/script/generated-sdk/health/types.d.ts +2 -0
- package/script/generated-sdk/health/types.d.ts.map +1 -1
- package/script/generated-sdk/jobs/api.d.ts +33 -9
- package/script/generated-sdk/jobs/api.d.ts.map +1 -1
- package/script/generated-sdk/jobs/api.js +23 -88
- package/script/generated-sdk/jobs/client.d.ts +9 -2
- package/script/generated-sdk/jobs/client.d.ts.map +1 -1
- package/script/generated-sdk/jobs/contract.d.ts +1 -1
- package/script/generated-sdk/jobs/contract.d.ts.map +1 -1
- package/script/generated-sdk/jobs/contract.js +4 -2
- package/script/generated-sdk/jobs/owned_api.d.ts +3 -0
- package/script/generated-sdk/jobs/owned_api.d.ts.map +1 -0
- package/script/generated-sdk/jobs/owned_api.js +154 -0
- package/script/generated-sdk/jobs/schemas.d.ts +336 -123
- package/script/generated-sdk/jobs/schemas.d.ts.map +1 -1
- package/script/generated-sdk/jobs/schemas.js +18 -16
- package/script/generated-sdk/jobs/types.d.ts +144 -34
- package/script/generated-sdk/jobs/types.d.ts.map +1 -1
- package/script/generated-sdk/jobs/types.js +38 -2
- package/script/generated-sdk/state/api.d.ts +27 -9
- package/script/generated-sdk/state/api.d.ts.map +1 -1
- package/script/generated-sdk/state/api.js +17 -72
- package/script/generated-sdk/state/client.d.ts +4 -2
- package/script/generated-sdk/state/client.d.ts.map +1 -1
- package/script/generated-sdk/state/contract.d.ts +1 -1
- package/script/generated-sdk/state/contract.d.ts.map +1 -1
- package/script/generated-sdk/state/contract.js +4 -2
- package/script/generated-sdk/state/owned_api.d.ts +3 -0
- package/script/generated-sdk/state/owned_api.d.ts.map +1 -0
- package/script/generated-sdk/state/owned_api.js +69 -0
- package/script/generated-sdk/state/schemas.d.ts +264 -284
- package/script/generated-sdk/state/schemas.d.ts.map +1 -1
- package/script/generated-sdk/state/schemas.js +6 -6
- package/script/generated-sdk/state/types.d.ts +24 -23
- package/script/generated-sdk/state/types.d.ts.map +1 -1
- package/script/generated-sdk/state/types.js +1 -1
- package/script/generated-sdk/trellis-core/api.d.ts +27 -9
- package/script/generated-sdk/trellis-core/api.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/api.js +17 -40
- package/script/generated-sdk/trellis-core/client.d.ts +5 -2
- package/script/generated-sdk/trellis-core/client.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/contract.d.ts +1 -1
- package/script/generated-sdk/trellis-core/contract.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/contract.js +4 -2
- package/script/generated-sdk/trellis-core/owned_api.d.ts +3 -0
- package/script/generated-sdk/trellis-core/owned_api.d.ts.map +1 -0
- package/script/generated-sdk/trellis-core/owned_api.js +45 -0
- package/script/generated-sdk/trellis-core/schemas.d.ts +259 -11
- package/script/generated-sdk/trellis-core/schemas.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/schemas.js +6 -4
- package/script/generated-sdk/trellis-core/types.d.ts +56 -1
- package/script/generated-sdk/trellis-core/types.d.ts.map +1 -1
- package/script/generated-sdk/trellis-core/types.js +1 -1
- package/script/helpers.d.ts.map +1 -1
- package/script/index.d.ts +4 -3
- package/script/index.d.ts.map +1 -1
- package/script/index.js +5 -2
- package/script/jobs.d.ts +10 -1
- package/script/jobs.d.ts.map +1 -1
- package/script/jobs.js +17 -2
- package/script/kv.d.ts.map +1 -1
- package/script/kv.js +10 -4
- package/script/models/auth/rpc/Logout.d.ts +4 -4
- package/script/models/auth/rpc/Logout.d.ts.map +1 -1
- package/script/models/auth/rpc/Logout.js +3 -3
- package/script/models/trellis/Page.d.ts +2 -0
- package/script/models/trellis/Page.d.ts.map +1 -0
- package/script/models/trellis/Page.js +6 -0
- package/script/models/trellis/State.d.ts +1 -0
- package/script/models/trellis/State.d.ts.map +1 -1
- package/script/models/trellis/State.js +1 -0
- package/script/models/trellis/rpc/StateList.d.ts +9 -12
- package/script/models/trellis/rpc/StateList.d.ts.map +1 -1
- package/script/models/trellis/rpc/StateList.js +16 -18
- package/script/npm/src/auth/browser/login.d.ts.map +1 -1
- package/script/npm/src/auth/browser/login.js +46 -3
- package/script/npm/src/auth/browser/portal.d.ts.map +1 -1
- package/script/npm/src/auth/browser/portal.js +5 -1
- package/script/npm/src/auth/browser/session.d.ts +18 -7
- package/script/npm/src/auth/browser/session.d.ts.map +1 -1
- package/script/npm/src/auth/browser/session.js +47 -11
- package/script/npm/src/auth/browser/storage.d.ts +6 -1
- package/script/npm/src/auth/browser/storage.d.ts.map +1 -1
- package/script/npm/src/auth/browser/storage.js +15 -3
- package/script/npm/src/auth/browser.d.ts +2 -2
- package/script/npm/src/auth/browser.d.ts.map +1 -1
- package/script/npm/src/auth/browser.js +2 -1
- package/script/npm/src/auth/device_activation.d.ts +36 -33
- package/script/npm/src/auth/device_activation.d.ts.map +1 -1
- package/script/npm/src/auth/device_activation.js +25 -21
- package/script/npm/src/auth/mod.d.ts +4 -4
- package/script/npm/src/auth/mod.d.ts.map +1 -1
- package/script/npm/src/auth/mod.js +132 -137
- package/script/npm/src/auth/proof.d.ts +3 -1
- package/script/npm/src/auth/proof.d.ts.map +1 -1
- package/script/npm/src/auth/proof.js +21 -15
- package/script/npm/src/auth/protocol.d.ts +2457 -941
- package/script/npm/src/auth/protocol.d.ts.map +1 -1
- package/script/npm/src/auth/protocol.js +749 -377
- package/script/npm/src/auth/schemas.d.ts +25 -4
- package/script/npm/src/auth/schemas.d.ts.map +1 -1
- package/script/npm/src/auth/schemas.js +16 -5
- package/script/npm/src/auth/session_auth.d.ts +1 -1
- package/script/npm/src/auth/session_auth.d.ts.map +1 -1
- package/script/npm/src/auth/session_auth.js +7 -1
- package/script/npm/src/client_connect.d.ts +2 -0
- package/script/npm/src/client_connect.d.ts.map +1 -1
- package/script/npm/src/client_connect.js +76 -15
- package/script/npm/src/contract.d.ts +3 -0
- package/script/npm/src/contract.d.ts.map +1 -1
- package/script/npm/src/contract_support/mod.d.ts +422 -43
- package/script/npm/src/contract_support/mod.d.ts.map +1 -1
- package/script/npm/src/contract_support/mod.js +757 -51
- package/script/npm/src/contract_support/protocol.d.ts +20 -5
- package/script/npm/src/contract_support/protocol.d.ts.map +1 -1
- package/script/npm/src/contract_support/protocol.js +20 -11
- package/script/npm/src/contract_support/runtime.d.ts +11 -0
- package/script/npm/src/contract_support/runtime.d.ts.map +1 -1
- package/script/npm/src/contract_support/schema_pointers.d.ts.map +1 -1
- package/script/npm/src/contract_support/schema_pointers.js +32 -14
- package/script/npm/src/device/deno.d.ts.map +1 -1
- package/script/npm/src/device/deno.js +6 -0
- package/script/npm/src/device.d.ts +2 -0
- package/script/npm/src/device.d.ts.map +1 -1
- package/script/npm/src/device.js +3 -0
- package/script/npm/src/errors/AuthError.d.ts +1 -1
- package/script/npm/src/errors/AuthError.d.ts.map +1 -1
- package/script/npm/src/errors/AuthError.js +5 -1
- package/script/npm/src/errors/index.d.ts +4 -4
- package/script/npm/src/helpers.d.ts.map +1 -1
- package/script/npm/src/index.d.ts +4 -3
- package/script/npm/src/index.d.ts.map +1 -1
- package/script/npm/src/index.js +5 -2
- package/script/npm/src/jobs.d.ts +10 -1
- package/script/npm/src/jobs.d.ts.map +1 -1
- package/script/npm/src/jobs.js +17 -2
- package/script/npm/src/kv.d.ts.map +1 -1
- package/script/npm/src/kv.js +10 -4
- package/script/npm/src/models/auth/rpc/Logout.d.ts +4 -4
- package/script/npm/src/models/auth/rpc/Logout.d.ts.map +1 -1
- package/script/npm/src/models/auth/rpc/Logout.js +3 -3
- package/script/npm/src/models/trellis/Page.d.ts +2 -0
- package/script/npm/src/models/trellis/Page.d.ts.map +1 -0
- package/script/npm/src/models/trellis/Page.js +6 -0
- package/script/npm/src/models/trellis/State.d.ts +1 -0
- package/script/npm/src/models/trellis/State.d.ts.map +1 -1
- package/script/npm/src/models/trellis/State.js +1 -0
- package/script/npm/src/models/trellis/rpc/StateList.d.ts +9 -12
- package/script/npm/src/models/trellis/rpc/StateList.d.ts.map +1 -1
- package/script/npm/src/models/trellis/rpc/StateList.js +16 -18
- package/script/npm/src/operations.d.ts +16 -7
- package/script/npm/src/operations.d.ts.map +1 -1
- package/script/npm/src/operations.js +84 -19
- package/script/npm/src/runtime_transport.d.ts +2 -0
- package/script/npm/src/runtime_transport.d.ts.map +1 -1
- package/script/npm/src/runtime_transport.js +2 -1
- package/script/npm/src/server/internal_jobs/active-job.d.ts +2 -1
- package/script/npm/src/server/internal_jobs/active-job.d.ts.map +1 -1
- package/script/npm/src/server/internal_jobs/active-job.js +3 -0
- package/script/npm/src/server/internal_jobs/job-manager.d.ts +4 -1
- package/script/npm/src/server/internal_jobs/job-manager.d.ts.map +1 -1
- package/script/npm/src/server/internal_jobs/job-manager.js +61 -1
- package/script/npm/src/server/internal_jobs/projection.js +1 -0
- package/script/npm/src/server/internal_jobs/runtime-worker.d.ts +13 -1
- package/script/npm/src/server/internal_jobs/runtime-worker.d.ts.map +1 -1
- package/script/npm/src/server/internal_jobs/runtime-worker.js +74 -13
- package/script/npm/src/server/internal_jobs/types.d.ts +19 -0
- package/script/npm/src/server/internal_jobs/types.d.ts.map +1 -1
- package/script/npm/src/server/internal_jobs/types.js +11 -1
- package/script/npm/src/server/runtime.d.ts +1 -0
- package/script/npm/src/server/runtime.d.ts.map +1 -1
- package/script/npm/src/server/service.d.ts +10 -1
- package/script/npm/src/server/service.d.ts.map +1 -1
- package/script/npm/src/server/service.js +188 -62
- package/script/npm/src/server/transfer.d.ts.map +1 -1
- package/script/npm/src/server/transfer.js +4 -0
- package/script/npm/src/server.d.ts.map +1 -1
- package/script/npm/src/server.js +336 -33
- package/script/npm/src/store.d.ts +8 -1
- package/script/npm/src/store.d.ts.map +1 -1
- package/script/npm/src/store.js +46 -8
- package/script/npm/src/transfer.d.ts +3 -0
- package/script/npm/src/transfer.d.ts.map +1 -1
- package/script/npm/src/transfer.js +19 -29
- package/script/npm/src/trellis.d.ts +85 -22
- package/script/npm/src/trellis.d.ts.map +1 -1
- package/script/npm/src/trellis.js +525 -61
- package/script/operations.d.ts +16 -7
- package/script/operations.d.ts.map +1 -1
- package/script/operations.js +84 -19
- package/script/runtime_transport.d.ts +2 -0
- package/script/runtime_transport.d.ts.map +1 -1
- package/script/runtime_transport.js +2 -1
- package/script/store.d.ts +8 -1
- package/script/store.d.ts.map +1 -1
- package/script/store.js +46 -8
- package/script/transfer.d.ts +3 -0
- package/script/transfer.d.ts.map +1 -1
- package/script/transfer.js +19 -29
- package/script/trellis.d.ts +85 -22
- package/script/trellis.d.ts.map +1 -1
- package/script/trellis.js +525 -61
- package/esm/models/trellis/Paginate.d.ts +0 -7
- package/esm/models/trellis/Paginate.d.ts.map +0 -1
- package/esm/models/trellis/Paginate.js +0 -5
- package/esm/npm/src/models/trellis/Paginate.d.ts +0 -7
- package/esm/npm/src/models/trellis/Paginate.d.ts.map +0 -1
- package/esm/npm/src/models/trellis/Paginate.js +0 -5
- package/script/models/trellis/Paginate.d.ts +0 -7
- package/script/models/trellis/Paginate.d.ts.map +0 -1
- package/script/models/trellis/Paginate.js +0 -11
- package/script/npm/src/models/trellis/Paginate.d.ts +0 -7
- package/script/npm/src/models/trellis/Paginate.d.ts.map +0 -1
- package/script/npm/src/models/trellis/Paginate.js +0 -11
package/esm/trellis.js
CHANGED
|
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _Trellis_instances, _Trellis_log, _Trellis_tasks, _Trellis_hasExplicitApi, _Trellis_noResponderMaxRetries, _Trellis_noResponderRetryMs,
|
|
12
|
+
var _Trellis_instances, _Trellis_log, _Trellis_tasks, _Trellis_hasExplicitApi, _Trellis_noResponderMaxRetries, _Trellis_noResponderRetryMs, _Trellis_onSessionNotFound, _Trellis_operationStore, _Trellis_createStateFacade, _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_handleDurableEvent, _Trellis_parseEventMessage, _Trellis_escapeSubjectToken, _Trellis_currentIat, _Trellis_createProof, _Trellis_requestMessageWithRetry, _Trellis_requestJson, _Trellis_watchJson;
|
|
13
13
|
import { jetstream, jetstreamManager, } from "@nats-io/jetstream";
|
|
14
14
|
import { createInbox, headers as natsHeaders, } from "@nats-io/nats-core";
|
|
15
15
|
import { CONTRACT_JOBS_METADATA, CONTRACT_KV_METADATA, CONTRACT_STATE_METADATA, } from "./contract_support/mod.js";
|
|
@@ -140,16 +140,22 @@ export async function sha256(data) {
|
|
|
140
140
|
const digest = await crypto.subtle.digest("SHA-256", toArrayBuffer(data));
|
|
141
141
|
return new Uint8Array(digest);
|
|
142
142
|
}
|
|
143
|
-
export function buildProofInput(sessionKey, subject, payloadHash) {
|
|
143
|
+
export function buildProofInput(sessionKey, subject, payloadHash, iat, requestId) {
|
|
144
144
|
const enc = new TextEncoder();
|
|
145
145
|
const sessionKeyBytes = enc.encode(sessionKey);
|
|
146
146
|
const subjectBytes = enc.encode(subject);
|
|
147
|
+
const iatBytes = enc.encode(String(iat));
|
|
148
|
+
const requestIdBytes = enc.encode(requestId);
|
|
147
149
|
const buf = new Uint8Array(4 +
|
|
148
150
|
sessionKeyBytes.length +
|
|
149
151
|
4 +
|
|
150
152
|
subjectBytes.length +
|
|
151
153
|
4 +
|
|
152
|
-
payloadHash.length
|
|
154
|
+
payloadHash.length +
|
|
155
|
+
4 +
|
|
156
|
+
iatBytes.length +
|
|
157
|
+
4 +
|
|
158
|
+
requestIdBytes.length);
|
|
153
159
|
const view = new DataView(buf.buffer);
|
|
154
160
|
let offset = 0;
|
|
155
161
|
view.setUint32(offset, sessionKeyBytes.length);
|
|
@@ -163,6 +169,14 @@ export function buildProofInput(sessionKey, subject, payloadHash) {
|
|
|
163
169
|
view.setUint32(offset, payloadHash.length);
|
|
164
170
|
offset += 4;
|
|
165
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);
|
|
166
180
|
return buf;
|
|
167
181
|
}
|
|
168
182
|
/**
|
|
@@ -176,6 +190,13 @@ export function isOperationDeferred(value) {
|
|
|
176
190
|
export function isResultLike(value) {
|
|
177
191
|
return value instanceof Result;
|
|
178
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
|
+
});
|
|
179
200
|
const DurableOperationSnapshotSchema = Type.Object({
|
|
180
201
|
id: Type.String(),
|
|
181
202
|
service: Type.String(),
|
|
@@ -206,6 +227,8 @@ const DurableOperationSnapshotSchema = Type.Object({
|
|
|
206
227
|
export const DurableOperationRecordSchema = Type.Object({
|
|
207
228
|
ownerSessionKey: Type.String(),
|
|
208
229
|
sequence: Type.Number(),
|
|
230
|
+
signalSequence: Type.Optional(Type.Number()),
|
|
231
|
+
signals: Type.Optional(Type.Array(DurableOperationSignalSchema)),
|
|
209
232
|
snapshot: DurableOperationSnapshotSchema,
|
|
210
233
|
});
|
|
211
234
|
export function buildRuntimeOperationSnapshot(runtime, state, patch) {
|
|
@@ -462,12 +485,44 @@ const DEFAULT_NO_RESPONDER_MAX_RETRIES = 2;
|
|
|
462
485
|
const DEFAULT_NO_RESPONDER_RETRY_MS = 200;
|
|
463
486
|
const DEFAULT_AUTH_VALIDATE_SESSION_RETRY_ATTEMPTS = 3;
|
|
464
487
|
const DEFAULT_AUTH_VALIDATE_SESSION_RETRY_MS = 25;
|
|
488
|
+
function activeTraceId(span) {
|
|
489
|
+
const traceId = span.spanContext().traceId;
|
|
490
|
+
return traceId === "00000000000000000000000000000000" ? undefined : traceId;
|
|
491
|
+
}
|
|
492
|
+
function traceIdFromTraceparent(traceparent) {
|
|
493
|
+
const [version, traceId, parentId, flags, extra] = traceparent?.split("-") ??
|
|
494
|
+
[];
|
|
495
|
+
if (extra !== undefined ||
|
|
496
|
+
!/^[0-9a-f]{2}$/u.test(version ?? "") ||
|
|
497
|
+
version === "ff" ||
|
|
498
|
+
!/^[0-9a-f]{32}$/u.test(traceId ?? "") ||
|
|
499
|
+
traceId === "00000000000000000000000000000000" ||
|
|
500
|
+
!/^[0-9a-f]{16}$/u.test(parentId ?? "") ||
|
|
501
|
+
parentId === "0000000000000000" ||
|
|
502
|
+
!/^[0-9a-f]{2}$/u.test(flags ?? "")) {
|
|
503
|
+
return undefined;
|
|
504
|
+
}
|
|
505
|
+
return traceId;
|
|
506
|
+
}
|
|
465
507
|
const EMPTY_TRELLIS_API = {
|
|
466
508
|
rpc: {},
|
|
467
509
|
operations: {},
|
|
468
510
|
events: {},
|
|
511
|
+
feeds: {},
|
|
469
512
|
subjects: {},
|
|
470
513
|
};
|
|
514
|
+
function isBrowserAuthRequiredError(error) {
|
|
515
|
+
const isAuthRequiredReason = (reason) => reason === "session_not_found" || reason === "reauth_required";
|
|
516
|
+
if (error instanceof AuthError) {
|
|
517
|
+
return isAuthRequiredReason(error.reason);
|
|
518
|
+
}
|
|
519
|
+
if (error instanceof RemoteError &&
|
|
520
|
+
error.remoteError.type === "AuthError") {
|
|
521
|
+
const reason = Reflect.get(error.remoteError, "reason");
|
|
522
|
+
return isAuthRequiredReason(reason);
|
|
523
|
+
}
|
|
524
|
+
return false;
|
|
525
|
+
}
|
|
471
526
|
function isTransientAuthValidateSessionError(error) {
|
|
472
527
|
if (error instanceof AuthError) {
|
|
473
528
|
return error.reason === "session_not_found";
|
|
@@ -475,7 +530,7 @@ function isTransientAuthValidateSessionError(error) {
|
|
|
475
530
|
if (error instanceof RemoteError &&
|
|
476
531
|
error.remoteError.type === "AuthError") {
|
|
477
532
|
const reason = Reflect.get(error.remoteError, "reason");
|
|
478
|
-
return
|
|
533
|
+
return reason === "session_not_found";
|
|
479
534
|
}
|
|
480
535
|
return false;
|
|
481
536
|
}
|
|
@@ -487,6 +542,20 @@ function isRuntimeRpcErrorDesc(value) {
|
|
|
487
542
|
typeof Reflect.get(value, "type") === "string" &&
|
|
488
543
|
typeof Reflect.get(value, "fromSerializable") === "function";
|
|
489
544
|
}
|
|
545
|
+
const payloadSizeEncoder = new TextEncoder();
|
|
546
|
+
function payloadByteLength(payload) {
|
|
547
|
+
return typeof payload === "string"
|
|
548
|
+
? payloadSizeEncoder.encode(payload).byteLength
|
|
549
|
+
: payload.byteLength;
|
|
550
|
+
}
|
|
551
|
+
function causeMessage(cause) {
|
|
552
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
553
|
+
}
|
|
554
|
+
function causeLogData(cause) {
|
|
555
|
+
return cause instanceof Error
|
|
556
|
+
? { message: cause.message, stack: cause.stack, name: cause.name }
|
|
557
|
+
: cause;
|
|
558
|
+
}
|
|
490
559
|
function reconstructDeclaredRpcError(errorNames, runtimeErrors, data, json) {
|
|
491
560
|
if (!isDeclaredRpcError(errorNames, data.type)) {
|
|
492
561
|
return null;
|
|
@@ -585,7 +654,6 @@ export class Trellis {
|
|
|
585
654
|
_Trellis_hasExplicitApi.set(this, void 0);
|
|
586
655
|
_Trellis_noResponderMaxRetries.set(this, void 0);
|
|
587
656
|
_Trellis_noResponderRetryMs.set(this, void 0);
|
|
588
|
-
_Trellis_authBypassMethods.set(this, void 0);
|
|
589
657
|
_Trellis_onSessionNotFound.set(this, void 0);
|
|
590
658
|
_Trellis_operationStore.set(this, void 0);
|
|
591
659
|
const api = opts?.api;
|
|
@@ -602,7 +670,6 @@ export class Trellis {
|
|
|
602
670
|
DEFAULT_NO_RESPONDER_MAX_RETRIES, "f");
|
|
603
671
|
__classPrivateFieldSet(this, _Trellis_noResponderRetryMs, opts?.noResponderRetry?.baseDelayMs ??
|
|
604
672
|
DEFAULT_NO_RESPONDER_RETRY_MS, "f");
|
|
605
|
-
__classPrivateFieldSet(this, _Trellis_authBypassMethods, new Set(opts?.authBypassMethods ?? []), "f");
|
|
606
673
|
__classPrivateFieldSet(this, _Trellis_onSessionNotFound, opts?.onSessionNotFound, "f");
|
|
607
674
|
this.connection = opts?.connection ??
|
|
608
675
|
new TrellisConnection({ kind: "client" });
|
|
@@ -646,6 +713,8 @@ export class Trellis {
|
|
|
646
713
|
const record = {
|
|
647
714
|
ownerSessionKey: runtime.ownerSessionKey,
|
|
648
715
|
sequence: runtime.sequence,
|
|
716
|
+
signalSequence: runtime.signalSequence,
|
|
717
|
+
signals: runtime.signals,
|
|
649
718
|
snapshot: runtime.snapshot,
|
|
650
719
|
};
|
|
651
720
|
await store.put(runtime.id, record);
|
|
@@ -661,6 +730,18 @@ export class Trellis {
|
|
|
661
730
|
}
|
|
662
731
|
return __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestBuiltRpcUnknown).call(this, method, input, ctx, opts);
|
|
663
732
|
}
|
|
733
|
+
feed(feed) {
|
|
734
|
+
const descriptor = this.api.feeds?.[feed];
|
|
735
|
+
if (!descriptor) {
|
|
736
|
+
throw __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_unknownApiError).call(this, "feed", feed.toString());
|
|
737
|
+
}
|
|
738
|
+
return {
|
|
739
|
+
input: (input) => ({
|
|
740
|
+
subscribe: (opts) => __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_subscribeFeed).call(this, feed.toString(), descriptor, input, opts),
|
|
741
|
+
}),
|
|
742
|
+
handle: (handler) => __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_handleFeed).call(this, feed.toString(), descriptor, handler),
|
|
743
|
+
};
|
|
744
|
+
}
|
|
664
745
|
operation(operation) {
|
|
665
746
|
const descriptor = this.api["operations"]?.[operation];
|
|
666
747
|
if (!descriptor) {
|
|
@@ -716,20 +797,24 @@ export class Trellis {
|
|
|
716
797
|
logger.error({ err: subject.error }, "Failed to template event.");
|
|
717
798
|
return subject;
|
|
718
799
|
}
|
|
800
|
+
const header = {
|
|
801
|
+
id: ulid(),
|
|
802
|
+
time: new Date().toISOString(),
|
|
803
|
+
};
|
|
719
804
|
const payload = {
|
|
720
805
|
...data,
|
|
721
|
-
header
|
|
722
|
-
id: ulid(),
|
|
723
|
-
time: new Date().toISOString(),
|
|
724
|
-
},
|
|
806
|
+
header,
|
|
725
807
|
};
|
|
726
808
|
const msg = encodeSchema(ctx.event, payload).take();
|
|
727
809
|
if (isErr(msg)) {
|
|
728
810
|
logger.error({ err: msg.error }, "Failed to encode event.");
|
|
729
811
|
return err(new UnexpectedError({ cause: msg.error }));
|
|
730
812
|
}
|
|
813
|
+
const headers = natsHeaders();
|
|
814
|
+
headers.set("Nats-Msg-Id", header.id);
|
|
815
|
+
injectTraceContext(createNatsHeaderCarrier(headers));
|
|
731
816
|
logger.trace({ subject }, `Publishing ${event.toString()} event.`);
|
|
732
|
-
await this.js.publish(subject, msg);
|
|
817
|
+
await this.js.publish(subject, msg, { headers });
|
|
733
818
|
return ok(undefined);
|
|
734
819
|
}
|
|
735
820
|
catch (cause) {
|
|
@@ -825,10 +910,10 @@ export class Trellis {
|
|
|
825
910
|
}
|
|
826
911
|
requestAuthValidate(input) {
|
|
827
912
|
const request = this.request.bind(this);
|
|
828
|
-
return request("Auth.
|
|
913
|
+
return request("Auth.Requests.Validate", input);
|
|
829
914
|
}
|
|
830
915
|
}
|
|
831
|
-
_Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplicitApi = new WeakMap(), _Trellis_noResponderMaxRetries = new WeakMap(), _Trellis_noResponderRetryMs = new WeakMap(),
|
|
916
|
+
_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_instances = new WeakSet(), _Trellis_createStateFacade = function _Trellis_createStateFacade(state) {
|
|
832
917
|
const stores = (state ?? {});
|
|
833
918
|
const facade = Object.fromEntries(Object.entries(stores).map(([store, descriptor]) => {
|
|
834
919
|
if (descriptor.kind === "value") {
|
|
@@ -920,10 +1005,12 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
920
1005
|
}
|
|
921
1006
|
const span = startClientSpan(method, subject);
|
|
922
1007
|
const attempt = async () => {
|
|
923
|
-
const
|
|
1008
|
+
const authHeaders = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createProof).call(this, subject, msg);
|
|
924
1009
|
const headers = natsHeaders();
|
|
925
1010
|
headers.set("session-key", this.auth.sessionKey);
|
|
926
|
-
headers.set("proof", proof);
|
|
1011
|
+
headers.set("proof", authHeaders.proof);
|
|
1012
|
+
headers.set("iat", String(authHeaders.iat));
|
|
1013
|
+
headers.set("request-id", authHeaders.requestId);
|
|
927
1014
|
injectTraceContext(createNatsHeaderCarrier(headers), span);
|
|
928
1015
|
const msgResult = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestMessageWithRetry).call(this, {
|
|
929
1016
|
method,
|
|
@@ -968,11 +1055,11 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
968
1055
|
: undefined;
|
|
969
1056
|
const reconstructed = reconstructDeclaredRpcError(declaredErrorTypes, runtimeErrors, errorData, json);
|
|
970
1057
|
if (reconstructed) {
|
|
971
|
-
await __classPrivateFieldGet(this, _Trellis_instances, "m",
|
|
1058
|
+
await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_handleBrowserAuthRequired).call(this, reconstructed);
|
|
972
1059
|
return err(reconstructed);
|
|
973
1060
|
}
|
|
974
1061
|
const remoteError = new RemoteError({ error: errorData });
|
|
975
|
-
await __classPrivateFieldGet(this, _Trellis_instances, "m",
|
|
1062
|
+
await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_handleBrowserAuthRequired).call(this, remoteError);
|
|
976
1063
|
return err(remoteError);
|
|
977
1064
|
}
|
|
978
1065
|
const json = safeJson(response).take();
|
|
@@ -1023,11 +1110,284 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
1023
1110
|
}
|
|
1024
1111
|
});
|
|
1025
1112
|
})());
|
|
1026
|
-
},
|
|
1027
|
-
if (!__classPrivateFieldGet(this, _Trellis_onSessionNotFound, "f") || !
|
|
1113
|
+
}, _Trellis_handleBrowserAuthRequired = async function _Trellis_handleBrowserAuthRequired(error) {
|
|
1114
|
+
if (!__classPrivateFieldGet(this, _Trellis_onSessionNotFound, "f") || !isBrowserAuthRequiredError(error)) {
|
|
1028
1115
|
return;
|
|
1029
1116
|
}
|
|
1030
1117
|
await __classPrivateFieldGet(this, _Trellis_onSessionNotFound, "f").call(this);
|
|
1118
|
+
}, _Trellis_authenticateFeedRequest = async function _Trellis_authenticateFeedRequest(args) {
|
|
1119
|
+
const sessionKey = args.msg.headers?.get("session-key");
|
|
1120
|
+
const proof = args.msg.headers?.get("proof");
|
|
1121
|
+
const iatHeader = args.msg.headers?.get("iat");
|
|
1122
|
+
const requestId = args.msg.headers?.get("request-id");
|
|
1123
|
+
if (!sessionKey) {
|
|
1124
|
+
return err(new AuthError({ reason: "missing_session_key" }));
|
|
1125
|
+
}
|
|
1126
|
+
if (!proof)
|
|
1127
|
+
return err(new AuthError({ reason: "missing_proof" }));
|
|
1128
|
+
const iat = Number(iatHeader);
|
|
1129
|
+
if (!Number.isSafeInteger(iat) || !requestId) {
|
|
1130
|
+
return err(new AuthError({ reason: "invalid_signature" }));
|
|
1131
|
+
}
|
|
1132
|
+
const proofInput = buildProofInput(sessionKey, args.subject, args.payloadHash, iat, requestId);
|
|
1133
|
+
const digest = await sha256(proofInput);
|
|
1134
|
+
const verifyResult = await AsyncResult.try(async () => {
|
|
1135
|
+
const publicKeyRaw = base64urlDecode(sessionKey);
|
|
1136
|
+
const pub = await crypto.subtle.importKey("raw", toArrayBuffer(publicKeyRaw), { name: "Ed25519" }, true, ["verify"]);
|
|
1137
|
+
return crypto.subtle.verify({ name: "Ed25519" }, pub, toArrayBuffer(base64urlDecode(proof)), toArrayBuffer(digest));
|
|
1138
|
+
});
|
|
1139
|
+
if (!verifyResult.isOk() || verifyResult.take() !== true) {
|
|
1140
|
+
return err(new AuthError({ reason: "invalid_signature", context: { sessionKey } }));
|
|
1141
|
+
}
|
|
1142
|
+
const auth = await this.requestAuthValidate({
|
|
1143
|
+
sessionKey,
|
|
1144
|
+
proof,
|
|
1145
|
+
subject: args.subject,
|
|
1146
|
+
payloadHash: base64urlEncode(args.payloadHash),
|
|
1147
|
+
iat,
|
|
1148
|
+
requestId,
|
|
1149
|
+
capabilities: [...args.requiredCapabilities],
|
|
1150
|
+
}).take();
|
|
1151
|
+
if (isErr(auth))
|
|
1152
|
+
return err(auth.error);
|
|
1153
|
+
if (!auth.allowed) {
|
|
1154
|
+
return err(new AuthError({
|
|
1155
|
+
reason: "insufficient_permissions",
|
|
1156
|
+
context: {
|
|
1157
|
+
feed: args.feed,
|
|
1158
|
+
requiredCapabilities: args.requiredCapabilities,
|
|
1159
|
+
userCapabilities: auth.caller.capabilities,
|
|
1160
|
+
},
|
|
1161
|
+
}));
|
|
1162
|
+
}
|
|
1163
|
+
if (typeof args.msg.reply !== "string" ||
|
|
1164
|
+
!args.msg.reply.startsWith(`${auth.inboxPrefix}.`)) {
|
|
1165
|
+
return err(new AuthError({
|
|
1166
|
+
reason: "reply_subject_mismatch",
|
|
1167
|
+
context: { expected: auth.inboxPrefix, actual: args.msg.reply },
|
|
1168
|
+
}));
|
|
1169
|
+
}
|
|
1170
|
+
return ok(auth.caller);
|
|
1171
|
+
}, _Trellis_subscribeFeed = function _Trellis_subscribeFeed(feed, descriptor, input, opts) {
|
|
1172
|
+
return AsyncResult.from((async () => {
|
|
1173
|
+
const payload = encodeRuntimeSchema(descriptor.input, input).take();
|
|
1174
|
+
if (isErr(payload))
|
|
1175
|
+
return payload;
|
|
1176
|
+
const subject = this.template(descriptor.subject, input).take();
|
|
1177
|
+
if (isErr(subject))
|
|
1178
|
+
return subject;
|
|
1179
|
+
const authHeaders = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createProof).call(this, subject, payload);
|
|
1180
|
+
const headers = natsHeaders();
|
|
1181
|
+
headers.set("session-key", this.auth.sessionKey);
|
|
1182
|
+
headers.set("proof", authHeaders.proof);
|
|
1183
|
+
headers.set("iat", String(authHeaders.iat));
|
|
1184
|
+
headers.set("request-id", authHeaders.requestId);
|
|
1185
|
+
injectTraceContext(createNatsHeaderCarrier(headers));
|
|
1186
|
+
const inbox = createInbox(`_INBOX.${this.auth.sessionKey.slice(0, 16)}`);
|
|
1187
|
+
const sub = this.nats.subscribe(inbox);
|
|
1188
|
+
const iterator = sub[Symbol.asyncIterator]();
|
|
1189
|
+
const abort = () => sub.unsubscribe();
|
|
1190
|
+
opts?.signal?.addEventListener("abort", abort, { once: true });
|
|
1191
|
+
try {
|
|
1192
|
+
this.nats.publish(subject, payload, { headers, reply: inbox });
|
|
1193
|
+
await this.nats.flush();
|
|
1194
|
+
}
|
|
1195
|
+
catch (cause) {
|
|
1196
|
+
opts?.signal?.removeEventListener("abort", abort);
|
|
1197
|
+
sub.unsubscribe();
|
|
1198
|
+
return err(createTransportError({
|
|
1199
|
+
code: "trellis.feed.subscribe_failed",
|
|
1200
|
+
message: "Trellis could not subscribe to the feed.",
|
|
1201
|
+
hint: "Retry the subscription. If it keeps failing, check Trellis runtime health.",
|
|
1202
|
+
cause,
|
|
1203
|
+
context: { feed, subject },
|
|
1204
|
+
}));
|
|
1205
|
+
}
|
|
1206
|
+
let timeoutId;
|
|
1207
|
+
let abortHandler;
|
|
1208
|
+
const handshakePromises = [
|
|
1209
|
+
iterator.next(),
|
|
1210
|
+
new Promise((resolve) => {
|
|
1211
|
+
timeoutId = setTimeout(() => resolve("timeout"), this.timeout);
|
|
1212
|
+
}),
|
|
1213
|
+
];
|
|
1214
|
+
const signal = opts?.signal;
|
|
1215
|
+
if (signal) {
|
|
1216
|
+
handshakePromises.push(new Promise((resolve) => {
|
|
1217
|
+
abortHandler = () => resolve("aborted");
|
|
1218
|
+
signal.addEventListener("abort", abortHandler, { once: true });
|
|
1219
|
+
}));
|
|
1220
|
+
}
|
|
1221
|
+
const firstFrame = await Promise.race(handshakePromises);
|
|
1222
|
+
if (timeoutId !== undefined)
|
|
1223
|
+
clearTimeout(timeoutId);
|
|
1224
|
+
if (signal && abortHandler) {
|
|
1225
|
+
signal.removeEventListener("abort", abortHandler);
|
|
1226
|
+
}
|
|
1227
|
+
if (firstFrame === "timeout" || firstFrame === "aborted") {
|
|
1228
|
+
opts?.signal?.removeEventListener("abort", abort);
|
|
1229
|
+
sub.unsubscribe();
|
|
1230
|
+
return err(createTransportError({
|
|
1231
|
+
code: firstFrame === "timeout"
|
|
1232
|
+
? "trellis.feed.subscribe_timeout"
|
|
1233
|
+
: "trellis.feed.subscribe_aborted",
|
|
1234
|
+
message: firstFrame === "timeout"
|
|
1235
|
+
? "Trellis did not receive a feed acknowledgement."
|
|
1236
|
+
: "The feed subscription was aborted before Trellis acknowledged it.",
|
|
1237
|
+
hint: firstFrame === "timeout"
|
|
1238
|
+
? "Check that the target service is running and has the current deployment digest, then retry."
|
|
1239
|
+
: "Retry the subscription if the feed is still needed.",
|
|
1240
|
+
context: { feed, subject },
|
|
1241
|
+
}));
|
|
1242
|
+
}
|
|
1243
|
+
if (firstFrame.done) {
|
|
1244
|
+
opts?.signal?.removeEventListener("abort", abort);
|
|
1245
|
+
sub.unsubscribe();
|
|
1246
|
+
return err(createTransportError({
|
|
1247
|
+
code: "trellis.feed.subscribe_closed",
|
|
1248
|
+
message: "Trellis closed the feed before acknowledging it.",
|
|
1249
|
+
hint: "Retry the subscription. If it keeps failing, check Trellis runtime health.",
|
|
1250
|
+
context: { feed, subject },
|
|
1251
|
+
}));
|
|
1252
|
+
}
|
|
1253
|
+
const firstMessage = firstFrame.value;
|
|
1254
|
+
if (firstMessage.headers?.get("status") === "error") {
|
|
1255
|
+
opts?.signal?.removeEventListener("abort", abort);
|
|
1256
|
+
sub.unsubscribe();
|
|
1257
|
+
return err(createTransportError({
|
|
1258
|
+
code: "trellis.feed.failed",
|
|
1259
|
+
message: "Trellis rejected the feed subscription.",
|
|
1260
|
+
hint: "Retry the subscription. If it keeps failing, check Trellis runtime health and permissions.",
|
|
1261
|
+
context: { feed, subject, frame: firstMessage.string() },
|
|
1262
|
+
}));
|
|
1263
|
+
}
|
|
1264
|
+
const firstEvent = firstMessage.headers?.get("feed-status") === "ready"
|
|
1265
|
+
? undefined
|
|
1266
|
+
: firstMessage;
|
|
1267
|
+
const eventSchema = descriptor.event;
|
|
1268
|
+
return ok((async function* () {
|
|
1269
|
+
try {
|
|
1270
|
+
const parseFeedFrame = (msg) => {
|
|
1271
|
+
if (msg.headers?.get("status") === "error") {
|
|
1272
|
+
throw createTransportError({
|
|
1273
|
+
code: "trellis.feed.failed",
|
|
1274
|
+
message: "Trellis stopped the feed.",
|
|
1275
|
+
hint: "Retry the subscription. If it keeps failing, check Trellis runtime health.",
|
|
1276
|
+
context: { feed, subject, frame: msg.string() },
|
|
1277
|
+
});
|
|
1278
|
+
}
|
|
1279
|
+
const json = safeJson(msg).take();
|
|
1280
|
+
if (isErr(json))
|
|
1281
|
+
throw json.error;
|
|
1282
|
+
const parsed = parseRuntimeSchema(eventSchema, json).take();
|
|
1283
|
+
if (isErr(parsed))
|
|
1284
|
+
throw parsed.error;
|
|
1285
|
+
return parsed;
|
|
1286
|
+
};
|
|
1287
|
+
if (firstEvent)
|
|
1288
|
+
yield parseFeedFrame(firstEvent);
|
|
1289
|
+
while (true) {
|
|
1290
|
+
const next = await iterator.next();
|
|
1291
|
+
if (next.done)
|
|
1292
|
+
break;
|
|
1293
|
+
yield parseFeedFrame(next.value);
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
finally {
|
|
1297
|
+
opts?.signal?.removeEventListener("abort", abort);
|
|
1298
|
+
sub.unsubscribe();
|
|
1299
|
+
}
|
|
1300
|
+
})());
|
|
1301
|
+
})());
|
|
1302
|
+
}, _Trellis_handleFeed = async function _Trellis_handleFeed(feed, descriptor, handler) {
|
|
1303
|
+
const subject = this.template(descriptor.subject, {}, true).take();
|
|
1304
|
+
if (isErr(subject))
|
|
1305
|
+
throw subject.error;
|
|
1306
|
+
let sub;
|
|
1307
|
+
try {
|
|
1308
|
+
sub = this.nats.subscribe(subject);
|
|
1309
|
+
await this.nats.flush();
|
|
1310
|
+
}
|
|
1311
|
+
catch (cause) {
|
|
1312
|
+
throw createTransportError({
|
|
1313
|
+
code: "trellis.feed.listen_failed",
|
|
1314
|
+
message: "Trellis could not listen for feed requests.",
|
|
1315
|
+
hint: "Check the service deployment digest and runtime permissions, then restart the service.",
|
|
1316
|
+
cause,
|
|
1317
|
+
context: { feed, subject },
|
|
1318
|
+
});
|
|
1319
|
+
}
|
|
1320
|
+
const task = AsyncResult.try(async () => {
|
|
1321
|
+
for await (const msg of sub) {
|
|
1322
|
+
void (async () => {
|
|
1323
|
+
try {
|
|
1324
|
+
const result = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_processFeedMessage).call(this, feed, descriptor, msg, handler);
|
|
1325
|
+
const value = result.take();
|
|
1326
|
+
if (isErr(value)) {
|
|
1327
|
+
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithError).call(this, msg, value.error);
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
catch (cause) {
|
|
1331
|
+
const error = cause instanceof BaseError
|
|
1332
|
+
? cause
|
|
1333
|
+
: new UnexpectedError({ cause });
|
|
1334
|
+
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithError).call(this, msg, error);
|
|
1335
|
+
}
|
|
1336
|
+
})();
|
|
1337
|
+
}
|
|
1338
|
+
});
|
|
1339
|
+
__classPrivateFieldGet(this, _Trellis_tasks, "f").add(`feed:${feed}`, task);
|
|
1340
|
+
}, _Trellis_processFeedMessage = async function _Trellis_processFeedMessage(feed, descriptor, msg, handler) {
|
|
1341
|
+
const json = safeJson(msg).take();
|
|
1342
|
+
if (isErr(json))
|
|
1343
|
+
return json;
|
|
1344
|
+
const parsed = parseRuntimeSchema(descriptor.input, json).take();
|
|
1345
|
+
if (isErr(parsed))
|
|
1346
|
+
return parsed;
|
|
1347
|
+
const caller = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_authenticateFeedRequest).call(this, {
|
|
1348
|
+
feed,
|
|
1349
|
+
subject: msg.subject,
|
|
1350
|
+
msg,
|
|
1351
|
+
payloadHash: await sha256(msg.data ?? new Uint8Array()),
|
|
1352
|
+
requiredCapabilities: descriptor.subscribeCapabilities,
|
|
1353
|
+
});
|
|
1354
|
+
const callerValue = caller.take();
|
|
1355
|
+
if (isErr(callerValue))
|
|
1356
|
+
return callerValue;
|
|
1357
|
+
if (!msg.reply) {
|
|
1358
|
+
return err(new UnexpectedError({
|
|
1359
|
+
context: { feed, reason: "missing_reply" },
|
|
1360
|
+
}));
|
|
1361
|
+
}
|
|
1362
|
+
const readyHeaders = natsHeaders();
|
|
1363
|
+
readyHeaders.set("feed-status", "ready");
|
|
1364
|
+
this.nats.publish(msg.reply, new Uint8Array(), { headers: readyHeaders });
|
|
1365
|
+
await this.nats.flush();
|
|
1366
|
+
const controller = new AbortController();
|
|
1367
|
+
try {
|
|
1368
|
+
await handler({
|
|
1369
|
+
input: parsed,
|
|
1370
|
+
caller: callerValue,
|
|
1371
|
+
signal: controller.signal,
|
|
1372
|
+
emit: (event) => AsyncResult.from((async () => {
|
|
1373
|
+
const payload = encodeRuntimeSchema(descriptor.event, event).take();
|
|
1374
|
+
if (isErr(payload))
|
|
1375
|
+
return payload;
|
|
1376
|
+
if (!msg.reply) {
|
|
1377
|
+
return err(new UnexpectedError({
|
|
1378
|
+
context: { feed, reason: "missing_reply" },
|
|
1379
|
+
}));
|
|
1380
|
+
}
|
|
1381
|
+
this.nats.publish(msg.reply, payload);
|
|
1382
|
+
await this.nats.flush();
|
|
1383
|
+
return ok(undefined);
|
|
1384
|
+
})()),
|
|
1385
|
+
});
|
|
1386
|
+
return ok(undefined);
|
|
1387
|
+
}
|
|
1388
|
+
finally {
|
|
1389
|
+
controller.abort();
|
|
1390
|
+
}
|
|
1031
1391
|
}, _Trellis_handleRPC = function _Trellis_handleRPC(method, fn, subjectData = {}) {
|
|
1032
1392
|
// Get API details
|
|
1033
1393
|
const ctx = this.api["rpc"][method];
|
|
@@ -1043,10 +1403,31 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
1043
1403
|
const resultPromise = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_processRPCMessage).call(this, method, ctx, msg, fn, handlerTrellis);
|
|
1044
1404
|
const result = resultPromise.take();
|
|
1045
1405
|
if (isErr(result)) {
|
|
1046
|
-
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithError).call(this, msg, result.error);
|
|
1406
|
+
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithError).call(this, msg, result.error, { method: String(method) });
|
|
1047
1407
|
continue;
|
|
1048
1408
|
}
|
|
1049
|
-
|
|
1409
|
+
const sent = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithPayload).call(this, msg, result, undefined, {
|
|
1410
|
+
method: String(method),
|
|
1411
|
+
responseKind: "success",
|
|
1412
|
+
});
|
|
1413
|
+
if (sent.isErr()) {
|
|
1414
|
+
const responseBytes = payloadByteLength(result);
|
|
1415
|
+
const message = causeMessage(sent.error.cause);
|
|
1416
|
+
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithError).call(this, msg, new TransportError({
|
|
1417
|
+
code: "trellis.rpc.response_send_failed",
|
|
1418
|
+
message: message.includes("max_payload")
|
|
1419
|
+
? "Trellis RPC response exceeded NATS max_payload."
|
|
1420
|
+
: "Trellis could not send the RPC response.",
|
|
1421
|
+
hint: "Reduce the requested page size or use a narrower RPC that does not include large detail payloads.",
|
|
1422
|
+
cause: sent.error.cause,
|
|
1423
|
+
context: {
|
|
1424
|
+
method: String(method),
|
|
1425
|
+
subject: msg.subject,
|
|
1426
|
+
responseBytes,
|
|
1427
|
+
causeMessage: message,
|
|
1428
|
+
},
|
|
1429
|
+
}), { method: String(method), responseBytes });
|
|
1430
|
+
}
|
|
1050
1431
|
}
|
|
1051
1432
|
});
|
|
1052
1433
|
}, _Trellis_processRPCMessage = async function _Trellis_processRPCMessage(method, ctx, msg, fn, handlerTrellis) {
|
|
@@ -1058,6 +1439,7 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
1058
1439
|
}));
|
|
1059
1440
|
// Start a server span for this RPC handler
|
|
1060
1441
|
const span = startServerSpan(method, msg.subject, parentContext);
|
|
1442
|
+
const incomingTraceId = traceIdFromTraceparent(msg.headers?.get("traceparent"));
|
|
1061
1443
|
// Execute the handler within the span's context
|
|
1062
1444
|
return withSpanAsync(span, async () => {
|
|
1063
1445
|
const execute = async () => {
|
|
@@ -1081,7 +1463,7 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
1081
1463
|
let caller;
|
|
1082
1464
|
const callerSessionKey = msg.headers?.get("session-key") ?? "";
|
|
1083
1465
|
const authRequired = ctx.authRequired ?? true;
|
|
1084
|
-
if (!authRequired
|
|
1466
|
+
if (!authRequired) {
|
|
1085
1467
|
caller = {
|
|
1086
1468
|
type: "service",
|
|
1087
1469
|
id: "system",
|
|
@@ -1093,6 +1475,8 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
1093
1475
|
else {
|
|
1094
1476
|
const sessionKey = msg.headers?.get("session-key");
|
|
1095
1477
|
const proof = msg.headers?.get("proof");
|
|
1478
|
+
const iatHeader = msg.headers?.get("iat");
|
|
1479
|
+
const requestId = msg.headers?.get("request-id");
|
|
1096
1480
|
if (!sessionKey) {
|
|
1097
1481
|
__classPrivateFieldGet(this, _Trellis_log, "f").warn({ method }, "Missing session-key header");
|
|
1098
1482
|
span.setStatus({
|
|
@@ -1109,10 +1493,14 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
1109
1493
|
});
|
|
1110
1494
|
return err(new AuthError({ reason: "missing_proof" }));
|
|
1111
1495
|
}
|
|
1496
|
+
const iat = Number(iatHeader);
|
|
1497
|
+
if (!Number.isSafeInteger(iat) || !requestId) {
|
|
1498
|
+
return err(new AuthError({ reason: "invalid_signature" }));
|
|
1499
|
+
}
|
|
1112
1500
|
// Verify proof signature locally using the raw request bytes we received.
|
|
1113
1501
|
const payloadBytes = msg.data ?? new Uint8Array();
|
|
1114
1502
|
const payloadHash = await sha256(payloadBytes);
|
|
1115
|
-
const proofInput = buildProofInput(sessionKey, msg.subject, payloadHash);
|
|
1503
|
+
const proofInput = buildProofInput(sessionKey, msg.subject, payloadHash, iat, requestId);
|
|
1116
1504
|
const digest = await sha256(proofInput);
|
|
1117
1505
|
const verifyResult = await AsyncResult.try(async () => {
|
|
1118
1506
|
const publicKeyRaw = base64urlDecode(sessionKey);
|
|
@@ -1138,6 +1526,8 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
1138
1526
|
proof,
|
|
1139
1527
|
subject: msg.subject,
|
|
1140
1528
|
payloadHash: base64urlEncode(payloadHash),
|
|
1529
|
+
iat,
|
|
1530
|
+
requestId,
|
|
1141
1531
|
capabilities: [...ctx.callerCapabilities],
|
|
1142
1532
|
}).take();
|
|
1143
1533
|
if (!isErr(authValue)) {
|
|
@@ -1165,10 +1555,10 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
1165
1555
|
remoteError: auth instanceof RemoteError
|
|
1166
1556
|
? auth.toSerializable()
|
|
1167
1557
|
: undefined,
|
|
1168
|
-
}, "Auth.
|
|
1558
|
+
}, "Auth.Requests.Validate failed");
|
|
1169
1559
|
span.setStatus({
|
|
1170
1560
|
code: SpanStatusCode.ERROR,
|
|
1171
|
-
message: "Auth.
|
|
1561
|
+
message: "Auth.Requests.Validate failed",
|
|
1172
1562
|
});
|
|
1173
1563
|
if (auth instanceof BaseError) {
|
|
1174
1564
|
return err(auth);
|
|
@@ -1203,11 +1593,13 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
1203
1593
|
}
|
|
1204
1594
|
span.setAttribute("auth.caller.type", caller.type);
|
|
1205
1595
|
if (caller.type === "user") {
|
|
1206
|
-
span.setAttribute("user.id", caller.
|
|
1207
|
-
span.setAttribute("user.
|
|
1596
|
+
span.setAttribute("user.id", caller.userId);
|
|
1597
|
+
span.setAttribute("user.identity.provider", caller.identity.provider);
|
|
1598
|
+
span.setAttribute("user.identity.subject", caller.identity.subject);
|
|
1208
1599
|
}
|
|
1209
1600
|
if (caller.type === "service") {
|
|
1210
|
-
|
|
1601
|
+
const { id } = caller;
|
|
1602
|
+
span.setAttribute("service.id", id);
|
|
1211
1603
|
}
|
|
1212
1604
|
if (caller.type === "device") {
|
|
1213
1605
|
span.setAttribute("device.id", caller.deviceId);
|
|
@@ -1272,25 +1664,61 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
1272
1664
|
return ok(encoded);
|
|
1273
1665
|
};
|
|
1274
1666
|
const result = await execute();
|
|
1667
|
+
if (isErr(result)) {
|
|
1668
|
+
result.error.withTraceId(activeTraceId(span) ?? incomingTraceId);
|
|
1669
|
+
}
|
|
1275
1670
|
span.end();
|
|
1276
1671
|
return result;
|
|
1277
1672
|
});
|
|
1278
|
-
},
|
|
1673
|
+
}, _Trellis_respondWithPayload = function _Trellis_respondWithPayload(msg, payload, options, context) {
|
|
1674
|
+
const responseBytes = payloadByteLength(payload);
|
|
1675
|
+
try {
|
|
1676
|
+
msg.respond(payload, options);
|
|
1677
|
+
return ok(undefined);
|
|
1678
|
+
}
|
|
1679
|
+
catch (cause) {
|
|
1680
|
+
const error = new UnexpectedError({
|
|
1681
|
+
cause,
|
|
1682
|
+
context: {
|
|
1683
|
+
method: context.method,
|
|
1684
|
+
responseKind: context.responseKind,
|
|
1685
|
+
subject: msg.subject,
|
|
1686
|
+
reply: msg.reply,
|
|
1687
|
+
responseBytes,
|
|
1688
|
+
causeMessage: causeMessage(cause),
|
|
1689
|
+
},
|
|
1690
|
+
});
|
|
1691
|
+
__classPrivateFieldGet(this, _Trellis_log, "f").error({
|
|
1692
|
+
method: context.method,
|
|
1693
|
+
responseKind: context.responseKind,
|
|
1694
|
+
subject: msg.subject,
|
|
1695
|
+
reply: msg.reply,
|
|
1696
|
+
responseBytes,
|
|
1697
|
+
cause: causeLogData(cause),
|
|
1698
|
+
}, "Failed to send RPC response");
|
|
1699
|
+
return err(error);
|
|
1700
|
+
}
|
|
1701
|
+
}, _Trellis_respondWithError = function _Trellis_respondWithError(msg, error, context = {}) {
|
|
1279
1702
|
const trellisError = error instanceof BaseError &&
|
|
1280
1703
|
!(error instanceof RemoteError)
|
|
1281
1704
|
? error
|
|
1282
1705
|
: new UnexpectedError({ cause: error });
|
|
1283
|
-
__classPrivateFieldGet(this, _Trellis_log, "f").error({
|
|
1706
|
+
__classPrivateFieldGet(this, _Trellis_log, "f").error({
|
|
1707
|
+
method: context.method,
|
|
1708
|
+
subject: msg.subject,
|
|
1709
|
+
responseBytes: context.responseBytes,
|
|
1710
|
+
error: trellisError.toSerializable(),
|
|
1711
|
+
}, "RPC error");
|
|
1284
1712
|
const errorData = trellisError.toSerializable();
|
|
1285
1713
|
const hdrs = natsHeaders();
|
|
1286
1714
|
hdrs.set("status", "error");
|
|
1287
1715
|
const serialized = Result.try(() => JSON.stringify(errorData));
|
|
1288
1716
|
if (serialized.isErr()) {
|
|
1289
1717
|
__classPrivateFieldGet(this, _Trellis_log, "f").error({ error: serialized.error }, "Failed to serialize error response");
|
|
1290
|
-
|
|
1718
|
+
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithPayload).call(this, msg, '{"type":"UnexpectedError","message":"Failed to serialize error"}', { headers: hdrs }, { method: context.method, responseKind: "error" });
|
|
1291
1719
|
return;
|
|
1292
1720
|
}
|
|
1293
|
-
|
|
1721
|
+
__classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_respondWithPayload).call(this, msg, serialized.take(), { headers: hdrs }, { method: context.method, responseKind: "error" });
|
|
1294
1722
|
}, _Trellis_startEphemeralEvent = function _Trellis_startEphemeralEvent(event, ctx, subject, fn, signal) {
|
|
1295
1723
|
const sub = this.nats.subscribe(subject);
|
|
1296
1724
|
if (signal) {
|
|
@@ -1358,13 +1786,17 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
1358
1786
|
return `_${out}`;
|
|
1359
1787
|
}
|
|
1360
1788
|
return out;
|
|
1789
|
+
}, _Trellis_currentIat = function _Trellis_currentIat() {
|
|
1790
|
+
return this.auth.currentIat?.() ?? Math.floor(Date.now() / 1000);
|
|
1361
1791
|
}, _Trellis_createProof = async function _Trellis_createProof(subject, payload) {
|
|
1362
1792
|
const payloadBytes = new TextEncoder().encode(payload);
|
|
1363
1793
|
const payloadHash = await sha256(payloadBytes);
|
|
1364
|
-
const
|
|
1794
|
+
const iat = __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_currentIat).call(this);
|
|
1795
|
+
const requestId = ulid();
|
|
1796
|
+
const input = buildProofInput(this.auth.sessionKey, subject, payloadHash, iat, requestId);
|
|
1365
1797
|
const digest = await sha256(input);
|
|
1366
1798
|
const sigBytes = await this.auth.sign(digest);
|
|
1367
|
-
return base64urlEncode(sigBytes);
|
|
1799
|
+
return { proof: base64urlEncode(sigBytes), iat, requestId };
|
|
1368
1800
|
}, _Trellis_requestMessageWithRetry = async function _Trellis_requestMessageWithRetry(args) {
|
|
1369
1801
|
for (let retry = 0; retry <= __classPrivateFieldGet(this, _Trellis_noResponderMaxRetries, "f"); retry++) {
|
|
1370
1802
|
const result = await AsyncResult.try(() => this.nats.request(args.subject, args.payload, {
|
|
@@ -1400,39 +1832,71 @@ _Trellis_log = new WeakMap(), _Trellis_tasks = new WeakMap(), _Trellis_hasExplic
|
|
|
1400
1832
|
}));
|
|
1401
1833
|
}, _Trellis_requestJson = function _Trellis_requestJson(subject, body) {
|
|
1402
1834
|
return AsyncResult.from((async () => {
|
|
1403
|
-
const
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1835
|
+
const span = startClientSpan(subject, subject);
|
|
1836
|
+
return await withSpanAsync(span, async () => {
|
|
1837
|
+
try {
|
|
1838
|
+
const payload = JSON.stringify(body);
|
|
1839
|
+
const authHeaders = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createProof).call(this, subject, payload);
|
|
1840
|
+
const headers = natsHeaders();
|
|
1841
|
+
headers.set("session-key", this.auth.sessionKey);
|
|
1842
|
+
headers.set("proof", authHeaders.proof);
|
|
1843
|
+
headers.set("iat", String(authHeaders.iat));
|
|
1844
|
+
headers.set("request-id", authHeaders.requestId);
|
|
1845
|
+
injectTraceContext(createNatsHeaderCarrier(headers), span);
|
|
1846
|
+
const response = (await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_requestMessageWithRetry).call(this, {
|
|
1847
|
+
subject,
|
|
1848
|
+
payload,
|
|
1849
|
+
headers,
|
|
1850
|
+
timeout: this.timeout,
|
|
1851
|
+
})).take();
|
|
1852
|
+
if (isErr(response)) {
|
|
1853
|
+
span.setStatus({
|
|
1854
|
+
code: SpanStatusCode.ERROR,
|
|
1855
|
+
message: response.error.message,
|
|
1856
|
+
});
|
|
1857
|
+
return response;
|
|
1858
|
+
}
|
|
1859
|
+
const json = safeJson(response).take();
|
|
1860
|
+
if (isErr(json)) {
|
|
1861
|
+
const error = createTransportError({
|
|
1862
|
+
code: "trellis.request.invalid_response",
|
|
1863
|
+
message: "Trellis returned an invalid response.",
|
|
1864
|
+
hint: "Retry the request. If it keeps happening, reconnect to Trellis and try again.",
|
|
1865
|
+
cause: json.error.cause,
|
|
1866
|
+
context: { subject },
|
|
1867
|
+
});
|
|
1868
|
+
span.setStatus({
|
|
1869
|
+
code: SpanStatusCode.ERROR,
|
|
1870
|
+
message: error.message,
|
|
1871
|
+
});
|
|
1872
|
+
return err(error);
|
|
1873
|
+
}
|
|
1874
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
1875
|
+
return ok(json);
|
|
1876
|
+
}
|
|
1877
|
+
catch (cause) {
|
|
1878
|
+
const error = new UnexpectedError({ cause });
|
|
1879
|
+
span.setStatus({
|
|
1880
|
+
code: SpanStatusCode.ERROR,
|
|
1881
|
+
message: error.message,
|
|
1882
|
+
});
|
|
1883
|
+
span.recordException(error);
|
|
1884
|
+
return err(error);
|
|
1885
|
+
}
|
|
1886
|
+
finally {
|
|
1887
|
+
span.end();
|
|
1888
|
+
}
|
|
1889
|
+
});
|
|
1428
1890
|
})());
|
|
1429
1891
|
}, _Trellis_watchJson = function _Trellis_watchJson(subject, body) {
|
|
1430
1892
|
return AsyncResult.from((async () => {
|
|
1431
1893
|
const payload = JSON.stringify(body);
|
|
1432
|
-
const
|
|
1894
|
+
const authHeaders = await __classPrivateFieldGet(this, _Trellis_instances, "m", _Trellis_createProof).call(this, subject, payload);
|
|
1433
1895
|
const headers = natsHeaders();
|
|
1434
1896
|
headers.set("session-key", this.auth.sessionKey);
|
|
1435
|
-
headers.set("proof", proof);
|
|
1897
|
+
headers.set("proof", authHeaders.proof);
|
|
1898
|
+
headers.set("iat", String(authHeaders.iat));
|
|
1899
|
+
headers.set("request-id", authHeaders.requestId);
|
|
1436
1900
|
const inbox = createInbox(`_INBOX.${this.auth.sessionKey.slice(0, 16)}`);
|
|
1437
1901
|
const sub = this.nats.subscribe(inbox);
|
|
1438
1902
|
try {
|