@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
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Schema Visitor - Minimal abstraction over raw msgpack schema
3
+ *
4
+ * Philosophy:
5
+ * - Keep raw schema structure
6
+ * - Resolve type references into a graph
7
+ * - No normalization - languages handle their own conventions
8
+ * - Output is "compiled schema" with resolved types
9
+ */
10
+
11
+ export type PrimitiveType = 'bool' | 'u8' | 'u16' | 'u32' | 'u64' | 'f64' | 'string' | 'bytes' | 'field2';
12
+
13
+ export interface Type {
14
+ kind: 'primitive' | 'vector' | 'array' | 'optional' | 'struct';
15
+ primitive?: PrimitiveType;
16
+ element?: Type; // For vector, array, optional
17
+ size?: number; // For array
18
+ struct?: Struct; // For struct types
19
+ }
20
+
21
+ export interface Field {
22
+ name: string;
23
+ type: Type;
24
+ }
25
+
26
+ export interface Struct {
27
+ name: string;
28
+ fields: Field[];
29
+ }
30
+
31
+ export interface Command {
32
+ name: string;
33
+ fields: Field[];
34
+ responseType: string;
35
+ }
36
+
37
+ export interface CompiledSchema {
38
+ // All unique struct types discovered
39
+ structs: Map<string, Struct>;
40
+
41
+ // Command -> Response mappings
42
+ commands: Command[];
43
+
44
+ // Response types
45
+ responses: Map<string, Struct>;
46
+ }
47
+
48
+ /**
49
+ * SchemaVisitor - Walks raw msgpack schema and resolves references
50
+ */
51
+ export class SchemaVisitor {
52
+ private structs = new Map<string, Struct>();
53
+ private responses = new Map<string, Struct>();
54
+
55
+ visit(commandsSchema: any, responsesSchema: any): CompiledSchema {
56
+ // Reset state
57
+ this.structs.clear();
58
+ this.responses.clear();
59
+
60
+ const commands: Command[] = [];
61
+
62
+ // Schema format: ["named_union", [[name, schema], ...]]
63
+ const commandPairs = commandsSchema[1] as Array<[string, any]>;
64
+ const responsePairs = responsesSchema[1] as Array<[string, any]>;
65
+
66
+ // First, visit all response types (including ErrorResponse)
67
+ for (const [respName, respSchema] of responsePairs) {
68
+ if (typeof respSchema !== 'string') {
69
+ const respStruct = this.visitStruct(respName, respSchema);
70
+ this.responses.set(respName, respStruct);
71
+ }
72
+ }
73
+
74
+ // Visit all commands and pair with responses
75
+ for (let i = 0; i < commandPairs.length; i++) {
76
+ const [cmdName, cmdSchema] = commandPairs[i];
77
+ // Find matching response (skip ErrorResponse which is always last)
78
+ const normalResponses = responsePairs.filter(([name]: [string, any]) => name !== 'ErrorResponse');
79
+ const [respName] = normalResponses[i];
80
+
81
+ // Discover command structure
82
+ const cmdStruct = this.visitStruct(cmdName, cmdSchema);
83
+ this.structs.set(cmdName, cmdStruct);
84
+
85
+ // Create command mapping
86
+ commands.push({
87
+ name: cmdName,
88
+ fields: cmdStruct.fields,
89
+ responseType: respName,
90
+ });
91
+ }
92
+
93
+ return {
94
+ structs: this.structs,
95
+ commands,
96
+ responses: this.responses,
97
+ };
98
+ }
99
+
100
+ private visitStruct(name: string, schema: any): Struct {
101
+ const fields: Field[] = [];
102
+
103
+ // Schema is an object with __typename and fields
104
+ for (const [key, value] of Object.entries(schema)) {
105
+ if (key === '__typename') continue;
106
+
107
+ fields.push({
108
+ name: key,
109
+ type: this.visitType(value),
110
+ });
111
+ }
112
+
113
+ return { name, fields };
114
+ }
115
+
116
+ private visitType(schema: any): Type {
117
+ // Primitive string type
118
+ if (typeof schema === 'string') {
119
+ return this.resolvePrimitive(schema);
120
+ }
121
+
122
+ // Array type descriptor: ['vector', [elementType]]
123
+ if (Array.isArray(schema)) {
124
+ const [kind, args] = schema;
125
+
126
+ switch (kind) {
127
+ case 'vector': {
128
+ const [elemType] = args as [any];
129
+ // Special case: vector<unsigned char> = bytes
130
+ if (elemType === 'unsigned char') {
131
+ return { kind: 'primitive', primitive: 'bytes' };
132
+ }
133
+ return {
134
+ kind: 'vector',
135
+ element: this.visitType(elemType),
136
+ };
137
+ }
138
+
139
+ case 'array': {
140
+ const [elemType, size] = args as [any, number];
141
+ // Special case: array<unsigned char, N> = bytes
142
+ if (elemType === 'unsigned char') {
143
+ return { kind: 'primitive', primitive: 'bytes' };
144
+ }
145
+ return {
146
+ kind: 'array',
147
+ element: this.visitType(elemType),
148
+ size,
149
+ };
150
+ }
151
+
152
+ case 'optional': {
153
+ const [elemType] = args as [any];
154
+ return {
155
+ kind: 'optional',
156
+ element: this.visitType(elemType),
157
+ };
158
+ }
159
+
160
+ case 'shared_ptr': {
161
+ // Dereference shared_ptr - just use inner type
162
+ const [innerType] = args as [any];
163
+ return this.visitType(innerType);
164
+ }
165
+
166
+ case 'alias': {
167
+ // Alias types (like uint256_t) are treated as bytes
168
+ return { kind: 'primitive', primitive: 'bytes' };
169
+ }
170
+
171
+ default:
172
+ throw new Error(`Unknown type kind: ${kind}`);
173
+ }
174
+ }
175
+
176
+ // Inline struct definition
177
+ if (typeof schema === 'object' && schema.__typename) {
178
+ const structName = schema.__typename as string;
179
+ // Check if already visited
180
+ if (!this.structs.has(structName)) {
181
+ const struct = this.visitStruct(structName, schema);
182
+ this.structs.set(structName, struct);
183
+ }
184
+ return {
185
+ kind: 'struct',
186
+ struct: this.structs.get(structName)!,
187
+ };
188
+ }
189
+
190
+ throw new Error(`Cannot resolve type: ${JSON.stringify(schema)}`);
191
+ }
192
+
193
+ private resolvePrimitive(name: string): Type {
194
+ const primitiveMap: Record<string, PrimitiveType> = {
195
+ 'bool': 'bool',
196
+ 'int': 'u32',
197
+ 'unsigned int': 'u32',
198
+ 'unsigned short': 'u16',
199
+ 'unsigned long': 'u64',
200
+ 'unsigned char': 'u8',
201
+ 'double': 'f64',
202
+ 'string': 'string',
203
+ 'bin32': 'bytes',
204
+ 'field2': 'field2', // Extension field (Fq2) - pair of field elements
205
+ };
206
+
207
+ const primitive = primitiveMap[name];
208
+ if (primitive) {
209
+ return { kind: 'primitive', primitive };
210
+ }
211
+
212
+ // Unknown primitive - treat as struct reference
213
+ // This will be resolved later if it's a real struct
214
+ return {
215
+ kind: 'struct',
216
+ struct: { name, fields: [] }, // Placeholder
217
+ };
218
+ }
219
+ }
@@ -0,0 +1,419 @@
1
+ /**
2
+ * TypeScript Code Generator - String template based
3
+ *
4
+ * Philosophy:
5
+ * - String templates for file structure
6
+ * - Simple type mapping
7
+ * - Idiomatic TypeScript conventions
8
+ * - No complex abstraction
9
+ */
10
+
11
+ import type { CompiledSchema, Type, Struct, Field, Command } from './schema_visitor.js';
12
+ import { toPascalCase } from './naming.js';
13
+
14
+ function toCamelCase(name: string): string {
15
+ const pascal = toPascalCase(name);
16
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
17
+ }
18
+
19
+ export class TypeScriptCodegen {
20
+ // Type mapping: Schema type -> TypeScript type
21
+ private mapType(type: Type): string {
22
+ switch (type.kind) {
23
+ case 'primitive':
24
+ switch (type.primitive) {
25
+ case 'bool': return 'boolean';
26
+ case 'u8': return 'number';
27
+ case 'u16': return 'number';
28
+ case 'u32': return 'number';
29
+ case 'u64': return 'number';
30
+ case 'f64': return 'number';
31
+ case 'string': return 'string';
32
+ case 'bytes': return 'Uint8Array';
33
+ case 'field2': return '[Uint8Array, Uint8Array]'; // Extension field (Fq2)
34
+ }
35
+ break;
36
+
37
+ case 'vector':
38
+ return `${this.mapType(type.element!)}[]`;
39
+
40
+ case 'array':
41
+ return `${this.mapType(type.element!)}[]`;
42
+
43
+ case 'optional':
44
+ return `${this.mapType(type.element!)} | undefined`;
45
+
46
+ case 'struct':
47
+ return toPascalCase(type.struct!.name);
48
+ }
49
+
50
+ return 'unknown';
51
+ }
52
+
53
+ // Type mapping for msgpack interfaces (uses Msgpack* prefix for structs)
54
+ private mapMsgpackType(type: Type): string {
55
+ switch (type.kind) {
56
+ case 'primitive':
57
+ switch (type.primitive) {
58
+ case 'bool': return 'boolean';
59
+ case 'u8': return 'number';
60
+ case 'u16': return 'number';
61
+ case 'u32': return 'number';
62
+ case 'u64': return 'number';
63
+ case 'f64': return 'number';
64
+ case 'string': return 'string';
65
+ case 'bytes': return 'Uint8Array';
66
+ case 'field2': return '[Uint8Array, Uint8Array]';
67
+ }
68
+ break;
69
+
70
+ case 'vector':
71
+ return `${this.mapMsgpackType(type.element!)}[]`;
72
+
73
+ case 'array':
74
+ return `${this.mapMsgpackType(type.element!)}[]`;
75
+
76
+ case 'optional':
77
+ return `${this.mapMsgpackType(type.element!)} | undefined`;
78
+
79
+ case 'struct':
80
+ return `Msgpack${toPascalCase(type.struct!.name)}`;
81
+ }
82
+
83
+ return 'unknown';
84
+ }
85
+
86
+ // Check if type needs conversion (has nested structs)
87
+ private needsConversion(type: Type): boolean {
88
+ switch (type.kind) {
89
+ case 'primitive':
90
+ return false;
91
+ case 'vector':
92
+ case 'array':
93
+ case 'optional':
94
+ return this.needsConversion(type.element!);
95
+ case 'struct':
96
+ return true;
97
+ }
98
+ return false;
99
+ }
100
+
101
+ // Generate field
102
+ private generateField(field: Field): string {
103
+ const tsName = toCamelCase(field.name);
104
+ const tsType = this.mapType(field.type);
105
+ return ` ${tsName}: ${tsType};`;
106
+ }
107
+
108
+ // Generate msgpack field (original names, uses Msgpack* types for structs)
109
+ private generateMsgpackField(field: Field): string {
110
+ const tsType = this.mapMsgpackType(field.type);
111
+ return ` ${field.name}: ${tsType};`;
112
+ }
113
+
114
+ // Generate public interface
115
+ private generateInterface(struct: Struct): string {
116
+ const tsName = toPascalCase(struct.name);
117
+ const fields = struct.fields.map(f => this.generateField(f)).join('\n');
118
+
119
+ return `export interface ${tsName} {
120
+ ${fields}
121
+ }`;
122
+ }
123
+
124
+ // Generate msgpack interface (internal)
125
+ private generateMsgpackInterface(struct: Struct): string {
126
+ const tsName = toPascalCase(struct.name);
127
+ const fields = struct.fields.map(f => this.generateMsgpackField(f)).join('\n');
128
+
129
+ return `interface Msgpack${tsName} {
130
+ ${fields}
131
+ }`;
132
+ }
133
+
134
+ // Generate to* conversion function
135
+ private generateToFunction(struct: Struct): string {
136
+ const tsName = toPascalCase(struct.name);
137
+
138
+ if (struct.fields.length === 0) {
139
+ return `function to${tsName}(o: Msgpack${tsName}): ${tsName} {
140
+ return {};
141
+ }`;
142
+ }
143
+
144
+ const checks = struct.fields
145
+ .map(f => ` if (o.${f.name} === undefined) { throw new Error("Expected ${f.name} in ${tsName} deserialization"); }`)
146
+ .join('\n');
147
+
148
+ const conversions = struct.fields
149
+ .map(f => {
150
+ const tsFieldName = toCamelCase(f.name);
151
+ const converter = this.generateToConverter(f.type, `o.${f.name}`);
152
+ return ` ${tsFieldName}: ${converter},`;
153
+ })
154
+ .join('\n');
155
+
156
+ return `function to${tsName}(o: Msgpack${tsName}): ${tsName} {
157
+ ${checks};
158
+ return {
159
+ ${conversions}
160
+ };
161
+ }`;
162
+ }
163
+
164
+ // Generate from* conversion function
165
+ private generateFromFunction(struct: Struct): string {
166
+ const tsName = toPascalCase(struct.name);
167
+
168
+ if (struct.fields.length === 0) {
169
+ return `function from${tsName}(o: ${tsName}): Msgpack${tsName} {
170
+ return {};
171
+ }`;
172
+ }
173
+
174
+ const checks = struct.fields
175
+ .map(f => {
176
+ const tsFieldName = toCamelCase(f.name);
177
+ return ` if (o.${tsFieldName} === undefined) { throw new Error("Expected ${tsFieldName} in ${tsName} serialization"); }`;
178
+ })
179
+ .join('\n');
180
+
181
+ const conversions = struct.fields
182
+ .map(f => {
183
+ const tsFieldName = toCamelCase(f.name);
184
+ const converter = this.generateFromConverter(f.type, `o.${tsFieldName}`);
185
+ return ` ${f.name}: ${converter},`;
186
+ })
187
+ .join('\n');
188
+
189
+ return `function from${tsName}(o: ${tsName}): Msgpack${tsName} {
190
+ ${checks};
191
+ return {
192
+ ${conversions}
193
+ };
194
+ }`;
195
+ }
196
+
197
+ // Generate converter for to* function
198
+ private generateToConverter(type: Type, value: string): string {
199
+ if (!this.needsConversion(type)) {
200
+ return value;
201
+ }
202
+
203
+ switch (type.kind) {
204
+ case 'vector':
205
+ case 'array':
206
+ if (this.needsConversion(type.element!)) {
207
+ return `${value}.map((v: any) => ${this.generateToConverter(type.element!, 'v')})`;
208
+ }
209
+ return value;
210
+ case 'optional':
211
+ if (this.needsConversion(type.element!)) {
212
+ return `${value} !== undefined ? ${this.generateToConverter(type.element!, value)} : undefined`;
213
+ }
214
+ return value;
215
+ case 'struct':
216
+ return `to${toPascalCase(type.struct!.name)}(${value})`;
217
+ }
218
+ return value;
219
+ }
220
+
221
+ // Generate converter for from* function
222
+ private generateFromConverter(type: Type, value: string): string {
223
+ if (!this.needsConversion(type)) {
224
+ return value;
225
+ }
226
+
227
+ switch (type.kind) {
228
+ case 'vector':
229
+ case 'array':
230
+ if (this.needsConversion(type.element!)) {
231
+ return `${value}.map((v: any) => ${this.generateFromConverter(type.element!, 'v')})`;
232
+ }
233
+ return value;
234
+ case 'optional':
235
+ if (this.needsConversion(type.element!)) {
236
+ return `${value} !== undefined ? ${this.generateFromConverter(type.element!, value)} : undefined`;
237
+ }
238
+ return value;
239
+ case 'struct':
240
+ return `from${toPascalCase(type.struct!.name)}(${value})`;
241
+ }
242
+ return value;
243
+ }
244
+
245
+ // Generate types file (api_types.ts)
246
+ generateTypes(schema: CompiledSchema): string {
247
+ const allStructs = [...schema.structs.values(), ...schema.responses.values()];
248
+
249
+ // Public interfaces
250
+ const publicInterfaces = allStructs
251
+ .map(s => this.generateInterface(s))
252
+ .join('\n\n');
253
+
254
+ // Msgpack interfaces
255
+ const msgpackInterfaces = allStructs
256
+ .map(s => this.generateMsgpackInterface(s))
257
+ .join('\n\n');
258
+
259
+ // Conversion functions
260
+ const toFunctions = allStructs
261
+ .map(s => 'export ' + this.generateToFunction(s))
262
+ .join('\n\n');
263
+
264
+ const fromFunctions = allStructs
265
+ .map(s => 'export ' + this.generateFromFunction(s))
266
+ .join('\n\n');
267
+
268
+ // BbApiBase interface
269
+ const apiMethods = schema.commands
270
+ .map(c => ` ${toCamelCase(c.name)}(command: ${toPascalCase(c.name)}): Promise<${toPascalCase(c.responseType)}>;`)
271
+ .join('\n');
272
+
273
+ return `// AUTOGENERATED FILE - DO NOT EDIT
274
+
275
+ // Type aliases for primitive types
276
+ export type Field2 = [Uint8Array, Uint8Array];
277
+
278
+ // Public interfaces (exported)
279
+ ${publicInterfaces}
280
+
281
+ // Private Msgpack interfaces (not exported)
282
+ ${msgpackInterfaces}
283
+
284
+ // Conversion functions (exported)
285
+ ${toFunctions}
286
+
287
+ ${fromFunctions}
288
+
289
+ // Base API interface
290
+ export interface BbApiBase {
291
+ ${apiMethods}
292
+ destroy(): Promise<void>;
293
+ }
294
+ `;
295
+ }
296
+
297
+ // Generate API method
298
+ private generateAsyncApiMethod(command: Command): string {
299
+ const methodName = toCamelCase(command.name);
300
+ const cmdType = toPascalCase(command.name);
301
+ const respType = toPascalCase(command.responseType);
302
+
303
+ return ` ${methodName}(command: ${cmdType}): Promise<${respType}> {
304
+ const msgpackCommand = from${cmdType}(command);
305
+ return msgpackCall(this.backend, [["${command.name}", msgpackCommand]]).then(([variantName, result]: [string, any]) => {
306
+ if (variantName === 'ErrorResponse') {
307
+ throw new BBApiException(result.message || 'Unknown error from barretenberg');
308
+ }
309
+ if (variantName !== '${command.responseType}') {
310
+ throw new BBApiException(\`Expected variant name '${command.responseType}' but got '\${variantName}'\`);
311
+ }
312
+ return to${respType}(result);
313
+ });
314
+ }`;
315
+ }
316
+
317
+ private generateSyncApiMethod(command: Command): string {
318
+ const methodName = toCamelCase(command.name);
319
+ const cmdType = toPascalCase(command.name);
320
+ const respType = toPascalCase(command.responseType);
321
+
322
+ return ` ${methodName}(command: ${cmdType}): ${respType} {
323
+ const msgpackCommand = from${cmdType}(command);
324
+ const [variantName, result] = msgpackCall(this.backend, [["${command.name}", msgpackCommand]]);
325
+ if (variantName === 'ErrorResponse') {
326
+ throw new BBApiException(result.message || 'Unknown error from barretenberg');
327
+ }
328
+ if (variantName !== '${command.responseType}') {
329
+ throw new BBApiException(\`Expected variant name '${command.responseType}' but got '\${variantName}'\`);
330
+ }
331
+ return to${respType}(result);
332
+ }`;
333
+ }
334
+
335
+ // Generate async API file
336
+ generateAsyncApi(schema: CompiledSchema): string {
337
+ const imports = this.generateApiImports(schema);
338
+ const methods = schema.commands
339
+ .map(c => this.generateAsyncApiMethod(c))
340
+ .join('\n\n');
341
+
342
+ return `// AUTOGENERATED FILE - DO NOT EDIT
343
+
344
+ import { IMsgpackBackendAsync } from '../../bb_backends/interface.js';
345
+ import { Decoder, Encoder } from 'msgpackr';
346
+ import { BBApiException } from '../../bbapi_exception.js';
347
+ ${imports}
348
+
349
+ async function msgpackCall(backend: IMsgpackBackendAsync, input: any[]) {
350
+ const inputBuffer = new Encoder({ useRecords: false }).pack(input);
351
+ const encodedResult = await backend.call(inputBuffer);
352
+ return new Decoder({ useRecords: false }).unpack(encodedResult);
353
+ }
354
+
355
+ export class AsyncApi implements BbApiBase {
356
+ constructor(protected backend: IMsgpackBackendAsync) {}
357
+
358
+ ${methods}
359
+
360
+ destroy(): Promise<void> {
361
+ return this.backend.destroy ? this.backend.destroy() : Promise.resolve();
362
+ }
363
+ }
364
+ `;
365
+ }
366
+
367
+ // Generate sync API file
368
+ generateSyncApi(schema: CompiledSchema): string {
369
+ const imports = this.generateApiImports(schema);
370
+ const methods = schema.commands
371
+ .map(c => this.generateSyncApiMethod(c))
372
+ .join('\n\n');
373
+
374
+ return `// AUTOGENERATED FILE - DO NOT EDIT
375
+
376
+ import { IMsgpackBackendSync } from '../../bb_backends/interface.js';
377
+ import { Decoder, Encoder } from 'msgpackr';
378
+ import { BBApiException } from '../../bbapi_exception.js';
379
+ ${imports}
380
+
381
+ function msgpackCall(backend: IMsgpackBackendSync, input: any[]) {
382
+ const inputBuffer = new Encoder({ useRecords: false }).pack(input);
383
+ const encodedResult = backend.call(inputBuffer);
384
+ return new Decoder({ useRecords: false }).unpack(encodedResult);
385
+ }
386
+
387
+ export class SyncApi {
388
+ constructor(protected backend: IMsgpackBackendSync) {}
389
+
390
+ ${methods}
391
+
392
+ destroy(): void {
393
+ if (this.backend.destroy) this.backend.destroy();
394
+ }
395
+ }
396
+ `;
397
+ }
398
+
399
+ // Generate import statement for API files
400
+ private generateApiImports(schema: CompiledSchema): string {
401
+ const types = new Set<string>();
402
+
403
+ // Add command types and their conversion functions
404
+ for (const cmd of schema.commands) {
405
+ const cmdType = toPascalCase(cmd.name);
406
+ const respType = toPascalCase(cmd.responseType);
407
+ types.add(cmdType);
408
+ types.add(respType);
409
+ types.add(`from${cmdType}`);
410
+ types.add(`to${respType}`);
411
+ }
412
+
413
+ // Add BbApiBase
414
+ types.add('BbApiBase');
415
+
416
+ const sortedTypes = Array.from(types).sort();
417
+ return `import { ${sortedTypes.join(', ')} } from './api_types.js';`;
418
+ }
419
+ }
package/src/index.ts CHANGED
@@ -7,6 +7,10 @@ export {
7
7
  UltraHonkVerifierBackend,
8
8
  UltraHonkBackend,
9
9
  AztecClientBackend,
10
+ fieldToString,
11
+ fieldsToStrings,
12
+ type UltraHonkBackendOptions,
13
+ type VerifierTarget,
10
14
  } from './barretenberg/index.js';
11
15
 
12
16
  export { randomBytes } from './random/index.js';