@aztec/bb.js 0.0.1-commit.d3ec352c → 0.0.1-commit.e310a4c8

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 (187) 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 +109 -9
  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 +765 -1672
  24. package/dest/browser/cbind/generated/api_types.d.ts.map +1 -1
  25. package/dest/browser/cbind/generated/api_types.js +1453 -1525
  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/index.d.ts +2 -2
  45. package/dest/browser/index.d.ts.map +1 -1
  46. package/dest/browser/index.js +2 -2
  47. package/dest/node/barretenberg/backend.d.ts +49 -17
  48. package/dest/node/barretenberg/backend.d.ts.map +1 -1
  49. package/dest/node/barretenberg/backend.js +109 -9
  50. package/dest/node/barretenberg/backend.test.d.ts +2 -0
  51. package/dest/node/barretenberg/backend.test.d.ts.map +1 -0
  52. package/dest/node/barretenberg/backend.test.js +103 -0
  53. package/dest/node/barretenberg/index.d.ts +2 -2
  54. package/dest/node/barretenberg/index.d.ts.map +1 -1
  55. package/dest/node/barretenberg/index.js +2 -2
  56. package/dest/node/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
  57. package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.js +1 -1
  58. package/dest/node/bb_backends/index.d.ts +3 -1
  59. package/dest/node/bb_backends/index.d.ts.map +1 -1
  60. package/dest/node/bb_backends/node/index.d.ts +1 -1
  61. package/dest/node/bb_backends/node/index.d.ts.map +1 -1
  62. package/dest/node/bb_backends/node/index.js +5 -5
  63. package/dest/node/bb_backends/node/native_shm.d.ts +3 -2
  64. package/dest/node/bb_backends/node/native_shm.d.ts.map +1 -1
  65. package/dest/node/bb_backends/node/native_shm.js +40 -21
  66. package/dest/node/bb_backends/node/native_shm_async.d.ts +2 -2
  67. package/dest/node/bb_backends/node/native_shm_async.d.ts.map +1 -1
  68. package/dest/node/bb_backends/node/native_shm_async.js +17 -21
  69. package/dest/node/bb_backends/node/native_socket.d.ts +1 -1
  70. package/dest/node/bb_backends/node/native_socket.d.ts.map +1 -1
  71. package/dest/node/bb_backends/node/native_socket.js +7 -5
  72. package/dest/node/bb_backends/node/platform.d.ts +1 -1
  73. package/dest/node/bb_backends/node/platform.d.ts.map +1 -1
  74. package/dest/node/bb_backends/node/platform.js +7 -2
  75. package/dest/node/cbind/generate.d.ts +5 -2
  76. package/dest/node/cbind/generate.d.ts.map +1 -1
  77. package/dest/node/cbind/generate.js +47 -25
  78. package/dest/node/cbind/generated/api_types.d.ts +765 -1672
  79. package/dest/node/cbind/generated/api_types.d.ts.map +1 -1
  80. package/dest/node/cbind/generated/api_types.js +1453 -1525
  81. package/dest/node/cbind/generated/async.d.ts +3 -5
  82. package/dest/node/cbind/generated/async.d.ts.map +1 -1
  83. package/dest/node/cbind/generated/async.js +13 -33
  84. package/dest/node/cbind/generated/sync.d.ts +3 -5
  85. package/dest/node/cbind/generated/sync.d.ts.map +1 -1
  86. package/dest/node/cbind/generated/sync.js +13 -31
  87. package/dest/node/cbind/naming.d.ts +16 -0
  88. package/dest/node/cbind/naming.d.ts.map +1 -0
  89. package/dest/node/cbind/naming.js +24 -0
  90. package/dest/node/cbind/rust_codegen.d.ts +26 -0
  91. package/dest/node/cbind/rust_codegen.d.ts.map +1 -0
  92. package/dest/node/cbind/rust_codegen.js +461 -0
  93. package/dest/node/cbind/schema_visitor.d.ts +47 -0
  94. package/dest/node/cbind/schema_visitor.d.ts.map +1 -0
  95. package/dest/node/cbind/schema_visitor.js +158 -0
  96. package/dest/node/cbind/typescript_codegen.d.ts +30 -0
  97. package/dest/node/cbind/typescript_codegen.d.ts.map +1 -0
  98. package/dest/node/cbind/typescript_codegen.js +365 -0
  99. package/dest/node/index.d.ts +2 -2
  100. package/dest/node/index.d.ts.map +1 -1
  101. package/dest/node/index.js +2 -2
  102. package/dest/node-cjs/barretenberg/backend.d.ts +49 -17
  103. package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -1
  104. package/dest/node-cjs/barretenberg/backend.js +111 -9
  105. package/dest/node-cjs/barretenberg/backend.test.d.ts +2 -0
  106. package/dest/node-cjs/barretenberg/backend.test.d.ts.map +1 -0
  107. package/dest/node-cjs/barretenberg/backend.test.js +105 -0
  108. package/dest/node-cjs/barretenberg/index.d.ts +2 -2
  109. package/dest/node-cjs/barretenberg/index.d.ts.map +1 -1
  110. package/dest/node-cjs/barretenberg/index.js +4 -2
  111. package/dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
  112. package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.js +1 -1
  113. package/dest/node-cjs/bb_backends/index.d.ts +3 -1
  114. package/dest/node-cjs/bb_backends/index.d.ts.map +1 -1
  115. package/dest/node-cjs/bb_backends/node/index.d.ts +1 -1
  116. package/dest/node-cjs/bb_backends/node/index.d.ts.map +1 -1
  117. package/dest/node-cjs/bb_backends/node/index.js +5 -5
  118. package/dest/node-cjs/bb_backends/node/native_shm.d.ts +3 -2
  119. package/dest/node-cjs/bb_backends/node/native_shm.d.ts.map +1 -1
  120. package/dest/node-cjs/bb_backends/node/native_shm.js +39 -20
  121. package/dest/node-cjs/bb_backends/node/native_shm_async.d.ts +2 -2
  122. package/dest/node-cjs/bb_backends/node/native_shm_async.d.ts.map +1 -1
  123. package/dest/node-cjs/bb_backends/node/native_shm_async.js +17 -21
  124. package/dest/node-cjs/bb_backends/node/native_socket.d.ts +1 -1
  125. package/dest/node-cjs/bb_backends/node/native_socket.d.ts.map +1 -1
  126. package/dest/node-cjs/bb_backends/node/native_socket.js +7 -5
  127. package/dest/node-cjs/bb_backends/node/platform.d.ts +1 -1
  128. package/dest/node-cjs/bb_backends/node/platform.d.ts.map +1 -1
  129. package/dest/node-cjs/bb_backends/node/platform.js +7 -2
  130. package/dest/node-cjs/cbind/generate.d.ts +5 -2
  131. package/dest/node-cjs/cbind/generate.d.ts.map +1 -1
  132. package/dest/node-cjs/cbind/generate.js +47 -25
  133. package/dest/node-cjs/cbind/generated/api_types.d.ts +765 -1672
  134. package/dest/node-cjs/cbind/generated/api_types.d.ts.map +1 -1
  135. package/dest/node-cjs/cbind/generated/api_types.js +1662 -1742
  136. package/dest/node-cjs/cbind/generated/async.d.ts +3 -5
  137. package/dest/node-cjs/cbind/generated/async.d.ts.map +1 -1
  138. package/dest/node-cjs/cbind/generated/async.js +12 -32
  139. package/dest/node-cjs/cbind/generated/sync.d.ts +3 -5
  140. package/dest/node-cjs/cbind/generated/sync.d.ts.map +1 -1
  141. package/dest/node-cjs/cbind/generated/sync.js +12 -30
  142. package/dest/node-cjs/cbind/naming.d.ts +16 -0
  143. package/dest/node-cjs/cbind/naming.d.ts.map +1 -0
  144. package/dest/node-cjs/cbind/naming.js +28 -0
  145. package/dest/node-cjs/cbind/rust_codegen.d.ts +26 -0
  146. package/dest/node-cjs/cbind/rust_codegen.d.ts.map +1 -0
  147. package/dest/node-cjs/cbind/rust_codegen.js +465 -0
  148. package/dest/node-cjs/cbind/schema_visitor.d.ts +47 -0
  149. package/dest/node-cjs/cbind/schema_visitor.d.ts.map +1 -0
  150. package/dest/node-cjs/cbind/schema_visitor.js +162 -0
  151. package/dest/node-cjs/cbind/typescript_codegen.d.ts +30 -0
  152. package/dest/node-cjs/cbind/typescript_codegen.d.ts.map +1 -0
  153. package/dest/node-cjs/cbind/typescript_codegen.js +369 -0
  154. package/dest/node-cjs/index.d.ts +2 -2
  155. package/dest/node-cjs/index.d.ts.map +1 -1
  156. package/dest/node-cjs/index.js +4 -2
  157. package/package.json +1 -1
  158. package/src/barretenberg/backend.test.ts +122 -0
  159. package/src/barretenberg/backend.ts +149 -23
  160. package/src/barretenberg/index.ts +9 -1
  161. package/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +1 -1
  162. package/src/bb_backends/index.ts +3 -0
  163. package/src/bb_backends/node/index.ts +9 -4
  164. package/src/bb_backends/node/native_shm.ts +38 -19
  165. package/src/bb_backends/node/native_shm_async.ts +15 -19
  166. package/src/bb_backends/node/native_socket.ts +7 -5
  167. package/src/bb_backends/node/platform.ts +6 -1
  168. package/src/cbind/generate.ts +51 -32
  169. package/src/cbind/naming.ts +27 -0
  170. package/src/cbind/rust_codegen.ts +504 -0
  171. package/src/cbind/schema_visitor.ts +219 -0
  172. package/src/cbind/typescript_codegen.ts +419 -0
  173. package/src/index.ts +4 -0
  174. package/dest/browser/cbind/schema_compiler.d.ts +0 -68
  175. package/dest/browser/cbind/schema_compiler.d.ts.map +0 -1
  176. package/dest/browser/cbind/schema_compiler.js +0 -600
  177. package/dest/node/cbind/schema_compiler.d.ts +0 -68
  178. package/dest/node/cbind/schema_compiler.d.ts.map +0 -1
  179. package/dest/node/cbind/schema_compiler.js +0 -600
  180. package/dest/node-cjs/cbind/schema_compiler.d.ts +0 -68
  181. package/dest/node-cjs/cbind/schema_compiler.d.ts.map +0 -1
  182. package/dest/node-cjs/cbind/schema_compiler.js +0 -607
  183. package/src/cbind/generated/api_types.ts +0 -4241
  184. package/src/cbind/generated/async.ts +0 -717
  185. package/src/cbind/generated/curve_constants.ts +0 -53
  186. package/src/cbind/generated/sync.ts +0 -663
  187. package/src/cbind/schema_compiler.ts +0 -745
@@ -1,600 +0,0 @@
1
- /**
2
- * Unified schema compiler with integrated strategies
3
- */
4
- // Helper functions
5
- function capitalize(s) {
6
- return s.charAt(0).toUpperCase() + s.substring(1);
7
- }
8
- function camelCase(s) {
9
- return s
10
- .split('_')
11
- .map((part, index) => (index === 0 ? part.charAt(0).toLowerCase() + part.substring(1) : capitalize(part)))
12
- .join('');
13
- }
14
- function pascalCase(s) {
15
- return s.split('_').map(capitalize).join('');
16
- }
17
- export class SchemaCompiler {
18
- config;
19
- typeCache = new Map();
20
- functionMetadata = [];
21
- // WORKTODO(bbapi): AI slop fixup - redundant with typeCache, remove
22
- referencedTypes = new Set();
23
- constructor(config) {
24
- this.config = config;
25
- }
26
- /**
27
- * Process API schema and extract function metadata
28
- */
29
- processApiSchema(commandsSchema, responsesSchema) {
30
- // Process types
31
- this.processSchema(commandsSchema);
32
- this.processSchema(responsesSchema);
33
- // Extract function metadata from named unions
34
- if (!Array.isArray(commandsSchema) ||
35
- commandsSchema[0] !== 'named_union' ||
36
- !Array.isArray(responsesSchema) ||
37
- responsesSchema[0] !== 'named_union') {
38
- throw new Error('Expected named_union schema format');
39
- }
40
- const commands = commandsSchema[1];
41
- const responses = responsesSchema[1];
42
- // Filter out ErrorResponse - it's a special error variant, not a command response
43
- const normalResponses = responses.filter(([name]) => name !== 'ErrorResponse');
44
- if (commands.length !== normalResponses.length) {
45
- throw new Error(`Command count (${commands.length}) does not match response count (${normalResponses.length})`);
46
- }
47
- for (let i = 0; i < commands.length; i++) {
48
- const [commandName] = commands[i];
49
- const [responseName] = normalResponses[i];
50
- this.functionMetadata.push({
51
- name: camelCase(commandName),
52
- commandType: pascalCase(commandName),
53
- responseType: pascalCase(responseName),
54
- });
55
- }
56
- }
57
- /**
58
- * Process a schema and populate type cache
59
- */
60
- processSchema(schema) {
61
- const key = this.getSchemaKey(schema);
62
- if (this.typeCache.has(key)) {
63
- const ret = this.typeCache.get(key);
64
- if (ret.typeName === 'unknown') {
65
- throw new Error(`Recursive schema detected at ${key}, please check your schema for circular references.`);
66
- }
67
- return ret;
68
- }
69
- this.typeCache.set(key, { typeName: 'unknown', msgpackTypeName: '' });
70
- const typeInfo = this.generateTypeInfo(schema);
71
- this.typeCache.set(key, typeInfo);
72
- return typeInfo;
73
- }
74
- /**
75
- * Generate the complete output
76
- */
77
- compile() {
78
- const parts = ['// AUTOGENERATED FILE - DO NOT EDIT', ''];
79
- // Generate imports
80
- parts.push(...this.generateImports());
81
- parts.push('');
82
- // Generate type declarations only for 'types' mode
83
- if (this.config.mode === 'types') {
84
- const sortedTypes = Array.from(this.typeCache.values())
85
- .filter(t => t.declaration)
86
- .sort((a, b) => a.typeName.localeCompare(b.typeName));
87
- // Group declarations
88
- const typeAliases = sortedTypes.filter(t => t.declaration?.startsWith('export type') && !t.declaration?.includes('interface'));
89
- const publicInterfaces = sortedTypes.filter(t => t.declaration?.includes('export interface'));
90
- const privateInterfaces = sortedTypes.filter(t => t.declaration?.includes('interface Msgpack'));
91
- // Add type aliases if needed
92
- if (typeAliases.length > 0) {
93
- parts.push('// Type aliases');
94
- for (const type of typeAliases) {
95
- parts.push(type.declaration);
96
- }
97
- parts.push('');
98
- }
99
- // Add tuple helper if needed
100
- if (this.needsTupleHelper()) {
101
- 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>;', '}', '');
102
- }
103
- // Add public interfaces
104
- if (publicInterfaces.length > 0) {
105
- parts.push('// Public interfaces (exported)');
106
- for (const type of publicInterfaces) {
107
- parts.push(type.declaration, '');
108
- }
109
- }
110
- // Add private interfaces
111
- if (privateInterfaces.length > 0) {
112
- parts.push('// Private Msgpack interfaces (not exported)');
113
- for (const type of privateInterfaces) {
114
- parts.push(type.declaration, '');
115
- }
116
- }
117
- // Add conversion functions (only for api_types.ts)
118
- const conversions = sortedTypes.filter(t => t.toMethod || t.fromMethod);
119
- if (conversions.length > 0) {
120
- parts.push('// Conversion functions (exported)');
121
- for (const type of conversions) {
122
- if (type.toMethod) {
123
- parts.push('export ' + type.toMethod, '');
124
- }
125
- if (type.fromMethod) {
126
- parts.push('export ' + type.fromMethod, '');
127
- }
128
- }
129
- }
130
- // Add BbApiBase interface
131
- if (this.functionMetadata.length > 0) {
132
- parts.push('', '// Base API interface');
133
- parts.push(this.generateBbApiBaseInterface());
134
- }
135
- }
136
- // Add API class for non-types modes
137
- if (this.config.mode !== 'types' && this.functionMetadata.length > 0) {
138
- parts.push(this.generateApiClass());
139
- }
140
- return parts.join('\n') + '\n';
141
- }
142
- getSchemaKey(schema) {
143
- if (typeof schema === 'string')
144
- return schema;
145
- if (Array.isArray(schema))
146
- return JSON.stringify(schema);
147
- if (typeof schema === 'object')
148
- return schema.__typename || JSON.stringify(schema);
149
- return String(schema);
150
- }
151
- needsTupleHelper() {
152
- return Array.from(this.typeCache.values()).some(t => t.typeName.includes('Tuple<'));
153
- }
154
- trackTypeUsage(typeName) {
155
- // Only track for API modes
156
- if (this.config.mode === 'types')
157
- return;
158
- // Extract base types from complex types
159
- const baseTypes = this.extractBaseTypes(typeName);
160
- for (const type of baseTypes) {
161
- // Skip built-in types
162
- if (['string', 'number', 'boolean', 'Uint8Array'].includes(type)) {
163
- continue;
164
- }
165
- this.referencedTypes.add(type);
166
- }
167
- }
168
- extractBaseTypes(typeName) {
169
- const types = [];
170
- // Handle arrays
171
- const arrayMatch = typeName.match(/^(.+)\[\]$/);
172
- if (arrayMatch) {
173
- types.push(...this.extractBaseTypes(arrayMatch[1]));
174
- return types;
175
- }
176
- // Handle Tuple
177
- const tupleMatch = typeName.match(/^Tuple<(.+),\s*\d+>$/);
178
- if (tupleMatch) {
179
- types.push(...this.extractBaseTypes(tupleMatch[1]));
180
- return types;
181
- }
182
- // Handle Record
183
- const recordMatch = typeName.match(/^Record<(.+),\s*(.+)>$/);
184
- if (recordMatch) {
185
- types.push(...this.extractBaseTypes(recordMatch[1]));
186
- types.push(...this.extractBaseTypes(recordMatch[2]));
187
- return types;
188
- }
189
- // Handle union types
190
- if (typeName.includes(' | ')) {
191
- const parts = typeName.split(' | ');
192
- for (const part of parts) {
193
- types.push(...this.extractBaseTypes(part.trim()));
194
- }
195
- return types;
196
- }
197
- // Base case - simple type
198
- types.push(typeName);
199
- return types;
200
- }
201
- generateTypeInfo(schema) {
202
- if (Array.isArray(schema)) {
203
- return this.processArraySchema(schema);
204
- }
205
- else if (typeof schema === 'string') {
206
- return this.processPrimitiveSchema(schema);
207
- }
208
- else if (typeof schema === 'object') {
209
- return this.processObjectSchema(schema);
210
- }
211
- throw new Error(`Unsupported schema type: ${schema}`);
212
- }
213
- processArraySchema(schema) {
214
- const [type, ...args] = schema;
215
- switch (type) {
216
- case 'array': {
217
- const [subtype, size] = args[0];
218
- // Special case: byte arrays should be Uint8Array
219
- if (subtype === 'unsigned char') {
220
- return { typeName: 'Uint8Array' };
221
- }
222
- // For other types, use T[] - idiomatic TypeScript for fixed-length homogeneous arrays
223
- const subtypeInfo = this.processSchema(subtype);
224
- return {
225
- typeName: `${subtypeInfo.typeName}[]`,
226
- msgpackTypeName: `${subtypeInfo.msgpackTypeName || subtypeInfo.typeName}[]`,
227
- };
228
- }
229
- case 'variant': {
230
- const variants = args[0];
231
- const variantInfos = variants.map(v => this.processSchema(v));
232
- const typeName = variantInfos.map(v => v.typeName).join(' | ');
233
- const msgpackUnion = variantInfos.map(v => v.msgpackTypeName || v.typeName).join(' | ');
234
- return {
235
- typeName,
236
- msgpackTypeName: `[number, ${msgpackUnion}]`,
237
- };
238
- }
239
- case 'named_union': {
240
- const namedTypes = args[0];
241
- const tupleTypes = [];
242
- for (const [name, schemaOrName] of namedTypes) {
243
- let typeInfo = this.processSchema(schemaOrName);
244
- // Track usage of the type
245
- this.trackTypeUsage(typeInfo.typeName);
246
- tupleTypes.push(`["${name}", ${typeInfo.typeName}]`);
247
- }
248
- return {
249
- typeName: tupleTypes.join(' | '),
250
- msgpackTypeName: tupleTypes.join(' | '),
251
- };
252
- }
253
- case 'vector': {
254
- const [subtype] = args[0];
255
- if (subtype === 'unsigned char') {
256
- return { typeName: 'Uint8Array' };
257
- }
258
- const subtypeInfo = this.processSchema(subtype);
259
- return {
260
- typeName: `${subtypeInfo.typeName}[]`,
261
- msgpackTypeName: `${subtypeInfo.msgpackTypeName || subtypeInfo.typeName}[]`,
262
- };
263
- }
264
- case 'alias': {
265
- const [rawTypeName, msgpackName] = args[0];
266
- const typeName = pascalCase(rawTypeName);
267
- let targetType;
268
- if (msgpackName.startsWith('bin')) {
269
- targetType = 'Uint8Array';
270
- }
271
- else if (['int', 'unsigned int', 'unsigned short'].includes(msgpackName)) {
272
- targetType = 'number';
273
- }
274
- else {
275
- throw new Error(`Unsupported alias type: ${msgpackName}`);
276
- }
277
- // Create a proper type alias declaration
278
- return {
279
- typeName,
280
- msgpackTypeName: targetType,
281
- declaration: `export type ${typeName} = ${targetType};`,
282
- };
283
- }
284
- case 'shared_ptr': {
285
- const [subtype] = args[0];
286
- return this.processSchema(subtype);
287
- }
288
- case 'map': {
289
- const [keyType, valueType] = args[0];
290
- const keyInfo = this.processSchema(keyType);
291
- const valueInfo = this.processSchema(valueType);
292
- return {
293
- typeName: `Record<${keyInfo.typeName}, ${valueInfo.typeName}>`,
294
- msgpackTypeName: `Record<${keyInfo.msgpackTypeName || keyInfo.typeName}, ${valueInfo.msgpackTypeName || valueInfo.typeName}>`,
295
- };
296
- }
297
- default:
298
- throw new Error(`Unsupported array schema type: ${type}`);
299
- }
300
- }
301
- processPrimitiveSchema(schema) {
302
- switch (schema) {
303
- case 'bool':
304
- return { typeName: 'boolean' };
305
- case 'int':
306
- case 'unsigned int':
307
- case 'unsigned short':
308
- case 'unsigned long':
309
- case 'unsigned char':
310
- case 'double':
311
- return { typeName: 'number' };
312
- case 'string':
313
- return { typeName: 'string' };
314
- case 'bin32':
315
- return { typeName: 'Uint8Array' };
316
- case 'field2':
317
- // field2 is an extension field type (fq2) represented as a tuple of two Uint8Arrays
318
- return {
319
- typeName: 'Field2',
320
- msgpackTypeName: '[Uint8Array, Uint8Array]',
321
- declaration: 'export type Field2 = [Uint8Array, Uint8Array];',
322
- };
323
- default:
324
- return { typeName: pascalCase(schema) };
325
- }
326
- }
327
- processObjectSchema(schema) {
328
- const typeName = pascalCase(schema.__typename);
329
- const msgpackTypeName = 'Msgpack' + typeName;
330
- const declaration = this.generateInterfaces(typeName, schema);
331
- const toMethod = this.generateToMethod(typeName, schema);
332
- const fromMethod = this.generateFromMethod(typeName, schema);
333
- return {
334
- typeName,
335
- msgpackTypeName,
336
- declaration,
337
- toMethod,
338
- fromMethod,
339
- };
340
- }
341
- getOrCreateEmptyType(typeName) {
342
- const key = `empty_${typeName}`;
343
- if (this.typeCache.has(key)) {
344
- return this.typeCache.get(key);
345
- }
346
- const typeInfo = {
347
- typeName,
348
- msgpackTypeName: 'Msgpack' + typeName,
349
- declaration: `export interface ${typeName} {}\n\ninterface Msgpack${typeName} {}`,
350
- toMethod: `function to${typeName}(o: Msgpack${typeName}): ${typeName} {\n return {};\n}`,
351
- fromMethod: `function from${typeName}(o: ${typeName}): Msgpack${typeName} {\n return {};\n}`,
352
- };
353
- this.typeCache.set(key, typeInfo);
354
- return typeInfo;
355
- }
356
- generateInterfaces(name, schema) {
357
- const publicInterface = this.generatePublicInterface(name, schema);
358
- const msgpackInterface = this.generateMsgpackInterface(name, schema);
359
- return publicInterface + '\n\n' + msgpackInterface;
360
- }
361
- generatePublicInterface(name, schema) {
362
- let result = `export interface ${name} {\n`;
363
- for (const [key, value] of Object.entries(schema)) {
364
- if (key === '__typename')
365
- continue;
366
- const typeInfo = this.processSchema(value);
367
- // Track type usage
368
- this.trackTypeUsage(typeInfo.typeName);
369
- result += ` ${camelCase(key)}: ${typeInfo.typeName};\n`;
370
- }
371
- result += '}';
372
- return result;
373
- }
374
- generateMsgpackInterface(name, schema) {
375
- let result = `interface Msgpack${name} {\n`;
376
- for (const [key, value] of Object.entries(schema)) {
377
- if (key === '__typename')
378
- continue;
379
- const typeInfo = this.processSchema(value);
380
- result += ` ${key}: ${typeInfo.msgpackTypeName || typeInfo.typeName};\n`;
381
- }
382
- result += '}';
383
- return result;
384
- }
385
- generateToMethod(name, schema) {
386
- const fields = Object.entries(schema).filter(([key]) => key !== '__typename');
387
- if (fields.length === 0) {
388
- return `function to${name}(o: Msgpack${name}): ${name} {\n return {};\n}`;
389
- }
390
- const checks = fields
391
- .map(([key]) => ` if (o.${key} === undefined) { throw new Error("Expected ${key} in ${name} deserialization"); }`)
392
- .join('\n');
393
- const conversions = fields
394
- .map(([key, value]) => {
395
- const typeInfo = this.processSchema(value);
396
- const converter = this.generateConverter(typeInfo, `o.${key}`, 'to');
397
- return ` ${camelCase(key)}: ${converter},`;
398
- })
399
- .join('\n');
400
- return `function to${name}(o: Msgpack${name}): ${name} {
401
- ${checks};
402
- return {
403
- ${conversions}
404
- };
405
- }`;
406
- }
407
- generateFromMethod(name, schema) {
408
- const fields = Object.entries(schema).filter(([key]) => key !== '__typename');
409
- if (fields.length === 0) {
410
- return `function from${name}(o: ${name}): Msgpack${name} {\n return {};\n}`;
411
- }
412
- const checks = fields
413
- .map(([key]) => ` if (o.${camelCase(key)} === undefined) { throw new Error("Expected ${camelCase(key)} in ${name} serialization"); }`)
414
- .join('\n');
415
- const conversions = fields
416
- .map(([key, value]) => {
417
- const typeInfo = this.processSchema(value);
418
- const converter = this.generateConverter(typeInfo, `o.${camelCase(key)}`, 'from');
419
- return ` ${key}: ${converter},`;
420
- })
421
- .join('\n');
422
- return `function from${name}(o: ${name}): Msgpack${name} {
423
- ${checks};
424
- return {
425
- ${conversions}
426
- };
427
- }`;
428
- }
429
- generateConverter(typeInfo, value, direction) {
430
- // Handle arrays/tuples
431
- if (typeInfo.typeName.includes('[]') || typeInfo.typeName.includes('Tuple<')) {
432
- const elementType = typeInfo.typeName.match(/^(.+)\[\]$/) || typeInfo.typeName.match(/^Tuple<(.+),/);
433
- if (elementType) {
434
- const isTuple = typeInfo.typeName.includes('Tuple<');
435
- const mapFn = isTuple ? 'mapTuple' : 'map';
436
- return `${value}.${mapFn}((v: any) => v)`; // Simplified for now
437
- }
438
- }
439
- // Handle custom types that have conversion methods (not just type aliases)
440
- if (typeInfo.toMethod || typeInfo.fromMethod) {
441
- return `${direction}${typeInfo.typeName}(${value})`;
442
- }
443
- return value;
444
- }
445
- generateImports() {
446
- const imports = [];
447
- // Base imports
448
- if (this.config.imports) {
449
- imports.push(...this.config.imports);
450
- }
451
- // For API modes, import from api_types
452
- if (this.config.mode !== 'types') {
453
- const neededImports = new Set();
454
- // Add types and conversion functions from function metadata
455
- for (const metadata of this.functionMetadata) {
456
- neededImports.add(metadata.commandType);
457
- neededImports.add(metadata.responseType);
458
- neededImports.add(`from${metadata.commandType}`);
459
- neededImports.add(`to${metadata.responseType}`);
460
- }
461
- // Add referenced types
462
- for (const type of this.referencedTypes) {
463
- neededImports.add(type);
464
- }
465
- // Add BbApiBase interface
466
- neededImports.add('BbApiBase');
467
- if (neededImports.size > 0) {
468
- const sortedImports = Array.from(neededImports).sort();
469
- // Remove duplicates
470
- const uniqueImports = sortedImports.filter((item, index) => sortedImports.indexOf(item) === index);
471
- imports.push(`import { ${uniqueImports.join(', ')} } from './api_types.js';`);
472
- }
473
- }
474
- return imports;
475
- }
476
- generateBbApiBaseInterface() {
477
- const methods = this.functionMetadata
478
- .map(m => ` ${m.name}(command: ${m.commandType}): Promise<${m.responseType}>;`)
479
- .join('\n');
480
- return `export interface BbApiBase {
481
- ${methods}
482
- destroy(): Promise<void>;
483
- }`;
484
- }
485
- generateApiClass() {
486
- const className = this.getApiClassName();
487
- const methods = this.functionMetadata.map(m => this.generateApiMethod(m)).join('\n\n');
488
- // For sync API, don't implement BbApiBase since methods are synchronous
489
- const implementsClause = this.config.mode === 'sync' ? '' : ' implements BbApiBase';
490
- // For tracing all calls to bb.
491
- // const msgpackCallHelper =
492
- // `${this.config.mode === 'async' ? 'async ' : ''}function msgpackCall(backend: ${this.getBackendType()}, input: any[]) {\n` +
493
- // ` const commandName = input[0]?.[0] || 'unknown';\n` +
494
- // ` process.stderr.write(\`[BB MSGPACK ${this.config.mode === 'async' ? 'ASYNC' : 'SYNC'}] \${commandName}\\n\`);\n` +
495
- // ` const inputBuffer = new Encoder({ useRecords: false }).pack(input);\n` +
496
- // ` const encodedResult = ${this.config.mode === 'async' ? 'await ' : ''}backend.call(inputBuffer);\n` +
497
- // ` const result = new Decoder({ useRecords: false }).unpack(encodedResult);\n` +
498
- // ` process.stderr.write(\`[BB MSGPACK ${this.config.mode === 'async' ? 'ASYNC' : 'SYNC'}] \${commandName} => completed\\n\`);\n` +
499
- // ` return result;\n` +
500
- // `}\n`;
501
- const msgpackCallHelper = `${this.config.mode === 'async' ? 'async ' : ''}function msgpackCall(backend: ${this.getBackendType()}, input: any[]) {` +
502
- ` const inputBuffer = new Encoder({ useRecords: false }).pack(input);` +
503
- ` const encodedResult = ${this.config.mode === 'async' ? 'await ' : ''}backend.call(inputBuffer);` +
504
- ` return new Decoder({ useRecords: false }).unpack(encodedResult);` +
505
- `}\n`;
506
- const destroyMethod = this.config.mode === 'sync'
507
- ? ` destroy(): void {
508
- if (this.backend.destroy) this.backend.destroy();
509
- }`
510
- : ` destroy(): Promise<void> {
511
- return this.backend.destroy ? this.backend.destroy() : Promise.resolve();
512
- }`;
513
- return (msgpackCallHelper +
514
- `export class ${className}${implementsClause} {
515
- constructor(protected backend: ${this.getBackendType()}) {}
516
-
517
- ${methods}
518
-
519
- ${destroyMethod}
520
- }`);
521
- }
522
- getApiClassName() {
523
- switch (this.config.mode) {
524
- case 'sync':
525
- return 'SyncApi';
526
- case 'async':
527
- return 'AsyncApi';
528
- default:
529
- throw new Error(`Invalid mode: ${this.config.mode}`);
530
- }
531
- }
532
- getBackendType() {
533
- switch (this.config.mode) {
534
- case 'sync':
535
- return 'IMsgpackBackendSync';
536
- case 'async':
537
- return 'IMsgpackBackendAsync';
538
- default:
539
- return '';
540
- }
541
- }
542
- generateApiMethod(metadata) {
543
- const { name, commandType, responseType } = metadata;
544
- // For async mode, queue immediately and return promise
545
- if (this.config.mode === 'async') {
546
- return ` ${name}(command: ${commandType}): Promise<${responseType}> {
547
- const msgpackCommand = from${commandType}(command);
548
- return msgpackCall(this.backend, [["${capitalize(name)}", msgpackCommand]]).then(([variantName, result]: [string, any]) => {
549
- if (variantName === 'ErrorResponse') {
550
- throw new BBApiException(result.message || 'Unknown error from barretenberg');
551
- }
552
- if (variantName !== '${responseType}') {
553
- throw new BBApiException(\`Expected variant name '${responseType}' but got '\${variantName}'\`);
554
- }
555
- return to${responseType}(result);
556
- });
557
- }`;
558
- }
559
- // For sync mode, keep the synchronous behavior
560
- return ` ${name}(command: ${commandType}): ${responseType} {
561
- const msgpackCommand = from${commandType}(command);
562
- const [variantName, result] = msgpackCall(this.backend, [["${capitalize(name)}", msgpackCommand]]);
563
- if (variantName === 'ErrorResponse') {
564
- throw new BBApiException(result.message || 'Unknown error from barretenberg');
565
- }
566
- if (variantName !== '${responseType}') {
567
- throw new BBApiException(\`Expected variant name '${responseType}' but got '\${variantName}'\`);
568
- }
569
- return to${responseType}(result);
570
- }`;
571
- }
572
- }
573
- // Factory methods for creating configured compilers
574
- export function createSharedTypesCompiler() {
575
- return new SchemaCompiler({
576
- mode: 'types',
577
- imports: [],
578
- });
579
- }
580
- export function createSyncApiCompiler() {
581
- return new SchemaCompiler({
582
- mode: 'sync',
583
- imports: [
584
- `import { IMsgpackBackendSync } from '../../bb_backends/interface.js';`,
585
- `import { Decoder, Encoder } from 'msgpackr';`,
586
- `import { BBApiException } from '../../bbapi_exception.js';`,
587
- ],
588
- });
589
- }
590
- export function createAsyncApiCompiler() {
591
- return new SchemaCompiler({
592
- mode: 'async',
593
- imports: [
594
- `import { IMsgpackBackendAsync } from '../../bb_backends/interface.js';`,
595
- `import { Decoder, Encoder } from 'msgpackr';`,
596
- `import { BBApiException } from '../../bbapi_exception.js';`,
597
- ],
598
- });
599
- }
600
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hX2NvbXBpbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NiaW5kL3NjaGVtYV9jb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQXVDSCxtQkFBbUI7QUFDbkIsU0FBUyxVQUFVLENBQUMsQ0FBUyxFQUFVO0lBQ3JDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQUEsQ0FDbkQ7QUFFRCxTQUFTLFNBQVMsQ0FBQyxDQUFTLEVBQVU7SUFDcEMsT0FBTyxDQUFDO1NBQ0wsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNWLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN6RyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFBQSxDQUNiO0FBRUQsU0FBUyxVQUFVLENBQUMsQ0FBUyxFQUFVO0lBQ3JDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQUEsQ0FDOUM7QUFFRCxNQUFNLE9BQU8sY0FBYztJQU1MLE1BQU07SUFMbEIsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQ3hDLGdCQUFnQixHQUF1QixFQUFFLENBQUM7SUFDbEQsb0VBQW9FO0lBQzVELGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lB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