@aztec/bb.js 0.0.1-alpha.6 → 0.0.1-fake-ceab37513c

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 (227) hide show
  1. package/README.md +69 -33
  2. package/package.json +56 -41
  3. package/src/barretenberg/__snapshots__/pedersen.test.ts.snap +156 -0
  4. package/src/barretenberg/__snapshots__/poseidon.test.ts.snap +40 -0
  5. package/src/barretenberg/backend.ts +378 -0
  6. package/src/barretenberg/blake2s.test.ts +70 -0
  7. package/src/{barretenberg_api → barretenberg}/common.test.ts +7 -5
  8. package/src/barretenberg/index.ts +204 -0
  9. package/src/barretenberg/pedersen.test.ts +62 -0
  10. package/src/barretenberg/poseidon.test.ts +39 -0
  11. package/src/barretenberg_api/index.ts +1128 -383
  12. package/src/barretenberg_wasm/barretenberg_wasm_base/index.ts +138 -0
  13. package/src/barretenberg_wasm/barretenberg_wasm_main/factory/browser/index.ts +11 -0
  14. package/src/barretenberg_wasm/barretenberg_wasm_main/factory/browser/main.worker.ts +13 -0
  15. package/src/barretenberg_wasm/barretenberg_wasm_main/factory/node/index.ts +21 -0
  16. package/src/barretenberg_wasm/barretenberg_wasm_main/factory/node/main.worker.ts +19 -0
  17. package/src/{barretenberg_binder/heap_allocator_sync.ts → barretenberg_wasm/barretenberg_wasm_main/heap_allocator.ts} +20 -17
  18. package/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +167 -0
  19. package/src/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/index.ts +11 -0
  20. package/src/barretenberg_wasm/barretenberg_wasm_thread/factory/browser/thread.worker.ts +13 -0
  21. package/src/barretenberg_wasm/barretenberg_wasm_thread/factory/node/index.ts +21 -0
  22. package/src/barretenberg_wasm/barretenberg_wasm_thread/factory/node/thread.worker.ts +19 -0
  23. package/src/barretenberg_wasm/barretenberg_wasm_thread/index.ts +47 -0
  24. package/src/barretenberg_wasm/fetch_code/browser/barretenberg-threads.ts +3 -0
  25. package/src/barretenberg_wasm/fetch_code/browser/barretenberg.ts +3 -0
  26. package/src/barretenberg_wasm/fetch_code/browser/index.ts +34 -0
  27. package/src/barretenberg_wasm/fetch_code/index.ts +1 -0
  28. package/src/barretenberg_wasm/fetch_code/node/index.ts +34 -0
  29. package/src/barretenberg_wasm/fetch_code/wasm-module.d.ts +4 -0
  30. package/src/barretenberg_wasm/helpers/browser/index.ts +47 -0
  31. package/src/barretenberg_wasm/helpers/index.ts +1 -0
  32. package/src/barretenberg_wasm/{node → helpers/node}/index.ts +24 -15
  33. package/src/barretenberg_wasm/index.test.ts +45 -0
  34. package/src/barretenberg_wasm/index.ts +22 -1
  35. package/src/benchmark/index.ts +26 -0
  36. package/src/benchmark/timer.ts +45 -0
  37. package/src/bigint-array/index.ts +39 -17
  38. package/src/bindgen/index.ts +2 -2
  39. package/src/bindgen/mappings.ts +3 -2
  40. package/src/bindgen/typescript.ts +50 -25
  41. package/src/cbind/README.md +1 -0
  42. package/src/cbind/generate.ts +89 -0
  43. package/src/cbind/schema_compiler.ts +833 -0
  44. package/src/crs/browser/cached_net_crs.ts +41 -2
  45. package/src/crs/browser/index.ts +1 -1
  46. package/src/crs/index.ts +1 -1
  47. package/src/crs/net_crs.ts +114 -19
  48. package/src/crs/node/index.ts +98 -20
  49. package/src/index.html +1 -1
  50. package/src/index.ts +13 -5
  51. package/src/log/browser/index.ts +35 -0
  52. package/src/log/index.ts +1 -0
  53. package/src/log/node/index.ts +52 -0
  54. package/src/log/types.ts +6 -0
  55. package/src/main.ts +395 -185
  56. package/src/proof/index.ts +94 -0
  57. package/src/random/browser/index.ts +1 -1
  58. package/src/retry/index.ts +50 -0
  59. package/src/serialize/buffer_reader.ts +4 -1
  60. package/src/types/fields.ts +46 -18
  61. package/src/types/point.ts +4 -1
  62. package/dest/async_map/index.d.ts +0 -10
  63. package/dest/async_map/index.d.ts.map +0 -1
  64. package/dest/async_map/index.js +0 -16
  65. package/dest/barretenberg-threads.wasm +0 -0
  66. package/dest/barretenberg.wasm +0 -0
  67. package/dest/barretenberg_api/blake2s.test.d.ts +0 -2
  68. package/dest/barretenberg_api/blake2s.test.d.ts.map +0 -1
  69. package/dest/barretenberg_api/blake2s.test.js +0 -30
  70. package/dest/barretenberg_api/common.test.d.ts +0 -2
  71. package/dest/barretenberg_api/common.test.d.ts.map +0 -1
  72. package/dest/barretenberg_api/common.test.js +0 -18
  73. package/dest/barretenberg_api/index.d.ts +0 -103
  74. package/dest/barretenberg_api/index.d.ts.map +0 -1
  75. package/dest/barretenberg_api/index.js +0 -379
  76. package/dest/barretenberg_api/pedersen.test.d.ts +0 -2
  77. package/dest/barretenberg_api/pedersen.test.d.ts.map +0 -1
  78. package/dest/barretenberg_api/pedersen.test.js +0 -69
  79. package/dest/barretenberg_api/schnorr.test.d.ts +0 -2
  80. package/dest/barretenberg_api/schnorr.test.d.ts.map +0 -1
  81. package/dest/barretenberg_api/schnorr.test.js +0 -113
  82. package/dest/barretenberg_binder/heap_allocator.d.ts +0 -22
  83. package/dest/barretenberg_binder/heap_allocator.d.ts.map +0 -1
  84. package/dest/barretenberg_binder/heap_allocator.js +0 -59
  85. package/dest/barretenberg_binder/heap_allocator_sync.d.ts +0 -22
  86. package/dest/barretenberg_binder/heap_allocator_sync.d.ts.map +0 -1
  87. package/dest/barretenberg_binder/heap_allocator_sync.js +0 -58
  88. package/dest/barretenberg_binder/index.d.ts +0 -32
  89. package/dest/barretenberg_binder/index.d.ts.map +0 -1
  90. package/dest/barretenberg_binder/index.js +0 -73
  91. package/dest/barretenberg_wasm/barretenberg_wasm.d.ts +0 -50
  92. package/dest/barretenberg_wasm/barretenberg_wasm.d.ts.map +0 -1
  93. package/dest/barretenberg_wasm/barretenberg_wasm.js +0 -212
  94. package/dest/barretenberg_wasm/barretenberg_wasm.test.d.ts +0 -2
  95. package/dest/barretenberg_wasm/barretenberg_wasm.test.d.ts.map +0 -1
  96. package/dest/barretenberg_wasm/barretenberg_wasm.test.js +0 -43
  97. package/dest/barretenberg_wasm/browser/index.d.ts +0 -8
  98. package/dest/barretenberg_wasm/browser/index.d.ts.map +0 -1
  99. package/dest/barretenberg_wasm/browser/index.js +0 -26
  100. package/dest/barretenberg_wasm/browser/worker.d.ts +0 -2
  101. package/dest/barretenberg_wasm/browser/worker.d.ts.map +0 -1
  102. package/dest/barretenberg_wasm/browser/worker.js +0 -11
  103. package/dest/barretenberg_wasm/index.d.ts +0 -2
  104. package/dest/barretenberg_wasm/index.d.ts.map +0 -1
  105. package/dest/barretenberg_wasm/index.js +0 -2
  106. package/dest/barretenberg_wasm/node/index.d.ts +0 -17
  107. package/dest/barretenberg_wasm/node/index.d.ts.map +0 -1
  108. package/dest/barretenberg_wasm/node/index.js +0 -40
  109. package/dest/barretenberg_wasm/node/node_endpoint.d.ts +0 -8
  110. package/dest/barretenberg_wasm/node/node_endpoint.d.ts.map +0 -1
  111. package/dest/barretenberg_wasm/node/node_endpoint.js +0 -28
  112. package/dest/barretenberg_wasm/node/worker.d.ts +0 -2
  113. package/dest/barretenberg_wasm/node/worker.d.ts.map +0 -1
  114. package/dest/barretenberg_wasm/node/worker.js +0 -9
  115. package/dest/barretenberg_wasm.js +0 -2
  116. package/dest/barretenberg_wasm.js.LICENSE.txt +0 -5
  117. package/dest/bigint-array/index.d.ts +0 -3
  118. package/dest/bigint-array/index.d.ts.map +0 -1
  119. package/dest/bigint-array/index.js +0 -21
  120. package/dest/bindgen/function_declaration.d.ts +0 -11
  121. package/dest/bindgen/function_declaration.d.ts.map +0 -1
  122. package/dest/bindgen/function_declaration.js +0 -2
  123. package/dest/bindgen/index.d.ts +0 -2
  124. package/dest/bindgen/index.d.ts.map +0 -1
  125. package/dest/bindgen/index.js +0 -15
  126. package/dest/bindgen/mappings.d.ts +0 -4
  127. package/dest/bindgen/mappings.d.ts.map +0 -1
  128. package/dest/bindgen/mappings.js +0 -63
  129. package/dest/bindgen/rust.d.ts +0 -2
  130. package/dest/bindgen/rust.d.ts.map +0 -1
  131. package/dest/bindgen/rust.js +0 -43
  132. package/dest/bindgen/to_camel_case.d.ts +0 -2
  133. package/dest/bindgen/to_camel_case.d.ts.map +0 -1
  134. package/dest/bindgen/to_camel_case.js +0 -11
  135. package/dest/bindgen/typescript.d.ts +0 -2
  136. package/dest/bindgen/typescript.d.ts.map +0 -1
  137. package/dest/bindgen/typescript.js +0 -80
  138. package/dest/crs/browser/cached_net_crs.d.ts +0 -25
  139. package/dest/crs/browser/cached_net_crs.d.ts.map +0 -1
  140. package/dest/crs/browser/cached_net_crs.js +0 -54
  141. package/dest/crs/browser/index.d.ts +0 -2
  142. package/dest/crs/browser/index.d.ts.map +0 -1
  143. package/dest/crs/browser/index.js +0 -2
  144. package/dest/crs/index.d.ts +0 -2
  145. package/dest/crs/index.d.ts.map +0 -1
  146. package/dest/crs/index.js +0 -2
  147. package/dest/crs/net_crs.d.ts +0 -36
  148. package/dest/crs/net_crs.d.ts.map +0 -1
  149. package/dest/crs/net_crs.js +0 -59
  150. package/dest/crs/node/file_crs.d.ts +0 -37
  151. package/dest/crs/node/file_crs.d.ts.map +0 -1
  152. package/dest/crs/node/file_crs.js +0 -51
  153. package/dest/crs/node/index.d.ts +0 -31
  154. package/dest/crs/node/index.d.ts.map +0 -1
  155. package/dest/crs/node/index.js +0 -41
  156. package/dest/examples/simple.rawtest.d.ts +0 -2
  157. package/dest/examples/simple.rawtest.d.ts.map +0 -1
  158. package/dest/examples/simple.rawtest.js +0 -29
  159. package/dest/examples/simple.test.d.ts +0 -2
  160. package/dest/examples/simple.test.d.ts.map +0 -1
  161. package/dest/examples/simple.test.js +0 -22
  162. package/dest/factory/index.d.ts +0 -21
  163. package/dest/factory/index.d.ts.map +0 -1
  164. package/dest/factory/index.js +0 -34
  165. package/dest/index.d.ts +0 -6
  166. package/dest/index.d.ts.map +0 -1
  167. package/dest/index.html +0 -1
  168. package/dest/index.js +0 -6
  169. package/dest/main.d.ts +0 -10
  170. package/dest/main.d.ts.map +0 -1
  171. package/dest/main.js +0 -280
  172. package/dest/random/browser/index.d.ts +0 -2
  173. package/dest/random/browser/index.d.ts.map +0 -1
  174. package/dest/random/browser/index.js +0 -31
  175. package/dest/random/index.d.ts +0 -2
  176. package/dest/random/index.d.ts.map +0 -1
  177. package/dest/random/index.js +0 -2
  178. package/dest/random/node/index.d.ts +0 -2
  179. package/dest/random/node/index.d.ts.map +0 -1
  180. package/dest/random/node/index.js +0 -5
  181. package/dest/serialize/buffer_reader.d.ts +0 -28
  182. package/dest/serialize/buffer_reader.d.ts.map +0 -1
  183. package/dest/serialize/buffer_reader.js +0 -66
  184. package/dest/serialize/index.d.ts +0 -4
  185. package/dest/serialize/index.d.ts.map +0 -1
  186. package/dest/serialize/index.js +0 -4
  187. package/dest/serialize/output_type.d.ts +0 -11
  188. package/dest/serialize/output_type.d.ts.map +0 -1
  189. package/dest/serialize/output_type.js +0 -44
  190. package/dest/serialize/serialize.d.ts +0 -53
  191. package/dest/serialize/serialize.d.ts.map +0 -1
  192. package/dest/serialize/serialize.js +0 -139
  193. package/dest/simple_test.js +0 -2
  194. package/dest/simple_test.js.LICENSE.txt +0 -14
  195. package/dest/types/fields.d.ts +0 -33
  196. package/dest/types/fields.d.ts.map +0 -1
  197. package/dest/types/fields.js +0 -86
  198. package/dest/types/fixed_size_buffer.d.ts +0 -26
  199. package/dest/types/fixed_size_buffer.d.ts.map +0 -1
  200. package/dest/types/fixed_size_buffer.js +0 -54
  201. package/dest/types/index.d.ts +0 -6
  202. package/dest/types/index.d.ts.map +0 -1
  203. package/dest/types/index.js +0 -6
  204. package/dest/types/point.d.ts +0 -17
  205. package/dest/types/point.d.ts.map +0 -1
  206. package/dest/types/point.js +0 -32
  207. package/dest/types/ptr.d.ts +0 -13
  208. package/dest/types/ptr.d.ts.map +0 -1
  209. package/dest/types/ptr.js +0 -20
  210. package/dest/types/raw_buffer.d.ts +0 -3
  211. package/dest/types/raw_buffer.d.ts.map +0 -1
  212. package/dest/types/raw_buffer.js +0 -5
  213. package/src/barretenberg_api/blake2s.test.ts +0 -39
  214. package/src/barretenberg_api/pedersen.test.ts +0 -84
  215. package/src/barretenberg_api/schnorr.test.ts +0 -169
  216. package/src/barretenberg_binder/heap_allocator.ts +0 -62
  217. package/src/barretenberg_binder/index.ts +0 -76
  218. package/src/barretenberg_wasm/barretenberg_wasm.test.ts +0 -52
  219. package/src/barretenberg_wasm/barretenberg_wasm.ts +0 -246
  220. package/src/barretenberg_wasm/browser/index.ts +0 -32
  221. package/src/barretenberg_wasm/browser/worker.ts +0 -13
  222. package/src/barretenberg_wasm/node/worker.ts +0 -10
  223. package/src/crs/node/file_crs.ts +0 -60
  224. package/src/examples/simple.rawtest.ts +0 -37
  225. package/src/examples/simple.test.ts +0 -27
  226. package/src/factory/index.ts +0 -36
  227. /package/src/barretenberg_wasm/{node → helpers/node}/node_endpoint.ts +0 -0
@@ -0,0 +1,47 @@
1
+ import { wrap } from 'comlink';
2
+
3
+ export function getSharedMemoryAvailable() {
4
+ const globalScope = typeof window !== 'undefined' ? window : globalThis;
5
+ return typeof SharedArrayBuffer !== 'undefined' && globalScope.crossOriginIsolated;
6
+ }
7
+
8
+ export function getRemoteBarretenbergWasm<T>(worker: Worker) {
9
+ return wrap<T>(worker);
10
+ }
11
+
12
+ export function getNumCpu() {
13
+ return navigator.hardwareConcurrency;
14
+ }
15
+
16
+ export function threadLogger(): ((msg: string) => void) | undefined {
17
+ return console.log;
18
+ }
19
+
20
+ export function killSelf() {
21
+ self.close();
22
+ }
23
+
24
+ export function getAvailableThreads(logger: (msg: string) => void): number {
25
+ if (typeof navigator !== 'undefined' && navigator.hardwareConcurrency) {
26
+ return navigator.hardwareConcurrency;
27
+ } else {
28
+ logger(`Could not detect environment to query number of threads. Falling back to one thread.`);
29
+ return 1;
30
+ }
31
+ }
32
+
33
+ // Solution to async initialization of workers, taken from
34
+ // https://github.com/GoogleChromeLabs/comlink/issues/635#issuecomment-1598913044
35
+
36
+ /** The message expected by the `readinessListener`. */
37
+ export const Ready = { ready: true };
38
+
39
+ /** Listen for the readiness message from the Worker and call the `callback` once. */
40
+ export function readinessListener(worker: Worker, callback: () => void) {
41
+ worker.addEventListener('message', function ready(event: MessageEvent<typeof Ready>) {
42
+ if (!!event.data && event.data.ready === true) {
43
+ worker.removeEventListener('message', ready);
44
+ callback();
45
+ }
46
+ });
47
+ }
@@ -0,0 +1 @@
1
+ export * from './node/index.js';
@@ -1,29 +1,27 @@
1
1
  import { Worker } from 'worker_threads';
2
- import { dirname } from 'path';
3
- import { fileURLToPath } from 'url';
4
- import { readFile } from 'fs/promises';
5
2
  import os from 'os';
6
- import { type BarretenbergWasm, type BarretenbergWasmWorker } from '../barretenberg_wasm.js';
7
3
  import { wrap } from 'comlink';
8
4
  import { nodeEndpoint } from './node_endpoint.js';
9
5
  import { writeSync } from 'fs';
10
6
 
11
- export async function fetchCode(name: string) {
12
- const __dirname = dirname(fileURLToPath(import.meta.url));
13
- return await readFile(__dirname + '/../../' + name);
7
+ export function getSharedMemoryAvailable() {
8
+ return true;
14
9
  }
15
10
 
16
- export function createWorker() {
17
- const __dirname = dirname(fileURLToPath(import.meta.url));
18
- return new Worker(__dirname + `/worker.js`);
19
- }
20
-
21
- export function getRemoteBarretenbergWasm(worker: Worker): BarretenbergWasmWorker {
22
- return wrap<BarretenbergWasm>(nodeEndpoint(worker)) as BarretenbergWasmWorker;
11
+ /**
12
+ * Comlink allows you to produce a Proxy to the worker, enabling you to call methods as if it were a normal class.
13
+ * Note we give it the type information it needs so the returned Proxy object looks like that type.
14
+ * Node has a different implementation, needing this nodeEndpoint wrapper, hence this function exists here.
15
+ */
16
+ export function getRemoteBarretenbergWasm<T>(worker: Worker) {
17
+ return wrap<T>(nodeEndpoint(worker));
23
18
  }
24
19
 
20
+ /**
21
+ * Returns number of cpus as reported by the system, unless overriden by HARDWARE_CONCURRENCY env var.
22
+ */
25
23
  export function getNumCpu() {
26
- return os.cpus().length;
24
+ return +process.env.HARDWARE_CONCURRENCY! || os.cpus().length;
27
25
  }
28
26
 
29
27
  /**
@@ -44,3 +42,14 @@ export function killSelf(): never {
44
42
  process.kill(process.pid);
45
43
  throw new Error();
46
44
  }
45
+
46
+ export function getAvailableThreads(logger: (msg: string) => void): number {
47
+ try {
48
+ return os.cpus().length;
49
+ } catch (e: any) {
50
+ logger(
51
+ `Could not detect environment to query number of threads. Falling back to one thread. Error: ${e.message ?? e}`,
52
+ );
53
+ return 1;
54
+ }
55
+ }
@@ -0,0 +1,45 @@
1
+ import { BarretenbergWasmMain, BarretenbergWasmMainWorker } from './barretenberg_wasm_main/index.js';
2
+ import { Barretenberg } from '../index.js';
3
+
4
+ describe('barretenberg wasm', () => {
5
+ let api: Barretenberg;
6
+ let wasm: BarretenbergWasmMainWorker;
7
+
8
+ beforeAll(async () => {
9
+ api = await Barretenberg.new({ threads: 2 });
10
+ wasm = api.getWasm();
11
+ }, 20000);
12
+
13
+ afterAll(async () => {
14
+ await api.destroy();
15
+ });
16
+
17
+ it('should new malloc, transfer and slice mem', async () => {
18
+ const length = 1024;
19
+ const ptr = await wasm.call('bbmalloc', length);
20
+ const buf = Buffer.alloc(length, 128);
21
+ await wasm.writeMemory(ptr, Uint8Array.from(buf));
22
+ const result = Buffer.from(await wasm.getMemorySlice(ptr, ptr + length));
23
+ await wasm.call('bbfree', ptr);
24
+ expect(result).toStrictEqual(buf);
25
+ });
26
+
27
+ it('test abort', async () => {
28
+ await expect(() => wasm.call('test_abort')).rejects.toThrow();
29
+ });
30
+
31
+ it('test c/c++ stdout/stderr', async () => {
32
+ // We're checking we don't crash, but you can manually confirm you see log lines handled by logstr.
33
+ await wasm.call('test_stdout_stderr');
34
+ });
35
+
36
+ it('should new malloc, transfer and slice mem', async () => {
37
+ const length = 1024;
38
+ const ptr = await wasm.call('bbmalloc', length);
39
+ const buf = Buffer.alloc(length, 128);
40
+ await wasm.writeMemory(ptr, Uint8Array.from(buf));
41
+ const result = Buffer.from(await wasm.getMemorySlice(ptr, ptr + length));
42
+ await wasm.call('bbfree', ptr);
43
+ expect(result).toStrictEqual(buf);
44
+ });
45
+ });
@@ -1 +1,22 @@
1
- export * from "./barretenberg_wasm.js";
1
+ import { getSharedMemoryAvailable, getAvailableThreads } from './helpers/node/index.js';
2
+ import { fetchCode } from './fetch_code/index.js';
3
+ import { createDebugLogger } from '../log/index.js';
4
+
5
+ export async function fetchModuleAndThreads(
6
+ desiredThreads = 32,
7
+ wasmPath?: string,
8
+ logger: (msg: string) => void = createDebugLogger('fetch_mat'),
9
+ ) {
10
+ const shared = getSharedMemoryAvailable();
11
+
12
+ const availableThreads = shared ? await getAvailableThreads(logger) : 1;
13
+ // We limit the number of threads to 32 as we do not benefit from greater numbers.
14
+ const limitedThreads = Math.min(desiredThreads, availableThreads, 32);
15
+
16
+ logger(`Fetching bb wasm from ${wasmPath ?? 'default location'}`);
17
+ const code = await fetchCode(shared, wasmPath);
18
+ logger(`Compiling bb wasm of ${code.byteLength} bytes`);
19
+ const module = await WebAssembly.compile(code);
20
+ logger('Compilation of bb wasm complete');
21
+ return { module, threads: limitedThreads };
22
+ }
@@ -0,0 +1,26 @@
1
+ import * as fs from 'fs';
2
+ export * from './timer.js';
3
+
4
+ const bfd = (() => {
5
+ const bfdStr = process.env.BENCHMARK_FD;
6
+ const bfd = bfdStr ? parseInt(bfdStr) : -1;
7
+ if (bfd >= 0 && !fs.fstatSync(bfd)) {
8
+ throw new Error('fd is not open. Did you redirect in your shell?');
9
+ }
10
+ return bfd;
11
+ })();
12
+
13
+ export function writeBenchmark<T>(name: string, value: T, labels: Record<string, any> = {}) {
14
+ if (bfd === -1) {
15
+ return;
16
+ }
17
+ const data = {
18
+ timestamp: new Date().toISOString(),
19
+ name,
20
+ type: typeof value,
21
+ value,
22
+ ...labels,
23
+ };
24
+ const jsonl = JSON.stringify(data) + '\n';
25
+ fs.writeSync(bfd, jsonl);
26
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Timer class to measure time intervals in milliseconds and seconds.
3
+ * Upon instantiation, it stores the current timestamp as the starting point.
4
+ * The 'ms()' method returns the elapsed time in milliseconds,
5
+ * while the 's()' method returns the elapsed time in seconds.
6
+ *
7
+ * @example
8
+ * const timer = new Timer();
9
+ * setTimeout(() =\> \{
10
+ * console.log(`Elapsed time: ${timer.ms()} ms`);
11
+ * \}, 1000);
12
+ */
13
+ export class Timer {
14
+ private start: number;
15
+
16
+ constructor() {
17
+ this.start = performance.now();
18
+ }
19
+
20
+ public us() {
21
+ return this.ms() * 1000;
22
+ }
23
+
24
+ /**
25
+ * Returns the elapsed time in milliseconds since the Timer instance was created.
26
+ * Provides a simple and convenient way to measure the time duration between two events
27
+ * or monitor performance of specific code sections.
28
+ *
29
+ * @returns The elapsed time in milliseconds.
30
+ */
31
+ public ms() {
32
+ return performance.now() - this.start;
33
+ }
34
+
35
+ /**
36
+ * Returns the time elapsed since the Timer instance was created, in seconds.
37
+ * The value is calculated by subtracting the initial start time from the current time
38
+ * and dividing the result by 1000 to convert milliseconds to seconds.
39
+ *
40
+ * @returns The elapsed time in seconds.
41
+ */
42
+ public s() {
43
+ return this.ms() / 1000;
44
+ }
45
+ }
@@ -1,21 +1,43 @@
1
- export function toBigIntBE(bytes: Uint8Array) {
2
- // A Buffer in node, *is* a Uint8Array. We can't refuse it's type.
3
- // However the algo below only works on an actual Uint8Array, hence we make a new one to be safe.
4
- bytes = new Uint8Array(bytes);
5
- let bigint = BigInt(0);
6
- const view = new DataView(bytes.buffer);
7
- for (let i = 0; i < bytes.byteLength; i++) {
8
- bigint = (bigint << BigInt(8)) + BigInt(view.getUint8(i));
9
- }
10
- return bigint;
1
+ /**
2
+ * Convert a 32-byte BE Buffer to a BigInt.
3
+ */
4
+ export function buffer32BytesToBigIntBE(buf: Buffer): bigint {
5
+ return (
6
+ (buf.readBigUInt64BE(0) << 192n) +
7
+ (buf.readBigUInt64BE(8) << 128n) +
8
+ (buf.readBigUInt64BE(16) << 64n) +
9
+ buf.readBigUInt64BE(24)
10
+ );
11
+ }
12
+
13
+ /**
14
+ * Convert a BE Uint8Array to a BigInt.
15
+ */
16
+ export function uint8ArrayToBigIntBE(bytes: Uint8Array): bigint {
17
+ const buffer = Buffer.from(bytes);
18
+ return buffer32BytesToBigIntBE(buffer);
11
19
  }
12
20
 
13
- export function toBufferBE(value: bigint, byteLength = 32) {
14
- const bytes = new Uint8Array(byteLength);
15
- const view = new DataView(bytes.buffer);
16
- for (let i = 0; i < byteLength; i++) {
17
- view.setUint8(byteLength - i - 1, Number(value & BigInt(0xff)));
18
- value >>= BigInt(8);
21
+ /**
22
+ * Convert a BigInt to a 32-byte BE Buffer.
23
+ */
24
+ export function bigIntToBufferBE(value: bigint, byteLength = 32): Buffer {
25
+ if (byteLength != 32) {
26
+ throw new Error(
27
+ `Only 32 bytes supported for conversion from bigint to buffer, attempted byte length: ${byteLength}`,
28
+ );
19
29
  }
20
- return bytes;
30
+ const buf = Buffer.alloc(byteLength);
31
+ buf.writeBigUInt64BE(value >> 192n, 0);
32
+ buf.writeBigUInt64BE((value >> 128n) & 0xffffffffffffffffn, 8);
33
+ buf.writeBigUInt64BE((value >> 64n) & 0xffffffffffffffffn, 16);
34
+ buf.writeBigUInt64BE(value & 0xffffffffffffffffn, 24);
35
+ return buf;
36
+ }
37
+
38
+ /**
39
+ * Convert a BigInt to a 32-byte BE Uint8Array.
40
+ */
41
+ export function bigIntToUint8ArrayBE(value: bigint, byteLength = 32): Uint8Array {
42
+ return new Uint8Array(bigIntToBufferBE(value, byteLength));
21
43
  }
@@ -1,7 +1,7 @@
1
1
  import { generateRustCode } from './rust.js';
2
2
  import { generateTypeScriptCode } from './typescript.js';
3
3
 
4
- const [, , exports = '../exports.json', lang = 'ts'] = process.argv;
4
+ const [, , exp = '../exports.json', lang = 'ts'] = process.argv;
5
5
 
6
6
  function generateCode(exports: string, lang: string) {
7
7
  switch (lang) {
@@ -14,4 +14,4 @@ function generateCode(exports: string, lang: string) {
14
14
  }
15
15
  }
16
16
 
17
- console.log(generateCode(exports, lang));
17
+ console.log(generateCode(exp, lang));
@@ -2,8 +2,8 @@
2
2
  const typeMap: { [key: string]: string } = {
3
3
  in_ptr: 'Ptr',
4
4
  out_ptr: 'Ptr',
5
- 'barretenberg::fr::in_buf': 'Fr',
6
- 'barretenberg::fr::vec_in_buf': 'Fr[]',
5
+ 'bb::fr::in_buf': 'Fr',
6
+ 'bb::fr::vec_in_buf': 'Fr[]',
7
7
  'fr::in_buf': 'Fr',
8
8
  'fr::out_buf': 'Fr',
9
9
  'fr::vec_in_buf': 'Fr[]',
@@ -13,6 +13,7 @@ const typeMap: { [key: string]: string } = {
13
13
  'fq::vec_in_buf': 'Fq[]',
14
14
  'fq::vec_out_buf': 'Fq[]',
15
15
  'const uint8_t *': 'Uint8Array',
16
+ uint8_vec_vec_in_buf: 'Uint8Array[]',
16
17
  'uint8_t **': 'Uint8Array',
17
18
  in_str_buf: 'string',
18
19
  out_str_buf: 'string',
@@ -9,37 +9,52 @@ export function generateTypeScriptCode(filename: string) {
9
9
 
10
10
  let output = `// WARNING: FILE CODE GENERATED BY BINDGEN UTILITY. DO NOT EDIT!
11
11
  /* eslint-disable @typescript-eslint/no-unused-vars */
12
- import { BarretenbergBinder, BarretenbergBinderSync } from '../barretenberg_binder/index.js';
13
- import { BufferDeserializer, NumberDeserializer, VectorDeserializer, BoolDeserializer, StringDeserializer } from '../serialize/index.js';
14
- import { Fr, Fq, Point, Buffer32, Buffer128, Ptr } from '../types/index.js';
12
+ import { BarretenbergWasmMain, BarretenbergWasmMainWorker } from '../barretenberg_wasm/barretenberg_wasm_main/index.js';
13
+ import { BufferDeserializer, NumberDeserializer, VectorDeserializer, BoolDeserializer, StringDeserializer, serializeBufferable, OutputType } from '../serialize/index.js';
14
+ import { Fr, Point, Buffer32, Ptr } from '../types/index.js';
15
15
 
16
+ `;
17
+
18
+ output += generateClass(functionDeclarations);
19
+ output += generateSyncClass(functionDeclarations);
20
+
21
+ return output;
22
+ }
23
+
24
+ function generateClass(functionDeclarations: FunctionDeclaration[]) {
25
+ let output = `
16
26
  export class BarretenbergApi {
17
- constructor(public binder: BarretenbergBinder) {}
27
+ constructor(protected wasm: BarretenbergWasmMainWorker) {}
18
28
 
19
- async destroy() {
20
- await this.binder.wasm.destroy();
21
- }
22
29
  `;
23
30
 
24
31
  for (const { functionName, inArgs, outArgs } of functionDeclarations) {
25
32
  try {
26
33
  const parameters = inArgs.map(({ name, type }) => `${toCamelCase(name)}: ${mapType(type)}`).join(', ');
27
- const inArgsVar = `[${inArgs.map(arg => toCamelCase(arg.name)).join(', ')}]`;
28
- const outTypesVar = `[${outArgs.map(arg => mapDeserializer(arg.type)).join(', ')}]`;
29
- const wasmCall = `const result = await this.binder.callWasmExport('${functionName}', ${inArgsVar}, ${outTypesVar});`;
34
+ const inArgsVar = `const inArgs = [${inArgs
35
+ .map(arg => toCamelCase(arg.name))
36
+ .join(', ')}].map(serializeBufferable);`;
37
+ const outTypesVar = `const outTypes: OutputType[] = [${outArgs
38
+ .map(arg => mapDeserializer(arg.type))
39
+ .join(', ')}];`;
40
+ const wasmCall = `const result = await this.wasm.callWasmExport('${functionName}', inArgs, outTypes.map(t=>t.SIZE_IN_BYTES));`;
41
+ const outVar = `const out = result.map((r, i) => outTypes[i].fromBuffer(r));`;
30
42
 
31
43
  const n = outArgs.length;
32
- const returnStmt = n === 0 ? 'return;' : n === 1 ? 'return result[0];' : 'return result as any;';
44
+ const returnStmt = n === 0 ? 'return;' : n === 1 ? 'return out[0];' : 'return out as any;';
33
45
  const returnType =
34
46
  outArgs.length === 0
35
47
  ? 'void'
36
48
  : outArgs.length === 1
37
- ? `${mapType(outArgs[0].type)}`
38
- : `[${outArgs.map(a => mapType(a.type)).join(', ')}]`;
49
+ ? `${mapType(outArgs[0].type)}`
50
+ : `[${outArgs.map(a => mapType(a.type)).join(', ')}]`;
39
51
 
40
52
  output += `
41
53
  async ${toCamelCase(functionName)}(${parameters}): Promise<${returnType}> {
54
+ ${inArgsVar}
55
+ ${outTypesVar}
42
56
  ${wasmCall}
57
+ ${outVar}
43
58
  ${returnStmt}
44
59
  }
45
60
  `;
@@ -48,35 +63,45 @@ export class BarretenbergApi {
48
63
  }
49
64
  }
50
65
 
51
- output += `}
66
+ output += `}`;
52
67
 
68
+ return output;
69
+ }
70
+
71
+ function generateSyncClass(functionDeclarations: FunctionDeclaration[]) {
72
+ let output = `
53
73
  export class BarretenbergApiSync {
54
- constructor(public binder: BarretenbergBinderSync) {}
74
+ constructor(protected wasm: BarretenbergWasmMain) {}
55
75
 
56
- async destroy() {
57
- await this.binder.wasm.destroy();
58
- }
59
76
  `;
60
77
 
61
78
  for (const { functionName, inArgs, outArgs } of functionDeclarations) {
62
79
  try {
63
80
  const parameters = inArgs.map(({ name, type }) => `${toCamelCase(name)}: ${mapType(type)}`).join(', ');
64
- const inArgsVar = `[${inArgs.map(arg => toCamelCase(arg.name)).join(', ')}]`;
65
- const outTypesVar = `[${outArgs.map(arg => mapDeserializer(arg.type)).join(', ')}]`;
66
- const wasmCall = `const result = this.binder.callWasmExport('${functionName}', ${inArgsVar}, ${outTypesVar});`;
81
+ const inArgsVar = `const inArgs = [${inArgs
82
+ .map(arg => toCamelCase(arg.name))
83
+ .join(', ')}].map(serializeBufferable);`;
84
+ const outTypesVar = `const outTypes: OutputType[] = [${outArgs
85
+ .map(arg => mapDeserializer(arg.type))
86
+ .join(', ')}];`;
87
+ const wasmCall = `const result = this.wasm.callWasmExport('${functionName}', inArgs, outTypes.map(t=>t.SIZE_IN_BYTES));`;
88
+ const outVar = `const out = result.map((r, i) => outTypes[i].fromBuffer(r));`;
67
89
 
68
90
  const n = outArgs.length;
69
- const returnStmt = n === 0 ? 'return;' : n === 1 ? 'return result[0];' : 'return result as any;';
91
+ const returnStmt = n === 0 ? 'return;' : n === 1 ? 'return out[0];' : 'return out as any;';
70
92
  const returnType =
71
93
  outArgs.length === 0
72
94
  ? 'void'
73
95
  : outArgs.length === 1
74
- ? `${mapType(outArgs[0].type)}`
75
- : `[${outArgs.map(a => mapType(a.type)).join(', ')}]`;
96
+ ? `${mapType(outArgs[0].type)}`
97
+ : `[${outArgs.map(a => mapType(a.type)).join(', ')}]`;
76
98
 
77
99
  output += `
78
100
  ${toCamelCase(functionName)}(${parameters}): ${returnType} {
101
+ ${inArgsVar}
102
+ ${outTypesVar}
79
103
  ${wasmCall}
104
+ ${outVar}
80
105
  ${returnStmt}
81
106
  }
82
107
  `;
@@ -85,7 +110,7 @@ export class BarretenbergApiSync {
85
110
  }
86
111
  }
87
112
 
88
- output += '}';
113
+ output += `}`;
89
114
 
90
115
  return output;
91
116
  }
@@ -0,0 +1 @@
1
+ Derive bindings from the reported scheme of msgpack from bb. Currently redundant with bindgen, until that is supplanted.
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Generate TypeScript bindings from msgpack schema
3
+ */
4
+
5
+ import { writeFileSync, mkdirSync } from 'fs';
6
+ import { dirname, join } from 'path';
7
+ import { exec } from 'child_process';
8
+ import { promisify } from 'util';
9
+ import { fileURLToPath } from 'url';
10
+ import {
11
+ createSharedTypesCompiler,
12
+ createSyncApiCompiler,
13
+ createAsyncApiCompiler,
14
+ createNativeApiCompiler,
15
+ type SchemaCompiler,
16
+ } from './schema_compiler.js';
17
+
18
+ const execAsync = promisify(exec);
19
+
20
+ interface GeneratorConfig {
21
+ name: string;
22
+ outputFile: string;
23
+ createCompiler: () => SchemaCompiler;
24
+ }
25
+
26
+ const GENERATORS: GeneratorConfig[] = [
27
+ {
28
+ name: 'Shared types',
29
+ outputFile: 'generated/api_types.ts',
30
+ createCompiler: createSharedTypesCompiler,
31
+ },
32
+ {
33
+ name: 'Sync API',
34
+ outputFile: 'generated/sync.ts',
35
+ createCompiler: createSyncApiCompiler,
36
+ },
37
+ {
38
+ name: 'Async API',
39
+ outputFile: 'generated/async.ts',
40
+ createCompiler: createAsyncApiCompiler,
41
+ },
42
+ {
43
+ name: 'Native API',
44
+ outputFile: 'generated/native.ts',
45
+ createCompiler: createNativeApiCompiler,
46
+ },
47
+ ];
48
+
49
+ // @ts-ignore
50
+ const __dirname = dirname(fileURLToPath(import.meta.url));
51
+
52
+ async function generate() {
53
+ const bbBuildPath = process.env.BB_BINARY_PATH || join(__dirname, '../../../cpp/build/bin/bb');
54
+
55
+ // Get schema from bb
56
+ console.log('Fetching msgpack schema from bb...');
57
+ const { stdout } = await execAsync(`${bbBuildPath} msgpack schema`);
58
+ const schema = JSON.parse(stdout.trim());
59
+
60
+ if (!schema.commands || !schema.responses) {
61
+ throw new Error('Invalid schema: missing commands or responses');
62
+ }
63
+
64
+ console.log('Generating TypeScript bindings...\n');
65
+
66
+ // Ensure output directory exists
67
+ const outputDir = join(__dirname, 'generated');
68
+ mkdirSync(outputDir, { recursive: true });
69
+
70
+ // Generate each output file
71
+ for (const config of GENERATORS) {
72
+ const compiler = config.createCompiler();
73
+ compiler.processApiSchema(schema.commands, schema.responses);
74
+
75
+ const outputPath = join(__dirname, config.outputFile);
76
+ const content = compiler.compile();
77
+ writeFileSync(outputPath, content);
78
+
79
+ console.log(`✓ ${config.name}: ${outputPath}`);
80
+ }
81
+
82
+ console.log('\nGeneration complete!');
83
+ }
84
+
85
+ // Run the generator
86
+ generate().catch(error => {
87
+ console.error('Generation failed:', error);
88
+ process.exit(1);
89
+ });