@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,166 @@
1
+ import { createDebugLogger } from '../../log/index.js';
2
+
3
+ /**
4
+ * Dummy implementation of a necessary part of the wasi api:
5
+ * https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md
6
+ * We don't use these functions, but the environment expects them.
7
+ * TODO find a way to update off of wasi 12.
8
+ */
9
+ /* eslint-disable camelcase */
10
+ export const getEmptyWasiSdk = (debug = createDebugLogger('wasm:empty_wasi_sdk')) => ({
11
+ /**
12
+ * Retrieves the current time from the system clock.
13
+ * This function is a dummy implementation of the WASI API's `clock_time_get` method,
14
+ * which is expected by the environment but not used in this context.
15
+ *
16
+ * No input parameters or return values are required, as the purpose of this function
17
+ * is solely to satisfy the environment expectations and provide debugging information.
18
+ */
19
+ clock_time_get() {
20
+ debug('clock_time_get');
21
+ },
22
+ /**
23
+ * Dummy implementation of WASI's environ_get function.
24
+ * This function is used to obtain a snapshot of the current environment variables.
25
+ * In this dummy implementation, no actual actions are performed, but the debug logger logs 'environ_get' when called.
26
+ * Environment variables are not used in this context, so the real implementation is not required.
27
+ *
28
+ * @see https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md#environ_get
29
+ */
30
+ environ_get() {
31
+ debug('environ_get');
32
+ },
33
+ /**
34
+ * Retrieves the environment variable sizes from the WebAssembly environment.
35
+ * This function is part of the WASI API and provides a dummy implementation to fulfill the expected APIs.
36
+ * It does not have any actual functionality, but serves as a placeholder in the environment.
37
+ */
38
+ environ_sizes_get() {
39
+ debug('environ_sizes_get');
40
+ },
41
+ /**
42
+ * Closes a file descriptor, releasing any resources associated with it.
43
+ * This function does not perform any actual closing operation, but exists to
44
+ * satisfy the requirements of the WebAssembly System Interface (WASI) API,
45
+ * which expects certain functions to be present for compatibility purposes.
46
+ *
47
+ * @see https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md
48
+ */
49
+ fd_close() {
50
+ debug('fd_close');
51
+ },
52
+ /**
53
+ * A dummy implementation of the 'fd_read' function from the WASI API.
54
+ * This function is required by the environment, but not used in this context.
55
+ * It would normally read data from a file descriptor into an array buffer,
56
+ * but here it simply logs the invocation for debugging purposes.
57
+ */
58
+ fd_read() {
59
+ debug('fd_read');
60
+ },
61
+ /**
62
+ * Handles the file descriptor write operation.
63
+ * This dummy implementation of the WASI 'fd_write' function is part of the wasi API:
64
+ * https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md
65
+ * The environment expects this function, but it is not used in the current implementation.
66
+ * It is used to write data from WebAssembly memory to a file descriptor.
67
+ */
68
+ fd_write() {
69
+ debug('fd_write');
70
+ },
71
+ /**
72
+ * Perform a file seek operation on the given file descriptor to change its current position.
73
+ * The new position is calculated using the provided offset and whence values.
74
+ * Throws an error if the file descriptor is invalid or the operation cannot be performed.
75
+ *
76
+ * @param fd - The file descriptor of the file to perform the seek operation on.
77
+ * @param offset - The relative offset to apply, based on the whence value.
78
+ * @param whence - The reference point from which the offset should be calculated. One of SEEK_SET (start), SEEK_CUR (current), or SEEK_END (end).
79
+ * @returns The new position in the file after the seek operation has been performed.
80
+ */
81
+ fd_seek() {
82
+ debug('fd_seek');
83
+ },
84
+ /**
85
+ * This function is a dummy implementation of the 'fd_fdstat_get' function in the WebAssembly System Interface (WASI) API.
86
+ * Although not actually used in this context, it is present due to the environment's expectation of its existence.
87
+ * The 'fd_fdstat_get' function is typically responsible for obtaining file descriptor status information.
88
+ */
89
+ fd_fdstat_get() {
90
+ debug('fd_fdstat_get');
91
+ },
92
+ /**
93
+ * Sets the file descriptor flags for a given file descriptor.
94
+ * This function is a dummy implementation of the WASI API function 'fd_fdstat_set_flags'.
95
+ * It currently does not perform any operation but logs the function call with a debug instance.
96
+ * This is provided since the environment expects this function to be present.
97
+ */
98
+ fd_fdstat_set_flags() {
99
+ debug('fd_fdstat_set_flags');
100
+ },
101
+ /**
102
+ * Handles the `fd_prestat_get` function call for the dummy WebAssembly System Interface (WASI) implementation.
103
+ * This function is expected by the WASI environment, although it is not used in this implementation.
104
+ * The `fd_prestat_get` function retrieves pre-opened file descriptor properties.
105
+ *
106
+ * @returns A constant integer value indicating successful completion of the function call.
107
+ */
108
+ fd_prestat_get() {
109
+ debug('fd_prestat_get');
110
+ return 8;
111
+ },
112
+ /**
113
+ * Provides a dummy implementation for the `fd_prestat_dir_name` function, which is expected to be called by the WASI environment.
114
+ * This function is intended to retrieve the pre-opened directory's path associated with the given file descriptor. However, since it's a dummy implementation,
115
+ * it doesn't perform any actual operation and only logs the function call with the provided debug logger.
116
+ *
117
+ * @returns A constant number representing a dummy return value for the function call.
118
+ */
119
+ fd_prestat_dir_name() {
120
+ debug('fd_prestat_dir_name');
121
+ return 28;
122
+ },
123
+ /**
124
+ * Handles the opening of a file path within the WASI environment.
125
+ * This function is a dummy implementation required for compatibility with
126
+ * the WebAssembly System Interface (WASI) API, but it does not perform any
127
+ * actual file opening operation. It is mainly used for debugging purposes.
128
+ */
129
+ path_open() {
130
+ debug('path_open');
131
+ },
132
+ /**
133
+ * Retrieve file system information of the specified path.
134
+ * This function retrieves statistics, such as size and permissions, associated with the file or directory
135
+ * identified by the given path. In case of an error or non-existing path, appropriate debug logs will be generated.
136
+ *
137
+ * @returns An object containing file statistics like size, permissions, etc.
138
+ */
139
+ path_filestat_get() {
140
+ debug('path_filestat_get');
141
+ },
142
+ /**
143
+ * Terminate the process normally, performing the regular cleanup for terminating programs.
144
+ * The input 'status' represents the exit code and is used to indicate success or failure
145
+ * of the program execution. A zero value typically indicates successful execution,
146
+ * while non-zero values are treated as errors by the operating system.
147
+ *
148
+ * @param status - The exit code representing the success or failure of the program execution.
149
+ * @returns The exit status code.
150
+ */
151
+ proc_exit() {
152
+ debug('proc_exit');
153
+ return 52;
154
+ },
155
+ /**
156
+ * Generates a random number and returns it.
157
+ * This dummy implementation of 'random_get' method in the wasi API is expected by the environment.
158
+ * In this case, the function always returns 1 to maintain consistency with the environment's expectations.
159
+ *
160
+ * @returns A random number. In this implementation, always returns 1.
161
+ */
162
+ random_get() {
163
+ debug('random_get');
164
+ return 1;
165
+ },
166
+ });
@@ -0,0 +1 @@
1
+ export { WasmModule, IWasmModule } from './wasm_module.js';
@@ -0,0 +1,27 @@
1
+ import { WasmModule } from './wasm_module.js';
2
+ import { fileURLToPath } from 'url';
3
+ import { readFile } from 'fs/promises';
4
+ import { dirname } from 'path';
5
+
6
+ /**
7
+ * Fetch a simple WASM.
8
+ */
9
+ async function fetchCode() {
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ return await readFile(`${__dirname}/../fixtures/gcd.wasm`);
12
+ }
13
+
14
+ describe('simple wasm', () => {
15
+ let wasm!: WasmModule;
16
+
17
+ beforeAll(async () => {
18
+ wasm = new WasmModule(await fetchCode(), () => ({
19
+ /*no imports*/
20
+ }));
21
+ await wasm.init(1, 1, /* No init method */ null);
22
+ });
23
+
24
+ it('should call gcd with correct result', () => {
25
+ expect(wasm.call('gcd', 12312, 12123)).toBe(27);
26
+ });
27
+ });
@@ -0,0 +1,257 @@
1
+ import { Buffer } from 'buffer';
2
+ import { randomBytes } from 'crypto';
3
+ import { createDebugLogger, DebugLogger } from '../../log/index.js';
4
+ import { getEmptyWasiSdk } from './empty_wasi_sdk.js';
5
+ import { MemoryFifo } from '../../fifo/index.js';
6
+
7
+ /**
8
+ * The base shape of a WASM module providing low level memory and synchronous call access.
9
+ * Note that the Aztec codebase used to support asyncify but has fully moved away,
10
+ * using web workers if needed.
11
+ */
12
+ export interface IWasmModule {
13
+ /**
14
+ * Low level call function, returns result as number.
15
+ * @param name - The function name.
16
+ * @param args - The function args.
17
+ * @returns The value as an integer (could be pointer).
18
+ */
19
+ call(name: string, ...args: any): number;
20
+
21
+ /**
22
+ * Get a slice of memory between two addresses.
23
+ * @param start - The start address.
24
+ * @param end - The end address.
25
+ * @returns A Uint8Array view of memory.
26
+ */
27
+ getMemorySlice(start: number, end: number): Uint8Array;
28
+
29
+ /**
30
+ * Write data into the heap.
31
+ * @param offset - The address to write data at.
32
+ * @param arr - The data to write.
33
+ */
34
+ writeMemory(offset: number, arr: Uint8Array): void;
35
+ }
36
+
37
+ /**
38
+ * WasmModule:
39
+ * Helper over a webassembly module.
40
+ * Assumes a few quirks.
41
+ * 1) the module expects wasi_snapshot_preview1 with the methods from getEmptyWasiSdk
42
+ * 2) of which the webassembly
43
+ * we instantiate only uses random_get (update this if more WASI sdk methods are needed).
44
+ */
45
+ export class WasmModule implements IWasmModule {
46
+ private memory!: WebAssembly.Memory;
47
+ private heap!: Uint8Array;
48
+ private instance?: WebAssembly.Instance;
49
+ private mutexQ = new MemoryFifo<boolean>();
50
+ private debug: DebugLogger;
51
+
52
+ /**
53
+ * Create a wasm module. Should be followed by await init();.
54
+ * @param module - The module as a WebAssembly.Module or a Buffer.
55
+ * @param importFn - Imports expected by the WASM.
56
+ * @param loggerName - Optional, for debug logging.
57
+ */
58
+ constructor(
59
+ private module: WebAssembly.Module | Buffer,
60
+ private importFn: (module: WasmModule) => any,
61
+ loggerName = 'wasm',
62
+ ) {
63
+ this.debug = createDebugLogger(loggerName);
64
+ this.mutexQ.put(true);
65
+ }
66
+
67
+ /**
68
+ * Return the wasm source.
69
+ * @returns The source.
70
+ */
71
+ public getModule(): WebAssembly.Module | Buffer {
72
+ return this.module;
73
+ }
74
+ /**
75
+ * Initialize this wasm module.
76
+ * @param wasmImportEnv - Linked to a module called "env". Functions implementations referenced from e.g. C++.
77
+ * @param initial - 30 pages by default. 30*2**16 \> 1mb stack size plus other overheads.
78
+ * @param initMethod - Defaults to calling '_initialize'.
79
+ * @param maximum - 8192 maximum by default. 512mb.
80
+ */
81
+ public async init(initial = 30, maximum = 8192, initMethod: string | null = '_initialize') {
82
+ this.debug(
83
+ `initial mem: ${initial} pages, ${(initial * 2 ** 16) / (1024 * 1024)}mb. max mem: ${maximum} pages, ${
84
+ (maximum * 2 ** 16) / (1024 * 1024)
85
+ }mb`,
86
+ );
87
+ this.memory = new WebAssembly.Memory({ initial, maximum });
88
+ // Create a view over the memory buffer.
89
+ // We do this once here, as webkit *seems* bugged out and actually shows this as new memory,
90
+ // thus displaying double. It's only worse if we create views on demand. I haven't established yet if
91
+ // the bug is also exasperating the termination on mobile due to "excessive memory usage". It could be
92
+ // that the OS is actually getting an incorrect reading in the same way the memory profiler does...
93
+ // The view will have to be recreated if the memory is grown. See getMemory().
94
+ this.heap = new Uint8Array(this.memory.buffer);
95
+
96
+ // We support the wasi 12 SDK, but only implement random_get
97
+ /* eslint-disable camelcase */
98
+ const importObj = {
99
+ wasi_snapshot_preview1: {
100
+ ...getEmptyWasiSdk(this.debug),
101
+ random_get: (arr: number, length: number) => {
102
+ arr = arr >>> 0;
103
+ const heap = this.getMemory();
104
+ const randomData = randomBytes(length);
105
+ for (let i = arr; i < arr + length; ++i) {
106
+ heap[i] = randomData[i - arr];
107
+ }
108
+ },
109
+ },
110
+ env: this.importFn(this),
111
+ };
112
+
113
+ if (this.module instanceof WebAssembly.Module) {
114
+ this.instance = await WebAssembly.instantiate(this.module, importObj);
115
+ } else {
116
+ const { instance } = await WebAssembly.instantiate(this.module, importObj);
117
+ this.instance = instance;
118
+ }
119
+
120
+ // Init all global/static data.
121
+ if (initMethod) {
122
+ this.call(initMethod);
123
+ }
124
+ }
125
+
126
+ /**
127
+ * The methods or objects exported by the WASM module.
128
+ * @returns An indexable object.
129
+ */
130
+ public exports(): any {
131
+ if (!this.instance) {
132
+ throw new Error('WasmModule: not initialized!');
133
+ }
134
+ return this.instance.exports;
135
+ }
136
+
137
+ /**
138
+ * Get the current logger.
139
+ * @returns Logging function.
140
+ */
141
+ public getLogger() {
142
+ return this.debug;
143
+ }
144
+
145
+ /**
146
+ * Add a logger.
147
+ * @param logger - Function to call when logging.
148
+ */
149
+ public addLogger(logger: DebugLogger) {
150
+ const oldDebug = this.debug;
151
+ this.debug = (...args: any[]) => {
152
+ logger(...args);
153
+ oldDebug(...args);
154
+ };
155
+ }
156
+
157
+ /**
158
+ * Calls into the WebAssembly.
159
+ * @param name - The method name.
160
+ * @param args - The arguments to the method.
161
+ * @returns The numeric method result.
162
+ */
163
+ public call(name: string, ...args: any): number {
164
+ if (!this.exports()[name]) {
165
+ throw new Error(`WASM function ${name} not found.`);
166
+ }
167
+ try {
168
+ // When returning values from the WASM, use >>> operator to convert
169
+ // signed representation to unsigned representation.
170
+ return this.exports()[name](...args) >>> 0;
171
+ } catch (err: any) {
172
+ const message = `WASM function ${name} aborted, error: ${err}\n${err.stack}`;
173
+ throw new Error(message);
174
+ }
175
+ }
176
+ /**
177
+ * Get the memory used by the WASM module.
178
+ * @returns A WebAssembly memory object.
179
+ */
180
+ public getRawMemory(): WebAssembly.Memory {
181
+ return this.memory;
182
+ }
183
+ /**
184
+ * Get the memory used by the WASM module, as a byte array.
185
+ * @returns A Uint8Array view of the WASM module memory.
186
+ */
187
+ public getMemory(): Uint8Array {
188
+ // If the memory is grown, our view over it will be lost. Recreate the view.
189
+ if (this.heap.length === 0) {
190
+ this.heap = new Uint8Array(this.memory.buffer);
191
+ }
192
+ return this.heap;
193
+ }
194
+
195
+ /**
196
+ * The memory size in bytes.
197
+ * @returns Number of bytes.
198
+ */
199
+ public memSize(): number {
200
+ return this.getMemory().length;
201
+ }
202
+
203
+ /**
204
+ * Get a slice of memory between two addresses.
205
+ * @param start - The start address.
206
+ * @param end - The end address.
207
+ * @returns A Uint8Array view of memory.
208
+ */
209
+ public getMemorySlice(start: number, end: number): Uint8Array {
210
+ return this.getMemory().slice(start, end);
211
+ }
212
+
213
+ /**
214
+ * Write data into the heap.
215
+ * @param offset - The address to write data at.
216
+ * @param arr - The data to write.
217
+ */
218
+ public writeMemory(offset: number, arr: Uint8Array) {
219
+ const mem = this.getMemory();
220
+ for (let i = 0; i < arr.length; i++) {
221
+ mem[i + offset] = arr[i];
222
+ }
223
+ }
224
+
225
+ /**
226
+ * Read WASM memory as a JS string.
227
+ * @param addr - The memory address.
228
+ * @returns A JS string.
229
+ */
230
+ public getMemoryAsString(addr: number) {
231
+ addr = addr >>> 0;
232
+ const m = this.getMemory();
233
+ let i = addr;
234
+ for (; m[i] !== 0; ++i);
235
+ return Buffer.from(m.slice(addr, i)).toString('ascii');
236
+ }
237
+
238
+ /**
239
+ * When calling the wasm, sometimes a caller will require exclusive access over a series of calls.
240
+ * E.g. When a result is written to address 0, one cannot have another caller writing to the same address via
241
+ * writeMemory before the result is read via sliceMemory.
242
+ * Acquire() gets a single token from a fifo. The caller must call release() to add the token back.
243
+ */
244
+ public async acquire() {
245
+ await this.mutexQ.get();
246
+ }
247
+
248
+ /**
249
+ * Release the mutex, letting another promise call acquire().
250
+ */
251
+ public release() {
252
+ if (this.mutexQ.length() !== 0) {
253
+ throw new Error('Release called but not acquired.');
254
+ }
255
+ this.mutexQ.put(true);
256
+ }
257
+ }
@@ -0,0 +1,2 @@
1
+ export * from './web_worker.js';
2
+ export * from './web_data_store.js';
@@ -0,0 +1,23 @@
1
+ import { DispatchMsg, TransportServer, WorkerListener } from '../../../transport/index.js';
2
+ import { WasmModule } from '../../wasm/wasm_module.js';
3
+
4
+ /**
5
+ * Start the transport server corresponding to this module.
6
+ * @param module - The WasmModule to host.
7
+ */
8
+ export function startWebModule(module: WasmModule) {
9
+ const dispatch = async ({ fn, args }: DispatchMsg) => {
10
+ if (fn === '__destroyWorker__') {
11
+ transportServer.stop();
12
+ return;
13
+ }
14
+ if (!(module as any)[fn]) {
15
+ throw new Error(`dispatch error, function not found: ${fn}`);
16
+ }
17
+ return await (module as any)[fn](...args);
18
+ };
19
+ const transportListener = new WorkerListener(self);
20
+ const transportServer = new TransportServer<DispatchMsg>(transportListener, dispatch);
21
+ module.addLogger((...args: any[]) => transportServer.broadcast({ fn: 'emit', args: ['log', ...args] }));
22
+ transportServer.start();
23
+ }
@@ -0,0 +1,37 @@
1
+ import { DataStore } from '../data_store.js';
2
+ import levelup, { LevelUp } from 'levelup';
3
+ import memdown from 'memdown';
4
+
5
+ /**
6
+ * Cache for data used by wasm module.
7
+ * Stores in a LevelUp database.
8
+ */
9
+ export class WebDataStore implements DataStore {
10
+ private db: LevelUp;
11
+
12
+ constructor() {
13
+ // TODO: The whole point of this is to reduce memory load in the browser.
14
+ // Replace with leveljs so the data is stored in indexeddb and not in memory.
15
+ // Hack: Cast as any to work around package "broken" with node16 resolution
16
+ // See https://github.com/microsoft/TypeScript/issues/49160
17
+ this.db = levelup((memdown as any)());
18
+ }
19
+
20
+ /**
21
+ * Lookup a key.
22
+ * @param key - Key to lookup.
23
+ * @returns The buffer.
24
+ */
25
+ async get(key: string): Promise<Buffer | undefined> {
26
+ return await this.db.get(key).catch(() => {});
27
+ }
28
+
29
+ /**
30
+ * Alter a key.
31
+ * @param key - Key to alter.
32
+ * @param value - Buffer to store.
33
+ */
34
+ async set(key: string, value: Buffer): Promise<void> {
35
+ await this.db.put(key, value);
36
+ }
37
+ }
@@ -0,0 +1,24 @@
1
+ import { DispatchMsg, TransportClient, WorkerConnector, createDispatchProxy } from '../../../transport/index.js';
2
+ import { WasmModule } from '../../wasm/wasm_module.js';
3
+ import { WasmWorker } from '../wasm_worker.js';
4
+
5
+ /**
6
+ * Instantiate a web worker.
7
+ * @param url - The URL.
8
+ * @param initialMem - Initial memory pages.
9
+ * @param maxMem - Maximum memory pages.
10
+ * @returns The worker.
11
+ */
12
+ export async function createWebWorker(url: string, initialMem?: number, maxMem?: number): Promise<WasmWorker> {
13
+ const worker = new Worker(url);
14
+ const transportConnect = new WorkerConnector(worker);
15
+ const transportClient = new TransportClient<DispatchMsg>(transportConnect);
16
+ await transportClient.open();
17
+ const remoteModule = createDispatchProxy(WasmModule, transportClient) as WasmWorker;
18
+ remoteModule.destroyWorker = async () => {
19
+ await transportClient.request({ fn: '__destroyWorker__', args: [] });
20
+ transportClient.close();
21
+ };
22
+ await remoteModule.init(initialMem, maxMem);
23
+ return remoteModule;
24
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Simple read/write interface for wasm modules.
3
+ */
4
+ export interface DataStore {
5
+ get(key: string): Promise<Buffer | undefined>;
6
+ set(key: string, value: Buffer): Promise<void>;
7
+ }
@@ -0,0 +1,2 @@
1
+ export { WorkerPool } from './worker_pool.js';
2
+ export { WasmWorker } from './wasm_worker.js';
@@ -0,0 +1,2 @@
1
+ export * from './node_worker.js';
2
+ export * from './node_data_store.js';
@@ -0,0 +1,36 @@
1
+ import { DataStore } from '../data_store.js';
2
+ import levelup, { LevelUp } from 'levelup';
3
+ import leveldown from 'leveldown';
4
+ import memdown from 'memdown';
5
+
6
+ /**
7
+ * Cache for data used by wasm module.
8
+ */
9
+ export class NodeDataStore implements DataStore {
10
+ private db: LevelUp;
11
+
12
+ // eslint-disable-next-line
13
+ constructor(path?: string) {
14
+ // Hack: Cast as any to work around packages "broken" with node16 resolution
15
+ // See https://github.com/microsoft/TypeScript/issues/49160
16
+ this.db = levelup(path ? (leveldown as any)(path) : (memdown as any)());
17
+ }
18
+
19
+ /**
20
+ * Get a value from our DB.
21
+ * @param key - The key to look up.
22
+ * @returns The value.
23
+ */
24
+ async get(key: string): Promise<Buffer | undefined> {
25
+ return await this.db.get(key).catch(() => {});
26
+ }
27
+
28
+ /**
29
+ * Set a value in our DB.
30
+ * @param key - The key to update.
31
+ * @param value - The value to set.
32
+ */
33
+ async set(key: string, value: Buffer): Promise<void> {
34
+ await this.db.put(key, value);
35
+ }
36
+ }
@@ -0,0 +1,21 @@
1
+ import { Worker } from 'worker_threads';
2
+ import { WasmModule } from '../../wasm/wasm_module.js';
3
+ import { WasmWorker } from '../wasm_worker.js';
4
+ import { DispatchMsg, NodeConnector, TransportClient, createDispatchProxy } from '../../../transport/index.js';
5
+
6
+ /**
7
+ * Creates a node worker.
8
+ */
9
+ export async function createNodeWorker(filepath: string, initialMem?: number, maxMem?: number): Promise<WasmWorker> {
10
+ const worker = new Worker(filepath);
11
+ const transportConnect = new NodeConnector(worker);
12
+ const transportClient = new TransportClient<DispatchMsg>(transportConnect);
13
+ await transportClient.open();
14
+ const remoteModule = createDispatchProxy(WasmModule, transportClient) as WasmWorker;
15
+ remoteModule.destroyWorker = async () => {
16
+ await transportClient.request({ fn: '__destroyWorker__', args: [] });
17
+ transportClient.close();
18
+ };
19
+ await remoteModule.init(initialMem, maxMem);
20
+ return remoteModule;
21
+ }
@@ -0,0 +1,28 @@
1
+ import { parentPort } from 'worker_threads';
2
+ import { WasmModule } from '../../wasm/wasm_module.js';
3
+ import { DispatchMsg, NodeListener, TransportServer } from '../../../transport/index.js';
4
+
5
+ if (!parentPort) {
6
+ throw new Error('InvalidWorker');
7
+ }
8
+
9
+ /**
10
+ * Start the transport server corresponding to this module.
11
+ * @param module - The WasmModule to host.
12
+ */
13
+ export function startNodeModule(module: WasmModule) {
14
+ const dispatch = async ({ fn, args }: DispatchMsg) => {
15
+ if (fn === '__destroyWorker__') {
16
+ transportServer.stop();
17
+ return;
18
+ }
19
+ if (!(module as any)[fn]) {
20
+ throw new Error(`dispatch error, function not found: ${fn}`);
21
+ }
22
+ return await (module as any)[fn](...args);
23
+ };
24
+ const transportListener = new NodeListener();
25
+ const transportServer = new TransportServer<DispatchMsg>(transportListener, dispatch);
26
+ module.addLogger((...args: any[]) => transportServer.broadcast({ fn: 'emit', args: ['log', ...args] }));
27
+ transportServer.start();
28
+ }
@@ -0,0 +1,7 @@
1
+ import { Proxify } from '../../transport/index.js';
2
+ import { WasmModule } from '../wasm/wasm_module.js';
3
+
4
+ /**
5
+ * Represents either a WASM web worker, or node.js worker.
6
+ */
7
+ export type WasmWorker = Proxify<WasmModule> & { destroyWorker(): void };