@aztec/bb.js 0.0.1-commit.5daedc8 → 0.0.1-commit.6230a0c

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 (204) hide show
  1. package/build/amd64-linux/bb +0 -0
  2. package/build/amd64-linux/nodejs_module.node +0 -0
  3. package/build/amd64-macos/bb +0 -0
  4. package/build/amd64-macos/nodejs_module.node +0 -0
  5. package/build/arm64-linux/bb +0 -0
  6. package/build/arm64-linux/nodejs_module.node +0 -0
  7. package/build/arm64-macos/bb +0 -0
  8. package/build/arm64-macos/nodejs_module.node +0 -0
  9. package/dest/browser/barretenberg/backend.d.ts +49 -17
  10. package/dest/browser/barretenberg/backend.d.ts.map +1 -1
  11. package/dest/browser/barretenberg/backend.js +111 -11
  12. package/dest/browser/barretenberg/index.d.ts +2 -2
  13. package/dest/browser/barretenberg/index.d.ts.map +1 -1
  14. package/dest/browser/barretenberg/index.js +2 -2
  15. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.js +1 -1
  16. package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg-threads.js +1 -1
  17. package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg.js +1 -1
  18. package/dest/browser/bb_backends/index.d.ts +3 -1
  19. package/dest/browser/bb_backends/index.d.ts.map +1 -1
  20. package/dest/browser/cbind/generate.d.ts +5 -2
  21. package/dest/browser/cbind/generate.d.ts.map +1 -1
  22. package/dest/browser/cbind/generate.js +47 -25
  23. package/dest/browser/cbind/generated/api_types.d.ts +766 -1687
  24. package/dest/browser/cbind/generated/api_types.d.ts.map +1 -1
  25. package/dest/browser/cbind/generated/api_types.js +1465 -1555
  26. package/dest/browser/cbind/generated/async.d.ts +3 -5
  27. package/dest/browser/cbind/generated/async.d.ts.map +1 -1
  28. package/dest/browser/cbind/generated/async.js +13 -33
  29. package/dest/browser/cbind/generated/sync.d.ts +3 -5
  30. package/dest/browser/cbind/generated/sync.d.ts.map +1 -1
  31. package/dest/browser/cbind/generated/sync.js +13 -31
  32. package/dest/browser/cbind/naming.d.ts +16 -0
  33. package/dest/browser/cbind/naming.d.ts.map +1 -0
  34. package/dest/browser/cbind/naming.js +24 -0
  35. package/dest/browser/cbind/rust_codegen.d.ts +26 -0
  36. package/dest/browser/cbind/rust_codegen.d.ts.map +1 -0
  37. package/dest/browser/cbind/rust_codegen.js +461 -0
  38. package/dest/browser/cbind/schema_visitor.d.ts +47 -0
  39. package/dest/browser/cbind/schema_visitor.d.ts.map +1 -0
  40. package/dest/browser/cbind/schema_visitor.js +158 -0
  41. package/dest/browser/cbind/typescript_codegen.d.ts +30 -0
  42. package/dest/browser/cbind/typescript_codegen.d.ts.map +1 -0
  43. package/dest/browser/cbind/typescript_codegen.js +365 -0
  44. package/dest/browser/crs/net_crs.d.ts +6 -1
  45. package/dest/browser/crs/net_crs.d.ts.map +1 -1
  46. package/dest/browser/crs/net_crs.js +30 -7
  47. package/dest/browser/index.d.ts +2 -2
  48. package/dest/browser/index.d.ts.map +1 -1
  49. package/dest/browser/index.js +2 -2
  50. package/dest/node/barretenberg/backend.d.ts +49 -17
  51. package/dest/node/barretenberg/backend.d.ts.map +1 -1
  52. package/dest/node/barretenberg/backend.js +111 -11
  53. package/dest/node/barretenberg/backend.test.d.ts +2 -0
  54. package/dest/node/barretenberg/backend.test.d.ts.map +1 -0
  55. package/dest/node/barretenberg/backend.test.js +103 -0
  56. package/dest/node/barretenberg/index.d.ts +2 -2
  57. package/dest/node/barretenberg/index.d.ts.map +1 -1
  58. package/dest/node/barretenberg/index.js +2 -2
  59. package/dest/node/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
  60. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.js +1 -1
  61. package/dest/node/bb_backends/index.d.ts +3 -1
  62. package/dest/node/bb_backends/index.d.ts.map +1 -1
  63. package/dest/node/bb_backends/node/index.d.ts +1 -1
  64. package/dest/node/bb_backends/node/index.d.ts.map +1 -1
  65. package/dest/node/bb_backends/node/index.js +5 -5
  66. package/dest/node/bb_backends/node/native_shm.d.ts +3 -2
  67. package/dest/node/bb_backends/node/native_shm.d.ts.map +1 -1
  68. package/dest/node/bb_backends/node/native_shm.js +40 -21
  69. package/dest/node/bb_backends/node/native_shm_async.d.ts +2 -2
  70. package/dest/node/bb_backends/node/native_shm_async.d.ts.map +1 -1
  71. package/dest/node/bb_backends/node/native_shm_async.js +17 -21
  72. package/dest/node/bb_backends/node/native_socket.d.ts +1 -1
  73. package/dest/node/bb_backends/node/native_socket.d.ts.map +1 -1
  74. package/dest/node/bb_backends/node/native_socket.js +7 -5
  75. package/dest/node/bb_backends/node/platform.d.ts +1 -1
  76. package/dest/node/bb_backends/node/platform.d.ts.map +1 -1
  77. package/dest/node/bb_backends/node/platform.js +7 -2
  78. package/dest/node/cbind/generate.d.ts +5 -2
  79. package/dest/node/cbind/generate.d.ts.map +1 -1
  80. package/dest/node/cbind/generate.js +47 -25
  81. package/dest/node/cbind/generated/api_types.d.ts +766 -1687
  82. package/dest/node/cbind/generated/api_types.d.ts.map +1 -1
  83. package/dest/node/cbind/generated/api_types.js +1465 -1555
  84. package/dest/node/cbind/generated/async.d.ts +3 -5
  85. package/dest/node/cbind/generated/async.d.ts.map +1 -1
  86. package/dest/node/cbind/generated/async.js +13 -33
  87. package/dest/node/cbind/generated/sync.d.ts +3 -5
  88. package/dest/node/cbind/generated/sync.d.ts.map +1 -1
  89. package/dest/node/cbind/generated/sync.js +13 -31
  90. package/dest/node/cbind/naming.d.ts +16 -0
  91. package/dest/node/cbind/naming.d.ts.map +1 -0
  92. package/dest/node/cbind/naming.js +24 -0
  93. package/dest/node/cbind/rust_codegen.d.ts +26 -0
  94. package/dest/node/cbind/rust_codegen.d.ts.map +1 -0
  95. package/dest/node/cbind/rust_codegen.js +461 -0
  96. package/dest/node/cbind/schema_visitor.d.ts +47 -0
  97. package/dest/node/cbind/schema_visitor.d.ts.map +1 -0
  98. package/dest/node/cbind/schema_visitor.js +158 -0
  99. package/dest/node/cbind/typescript_codegen.d.ts +30 -0
  100. package/dest/node/cbind/typescript_codegen.d.ts.map +1 -0
  101. package/dest/node/cbind/typescript_codegen.js +365 -0
  102. package/dest/node/crs/net_crs.d.ts +6 -1
  103. package/dest/node/crs/net_crs.d.ts.map +1 -1
  104. package/dest/node/crs/net_crs.js +30 -7
  105. package/dest/node/crs/net_crs.test.d.ts +2 -0
  106. package/dest/node/crs/net_crs.test.d.ts.map +1 -0
  107. package/dest/node/crs/net_crs.test.js +39 -0
  108. package/dest/node/index.d.ts +2 -2
  109. package/dest/node/index.d.ts.map +1 -1
  110. package/dest/node/index.js +2 -2
  111. package/dest/node-cjs/barretenberg/backend.d.ts +49 -17
  112. package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -1
  113. package/dest/node-cjs/barretenberg/backend.js +113 -11
  114. package/dest/node-cjs/barretenberg/backend.test.d.ts +2 -0
  115. package/dest/node-cjs/barretenberg/backend.test.d.ts.map +1 -0
  116. package/dest/node-cjs/barretenberg/backend.test.js +105 -0
  117. package/dest/node-cjs/barretenberg/index.d.ts +2 -2
  118. package/dest/node-cjs/barretenberg/index.d.ts.map +1 -1
  119. package/dest/node-cjs/barretenberg/index.js +4 -2
  120. package/dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
  121. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.js +1 -1
  122. package/dest/node-cjs/bb_backends/index.d.ts +3 -1
  123. package/dest/node-cjs/bb_backends/index.d.ts.map +1 -1
  124. package/dest/node-cjs/bb_backends/node/index.d.ts +1 -1
  125. package/dest/node-cjs/bb_backends/node/index.d.ts.map +1 -1
  126. package/dest/node-cjs/bb_backends/node/index.js +5 -5
  127. package/dest/node-cjs/bb_backends/node/native_shm.d.ts +3 -2
  128. package/dest/node-cjs/bb_backends/node/native_shm.d.ts.map +1 -1
  129. package/dest/node-cjs/bb_backends/node/native_shm.js +39 -20
  130. package/dest/node-cjs/bb_backends/node/native_shm_async.d.ts +2 -2
  131. package/dest/node-cjs/bb_backends/node/native_shm_async.d.ts.map +1 -1
  132. package/dest/node-cjs/bb_backends/node/native_shm_async.js +17 -21
  133. package/dest/node-cjs/bb_backends/node/native_socket.d.ts +1 -1
  134. package/dest/node-cjs/bb_backends/node/native_socket.d.ts.map +1 -1
  135. package/dest/node-cjs/bb_backends/node/native_socket.js +7 -5
  136. package/dest/node-cjs/bb_backends/node/platform.d.ts +1 -1
  137. package/dest/node-cjs/bb_backends/node/platform.d.ts.map +1 -1
  138. package/dest/node-cjs/bb_backends/node/platform.js +7 -2
  139. package/dest/node-cjs/cbind/generate.d.ts +5 -2
  140. package/dest/node-cjs/cbind/generate.d.ts.map +1 -1
  141. package/dest/node-cjs/cbind/generate.js +47 -25
  142. package/dest/node-cjs/cbind/generated/api_types.d.ts +766 -1687
  143. package/dest/node-cjs/cbind/generated/api_types.d.ts.map +1 -1
  144. package/dest/node-cjs/cbind/generated/api_types.js +1671 -1771
  145. package/dest/node-cjs/cbind/generated/async.d.ts +3 -5
  146. package/dest/node-cjs/cbind/generated/async.d.ts.map +1 -1
  147. package/dest/node-cjs/cbind/generated/async.js +12 -32
  148. package/dest/node-cjs/cbind/generated/sync.d.ts +3 -5
  149. package/dest/node-cjs/cbind/generated/sync.d.ts.map +1 -1
  150. package/dest/node-cjs/cbind/generated/sync.js +12 -30
  151. package/dest/node-cjs/cbind/naming.d.ts +16 -0
  152. package/dest/node-cjs/cbind/naming.d.ts.map +1 -0
  153. package/dest/node-cjs/cbind/naming.js +28 -0
  154. package/dest/node-cjs/cbind/rust_codegen.d.ts +26 -0
  155. package/dest/node-cjs/cbind/rust_codegen.d.ts.map +1 -0
  156. package/dest/node-cjs/cbind/rust_codegen.js +465 -0
  157. package/dest/node-cjs/cbind/schema_visitor.d.ts +47 -0
  158. package/dest/node-cjs/cbind/schema_visitor.d.ts.map +1 -0
  159. package/dest/node-cjs/cbind/schema_visitor.js +162 -0
  160. package/dest/node-cjs/cbind/typescript_codegen.d.ts +30 -0
  161. package/dest/node-cjs/cbind/typescript_codegen.d.ts.map +1 -0
  162. package/dest/node-cjs/cbind/typescript_codegen.js +369 -0
  163. package/dest/node-cjs/crs/net_crs.d.ts +6 -1
  164. package/dest/node-cjs/crs/net_crs.d.ts.map +1 -1
  165. package/dest/node-cjs/crs/net_crs.js +31 -7
  166. package/dest/node-cjs/crs/net_crs.test.d.ts +2 -0
  167. package/dest/node-cjs/crs/net_crs.test.d.ts.map +1 -0
  168. package/dest/node-cjs/crs/net_crs.test.js +41 -0
  169. package/dest/node-cjs/index.d.ts +2 -2
  170. package/dest/node-cjs/index.d.ts.map +1 -1
  171. package/dest/node-cjs/index.js +4 -2
  172. package/package.json +1 -1
  173. package/src/barretenberg/backend.test.ts +122 -0
  174. package/src/barretenberg/backend.ts +151 -25
  175. package/src/barretenberg/index.ts +9 -1
  176. package/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +1 -1
  177. package/src/bb_backends/index.ts +3 -0
  178. package/src/bb_backends/node/index.ts +9 -4
  179. package/src/bb_backends/node/native_shm.ts +38 -19
  180. package/src/bb_backends/node/native_shm_async.ts +15 -19
  181. package/src/bb_backends/node/native_socket.ts +7 -5
  182. package/src/bb_backends/node/platform.ts +6 -1
  183. package/src/cbind/generate.ts +51 -32
  184. package/src/cbind/generated/api_types.ts +3050 -0
  185. package/src/cbind/generated/async.ts +696 -0
  186. package/src/cbind/generated/curve_constants.ts +53 -0
  187. package/src/cbind/generated/sync.ts +644 -0
  188. package/src/cbind/naming.ts +27 -0
  189. package/src/cbind/rust_codegen.ts +504 -0
  190. package/src/cbind/schema_visitor.ts +219 -0
  191. package/src/cbind/typescript_codegen.ts +419 -0
  192. package/src/crs/net_crs.test.ts +47 -0
  193. package/src/crs/net_crs.ts +45 -14
  194. package/src/index.ts +4 -0
  195. package/dest/browser/cbind/schema_compiler.d.ts +0 -68
  196. package/dest/browser/cbind/schema_compiler.d.ts.map +0 -1
  197. package/dest/browser/cbind/schema_compiler.js +0 -600
  198. package/dest/node/cbind/schema_compiler.d.ts +0 -68
  199. package/dest/node/cbind/schema_compiler.d.ts.map +0 -1
  200. package/dest/node/cbind/schema_compiler.js +0 -600
  201. package/dest/node-cjs/cbind/schema_compiler.d.ts +0 -68
  202. package/dest/node-cjs/cbind/schema_compiler.d.ts.map +0 -1
  203. package/dest/node-cjs/cbind/schema_compiler.js +0 -607
  204. package/src/cbind/schema_compiler.ts +0 -745
@@ -35,12 +35,17 @@ export async function createAsyncBackend(
35
35
  if (!bbPath) {
36
36
  throw new Error('Native backend requires bb binary.');
37
37
  }
38
- const napiPath = findNapiBinary();
38
+ const napiPath = findNapiBinary(options.napiPath);
39
39
  if (!napiPath) {
40
40
  throw new Error('Native async backend requires napi client stub.');
41
41
  }
42
42
  logger(`Using native shared memory async backend: ${bbPath}`);
43
- const asyncBackend = await BarretenbergNativeShmAsyncBackend.new(bbPath, options.threads, options.logger);
43
+ const asyncBackend = await BarretenbergNativeShmAsyncBackend.new(
44
+ bbPath,
45
+ napiPath,
46
+ options.threads,
47
+ options.logger,
48
+ );
44
49
  return new Barretenberg(asyncBackend, options);
45
50
  }
46
51
 
@@ -82,12 +87,12 @@ export async function createSyncBackend(
82
87
  if (!bbPath) {
83
88
  throw new Error('Native backend requires bb binary.');
84
89
  }
85
- const napiPath = findNapiBinary();
90
+ const napiPath = findNapiBinary(options.napiPath);
86
91
  if (!napiPath) {
87
92
  throw new Error('Native sync backend requires napi client stub.');
88
93
  }
89
94
  logger(`Using native shared memory backend: ${bbPath}`);
90
- const shm = await BarretenbergNativeShmSyncBackend.new(bbPath, options.threads, options.logger);
95
+ const shm = await BarretenbergNativeShmSyncBackend.new(bbPath, napiPath, options.threads, options.logger);
91
96
  return new BarretenbergSync(shm);
92
97
  }
93
98
 
@@ -1,23 +1,9 @@
1
1
  import { createRequire } from 'module';
2
2
  import { spawn, ChildProcess } from 'child_process';
3
- import { openSync, closeSync } from 'fs';
3
+ import { openSync, closeSync, unlinkSync } from 'fs';
4
4
  import { IMsgpackBackendSync } from '../interface.js';
5
5
  import { findNapiBinary, findPackageRoot } from './platform.js';
6
-
7
- // Import the NAPI module
8
- // The addon is built to the nodejs_module directory
9
- const addonPath = findNapiBinary();
10
- // Try loading, but don't throw if it doesn't exist (will be caught in constructor)
11
- let addon: any = null;
12
- try {
13
- if (addonPath) {
14
- const require = createRequire(findPackageRoot()!);
15
- addon = require(addonPath);
16
- }
17
- } catch (err) {
18
- // Addon not built yet or not available
19
- addon = null;
20
- }
6
+ import { threadId } from 'worker_threads';
21
7
 
22
8
  let instanceCounter = 0;
23
9
 
@@ -46,19 +32,30 @@ export class BarretenbergNativeShmSyncBackend implements IMsgpackBackendSync {
46
32
  /**
47
33
  * Create and initialize a shared memory backend.
48
34
  * @param bbBinaryPath Path to bb binary
35
+ * @param napiPath Path to NAPI binary
49
36
  * @param threads Optional number of threads
50
37
  */
51
38
  static async new(
52
39
  bbBinaryPath: string,
40
+ napiPath: string,
53
41
  threads?: number,
54
42
  logger?: (msg: string) => void,
55
43
  ): Promise<BarretenbergNativeShmSyncBackend> {
56
- if (!addon || !addon.MsgpackClient) {
57
- throw new Error('Shared memory NAPI not available.');
44
+ // Import the NAPI module
45
+ // The addon is built to the nodejs_module directory
46
+ const addonPath = findNapiBinary(napiPath);
47
+ // Try loading
48
+ let addon: any = null;
49
+ try {
50
+ const require = createRequire(findPackageRoot()!);
51
+ addon = require(addonPath!);
52
+ } catch (err) {
53
+ // Addon not built yet or not available
54
+ throw new Error('Shared memory sync NAPI not available.');
58
55
  }
59
56
 
60
57
  // Create a unique shared memory name
61
- const shmName = `bb-sync-${process.pid}-${instanceCounter++}`;
58
+ const shmName = `bb-sync-${process.pid}-${threadId}-${instanceCounter++}`;
62
59
 
63
60
  // If threads not set use 1 thread. We're not expected to do long lived work on sync backends.
64
61
  const hwc = threads ? threads.toString() : '1';
@@ -74,6 +71,28 @@ export class BarretenbergNativeShmSyncBackend implements IMsgpackBackendSync {
74
71
  logger(`BB process logs redirected to: ${logPath}`);
75
72
  }
76
73
 
74
+ // Clean up any stale shared memory files from previous runs
75
+ // This handles the case where a previous process crashed without cleanup
76
+ const shmRequestPath = `/dev/shm/${shmName}_request`;
77
+ const shmResponsePath = `/dev/shm/${shmName}_response`;
78
+ try {
79
+ unlinkSync(shmRequestPath);
80
+ } catch (err) {
81
+ const isNotFound = err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT';
82
+ if (!isNotFound) {
83
+ throw new Error(`Failed to clean up stale shared memory file ${shmRequestPath}: ${err}`);
84
+ }
85
+ }
86
+
87
+ try {
88
+ unlinkSync(shmResponsePath);
89
+ } catch (err) {
90
+ const isNotFound = err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT';
91
+ if (!isNotFound) {
92
+ throw new Error(`Failed to clean up stale shared memory file ${shmResponsePath}: ${err}`);
93
+ }
94
+ }
95
+
77
96
  // Spawn bb process with shared memory mode (SPSC-only, no max-clients needed)
78
97
  const args = ['msgpack', 'run', '--input', `${shmName}.shm`, '--request-ring-size', `${1024 * 1024 * 4}`];
79
98
  const bbProcess = spawn(bbBinaryPath, args, {
@@ -3,21 +3,7 @@ import { spawn, ChildProcess } from 'child_process';
3
3
  import { openSync, closeSync } from 'fs';
4
4
  import { IMsgpackBackendAsync } from '../interface.js';
5
5
  import { findNapiBinary, findPackageRoot } from './platform.js';
6
-
7
- // Import the NAPI module
8
- // The addon is built to the nodejs_module directory
9
- const addonPath = findNapiBinary();
10
- // Try loading, but don't throw if it doesn't exist (will be caught in constructor)
11
- let addon: any = null;
12
- try {
13
- if (addonPath) {
14
- const require = createRequire(findPackageRoot()!);
15
- addon = require(addonPath);
16
- }
17
- } catch (err) {
18
- // Addon not built yet or not available
19
- addon = null;
20
- }
6
+ import { threadId } from 'worker_threads';
21
7
 
22
8
  let instanceCounter = 0;
23
9
 
@@ -86,18 +72,28 @@ export class BarretenbergNativeShmAsyncBackend implements IMsgpackBackendAsync {
86
72
  */
87
73
  static async new(
88
74
  bbBinaryPath: string,
75
+ napiPath: string,
89
76
  threads?: number,
90
77
  logger?: (msg: string) => void,
91
78
  ): Promise<BarretenbergNativeShmAsyncBackend> {
92
- if (!addon || !addon.MsgpackClientAsync) {
79
+ // Import the NAPI module
80
+ // The addon is built to the nodejs_module directory
81
+ const addonPath = findNapiBinary(napiPath);
82
+ // Try loading
83
+ let addon: any = null;
84
+ try {
85
+ const require = createRequire(findPackageRoot()!);
86
+ addon = require(addonPath!);
87
+ } catch (err) {
88
+ // Addon not built yet or not available
93
89
  throw new Error('Shared memory async NAPI not available.');
94
90
  }
95
91
 
96
92
  // Create a unique shared memory name
97
- const shmName = `bb-async-${process.pid}-${instanceCounter++}`;
93
+ const shmName = `bb-async-${process.pid}-${threadId}-${instanceCounter++}`;
98
94
 
99
- // If threads not set use num cpu cores, max 32 (same as socket backend)
100
- const hwc = threads ? threads.toString() : '1';
95
+ // If threads not set use num cpu cores, max 16 (same as socket backend)
96
+ const hwc = threads ? threads.toString() : '16';
101
97
  const env = { ...process.env, HARDWARE_CONCURRENCY: hwc };
102
98
 
103
99
  // Set up file logging if logger is provided
@@ -4,8 +4,10 @@ import * as fs from 'fs';
4
4
  import * as os from 'os';
5
5
  import * as path from 'path';
6
6
  import { IMsgpackBackendAsync } from '../interface.js';
7
- import { findPackageRoot } from './platform.js';
8
7
  import readline from 'readline';
8
+ import { threadId } from 'worker_threads';
9
+
10
+ let instanceCounter = 0;
9
11
 
10
12
  /**
11
13
  * Asynchronous native backend that communicates with bb binary via Unix Domain Socket.
@@ -43,7 +45,7 @@ export class BarretenbergNativeSocketAsyncBackend implements IMsgpackBackendAsyn
43
45
 
44
46
  constructor(bbBinaryPath: string, threads?: number, logger?: (msg: string) => void) {
45
47
  // Create a unique socket path in temp directory
46
- this.socketPath = path.join(os.tmpdir(), `bb-${process.pid}-${Date.now()}.sock`);
48
+ this.socketPath = path.join(os.tmpdir(), `bb-${process.pid}-${threadId}-${instanceCounter++}.sock`);
47
49
 
48
50
  // Ensure socket path doesn't already exist (cleanup from previous crashes)
49
51
  if (fs.existsSync(this.socketPath)) {
@@ -58,9 +60,9 @@ export class BarretenbergNativeSocketAsyncBackend implements IMsgpackBackendAsyn
58
60
  connectionReject = reject;
59
61
  });
60
62
 
61
- // If threads not set use num cpu cores, max 32.
62
- const hwc = threads ? threads.toString() : Math.min(32, os.cpus.length).toString();
63
- const env = { ...process.env, HARDWARE_CONCURRENCY: '1' };
63
+ // If threads not set use num cpu cores, max 16.
64
+ const hwc = threads ? threads.toString() : Math.min(16, os.cpus().length).toString();
65
+ const env = { ...process.env, HARDWARE_CONCURRENCY: hwc };
64
66
 
65
67
  // Spawn bb process - it will create the socket server
66
68
  const args = ['msgpack', 'run', '--input', this.socketPath];
@@ -24,7 +24,12 @@ export function findPackageRoot(): string | null {
24
24
  while (currentDir !== root) {
25
25
  const packageJsonPath = path.join(currentDir, 'package.json');
26
26
  if (fs.existsSync(packageJsonPath)) {
27
- return currentDir;
27
+ // Check if this is the actual package root by verifying it has a 'build' directory
28
+ // This ensures we skip intermediate package.json files (e.g., in dest/node-cjs/)
29
+ const buildDir = path.join(currentDir, 'build');
30
+ if (fs.existsSync(buildDir)) {
31
+ return currentDir;
32
+ }
28
33
  }
29
34
  currentDir = path.dirname(currentDir);
30
35
  }
@@ -1,5 +1,8 @@
1
1
  /**
2
- * Generate TypeScript bindings from msgpack schema
2
+ * Multi-language code generation from BB msgpack schema
3
+ *
4
+ * Architecture:
5
+ * Raw Schema → SchemaVisitor → CompiledSchema IR → Language Codegens → Files
3
6
  */
4
7
 
5
8
  import { writeFileSync, mkdirSync } from 'fs';
@@ -8,36 +11,42 @@ import { exec } from 'child_process';
8
11
  import { promisify } from 'util';
9
12
  import { fileURLToPath } from 'url';
10
13
  import { unpack } from 'msgpackr';
11
- import {
12
- createSharedTypesCompiler,
13
- createSyncApiCompiler,
14
- createAsyncApiCompiler,
15
- type SchemaCompiler,
16
- } from './schema_compiler.js';
14
+ import { SchemaVisitor, type CompiledSchema } from './schema_visitor.js';
15
+ import { TypeScriptCodegen } from './typescript_codegen.js';
16
+ import { RustCodegen } from './rust_codegen.js';
17
17
 
18
18
  const execAsync = promisify(exec);
19
19
 
20
- interface GeneratorConfig {
20
+ // Language generators - all use the same CompiledSchema IR
21
+ interface LanguageGenerator {
21
22
  name: string;
22
- outputFile: string;
23
- createCompiler: () => SchemaCompiler;
23
+ enabled: boolean;
24
+ generate: (compiled: CompiledSchema) => Array<{ path: string; content: string }>;
24
25
  }
25
26
 
26
- const GENERATORS: GeneratorConfig[] = [
27
+ const LANGUAGE_GENERATORS: LanguageGenerator[] = [
27
28
  {
28
- name: 'Shared types',
29
- outputFile: 'generated/api_types.ts',
30
- createCompiler: createSharedTypesCompiler,
29
+ name: 'TypeScript',
30
+ enabled: true,
31
+ generate: (compiled) => {
32
+ const tsGen = new TypeScriptCodegen();
33
+ return [
34
+ { path: 'generated/api_types.ts', content: tsGen.generateTypes(compiled) },
35
+ { path: 'generated/sync.ts', content: tsGen.generateSyncApi(compiled) },
36
+ { path: 'generated/async.ts', content: tsGen.generateAsyncApi(compiled) },
37
+ ];
38
+ },
31
39
  },
32
40
  {
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
+ name: 'Rust',
42
+ enabled: true,
43
+ generate: (compiled) => {
44
+ const rustGen = new RustCodegen();
45
+ return [
46
+ { path: '../../../rust/barretenberg-rs/src/generated_types.rs', content: rustGen.generateTypes(compiled) },
47
+ { path: '../../../rust/barretenberg-rs/src/api.rs', content: rustGen.generateApi(compiled) },
48
+ ];
49
+ },
41
50
  },
42
51
  ];
43
52
 
@@ -56,29 +65,39 @@ async function generate() {
56
65
  throw new Error('Invalid schema: missing commands or responses');
57
66
  }
58
67
 
59
- console.log('Generating TypeScript bindings...\n');
68
+ // Compile schema once using visitor pattern
69
+ console.log('Compiling schema...');
70
+ const visitor = new SchemaVisitor();
71
+ const compiled = visitor.visit(schema.commands, schema.responses);
72
+
73
+ console.log(`Found ${compiled.commands.length} commands, ${compiled.structs.size} structs\n`);
60
74
 
61
75
  // Ensure output directory exists
62
76
  const outputDir = join(__dirname, 'generated');
63
77
  mkdirSync(outputDir, { recursive: true });
64
78
 
65
- // Generate each output file
66
- for (const config of GENERATORS) {
67
- const compiler = config.createCompiler();
68
- compiler.processApiSchema(schema.commands, schema.responses);
79
+ // Generate all language bindings from compiled IR
80
+ for (const generator of LANGUAGE_GENERATORS) {
81
+ if (!generator.enabled) {
82
+ console.log(`⊘ ${generator.name}: disabled`);
83
+ continue;
84
+ }
69
85
 
70
- const outputPath = join(__dirname, config.outputFile);
71
- const content = compiler.compile();
72
- writeFileSync(outputPath, content);
86
+ const files = generator.generate(compiled);
73
87
 
74
- console.log(`✓ ${config.name}: ${outputPath}`);
88
+ for (const file of files) {
89
+ const outputPath = join(__dirname, file.path);
90
+ mkdirSync(dirname(outputPath), { recursive: true });
91
+ writeFileSync(outputPath, file.content);
92
+ console.log(`✓ ${generator.name}: ${outputPath}`);
93
+ }
75
94
  }
76
95
 
77
96
  // Generate curve constants
78
97
  console.log('\nGenerating curve constants...');
79
98
  await generateCurveConstants(bbBuildPath, outputDir);
80
99
 
81
- console.log('\nGeneration complete!');
100
+ console.log('\n✨ Generation complete! Clean, maintainable, multi-language architecture.');
82
101
  }
83
102
 
84
103
  async function generateCurveConstants(bbBuildPath: string, outputDir: string) {