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.
Files changed (374) hide show
  1. package/LICENSE +201 -0
  2. package/dist/cjs/admin/index.d.ts +5 -0
  3. package/dist/cjs/admin/index.d.ts.map +1 -0
  4. package/dist/cjs/admin/index.js +6 -0
  5. package/dist/cjs/admin/index.js.map +1 -0
  6. package/dist/cjs/chains/definitions.d.ts +20 -0
  7. package/dist/cjs/chains/definitions.d.ts.map +1 -0
  8. package/dist/cjs/chains/definitions.js +33 -0
  9. package/dist/cjs/chains/definitions.js.map +1 -0
  10. package/dist/cjs/chains/index.d.ts +2 -0
  11. package/dist/cjs/chains/index.d.ts.map +1 -0
  12. package/dist/cjs/chains/index.js +9 -0
  13. package/dist/cjs/chains/index.js.map +1 -0
  14. package/dist/cjs/clients/createAdminClient.d.ts +73 -0
  15. package/dist/cjs/clients/createAdminClient.d.ts.map +1 -0
  16. package/dist/cjs/clients/createAdminClient.js +205 -0
  17. package/dist/cjs/clients/createAdminClient.js.map +1 -0
  18. package/dist/cjs/clients/createLedgerClient.d.ts +83 -0
  19. package/dist/cjs/clients/createLedgerClient.d.ts.map +1 -0
  20. package/dist/cjs/clients/createLedgerClient.js +240 -0
  21. package/dist/cjs/clients/createLedgerClient.js.map +1 -0
  22. package/dist/cjs/clients/createTestClient.d.ts +27 -0
  23. package/dist/cjs/clients/createTestClient.d.ts.map +1 -0
  24. package/dist/cjs/clients/createTestClient.js +46 -0
  25. package/dist/cjs/clients/createTestClient.js.map +1 -0
  26. package/dist/cjs/clients/index.d.ts +4 -0
  27. package/dist/cjs/clients/index.d.ts.map +1 -0
  28. package/dist/cjs/clients/index.js +10 -0
  29. package/dist/cjs/clients/index.js.map +1 -0
  30. package/dist/cjs/codegen/index.d.ts +2 -0
  31. package/dist/cjs/codegen/index.d.ts.map +1 -0
  32. package/dist/cjs/codegen/index.js +3 -0
  33. package/dist/cjs/codegen/index.js.map +1 -0
  34. package/dist/cjs/codegen/types.d.ts +38 -0
  35. package/dist/cjs/codegen/types.d.ts.map +1 -0
  36. package/dist/cjs/codegen/types.js +9 -0
  37. package/dist/cjs/codegen/types.js.map +1 -0
  38. package/dist/cjs/errors/auth.d.ts +13 -0
  39. package/dist/cjs/errors/auth.d.ts.map +1 -0
  40. package/dist/cjs/errors/auth.js +36 -0
  41. package/dist/cjs/errors/auth.js.map +1 -0
  42. package/dist/cjs/errors/base.d.ts +35 -0
  43. package/dist/cjs/errors/base.d.ts.map +1 -0
  44. package/dist/cjs/errors/base.js +71 -0
  45. package/dist/cjs/errors/base.js.map +1 -0
  46. package/dist/cjs/errors/index.d.ts +6 -0
  47. package/dist/cjs/errors/index.d.ts.map +1 -0
  48. package/dist/cjs/errors/index.js +22 -0
  49. package/dist/cjs/errors/index.js.map +1 -0
  50. package/dist/cjs/errors/ledger.d.ts +22 -0
  51. package/dist/cjs/errors/ledger.d.ts.map +1 -0
  52. package/dist/cjs/errors/ledger.js +55 -0
  53. package/dist/cjs/errors/ledger.js.map +1 -0
  54. package/dist/cjs/errors/streaming.d.ts +20 -0
  55. package/dist/cjs/errors/streaming.d.ts.map +1 -0
  56. package/dist/cjs/errors/streaming.js +54 -0
  57. package/dist/cjs/errors/streaming.js.map +1 -0
  58. package/dist/cjs/errors/transport.d.ts +31 -0
  59. package/dist/cjs/errors/transport.d.ts.map +1 -0
  60. package/dist/cjs/errors/transport.js +63 -0
  61. package/dist/cjs/errors/transport.js.map +1 -0
  62. package/dist/cjs/index.d.ts +25 -0
  63. package/dist/cjs/index.d.ts.map +1 -0
  64. package/dist/cjs/index.js +48 -0
  65. package/dist/cjs/index.js.map +1 -0
  66. package/dist/cjs/ledger/index.d.ts +5 -0
  67. package/dist/cjs/ledger/index.d.ts.map +1 -0
  68. package/dist/cjs/ledger/index.js +6 -0
  69. package/dist/cjs/ledger/index.js.map +1 -0
  70. package/dist/cjs/package.json +1 -0
  71. package/dist/cjs/streaming/createStream.d.ts +55 -0
  72. package/dist/cjs/streaming/createStream.d.ts.map +1 -0
  73. package/dist/cjs/streaming/createStream.js +270 -0
  74. package/dist/cjs/streaming/createStream.js.map +1 -0
  75. package/dist/cjs/streaming/index.d.ts +8 -0
  76. package/dist/cjs/streaming/index.d.ts.map +1 -0
  77. package/dist/cjs/streaming/index.js +16 -0
  78. package/dist/cjs/streaming/index.js.map +1 -0
  79. package/dist/cjs/streaming/streamCompletions.d.ts +25 -0
  80. package/dist/cjs/streaming/streamCompletions.d.ts.map +1 -0
  81. package/dist/cjs/streaming/streamCompletions.js +47 -0
  82. package/dist/cjs/streaming/streamCompletions.js.map +1 -0
  83. package/dist/cjs/streaming/streamContracts.d.ts +42 -0
  84. package/dist/cjs/streaming/streamContracts.d.ts.map +1 -0
  85. package/dist/cjs/streaming/streamContracts.js +56 -0
  86. package/dist/cjs/streaming/streamContracts.js.map +1 -0
  87. package/dist/cjs/streaming/streamUpdates.d.ts +38 -0
  88. package/dist/cjs/streaming/streamUpdates.d.ts.map +1 -0
  89. package/dist/cjs/streaming/streamUpdates.js +66 -0
  90. package/dist/cjs/streaming/streamUpdates.js.map +1 -0
  91. package/dist/cjs/streaming/types.d.ts +111 -0
  92. package/dist/cjs/streaming/types.d.ts.map +1 -0
  93. package/dist/cjs/streaming/types.js +20 -0
  94. package/dist/cjs/streaming/types.js.map +1 -0
  95. package/dist/cjs/testing/index.d.ts +4 -0
  96. package/dist/cjs/testing/index.d.ts.map +1 -0
  97. package/dist/cjs/testing/index.js +11 -0
  98. package/dist/cjs/testing/index.js.map +1 -0
  99. package/dist/cjs/testing/mockTransport.d.ts +80 -0
  100. package/dist/cjs/testing/mockTransport.d.ts.map +1 -0
  101. package/dist/cjs/testing/mockTransport.js +97 -0
  102. package/dist/cjs/testing/mockTransport.js.map +1 -0
  103. package/dist/cjs/testing/setupSandbox.d.ts +62 -0
  104. package/dist/cjs/testing/setupSandbox.d.ts.map +1 -0
  105. package/dist/cjs/testing/setupSandbox.js +109 -0
  106. package/dist/cjs/testing/setupSandbox.js.map +1 -0
  107. package/dist/cjs/transport/fallback.d.ts +21 -0
  108. package/dist/cjs/transport/fallback.d.ts.map +1 -0
  109. package/dist/cjs/transport/fallback.js +48 -0
  110. package/dist/cjs/transport/fallback.js.map +1 -0
  111. package/dist/cjs/transport/grpc.d.ts +51 -0
  112. package/dist/cjs/transport/grpc.d.ts.map +1 -0
  113. package/dist/cjs/transport/grpc.js +90 -0
  114. package/dist/cjs/transport/grpc.js.map +1 -0
  115. package/dist/cjs/transport/index.d.ts +3 -0
  116. package/dist/cjs/transport/index.d.ts.map +1 -0
  117. package/dist/cjs/transport/index.js +6 -0
  118. package/dist/cjs/transport/index.js.map +1 -0
  119. package/dist/cjs/transport/json-api.d.ts +9 -0
  120. package/dist/cjs/transport/json-api.d.ts.map +1 -0
  121. package/dist/cjs/transport/json-api.js +69 -0
  122. package/dist/cjs/transport/json-api.js.map +1 -0
  123. package/dist/cjs/transport/types.d.ts +36 -0
  124. package/dist/cjs/transport/types.d.ts.map +1 -0
  125. package/dist/cjs/transport/types.js +10 -0
  126. package/dist/cjs/transport/types.js.map +1 -0
  127. package/dist/cjs/types/command.d.ts +127 -0
  128. package/dist/cjs/types/command.d.ts.map +1 -0
  129. package/dist/cjs/types/command.js +12 -0
  130. package/dist/cjs/types/command.js.map +1 -0
  131. package/dist/cjs/types/contract.d.ts +104 -0
  132. package/dist/cjs/types/contract.d.ts.map +1 -0
  133. package/dist/cjs/types/contract.js +12 -0
  134. package/dist/cjs/types/contract.js.map +1 -0
  135. package/dist/cjs/types/idp.d.ts +28 -0
  136. package/dist/cjs/types/idp.d.ts.map +1 -0
  137. package/dist/cjs/types/idp.js +9 -0
  138. package/dist/cjs/types/idp.js.map +1 -0
  139. package/dist/cjs/types/index.d.ts +10 -0
  140. package/dist/cjs/types/index.d.ts.map +1 -0
  141. package/dist/cjs/types/index.js +3 -0
  142. package/dist/cjs/types/index.js.map +1 -0
  143. package/dist/cjs/types/interactive.d.ts +47 -0
  144. package/dist/cjs/types/interactive.d.ts.map +1 -0
  145. package/dist/cjs/types/interactive.js +13 -0
  146. package/dist/cjs/types/interactive.js.map +1 -0
  147. package/dist/cjs/types/package.d.ts +15 -0
  148. package/dist/cjs/types/package.d.ts.map +1 -0
  149. package/dist/cjs/types/package.js +8 -0
  150. package/dist/cjs/types/package.js.map +1 -0
  151. package/dist/cjs/types/party.d.ts +32 -0
  152. package/dist/cjs/types/party.d.ts.map +1 -0
  153. package/dist/cjs/types/party.js +10 -0
  154. package/dist/cjs/types/party.js.map +1 -0
  155. package/dist/cjs/types/reassignment.d.ts +65 -0
  156. package/dist/cjs/types/reassignment.d.ts.map +1 -0
  157. package/dist/cjs/types/reassignment.js +10 -0
  158. package/dist/cjs/types/reassignment.js.map +1 -0
  159. package/dist/cjs/types/transaction.d.ts +59 -0
  160. package/dist/cjs/types/transaction.d.ts.map +1 -0
  161. package/dist/cjs/types/transaction.js +13 -0
  162. package/dist/cjs/types/transaction.js.map +1 -0
  163. package/dist/cjs/types/user.d.ts +64 -0
  164. package/dist/cjs/types/user.d.ts.map +1 -0
  165. package/dist/cjs/types/user.js +12 -0
  166. package/dist/cjs/types/user.js.map +1 -0
  167. package/dist/esm/admin/index.d.ts +5 -0
  168. package/dist/esm/admin/index.d.ts.map +1 -0
  169. package/dist/esm/admin/index.js +2 -0
  170. package/dist/esm/admin/index.js.map +1 -0
  171. package/dist/esm/chains/definitions.d.ts +20 -0
  172. package/dist/esm/chains/definitions.d.ts.map +1 -0
  173. package/dist/esm/chains/definitions.js +30 -0
  174. package/dist/esm/chains/definitions.js.map +1 -0
  175. package/dist/esm/chains/index.d.ts +2 -0
  176. package/dist/esm/chains/index.d.ts.map +1 -0
  177. package/dist/esm/chains/index.js +2 -0
  178. package/dist/esm/chains/index.js.map +1 -0
  179. package/dist/esm/clients/createAdminClient.d.ts +73 -0
  180. package/dist/esm/clients/createAdminClient.d.ts.map +1 -0
  181. package/dist/esm/clients/createAdminClient.js +202 -0
  182. package/dist/esm/clients/createAdminClient.js.map +1 -0
  183. package/dist/esm/clients/createLedgerClient.d.ts +83 -0
  184. package/dist/esm/clients/createLedgerClient.d.ts.map +1 -0
  185. package/dist/esm/clients/createLedgerClient.js +237 -0
  186. package/dist/esm/clients/createLedgerClient.js.map +1 -0
  187. package/dist/esm/clients/createTestClient.d.ts +27 -0
  188. package/dist/esm/clients/createTestClient.d.ts.map +1 -0
  189. package/dist/esm/clients/createTestClient.js +43 -0
  190. package/dist/esm/clients/createTestClient.js.map +1 -0
  191. package/dist/esm/clients/index.d.ts +4 -0
  192. package/dist/esm/clients/index.d.ts.map +1 -0
  193. package/dist/esm/clients/index.js +4 -0
  194. package/dist/esm/clients/index.js.map +1 -0
  195. package/dist/esm/codegen/index.d.ts +2 -0
  196. package/dist/esm/codegen/index.d.ts.map +1 -0
  197. package/dist/esm/codegen/index.js +2 -0
  198. package/dist/esm/codegen/index.js.map +1 -0
  199. package/dist/esm/codegen/types.d.ts +38 -0
  200. package/dist/esm/codegen/types.d.ts.map +1 -0
  201. package/dist/esm/codegen/types.js +8 -0
  202. package/dist/esm/codegen/types.js.map +1 -0
  203. package/dist/esm/errors/auth.d.ts +13 -0
  204. package/dist/esm/errors/auth.d.ts.map +1 -0
  205. package/dist/esm/errors/auth.js +31 -0
  206. package/dist/esm/errors/auth.js.map +1 -0
  207. package/dist/esm/errors/base.d.ts +35 -0
  208. package/dist/esm/errors/base.d.ts.map +1 -0
  209. package/dist/esm/errors/base.js +67 -0
  210. package/dist/esm/errors/base.js.map +1 -0
  211. package/dist/esm/errors/index.d.ts +6 -0
  212. package/dist/esm/errors/index.d.ts.map +1 -0
  213. package/dist/esm/errors/index.js +6 -0
  214. package/dist/esm/errors/index.js.map +1 -0
  215. package/dist/esm/errors/ledger.d.ts +22 -0
  216. package/dist/esm/errors/ledger.d.ts.map +1 -0
  217. package/dist/esm/errors/ledger.js +49 -0
  218. package/dist/esm/errors/ledger.js.map +1 -0
  219. package/dist/esm/errors/streaming.d.ts +20 -0
  220. package/dist/esm/errors/streaming.d.ts.map +1 -0
  221. package/dist/esm/errors/streaming.js +48 -0
  222. package/dist/esm/errors/streaming.js.map +1 -0
  223. package/dist/esm/errors/transport.d.ts +31 -0
  224. package/dist/esm/errors/transport.d.ts.map +1 -0
  225. package/dist/esm/errors/transport.js +56 -0
  226. package/dist/esm/errors/transport.js.map +1 -0
  227. package/dist/esm/index.d.ts +25 -0
  228. package/dist/esm/index.d.ts.map +1 -0
  229. package/dist/esm/index.js +18 -0
  230. package/dist/esm/index.js.map +1 -0
  231. package/dist/esm/ledger/index.d.ts +5 -0
  232. package/dist/esm/ledger/index.d.ts.map +1 -0
  233. package/dist/esm/ledger/index.js +2 -0
  234. package/dist/esm/ledger/index.js.map +1 -0
  235. package/dist/esm/streaming/createStream.d.ts +55 -0
  236. package/dist/esm/streaming/createStream.d.ts.map +1 -0
  237. package/dist/esm/streaming/createStream.js +265 -0
  238. package/dist/esm/streaming/createStream.js.map +1 -0
  239. package/dist/esm/streaming/index.d.ts +8 -0
  240. package/dist/esm/streaming/index.d.ts.map +1 -0
  241. package/dist/esm/streaming/index.js +6 -0
  242. package/dist/esm/streaming/index.js.map +1 -0
  243. package/dist/esm/streaming/streamCompletions.d.ts +25 -0
  244. package/dist/esm/streaming/streamCompletions.d.ts.map +1 -0
  245. package/dist/esm/streaming/streamCompletions.js +44 -0
  246. package/dist/esm/streaming/streamCompletions.js.map +1 -0
  247. package/dist/esm/streaming/streamContracts.d.ts +42 -0
  248. package/dist/esm/streaming/streamContracts.d.ts.map +1 -0
  249. package/dist/esm/streaming/streamContracts.js +53 -0
  250. package/dist/esm/streaming/streamContracts.js.map +1 -0
  251. package/dist/esm/streaming/streamUpdates.d.ts +38 -0
  252. package/dist/esm/streaming/streamUpdates.d.ts.map +1 -0
  253. package/dist/esm/streaming/streamUpdates.js +63 -0
  254. package/dist/esm/streaming/streamUpdates.js.map +1 -0
  255. package/dist/esm/streaming/types.d.ts +111 -0
  256. package/dist/esm/streaming/types.d.ts.map +1 -0
  257. package/dist/esm/streaming/types.js +17 -0
  258. package/dist/esm/streaming/types.js.map +1 -0
  259. package/dist/esm/testing/index.d.ts +4 -0
  260. package/dist/esm/testing/index.d.ts.map +1 -0
  261. package/dist/esm/testing/index.js +4 -0
  262. package/dist/esm/testing/index.js.map +1 -0
  263. package/dist/esm/testing/mockTransport.d.ts +80 -0
  264. package/dist/esm/testing/mockTransport.d.ts.map +1 -0
  265. package/dist/esm/testing/mockTransport.js +93 -0
  266. package/dist/esm/testing/mockTransport.js.map +1 -0
  267. package/dist/esm/testing/setupSandbox.d.ts +62 -0
  268. package/dist/esm/testing/setupSandbox.d.ts.map +1 -0
  269. package/dist/esm/testing/setupSandbox.js +106 -0
  270. package/dist/esm/testing/setupSandbox.js.map +1 -0
  271. package/dist/esm/transport/fallback.d.ts +21 -0
  272. package/dist/esm/transport/fallback.d.ts.map +1 -0
  273. package/dist/esm/transport/fallback.js +45 -0
  274. package/dist/esm/transport/fallback.js.map +1 -0
  275. package/dist/esm/transport/grpc.d.ts +51 -0
  276. package/dist/esm/transport/grpc.d.ts.map +1 -0
  277. package/dist/esm/transport/grpc.js +87 -0
  278. package/dist/esm/transport/grpc.js.map +1 -0
  279. package/dist/esm/transport/index.d.ts +3 -0
  280. package/dist/esm/transport/index.d.ts.map +1 -0
  281. package/dist/esm/transport/index.js +2 -0
  282. package/dist/esm/transport/index.js.map +1 -0
  283. package/dist/esm/transport/json-api.d.ts +9 -0
  284. package/dist/esm/transport/json-api.d.ts.map +1 -0
  285. package/dist/esm/transport/json-api.js +66 -0
  286. package/dist/esm/transport/json-api.js.map +1 -0
  287. package/dist/esm/transport/types.d.ts +36 -0
  288. package/dist/esm/transport/types.d.ts.map +1 -0
  289. package/dist/esm/transport/types.js +9 -0
  290. package/dist/esm/transport/types.js.map +1 -0
  291. package/dist/esm/types/command.d.ts +127 -0
  292. package/dist/esm/types/command.d.ts.map +1 -0
  293. package/dist/esm/types/command.js +11 -0
  294. package/dist/esm/types/command.js.map +1 -0
  295. package/dist/esm/types/contract.d.ts +104 -0
  296. package/dist/esm/types/contract.d.ts.map +1 -0
  297. package/dist/esm/types/contract.js +11 -0
  298. package/dist/esm/types/contract.js.map +1 -0
  299. package/dist/esm/types/idp.d.ts +28 -0
  300. package/dist/esm/types/idp.d.ts.map +1 -0
  301. package/dist/esm/types/idp.js +8 -0
  302. package/dist/esm/types/idp.js.map +1 -0
  303. package/dist/esm/types/index.d.ts +10 -0
  304. package/dist/esm/types/index.d.ts.map +1 -0
  305. package/dist/esm/types/index.js +2 -0
  306. package/dist/esm/types/index.js.map +1 -0
  307. package/dist/esm/types/interactive.d.ts +47 -0
  308. package/dist/esm/types/interactive.d.ts.map +1 -0
  309. package/dist/esm/types/interactive.js +12 -0
  310. package/dist/esm/types/interactive.js.map +1 -0
  311. package/dist/esm/types/package.d.ts +15 -0
  312. package/dist/esm/types/package.d.ts.map +1 -0
  313. package/dist/esm/types/package.js +7 -0
  314. package/dist/esm/types/package.js.map +1 -0
  315. package/dist/esm/types/party.d.ts +32 -0
  316. package/dist/esm/types/party.d.ts.map +1 -0
  317. package/dist/esm/types/party.js +9 -0
  318. package/dist/esm/types/party.js.map +1 -0
  319. package/dist/esm/types/reassignment.d.ts +65 -0
  320. package/dist/esm/types/reassignment.d.ts.map +1 -0
  321. package/dist/esm/types/reassignment.js +9 -0
  322. package/dist/esm/types/reassignment.js.map +1 -0
  323. package/dist/esm/types/transaction.d.ts +59 -0
  324. package/dist/esm/types/transaction.d.ts.map +1 -0
  325. package/dist/esm/types/transaction.js +12 -0
  326. package/dist/esm/types/transaction.js.map +1 -0
  327. package/dist/esm/types/user.d.ts +64 -0
  328. package/dist/esm/types/user.d.ts.map +1 -0
  329. package/dist/esm/types/user.js +11 -0
  330. package/dist/esm/types/user.js.map +1 -0
  331. package/dist/tsconfig.build.tsbuildinfo +1 -0
  332. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  333. package/package.json +140 -0
  334. package/src/admin/index.ts +9 -0
  335. package/src/chains/definitions.ts +43 -0
  336. package/src/chains/index.ts +1 -0
  337. package/src/clients/createAdminClient.ts +336 -0
  338. package/src/clients/createLedgerClient.ts +383 -0
  339. package/src/clients/createTestClient.ts +77 -0
  340. package/src/clients/index.ts +19 -0
  341. package/src/codegen/index.ts +6 -0
  342. package/src/codegen/types.ts +51 -0
  343. package/src/errors/auth.ts +33 -0
  344. package/src/errors/base.ts +83 -0
  345. package/src/errors/index.ts +5 -0
  346. package/src/errors/ledger.ts +53 -0
  347. package/src/errors/streaming.ts +51 -0
  348. package/src/errors/transport.ts +65 -0
  349. package/src/index.ts +122 -0
  350. package/src/ledger/index.ts +33 -0
  351. package/src/streaming/createStream.ts +321 -0
  352. package/src/streaming/index.ts +19 -0
  353. package/src/streaming/streamCompletions.ts +49 -0
  354. package/src/streaming/streamContracts.ts +64 -0
  355. package/src/streaming/streamUpdates.ts +67 -0
  356. package/src/streaming/types.ts +117 -0
  357. package/src/testing/index.ts +18 -0
  358. package/src/testing/mockTransport.ts +132 -0
  359. package/src/testing/setupSandbox.ts +163 -0
  360. package/src/transport/fallback.ts +57 -0
  361. package/src/transport/grpc.ts +130 -0
  362. package/src/transport/index.ts +2 -0
  363. package/src/transport/json-api.ts +83 -0
  364. package/src/transport/types.ts +39 -0
  365. package/src/types/command.ts +123 -0
  366. package/src/types/contract.ts +101 -0
  367. package/src/types/idp.ts +31 -0
  368. package/src/types/index.ts +66 -0
  369. package/src/types/interactive.ts +53 -0
  370. package/src/types/package.ts +16 -0
  371. package/src/types/party.ts +33 -0
  372. package/src/types/reassignment.ts +68 -0
  373. package/src/types/transaction.ts +57 -0
  374. package/src/types/user.ts +41 -0
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Stream command completions from Canton's /v2/commands/completions WebSocket endpoint.
3
+ *
4
+ * Yields completion events as an AsyncIterable with auto-reconnect.
5
+ */
6
+
7
+ import type { CompletionEvent, StreamCompletionsOptions } from './types.js'
8
+ import { createStream, toWebSocketUrl } from './createStream.js'
9
+
10
+ /**
11
+ * Stream command completions from a Canton node.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const completions = streamCompletions({
16
+ * url: 'http://localhost:7575',
17
+ * token: jwt,
18
+ * parties: ['Alice::1220'],
19
+ * beginExclusive: 0,
20
+ * })
21
+ *
22
+ * for await (const event of completions) {
23
+ * console.log('Completion:', event.completion.commandId, event.completion.status)
24
+ * }
25
+ * ```
26
+ */
27
+ export function streamCompletions(
28
+ options: StreamCompletionsOptions,
29
+ ): AsyncIterable<CompletionEvent> {
30
+ const wsUrl = toWebSocketUrl(options.url, '/v2/commands/completions')
31
+
32
+ return createStream<CompletionEvent>({
33
+ url: wsUrl,
34
+ token: options.token,
35
+ WebSocket: options.WebSocket,
36
+ signal: options.signal,
37
+ reconnect: options.reconnect,
38
+ bounded: false,
39
+ buildRequest: (lastOffset) => ({
40
+ beginExclusive: lastOffset ?? options.beginExclusive ?? 0,
41
+ parties: options.parties,
42
+ ...(options.applicationId && { applicationId: options.applicationId }),
43
+ }),
44
+ extractOffset: (message) => {
45
+ const msg = message as CompletionEvent
46
+ return msg.completion?.offset
47
+ },
48
+ })
49
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Stream active contracts from Canton's /v2/state/active-contracts WebSocket endpoint.
3
+ *
4
+ * This is a bounded stream: the server sends all matching active contracts
5
+ * and then closes the connection. No auto-reconnect is used.
6
+ */
7
+
8
+ import type { StreamContractsOptions } from './types.js'
9
+ import { createStream, toWebSocketUrl } from './createStream.js'
10
+
11
+ /** Response message from the active contracts stream. */
12
+ export type ActiveContractsResponse = {
13
+ readonly contractEntry?: { readonly [key: string]: unknown }
14
+ readonly offset?: number
15
+ }
16
+
17
+ /**
18
+ * Stream active contracts from a Canton node.
19
+ *
20
+ * The stream yields contract entries matching the provided filters.
21
+ * It is bounded: the server closes the connection when all contracts
22
+ * have been sent.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const contracts = streamContracts({
27
+ * url: 'http://localhost:7575',
28
+ * token: jwt,
29
+ * eventFormat: {
30
+ * filtersByParty: {
31
+ * [party]: { cumulative: [{ identifierFilter: { WildcardFilter: { value: {} } } }] }
32
+ * }
33
+ * }
34
+ * })
35
+ *
36
+ * for await (const entry of contracts) {
37
+ * if (entry.contractEntry && 'JsActiveContract' in entry.contractEntry) {
38
+ * console.log('Contract:', entry.contractEntry.JsActiveContract)
39
+ * }
40
+ * }
41
+ * ```
42
+ */
43
+ export function streamContracts(
44
+ options: StreamContractsOptions,
45
+ ): AsyncIterable<ActiveContractsResponse> {
46
+ const wsUrl = toWebSocketUrl(options.url, '/v2/state/active-contracts')
47
+
48
+ return createStream<ActiveContractsResponse>({
49
+ url: wsUrl,
50
+ token: options.token,
51
+ WebSocket: options.WebSocket,
52
+ signal: options.signal,
53
+ reconnect: false, // Bounded stream — no reconnect
54
+ bounded: true,
55
+ buildRequest: () => ({
56
+ eventFormat: options.eventFormat,
57
+ ...(options.activeAtOffset !== undefined && { activeAtOffset: options.activeAtOffset }),
58
+ }),
59
+ extractOffset: (message) => {
60
+ const msg = message as ActiveContractsResponse
61
+ return msg.offset
62
+ },
63
+ })
64
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Stream updates from Canton's /v2/updates WebSocket endpoint.
3
+ *
4
+ * Yields TaggedUpdate messages (Transaction, Reassignment, OffsetCheckpoint,
5
+ * TopologyTransaction) as an AsyncIterable with auto-reconnect.
6
+ */
7
+
8
+ import type { TaggedUpdate } from '../types/transaction.js'
9
+ import type { StreamUpdatesOptions } from './types.js'
10
+ import { createStream, toWebSocketUrl } from './createStream.js'
11
+
12
+ /**
13
+ * Stream ledger updates from a Canton node.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const updates = streamUpdates({
18
+ * url: 'http://localhost:7575',
19
+ * token: jwt,
20
+ * beginExclusive: 0,
21
+ * updateFormat: {
22
+ * includeTransactions: {
23
+ * transactionShape: 'TRANSACTION_SHAPE_ACS_DELTA',
24
+ * eventFormat: {
25
+ * filtersByParty: {
26
+ * [party]: { cumulative: [{ identifierFilter: { WildcardFilter: { value: {} } } }] }
27
+ * }
28
+ * }
29
+ * }
30
+ * }
31
+ * })
32
+ *
33
+ * for await (const update of updates) {
34
+ * if ('Transaction' in update) {
35
+ * console.log('Transaction:', update.Transaction.value.updateId)
36
+ * }
37
+ * }
38
+ * ```
39
+ */
40
+ export function streamUpdates(options: StreamUpdatesOptions): AsyncIterable<TaggedUpdate> {
41
+ const wsUrl = toWebSocketUrl(options.url, '/v2/updates')
42
+ const isOpen = options.endInclusive === undefined
43
+
44
+ return createStream<TaggedUpdate>({
45
+ url: wsUrl,
46
+ token: options.token,
47
+ WebSocket: options.WebSocket,
48
+ signal: options.signal,
49
+ reconnect: isOpen ? options.reconnect : false,
50
+ bounded: !isOpen,
51
+ buildRequest: (lastOffset) => ({
52
+ beginExclusive: lastOffset ?? options.beginExclusive ?? 0,
53
+ ...(options.endInclusive !== undefined && { endInclusive: options.endInclusive }),
54
+ ...(options.updateFormat && { updateFormat: options.updateFormat }),
55
+ }),
56
+ extractOffset: (message) => {
57
+ const msg = message as TaggedUpdate
58
+ if ('Transaction' in msg) {
59
+ return msg.Transaction.value.offset
60
+ }
61
+ if ('OffsetCheckpoint' in msg) {
62
+ return msg.OffsetCheckpoint.value.offset
63
+ }
64
+ return undefined
65
+ },
66
+ })
67
+ }
@@ -0,0 +1,117 @@
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
+
11
+ import type { EventFormat } from '../types/command.js'
12
+
13
+ /**
14
+ * WebSocket constructor type.
15
+ * Accepts browser-native WebSocket or Node.js `ws` package.
16
+ */
17
+ export type WebSocketConstructor = {
18
+ new (url: string, protocols?: string | string[]): WebSocketLike
19
+ }
20
+
21
+ /** Minimal WebSocket interface needed by the streaming layer. */
22
+ export type WebSocketLike = {
23
+ readyState: number
24
+ onopen: ((event: unknown) => void) | null
25
+ onmessage: ((event: { data: unknown }) => void) | null
26
+ onerror: ((event: unknown) => void) | null
27
+ onclose: ((event: { code: number; reason: string }) => void) | null
28
+ close(code?: number, reason?: string): void
29
+ send(data: string): void
30
+ }
31
+
32
+ /** WebSocket readyState constants. */
33
+ export const WS_READY_STATE = {
34
+ CONNECTING: 0,
35
+ OPEN: 1,
36
+ CLOSING: 2,
37
+ CLOSED: 3,
38
+ } as const
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
+
54
+ /** Base options shared by all stream functions. */
55
+ export type StreamOptions = {
56
+ /** Base URL of the Canton node (http/https, will be converted to ws/wss). */
57
+ readonly url: string
58
+ /** JWT token for authentication. */
59
+ readonly token?: string
60
+ /** WebSocket constructor to use. Defaults to globalThis.WebSocket. */
61
+ readonly WebSocket?: WebSocketConstructor
62
+ /** AbortSignal to cancel the stream. */
63
+ readonly signal?: AbortSignal
64
+ /** Reconnection configuration. Set to false to disable auto-reconnect. */
65
+ readonly reconnect?: ReconnectConfig | false
66
+ }
67
+
68
+ /** Options for the /v2/updates stream. */
69
+ export type StreamUpdatesOptions = StreamOptions & {
70
+ /** Start reading after this offset (exclusive). */
71
+ readonly beginExclusive?: number
72
+ /** Stop reading at this offset (inclusive). Omit for open-ended stream. */
73
+ readonly endInclusive?: number
74
+ /** Format for received updates. */
75
+ readonly updateFormat?: {
76
+ readonly includeTransactions?: {
77
+ readonly transactionShape:
78
+ | 'TRANSACTION_SHAPE_ACS_DELTA'
79
+ | 'TRANSACTION_SHAPE_LEDGER_EFFECTS'
80
+ readonly eventFormat: EventFormat
81
+ }
82
+ readonly includeReassignments?: EventFormat
83
+ readonly includeTopologyEvents?: unknown
84
+ }
85
+ }
86
+
87
+ /** Options for the /v2/state/active-contracts stream. */
88
+ export type StreamContractsOptions = StreamOptions & {
89
+ /** Event format with party filters. */
90
+ readonly eventFormat: EventFormat
91
+ /** Offset to read the ACS at. Omit for current. */
92
+ readonly activeAtOffset?: number
93
+ }
94
+
95
+ /** Options for the /v2/commands/completions stream. */
96
+ export type StreamCompletionsOptions = StreamOptions & {
97
+ /** Start reading after this offset (exclusive). */
98
+ readonly beginExclusive?: number
99
+ /** Parties whose completions to receive. */
100
+ readonly parties: readonly string[]
101
+ /** Application ID filter. */
102
+ readonly applicationId?: string
103
+ }
104
+
105
+ /** Completion event from the completions stream. */
106
+ export type CompletionEvent = {
107
+ readonly completion: {
108
+ readonly commandId: string
109
+ readonly updateId?: string
110
+ readonly status?: {
111
+ readonly code: number
112
+ readonly message: string
113
+ }
114
+ readonly offset?: number
115
+ readonly synchronizerId?: string
116
+ }
117
+ }
@@ -0,0 +1,18 @@
1
+ export {
2
+ createTestClient,
3
+ type TestClient,
4
+ type TestClientConfig,
5
+ } from '../clients/createTestClient.js'
6
+
7
+ export {
8
+ setupCantonSandbox,
9
+ type SandboxConfig,
10
+ type SandboxContext,
11
+ } from './setupSandbox.js'
12
+
13
+ export {
14
+ createMockTransport,
15
+ createRecordingTransport,
16
+ type RecordedExchange,
17
+ type RequestMatcher,
18
+ } from './mockTransport.js'
@@ -0,0 +1,132 @@
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
+ import type { Transport, TransportRequest } from '../transport/types.js'
10
+
11
+ /** A recorded request/response pair. */
12
+ export type RecordedExchange = {
13
+ readonly request: {
14
+ readonly method: string
15
+ readonly path: string
16
+ readonly body?: unknown
17
+ }
18
+ readonly response: unknown
19
+ }
20
+
21
+ /** Matcher for routing mock responses. */
22
+ export type RequestMatcher = {
23
+ /** HTTP method to match. If omitted, matches any method. */
24
+ readonly method?: string
25
+ /** Path prefix or exact path to match. */
26
+ readonly path: string
27
+ /** Response to return when matched. */
28
+ readonly response: unknown
29
+ }
30
+
31
+ /**
32
+ * Create a mock transport that returns pre-configured responses.
33
+ *
34
+ * Responses are matched by path (prefix match) and optionally method.
35
+ * If no matcher is found, returns the `defaultResponse` or throws.
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * const transport = createMockTransport({
40
+ * matchers: [
41
+ * { path: '/v2/parties', response: { partyDetails: [] } },
42
+ * { method: 'POST', path: '/v2/commands', response: { transaction: { ... } } },
43
+ * ],
44
+ * })
45
+ *
46
+ * const client = createLedgerClient({ transport, actAs: party })
47
+ * ```
48
+ */
49
+ export function createMockTransport(options: {
50
+ matchers?: readonly RequestMatcher[]
51
+ defaultResponse?: unknown
52
+ url?: string
53
+ } = {}): Transport & { readonly calls: readonly RecordedExchange[] } {
54
+ const { matchers = [], defaultResponse, url = 'http://mock:7575' } = options
55
+ const calls: RecordedExchange[] = []
56
+
57
+ return {
58
+ type: 'mock',
59
+ url,
60
+ calls,
61
+
62
+ async request<TResponse>(args: TransportRequest): Promise<TResponse> {
63
+ const matcher = matchers.find((m) => {
64
+ if (m.method && m.method !== args.method) return false
65
+ return args.path.startsWith(m.path)
66
+ })
67
+
68
+ const response = matcher?.response ?? defaultResponse
69
+ if (response === undefined) {
70
+ throw new Error(
71
+ `No mock response for ${args.method} ${args.path}. ` +
72
+ `Add a matcher or set defaultResponse.`,
73
+ )
74
+ }
75
+
76
+ calls.push({
77
+ request: { method: args.method, path: args.path, body: args.body },
78
+ response,
79
+ })
80
+
81
+ return response as TResponse
82
+ },
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Create a transport that records all exchanges from a real transport.
88
+ *
89
+ * Wraps an existing transport and stores every request/response pair.
90
+ * Use `transport.recordings` to access recorded exchanges for replay.
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * const real = jsonApi({ url: 'http://localhost:7575', token: jwt })
95
+ * const recording = createRecordingTransport(real)
96
+ *
97
+ * // Use recording transport with your client...
98
+ * const client = createLedgerClient({ transport: recording, actAs: party })
99
+ * await client.queryContracts(templateId)
100
+ *
101
+ * // Later, replay the recordings
102
+ * const replay = createMockTransport({
103
+ * matchers: recording.recordings.map(r => ({
104
+ * method: r.request.method,
105
+ * path: r.request.path,
106
+ * response: r.response,
107
+ * })),
108
+ * })
109
+ * ```
110
+ */
111
+ export function createRecordingTransport(
112
+ inner: Transport,
113
+ ): Transport & { readonly recordings: readonly RecordedExchange[] } {
114
+ const recordings: RecordedExchange[] = []
115
+
116
+ return {
117
+ type: `recording(${inner.type})`,
118
+ url: inner.url,
119
+ recordings,
120
+
121
+ async request<TResponse>(args: TransportRequest): Promise<TResponse> {
122
+ const response = await inner.request<TResponse>(args)
123
+
124
+ recordings.push({
125
+ request: { method: args.method, path: args.path, body: args.body },
126
+ response,
127
+ })
128
+
129
+ return response
130
+ },
131
+ }
132
+ }
@@ -0,0 +1,163 @@
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
+
22
+ import { jsonApi } from '../transport/json-api.js'
23
+ import { createTestClient, type TestClient } from '../clients/createTestClient.js'
24
+ import type { Transport } from '../transport/types.js'
25
+ import type { Party } from '../types/party.js'
26
+
27
+ /** Configuration for sandbox setup. */
28
+ export type SandboxConfig = {
29
+ /** Port for the JSON API. Default: 7575. */
30
+ readonly port?: number
31
+ /** Timeout in milliseconds for sandbox to become ready. Default: 30000. */
32
+ readonly timeout?: number
33
+ /** JWT token. If not provided, attempts to use cantonctl auth. */
34
+ readonly token?: string
35
+ /** Party for the TestClient. Default: allocated via sandbox. */
36
+ readonly party?: Party
37
+ /** Custom fetch implementation (for testing the fixture itself). */
38
+ readonly fetchFn?: typeof fetch
39
+ /** Custom exec implementation (for testing the fixture itself). */
40
+ readonly execFn?: (cmd: string) => Promise<{ stdout: string; stderr: string }>
41
+ }
42
+
43
+ /** Result from setupCantonSandbox(). */
44
+ export type SandboxContext = {
45
+ /** The base URL of the running sandbox JSON API. */
46
+ readonly url: string
47
+ /** The transport connected to the sandbox. */
48
+ readonly transport: Transport
49
+ /** A fully configured TestClient. */
50
+ readonly client: TestClient
51
+ /** Tear down the sandbox. */
52
+ readonly teardown: () => Promise<void>
53
+ }
54
+
55
+ /** Default exec using child_process (Node.js only). */
56
+ async function defaultExec(cmd: string): Promise<{ stdout: string; stderr: string }> {
57
+ // Dynamic import to avoid bundling Node.js modules in browser builds
58
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
+ const cp = await (Function('return import("node:child_process")')() as Promise<any>)
60
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
+ const util = await (Function('return import("node:util")')() as Promise<any>)
62
+ const execAsync = util.promisify(cp.exec)
63
+ return execAsync(cmd) as Promise<{ stdout: string; stderr: string }>
64
+ }
65
+
66
+ /** Check if cantonctl is available on PATH. */
67
+ async function checkCantonctl(
68
+ execFn: (cmd: string) => Promise<{ stdout: string; stderr: string }>,
69
+ ): Promise<boolean> {
70
+ try {
71
+ await execFn('cantonctl --version')
72
+ return true
73
+ } catch {
74
+ return false
75
+ }
76
+ }
77
+
78
+ /** Wait for the sandbox health endpoint to respond. */
79
+ async function waitForHealth(
80
+ url: string,
81
+ timeoutMs: number,
82
+ fetchFn: typeof fetch,
83
+ ): Promise<void> {
84
+ const deadline = Date.now() + timeoutMs
85
+ const interval = 500
86
+
87
+ while (Date.now() < deadline) {
88
+ try {
89
+ const response = await fetchFn(`${url}/livez`)
90
+ if (response.ok) return
91
+ } catch {
92
+ // Not ready yet
93
+ }
94
+ await new Promise((resolve) => setTimeout(resolve, interval))
95
+ }
96
+
97
+ throw new Error(
98
+ `Canton sandbox did not become ready within ${timeoutMs}ms at ${url}`,
99
+ )
100
+ }
101
+
102
+ /**
103
+ * Set up a Canton sandbox for integration testing.
104
+ *
105
+ * Requires `cantonctl` to be installed. Starts a sandbox,
106
+ * waits for it to be ready, and returns a configured TestClient.
107
+ *
108
+ * Call `teardown()` when done to stop the sandbox.
109
+ */
110
+ export async function setupCantonSandbox(
111
+ config: SandboxConfig = {},
112
+ ): Promise<SandboxContext> {
113
+ const {
114
+ port = 7575,
115
+ timeout = 30000,
116
+ fetchFn = globalThis.fetch,
117
+ execFn = defaultExec,
118
+ } = config
119
+
120
+ const url = `http://localhost:${port}`
121
+
122
+ // Check cantonctl is available
123
+ const available = await checkCantonctl(execFn)
124
+ if (!available) {
125
+ throw new Error(
126
+ 'cantonctl is not installed or not on PATH.\n' +
127
+ 'Install it from: https://github.com/merged-one/cantonctl\n' +
128
+ 'Or provide a custom execFn for testing.',
129
+ )
130
+ }
131
+
132
+ // Start sandbox
133
+ await execFn(`cantonctl dev start --port ${port}`)
134
+
135
+ // Wait for health
136
+ await waitForHealth(url, timeout, fetchFn)
137
+
138
+ // Get or generate token
139
+ let token = config.token
140
+ if (!token) {
141
+ const result = await execFn('cantonctl auth token')
142
+ token = result.stdout.trim()
143
+ }
144
+
145
+ // Create transport and client
146
+ const transport = jsonApi({ url, token, fetchFn })
147
+
148
+ const party = config.party ?? ('test-party' as Party)
149
+ const client = createTestClient({ transport, party })
150
+
151
+ return {
152
+ url,
153
+ transport,
154
+ client,
155
+ async teardown() {
156
+ try {
157
+ await execFn(`cantonctl dev stop --port ${port}`)
158
+ } catch {
159
+ // Best effort cleanup
160
+ }
161
+ },
162
+ }
163
+ }
@@ -0,0 +1,57 @@
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
+
9
+ import { ConnectionError, TimeoutError } from '../errors/transport.js'
10
+ import type { Transport, TransportRequest } from './types.js'
11
+
12
+ export type FallbackTransportConfig = {
13
+ /** Transports to try, in order of preference. */
14
+ readonly transports: readonly Transport[]
15
+ }
16
+
17
+ /**
18
+ * Create a fallback transport that tries multiple transports in sequence.
19
+ *
20
+ * Only retries on connection-level failures (ConnectionError, TimeoutError).
21
+ * Application-level errors (HttpError, 4xx/5xx) are thrown immediately since
22
+ * a different transport would get the same result.
23
+ */
24
+ export function fallback(config: FallbackTransportConfig): Transport {
25
+ const { transports } = config
26
+
27
+ if (transports.length === 0) {
28
+ throw new Error('fallback() requires at least one transport')
29
+ }
30
+
31
+ return {
32
+ type: 'fallback',
33
+ url: transports[0]!.url,
34
+
35
+ async request<TResponse = unknown>(args: TransportRequest): Promise<TResponse> {
36
+ let lastError: unknown
37
+
38
+ for (const transport of transports) {
39
+ try {
40
+ return await transport.request<TResponse>(args)
41
+ } catch (error) {
42
+ lastError = error
43
+ if (isRetryableError(error)) {
44
+ continue
45
+ }
46
+ throw error
47
+ }
48
+ }
49
+
50
+ throw lastError
51
+ },
52
+ }
53
+ }
54
+
55
+ function isRetryableError(error: unknown): boolean {
56
+ return error instanceof ConnectionError || error instanceof TimeoutError
57
+ }