@aztec/bb.js 1.2.1 → 2.0.0-nightly.20250814

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 (135) hide show
  1. package/dest/browser/barretenberg/backend.d.ts +1 -0
  2. package/dest/browser/barretenberg/backend.d.ts.map +1 -1
  3. package/dest/browser/barretenberg/backend.js +116 -108
  4. package/dest/browser/barretenberg/index.d.ts +13 -0
  5. package/dest/browser/barretenberg/index.d.ts.map +1 -1
  6. package/dest/browser/barretenberg/index.js +40 -2
  7. package/dest/browser/barretenberg/verifier.js +2 -2
  8. package/dest/browser/barretenberg_api/index.d.ts +2 -2
  9. package/dest/browser/barretenberg_api/index.d.ts.map +1 -1
  10. package/dest/browser/barretenberg_api/index.js +5 -5
  11. package/dest/browser/barretenberg_wasm/barretenberg_wasm_base/index.d.ts +1 -0
  12. package/dest/browser/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -1
  13. package/dest/browser/barretenberg_wasm/barretenberg_wasm_base/index.js +5 -4
  14. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +2 -0
  15. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -1
  16. package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.js +17 -1
  17. package/dest/browser/barretenberg_wasm/barretenberg_wasm_thread/index.d.ts +1 -0
  18. package/dest/browser/barretenberg_wasm/barretenberg_wasm_thread/index.d.ts.map +1 -1
  19. package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg-threads.js +1 -1
  20. package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg.js +1 -1
  21. package/dest/browser/cbind/generate.d.ts +5 -0
  22. package/dest/browser/cbind/generate.d.ts.map +1 -0
  23. package/dest/browser/cbind/generate.js +64 -0
  24. package/dest/browser/cbind/generated/api_types.d.ts +634 -0
  25. package/dest/browser/cbind/generated/api_types.d.ts.map +1 -0
  26. package/dest/browser/cbind/generated/api_types.js +851 -0
  27. package/dest/browser/cbind/generated/async.d.ts +23 -0
  28. package/dest/browser/cbind/generated/async.d.ts.map +1 -0
  29. package/dest/browser/cbind/generated/async.js +148 -0
  30. package/dest/browser/cbind/generated/native.d.ts +31 -0
  31. package/dest/browser/cbind/generated/native.d.ts.map +1 -0
  32. package/dest/browser/cbind/generated/native.js +234 -0
  33. package/dest/browser/cbind/generated/sync.d.ts +23 -0
  34. package/dest/browser/cbind/generated/sync.d.ts.map +1 -0
  35. package/dest/browser/cbind/generated/sync.js +133 -0
  36. package/dest/browser/cbind/schema_compiler.d.ts +70 -0
  37. package/dest/browser/cbind/schema_compiler.d.ts.map +1 -0
  38. package/dest/browser/cbind/schema_compiler.js +683 -0
  39. package/dest/browser/proof/index.d.ts +2 -0
  40. package/dest/browser/proof/index.d.ts.map +1 -1
  41. package/dest/browser/proof/index.js +3 -3
  42. package/dest/node/barretenberg/backend.d.ts +1 -0
  43. package/dest/node/barretenberg/backend.d.ts.map +1 -1
  44. package/dest/node/barretenberg/backend.js +116 -108
  45. package/dest/node/barretenberg/index.d.ts +13 -0
  46. package/dest/node/barretenberg/index.d.ts.map +1 -1
  47. package/dest/node/barretenberg/index.js +40 -2
  48. package/dest/node/barretenberg/verifier.js +2 -2
  49. package/dest/node/barretenberg_api/index.d.ts +2 -2
  50. package/dest/node/barretenberg_api/index.d.ts.map +1 -1
  51. package/dest/node/barretenberg_api/index.js +5 -5
  52. package/dest/node/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
  53. package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.d.ts +1 -0
  54. package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -1
  55. package/dest/node/barretenberg_wasm/barretenberg_wasm_base/index.js +5 -4
  56. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +2 -0
  57. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -1
  58. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.js +17 -1
  59. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/index.d.ts +1 -0
  60. package/dest/node/barretenberg_wasm/barretenberg_wasm_thread/index.d.ts.map +1 -1
  61. package/dest/node/cbind/generate.d.ts +5 -0
  62. package/dest/node/cbind/generate.d.ts.map +1 -0
  63. package/dest/node/cbind/generate.js +64 -0
  64. package/dest/node/cbind/generated/api_types.d.ts +634 -0
  65. package/dest/node/cbind/generated/api_types.d.ts.map +1 -0
  66. package/dest/node/cbind/generated/api_types.js +851 -0
  67. package/dest/node/cbind/generated/async.d.ts +23 -0
  68. package/dest/node/cbind/generated/async.d.ts.map +1 -0
  69. package/dest/node/cbind/generated/async.js +148 -0
  70. package/dest/node/cbind/generated/native.d.ts +31 -0
  71. package/dest/node/cbind/generated/native.d.ts.map +1 -0
  72. package/dest/node/cbind/generated/native.js +234 -0
  73. package/dest/node/cbind/generated/sync.d.ts +23 -0
  74. package/dest/node/cbind/generated/sync.d.ts.map +1 -0
  75. package/dest/node/cbind/generated/sync.js +133 -0
  76. package/dest/node/cbind/schema_compiler.d.ts +70 -0
  77. package/dest/node/cbind/schema_compiler.d.ts.map +1 -0
  78. package/dest/node/cbind/schema_compiler.js +683 -0
  79. package/dest/node/main.js +3 -3
  80. package/dest/node/proof/index.d.ts +2 -0
  81. package/dest/node/proof/index.d.ts.map +1 -1
  82. package/dest/node/proof/index.js +3 -3
  83. package/dest/node-cjs/barretenberg/backend.d.ts +1 -0
  84. package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -1
  85. package/dest/node-cjs/barretenberg/backend.js +117 -109
  86. package/dest/node-cjs/barretenberg/index.d.ts +13 -0
  87. package/dest/node-cjs/barretenberg/index.d.ts.map +1 -1
  88. package/dest/node-cjs/barretenberg/index.js +40 -2
  89. package/dest/node-cjs/barretenberg/verifier.js +2 -2
  90. package/dest/node-cjs/barretenberg_api/index.d.ts +2 -2
  91. package/dest/node-cjs/barretenberg_api/index.d.ts.map +1 -1
  92. package/dest/node-cjs/barretenberg_api/index.js +5 -5
  93. package/dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
  94. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_base/index.d.ts +1 -0
  95. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_base/index.d.ts.map +1 -1
  96. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_base/index.js +5 -4
  97. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.d.ts +2 -0
  98. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.d.ts.map +1 -1
  99. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.js +17 -1
  100. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/index.d.ts +1 -0
  101. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_thread/index.d.ts.map +1 -1
  102. package/dest/node-cjs/cbind/generate.d.ts +5 -0
  103. package/dest/node-cjs/cbind/generate.d.ts.map +1 -0
  104. package/dest/node-cjs/cbind/generate.js +66 -0
  105. package/dest/node-cjs/cbind/generated/api_types.d.ts +634 -0
  106. package/dest/node-cjs/cbind/generated/api_types.d.ts.map +1 -0
  107. package/dest/node-cjs/cbind/generated/api_types.js +925 -0
  108. package/dest/node-cjs/cbind/generated/async.d.ts +23 -0
  109. package/dest/node-cjs/cbind/generated/async.d.ts.map +1 -0
  110. package/dest/node-cjs/cbind/generated/async.js +152 -0
  111. package/dest/node-cjs/cbind/generated/native.d.ts +31 -0
  112. package/dest/node-cjs/cbind/generated/native.d.ts.map +1 -0
  113. package/dest/node-cjs/cbind/generated/native.js +238 -0
  114. package/dest/node-cjs/cbind/generated/sync.d.ts +23 -0
  115. package/dest/node-cjs/cbind/generated/sync.d.ts.map +1 -0
  116. package/dest/node-cjs/cbind/generated/sync.js +137 -0
  117. package/dest/node-cjs/cbind/schema_compiler.d.ts +70 -0
  118. package/dest/node-cjs/cbind/schema_compiler.d.ts.map +1 -0
  119. package/dest/node-cjs/cbind/schema_compiler.js +691 -0
  120. package/dest/node-cjs/main.js +3 -3
  121. package/dest/node-cjs/proof/index.d.ts +2 -0
  122. package/dest/node-cjs/proof/index.d.ts.map +1 -1
  123. package/dest/node-cjs/proof/index.js +3 -1
  124. package/package.json +4 -3
  125. package/src/barretenberg/backend.ts +129 -137
  126. package/src/barretenberg/index.ts +52 -1
  127. package/src/barretenberg/verifier.ts +1 -1
  128. package/src/barretenberg_api/index.ts +4 -4
  129. package/src/barretenberg_wasm/barretenberg_wasm_base/index.ts +5 -3
  130. package/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +23 -0
  131. package/src/cbind/README.md +1 -0
  132. package/src/cbind/generate.ts +89 -0
  133. package/src/cbind/schema_compiler.ts +833 -0
  134. package/src/main.ts +2 -2
  135. package/src/proof/index.ts +2 -2
@@ -0,0 +1,691 @@
1
+ "use strict";
2
+ /**
3
+ * Unified schema compiler with integrated strategies
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SchemaCompiler = void 0;
7
+ exports.createSharedTypesCompiler = createSharedTypesCompiler;
8
+ exports.createSyncApiCompiler = createSyncApiCompiler;
9
+ exports.createAsyncApiCompiler = createAsyncApiCompiler;
10
+ exports.createNativeApiCompiler = createNativeApiCompiler;
11
+ // Helper functions
12
+ function capitalize(s) {
13
+ return s.charAt(0).toUpperCase() + s.substring(1);
14
+ }
15
+ function camelCase(s) {
16
+ return s
17
+ .split('_')
18
+ .map((part, index) => (index === 0 ? part.charAt(0).toLowerCase() + part.substring(1) : capitalize(part)))
19
+ .join('');
20
+ }
21
+ function pascalCase(s) {
22
+ return s.split('_').map(capitalize).join('');
23
+ }
24
+ class SchemaCompiler {
25
+ constructor(config) {
26
+ this.config = config;
27
+ this.typeCache = new Map();
28
+ this.functionMetadata = [];
29
+ // WORKTODO(bbapi): AI slop fixup - redundant with typeCache, remove
30
+ this.referencedTypes = new Set();
31
+ }
32
+ /**
33
+ * Process API schema and extract function metadata
34
+ */
35
+ processApiSchema(commandsSchema, responsesSchema) {
36
+ // Process types
37
+ this.processSchema(commandsSchema);
38
+ this.processSchema(responsesSchema);
39
+ // Extract function metadata from named unions
40
+ if (!Array.isArray(commandsSchema) || commandsSchema[0] !== 'named_union' ||
41
+ !Array.isArray(responsesSchema) || responsesSchema[0] !== 'named_union') {
42
+ throw new Error('Expected named_union schema format');
43
+ }
44
+ const commands = commandsSchema[1];
45
+ const responses = responsesSchema[1];
46
+ for (let i = 0; i < commands.length; i++) {
47
+ const [commandName] = commands[i];
48
+ const [responseName] = responses[i];
49
+ this.functionMetadata.push({
50
+ name: camelCase(commandName),
51
+ commandType: pascalCase(commandName),
52
+ responseType: pascalCase(responseName),
53
+ });
54
+ }
55
+ }
56
+ /**
57
+ * Process a schema and populate type cache
58
+ */
59
+ processSchema(schema) {
60
+ const key = this.getSchemaKey(schema);
61
+ if (this.typeCache.has(key)) {
62
+ const ret = this.typeCache.get(key);
63
+ if (ret.typeName === 'unknown') {
64
+ throw new Error(`Recursive schema detected at ${key}, please check your schema for circular references.`);
65
+ }
66
+ return ret;
67
+ }
68
+ this.typeCache.set(key, { typeName: 'unknown', msgpackTypeName: '' });
69
+ const typeInfo = this.generateTypeInfo(schema);
70
+ this.typeCache.set(key, typeInfo);
71
+ return typeInfo;
72
+ }
73
+ /**
74
+ * Generate the complete output
75
+ */
76
+ compile() {
77
+ const parts = [
78
+ '// AUTOGENERATED FILE - DO NOT EDIT',
79
+ '',
80
+ ];
81
+ // Generate imports
82
+ parts.push(...this.generateImports());
83
+ parts.push('');
84
+ // Generate type declarations only for 'types' mode
85
+ if (this.config.mode === 'types') {
86
+ const sortedTypes = Array.from(this.typeCache.values())
87
+ .filter(t => t.declaration)
88
+ .sort((a, b) => a.typeName.localeCompare(b.typeName));
89
+ // Group declarations
90
+ const typeAliases = sortedTypes.filter(t => t.declaration?.startsWith('export type') && !t.declaration?.includes('interface'));
91
+ const publicInterfaces = sortedTypes.filter(t => t.declaration?.includes('export interface'));
92
+ const privateInterfaces = sortedTypes.filter(t => t.declaration?.includes('interface Msgpack'));
93
+ // Add type aliases if needed
94
+ if (typeAliases.length > 0) {
95
+ parts.push('// Type aliases');
96
+ for (const type of typeAliases) {
97
+ parts.push(type.declaration);
98
+ }
99
+ parts.push('');
100
+ }
101
+ // Add tuple helper if needed
102
+ if (this.needsTupleHelper()) {
103
+ parts.push('// Tuple type for fixed-size arrays', 'type Tuple<T, N extends number> = N extends N ? (number extends N ? T[] : _TupleOf<T, N, []>) : never;', 'type _TupleOf<T, N extends number, R extends unknown[]> = R[\'length\'] extends N ? R : _TupleOf<T, N, [T, ...R]>;', '', '// Helper functions', 'function mapTuple<T, S, N extends number>(tuple: Tuple<T, N>, fn: (item: T) => S): Tuple<S, N> {', ' return tuple.map(fn) as Tuple<S, N>;', '}', '');
104
+ }
105
+ // Add public interfaces
106
+ if (publicInterfaces.length > 0) {
107
+ parts.push('// Public interfaces (exported)');
108
+ for (const type of publicInterfaces) {
109
+ parts.push(type.declaration, '');
110
+ }
111
+ }
112
+ // Add private interfaces
113
+ if (privateInterfaces.length > 0) {
114
+ parts.push('// Private Msgpack interfaces (not exported)');
115
+ for (const type of privateInterfaces) {
116
+ parts.push(type.declaration, '');
117
+ }
118
+ }
119
+ // Add conversion functions (only for api_types.ts)
120
+ const conversions = sortedTypes.filter(t => t.toMethod || t.fromMethod);
121
+ if (conversions.length > 0) {
122
+ parts.push('// Conversion functions (exported)');
123
+ for (const type of conversions) {
124
+ if (type.toMethod) {
125
+ parts.push('export ' + type.toMethod, '');
126
+ }
127
+ if (type.fromMethod) {
128
+ parts.push('export ' + type.fromMethod, '');
129
+ }
130
+ }
131
+ }
132
+ // Add BbApiBase interface
133
+ if (this.functionMetadata.length > 0) {
134
+ parts.push('', '// Base API interface');
135
+ parts.push(this.generateBbApiBaseInterface());
136
+ }
137
+ }
138
+ // Add API class for non-types modes
139
+ if (this.config.mode !== 'types' && this.functionMetadata.length > 0) {
140
+ parts.push(this.generateApiClass());
141
+ }
142
+ return parts.join('\n') + '\n';
143
+ }
144
+ getSchemaKey(schema) {
145
+ if (typeof schema === 'string')
146
+ return schema;
147
+ if (Array.isArray(schema))
148
+ return JSON.stringify(schema);
149
+ if (typeof schema === 'object')
150
+ return schema.__typename || JSON.stringify(schema);
151
+ return String(schema);
152
+ }
153
+ needsTupleHelper() {
154
+ return Array.from(this.typeCache.values()).some(t => t.typeName.includes('Tuple<'));
155
+ }
156
+ trackTypeUsage(typeName) {
157
+ // Only track for API modes
158
+ if (this.config.mode === 'types')
159
+ return;
160
+ // Extract base types from complex types
161
+ const baseTypes = this.extractBaseTypes(typeName);
162
+ for (const type of baseTypes) {
163
+ // Skip built-in types
164
+ if (['string', 'number', 'boolean', 'Uint8Array'].includes(type)) {
165
+ continue;
166
+ }
167
+ this.referencedTypes.add(type);
168
+ }
169
+ }
170
+ extractBaseTypes(typeName) {
171
+ const types = [];
172
+ // Handle arrays
173
+ const arrayMatch = typeName.match(/^(.+)\[\]$/);
174
+ if (arrayMatch) {
175
+ types.push(...this.extractBaseTypes(arrayMatch[1]));
176
+ return types;
177
+ }
178
+ // Handle Tuple
179
+ const tupleMatch = typeName.match(/^Tuple<(.+),\s*\d+>$/);
180
+ if (tupleMatch) {
181
+ types.push(...this.extractBaseTypes(tupleMatch[1]));
182
+ return types;
183
+ }
184
+ // Handle Record
185
+ const recordMatch = typeName.match(/^Record<(.+),\s*(.+)>$/);
186
+ if (recordMatch) {
187
+ types.push(...this.extractBaseTypes(recordMatch[1]));
188
+ types.push(...this.extractBaseTypes(recordMatch[2]));
189
+ return types;
190
+ }
191
+ // Handle union types
192
+ if (typeName.includes(' | ')) {
193
+ const parts = typeName.split(' | ');
194
+ for (const part of parts) {
195
+ types.push(...this.extractBaseTypes(part.trim()));
196
+ }
197
+ return types;
198
+ }
199
+ // Base case - simple type
200
+ types.push(typeName);
201
+ return types;
202
+ }
203
+ generateTypeInfo(schema) {
204
+ if (Array.isArray(schema)) {
205
+ return this.processArraySchema(schema);
206
+ }
207
+ else if (typeof schema === 'string') {
208
+ return this.processPrimitiveSchema(schema);
209
+ }
210
+ else if (typeof schema === 'object') {
211
+ return this.processObjectSchema(schema);
212
+ }
213
+ throw new Error(`Unsupported schema type: ${schema}`);
214
+ }
215
+ processArraySchema(schema) {
216
+ const [type, ...args] = schema;
217
+ switch (type) {
218
+ case 'array': {
219
+ const [subtype, size] = args[0];
220
+ const subtypeInfo = this.processSchema(subtype);
221
+ return {
222
+ typeName: `Tuple<${subtypeInfo.typeName}, ${size}>`,
223
+ msgpackTypeName: `Tuple<${subtypeInfo.msgpackTypeName || subtypeInfo.typeName}, ${size}>`,
224
+ };
225
+ }
226
+ case 'variant': {
227
+ const variants = args[0];
228
+ const variantInfos = variants.map(v => this.processSchema(v));
229
+ const typeName = variantInfos.map(v => v.typeName).join(' | ');
230
+ const msgpackUnion = variantInfos.map(v => v.msgpackTypeName || v.typeName).join(' | ');
231
+ return {
232
+ typeName,
233
+ msgpackTypeName: `[number, ${msgpackUnion}]`,
234
+ };
235
+ }
236
+ case 'named_union': {
237
+ const namedTypes = args[0];
238
+ const tupleTypes = [];
239
+ for (const [name, schemaOrName] of namedTypes) {
240
+ let typeInfo = this.processSchema(schemaOrName);
241
+ // Track usage of the type
242
+ this.trackTypeUsage(typeInfo.typeName);
243
+ tupleTypes.push(`["${name}", ${typeInfo.typeName}]`);
244
+ }
245
+ return {
246
+ typeName: tupleTypes.join(' | '),
247
+ msgpackTypeName: tupleTypes.join(' | '),
248
+ };
249
+ }
250
+ case 'vector': {
251
+ const [subtype] = args[0];
252
+ if (subtype === 'unsigned char') {
253
+ return { typeName: 'Uint8Array' };
254
+ }
255
+ const subtypeInfo = this.processSchema(subtype);
256
+ return {
257
+ typeName: `${subtypeInfo.typeName}[]`,
258
+ msgpackTypeName: `${subtypeInfo.msgpackTypeName || subtypeInfo.typeName}[]`,
259
+ };
260
+ }
261
+ case 'alias': {
262
+ const [rawTypeName, msgpackName] = args[0];
263
+ const typeName = pascalCase(rawTypeName);
264
+ let targetType;
265
+ if (msgpackName.startsWith('bin')) {
266
+ targetType = 'Uint8Array';
267
+ }
268
+ else if (['int', 'unsigned int', 'unsigned short'].includes(msgpackName)) {
269
+ targetType = 'number';
270
+ }
271
+ else {
272
+ throw new Error(`Unsupported alias type: ${msgpackName}`);
273
+ }
274
+ // Create a proper type alias declaration
275
+ return {
276
+ typeName,
277
+ msgpackTypeName: targetType,
278
+ declaration: `export type ${typeName} = ${targetType};`,
279
+ };
280
+ }
281
+ case 'shared_ptr': {
282
+ const [subtype] = args[0];
283
+ return this.processSchema(subtype);
284
+ }
285
+ case 'map': {
286
+ const [keyType, valueType] = args[0];
287
+ const keyInfo = this.processSchema(keyType);
288
+ const valueInfo = this.processSchema(valueType);
289
+ return {
290
+ typeName: `Record<${keyInfo.typeName}, ${valueInfo.typeName}>`,
291
+ msgpackTypeName: `Record<${keyInfo.msgpackTypeName || keyInfo.typeName}, ${valueInfo.msgpackTypeName || valueInfo.typeName}>`,
292
+ };
293
+ }
294
+ default:
295
+ throw new Error(`Unsupported array schema type: ${type}`);
296
+ }
297
+ }
298
+ processPrimitiveSchema(schema) {
299
+ switch (schema) {
300
+ case 'bool':
301
+ return { typeName: 'boolean' };
302
+ case 'int':
303
+ case 'unsigned int':
304
+ case 'unsigned short':
305
+ case 'unsigned long':
306
+ case 'double':
307
+ return { typeName: 'number' };
308
+ case 'string':
309
+ return { typeName: 'string' };
310
+ case 'bin32':
311
+ return { typeName: 'Uint8Array' };
312
+ default:
313
+ return { typeName: pascalCase(schema) };
314
+ }
315
+ }
316
+ processObjectSchema(schema) {
317
+ const typeName = pascalCase(schema.__typename);
318
+ const msgpackTypeName = 'Msgpack' + typeName;
319
+ const declaration = this.generateInterfaces(typeName, schema);
320
+ const toMethod = this.generateToMethod(typeName, schema);
321
+ const fromMethod = this.generateFromMethod(typeName, schema);
322
+ return {
323
+ typeName,
324
+ msgpackTypeName,
325
+ declaration,
326
+ toMethod,
327
+ fromMethod,
328
+ };
329
+ }
330
+ getOrCreateEmptyType(typeName) {
331
+ const key = `empty_${typeName}`;
332
+ if (this.typeCache.has(key)) {
333
+ return this.typeCache.get(key);
334
+ }
335
+ const typeInfo = {
336
+ typeName,
337
+ msgpackTypeName: 'Msgpack' + typeName,
338
+ declaration: `export interface ${typeName} {}\n\ninterface Msgpack${typeName} {}`,
339
+ toMethod: `function to${typeName}(o: Msgpack${typeName}): ${typeName} {\n return {};\n}`,
340
+ fromMethod: `function from${typeName}(o: ${typeName}): Msgpack${typeName} {\n return {};\n}`,
341
+ };
342
+ this.typeCache.set(key, typeInfo);
343
+ return typeInfo;
344
+ }
345
+ generateInterfaces(name, schema) {
346
+ const publicInterface = this.generatePublicInterface(name, schema);
347
+ const msgpackInterface = this.generateMsgpackInterface(name, schema);
348
+ return publicInterface + '\n\n' + msgpackInterface;
349
+ }
350
+ generatePublicInterface(name, schema) {
351
+ let result = `export interface ${name} {\n`;
352
+ for (const [key, value] of Object.entries(schema)) {
353
+ if (key === '__typename')
354
+ continue;
355
+ const typeInfo = this.processSchema(value);
356
+ // Track type usage
357
+ this.trackTypeUsage(typeInfo.typeName);
358
+ result += ` ${camelCase(key)}: ${typeInfo.typeName};\n`;
359
+ }
360
+ result += '}';
361
+ return result;
362
+ }
363
+ generateMsgpackInterface(name, schema) {
364
+ let result = `interface Msgpack${name} {\n`;
365
+ for (const [key, value] of Object.entries(schema)) {
366
+ if (key === '__typename')
367
+ continue;
368
+ const typeInfo = this.processSchema(value);
369
+ result += ` ${key}: ${typeInfo.msgpackTypeName || typeInfo.typeName};\n`;
370
+ }
371
+ result += '}';
372
+ return result;
373
+ }
374
+ generateToMethod(name, schema) {
375
+ const fields = Object.entries(schema).filter(([key]) => key !== '__typename');
376
+ if (fields.length === 0) {
377
+ return `function to${name}(o: Msgpack${name}): ${name} {\n return {};\n}`;
378
+ }
379
+ const checks = fields.map(([key]) => ` if (o.${key} === undefined) { throw new Error("Expected ${key} in ${name} deserialization"); }`).join('\n');
380
+ const conversions = fields.map(([key, value]) => {
381
+ const typeInfo = this.processSchema(value);
382
+ const converter = this.generateConverter(typeInfo, `o.${key}`, 'to');
383
+ return ` ${camelCase(key)}: ${converter},`;
384
+ }).join('\n');
385
+ return `function to${name}(o: Msgpack${name}): ${name} {
386
+ ${checks};
387
+ return {
388
+ ${conversions}
389
+ };
390
+ }`;
391
+ }
392
+ generateFromMethod(name, schema) {
393
+ const fields = Object.entries(schema).filter(([key]) => key !== '__typename');
394
+ if (fields.length === 0) {
395
+ return `function from${name}(o: ${name}): Msgpack${name} {\n return {};\n}`;
396
+ }
397
+ const checks = fields.map(([key]) => ` if (o.${camelCase(key)} === undefined) { throw new Error("Expected ${camelCase(key)} in ${name} serialization"); }`).join('\n');
398
+ const conversions = fields.map(([key, value]) => {
399
+ const typeInfo = this.processSchema(value);
400
+ const converter = this.generateConverter(typeInfo, `o.${camelCase(key)}`, 'from');
401
+ return ` ${key}: ${converter},`;
402
+ }).join('\n');
403
+ return `function from${name}(o: ${name}): Msgpack${name} {
404
+ ${checks};
405
+ return {
406
+ ${conversions}
407
+ };
408
+ }`;
409
+ }
410
+ generateConverter(typeInfo, value, direction) {
411
+ // Handle arrays/tuples
412
+ if (typeInfo.typeName.includes('[]') || typeInfo.typeName.includes('Tuple<')) {
413
+ const elementType = typeInfo.typeName.match(/^(.+)\[\]$/) || typeInfo.typeName.match(/^Tuple<(.+),/);
414
+ if (elementType) {
415
+ const isTuple = typeInfo.typeName.includes('Tuple<');
416
+ const mapFn = isTuple ? 'mapTuple' : 'map';
417
+ return `${value}.${mapFn}((v: any) => v)`; // Simplified for now
418
+ }
419
+ }
420
+ // Handle custom types
421
+ if (typeInfo.declaration) {
422
+ return `${direction}${typeInfo.typeName}(${value})`;
423
+ }
424
+ return value;
425
+ }
426
+ generateImports() {
427
+ const imports = [];
428
+ // Base imports
429
+ if (this.config.imports) {
430
+ imports.push(...this.config.imports);
431
+ }
432
+ // For API modes, import from api_types
433
+ if (this.config.mode !== 'types') {
434
+ const neededImports = new Set();
435
+ // Add types and conversion functions from function metadata
436
+ for (const metadata of this.functionMetadata) {
437
+ neededImports.add(metadata.commandType);
438
+ neededImports.add(metadata.responseType);
439
+ neededImports.add(`from${metadata.commandType}`);
440
+ neededImports.add(`to${metadata.responseType}`);
441
+ }
442
+ // Add referenced types
443
+ for (const type of this.referencedTypes) {
444
+ neededImports.add(type);
445
+ }
446
+ // Add BbApiBase interface
447
+ neededImports.add('BbApiBase');
448
+ if (neededImports.size > 0) {
449
+ const sortedImports = Array.from(neededImports).sort();
450
+ // Remove duplicates
451
+ const uniqueImports = sortedImports.filter((item, index) => sortedImports.indexOf(item) === index);
452
+ imports.push(`import { ${uniqueImports.join(', ')} } from './api_types.js';`);
453
+ }
454
+ }
455
+ return imports;
456
+ }
457
+ generateBbApiBaseInterface() {
458
+ const methods = this.functionMetadata.map(m => ` ${m.name}(command: ${m.commandType}): Promise<${m.responseType}>;`).join('\n');
459
+ return `export interface BbApiBase {
460
+ ${methods}
461
+ destroy(): Promise<void>;
462
+ }`;
463
+ }
464
+ generateApiClass() {
465
+ const className = this.getApiClassName();
466
+ const methods = this.functionMetadata.map(m => this.generateApiMethod(m)).join('\n\n');
467
+ if (this.config.mode === 'native') {
468
+ return this.generateNativeApiClass(methods);
469
+ }
470
+ // For sync API, don't implement BbApiBase since methods are synchronous
471
+ const implementsClause = this.config.mode === 'sync' ? '' : ' implements BbApiBase';
472
+ const msgpackCallHelper = `${this.config.mode === 'async' ? 'async ' : ''}function msgpackCall(wasm: ${this.getWasmType()}, cbind: string, input: any[]) {` +
473
+ ` const inputBuffer = new Encoder({ useRecords: false }).pack(input);` +
474
+ ` const encodedResult = ${this.config.mode === 'async' ? 'await ' : ''}wasm.cbindCall(cbind, inputBuffer);` +
475
+ ` return new Decoder({ useRecords: false }).unpack(encodedResult);` +
476
+ `}\n`;
477
+ return (msgpackCallHelper +
478
+ `export class ${className}${implementsClause} {
479
+ constructor(protected wasm: ${this.getWasmType()}) {}
480
+
481
+ ${methods}
482
+
483
+ destroy(): Promise<void> {
484
+ return this.wasm.destroy();
485
+ }
486
+ }`);
487
+ }
488
+ getApiClassName() {
489
+ switch (this.config.mode) {
490
+ case 'sync': return 'SyncApi';
491
+ case 'async': return 'AsyncApi';
492
+ case 'native': return 'NativeApi';
493
+ default: throw new Error(`Invalid mode: ${this.config.mode}`);
494
+ }
495
+ }
496
+ getWasmType() {
497
+ switch (this.config.mode) {
498
+ case 'sync': return 'BarretenbergWasmMain';
499
+ case 'async': return 'BarretenbergWasmMainWorker';
500
+ default: return '';
501
+ }
502
+ }
503
+ generateApiMethod(metadata) {
504
+ const { name, commandType, responseType } = metadata;
505
+ if (this.config.mode === 'native') {
506
+ return ` ${name}(command: ${commandType}): Promise<${responseType}> {
507
+ const msgpackCommand = from${commandType}(command);
508
+ return this.sendCommand(['${metadata.commandType}', msgpackCommand]).then(([variantName, result]: [string, any]) => {
509
+ if (variantName !== '${responseType}') {
510
+ throw new Error(\`Expected variant name '${responseType}' but got '\${variantName}'\`);
511
+ }
512
+ return to${responseType}(result);
513
+ });
514
+ }`;
515
+ }
516
+ // For async mode, queue immediately and return promise
517
+ if (this.config.mode === 'async') {
518
+ return ` ${name}(command: ${commandType}): Promise<${responseType}> {
519
+ const msgpackCommand = from${commandType}(command);
520
+ return msgpackCall(this.wasm, 'bbapi', [["${capitalize(name)}", msgpackCommand]]).then(([variantName, result]: [string, any]) => {
521
+ if (variantName !== '${responseType}') {
522
+ throw new Error(\`Expected variant name '${responseType}' but got '\${variantName}'\`);
523
+ }
524
+ return to${responseType}(result);
525
+ });
526
+ }`;
527
+ }
528
+ // For sync mode, keep the synchronous behavior
529
+ return ` ${name}(command: ${commandType}): ${responseType} {
530
+ const msgpackCommand = from${commandType}(command);
531
+ const [variantName, result] = msgpackCall(this.wasm, 'bbapi', [["${capitalize(name)}", msgpackCommand]]);
532
+ if (variantName !== '${responseType}') {
533
+ throw new Error(\`Expected variant name '${responseType}' but got '\${variantName}'\`);
534
+ }
535
+ return to${responseType}(result);
536
+ }`;
537
+ }
538
+ generateNativeApiClass(methods) {
539
+ return `interface NativeApiRequest {
540
+ resolve: (value: any) => void;
541
+ reject: (error: any) => void;
542
+ }
543
+
544
+ class StreamBuffer {
545
+ private buffer = Buffer.alloc(0);
546
+ private expectedLength: number | null = null;
547
+
548
+ addData(data: Buffer): Buffer[] {
549
+ // Create buffer to grow as needed
550
+ const newBuffer = Buffer.allocUnsafe(this.buffer.length + data.length);
551
+ this.buffer.copy(newBuffer, 0);
552
+ data.copy(newBuffer, this.buffer.length);
553
+ this.buffer = newBuffer;
554
+
555
+ const messages: Buffer[] = [];
556
+
557
+ while (true) {
558
+ if (this.expectedLength === null) {
559
+ if (this.buffer.length < 4) break;
560
+ this.expectedLength = this.buffer.readUInt32LE(0);
561
+ this.buffer = this.buffer.subarray(4);
562
+ }
563
+
564
+ if (this.buffer.length < this.expectedLength) break;
565
+
566
+ // Extract complete message
567
+ const messageBuffer = this.buffer.subarray(0, this.expectedLength);
568
+ messages.push(messageBuffer);
569
+ this.buffer = this.buffer.subarray(this.expectedLength);
570
+ this.expectedLength = null;
571
+ }
572
+
573
+ return messages;
574
+ }
575
+ }
576
+
577
+ export class NativeApi implements BbApiBase {
578
+ private decoder = new Decoder({ useRecords: false });
579
+ private encoder = new Encoder({ useRecords: false });
580
+ private pendingRequests: NativeApiRequest[] = [];
581
+
582
+ private constructor(private proc: ChildProcess) {}
583
+
584
+ static async new(bbPath = 'bb', logger = console.log): Promise<NativeApi> {
585
+ const proc = spawn(bbPath, ['msgpack', 'run'], {
586
+ stdio: ['pipe', 'pipe', 'pipe'],
587
+ });
588
+
589
+ if (!proc.stdout || !proc.stdin) {
590
+ throw new Error('Failed to initialize bb process');
591
+ }
592
+
593
+ const api = new NativeApi(proc);
594
+ const streamBuffer = new StreamBuffer();
595
+
596
+ proc.stdout.on('data', (data: Buffer) => {
597
+ const messages = streamBuffer.addData(data);
598
+
599
+ for (const messageBuffer of messages) {
600
+ const pendingRequest = api.pendingRequests.shift();
601
+ if (!pendingRequest) {
602
+ throw new Error('Received response without a pending request');
603
+ }
604
+
605
+ try {
606
+ const decoded = api.decoder.decode(messageBuffer);
607
+ if (!Array.isArray(decoded) || decoded.length !== 2) {
608
+ throw new Error(\`Invalid response format: \${JSON.stringify(decoded)}\`);
609
+ }
610
+ const [variantName, result] = decoded;
611
+ pendingRequest.resolve([variantName, result]);
612
+ } catch (error) {
613
+ pendingRequest.reject(error);
614
+ break;
615
+ }
616
+ }
617
+ });
618
+
619
+ proc.stderr.on('data', (data: Buffer) => {
620
+ logger(data.toString().trim());
621
+ });
622
+
623
+ proc.on('error', err => {
624
+ throw new Error(err.message);
625
+ });
626
+ return api;
627
+ }
628
+
629
+ private sendCommand(command: any): Promise<any> {
630
+ return new Promise((resolve, reject) => {
631
+ this.pendingRequests.push({ resolve, reject });
632
+ const encoded = this.encoder.encode(command);
633
+
634
+ // Write length prefix (4 bytes, little-endian)
635
+ const lengthBuffer = Buffer.allocUnsafe(4);
636
+ lengthBuffer.writeUInt32LE(encoded.length, 0);
637
+
638
+ // Write length prefix followed by the encoded data
639
+ this.proc.stdin!.write(lengthBuffer);
640
+ this.proc.stdin!.write(encoded);
641
+ });
642
+ }
643
+
644
+ async close(): Promise<void> {
645
+ this.proc.kill();
646
+ }
647
+
648
+ destroy(): Promise<void> {
649
+ return this.close();
650
+ }
651
+
652
+ ${methods}
653
+ }`;
654
+ }
655
+ }
656
+ exports.SchemaCompiler = SchemaCompiler;
657
+ // Factory methods for creating configured compilers
658
+ function createSharedTypesCompiler() {
659
+ return new SchemaCompiler({
660
+ mode: 'types',
661
+ imports: [],
662
+ });
663
+ }
664
+ function createSyncApiCompiler() {
665
+ return new SchemaCompiler({
666
+ mode: 'sync',
667
+ imports: [
668
+ `import { BarretenbergWasmMain } from "../../barretenberg_wasm/barretenberg_wasm_main/index.js";`,
669
+ `import { Decoder, Encoder } from 'msgpackr';`,
670
+ ],
671
+ });
672
+ }
673
+ function createAsyncApiCompiler() {
674
+ return new SchemaCompiler({
675
+ mode: 'async',
676
+ imports: [
677
+ `import { BarretenbergWasmMainWorker } from "../../barretenberg_wasm/barretenberg_wasm_main/index.js";`,
678
+ `import { Decoder, Encoder } from 'msgpackr';`
679
+ ],
680
+ });
681
+ }
682
+ function createNativeApiCompiler() {
683
+ return new SchemaCompiler({
684
+ mode: 'native',
685
+ imports: [
686
+ `import { spawn, ChildProcess } from 'child_process';`,
687
+ `import { Decoder, Encoder } from 'msgpackr';`
688
+ ],
689
+ });
690
+ }
691
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hX2NvbXBpbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NiaW5kL3NjaGVtYV9jb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7OztBQTJ4QkgsOERBS0M7QUFFRCxzREFRQztBQUVELHdEQVFDO0FBRUQsMERBUUM7QUF2eEJELG1CQUFtQjtBQUNuQixTQUFTLFVBQVUsQ0FBQyxDQUFTO0lBQzNCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxDQUFTO0lBQzFCLE9BQU8sQ0FBQztTQUNMLEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDekcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLENBQVM7SUFDM0IsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELE1BQWEsY0FBYztJQU16QixZQUFvQixNQUFzQjtRQUF0QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUxsQyxjQUFTLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFDeEMscUJBQWdCLEdB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