@aztec/foundation 0.1.0-alpha10

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 (414) hide show
  1. package/.eslintrc.cjs +103 -0
  2. package/.prettierrc.json +6 -0
  3. package/.tsbuildinfo +1 -0
  4. package/README.md +1 -0
  5. package/dest/abi/index.d.ts +137 -0
  6. package/dest/abi/index.d.ts.map +1 -0
  7. package/dest/abi/index.js +18 -0
  8. package/dest/async-map/async_map.test.d.ts +2 -0
  9. package/dest/async-map/async_map.test.d.ts.map +1 -0
  10. package/dest/async-map/async_map.test.js +9 -0
  11. package/dest/async-map/index.d.ts +13 -0
  12. package/dest/async-map/index.d.ts.map +1 -0
  13. package/dest/async-map/index.js +19 -0
  14. package/dest/aztec-address/index.d.ts +96 -0
  15. package/dest/aztec-address/index.d.ts.map +1 -0
  16. package/dest/aztec-address/index.js +124 -0
  17. package/dest/bigint-buffer/bigint-buffer.test.d.ts +2 -0
  18. package/dest/bigint-buffer/bigint-buffer.test.d.ts.map +1 -0
  19. package/dest/bigint-buffer/bigint-buffer.test.js +18 -0
  20. package/dest/bigint-buffer/index.d.ts +35 -0
  21. package/dest/bigint-buffer/index.d.ts.map +1 -0
  22. package/dest/bigint-buffer/index.js +68 -0
  23. package/dest/collection/array.d.ts +30 -0
  24. package/dest/collection/array.d.ts.map +1 -0
  25. package/dest/collection/array.js +47 -0
  26. package/dest/collection/index.d.ts +2 -0
  27. package/dest/collection/index.d.ts.map +1 -0
  28. package/dest/collection/index.js +2 -0
  29. package/dest/crypto/index.d.ts +4 -0
  30. package/dest/crypto/index.d.ts.map +1 -0
  31. package/dest/crypto/index.js +4 -0
  32. package/dest/crypto/keccak/index.d.ts +20 -0
  33. package/dest/crypto/keccak/index.d.ts.map +1 -0
  34. package/dest/crypto/keccak/index.js +31 -0
  35. package/dest/crypto/random/index.d.ts +3 -0
  36. package/dest/crypto/random/index.d.ts.map +1 -0
  37. package/dest/crypto/random/index.js +36 -0
  38. package/dest/crypto/random/index.test.d.ts +2 -0
  39. package/dest/crypto/random/index.test.d.ts.map +1 -0
  40. package/dest/crypto/random/index.test.js +13 -0
  41. package/dest/crypto/sha256/index.d.ts +11 -0
  42. package/dest/crypto/sha256/index.d.ts.map +1 -0
  43. package/dest/crypto/sha256/index.js +14 -0
  44. package/dest/crypto/sha256/index.test.d.ts +2 -0
  45. package/dest/crypto/sha256/index.test.d.ts.map +1 -0
  46. package/dest/crypto/sha256/index.test.js +11 -0
  47. package/dest/errors/index.d.ts +8 -0
  48. package/dest/errors/index.d.ts.map +1 -0
  49. package/dest/errors/index.js +8 -0
  50. package/dest/eth-address/eth_address.test.d.ts +2 -0
  51. package/dest/eth-address/eth_address.test.d.ts.map +1 -0
  52. package/dest/eth-address/eth_address.test.js +87 -0
  53. package/dest/eth-address/index.d.ts +139 -0
  54. package/dest/eth-address/index.d.ts.map +1 -0
  55. package/dest/eth-address/index.js +221 -0
  56. package/dest/fields/coordinate.d.ts +67 -0
  57. package/dest/fields/coordinate.d.ts.map +1 -0
  58. package/dest/fields/coordinate.js +95 -0
  59. package/dest/fields/coordinate.test.d.ts +2 -0
  60. package/dest/fields/coordinate.test.d.ts.map +1 -0
  61. package/dest/fields/coordinate.test.js +22 -0
  62. package/dest/fields/fields.d.ts +170 -0
  63. package/dest/fields/fields.d.ts.map +1 -0
  64. package/dest/fields/fields.js +210 -0
  65. package/dest/fields/index.d.ts +4 -0
  66. package/dest/fields/index.d.ts.map +1 -0
  67. package/dest/fields/index.js +4 -0
  68. package/dest/fields/point.d.ts +111 -0
  69. package/dest/fields/point.d.ts.map +1 -0
  70. package/dest/fields/point.js +133 -0
  71. package/dest/fifo/bounded_serial_queue.d.ts +56 -0
  72. package/dest/fifo/bounded_serial_queue.d.ts.map +1 -0
  73. package/dest/fifo/bounded_serial_queue.js +94 -0
  74. package/dest/fifo/index.d.ts +5 -0
  75. package/dest/fifo/index.d.ts.map +1 -0
  76. package/dest/fifo/index.js +5 -0
  77. package/dest/fifo/memory_fifo.d.ts +55 -0
  78. package/dest/fifo/memory_fifo.d.ts.map +1 -0
  79. package/dest/fifo/memory_fifo.js +109 -0
  80. package/dest/fifo/semaphore.d.ts +23 -0
  81. package/dest/fifo/semaphore.d.ts.map +1 -0
  82. package/dest/fifo/semaphore.js +30 -0
  83. package/dest/fifo/serial_queue.d.ts +48 -0
  84. package/dest/fifo/serial_queue.d.ts.map +1 -0
  85. package/dest/fifo/serial_queue.js +74 -0
  86. package/dest/json-rpc/class_converter.d.ts +109 -0
  87. package/dest/json-rpc/class_converter.d.ts.map +1 -0
  88. package/dest/json-rpc/class_converter.js +85 -0
  89. package/dest/json-rpc/client/index.d.ts +2 -0
  90. package/dest/json-rpc/client/index.d.ts.map +1 -0
  91. package/dest/json-rpc/client/index.js +2 -0
  92. package/dest/json-rpc/client/json_rpc_client.d.ts +22 -0
  93. package/dest/json-rpc/client/json_rpc_client.d.ts.map +1 -0
  94. package/dest/json-rpc/client/json_rpc_client.js +83 -0
  95. package/dest/json-rpc/client/json_rpc_client.test.d.ts +2 -0
  96. package/dest/json-rpc/client/json_rpc_client.test.d.ts.map +1 -0
  97. package/dest/json-rpc/client/json_rpc_client.test.js +20 -0
  98. package/dest/json-rpc/convert.d.ts +22 -0
  99. package/dest/json-rpc/convert.d.ts.map +1 -0
  100. package/dest/json-rpc/convert.js +93 -0
  101. package/dest/json-rpc/convert.test.d.ts +2 -0
  102. package/dest/json-rpc/convert.test.d.ts.map +1 -0
  103. package/dest/json-rpc/convert.test.js +14 -0
  104. package/dest/json-rpc/fixtures/test_state.d.ts +47 -0
  105. package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -0
  106. package/dest/json-rpc/fixtures/test_state.js +62 -0
  107. package/dest/json-rpc/index.d.ts +4 -0
  108. package/dest/json-rpc/index.d.ts.map +1 -0
  109. package/dest/json-rpc/index.js +4 -0
  110. package/dest/json-rpc/js_utils.d.ts +13 -0
  111. package/dest/json-rpc/js_utils.d.ts.map +1 -0
  112. package/dest/json-rpc/js_utils.js +18 -0
  113. package/dest/json-rpc/server/index.d.ts +3 -0
  114. package/dest/json-rpc/server/index.d.ts.map +1 -0
  115. package/dest/json-rpc/server/index.js +3 -0
  116. package/dest/json-rpc/server/json_proxy.d.ts +18 -0
  117. package/dest/json-rpc/server/json_proxy.d.ts.map +1 -0
  118. package/dest/json-rpc/server/json_proxy.js +35 -0
  119. package/dest/json-rpc/server/json_rpc_server.d.ts +34 -0
  120. package/dest/json-rpc/server/json_rpc_server.d.ts.map +1 -0
  121. package/dest/json-rpc/server/json_rpc_server.js +109 -0
  122. package/dest/json-rpc/server/json_rpc_server.test.d.ts +2 -0
  123. package/dest/json-rpc/server/json_rpc_server.test.d.ts.map +1 -0
  124. package/dest/json-rpc/server/json_rpc_server.test.js +22 -0
  125. package/dest/log/console.d.ts +16 -0
  126. package/dest/log/console.d.ts.map +1 -0
  127. package/dest/log/console.js +39 -0
  128. package/dest/log/debug.d.ts +46 -0
  129. package/dest/log/debug.d.ts.map +1 -0
  130. package/dest/log/debug.js +75 -0
  131. package/dest/log/index.d.ts +4 -0
  132. package/dest/log/index.d.ts.map +1 -0
  133. package/dest/log/index.js +4 -0
  134. package/dest/log/log_history.d.ts +31 -0
  135. package/dest/log/log_history.d.ts.map +1 -0
  136. package/dest/log/log_history.js +42 -0
  137. package/dest/log/log_history.test.d.ts +2 -0
  138. package/dest/log/log_history.test.d.ts.map +1 -0
  139. package/dest/log/log_history.test.js +78 -0
  140. package/dest/mutex/index.d.ts +53 -0
  141. package/dest/mutex/index.d.ts.map +1 -0
  142. package/dest/mutex/index.js +74 -0
  143. package/dest/mutex/mutex.test.d.ts +9 -0
  144. package/dest/mutex/mutex.test.d.ts.map +1 -0
  145. package/dest/mutex/mutex.test.js +58 -0
  146. package/dest/mutex/mutex_database.d.ts +10 -0
  147. package/dest/mutex/mutex_database.d.ts.map +1 -0
  148. package/dest/mutex/mutex_database.js +2 -0
  149. package/dest/retry/index.d.ts +33 -0
  150. package/dest/retry/index.d.ts.map +1 -0
  151. package/dest/retry/index.js +70 -0
  152. package/dest/running-promise/index.d.ts +35 -0
  153. package/dest/running-promise/index.d.ts.map +1 -0
  154. package/dest/running-promise/index.js +59 -0
  155. package/dest/serialize/buffer_reader.d.ts +188 -0
  156. package/dest/serialize/buffer_reader.d.ts.map +1 -0
  157. package/dest/serialize/buffer_reader.js +229 -0
  158. package/dest/serialize/buffer_reader.test.d.ts +2 -0
  159. package/dest/serialize/buffer_reader.test.d.ts.map +1 -0
  160. package/dest/serialize/buffer_reader.test.js +156 -0
  161. package/dest/serialize/deserializer.d.ts +134 -0
  162. package/dest/serialize/deserializer.d.ts.map +1 -0
  163. package/dest/serialize/deserializer.js +145 -0
  164. package/dest/serialize/free_funcs.d.ts +203 -0
  165. package/dest/serialize/free_funcs.d.ts.map +1 -0
  166. package/dest/serialize/free_funcs.js +250 -0
  167. package/dest/serialize/index.d.ts +6 -0
  168. package/dest/serialize/index.d.ts.map +1 -0
  169. package/dest/serialize/index.js +6 -0
  170. package/dest/serialize/serialize.test.d.ts +2 -0
  171. package/dest/serialize/serialize.test.d.ts.map +1 -0
  172. package/dest/serialize/serialize.test.js +68 -0
  173. package/dest/serialize/serializer.d.ts +89 -0
  174. package/dest/serialize/serializer.d.ts.map +1 -0
  175. package/dest/serialize/serializer.js +111 -0
  176. package/dest/serialize/types.d.ts +33 -0
  177. package/dest/serialize/types.d.ts.map +1 -0
  178. package/dest/serialize/types.js +22 -0
  179. package/dest/sleep/index.d.ts +52 -0
  180. package/dest/sleep/index.d.ts.map +1 -0
  181. package/dest/sleep/index.js +70 -0
  182. package/dest/timer/index.d.ts +3 -0
  183. package/dest/timer/index.d.ts.map +1 -0
  184. package/dest/timer/index.js +3 -0
  185. package/dest/timer/timeout.d.ts +41 -0
  186. package/dest/timer/timeout.d.ts.map +1 -0
  187. package/dest/timer/timeout.js +62 -0
  188. package/dest/timer/timer.d.ts +33 -0
  189. package/dest/timer/timer.d.ts.map +1 -0
  190. package/dest/timer/timer.js +38 -0
  191. package/dest/transport/browser/index.d.ts +5 -0
  192. package/dest/transport/browser/index.d.ts.map +1 -0
  193. package/dest/transport/browser/index.js +5 -0
  194. package/dest/transport/browser/message_port_socket.d.ts +37 -0
  195. package/dest/transport/browser/message_port_socket.d.ts.map +1 -0
  196. package/dest/transport/browser/message_port_socket.js +46 -0
  197. package/dest/transport/browser/shared_worker_connector.d.ts +19 -0
  198. package/dest/transport/browser/shared_worker_connector.d.ts.map +1 -0
  199. package/dest/transport/browser/shared_worker_connector.js +21 -0
  200. package/dest/transport/browser/shared_worker_listener.d.ts +38 -0
  201. package/dest/transport/browser/shared_worker_listener.d.ts.map +1 -0
  202. package/dest/transport/browser/shared_worker_listener.js +37 -0
  203. package/dest/transport/browser/worker_connector.d.ts +26 -0
  204. package/dest/transport/browser/worker_connector.d.ts.map +1 -0
  205. package/dest/transport/browser/worker_connector.js +30 -0
  206. package/dest/transport/browser/worker_listener.d.ts +39 -0
  207. package/dest/transport/browser/worker_listener.d.ts.map +1 -0
  208. package/dest/transport/browser/worker_listener.js +39 -0
  209. package/dest/transport/dispatch/create_dispatch_fn.d.ts +25 -0
  210. package/dest/transport/dispatch/create_dispatch_fn.d.ts.map +1 -0
  211. package/dest/transport/dispatch/create_dispatch_fn.js +18 -0
  212. package/dest/transport/dispatch/create_dispatch_proxy.d.ts +102 -0
  213. package/dest/transport/dispatch/create_dispatch_proxy.d.ts.map +1 -0
  214. package/dest/transport/dispatch/create_dispatch_proxy.js +56 -0
  215. package/dest/transport/dispatch/messages.d.ts +52 -0
  216. package/dest/transport/dispatch/messages.d.ts.map +1 -0
  217. package/dest/transport/dispatch/messages.js +12 -0
  218. package/dest/transport/index.d.ts +12 -0
  219. package/dest/transport/index.d.ts.map +1 -0
  220. package/dest/transport/index.js +12 -0
  221. package/dest/transport/interface/connector.d.ts +8 -0
  222. package/dest/transport/interface/connector.d.ts.map +1 -0
  223. package/dest/transport/interface/connector.js +2 -0
  224. package/dest/transport/interface/listener.d.ts +13 -0
  225. package/dest/transport/interface/listener.d.ts.map +1 -0
  226. package/dest/transport/interface/listener.js +2 -0
  227. package/dest/transport/interface/socket.d.ts +13 -0
  228. package/dest/transport/interface/socket.d.ts.map +1 -0
  229. package/dest/transport/interface/socket.js +2 -0
  230. package/dest/transport/interface/transferable.d.ts +68 -0
  231. package/dest/transport/interface/transferable.d.ts.map +1 -0
  232. package/dest/transport/interface/transferable.js +63 -0
  233. package/dest/transport/node/index.d.ts +3 -0
  234. package/dest/transport/node/index.d.ts.map +1 -0
  235. package/dest/transport/node/index.js +3 -0
  236. package/dest/transport/node/node_connector.d.ts +28 -0
  237. package/dest/transport/node/node_connector.d.ts.map +1 -0
  238. package/dest/transport/node/node_connector.js +28 -0
  239. package/dest/transport/node/node_connector_socket.d.ts +42 -0
  240. package/dest/transport/node/node_connector_socket.d.ts.map +1 -0
  241. package/dest/transport/node/node_connector_socket.js +48 -0
  242. package/dest/transport/node/node_listener.d.ts +26 -0
  243. package/dest/transport/node/node_listener.d.ts.map +1 -0
  244. package/dest/transport/node/node_listener.js +30 -0
  245. package/dest/transport/node/node_listener_socket.d.ts +37 -0
  246. package/dest/transport/node/node_listener_socket.d.ts.map +1 -0
  247. package/dest/transport/node/node_listener_socket.js +44 -0
  248. package/dest/transport/transport_client.d.ts +61 -0
  249. package/dest/transport/transport_client.d.ts.map +1 -0
  250. package/dest/transport/transport_client.js +94 -0
  251. package/dest/transport/transport_server.d.ts +56 -0
  252. package/dest/transport/transport_server.d.ts.map +1 -0
  253. package/dest/transport/transport_server.js +101 -0
  254. package/dest/types/index.d.ts +7 -0
  255. package/dest/types/index.d.ts.map +1 -0
  256. package/dest/types/index.js +2 -0
  257. package/dest/wasm/index.d.ts +5 -0
  258. package/dest/wasm/index.d.ts.map +1 -0
  259. package/dest/wasm/index.js +5 -0
  260. package/dest/wasm/wasm/empty_wasi_sdk.d.ts +130 -0
  261. package/dest/wasm/wasm/empty_wasi_sdk.d.ts.map +1 -0
  262. package/dest/wasm/wasm/empty_wasi_sdk.js +166 -0
  263. package/dest/wasm/wasm/index.d.ts +2 -0
  264. package/dest/wasm/wasm/index.d.ts.map +1 -0
  265. package/dest/wasm/wasm/index.js +2 -0
  266. package/dest/wasm/wasm/wasm_module.d.ts +135 -0
  267. package/dest/wasm/wasm/wasm_module.d.ts.map +1 -0
  268. package/dest/wasm/wasm/wasm_module.js +205 -0
  269. package/dest/wasm/wasm/wasm_module.test.d.ts +2 -0
  270. package/dest/wasm/wasm/wasm_module.test.d.ts.map +1 -0
  271. package/dest/wasm/wasm/wasm_module.test.js +24 -0
  272. package/dest/wasm/worker/browser/index.d.ts +3 -0
  273. package/dest/wasm/worker/browser/index.d.ts.map +1 -0
  274. package/dest/wasm/worker/browser/index.js +3 -0
  275. package/dest/wasm/worker/browser/start_web_module.d.ts +7 -0
  276. package/dest/wasm/worker/browser/start_web_module.d.ts.map +1 -0
  277. package/dest/wasm/worker/browser/start_web_module.js +22 -0
  278. package/dest/wasm/worker/browser/web_data_store.d.ts +23 -0
  279. package/dest/wasm/worker/browser/web_data_store.d.ts.map +1 -0
  280. package/dest/wasm/worker/browser/web_data_store.js +32 -0
  281. package/dest/wasm/worker/browser/web_worker.d.ts +10 -0
  282. package/dest/wasm/worker/browser/web_worker.d.ts.map +1 -0
  283. package/dest/wasm/worker/browser/web_worker.js +23 -0
  284. package/dest/wasm/worker/data_store.d.ts +9 -0
  285. package/dest/wasm/worker/data_store.d.ts.map +1 -0
  286. package/dest/wasm/worker/data_store.js +2 -0
  287. package/dest/wasm/worker/index.d.ts +3 -0
  288. package/dest/wasm/worker/index.d.ts.map +1 -0
  289. package/dest/wasm/worker/index.js +2 -0
  290. package/dest/wasm/worker/node/index.d.ts +3 -0
  291. package/dest/wasm/worker/node/index.d.ts.map +1 -0
  292. package/dest/wasm/worker/node/index.js +3 -0
  293. package/dest/wasm/worker/node/node_data_store.d.ts +22 -0
  294. package/dest/wasm/worker/node/node_data_store.d.ts.map +1 -0
  295. package/dest/wasm/worker/node/node_data_store.js +31 -0
  296. package/dest/wasm/worker/node/node_worker.d.ts +6 -0
  297. package/dest/wasm/worker/node/node_worker.d.ts.map +1 -0
  298. package/dest/wasm/worker/node/node_worker.js +20 -0
  299. package/dest/wasm/worker/node/start_node_module.d.ts +7 -0
  300. package/dest/wasm/worker/node/start_node_module.d.ts.map +1 -0
  301. package/dest/wasm/worker/node/start_node_module.js +26 -0
  302. package/dest/wasm/worker/wasm_worker.d.ts +9 -0
  303. package/dest/wasm/worker/wasm_worker.d.ts.map +1 -0
  304. package/dest/wasm/worker/wasm_worker.js +2 -0
  305. package/dest/wasm/worker/worker_pool.d.ts +40 -0
  306. package/dest/wasm/worker/worker_pool.d.ts.map +1 -0
  307. package/dest/wasm/worker/worker_pool.js +62 -0
  308. package/package.json +44 -0
  309. package/src/abi/index.ts +147 -0
  310. package/src/async-map/async_map.test.ts +9 -0
  311. package/src/async-map/index.ts +18 -0
  312. package/src/aztec-address/index.ts +135 -0
  313. package/src/bigint-buffer/bigint-buffer.test.ts +21 -0
  314. package/src/bigint-buffer/index.ts +68 -0
  315. package/src/collection/array.ts +48 -0
  316. package/src/collection/index.ts +1 -0
  317. package/src/crypto/index.ts +3 -0
  318. package/src/crypto/keccak/index.ts +33 -0
  319. package/src/crypto/random/index.test.ts +13 -0
  320. package/src/crypto/random/index.ts +38 -0
  321. package/src/crypto/sha256/index.test.ts +13 -0
  322. package/src/crypto/sha256/index.ts +15 -0
  323. package/src/errors/index.ts +6 -0
  324. package/src/eth-address/eth_address.test.ts +104 -0
  325. package/src/eth-address/index.ts +236 -0
  326. package/src/fields/coordinate.test.ts +26 -0
  327. package/src/fields/coordinate.ts +104 -0
  328. package/src/fields/fields.ts +234 -0
  329. package/src/fields/index.ts +3 -0
  330. package/src/fields/point.ts +143 -0
  331. package/src/fifo/bounded_serial_queue.ts +100 -0
  332. package/src/fifo/index.ts +4 -0
  333. package/src/fifo/memory_fifo.ts +114 -0
  334. package/src/fifo/semaphore.ts +33 -0
  335. package/src/fifo/serial_queue.ts +78 -0
  336. package/src/json-rpc/README.md +55 -0
  337. package/src/json-rpc/class_converter.ts +160 -0
  338. package/src/json-rpc/client/index.ts +1 -0
  339. package/src/json-rpc/client/json_rpc_client.test.ts +20 -0
  340. package/src/json-rpc/client/json_rpc_client.ts +103 -0
  341. package/src/json-rpc/convert.test.ts +15 -0
  342. package/src/json-rpc/convert.ts +109 -0
  343. package/src/json-rpc/fixtures/test_state.ts +59 -0
  344. package/src/json-rpc/index.ts +3 -0
  345. package/src/json-rpc/js_utils.ts +20 -0
  346. package/src/json-rpc/server/index.ts +2 -0
  347. package/src/json-rpc/server/json_proxy.ts +36 -0
  348. package/src/json-rpc/server/json_rpc_server.test.ts +23 -0
  349. package/src/json-rpc/server/json_rpc_server.ts +124 -0
  350. package/src/log/console.ts +45 -0
  351. package/src/log/debug.ts +86 -0
  352. package/src/log/index.ts +3 -0
  353. package/src/log/log_history.test.ts +87 -0
  354. package/src/log/log_history.ts +44 -0
  355. package/src/mutex/index.ts +83 -0
  356. package/src/mutex/mutex.test.ts +75 -0
  357. package/src/mutex/mutex_database.ts +9 -0
  358. package/src/retry/index.ts +78 -0
  359. package/src/running-promise/index.ts +60 -0
  360. package/src/serialize/buffer_reader.test.ts +175 -0
  361. package/src/serialize/buffer_reader.ts +272 -0
  362. package/src/serialize/deserializer.ts +180 -0
  363. package/src/serialize/free_funcs.ts +285 -0
  364. package/src/serialize/index.ts +5 -0
  365. package/src/serialize/serialize.test.ts +89 -0
  366. package/src/serialize/serializer.ts +128 -0
  367. package/src/serialize/types.ts +40 -0
  368. package/src/sleep/index.ts +71 -0
  369. package/src/timer/index.ts +2 -0
  370. package/src/timer/timeout.ts +64 -0
  371. package/src/timer/timer.ts +41 -0
  372. package/src/transport/browser/index.ts +4 -0
  373. package/src/transport/browser/message_port_socket.ts +48 -0
  374. package/src/transport/browser/shared_worker_connector.ts +21 -0
  375. package/src/transport/browser/shared_worker_listener.ts +52 -0
  376. package/src/transport/browser/worker_connector.ts +30 -0
  377. package/src/transport/browser/worker_listener.ts +53 -0
  378. package/src/transport/dispatch/create_dispatch_fn.ts +33 -0
  379. package/src/transport/dispatch/create_dispatch_proxy.ts +140 -0
  380. package/src/transport/dispatch/messages.ts +58 -0
  381. package/src/transport/index.ts +11 -0
  382. package/src/transport/interface/connector.ts +8 -0
  383. package/src/transport/interface/listener.ts +14 -0
  384. package/src/transport/interface/socket.ts +12 -0
  385. package/src/transport/interface/transferable.ts +121 -0
  386. package/src/transport/node/index.ts +2 -0
  387. package/src/transport/node/node_connector.ts +29 -0
  388. package/src/transport/node/node_connector_socket.ts +51 -0
  389. package/src/transport/node/node_listener.ts +33 -0
  390. package/src/transport/node/node_listener_socket.ts +47 -0
  391. package/src/transport/transport_client.ts +125 -0
  392. package/src/transport/transport_server.ts +108 -0
  393. package/src/types/index.ts +7 -0
  394. package/src/wasm/README.md +6 -0
  395. package/src/wasm/fixtures/gcd.wasm +0 -0
  396. package/src/wasm/fixtures/gcd.wat +27 -0
  397. package/src/wasm/index.ts +4 -0
  398. package/src/wasm/wasm/empty_wasi_sdk.ts +166 -0
  399. package/src/wasm/wasm/index.ts +1 -0
  400. package/src/wasm/wasm/wasm_module.test.ts +27 -0
  401. package/src/wasm/wasm/wasm_module.ts +257 -0
  402. package/src/wasm/worker/browser/index.ts +2 -0
  403. package/src/wasm/worker/browser/start_web_module.ts +23 -0
  404. package/src/wasm/worker/browser/web_data_store.ts +37 -0
  405. package/src/wasm/worker/browser/web_worker.ts +24 -0
  406. package/src/wasm/worker/data_store.ts +7 -0
  407. package/src/wasm/worker/index.ts +2 -0
  408. package/src/wasm/worker/node/index.ts +2 -0
  409. package/src/wasm/worker/node/node_data_store.ts +36 -0
  410. package/src/wasm/worker/node/node_worker.ts +21 -0
  411. package/src/wasm/worker/node/start_node_module.ts +28 -0
  412. package/src/wasm/worker/wasm_worker.ts +7 -0
  413. package/src/wasm/worker/worker_pool.ts +73 -0
  414. package/tsconfig.json +10 -0
@@ -0,0 +1,60 @@
1
+ /**
2
+ * RunningPromise is a utility class that helps manage the execution of an asynchronous function
3
+ * at a specified polling interval. It allows starting, stopping, and checking the status of the
4
+ * internally managed promise. The class also supports interrupting the polling process when stopped.
5
+ */
6
+ export class RunningPromise {
7
+ private running = false;
8
+ private runningPromise = Promise.resolve();
9
+ private interruptPromise = Promise.resolve();
10
+ private interruptResolve = () => {};
11
+ constructor(private fn: () => Promise<void>, private pollingInterval = 10000) {}
12
+
13
+ /**
14
+ * Starts the running promise.
15
+ */
16
+ public start() {
17
+ this.running = true;
18
+ this.interruptPromise = new Promise(resolve => (this.interruptResolve = resolve));
19
+
20
+ const poll = async () => {
21
+ while (this.running) {
22
+ await this.fn();
23
+ await this.interruptableSleep(this.pollingInterval);
24
+ }
25
+ };
26
+ this.runningPromise = poll();
27
+ }
28
+
29
+ /**
30
+ * Stops the running promise, resolves any pending interruptable sleep,
31
+ * and waits for the currently executing function to complete.
32
+ */
33
+ async stop(): Promise<void> {
34
+ this.running = false;
35
+ this.interruptResolve();
36
+ await this.runningPromise;
37
+ }
38
+
39
+ /**
40
+ * A sleep function that can be interrupted before the specified time.
41
+ * The sleep duration is determined by 'timeInMs', and it can be terminated early if the 'interruptPromise' is resolved.
42
+ * @param timeInMs - The time in milliseconds.
43
+ */
44
+ private async interruptableSleep(timeInMs: number) {
45
+ let timeout!: NodeJS.Timeout;
46
+ const sleepPromise = new Promise(resolve => {
47
+ timeout = setTimeout(resolve, timeInMs);
48
+ });
49
+ await Promise.race([sleepPromise, this.interruptPromise]);
50
+ clearTimeout(timeout);
51
+ }
52
+
53
+ /**
54
+ * Checks if the running promise is currently active.
55
+ * @returns True if the promise is running.
56
+ */
57
+ public isRunning() {
58
+ return this.running;
59
+ }
60
+ }
@@ -0,0 +1,175 @@
1
+ import { jest } from '@jest/globals';
2
+ import { Fq, Fr } from '../fields/fields.js';
3
+ import { BufferReader } from './buffer_reader.js';
4
+ import { serializeBufferArrayToVector } from './free_funcs.js';
5
+ import { randomBytes } from '../crypto/index.js';
6
+
7
+ const ARRAY = Array.from(Array(32)).map((_, idx) => (idx % 2 === 0 ? 0 : 1));
8
+ const BUFFER = Buffer.from(ARRAY);
9
+ const NUMBER = 65537;
10
+ const sizes = [16, 48, 32];
11
+
12
+ describe('buffer reader', () => {
13
+ let bufferReader: BufferReader;
14
+
15
+ beforeEach(() => {
16
+ bufferReader = new BufferReader(BUFFER);
17
+ });
18
+
19
+ describe('readNumber', () => {
20
+ it('should return number', () => {
21
+ expect(bufferReader.readNumber()).toBe(NUMBER);
22
+ });
23
+ });
24
+
25
+ describe('readBoolean', () => {
26
+ it('should read true when 1 and false when 0', () => {
27
+ ARRAY.forEach(element => {
28
+ if (element !== 0) {
29
+ expect(bufferReader.readBoolean()).toBe(true);
30
+ } else {
31
+ expect(bufferReader.readBoolean()).toBe(false);
32
+ }
33
+ });
34
+ });
35
+ });
36
+
37
+ describe('readBytes', () => {
38
+ it('should read buffer by slices', () => {
39
+ expect(bufferReader.readBytes(2)).toEqual(Buffer.from(ARRAY.slice(0, 2)));
40
+ expect(bufferReader.readBytes(3)).toEqual(Buffer.from(ARRAY.slice(2, 5)));
41
+ });
42
+ });
43
+
44
+ describe('readFr', () => {
45
+ it('should get Fr from buffer', () => {
46
+ expect(bufferReader.readFr()).toEqual(Fr.fromBuffer(BUFFER));
47
+ });
48
+ });
49
+
50
+ describe('readFq', () => {
51
+ it('should get Fq from buffer', () => {
52
+ expect(bufferReader.readFq()).toEqual(Fq.fromBuffer(BUFFER));
53
+ });
54
+ });
55
+
56
+ describe('readNumberVector', () => {
57
+ let vectorBufferReader: BufferReader;
58
+
59
+ beforeEach(() => {
60
+ const uintArr = [7, 13, 16];
61
+ const uintBufArr = uintArr.map(num => {
62
+ const uintBuf = Buffer.alloc(4);
63
+ uintBuf.writeUInt32BE(num, 0);
64
+ return uintBuf;
65
+ });
66
+ const uintArrVec = serializeBufferArrayToVector(uintBufArr);
67
+ vectorBufferReader = new BufferReader(uintArrVec);
68
+ });
69
+
70
+ it('should read number vector', () => {
71
+ expect(vectorBufferReader.readNumberVector()).toEqual([7, 13, 16]);
72
+ });
73
+ });
74
+
75
+ describe('readVector', () => {
76
+ it('should read vector and generate result array', () => {
77
+ const fn = jest.fn();
78
+ let i = -1;
79
+ const result = bufferReader.readVector({
80
+ fromBuffer: () => {
81
+ fn();
82
+ i++;
83
+ return i;
84
+ },
85
+ });
86
+ expect(result.length).toBe(NUMBER);
87
+ expect(result).toEqual(Array.from(Array(NUMBER).keys()));
88
+ expect(fn).toHaveBeenCalledTimes(NUMBER);
89
+ });
90
+ });
91
+
92
+ describe('readArray', () => {
93
+ it('should read array from buffer', () => {
94
+ const fn = jest.fn();
95
+ let i = -1;
96
+ expect(
97
+ bufferReader.readArray(10, {
98
+ fromBuffer: () => {
99
+ fn();
100
+ i++;
101
+ return i;
102
+ },
103
+ }),
104
+ ).toEqual([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
105
+ });
106
+ });
107
+
108
+ describe('readBufferArray', () => {
109
+ it('should read variable length array from buffer', () => {
110
+ // Testing `readBufferArray` with a buffer that ONLY contains the data that will be read.
111
+ // No `size` variable is passed in this case.
112
+ const bufferArray: Buffer[] = [];
113
+ let buf = Buffer.alloc(0);
114
+ for (const size of sizes) {
115
+ const sizeBuf = Buffer.alloc(4);
116
+ sizeBuf.writeUInt32BE(size);
117
+ const bytes = randomBytes(size);
118
+ const ranBuf = Buffer.concat([sizeBuf, bytes]);
119
+ bufferArray.push(bytes);
120
+ buf = Buffer.concat([buf, ranBuf]);
121
+ }
122
+ const reader = BufferReader.asReader(buf);
123
+ const res = reader.readBufferArray();
124
+ expect(res).toEqual(bufferArray);
125
+ });
126
+
127
+ it('should read variable length array from buffer with other contents', () => {
128
+ // testing `readBufferArray` with a buffer that includes some other data before and after the data that will be read.
129
+ // The `size` variable needs to be passed in this case.
130
+ const bufferArray: Buffer[] = [];
131
+ const prefixBytes = randomBytes(32);
132
+ const postfixBytes = randomBytes(16);
133
+ let bufLen = 0;
134
+ let buf = Buffer.alloc(32, prefixBytes);
135
+ for (const size of sizes) {
136
+ const sizeBuf = Buffer.alloc(4);
137
+ sizeBuf.writeUInt32BE(size);
138
+
139
+ const bytes = randomBytes(size);
140
+ const ranBuf = Buffer.concat([sizeBuf, bytes]);
141
+ buf = Buffer.concat([buf, ranBuf]);
142
+
143
+ bufferArray.push(bytes);
144
+ bufLen += ranBuf.length;
145
+ }
146
+ buf = Buffer.concat([buf, postfixBytes]);
147
+ const reader = BufferReader.asReader(buf);
148
+ const preRes = reader.readBytes(prefixBytes.length);
149
+ expect(preRes).toEqual(prefixBytes);
150
+ expect(reader.readBufferArray(bufLen)).toEqual(bufferArray);
151
+ expect(reader.readBytes(postfixBytes.length)).toEqual(postfixBytes);
152
+ });
153
+ });
154
+
155
+ describe('readObject', () => {
156
+ it('should read object from buffer', () => {
157
+ const fn = jest.fn();
158
+ const object = bufferReader.readObject({
159
+ fromBuffer: (reader: BufferReader) => {
160
+ fn();
161
+ return { value: 'test-string', buffer: reader };
162
+ },
163
+ });
164
+ expect(object.value).toEqual('test-string');
165
+ expect(object.buffer).toEqual(bufferReader);
166
+ expect(fn).toHaveBeenCalledTimes(1);
167
+ });
168
+ });
169
+
170
+ describe('peekBytes', () => {
171
+ it('should return bytes from buffer', () => {
172
+ expect(bufferReader.peekBytes(10)).toEqual(Buffer.from(ARRAY.slice(0, 10)));
173
+ });
174
+ });
175
+ });
@@ -0,0 +1,272 @@
1
+ import { Fr, Fq } from '../fields/fields.js';
2
+ import { Tuple } from './types.js';
3
+
4
+ /**
5
+ * The BufferReader class provides a utility for reading various data types from a buffer.
6
+ * It supports reading numbers, booleans, byte arrays, Fr and Fq field elements,
7
+ * vectors, arrays, objects, strings, and maps. It maintains an internal index to
8
+ * keep track of the current reading position in the buffer.
9
+ *
10
+ * Usage:
11
+ * Create a new instance of BufferReader with a buffer and an optional offset.
12
+ * Use the provided methods to read desired data types from the buffer.
13
+ * The reading methods automatically advance the internal index.
14
+ *
15
+ * @example
16
+ * const reader = new BufferReader(someBuffer);
17
+ * const num = reader.readNumber();
18
+ * const bool = reader.readBoolean();
19
+ * const byteArray = reader.readBytes(4);
20
+ */
21
+ export class BufferReader {
22
+ private index: number;
23
+ constructor(private buffer: Buffer, offset = 0) {
24
+ this.index = offset;
25
+ }
26
+
27
+ /**
28
+ * Creates a BufferReader instance from either a Buffer or an existing BufferReader.
29
+ * If the input is a Buffer, it creates a new BufferReader with the given buffer.
30
+ * If the input is already a BufferReader, it returns the input unchanged.
31
+ *
32
+ * @param bufferOrReader - A Buffer or BufferReader to initialize the BufferReader.
33
+ * @returns An instance of BufferReader.
34
+ */
35
+ public static asReader(bufferOrReader: Buffer | BufferReader) {
36
+ return Buffer.isBuffer(bufferOrReader) ? new BufferReader(bufferOrReader) : bufferOrReader;
37
+ }
38
+
39
+ /**
40
+ * Reads a 32-bit unsigned integer from the buffer at the current index position.
41
+ * Updates the index position by 4 bytes after reading the number.
42
+ *
43
+ * @returns The read 32-bit unsigned integer value.
44
+ */
45
+ public readNumber(): number {
46
+ this.index += 4;
47
+ return this.buffer.readUint32BE(this.index - 4);
48
+ }
49
+
50
+ /**
51
+ * Reads a 16-bit unsigned integer from the buffer at the current index position.
52
+ * Updates the index position by 2 bytes after reading the number.
53
+ *
54
+ * @returns The read 16 bit value.
55
+ */
56
+ public readUInt16(): number {
57
+ this.index += 2;
58
+ return this.buffer.readUInt16BE(this.index - 2);
59
+ }
60
+
61
+ /**
62
+ * Reads and returns the next boolean value from the buffer.
63
+ * Advances the internal index by 1, treating the byte at the current index as a boolean value.
64
+ * Returns true if the byte is non-zero, false otherwise.
65
+ *
66
+ * @returns A boolean value representing the byte at the current index.
67
+ */
68
+ public readBoolean(): boolean {
69
+ this.index += 1;
70
+ return Boolean(this.buffer.at(this.index - 1));
71
+ }
72
+
73
+ /**
74
+ * Reads a specified number of bytes from the buffer and returns a new Buffer containing those bytes.
75
+ * Advances the reader's index by the number of bytes read. Throws an error if there are not enough
76
+ * bytes left in the buffer to satisfy the requested number of bytes.
77
+ *
78
+ * @param n - The number of bytes to read from the buffer.
79
+ * @returns A new Buffer containing the read bytes.
80
+ */
81
+ public readBytes(n: number): Buffer {
82
+ this.index += n;
83
+ return Buffer.from(this.buffer.subarray(this.index - n, this.index));
84
+ }
85
+
86
+ /**
87
+ * Reads a Fr (finite field) element from the buffer using the 'fromBuffer' method of the Fr class.
88
+ * The Fr class should provide a 'fromBuffer' method that takes a BufferReader instance as input.
89
+ *
90
+ * @returns An instance of the Fr class representing the finite field element.
91
+ */
92
+ public readFr(): Fr {
93
+ return Fr.fromBuffer(this);
94
+ }
95
+
96
+ /**
97
+ * Reads the next Fq element from the buffer using the Fq.fromBuffer method.
98
+ * The Fq element represents a finite field in elliptic curve cryptography and is used for calculations.
99
+ * Advances the internal buffer index by the number of bytes read.
100
+ *
101
+ * @returns An Fq instance representing the finite field element.
102
+ */
103
+ public readFq(): Fq {
104
+ return Fq.fromBuffer(this);
105
+ }
106
+
107
+ /**
108
+ * Reads a vector of numbers from the buffer and returns it as an array of numbers.
109
+ * The method utilizes the 'readVector' method, passing a deserializer that reads numbers.
110
+ *
111
+ * @returns An array of numbers representing the vector read from the buffer.
112
+ */
113
+ public readNumberVector(): number[] {
114
+ return this.readVector({
115
+ fromBuffer: (reader: BufferReader) => reader.readNumber(),
116
+ });
117
+ }
118
+
119
+ /**
120
+ * Reads a vector of fixed size from the buffer and deserializes its elements using the provided itemDeserializer object.
121
+ * The 'itemDeserializer' object should have a 'fromBuffer' method that takes a BufferReader instance and returns the deserialized element.
122
+ * The method first reads the size of the vector (a number) from the buffer, then iterates through its elements,
123
+ * deserializing each one using the 'fromBuffer' method of 'itemDeserializer'.
124
+ *
125
+ * @param itemDeserializer - Object with 'fromBuffer' method to deserialize vector elements.
126
+ * @returns An array of deserialized elements of type T.
127
+ */
128
+ public readVector<T>(itemDeserializer: {
129
+ /**
130
+ * A method to deserialize data from a buffer.
131
+ */
132
+ fromBuffer: (reader: BufferReader) => T;
133
+ }): T[] {
134
+ const size = this.readNumber();
135
+ const result = new Array<T>(size);
136
+ for (let i = 0; i < size; i++) {
137
+ result[i] = itemDeserializer.fromBuffer(this);
138
+ }
139
+ return result;
140
+ }
141
+
142
+ /**
143
+ * Read an array of a fixed size with elements of type T from the buffer.
144
+ * The 'itemDeserializer' object should have a 'fromBuffer' method that takes a BufferReader instance as input,
145
+ * and returns an instance of the desired deserialized data type T.
146
+ * This method will call the 'fromBuffer' method for each element in the array and return the resulting array.
147
+ *
148
+ * @param size - The fixed number of elements in the array.
149
+ * @param itemDeserializer - An object with a 'fromBuffer' method to deserialize individual elements of type T.
150
+ * @returns An array of instances of type T.
151
+ */
152
+ public readArray<T, N extends number>(
153
+ size: N,
154
+ itemDeserializer: {
155
+ /**
156
+ * A function for deserializing data from a BufferReader instance.
157
+ */
158
+ fromBuffer: (reader: BufferReader) => T;
159
+ },
160
+ ): Tuple<T, N> {
161
+ const result = Array.from({ length: size }, () => itemDeserializer.fromBuffer(this));
162
+ return result as Tuple<T, N>;
163
+ }
164
+
165
+ /**
166
+ * Read a variable sized Buffer array where elements are represented by length + data.
167
+ * The method consecutively looks for a number which is the size of the proceeding buffer,
168
+ * then reads the bytes until it reaches the end of the reader's internal buffer.
169
+ * NOTE: if `size` is not provided, this will run to the end of the reader's buffer.
170
+ * @param size - Size of the buffer array in bytes (full remaining buffer length if left empty).
171
+ * @returns An array of variable sized buffers.
172
+ */
173
+ public readBufferArray(size = -1): Buffer[] {
174
+ const result: Buffer[] = [];
175
+ const end = size >= 0 ? this.index + size : this.buffer.length;
176
+ while (this.index < end) {
177
+ const item = this.readBuffer();
178
+ result.push(item);
179
+ }
180
+ // Ensure that all bytes have been read.
181
+ if (this.index !== end) {
182
+ throw new Error(
183
+ `Reader buffer was not fully consumed. Consumed up to ${this.index} bytes. End of data: ${end} bytes.`,
184
+ );
185
+ }
186
+ return result;
187
+ }
188
+
189
+ /**
190
+ * Reads a serialized object from a buffer and returns the deserialized object using the given deserializer.
191
+ *
192
+ * @typeparam T - The type of the deserialized object.
193
+ * @param deserializer - An object with a 'fromBuffer' method that takes a BufferReader instance and returns an instance of the deserialized object.
194
+ * @returns The deserialized object of type T.
195
+ */
196
+ public readObject<T>(deserializer: {
197
+ /**
198
+ * A method that takes a BufferReader instance and returns an instance of the deserialized data type.
199
+ */
200
+ fromBuffer: (reader: BufferReader) => T;
201
+ }): T {
202
+ return deserializer.fromBuffer(this);
203
+ }
204
+
205
+ /**
206
+ * Returns a Buffer containing the next n bytes from the current buffer without modifying the reader's index position.
207
+ * If n is not provided or exceeds the remaining length of the buffer, it returns all bytes from the current position till the end of the buffer.
208
+ *
209
+ * @param n - The number of bytes to peek from the current buffer. (Optional).
210
+ * @returns A Buffer with the next n bytes or the remaining bytes if n is not provided or exceeds the buffer length.
211
+ */
212
+ public peekBytes(n?: number): Buffer {
213
+ return this.buffer.subarray(this.index, n ? this.index + n : undefined);
214
+ }
215
+
216
+ /**
217
+ * Reads a string from the buffer and returns it.
218
+ * The method first reads the size of the string, then reads the corresponding
219
+ * number of bytes from the buffer and converts them to a string.
220
+ *
221
+ * @returns The read string from the buffer.
222
+ */
223
+ public readString(): string {
224
+ return this.readBuffer().toString();
225
+ }
226
+
227
+ /**
228
+ * Reads a buffer from the current position of the reader and advances the index.
229
+ * The method first reads the size (number) of bytes to be read, and then returns
230
+ * a Buffer with that size containing the bytes. Useful for reading variable-length
231
+ * binary data encoded as (size, data) format.
232
+ *
233
+ * @returns A Buffer containing the read bytes.
234
+ */
235
+ public readBuffer(): Buffer {
236
+ const size = this.readNumber();
237
+ return this.readBytes(size);
238
+ }
239
+
240
+ /**
241
+ * Reads and constructs a map object from the current buffer using the provided deserializer.
242
+ * The method reads the number of entries in the map, followed by iterating through each key-value pair.
243
+ * The key is read as a string, while the value is obtained using the passed deserializer's `fromBuffer` method.
244
+ * The resulting map object is returned, containing all the key-value pairs read from the buffer.
245
+ *
246
+ * @param deserializer - An object with a `fromBuffer` method to deserialize the values in the map.
247
+ * @returns A map object with string keys and deserialized values based on the provided deserializer.
248
+ */
249
+ public readMap<T>(deserializer: {
250
+ /**
251
+ * Deserializes an element of type T from a BufferReader instance.
252
+ */
253
+ fromBuffer: (reader: BufferReader) => T;
254
+ }): { [key: string]: T } {
255
+ const numEntries = this.readNumber();
256
+ const map: { [key: string]: T } = {};
257
+ for (let i = 0; i < numEntries; i++) {
258
+ const key = this.readString();
259
+ const value = this.readObject<T>(deserializer);
260
+ map[key] = value;
261
+ }
262
+ return map;
263
+ }
264
+
265
+ /**
266
+ * Get the length of the reader's buffer.
267
+ * @returns The length of the underlying reader's buffer.
268
+ */
269
+ public getLength(): number {
270
+ return this.buffer.length;
271
+ }
272
+ }
@@ -0,0 +1,180 @@
1
+ import {
2
+ deserializeArrayFromVector,
3
+ deserializeBigInt,
4
+ deserializeBool,
5
+ deserializeBufferFromVector,
6
+ deserializeInt32,
7
+ deserializeUInt32,
8
+ } from './free_funcs.js';
9
+
10
+ /**
11
+ * DeserializeFn is a type representing a deserialization function for a specific data type. The function takes
12
+ * a buffer and an offset as input, and returns an object containing the deserialized element of the data type and
13
+ * the number of bytes advanced in the buffer. This type is used to provide custom deserialization logic for arrays,
14
+ * objects or custom data types while working with the Deserializer class.
15
+ */
16
+ export type DeserializeFn<T> = (
17
+ buf: Buffer,
18
+ offset: number,
19
+ ) => {
20
+ /**
21
+ * The deserialized element of the specified data type.
22
+ */
23
+ elem: T;
24
+ /**
25
+ * The number of bytes advanced in the buffer during deserialization.
26
+ */
27
+ adv: number;
28
+ };
29
+
30
+ /**
31
+ * Deserializer class provides a set of methods to deserialize different data types from a buffer.
32
+ * It maintains an internal buffer and offset, updating the offset as it deserializes each data type.
33
+ * The class supports deserialization of various data types including boolean, integers, big integers,
34
+ * buffers, strings, dates, and arrays with custom deserialization functions.
35
+ *
36
+ * @example
37
+ * const deserializer = new Deserializer(buffer);
38
+ * const boolValue = deserializer.bool();
39
+ * const intValue = deserializer.int32();
40
+ * const bigIntValue = deserializer.bigInt();
41
+ * const stringValue = deserializer.string();
42
+ * const dateValue = deserializer.date();
43
+ * const arrayValue = deserializer.deserializeArray(customDeserializeFn);
44
+ */
45
+ export class Deserializer {
46
+ constructor(private buf: Buffer, private offset = 0) {}
47
+
48
+ /**
49
+ * Deserialize a boolean value from the buffer at the current offset.
50
+ * Advances the internal offset by one byte after deserialization.
51
+ * Returns 'true' if the deserialized value is non-zero, otherwise returns 'false'.
52
+ *
53
+ * @returns The deserialized boolean value.
54
+ */
55
+ public bool() {
56
+ return this.exec(deserializeBool) ? true : false;
57
+ }
58
+
59
+ /**
60
+ * Deserialize a 32-bit unsigned integer from the buffer at the current offset.
61
+ * Advances the internal buffer offset by 4 after successful deserialization.
62
+ * The result is returned as a JavaScript number.
63
+ *
64
+ * @returns A 32-bit unsigned integer value.
65
+ */
66
+ public uInt32() {
67
+ return this.exec(deserializeUInt32);
68
+ }
69
+
70
+ /**
71
+ * Deserialize a 32-bit signed integer from the internal buffer.
72
+ * Reads 4 bytes from the current offset in the buffer and interprets them as a little-endian int32 value.
73
+ * Advances the internal offset by 4 bytes after successful deserialization.
74
+ *
75
+ * @returns The deserialized 32-bit signed integer value.
76
+ */
77
+ public int32() {
78
+ return this.exec(deserializeInt32);
79
+ }
80
+
81
+ /**
82
+ * Deserialize a BigInt from the buffer, taking into account the specified width.
83
+ * The method reads 'width' bytes from the buffer starting at the current offset and converts it to a BigInt.
84
+ * The offset is advanced by 'width' bytes after successful deserialization.
85
+ *
86
+ * @param width - The number of bytes to read from the buffer to construct the BigInt (default is 32).
87
+ * @returns The deserialized BigInt value.
88
+ */
89
+ public bigInt(width = 32) {
90
+ return this.exec((buf: Buffer, offset: number) => deserializeBigInt(buf, offset, width));
91
+ }
92
+
93
+ /**
94
+ * Deserialize a variable-length byte array from the internal buffer.
95
+ * This method reads the length of the array and then extracts the corresponding bytes.
96
+ * It advances the internal offset by the number of bytes read, including the length prefix.
97
+ *
98
+ * @returns A Buffer instance containing the deserialized byte array.
99
+ */
100
+ public vector() {
101
+ return this.exec(deserializeBufferFromVector);
102
+ }
103
+
104
+ /**
105
+ * Extract a sub-buffer with the specified width, advancing the internal offset.
106
+ * The function slices the buffer from the current offset to the offset plus the provided width,
107
+ * and advances the internal offset by the width. This can be useful for working with fixed-width
108
+ * structures within the original buffer.
109
+ *
110
+ * @param width - The number of bytes to include in the extracted sub-buffer.
111
+ * @returns A sub-buffer containing the specified number of bytes from the original buffer.
112
+ */
113
+ public buffer(width: number) {
114
+ const buf = this.buf.slice(this.offset, this.offset + width);
115
+ this.offset += width;
116
+ return buf;
117
+ }
118
+
119
+ /**
120
+ * Deserialize a string from the internal buffer.
121
+ * It first deserializes a vector representing the UTF-8 encoded string from the buffer,
122
+ * and then converts it to a string.
123
+ *
124
+ * @returns The deserialized string.
125
+ */
126
+ public string() {
127
+ return this.vector().toString();
128
+ }
129
+
130
+ /**
131
+ * Deserialize a Date object from the internal buffer.
132
+ * The date value is expected to be stored as a 64-bit BigInt representing the number of milliseconds since the Unix epoch.
133
+ * Advances the internal offset by 8 bytes after deserialization.
134
+ *
135
+ * @returns A Date instance representing the deserialized date value.
136
+ */
137
+ public date() {
138
+ return new Date(Number(this.bigInt(8)));
139
+ }
140
+
141
+ /**
142
+ * Deserialize an array of elements using the provided deserialization function.
143
+ * This method reads the serialized data from the buffer and deserializes each element in the array
144
+ * using the given 'fn' deserialization function. The returned array contains the deserialized elements
145
+ * in their original order.
146
+ *
147
+ * @param fn - The deserialization function to be applied on each element in the array.
148
+ * @returns An array containing the deserialized elements.
149
+ */
150
+ public deserializeArray<T>(fn: DeserializeFn<T>) {
151
+ return this.exec((buf: Buffer, offset: number) => deserializeArrayFromVector(fn, buf, offset));
152
+ }
153
+
154
+ /**
155
+ * Executes the given deserialization function on this Deserializer's buffer and updates the internal offset.
156
+ * The DeserializeFn<T> should take a Buffer and an offset as input, and return an object containing the deserialized
157
+ * element and the number of bytes advanced in the buffer. This method is useful for custom deserialization logic
158
+ * or implementing new deserialization functions.
159
+ *
160
+ * @typeparam T - The type of the deserialized element.
161
+ * @param fn - The deserialization function to execute.
162
+ * @returns The deserialized element of type T.
163
+ */
164
+ public exec<T>(fn: DeserializeFn<T>): T {
165
+ const { elem, adv } = fn(this.buf, this.offset);
166
+ this.offset += adv;
167
+ return elem;
168
+ }
169
+
170
+ /**
171
+ * Returns the current offset value in the Deserializer instance.
172
+ * The offset is updated as elements are deserialized from the buffer.
173
+ * It can be useful for tracking the position in the buffer during complex deserialization processes.
174
+ *
175
+ * @returns The current offset value as a number.
176
+ */
177
+ public getOffset() {
178
+ return this.offset;
179
+ }
180
+ }