@geeqdev/geeq-sdk 0.1.1 → 0.2.0

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 (272) hide show
  1. package/dist/src/address/record-type.d.ts +10 -0
  2. package/dist/src/address/record-type.js +59 -0
  3. package/dist/src/address/record-type.js.map +1 -0
  4. package/dist/src/address/wallet-address.d.ts +34 -0
  5. package/dist/src/address/wallet-address.js +90 -0
  6. package/dist/src/address/wallet-address.js.map +1 -0
  7. package/dist/src/amount.d.ts +43 -0
  8. package/dist/src/amount.js +105 -0
  9. package/dist/src/amount.js.map +1 -0
  10. package/dist/src/assert.d.ts +12 -0
  11. package/dist/src/assert.js +24 -0
  12. package/dist/src/assert.js.map +1 -0
  13. package/dist/src/capnp/adminNetTx.capnp.d.ts +75 -0
  14. package/dist/src/capnp/adminNetTx.capnp.js +66 -0
  15. package/dist/src/capnp/adminNetTx.capnp.js.map +1 -0
  16. package/dist/src/capnp/appLayBlock.capnp.d.ts +26 -0
  17. package/dist/src/capnp/appLayBlock.capnp.js +24 -0
  18. package/dist/src/capnp/appLayBlock.capnp.js.map +1 -0
  19. package/dist/src/capnp/appLayLedger.capnp.d.ts +34 -0
  20. package/dist/src/capnp/appLayLedger.capnp.js +32 -0
  21. package/dist/src/capnp/appLayLedger.capnp.js.map +1 -0
  22. package/dist/src/capnp/appLayRec.capnp.d.ts +129 -0
  23. package/dist/src/capnp/appLayRec.capnp.js +156 -0
  24. package/dist/src/capnp/appLayRec.capnp.js.map +1 -0
  25. package/dist/src/capnp/chainStateView.capnp.d.ts +50 -0
  26. package/dist/src/capnp/chainStateView.capnp.js +48 -0
  27. package/dist/src/capnp/chainStateView.capnp.js.map +1 -0
  28. package/dist/src/capnp/coinAcctRec.capnp.d.ts +178 -0
  29. package/dist/src/capnp/coinAcctRec.capnp.js +189 -0
  30. package/dist/src/capnp/coinAcctRec.capnp.js.map +1 -0
  31. package/dist/src/capnp/genesisBlock.capnp.d.ts +61 -0
  32. package/dist/src/capnp/genesisBlock.capnp.js +55 -0
  33. package/dist/src/capnp/genesisBlock.capnp.js.map +1 -0
  34. package/dist/src/capnp/hubContentStmt.capnp.d.ts +63 -0
  35. package/dist/src/capnp/hubContentStmt.capnp.js +57 -0
  36. package/dist/src/capnp/hubContentStmt.capnp.js.map +1 -0
  37. package/dist/src/capnp/misc.capnp.d.ts +20 -0
  38. package/dist/src/capnp/misc.capnp.js +18 -0
  39. package/dist/src/capnp/misc.capnp.js.map +1 -0
  40. package/dist/src/capnp/netActorRec.capnp.d.ts +65 -0
  41. package/dist/src/capnp/netActorRec.capnp.js +65 -0
  42. package/dist/src/capnp/netActorRec.capnp.js.map +1 -0
  43. package/dist/src/capnp/nodeContentStmt.capnp.d.ts +67 -0
  44. package/dist/src/capnp/nodeContentStmt.capnp.js +61 -0
  45. package/dist/src/capnp/nodeContentStmt.capnp.js.map +1 -0
  46. package/dist/src/capnp/nodePayloadList.capnp.d.ts +28 -0
  47. package/dist/src/capnp/nodePayloadList.capnp.js +26 -0
  48. package/dist/src/capnp/nodePayloadList.capnp.js.map +1 -0
  49. package/dist/src/capnp/nodeTxList.capnp.d.ts +36 -0
  50. package/dist/src/capnp/nodeTxList.capnp.js +34 -0
  51. package/dist/src/capnp/nodeTxList.capnp.js.map +1 -0
  52. package/dist/src/capnp/paramAcctRec.capnp.d.ts +338 -0
  53. package/dist/src/capnp/paramAcctRec.capnp.js +669 -0
  54. package/dist/src/capnp/paramAcctRec.capnp.js.map +1 -0
  55. package/dist/src/capnp/payload.capnp.d.ts +237 -0
  56. package/dist/src/capnp/payload.capnp.js +260 -0
  57. package/dist/src/capnp/payload.capnp.js.map +1 -0
  58. package/dist/src/capnp/proxyAcctRec.capnp.d.ts +223 -0
  59. package/dist/src/capnp/proxyAcctRec.capnp.js +255 -0
  60. package/dist/src/capnp/proxyAcctRec.capnp.js.map +1 -0
  61. package/dist/src/capnp/relayContentStmt.capnp.d.ts +82 -0
  62. package/dist/src/capnp/relayContentStmt.capnp.js +85 -0
  63. package/dist/src/capnp/relayContentStmt.capnp.js.map +1 -0
  64. package/dist/src/capnp/sysAcctRec.capnp.d.ts +48 -0
  65. package/dist/src/capnp/sysAcctRec.capnp.js +46 -0
  66. package/dist/src/capnp/sysAcctRec.capnp.js.map +1 -0
  67. package/dist/src/capnp/userAppTx.capnp.d.ts +230 -0
  68. package/dist/src/capnp/userAppTx.capnp.js +270 -0
  69. package/dist/src/capnp/userAppTx.capnp.js.map +1 -0
  70. package/dist/src/capnp/userValTx.capnp.d.ts +1575 -0
  71. package/dist/src/capnp/userValTx.capnp.js +2004 -0
  72. package/dist/src/capnp/userValTx.capnp.js.map +1 -0
  73. package/dist/src/capnp/valLayBlock.capnp.d.ts +88 -0
  74. package/dist/src/capnp/valLayBlock.capnp.js +86 -0
  75. package/dist/src/capnp/valLayBlock.capnp.js.map +1 -0
  76. package/dist/src/capnp/valLayLedger.capnp.d.ts +85 -0
  77. package/dist/src/capnp/valLayLedger.capnp.js +75 -0
  78. package/dist/src/capnp/valLayLedger.capnp.js.map +1 -0
  79. package/dist/src/chain/geeq-chain.d.ts +474 -0
  80. package/dist/src/chain/geeq-chain.js +721 -0
  81. package/dist/src/chain/geeq-chain.js.map +1 -0
  82. package/dist/src/chain/geeq-node.d.ts +57 -0
  83. package/dist/src/chain/geeq-node.js +62 -0
  84. package/dist/src/chain/geeq-node.js.map +1 -0
  85. package/dist/src/chain/nonce-guard.d.ts +42 -0
  86. package/dist/src/chain/nonce-guard.js +68 -0
  87. package/dist/src/chain/nonce-guard.js.map +1 -0
  88. package/dist/src/chain/select.d.ts +40 -0
  89. package/dist/src/chain/select.js +114 -0
  90. package/dist/src/chain/select.js.map +1 -0
  91. package/dist/src/crypto/account-id.d.ts +35 -0
  92. package/dist/src/crypto/account-id.js +58 -0
  93. package/dist/src/crypto/account-id.js.map +1 -0
  94. package/dist/src/crypto/keypair.d.ts +24 -0
  95. package/dist/src/crypto/keypair.js +158 -0
  96. package/dist/src/crypto/keypair.js.map +1 -0
  97. package/dist/src/crypto/mnemonic.d.ts +34 -0
  98. package/dist/src/crypto/mnemonic.js +57 -0
  99. package/dist/src/crypto/mnemonic.js.map +1 -0
  100. package/dist/src/encoding/base64.d.ts +8 -0
  101. package/dist/src/encoding/base64.js +53 -0
  102. package/dist/src/encoding/base64.js.map +1 -0
  103. package/dist/src/encoding/hex.d.ts +2 -0
  104. package/dist/src/encoding/hex.js +35 -0
  105. package/dist/src/encoding/hex.js.map +1 -0
  106. package/dist/src/errors.d.ts +83 -0
  107. package/dist/src/errors.js +49 -0
  108. package/dist/src/errors.js.map +1 -0
  109. package/dist/src/index.d.ts +59 -0
  110. package/dist/src/index.js +53 -0
  111. package/dist/src/index.js.map +1 -0
  112. package/dist/src/ledger/coin-accounts.d.ts +42 -0
  113. package/dist/src/ledger/coin-accounts.js +37 -0
  114. package/dist/src/ledger/coin-accounts.js.map +1 -0
  115. package/dist/src/ledger/decode.d.ts +18 -0
  116. package/dist/src/ledger/decode.js +113 -0
  117. package/dist/src/ledger/decode.js.map +1 -0
  118. package/dist/src/ledger/geeq-ledger.d.ts +99 -0
  119. package/dist/src/ledger/geeq-ledger.js +125 -0
  120. package/dist/src/ledger/geeq-ledger.js.map +1 -0
  121. package/dist/src/ledger/net-actors.d.ts +65 -0
  122. package/dist/src/ledger/net-actors.js +53 -0
  123. package/dist/src/ledger/net-actors.js.map +1 -0
  124. package/dist/src/ledger/nft-records.d.ts +13 -0
  125. package/dist/src/ledger/nft-records.js +41 -0
  126. package/dist/src/ledger/nft-records.js.map +1 -0
  127. package/dist/src/ledger/params.d.ts +34 -0
  128. package/dist/src/ledger/params.js +71 -0
  129. package/dist/src/ledger/params.js.map +1 -0
  130. package/dist/src/ledger/proxy-accounts.d.ts +26 -0
  131. package/dist/src/ledger/proxy-accounts.js +27 -0
  132. package/dist/src/ledger/proxy-accounts.js.map +1 -0
  133. package/dist/src/net/discovery.d.ts +62 -0
  134. package/dist/src/net/discovery.js +136 -0
  135. package/dist/src/net/discovery.js.map +1 -0
  136. package/dist/src/net/explorer.d.ts +57 -0
  137. package/dist/src/net/explorer.js +64 -0
  138. package/dist/src/net/explorer.js.map +1 -0
  139. package/dist/src/net/read-ledger.d.ts +7 -0
  140. package/dist/src/net/read-ledger.js +39 -0
  141. package/dist/src/net/read-ledger.js.map +1 -0
  142. package/dist/src/net/routes.d.ts +49 -0
  143. package/dist/src/net/routes.js +70 -0
  144. package/dist/src/net/routes.js.map +1 -0
  145. package/dist/src/net/transport.d.ts +55 -0
  146. package/dist/src/net/transport.js +168 -0
  147. package/dist/src/net/transport.js.map +1 -0
  148. package/dist/src/net/websocket.d.ts +49 -0
  149. package/dist/src/net/websocket.js +54 -0
  150. package/dist/src/net/websocket.js.map +1 -0
  151. package/dist/src/runtime/bindings.d.ts +9 -0
  152. package/dist/src/runtime/bindings.js +27 -0
  153. package/dist/src/runtime/bindings.js.map +1 -0
  154. package/dist/src/runtime/init.d.ts +13 -0
  155. package/dist/src/runtime/init.js +40 -0
  156. package/dist/src/runtime/init.js.map +1 -0
  157. package/dist/src/runtime/wasm-loader.browser.d.ts +14 -0
  158. package/dist/src/runtime/wasm-loader.browser.js +20 -0
  159. package/dist/src/runtime/wasm-loader.browser.js.map +1 -0
  160. package/dist/src/runtime/wasm-loader.node.d.ts +7 -0
  161. package/dist/src/runtime/wasm-loader.node.js +14 -0
  162. package/dist/src/runtime/wasm-loader.node.js.map +1 -0
  163. package/dist/src/socket/geeq-socket.d.ts +232 -0
  164. package/dist/src/socket/geeq-socket.js +634 -0
  165. package/dist/src/socket/geeq-socket.js.map +1 -0
  166. package/dist/src/socket/tracked-tx.d.ts +148 -0
  167. package/dist/src/socket/tracked-tx.js +212 -0
  168. package/dist/src/socket/tracked-tx.js.map +1 -0
  169. package/dist/src/socket/tx-status.d.ts +69 -0
  170. package/dist/src/socket/tx-status.js +72 -0
  171. package/dist/src/socket/tx-status.js.map +1 -0
  172. package/dist/src/tx/attestation.d.ts +60 -0
  173. package/dist/src/tx/attestation.js +163 -0
  174. package/dist/src/tx/attestation.js.map +1 -0
  175. package/dist/src/tx/content.d.ts +27 -0
  176. package/dist/src/tx/content.js +62 -0
  177. package/dist/src/tx/content.js.map +1 -0
  178. package/dist/src/tx/encode.d.ts +60 -0
  179. package/dist/src/tx/encode.js +82 -0
  180. package/dist/src/tx/encode.js.map +1 -0
  181. package/dist/src/tx/expiry.d.ts +11 -0
  182. package/dist/src/tx/expiry.js +12 -0
  183. package/dist/src/tx/expiry.js.map +1 -0
  184. package/dist/src/tx/fee.d.ts +16 -0
  185. package/dist/src/tx/fee.js +29 -0
  186. package/dist/src/tx/fee.js.map +1 -0
  187. package/dist/src/tx/metadata.d.ts +39 -0
  188. package/dist/src/tx/metadata.js +66 -0
  189. package/dist/src/tx/metadata.js.map +1 -0
  190. package/dist/src/tx/nft.d.ts +16 -0
  191. package/dist/src/tx/nft.js +98 -0
  192. package/dist/src/tx/nft.js.map +1 -0
  193. package/dist/src/tx/proxy.d.ts +37 -0
  194. package/dist/src/tx/proxy.js +134 -0
  195. package/dist/src/tx/proxy.js.map +1 -0
  196. package/dist/src/tx/transfer.d.ts +31 -0
  197. package/dist/src/tx/transfer.js +123 -0
  198. package/dist/src/tx/transfer.js.map +1 -0
  199. package/dist/src/types.d.ts +448 -0
  200. package/dist/src/types.js +2 -0
  201. package/dist/src/types.js.map +1 -0
  202. package/dist/tests/account-id.test.d.ts +1 -0
  203. package/dist/tests/account-id.test.js +27 -0
  204. package/dist/tests/account-id.test.js.map +1 -0
  205. package/dist/tests/amount.test.d.ts +1 -0
  206. package/dist/tests/amount.test.js +113 -0
  207. package/dist/tests/amount.test.js.map +1 -0
  208. package/dist/tests/attestation.test.d.ts +1 -0
  209. package/dist/tests/attestation.test.js +182 -0
  210. package/dist/tests/attestation.test.js.map +1 -0
  211. package/dist/tests/chain.test.d.ts +1 -0
  212. package/dist/tests/chain.test.js +647 -0
  213. package/dist/tests/chain.test.js.map +1 -0
  214. package/dist/tests/content.test.d.ts +1 -0
  215. package/dist/tests/content.test.js +90 -0
  216. package/dist/tests/content.test.js.map +1 -0
  217. package/dist/tests/documented-api.test.d.ts +1 -0
  218. package/dist/tests/documented-api.test.js +229 -0
  219. package/dist/tests/documented-api.test.js.map +1 -0
  220. package/dist/tests/explorer.test.d.ts +1 -0
  221. package/dist/tests/explorer.test.js +95 -0
  222. package/dist/tests/explorer.test.js.map +1 -0
  223. package/dist/tests/fee.test.d.ts +1 -0
  224. package/dist/tests/fee.test.js +179 -0
  225. package/dist/tests/fee.test.js.map +1 -0
  226. package/dist/tests/fixtures/build-vll.d.ts +71 -0
  227. package/dist/tests/fixtures/build-vll.js +141 -0
  228. package/dist/tests/fixtures/build-vll.js.map +1 -0
  229. package/dist/tests/fixtures/fake-socket.d.ts +44 -0
  230. package/dist/tests/fixtures/fake-socket.js +93 -0
  231. package/dist/tests/fixtures/fake-socket.js.map +1 -0
  232. package/dist/tests/fixtures/fake-transport.d.ts +24 -0
  233. package/dist/tests/fixtures/fake-transport.js +30 -0
  234. package/dist/tests/fixtures/fake-transport.js.map +1 -0
  235. package/dist/tests/keypair.test.d.ts +1 -0
  236. package/dist/tests/keypair.test.js +163 -0
  237. package/dist/tests/keypair.test.js.map +1 -0
  238. package/dist/tests/ledger.test.d.ts +1 -0
  239. package/dist/tests/ledger.test.js +234 -0
  240. package/dist/tests/ledger.test.js.map +1 -0
  241. package/dist/tests/mnemonic.test.d.ts +1 -0
  242. package/dist/tests/mnemonic.test.js +97 -0
  243. package/dist/tests/mnemonic.test.js.map +1 -0
  244. package/dist/tests/nft-transfer.test.d.ts +1 -0
  245. package/dist/tests/nft-transfer.test.js +170 -0
  246. package/dist/tests/nft-transfer.test.js.map +1 -0
  247. package/dist/tests/nft.test.d.ts +1 -0
  248. package/dist/tests/nft.test.js +180 -0
  249. package/dist/tests/nft.test.js.map +1 -0
  250. package/dist/tests/offline.test.d.ts +1 -0
  251. package/dist/tests/offline.test.js +95 -0
  252. package/dist/tests/offline.test.js.map +1 -0
  253. package/dist/tests/proxy.test.d.ts +1 -0
  254. package/dist/tests/proxy.test.js +183 -0
  255. package/dist/tests/proxy.test.js.map +1 -0
  256. package/dist/tests/select.test.d.ts +1 -0
  257. package/dist/tests/select.test.js +200 -0
  258. package/dist/tests/select.test.js.map +1 -0
  259. package/dist/tests/socket.test.d.ts +1 -0
  260. package/dist/tests/socket.test.js +607 -0
  261. package/dist/tests/socket.test.js.map +1 -0
  262. package/dist/tests/transfer.test.d.ts +1 -0
  263. package/dist/tests/transfer.test.js +225 -0
  264. package/dist/tests/transfer.test.js.map +1 -0
  265. package/dist/tests/wallet-address.test.d.ts +1 -0
  266. package/dist/tests/wallet-address.test.js +101 -0
  267. package/dist/tests/wallet-address.test.js.map +1 -0
  268. package/dist/tests/wasm-loader.jest.d.ts +13 -0
  269. package/dist/tests/wasm-loader.jest.js +15 -0
  270. package/dist/tests/wasm-loader.jest.js.map +1 -0
  271. package/package.json +2 -2
  272. package/tsconfig.json +2 -1
@@ -0,0 +1,634 @@
1
+ import { MAX_UINT32, assertDuration } from '../assert';
2
+ import { originOf } from '../chain/select';
3
+ import { resolveAccountId } from '../crypto/account-id';
4
+ import { fromBase64, toBase64 } from '../encoding/base64';
5
+ import { GeeqError, invalidArgument, invalidKey, socketClosed, socketUnreachable, } from '../errors';
6
+ import { socketRoute } from '../net/routes';
7
+ import { WEBSOCKET_OPEN, assertSocketSchemeReachable, defaultWebSocketFactory, opaqueSocketFailureMessage, } from '../net/websocket';
8
+ import { GeeqTrackedTx, reportListenerError } from './tracked-tx';
9
+ import { parseTxStatus } from './tx-status';
10
+ const DEFAULT_OPEN_TIMEOUT_MS = 15_000;
11
+ /** The edge proxy drops a socket idle for 60 s; the production wallet pings every 25. */
12
+ const DEFAULT_HEARTBEAT_MS = 25_000;
13
+ const DEFAULT_RECONNECT_DELAY_MS = 1_000;
14
+ const DEFAULT_MAX_RECONNECT_DELAY_MS = 30_000;
15
+ /**
16
+ * A transaction targets a block no more than ten behind the chain's head, so after about
17
+ * ten block intervals it has either been decided or never will be. Five minutes covers
18
+ * that at the ~20 s interval with room for a slow block.
19
+ */
20
+ const DEFAULT_TRACK_TIMEOUT_MS = 5 * 60_000;
21
+ /** Long enough for the next commit to carry a restarted node's buffer forward. */
22
+ const DEFAULT_NONSANE_GRACE_MS = 30_000;
23
+ const KEY_BYTES = 32;
24
+ function dispatch(listeners, value) {
25
+ if (listeners === undefined)
26
+ return;
27
+ // A copy, so a listener that removes itself does not skip its neighbour.
28
+ for (const listener of [...listeners]) {
29
+ try {
30
+ listener(value);
31
+ }
32
+ catch (error) {
33
+ reportListenerError(error);
34
+ }
35
+ }
36
+ }
37
+ function socketUrlOf(options) {
38
+ const raw = options.url !== undefined
39
+ ? String(options.url)
40
+ : socketRoute(originOf(options.endpoint));
41
+ let parsed;
42
+ try {
43
+ parsed = new URL(raw);
44
+ }
45
+ catch (cause) {
46
+ throw invalidArgument('url must be an absolute socket URL such as wss://1.2.3.4:2082/ws/, received ' +
47
+ `${JSON.stringify(raw)}.`, cause);
48
+ }
49
+ if (parsed.protocol !== 'ws:' && parsed.protocol !== 'wss:') {
50
+ throw invalidArgument(`url must use ws:// or wss://, received ${JSON.stringify(raw)}. To derive the socket ` +
51
+ 'from a node URL, pass it as endpoint instead.');
52
+ }
53
+ return parsed.href;
54
+ }
55
+ /**
56
+ * Every key a node might file an account's events under.
57
+ *
58
+ * Nodes have keyed per-account events by the base64 public key and, since 2026-09, by the
59
+ * base64 account id; which one a socket server matches is not visible from here. So an
60
+ * account named by its public key is subscribed under both, as the production wallet does.
61
+ */
62
+ function keysOf(ref) {
63
+ if (typeof ref === 'string') {
64
+ const bytes = fromBase64(ref, 'account key');
65
+ if (bytes.length !== KEY_BYTES) {
66
+ throw invalidArgument(`An account key must be the base64 of a ${KEY_BYTES}-byte public key or account id, ` +
67
+ `received ${bytes.length} bytes.`);
68
+ }
69
+ return [ref];
70
+ }
71
+ const accountId = toBase64(resolveAccountId(ref));
72
+ if (ref instanceof Uint8Array)
73
+ return [accountId];
74
+ const { publicKey } = ref;
75
+ if (publicKey === undefined)
76
+ return [accountId];
77
+ if (!(publicKey instanceof Uint8Array) || publicKey.length !== KEY_BYTES) {
78
+ throw invalidKey(`publicKey must be ${KEY_BYTES} bytes.`);
79
+ }
80
+ return [toBase64(publicKey), accountId];
81
+ }
82
+ function closeQuietly(socket) {
83
+ if (socket === null)
84
+ return;
85
+ try {
86
+ socket.close();
87
+ }
88
+ catch {
89
+ // Already closing, or never opened. Either way there is nothing left to release.
90
+ }
91
+ }
92
+ /**
93
+ * A node's WebSocket: the channel through which it reports what happened to the
94
+ * transactions you sent, and pushes account and chain updates.
95
+ *
96
+ * One class for every use an application has for the socket:
97
+ *
98
+ * - {@link track} a transaction you are about to submit, and get its verdict;
99
+ * - {@link subscribe} to accounts and read their events with {@link on};
100
+ * - {@link send} any frame the node understands, and receive any it sends.
101
+ *
102
+ * The protocol's hazards are handled here, once: subscriptions replace rather than add,
103
+ * so the full set of keys is always sent; the node forgets a connection's subscriptions
104
+ * when it drops, so they are replayed on every reconnect before anything is announced;
105
+ * the edge proxy drops an idle socket, so it is kept alive; a transaction's first status
106
+ * is not always its last, so {@link GeeqTrackedTx} decides when it is final.
107
+ *
108
+ * ```ts
109
+ * const socket = await GeeqSocket.connect({ endpoint: chain.endpoint })
110
+ * const tx = await chain.createTransfer({ from, to, amount })
111
+ * const tracked = await socket.track(tx) // before submitting — always
112
+ * const response = await fetch(submitRoute(tx.nodeUrl), { … })
113
+ * if (!response.ok) tracked.refused({ status: response.status })
114
+ * const outcome = await tracked.settled()
115
+ * ```
116
+ *
117
+ * In a reactive framework, mark an instance raw (Vue's `markRaw`) rather than letting it
118
+ * be proxied — a proxied native WebSocket throws on every call.
119
+ */
120
+ export class GeeqSocket {
121
+ /** @internal */
122
+ constructor(init) {
123
+ this.url = init.url;
124
+ const hidden = (key, value, writable = false) => {
125
+ Object.defineProperty(this, key, { value, enumerable: false, writable });
126
+ };
127
+ hidden('factory', init.factory);
128
+ hidden('openTimeoutMs', init.openTimeoutMs);
129
+ hidden('heartbeatMs', init.heartbeatMs);
130
+ hidden('reconnects', init.reconnect);
131
+ hidden('reconnectDelayMs', init.reconnectDelayMs);
132
+ hidden('maxReconnectDelayMs', init.maxReconnectDelayMs);
133
+ hidden('persisted', new Map());
134
+ hidden('told', new Map());
135
+ hidden('keys', new Set());
136
+ hidden('tracked', new Map());
137
+ hidden('eventListeners', new Map());
138
+ hidden('messageListeners', new Set());
139
+ hidden('statusListeners', new Set());
140
+ hidden('stateListeners', new Set());
141
+ hidden('waiters', new Set());
142
+ hidden('socket', null, true);
143
+ hidden('current', 'connecting', true);
144
+ hidden('everOpened', false, true);
145
+ hidden('attempts', 0, true);
146
+ hidden('openTimer', null, true);
147
+ hidden('reconnectTimer', null, true);
148
+ hidden('heartbeatTimer', null, true);
149
+ }
150
+ /**
151
+ * Open a node's socket and resolve once it is open.
152
+ *
153
+ * Throws `socket-unreachable` if the first handshake fails, rather than retrying
154
+ * quietly: a socket that never opened is almost always a certificate, a mixed-content
155
+ * page or a wrong URL, and retrying hides which. After that first open, a drop is
156
+ * retried automatically and reported through {@link onConnectionChange}.
157
+ */
158
+ static async connect(options) {
159
+ if ((options.endpoint === undefined) === (options.url === undefined)) {
160
+ throw invalidArgument('Provide exactly one of endpoint (the node you submit to — its socket URL is ' +
161
+ 'derived from it) or url (a socket URL, such as ws://10.0.0.1:3100/ws/ for a ' +
162
+ 'local harness).');
163
+ }
164
+ assertDuration(options.openTimeoutMs, 'openTimeoutMs');
165
+ assertDuration(options.heartbeatMs, 'heartbeatMs');
166
+ assertDuration(options.reconnectDelayMs, 'reconnectDelayMs');
167
+ assertDuration(options.maxReconnectDelayMs, 'maxReconnectDelayMs');
168
+ const url = socketUrlOf(options);
169
+ assertSocketSchemeReachable(url);
170
+ const { signal } = options;
171
+ if (signal?.aborted === true)
172
+ throw signal.reason;
173
+ const socket = new GeeqSocket({
174
+ url,
175
+ factory: options.webSocket ?? defaultWebSocketFactory,
176
+ openTimeoutMs: options.openTimeoutMs ?? DEFAULT_OPEN_TIMEOUT_MS,
177
+ heartbeatMs: options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS,
178
+ reconnect: options.reconnect ?? true,
179
+ reconnectDelayMs: options.reconnectDelayMs ?? DEFAULT_RECONNECT_DELAY_MS,
180
+ maxReconnectDelayMs: options.maxReconnectDelayMs ?? DEFAULT_MAX_RECONNECT_DELAY_MS,
181
+ });
182
+ let onAbort;
183
+ try {
184
+ await new Promise((resolve, reject) => {
185
+ // No timer of its own: the handshake's timeout is the deadline.
186
+ socket.waiters.add({ resolve, reject });
187
+ if (signal !== undefined) {
188
+ onAbort = () => reject(signal.reason);
189
+ signal.addEventListener('abort', onAbort);
190
+ }
191
+ socket.dial();
192
+ });
193
+ }
194
+ catch (error) {
195
+ socket.dispose();
196
+ throw error;
197
+ }
198
+ finally {
199
+ if (onAbort !== undefined)
200
+ signal?.removeEventListener('abort', onAbort);
201
+ }
202
+ return socket;
203
+ }
204
+ /** Where the connection stands. See {@link GeeqSocketState}. */
205
+ get state() {
206
+ return this.current;
207
+ }
208
+ /** Every account key subscribed so far, base64. The set only grows. */
209
+ get subscriptions() {
210
+ return [...this.keys];
211
+ }
212
+ /**
213
+ * Subscribe to accounts' events: their transactions' statuses and record updates.
214
+ *
215
+ * Takes a keypair, a `{ publicKey }`, a 32-byte account id, a base64 key, or a list of
216
+ * them. The node has no unsubscribe and treats every subscription as a replacement, so
217
+ * this adds to the set this socket holds and sends all of it — calling it for one
218
+ * account never silences another. Resolves once the node has been told.
219
+ */
220
+ async subscribe(accounts) {
221
+ this.assertOpenable('subscribe');
222
+ const list = (Array.isArray(accounts) ? accounts : [accounts]);
223
+ // Resolve every key before adding any, so one bad entry does not half-apply the list.
224
+ const resolved = list.flatMap(keysOf);
225
+ for (const key of resolved)
226
+ this.keys.add(key);
227
+ return this.send('client', { publicKeys: [...this.keys] }, { replay: true });
228
+ }
229
+ /** Ask for events from now, or from a block. Replayed on reconnect. */
230
+ async listen(options = {}) {
231
+ const { blockNumber } = options;
232
+ if (blockNumber !== undefined &&
233
+ (!Number.isInteger(blockNumber) || blockNumber < 0 || blockNumber > MAX_UINT32)) {
234
+ throw invalidArgument(`blockNumber must be a block number, received ${String(blockNumber)}.`);
235
+ }
236
+ return this.send('listen', { ...(blockNumber === undefined ? {} : { blockNumber }), now: options.now ?? true }, { replay: true });
237
+ }
238
+ /**
239
+ * Subscribe to the whole chain's record feed — every account, fee and parameter update.
240
+ * What a block explorer or an indexer wants; an ordinary application does not.
241
+ */
242
+ async subscribeBlockExplorer() {
243
+ return this.send('block-explorer', undefined, { replay: true });
244
+ }
245
+ /**
246
+ * Send a frame, `{ event, payload }`, waiting for the connection if it is down.
247
+ *
248
+ * The escape hatch for anything the node understands that this class has no method
249
+ * for. Rejects with `socket-unreachable` if the socket does not reopen within
250
+ * `openTimeoutMs` — a replayed frame is still kept, and goes out when it does.
251
+ */
252
+ async send(event, payload, options = {}) {
253
+ this.assertOpenable('send');
254
+ if (typeof event !== 'string' || event === '') {
255
+ throw invalidArgument('event must be a non-empty string.');
256
+ }
257
+ const frame = JSON.stringify(payload === undefined ? { event } : { event, payload });
258
+ const replay = options.replay === true;
259
+ if (replay)
260
+ this.persisted.set(event, frame);
261
+ // Resolves only once the frame has actually gone out. A socket can be open by our
262
+ // books and already closing by its own — its close event not yet delivered — and a
263
+ // subscription reported as sent when it was not would break track()'s promise.
264
+ for (;;) {
265
+ await this.whenOpen();
266
+ // A newer frame for the same event may have replaced this one while we waited; the
267
+ // node must end up with the newest, and a replacement makes the older one moot.
268
+ const latest = replay ? (this.persisted.get(event) ?? frame) : frame;
269
+ if (this.transmit(event, latest, replay))
270
+ return;
271
+ }
272
+ }
273
+ /**
274
+ * Follow a transaction to its verdict. Call it **before** submitting.
275
+ *
276
+ * Subscribes the signer — the node pushes a transaction's statuses only to connections
277
+ * subscribed to its account — and resolves once the node has been told, so a status
278
+ * cannot arrive before anyone is listening for it. If this throws, do not submit: a
279
+ * transaction sent with no way to hear its verdict leaves the user guessing.
280
+ *
281
+ * Tracking the same transaction twice returns the same handle.
282
+ */
283
+ async track(tx, options = {}) {
284
+ this.assertOpenable('track');
285
+ const hash = tx?.transactionHash;
286
+ if (!(hash instanceof Uint8Array) || hash.length !== KEY_BYTES) {
287
+ throw invalidArgument(`tx must carry a ${KEY_BYTES}-byte transactionHash — pass the transaction the SDK ` +
288
+ 'built.');
289
+ }
290
+ assertDuration(options.timeoutMs, 'timeoutMs');
291
+ assertDuration(options.nonsaneGraceMs, 'nonsaneGraceMs');
292
+ const accounts = [
293
+ ...(tx.publicKey === undefined ? [] : [{ publicKey: tx.publicKey }]),
294
+ ...(options.accounts ?? []),
295
+ ];
296
+ if (accounts.length === 0) {
297
+ throw invalidArgument('This transaction does not say who signed it, so there is no account to subscribe ' +
298
+ 'to for its status. Pass the signer in accounts.');
299
+ }
300
+ const id = toBase64(hash);
301
+ const existing = this.tracked.get(id);
302
+ const tracked = existing ??
303
+ new GeeqTrackedTx({
304
+ id,
305
+ timeoutMs: options.timeoutMs ?? DEFAULT_TRACK_TIMEOUT_MS,
306
+ nonsaneGraceMs: options.nonsaneGraceMs ?? DEFAULT_NONSANE_GRACE_MS,
307
+ detach: () => {
308
+ if (this.tracked.get(id) === tracked)
309
+ this.tracked.delete(id);
310
+ },
311
+ });
312
+ // Registered before the subscription goes out, so nothing can slip between them.
313
+ this.tracked.set(id, tracked);
314
+ try {
315
+ await this.subscribe(accounts);
316
+ }
317
+ catch (error) {
318
+ if (existing === undefined)
319
+ tracked.release();
320
+ throw error;
321
+ }
322
+ return tracked;
323
+ }
324
+ /**
325
+ * Call `listener` with the payload of every frame named `event`, whatever it is —
326
+ * `'uut_status'`, `'coin-account-update'`, `'fee-update'`, or one this SDK has never
327
+ * heard of. Returns the function that removes it.
328
+ */
329
+ on(event, listener) {
330
+ let listeners = this.eventListeners.get(event);
331
+ if (listeners === undefined) {
332
+ listeners = new Set();
333
+ this.eventListeners.set(event, listeners);
334
+ }
335
+ const set = listeners;
336
+ set.add(listener);
337
+ return () => {
338
+ set.delete(listener);
339
+ if (set.size === 0 && this.eventListeners.get(event) === set) {
340
+ this.eventListeners.delete(event);
341
+ }
342
+ };
343
+ }
344
+ /** Call `listener` with every JSON frame the node sends. */
345
+ onMessage(listener) {
346
+ this.messageListeners.add(listener);
347
+ return () => {
348
+ this.messageListeners.delete(listener);
349
+ };
350
+ }
351
+ /** Call `listener` with every transaction status, tracked or not, already parsed. */
352
+ onTxStatus(listener) {
353
+ this.statusListeners.add(listener);
354
+ return () => {
355
+ this.statusListeners.delete(listener);
356
+ };
357
+ }
358
+ /** Call `listener` whenever {@link state} changes. */
359
+ onConnectionChange(listener) {
360
+ this.stateListeners.add(listener);
361
+ return () => {
362
+ this.stateListeners.delete(listener);
363
+ };
364
+ }
365
+ /**
366
+ * Close for good. Pending sends reject with `socket-closed`, and every transaction still
367
+ * being tracked settles `unknown` with reason `closed` — it may yet be decided, just
368
+ * not heard about here.
369
+ */
370
+ dispose() {
371
+ if (this.current === 'closed')
372
+ return;
373
+ this.setState('closed');
374
+ for (const timer of [this.openTimer, this.reconnectTimer]) {
375
+ if (timer !== null)
376
+ clearTimeout(timer);
377
+ }
378
+ this.openTimer = null;
379
+ this.reconnectTimer = null;
380
+ this.stopHeartbeat();
381
+ const socket = this.socket;
382
+ this.socket = null;
383
+ closeQuietly(socket);
384
+ const closed = socketClosed(`The socket at ${this.url} was disposed.`);
385
+ for (const waiter of [...this.waiters])
386
+ waiter.reject(closed);
387
+ this.waiters.clear();
388
+ for (const tracked of [...this.tracked.values()]) {
389
+ tracked.abandon('closed', `The socket was closed while transaction ${tracked.id} was pending. It may still be ` +
390
+ 'decided; check the ledger before sending it again.');
391
+ }
392
+ this.tracked.clear();
393
+ this.eventListeners.clear();
394
+ this.messageListeners.clear();
395
+ this.statusListeners.clear();
396
+ this.stateListeners.clear();
397
+ }
398
+ toJSON() {
399
+ return {
400
+ url: this.url,
401
+ state: this.current,
402
+ subscriptions: this.keys.size,
403
+ tracking: this.tracked.size,
404
+ };
405
+ }
406
+ toString() {
407
+ return `GeeqSocket(${this.url}, ${this.current})`;
408
+ }
409
+ assertOpenable(what) {
410
+ if (this.current === 'closed') {
411
+ throw socketClosed(`${what}() was called on a disposed socket (${this.url}). Connect a new one.`);
412
+ }
413
+ }
414
+ setState(next) {
415
+ if (this.current === next)
416
+ return;
417
+ this.current = next;
418
+ dispatch(this.stateListeners, next);
419
+ }
420
+ /** Resolves when the socket is open, or rejects after `openTimeoutMs` or on dispose. */
421
+ whenOpen() {
422
+ if (this.current === 'open')
423
+ return Promise.resolve();
424
+ if (this.current === 'closed') {
425
+ return Promise.reject(socketClosed(`The socket at ${this.url} was disposed.`));
426
+ }
427
+ return new Promise((resolve, reject) => {
428
+ let timer = null;
429
+ const waiter = {
430
+ resolve: () => {
431
+ if (timer !== null)
432
+ clearTimeout(timer);
433
+ resolve();
434
+ },
435
+ reject: (error) => {
436
+ if (timer !== null)
437
+ clearTimeout(timer);
438
+ reject(error);
439
+ },
440
+ };
441
+ if (this.openTimeoutMs > 0) {
442
+ timer = setTimeout(() => {
443
+ this.waiters.delete(waiter);
444
+ reject(socketUnreachable(`The socket at ${this.url} is ${this.current} and did not reopen within ` +
445
+ `${this.openTimeoutMs}ms. It keeps retrying; anything sent with replay ` +
446
+ 'will go out when it does.'));
447
+ }, this.openTimeoutMs);
448
+ }
449
+ this.waiters.add(waiter);
450
+ });
451
+ }
452
+ dial() {
453
+ let socket;
454
+ try {
455
+ socket = this.factory(this.url);
456
+ }
457
+ catch (cause) {
458
+ this.attemptFailed(cause instanceof GeeqError
459
+ ? cause
460
+ : socketUnreachable(opaqueSocketFailureMessage(this.url), cause));
461
+ return;
462
+ }
463
+ this.socket = socket;
464
+ // A new connection has been told nothing, so nothing may be suppressed as a repeat.
465
+ this.told.clear();
466
+ if (this.openTimeoutMs > 0) {
467
+ this.openTimer = setTimeout(() => {
468
+ if (this.socket !== socket)
469
+ return;
470
+ this.socket = null;
471
+ closeQuietly(socket);
472
+ this.attemptFailed(socketUnreachable(`The socket at ${this.url} did not open within ${this.openTimeoutMs}ms. ` +
473
+ opaqueSocketFailureMessage(this.url)));
474
+ }, this.openTimeoutMs);
475
+ }
476
+ // A superseded socket can still fire; only the current one may drive state.
477
+ socket.addEventListener('open', () => {
478
+ if (this.socket === socket)
479
+ this.opened();
480
+ });
481
+ socket.addEventListener('message', (event) => {
482
+ if (this.socket === socket)
483
+ this.receive(event.data);
484
+ });
485
+ socket.addEventListener('close', () => {
486
+ if (this.socket !== socket)
487
+ return;
488
+ this.socket = null;
489
+ this.attemptFailed(socketUnreachable(opaqueSocketFailureMessage(this.url)));
490
+ });
491
+ socket.addEventListener('error', () => {
492
+ // A 'close' always follows, and that is where the drop is handled. The listener
493
+ // must still exist: the `ws` package throws an unhandled 'error' otherwise.
494
+ });
495
+ }
496
+ opened() {
497
+ if (this.openTimer !== null)
498
+ clearTimeout(this.openTimer);
499
+ this.openTimer = null;
500
+ this.everOpened = true;
501
+ // Restore everything this connection should hold before announcing it, so a listener
502
+ // reacting to 'open' finds the subscriptions already in force. If it drops part way,
503
+ // the next connection replays the lot.
504
+ for (const [event, frame] of this.persisted) {
505
+ if (!this.transmit(event, frame, true))
506
+ return;
507
+ }
508
+ // Only now is it a working connection. Resetting the backoff any earlier would let a
509
+ // connection that dies while its subscriptions are replayed be redialled every second
510
+ // for ever.
511
+ this.attempts = 0;
512
+ this.startHeartbeat();
513
+ this.setState('open');
514
+ for (const waiter of [...this.waiters])
515
+ waiter.resolve();
516
+ this.waiters.clear();
517
+ }
518
+ /** A handshake failed, or an open socket dropped. */
519
+ attemptFailed(error) {
520
+ if (this.openTimer !== null)
521
+ clearTimeout(this.openTimer);
522
+ this.openTimer = null;
523
+ this.stopHeartbeat();
524
+ if (this.current === 'closed')
525
+ return;
526
+ if (!this.everOpened) {
527
+ // Still inside connect(): report it, and let connect() dispose.
528
+ for (const waiter of [...this.waiters])
529
+ waiter.reject(error);
530
+ this.waiters.clear();
531
+ return;
532
+ }
533
+ if (!this.reconnects) {
534
+ this.dispose();
535
+ return;
536
+ }
537
+ this.setState('reconnecting');
538
+ if (this.reconnectTimer !== null)
539
+ return;
540
+ const delay = Math.min(this.reconnectDelayMs * 2 ** this.attempts, this.maxReconnectDelayMs);
541
+ this.attempts += 1;
542
+ this.reconnectTimer = setTimeout(() => {
543
+ this.reconnectTimer = null;
544
+ if (this.current !== 'closed')
545
+ this.dial();
546
+ }, delay);
547
+ }
548
+ /**
549
+ * Put one frame on the current connection. True once it is there — or already was.
550
+ *
551
+ * False means the connection is gone. If our books still said it was open, it is
552
+ * treated as the drop it is, here and now, so the caller waits for the next connection
553
+ * instead of spinning on this one.
554
+ */
555
+ transmit(event, frame, dedupe) {
556
+ // The node treats every subscription frame as a fresh subscribe, so an identical
557
+ // repeat on the same connection is dropped here instead.
558
+ if (dedupe && this.told.get(event) === frame)
559
+ return true;
560
+ const socket = this.socket;
561
+ if (socket === null)
562
+ return false;
563
+ if (socket.readyState === WEBSOCKET_OPEN) {
564
+ try {
565
+ socket.send(frame);
566
+ if (dedupe)
567
+ this.told.set(event, frame);
568
+ return true;
569
+ }
570
+ catch {
571
+ // Closing underneath us. Handled below, as for any other drop.
572
+ }
573
+ }
574
+ this.socket = null;
575
+ closeQuietly(socket);
576
+ this.attemptFailed(socketUnreachable(opaqueSocketFailureMessage(this.url)));
577
+ return false;
578
+ }
579
+ receive(data) {
580
+ const text = typeof data === 'string'
581
+ ? data
582
+ : data instanceof ArrayBuffer || ArrayBuffer.isView(data)
583
+ ? new TextDecoder().decode(data)
584
+ : undefined;
585
+ if (text === undefined)
586
+ return;
587
+ let parsed;
588
+ try {
589
+ parsed = JSON.parse(text);
590
+ }
591
+ catch {
592
+ // Heartbeat replies and other non-JSON frames are not events.
593
+ return;
594
+ }
595
+ if (parsed === null || typeof parsed !== 'object')
596
+ return;
597
+ const { event, payload } = parsed;
598
+ if (typeof event !== 'string')
599
+ return;
600
+ dispatch(this.messageListeners, Object.freeze({ event, payload }));
601
+ dispatch(this.eventListeners.get(event), payload);
602
+ if (event !== 'uut_status')
603
+ return;
604
+ const status = parseTxStatus(payload);
605
+ if (status === undefined)
606
+ return;
607
+ dispatch(this.statusListeners, status);
608
+ this.tracked.get(status.id)?.receive(status);
609
+ }
610
+ startHeartbeat() {
611
+ this.stopHeartbeat();
612
+ if (this.heartbeatMs <= 0)
613
+ return;
614
+ this.heartbeatTimer = setInterval(() => {
615
+ const socket = this.socket;
616
+ if (socket === null || socket.readyState !== WEBSOCKET_OPEN)
617
+ return;
618
+ try {
619
+ // A raw text frame, not JSON: there is no protocol ping, and a browser cannot send
620
+ // a control frame. Any reply is non-JSON and ignored.
621
+ socket.send('ping');
622
+ }
623
+ catch {
624
+ // The close handler reconnects.
625
+ }
626
+ }, this.heartbeatMs);
627
+ }
628
+ stopHeartbeat() {
629
+ if (this.heartbeatTimer !== null)
630
+ clearInterval(this.heartbeatTimer);
631
+ this.heartbeatTimer = null;
632
+ }
633
+ }
634
+ //# sourceMappingURL=geeq-socket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geeq-socket.js","sourceRoot":"","sources":["../../../src/socket/geeq-socket.ts"],"names":[],"mappings":"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"}