cantonjs 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/dist/cjs/admin/index.d.ts +5 -0
- package/dist/cjs/admin/index.d.ts.map +1 -0
- package/dist/cjs/admin/index.js +6 -0
- package/dist/cjs/admin/index.js.map +1 -0
- package/dist/cjs/chains/definitions.d.ts +20 -0
- package/dist/cjs/chains/definitions.d.ts.map +1 -0
- package/dist/cjs/chains/definitions.js +33 -0
- package/dist/cjs/chains/definitions.js.map +1 -0
- package/dist/cjs/chains/index.d.ts +2 -0
- package/dist/cjs/chains/index.d.ts.map +1 -0
- package/dist/cjs/chains/index.js +9 -0
- package/dist/cjs/chains/index.js.map +1 -0
- package/dist/cjs/clients/createAdminClient.d.ts +73 -0
- package/dist/cjs/clients/createAdminClient.d.ts.map +1 -0
- package/dist/cjs/clients/createAdminClient.js +205 -0
- package/dist/cjs/clients/createAdminClient.js.map +1 -0
- package/dist/cjs/clients/createLedgerClient.d.ts +83 -0
- package/dist/cjs/clients/createLedgerClient.d.ts.map +1 -0
- package/dist/cjs/clients/createLedgerClient.js +240 -0
- package/dist/cjs/clients/createLedgerClient.js.map +1 -0
- package/dist/cjs/clients/createTestClient.d.ts +27 -0
- package/dist/cjs/clients/createTestClient.d.ts.map +1 -0
- package/dist/cjs/clients/createTestClient.js +46 -0
- package/dist/cjs/clients/createTestClient.js.map +1 -0
- package/dist/cjs/clients/index.d.ts +4 -0
- package/dist/cjs/clients/index.d.ts.map +1 -0
- package/dist/cjs/clients/index.js +10 -0
- package/dist/cjs/clients/index.js.map +1 -0
- package/dist/cjs/codegen/index.d.ts +2 -0
- package/dist/cjs/codegen/index.d.ts.map +1 -0
- package/dist/cjs/codegen/index.js +3 -0
- package/dist/cjs/codegen/index.js.map +1 -0
- package/dist/cjs/codegen/types.d.ts +38 -0
- package/dist/cjs/codegen/types.d.ts.map +1 -0
- package/dist/cjs/codegen/types.js +9 -0
- package/dist/cjs/codegen/types.js.map +1 -0
- package/dist/cjs/errors/auth.d.ts +13 -0
- package/dist/cjs/errors/auth.d.ts.map +1 -0
- package/dist/cjs/errors/auth.js +36 -0
- package/dist/cjs/errors/auth.js.map +1 -0
- package/dist/cjs/errors/base.d.ts +35 -0
- package/dist/cjs/errors/base.d.ts.map +1 -0
- package/dist/cjs/errors/base.js +71 -0
- package/dist/cjs/errors/base.js.map +1 -0
- package/dist/cjs/errors/index.d.ts +6 -0
- package/dist/cjs/errors/index.d.ts.map +1 -0
- package/dist/cjs/errors/index.js +22 -0
- package/dist/cjs/errors/index.js.map +1 -0
- package/dist/cjs/errors/ledger.d.ts +22 -0
- package/dist/cjs/errors/ledger.d.ts.map +1 -0
- package/dist/cjs/errors/ledger.js +55 -0
- package/dist/cjs/errors/ledger.js.map +1 -0
- package/dist/cjs/errors/streaming.d.ts +20 -0
- package/dist/cjs/errors/streaming.d.ts.map +1 -0
- package/dist/cjs/errors/streaming.js +54 -0
- package/dist/cjs/errors/streaming.js.map +1 -0
- package/dist/cjs/errors/transport.d.ts +31 -0
- package/dist/cjs/errors/transport.d.ts.map +1 -0
- package/dist/cjs/errors/transport.js +63 -0
- package/dist/cjs/errors/transport.js.map +1 -0
- package/dist/cjs/index.d.ts +25 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +48 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/ledger/index.d.ts +5 -0
- package/dist/cjs/ledger/index.d.ts.map +1 -0
- package/dist/cjs/ledger/index.js +6 -0
- package/dist/cjs/ledger/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/streaming/createStream.d.ts +55 -0
- package/dist/cjs/streaming/createStream.d.ts.map +1 -0
- package/dist/cjs/streaming/createStream.js +270 -0
- package/dist/cjs/streaming/createStream.js.map +1 -0
- package/dist/cjs/streaming/index.d.ts +8 -0
- package/dist/cjs/streaming/index.d.ts.map +1 -0
- package/dist/cjs/streaming/index.js +16 -0
- package/dist/cjs/streaming/index.js.map +1 -0
- package/dist/cjs/streaming/streamCompletions.d.ts +25 -0
- package/dist/cjs/streaming/streamCompletions.d.ts.map +1 -0
- package/dist/cjs/streaming/streamCompletions.js +47 -0
- package/dist/cjs/streaming/streamCompletions.js.map +1 -0
- package/dist/cjs/streaming/streamContracts.d.ts +42 -0
- package/dist/cjs/streaming/streamContracts.d.ts.map +1 -0
- package/dist/cjs/streaming/streamContracts.js +56 -0
- package/dist/cjs/streaming/streamContracts.js.map +1 -0
- package/dist/cjs/streaming/streamUpdates.d.ts +38 -0
- package/dist/cjs/streaming/streamUpdates.d.ts.map +1 -0
- package/dist/cjs/streaming/streamUpdates.js +66 -0
- package/dist/cjs/streaming/streamUpdates.js.map +1 -0
- package/dist/cjs/streaming/types.d.ts +111 -0
- package/dist/cjs/streaming/types.d.ts.map +1 -0
- package/dist/cjs/streaming/types.js +20 -0
- package/dist/cjs/streaming/types.js.map +1 -0
- package/dist/cjs/testing/index.d.ts +4 -0
- package/dist/cjs/testing/index.d.ts.map +1 -0
- package/dist/cjs/testing/index.js +11 -0
- package/dist/cjs/testing/index.js.map +1 -0
- package/dist/cjs/testing/mockTransport.d.ts +80 -0
- package/dist/cjs/testing/mockTransport.d.ts.map +1 -0
- package/dist/cjs/testing/mockTransport.js +97 -0
- package/dist/cjs/testing/mockTransport.js.map +1 -0
- package/dist/cjs/testing/setupSandbox.d.ts +62 -0
- package/dist/cjs/testing/setupSandbox.d.ts.map +1 -0
- package/dist/cjs/testing/setupSandbox.js +109 -0
- package/dist/cjs/testing/setupSandbox.js.map +1 -0
- package/dist/cjs/transport/fallback.d.ts +21 -0
- package/dist/cjs/transport/fallback.d.ts.map +1 -0
- package/dist/cjs/transport/fallback.js +48 -0
- package/dist/cjs/transport/fallback.js.map +1 -0
- package/dist/cjs/transport/grpc.d.ts +51 -0
- package/dist/cjs/transport/grpc.d.ts.map +1 -0
- package/dist/cjs/transport/grpc.js +90 -0
- package/dist/cjs/transport/grpc.js.map +1 -0
- package/dist/cjs/transport/index.d.ts +3 -0
- package/dist/cjs/transport/index.d.ts.map +1 -0
- package/dist/cjs/transport/index.js +6 -0
- package/dist/cjs/transport/index.js.map +1 -0
- package/dist/cjs/transport/json-api.d.ts +9 -0
- package/dist/cjs/transport/json-api.d.ts.map +1 -0
- package/dist/cjs/transport/json-api.js +69 -0
- package/dist/cjs/transport/json-api.js.map +1 -0
- package/dist/cjs/transport/types.d.ts +36 -0
- package/dist/cjs/transport/types.d.ts.map +1 -0
- package/dist/cjs/transport/types.js +10 -0
- package/dist/cjs/transport/types.js.map +1 -0
- package/dist/cjs/types/command.d.ts +127 -0
- package/dist/cjs/types/command.d.ts.map +1 -0
- package/dist/cjs/types/command.js +12 -0
- package/dist/cjs/types/command.js.map +1 -0
- package/dist/cjs/types/contract.d.ts +104 -0
- package/dist/cjs/types/contract.d.ts.map +1 -0
- package/dist/cjs/types/contract.js +12 -0
- package/dist/cjs/types/contract.js.map +1 -0
- package/dist/cjs/types/idp.d.ts +28 -0
- package/dist/cjs/types/idp.d.ts.map +1 -0
- package/dist/cjs/types/idp.js +9 -0
- package/dist/cjs/types/idp.js.map +1 -0
- package/dist/cjs/types/index.d.ts +10 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +3 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/interactive.d.ts +47 -0
- package/dist/cjs/types/interactive.d.ts.map +1 -0
- package/dist/cjs/types/interactive.js +13 -0
- package/dist/cjs/types/interactive.js.map +1 -0
- package/dist/cjs/types/package.d.ts +15 -0
- package/dist/cjs/types/package.d.ts.map +1 -0
- package/dist/cjs/types/package.js +8 -0
- package/dist/cjs/types/package.js.map +1 -0
- package/dist/cjs/types/party.d.ts +32 -0
- package/dist/cjs/types/party.d.ts.map +1 -0
- package/dist/cjs/types/party.js +10 -0
- package/dist/cjs/types/party.js.map +1 -0
- package/dist/cjs/types/reassignment.d.ts +65 -0
- package/dist/cjs/types/reassignment.d.ts.map +1 -0
- package/dist/cjs/types/reassignment.js +10 -0
- package/dist/cjs/types/reassignment.js.map +1 -0
- package/dist/cjs/types/transaction.d.ts +59 -0
- package/dist/cjs/types/transaction.d.ts.map +1 -0
- package/dist/cjs/types/transaction.js +13 -0
- package/dist/cjs/types/transaction.js.map +1 -0
- package/dist/cjs/types/user.d.ts +64 -0
- package/dist/cjs/types/user.d.ts.map +1 -0
- package/dist/cjs/types/user.js +12 -0
- package/dist/cjs/types/user.js.map +1 -0
- package/dist/esm/admin/index.d.ts +5 -0
- package/dist/esm/admin/index.d.ts.map +1 -0
- package/dist/esm/admin/index.js +2 -0
- package/dist/esm/admin/index.js.map +1 -0
- package/dist/esm/chains/definitions.d.ts +20 -0
- package/dist/esm/chains/definitions.d.ts.map +1 -0
- package/dist/esm/chains/definitions.js +30 -0
- package/dist/esm/chains/definitions.js.map +1 -0
- package/dist/esm/chains/index.d.ts +2 -0
- package/dist/esm/chains/index.d.ts.map +1 -0
- package/dist/esm/chains/index.js +2 -0
- package/dist/esm/chains/index.js.map +1 -0
- package/dist/esm/clients/createAdminClient.d.ts +73 -0
- package/dist/esm/clients/createAdminClient.d.ts.map +1 -0
- package/dist/esm/clients/createAdminClient.js +202 -0
- package/dist/esm/clients/createAdminClient.js.map +1 -0
- package/dist/esm/clients/createLedgerClient.d.ts +83 -0
- package/dist/esm/clients/createLedgerClient.d.ts.map +1 -0
- package/dist/esm/clients/createLedgerClient.js +237 -0
- package/dist/esm/clients/createLedgerClient.js.map +1 -0
- package/dist/esm/clients/createTestClient.d.ts +27 -0
- package/dist/esm/clients/createTestClient.d.ts.map +1 -0
- package/dist/esm/clients/createTestClient.js +43 -0
- package/dist/esm/clients/createTestClient.js.map +1 -0
- package/dist/esm/clients/index.d.ts +4 -0
- package/dist/esm/clients/index.d.ts.map +1 -0
- package/dist/esm/clients/index.js +4 -0
- package/dist/esm/clients/index.js.map +1 -0
- package/dist/esm/codegen/index.d.ts +2 -0
- package/dist/esm/codegen/index.d.ts.map +1 -0
- package/dist/esm/codegen/index.js +2 -0
- package/dist/esm/codegen/index.js.map +1 -0
- package/dist/esm/codegen/types.d.ts +38 -0
- package/dist/esm/codegen/types.d.ts.map +1 -0
- package/dist/esm/codegen/types.js +8 -0
- package/dist/esm/codegen/types.js.map +1 -0
- package/dist/esm/errors/auth.d.ts +13 -0
- package/dist/esm/errors/auth.d.ts.map +1 -0
- package/dist/esm/errors/auth.js +31 -0
- package/dist/esm/errors/auth.js.map +1 -0
- package/dist/esm/errors/base.d.ts +35 -0
- package/dist/esm/errors/base.d.ts.map +1 -0
- package/dist/esm/errors/base.js +67 -0
- package/dist/esm/errors/base.js.map +1 -0
- package/dist/esm/errors/index.d.ts +6 -0
- package/dist/esm/errors/index.d.ts.map +1 -0
- package/dist/esm/errors/index.js +6 -0
- package/dist/esm/errors/index.js.map +1 -0
- package/dist/esm/errors/ledger.d.ts +22 -0
- package/dist/esm/errors/ledger.d.ts.map +1 -0
- package/dist/esm/errors/ledger.js +49 -0
- package/dist/esm/errors/ledger.js.map +1 -0
- package/dist/esm/errors/streaming.d.ts +20 -0
- package/dist/esm/errors/streaming.d.ts.map +1 -0
- package/dist/esm/errors/streaming.js +48 -0
- package/dist/esm/errors/streaming.js.map +1 -0
- package/dist/esm/errors/transport.d.ts +31 -0
- package/dist/esm/errors/transport.d.ts.map +1 -0
- package/dist/esm/errors/transport.js +56 -0
- package/dist/esm/errors/transport.js.map +1 -0
- package/dist/esm/index.d.ts +25 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +18 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/ledger/index.d.ts +5 -0
- package/dist/esm/ledger/index.d.ts.map +1 -0
- package/dist/esm/ledger/index.js +2 -0
- package/dist/esm/ledger/index.js.map +1 -0
- package/dist/esm/streaming/createStream.d.ts +55 -0
- package/dist/esm/streaming/createStream.d.ts.map +1 -0
- package/dist/esm/streaming/createStream.js +265 -0
- package/dist/esm/streaming/createStream.js.map +1 -0
- package/dist/esm/streaming/index.d.ts +8 -0
- package/dist/esm/streaming/index.d.ts.map +1 -0
- package/dist/esm/streaming/index.js +6 -0
- package/dist/esm/streaming/index.js.map +1 -0
- package/dist/esm/streaming/streamCompletions.d.ts +25 -0
- package/dist/esm/streaming/streamCompletions.d.ts.map +1 -0
- package/dist/esm/streaming/streamCompletions.js +44 -0
- package/dist/esm/streaming/streamCompletions.js.map +1 -0
- package/dist/esm/streaming/streamContracts.d.ts +42 -0
- package/dist/esm/streaming/streamContracts.d.ts.map +1 -0
- package/dist/esm/streaming/streamContracts.js +53 -0
- package/dist/esm/streaming/streamContracts.js.map +1 -0
- package/dist/esm/streaming/streamUpdates.d.ts +38 -0
- package/dist/esm/streaming/streamUpdates.d.ts.map +1 -0
- package/dist/esm/streaming/streamUpdates.js +63 -0
- package/dist/esm/streaming/streamUpdates.js.map +1 -0
- package/dist/esm/streaming/types.d.ts +111 -0
- package/dist/esm/streaming/types.d.ts.map +1 -0
- package/dist/esm/streaming/types.js +17 -0
- package/dist/esm/streaming/types.js.map +1 -0
- package/dist/esm/testing/index.d.ts +4 -0
- package/dist/esm/testing/index.d.ts.map +1 -0
- package/dist/esm/testing/index.js +4 -0
- package/dist/esm/testing/index.js.map +1 -0
- package/dist/esm/testing/mockTransport.d.ts +80 -0
- package/dist/esm/testing/mockTransport.d.ts.map +1 -0
- package/dist/esm/testing/mockTransport.js +93 -0
- package/dist/esm/testing/mockTransport.js.map +1 -0
- package/dist/esm/testing/setupSandbox.d.ts +62 -0
- package/dist/esm/testing/setupSandbox.d.ts.map +1 -0
- package/dist/esm/testing/setupSandbox.js +106 -0
- package/dist/esm/testing/setupSandbox.js.map +1 -0
- package/dist/esm/transport/fallback.d.ts +21 -0
- package/dist/esm/transport/fallback.d.ts.map +1 -0
- package/dist/esm/transport/fallback.js +45 -0
- package/dist/esm/transport/fallback.js.map +1 -0
- package/dist/esm/transport/grpc.d.ts +51 -0
- package/dist/esm/transport/grpc.d.ts.map +1 -0
- package/dist/esm/transport/grpc.js +87 -0
- package/dist/esm/transport/grpc.js.map +1 -0
- package/dist/esm/transport/index.d.ts +3 -0
- package/dist/esm/transport/index.d.ts.map +1 -0
- package/dist/esm/transport/index.js +2 -0
- package/dist/esm/transport/index.js.map +1 -0
- package/dist/esm/transport/json-api.d.ts +9 -0
- package/dist/esm/transport/json-api.d.ts.map +1 -0
- package/dist/esm/transport/json-api.js +66 -0
- package/dist/esm/transport/json-api.js.map +1 -0
- package/dist/esm/transport/types.d.ts +36 -0
- package/dist/esm/transport/types.d.ts.map +1 -0
- package/dist/esm/transport/types.js +9 -0
- package/dist/esm/transport/types.js.map +1 -0
- package/dist/esm/types/command.d.ts +127 -0
- package/dist/esm/types/command.d.ts.map +1 -0
- package/dist/esm/types/command.js +11 -0
- package/dist/esm/types/command.js.map +1 -0
- package/dist/esm/types/contract.d.ts +104 -0
- package/dist/esm/types/contract.d.ts.map +1 -0
- package/dist/esm/types/contract.js +11 -0
- package/dist/esm/types/contract.js.map +1 -0
- package/dist/esm/types/idp.d.ts +28 -0
- package/dist/esm/types/idp.d.ts.map +1 -0
- package/dist/esm/types/idp.js +8 -0
- package/dist/esm/types/idp.js.map +1 -0
- package/dist/esm/types/index.d.ts +10 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js +2 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/interactive.d.ts +47 -0
- package/dist/esm/types/interactive.d.ts.map +1 -0
- package/dist/esm/types/interactive.js +12 -0
- package/dist/esm/types/interactive.js.map +1 -0
- package/dist/esm/types/package.d.ts +15 -0
- package/dist/esm/types/package.d.ts.map +1 -0
- package/dist/esm/types/package.js +7 -0
- package/dist/esm/types/package.js.map +1 -0
- package/dist/esm/types/party.d.ts +32 -0
- package/dist/esm/types/party.d.ts.map +1 -0
- package/dist/esm/types/party.js +9 -0
- package/dist/esm/types/party.js.map +1 -0
- package/dist/esm/types/reassignment.d.ts +65 -0
- package/dist/esm/types/reassignment.d.ts.map +1 -0
- package/dist/esm/types/reassignment.js +9 -0
- package/dist/esm/types/reassignment.js.map +1 -0
- package/dist/esm/types/transaction.d.ts +59 -0
- package/dist/esm/types/transaction.d.ts.map +1 -0
- package/dist/esm/types/transaction.js +12 -0
- package/dist/esm/types/transaction.js.map +1 -0
- package/dist/esm/types/user.d.ts +64 -0
- package/dist/esm/types/user.d.ts.map +1 -0
- package/dist/esm/types/user.js +11 -0
- package/dist/esm/types/user.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/package.json +140 -0
- package/src/admin/index.ts +9 -0
- package/src/chains/definitions.ts +43 -0
- package/src/chains/index.ts +1 -0
- package/src/clients/createAdminClient.ts +336 -0
- package/src/clients/createLedgerClient.ts +383 -0
- package/src/clients/createTestClient.ts +77 -0
- package/src/clients/index.ts +19 -0
- package/src/codegen/index.ts +6 -0
- package/src/codegen/types.ts +51 -0
- package/src/errors/auth.ts +33 -0
- package/src/errors/base.ts +83 -0
- package/src/errors/index.ts +5 -0
- package/src/errors/ledger.ts +53 -0
- package/src/errors/streaming.ts +51 -0
- package/src/errors/transport.ts +65 -0
- package/src/index.ts +122 -0
- package/src/ledger/index.ts +33 -0
- package/src/streaming/createStream.ts +321 -0
- package/src/streaming/index.ts +19 -0
- package/src/streaming/streamCompletions.ts +49 -0
- package/src/streaming/streamContracts.ts +64 -0
- package/src/streaming/streamUpdates.ts +67 -0
- package/src/streaming/types.ts +117 -0
- package/src/testing/index.ts +18 -0
- package/src/testing/mockTransport.ts +132 -0
- package/src/testing/setupSandbox.ts +163 -0
- package/src/transport/fallback.ts +57 -0
- package/src/transport/grpc.ts +130 -0
- package/src/transport/index.ts +2 -0
- package/src/transport/json-api.ts +83 -0
- package/src/transport/types.ts +39 -0
- package/src/types/command.ts +123 -0
- package/src/types/contract.ts +101 -0
- package/src/types/idp.ts +31 -0
- package/src/types/index.ts +66 -0
- package/src/types/interactive.ts +53 -0
- package/src/types/package.ts +16 -0
- package/src/types/party.ts +33 -0
- package/src/types/reassignment.ts +68 -0
- package/src/types/transaction.ts +57 -0
- package/src/types/user.ts +41 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming types for Canton WebSocket connections.
|
|
3
|
+
*
|
|
4
|
+
* Canton WebSocket protocol:
|
|
5
|
+
* - Auth via subprotocols: ['daml.ws.auth', 'jwt.token.<JWT>']
|
|
6
|
+
* - One subscription per connection (no multiplexing)
|
|
7
|
+
* - Messages are individual JSON frames
|
|
8
|
+
* - OffsetCheckpoint messages serve as heartbeats
|
|
9
|
+
*/
|
|
10
|
+
import type { EventFormat } from '../types/command.js';
|
|
11
|
+
/**
|
|
12
|
+
* WebSocket constructor type.
|
|
13
|
+
* Accepts browser-native WebSocket or Node.js `ws` package.
|
|
14
|
+
*/
|
|
15
|
+
export type WebSocketConstructor = {
|
|
16
|
+
new (url: string, protocols?: string | string[]): WebSocketLike;
|
|
17
|
+
};
|
|
18
|
+
/** Minimal WebSocket interface needed by the streaming layer. */
|
|
19
|
+
export type WebSocketLike = {
|
|
20
|
+
readyState: number;
|
|
21
|
+
onopen: ((event: unknown) => void) | null;
|
|
22
|
+
onmessage: ((event: {
|
|
23
|
+
data: unknown;
|
|
24
|
+
}) => void) | null;
|
|
25
|
+
onerror: ((event: unknown) => void) | null;
|
|
26
|
+
onclose: ((event: {
|
|
27
|
+
code: number;
|
|
28
|
+
reason: string;
|
|
29
|
+
}) => void) | null;
|
|
30
|
+
close(code?: number, reason?: string): void;
|
|
31
|
+
send(data: string): void;
|
|
32
|
+
};
|
|
33
|
+
/** WebSocket readyState constants. */
|
|
34
|
+
export declare const WS_READY_STATE: {
|
|
35
|
+
readonly CONNECTING: 0;
|
|
36
|
+
readonly OPEN: 1;
|
|
37
|
+
readonly CLOSING: 2;
|
|
38
|
+
readonly CLOSED: 3;
|
|
39
|
+
};
|
|
40
|
+
/** Reconnection configuration. */
|
|
41
|
+
export type ReconnectConfig = {
|
|
42
|
+
/** Initial delay in milliseconds. Default: 1000. */
|
|
43
|
+
readonly initialDelay?: number;
|
|
44
|
+
/** Maximum delay in milliseconds. Default: 30000. */
|
|
45
|
+
readonly maxDelay?: number;
|
|
46
|
+
/** Backoff multiplier. Default: 2. */
|
|
47
|
+
readonly factor?: number;
|
|
48
|
+
/** Jitter factor (0 to 1). Default: 0.25. */
|
|
49
|
+
readonly jitter?: number;
|
|
50
|
+
/** Maximum reconnection attempts. Default: Infinity. */
|
|
51
|
+
readonly maxAttempts?: number;
|
|
52
|
+
};
|
|
53
|
+
/** Base options shared by all stream functions. */
|
|
54
|
+
export type StreamOptions = {
|
|
55
|
+
/** Base URL of the Canton node (http/https, will be converted to ws/wss). */
|
|
56
|
+
readonly url: string;
|
|
57
|
+
/** JWT token for authentication. */
|
|
58
|
+
readonly token?: string;
|
|
59
|
+
/** WebSocket constructor to use. Defaults to globalThis.WebSocket. */
|
|
60
|
+
readonly WebSocket?: WebSocketConstructor;
|
|
61
|
+
/** AbortSignal to cancel the stream. */
|
|
62
|
+
readonly signal?: AbortSignal;
|
|
63
|
+
/** Reconnection configuration. Set to false to disable auto-reconnect. */
|
|
64
|
+
readonly reconnect?: ReconnectConfig | false;
|
|
65
|
+
};
|
|
66
|
+
/** Options for the /v2/updates stream. */
|
|
67
|
+
export type StreamUpdatesOptions = StreamOptions & {
|
|
68
|
+
/** Start reading after this offset (exclusive). */
|
|
69
|
+
readonly beginExclusive?: number;
|
|
70
|
+
/** Stop reading at this offset (inclusive). Omit for open-ended stream. */
|
|
71
|
+
readonly endInclusive?: number;
|
|
72
|
+
/** Format for received updates. */
|
|
73
|
+
readonly updateFormat?: {
|
|
74
|
+
readonly includeTransactions?: {
|
|
75
|
+
readonly transactionShape: 'TRANSACTION_SHAPE_ACS_DELTA' | 'TRANSACTION_SHAPE_LEDGER_EFFECTS';
|
|
76
|
+
readonly eventFormat: EventFormat;
|
|
77
|
+
};
|
|
78
|
+
readonly includeReassignments?: EventFormat;
|
|
79
|
+
readonly includeTopologyEvents?: unknown;
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
/** Options for the /v2/state/active-contracts stream. */
|
|
83
|
+
export type StreamContractsOptions = StreamOptions & {
|
|
84
|
+
/** Event format with party filters. */
|
|
85
|
+
readonly eventFormat: EventFormat;
|
|
86
|
+
/** Offset to read the ACS at. Omit for current. */
|
|
87
|
+
readonly activeAtOffset?: number;
|
|
88
|
+
};
|
|
89
|
+
/** Options for the /v2/commands/completions stream. */
|
|
90
|
+
export type StreamCompletionsOptions = StreamOptions & {
|
|
91
|
+
/** Start reading after this offset (exclusive). */
|
|
92
|
+
readonly beginExclusive?: number;
|
|
93
|
+
/** Parties whose completions to receive. */
|
|
94
|
+
readonly parties: readonly string[];
|
|
95
|
+
/** Application ID filter. */
|
|
96
|
+
readonly applicationId?: string;
|
|
97
|
+
};
|
|
98
|
+
/** Completion event from the completions stream. */
|
|
99
|
+
export type CompletionEvent = {
|
|
100
|
+
readonly completion: {
|
|
101
|
+
readonly commandId: string;
|
|
102
|
+
readonly updateId?: string;
|
|
103
|
+
readonly status?: {
|
|
104
|
+
readonly code: number;
|
|
105
|
+
readonly message: string;
|
|
106
|
+
};
|
|
107
|
+
readonly offset?: number;
|
|
108
|
+
readonly synchronizerId?: string;
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/streaming/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming types for Canton WebSocket connections.
|
|
3
|
+
*
|
|
4
|
+
* Canton WebSocket protocol:
|
|
5
|
+
* - Auth via subprotocols: ['daml.ws.auth', 'jwt.token.<JWT>']
|
|
6
|
+
* - One subscription per connection (no multiplexing)
|
|
7
|
+
* - Messages are individual JSON frames
|
|
8
|
+
* - OffsetCheckpoint messages serve as heartbeats
|
|
9
|
+
*/
|
|
10
|
+
/** WebSocket readyState constants. */
|
|
11
|
+
export const WS_READY_STATE = {
|
|
12
|
+
CONNECTING: 0,
|
|
13
|
+
OPEN: 1,
|
|
14
|
+
CLOSING: 2,
|
|
15
|
+
CLOSED: 3,
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/streaming/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuBH,sCAAsC;AACtC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU,EAAE,CAAC;IACb,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC;CACD,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createTestClient, type TestClient, type TestClientConfig, } from '../clients/createTestClient.js';
|
|
2
|
+
export { setupCantonSandbox, type SandboxConfig, type SandboxContext, } from './setupSandbox.js';
|
|
3
|
+
export { createMockTransport, createRecordingTransport, type RecordedExchange, type RequestMatcher, } from './mockTransport.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,gBAAgB,GACtB,MAAM,gCAAgC,CAAA;AAEvC,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAGjB,MAAM,gCAAgC,CAAA;AAEvC,OAAO,EACL,kBAAkB,GAGnB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,GAGzB,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock transport for testing dApp code without a running Canton node.
|
|
3
|
+
*
|
|
4
|
+
* Provides two patterns:
|
|
5
|
+
* - createMockTransport() — respond with pre-configured responses
|
|
6
|
+
* - createRecordingTransport() — record real responses for later replay
|
|
7
|
+
*/
|
|
8
|
+
import type { Transport } from '../transport/types.js';
|
|
9
|
+
/** A recorded request/response pair. */
|
|
10
|
+
export type RecordedExchange = {
|
|
11
|
+
readonly request: {
|
|
12
|
+
readonly method: string;
|
|
13
|
+
readonly path: string;
|
|
14
|
+
readonly body?: unknown;
|
|
15
|
+
};
|
|
16
|
+
readonly response: unknown;
|
|
17
|
+
};
|
|
18
|
+
/** Matcher for routing mock responses. */
|
|
19
|
+
export type RequestMatcher = {
|
|
20
|
+
/** HTTP method to match. If omitted, matches any method. */
|
|
21
|
+
readonly method?: string;
|
|
22
|
+
/** Path prefix or exact path to match. */
|
|
23
|
+
readonly path: string;
|
|
24
|
+
/** Response to return when matched. */
|
|
25
|
+
readonly response: unknown;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Create a mock transport that returns pre-configured responses.
|
|
29
|
+
*
|
|
30
|
+
* Responses are matched by path (prefix match) and optionally method.
|
|
31
|
+
* If no matcher is found, returns the `defaultResponse` or throws.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const transport = createMockTransport({
|
|
36
|
+
* matchers: [
|
|
37
|
+
* { path: '/v2/parties', response: { partyDetails: [] } },
|
|
38
|
+
* { method: 'POST', path: '/v2/commands', response: { transaction: { ... } } },
|
|
39
|
+
* ],
|
|
40
|
+
* })
|
|
41
|
+
*
|
|
42
|
+
* const client = createLedgerClient({ transport, actAs: party })
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function createMockTransport(options?: {
|
|
46
|
+
matchers?: readonly RequestMatcher[];
|
|
47
|
+
defaultResponse?: unknown;
|
|
48
|
+
url?: string;
|
|
49
|
+
}): Transport & {
|
|
50
|
+
readonly calls: readonly RecordedExchange[];
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Create a transport that records all exchanges from a real transport.
|
|
54
|
+
*
|
|
55
|
+
* Wraps an existing transport and stores every request/response pair.
|
|
56
|
+
* Use `transport.recordings` to access recorded exchanges for replay.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const real = jsonApi({ url: 'http://localhost:7575', token: jwt })
|
|
61
|
+
* const recording = createRecordingTransport(real)
|
|
62
|
+
*
|
|
63
|
+
* // Use recording transport with your client...
|
|
64
|
+
* const client = createLedgerClient({ transport: recording, actAs: party })
|
|
65
|
+
* await client.queryContracts(templateId)
|
|
66
|
+
*
|
|
67
|
+
* // Later, replay the recordings
|
|
68
|
+
* const replay = createMockTransport({
|
|
69
|
+
* matchers: recording.recordings.map(r => ({
|
|
70
|
+
* method: r.request.method,
|
|
71
|
+
* path: r.request.path,
|
|
72
|
+
* response: r.response,
|
|
73
|
+
* })),
|
|
74
|
+
* })
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare function createRecordingTransport(inner: Transport): Transport & {
|
|
78
|
+
readonly recordings: readonly RecordedExchange[];
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=mockTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockTransport.d.ts","sourceRoot":"","sources":["../../../src/testing/mockTransport.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,uBAAuB,CAAA;AAExE,wCAAwC;AACxC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;QACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KACxB,CAAA;IACD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,0CAA0C;AAC1C,MAAM,MAAM,cAAc,GAAG;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE;IAC3C,QAAQ,CAAC,EAAE,SAAS,cAAc,EAAE,CAAA;IACpC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,GAAG,CAAC,EAAE,MAAM,CAAA;CACR,GAAG,SAAS,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAAE,CA+BnE;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,GACf,SAAS,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAAE,CAmBlE"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock transport for testing dApp code without a running Canton node.
|
|
3
|
+
*
|
|
4
|
+
* Provides two patterns:
|
|
5
|
+
* - createMockTransport() — respond with pre-configured responses
|
|
6
|
+
* - createRecordingTransport() — record real responses for later replay
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Create a mock transport that returns pre-configured responses.
|
|
10
|
+
*
|
|
11
|
+
* Responses are matched by path (prefix match) and optionally method.
|
|
12
|
+
* If no matcher is found, returns the `defaultResponse` or throws.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const transport = createMockTransport({
|
|
17
|
+
* matchers: [
|
|
18
|
+
* { path: '/v2/parties', response: { partyDetails: [] } },
|
|
19
|
+
* { method: 'POST', path: '/v2/commands', response: { transaction: { ... } } },
|
|
20
|
+
* ],
|
|
21
|
+
* })
|
|
22
|
+
*
|
|
23
|
+
* const client = createLedgerClient({ transport, actAs: party })
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function createMockTransport(options = {}) {
|
|
27
|
+
const { matchers = [], defaultResponse, url = 'http://mock:7575' } = options;
|
|
28
|
+
const calls = [];
|
|
29
|
+
return {
|
|
30
|
+
type: 'mock',
|
|
31
|
+
url,
|
|
32
|
+
calls,
|
|
33
|
+
async request(args) {
|
|
34
|
+
const matcher = matchers.find((m) => {
|
|
35
|
+
if (m.method && m.method !== args.method)
|
|
36
|
+
return false;
|
|
37
|
+
return args.path.startsWith(m.path);
|
|
38
|
+
});
|
|
39
|
+
const response = matcher?.response ?? defaultResponse;
|
|
40
|
+
if (response === undefined) {
|
|
41
|
+
throw new Error(`No mock response for ${args.method} ${args.path}. ` +
|
|
42
|
+
`Add a matcher or set defaultResponse.`);
|
|
43
|
+
}
|
|
44
|
+
calls.push({
|
|
45
|
+
request: { method: args.method, path: args.path, body: args.body },
|
|
46
|
+
response,
|
|
47
|
+
});
|
|
48
|
+
return response;
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create a transport that records all exchanges from a real transport.
|
|
54
|
+
*
|
|
55
|
+
* Wraps an existing transport and stores every request/response pair.
|
|
56
|
+
* Use `transport.recordings` to access recorded exchanges for replay.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const real = jsonApi({ url: 'http://localhost:7575', token: jwt })
|
|
61
|
+
* const recording = createRecordingTransport(real)
|
|
62
|
+
*
|
|
63
|
+
* // Use recording transport with your client...
|
|
64
|
+
* const client = createLedgerClient({ transport: recording, actAs: party })
|
|
65
|
+
* await client.queryContracts(templateId)
|
|
66
|
+
*
|
|
67
|
+
* // Later, replay the recordings
|
|
68
|
+
* const replay = createMockTransport({
|
|
69
|
+
* matchers: recording.recordings.map(r => ({
|
|
70
|
+
* method: r.request.method,
|
|
71
|
+
* path: r.request.path,
|
|
72
|
+
* response: r.response,
|
|
73
|
+
* })),
|
|
74
|
+
* })
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export function createRecordingTransport(inner) {
|
|
78
|
+
const recordings = [];
|
|
79
|
+
return {
|
|
80
|
+
type: `recording(${inner.type})`,
|
|
81
|
+
url: inner.url,
|
|
82
|
+
recordings,
|
|
83
|
+
async request(args) {
|
|
84
|
+
const response = await inner.request(args);
|
|
85
|
+
recordings.push({
|
|
86
|
+
request: { method: args.method, path: args.path, body: args.body },
|
|
87
|
+
response,
|
|
88
|
+
});
|
|
89
|
+
return response;
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=mockTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockTransport.js","sourceRoot":"","sources":["../../../src/testing/mockTransport.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwBH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAIhC,EAAE;IACJ,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,eAAe,EAAE,GAAG,GAAG,kBAAkB,EAAE,GAAG,OAAO,CAAA;IAC5E,MAAM,KAAK,GAAuB,EAAE,CAAA;IAEpC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,GAAG;QACH,KAAK;QAEL,KAAK,CAAC,OAAO,CAAY,IAAsB;YAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBAClC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;oBAAE,OAAO,KAAK,CAAA;gBACtD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YACrC,CAAC,CAAC,CAAA;YAEF,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,eAAe,CAAA;YACrD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CACb,wBAAwB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI;oBACpD,uCAAuC,CACxC,CAAA;YACH,CAAC;YAED,KAAK,CAAC,IAAI,CAAC;gBACT,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;gBAClE,QAAQ;aACT,CAAC,CAAA;YAEF,OAAO,QAAqB,CAAA;QAC9B,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAgB;IAEhB,MAAM,UAAU,GAAuB,EAAE,CAAA;IAEzC,OAAO;QACL,IAAI,EAAE,aAAa,KAAK,CAAC,IAAI,GAAG;QAChC,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,UAAU;QAEV,KAAK,CAAC,OAAO,CAAY,IAAsB;YAC7C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAY,IAAI,CAAC,CAAA;YAErD,UAAU,CAAC,IAAI,CAAC;gBACd,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;gBAClE,QAAQ;aACT,CAAC,CAAA;YAEF,OAAO,QAAQ,CAAA;QACjB,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vitest fixture for Canton sandbox lifecycle via cantonctl.
|
|
3
|
+
*
|
|
4
|
+
* Requires cantonctl to be installed and available on PATH.
|
|
5
|
+
* If cantonctl is not available, the fixture throws with a helpful message.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { setupCantonSandbox } from 'cantonjs/testing'
|
|
10
|
+
*
|
|
11
|
+
* const sandbox = await setupCantonSandbox()
|
|
12
|
+
* // sandbox.client is a fully configured TestClient
|
|
13
|
+
* // sandbox.transport is the underlying transport
|
|
14
|
+
* // sandbox.url is the JSON API base URL
|
|
15
|
+
*
|
|
16
|
+
* // ... run tests ...
|
|
17
|
+
*
|
|
18
|
+
* await sandbox.teardown()
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { type TestClient } from '../clients/createTestClient.js';
|
|
22
|
+
import type { Transport } from '../transport/types.js';
|
|
23
|
+
import type { Party } from '../types/party.js';
|
|
24
|
+
/** Configuration for sandbox setup. */
|
|
25
|
+
export type SandboxConfig = {
|
|
26
|
+
/** Port for the JSON API. Default: 7575. */
|
|
27
|
+
readonly port?: number;
|
|
28
|
+
/** Timeout in milliseconds for sandbox to become ready. Default: 30000. */
|
|
29
|
+
readonly timeout?: number;
|
|
30
|
+
/** JWT token. If not provided, attempts to use cantonctl auth. */
|
|
31
|
+
readonly token?: string;
|
|
32
|
+
/** Party for the TestClient. Default: allocated via sandbox. */
|
|
33
|
+
readonly party?: Party;
|
|
34
|
+
/** Custom fetch implementation (for testing the fixture itself). */
|
|
35
|
+
readonly fetchFn?: typeof fetch;
|
|
36
|
+
/** Custom exec implementation (for testing the fixture itself). */
|
|
37
|
+
readonly execFn?: (cmd: string) => Promise<{
|
|
38
|
+
stdout: string;
|
|
39
|
+
stderr: string;
|
|
40
|
+
}>;
|
|
41
|
+
};
|
|
42
|
+
/** Result from setupCantonSandbox(). */
|
|
43
|
+
export type SandboxContext = {
|
|
44
|
+
/** The base URL of the running sandbox JSON API. */
|
|
45
|
+
readonly url: string;
|
|
46
|
+
/** The transport connected to the sandbox. */
|
|
47
|
+
readonly transport: Transport;
|
|
48
|
+
/** A fully configured TestClient. */
|
|
49
|
+
readonly client: TestClient;
|
|
50
|
+
/** Tear down the sandbox. */
|
|
51
|
+
readonly teardown: () => Promise<void>;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Set up a Canton sandbox for integration testing.
|
|
55
|
+
*
|
|
56
|
+
* Requires `cantonctl` to be installed. Starts a sandbox,
|
|
57
|
+
* waits for it to be ready, and returns a configured TestClient.
|
|
58
|
+
*
|
|
59
|
+
* Call `teardown()` when done to stop the sandbox.
|
|
60
|
+
*/
|
|
61
|
+
export declare function setupCantonSandbox(config?: SandboxConfig): Promise<SandboxContext>;
|
|
62
|
+
//# sourceMappingURL=setupSandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupSandbox.d.ts","sourceRoot":"","sources":["../../../src/testing/setupSandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE9C,uCAAuC;AACvC,MAAM,MAAM,aAAa,GAAG;IAC1B,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,kEAAkE;IAClE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,gEAAgE;IAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;IACtB,oEAAoE;IACpE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;IAC/B,mEAAmE;IACnE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/E,CAAA;AAED,wCAAwC;AACxC,MAAM,MAAM,cAAc,GAAG;IAC3B,oDAAoD;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,6BAA6B;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACvC,CAAA;AAiDD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,GAAE,aAAkB,GACzB,OAAO,CAAC,cAAc,CAAC,CAmDzB"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vitest fixture for Canton sandbox lifecycle via cantonctl.
|
|
3
|
+
*
|
|
4
|
+
* Requires cantonctl to be installed and available on PATH.
|
|
5
|
+
* If cantonctl is not available, the fixture throws with a helpful message.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { setupCantonSandbox } from 'cantonjs/testing'
|
|
10
|
+
*
|
|
11
|
+
* const sandbox = await setupCantonSandbox()
|
|
12
|
+
* // sandbox.client is a fully configured TestClient
|
|
13
|
+
* // sandbox.transport is the underlying transport
|
|
14
|
+
* // sandbox.url is the JSON API base URL
|
|
15
|
+
*
|
|
16
|
+
* // ... run tests ...
|
|
17
|
+
*
|
|
18
|
+
* await sandbox.teardown()
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { jsonApi } from '../transport/json-api.js';
|
|
22
|
+
import { createTestClient } from '../clients/createTestClient.js';
|
|
23
|
+
/** Default exec using child_process (Node.js only). */
|
|
24
|
+
async function defaultExec(cmd) {
|
|
25
|
+
// Dynamic import to avoid bundling Node.js modules in browser builds
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
const cp = await Function('return import("node:child_process")')();
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
|
+
const util = await Function('return import("node:util")')();
|
|
30
|
+
const execAsync = util.promisify(cp.exec);
|
|
31
|
+
return execAsync(cmd);
|
|
32
|
+
}
|
|
33
|
+
/** Check if cantonctl is available on PATH. */
|
|
34
|
+
async function checkCantonctl(execFn) {
|
|
35
|
+
try {
|
|
36
|
+
await execFn('cantonctl --version');
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Wait for the sandbox health endpoint to respond. */
|
|
44
|
+
async function waitForHealth(url, timeoutMs, fetchFn) {
|
|
45
|
+
const deadline = Date.now() + timeoutMs;
|
|
46
|
+
const interval = 500;
|
|
47
|
+
while (Date.now() < deadline) {
|
|
48
|
+
try {
|
|
49
|
+
const response = await fetchFn(`${url}/livez`);
|
|
50
|
+
if (response.ok)
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Not ready yet
|
|
55
|
+
}
|
|
56
|
+
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
57
|
+
}
|
|
58
|
+
throw new Error(`Canton sandbox did not become ready within ${timeoutMs}ms at ${url}`);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Set up a Canton sandbox for integration testing.
|
|
62
|
+
*
|
|
63
|
+
* Requires `cantonctl` to be installed. Starts a sandbox,
|
|
64
|
+
* waits for it to be ready, and returns a configured TestClient.
|
|
65
|
+
*
|
|
66
|
+
* Call `teardown()` when done to stop the sandbox.
|
|
67
|
+
*/
|
|
68
|
+
export async function setupCantonSandbox(config = {}) {
|
|
69
|
+
const { port = 7575, timeout = 30000, fetchFn = globalThis.fetch, execFn = defaultExec, } = config;
|
|
70
|
+
const url = `http://localhost:${port}`;
|
|
71
|
+
// Check cantonctl is available
|
|
72
|
+
const available = await checkCantonctl(execFn);
|
|
73
|
+
if (!available) {
|
|
74
|
+
throw new Error('cantonctl is not installed or not on PATH.\n' +
|
|
75
|
+
'Install it from: https://github.com/merged-one/cantonctl\n' +
|
|
76
|
+
'Or provide a custom execFn for testing.');
|
|
77
|
+
}
|
|
78
|
+
// Start sandbox
|
|
79
|
+
await execFn(`cantonctl dev start --port ${port}`);
|
|
80
|
+
// Wait for health
|
|
81
|
+
await waitForHealth(url, timeout, fetchFn);
|
|
82
|
+
// Get or generate token
|
|
83
|
+
let token = config.token;
|
|
84
|
+
if (!token) {
|
|
85
|
+
const result = await execFn('cantonctl auth token');
|
|
86
|
+
token = result.stdout.trim();
|
|
87
|
+
}
|
|
88
|
+
// Create transport and client
|
|
89
|
+
const transport = jsonApi({ url, token, fetchFn });
|
|
90
|
+
const party = config.party ?? 'test-party';
|
|
91
|
+
const client = createTestClient({ transport, party });
|
|
92
|
+
return {
|
|
93
|
+
url,
|
|
94
|
+
transport,
|
|
95
|
+
client,
|
|
96
|
+
async teardown() {
|
|
97
|
+
try {
|
|
98
|
+
await execFn(`cantonctl dev stop --port ${port}`);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Best effort cleanup
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=setupSandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupSandbox.js","sourceRoot":"","sources":["../../../src/testing/setupSandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fallback transport — tries transports in order until one succeeds.
|
|
3
|
+
*
|
|
4
|
+
* Useful for high-availability setups where a primary node may be unavailable.
|
|
5
|
+
* On each request, tries the first transport. If it fails with a connection
|
|
6
|
+
* error, tries the next, and so on.
|
|
7
|
+
*/
|
|
8
|
+
import type { Transport } from './types.js';
|
|
9
|
+
export type FallbackTransportConfig = {
|
|
10
|
+
/** Transports to try, in order of preference. */
|
|
11
|
+
readonly transports: readonly Transport[];
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Create a fallback transport that tries multiple transports in sequence.
|
|
15
|
+
*
|
|
16
|
+
* Only retries on connection-level failures (ConnectionError, TimeoutError).
|
|
17
|
+
* Application-level errors (HttpError, 4xx/5xx) are thrown immediately since
|
|
18
|
+
* a different transport would get the same result.
|
|
19
|
+
*/
|
|
20
|
+
export declare function fallback(config: FallbackTransportConfig): Transport;
|
|
21
|
+
//# sourceMappingURL=fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../../src/transport/fallback.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,YAAY,CAAA;AAE7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,iDAAiD;IACjD,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,CAAA;CAC1C,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,uBAAuB,GAAG,SAAS,CA6BnE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fallback transport — tries transports in order until one succeeds.
|
|
3
|
+
*
|
|
4
|
+
* Useful for high-availability setups where a primary node may be unavailable.
|
|
5
|
+
* On each request, tries the first transport. If it fails with a connection
|
|
6
|
+
* error, tries the next, and so on.
|
|
7
|
+
*/
|
|
8
|
+
import { ConnectionError, TimeoutError } from '../errors/transport.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create a fallback transport that tries multiple transports in sequence.
|
|
11
|
+
*
|
|
12
|
+
* Only retries on connection-level failures (ConnectionError, TimeoutError).
|
|
13
|
+
* Application-level errors (HttpError, 4xx/5xx) are thrown immediately since
|
|
14
|
+
* a different transport would get the same result.
|
|
15
|
+
*/
|
|
16
|
+
export function fallback(config) {
|
|
17
|
+
const { transports } = config;
|
|
18
|
+
if (transports.length === 0) {
|
|
19
|
+
throw new Error('fallback() requires at least one transport');
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
type: 'fallback',
|
|
23
|
+
url: transports[0].url,
|
|
24
|
+
async request(args) {
|
|
25
|
+
let lastError;
|
|
26
|
+
for (const transport of transports) {
|
|
27
|
+
try {
|
|
28
|
+
return await transport.request(args);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
lastError = error;
|
|
32
|
+
if (isRetryableError(error)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
throw lastError;
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function isRetryableError(error) {
|
|
43
|
+
return error instanceof ConnectionError || error instanceof TimeoutError;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.js","sourceRoot":"","sources":["../../../src/transport/fallback.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAQtE;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,MAA+B;IACtD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAE7B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,UAAU,CAAC,CAAC,CAAE,CAAC,GAAG;QAEvB,KAAK,CAAC,OAAO,CAAsB,IAAsB;YACvD,IAAI,SAAkB,CAAA;YAEtB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,OAAO,MAAM,SAAS,CAAC,OAAO,CAAY,IAAI,CAAC,CAAA;gBACjD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,SAAS,GAAG,KAAK,CAAA;oBACjB,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC5B,SAAQ;oBACV,CAAC;oBACD,MAAM,KAAK,CAAA;gBACb,CAAC;YACH,CAAC;YAED,MAAM,SAAS,CAAA;QACjB,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,KAAK,YAAY,eAAe,IAAI,KAAK,YAAY,YAAY,CAAA;AAC1E,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gRPC transport factory for Canton Ledger API V2.
|
|
3
|
+
*
|
|
4
|
+
* Uses a custom fetch-based adapter to translate Transport requests into
|
|
5
|
+
* gRPC-Web calls via ConnectRPC's HTTP/2 or HTTP/1.1 protocol. This keeps
|
|
6
|
+
* cantonjs zero-dependency — users bring their own `@connectrpc/connect-web`
|
|
7
|
+
* or `@connectrpc/connect-node` transport.
|
|
8
|
+
*
|
|
9
|
+
* Since Canton's JSON API V2 and gRPC API share the same semantics, this
|
|
10
|
+
* transport maps JSON API paths to gRPC service methods and re-encodes
|
|
11
|
+
* request/response bodies.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* import { grpc } from 'cantonjs'
|
|
15
|
+
* import { createGrpcWebTransport } from '@connectrpc/connect-web'
|
|
16
|
+
*
|
|
17
|
+
* const transport = grpc({
|
|
18
|
+
* url: 'http://localhost:7575',
|
|
19
|
+
* grpcTransport: createGrpcWebTransport({ baseUrl: 'http://localhost:7575' }),
|
|
20
|
+
* })
|
|
21
|
+
*/
|
|
22
|
+
import type { Transport } from './types.js';
|
|
23
|
+
/** Configuration for the gRPC transport. */
|
|
24
|
+
export type GrpcTransportConfig = {
|
|
25
|
+
/** Base URL of the Canton node. */
|
|
26
|
+
readonly url: string;
|
|
27
|
+
/** JWT Bearer token for authentication. */
|
|
28
|
+
readonly token?: string;
|
|
29
|
+
/**
|
|
30
|
+
* A ConnectRPC transport instance (from @connectrpc/connect-web or connect-node).
|
|
31
|
+
* Injected to keep cantonjs zero-dependency.
|
|
32
|
+
*/
|
|
33
|
+
readonly grpcTransport: GrpcTransportLike;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Minimal interface for a ConnectRPC transport.
|
|
37
|
+
* Compatible with @connectrpc/connect's Transport type.
|
|
38
|
+
*/
|
|
39
|
+
export type GrpcTransportLike = {
|
|
40
|
+
readonly unary: (service: unknown, method: unknown, signal: AbortSignal | undefined, timeoutMs: number | undefined, header: unknown, message: unknown) => Promise<{
|
|
41
|
+
readonly message: unknown;
|
|
42
|
+
}>;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Create a gRPC transport for the Canton Ledger API.
|
|
46
|
+
*
|
|
47
|
+
* Requires @connectrpc/connect as a peer dependency (not bundled).
|
|
48
|
+
* Maps Transport requests to gRPC unary calls.
|
|
49
|
+
*/
|
|
50
|
+
export declare function grpc(config: GrpcTransportConfig): Transport;
|
|
51
|
+
//# sourceMappingURL=grpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grpc.d.ts","sourceRoot":"","sources":["../../../src/transport/grpc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,YAAY,CAAA;AAE7D,4CAA4C;AAC5C,MAAM,MAAM,mBAAmB,GAAG;IAChC,mCAAmC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAA;CAC1C,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,KAAK,EAAE,CACd,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,KACb,OAAO,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAC5C,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,mBAAmB,GAAG,SAAS,CA0B3D"}
|