@aztec/bb.js 0.0.1-commit.d3ec352c → 0.0.1-commit.e61ad554
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.
- package/build/amd64-linux/bb +0 -0
- package/build/amd64-linux/nodejs_module.node +0 -0
- package/build/amd64-macos/bb +0 -0
- package/build/amd64-macos/nodejs_module.node +0 -0
- package/build/arm64-linux/bb +0 -0
- package/build/arm64-linux/nodejs_module.node +0 -0
- package/build/arm64-macos/bb +0 -0
- package/build/arm64-macos/nodejs_module.node +0 -0
- package/dest/browser/barretenberg/backend.d.ts +49 -17
- package/dest/browser/barretenberg/backend.d.ts.map +1 -1
- package/dest/browser/barretenberg/backend.js +109 -9
- package/dest/browser/barretenberg/index.d.ts +2 -2
- package/dest/browser/barretenberg/index.d.ts.map +1 -1
- package/dest/browser/barretenberg/index.js +2 -2
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.js +1 -1
- package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg-threads.js +1 -1
- package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg.js +1 -1
- package/dest/browser/bb_backends/index.d.ts +3 -1
- package/dest/browser/bb_backends/index.d.ts.map +1 -1
- package/dest/browser/cbind/generate.d.ts +5 -2
- package/dest/browser/cbind/generate.d.ts.map +1 -1
- package/dest/browser/cbind/generate.js +47 -25
- package/dest/browser/cbind/generated/api_types.d.ts +765 -1672
- package/dest/browser/cbind/generated/api_types.d.ts.map +1 -1
- package/dest/browser/cbind/generated/api_types.js +1453 -1525
- package/dest/browser/cbind/generated/async.d.ts +3 -5
- package/dest/browser/cbind/generated/async.d.ts.map +1 -1
- package/dest/browser/cbind/generated/async.js +13 -33
- package/dest/browser/cbind/generated/sync.d.ts +3 -5
- package/dest/browser/cbind/generated/sync.d.ts.map +1 -1
- package/dest/browser/cbind/generated/sync.js +13 -31
- package/dest/browser/cbind/naming.d.ts +16 -0
- package/dest/browser/cbind/naming.d.ts.map +1 -0
- package/dest/browser/cbind/naming.js +24 -0
- package/dest/browser/cbind/rust_codegen.d.ts +26 -0
- package/dest/browser/cbind/rust_codegen.d.ts.map +1 -0
- package/dest/browser/cbind/rust_codegen.js +461 -0
- package/dest/browser/cbind/schema_visitor.d.ts +47 -0
- package/dest/browser/cbind/schema_visitor.d.ts.map +1 -0
- package/dest/browser/cbind/schema_visitor.js +158 -0
- package/dest/browser/cbind/typescript_codegen.d.ts +30 -0
- package/dest/browser/cbind/typescript_codegen.d.ts.map +1 -0
- package/dest/browser/cbind/typescript_codegen.js +365 -0
- package/dest/browser/index.d.ts +2 -2
- package/dest/browser/index.d.ts.map +1 -1
- package/dest/browser/index.js +2 -2
- package/dest/node/barretenberg/backend.d.ts +49 -17
- package/dest/node/barretenberg/backend.d.ts.map +1 -1
- package/dest/node/barretenberg/backend.js +109 -9
- package/dest/node/barretenberg/backend.test.d.ts +2 -0
- package/dest/node/barretenberg/backend.test.d.ts.map +1 -0
- package/dest/node/barretenberg/backend.test.js +103 -0
- package/dest/node/barretenberg/index.d.ts +2 -2
- package/dest/node/barretenberg/index.d.ts.map +1 -1
- package/dest/node/barretenberg/index.js +2 -2
- package/dest/node/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
- package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.js +1 -1
- package/dest/node/bb_backends/index.d.ts +3 -1
- package/dest/node/bb_backends/index.d.ts.map +1 -1
- package/dest/node/bb_backends/node/index.d.ts +1 -1
- package/dest/node/bb_backends/node/index.d.ts.map +1 -1
- package/dest/node/bb_backends/node/index.js +5 -5
- package/dest/node/bb_backends/node/native_shm.d.ts +3 -2
- package/dest/node/bb_backends/node/native_shm.d.ts.map +1 -1
- package/dest/node/bb_backends/node/native_shm.js +40 -21
- package/dest/node/bb_backends/node/native_shm_async.d.ts +2 -2
- package/dest/node/bb_backends/node/native_shm_async.d.ts.map +1 -1
- package/dest/node/bb_backends/node/native_shm_async.js +17 -21
- package/dest/node/bb_backends/node/native_socket.d.ts +1 -1
- package/dest/node/bb_backends/node/native_socket.d.ts.map +1 -1
- package/dest/node/bb_backends/node/native_socket.js +7 -5
- package/dest/node/bb_backends/node/platform.d.ts +1 -1
- package/dest/node/bb_backends/node/platform.d.ts.map +1 -1
- package/dest/node/bb_backends/node/platform.js +7 -2
- package/dest/node/cbind/generate.d.ts +5 -2
- package/dest/node/cbind/generate.d.ts.map +1 -1
- package/dest/node/cbind/generate.js +47 -25
- package/dest/node/cbind/generated/api_types.d.ts +765 -1672
- package/dest/node/cbind/generated/api_types.d.ts.map +1 -1
- package/dest/node/cbind/generated/api_types.js +1453 -1525
- package/dest/node/cbind/generated/async.d.ts +3 -5
- package/dest/node/cbind/generated/async.d.ts.map +1 -1
- package/dest/node/cbind/generated/async.js +13 -33
- package/dest/node/cbind/generated/sync.d.ts +3 -5
- package/dest/node/cbind/generated/sync.d.ts.map +1 -1
- package/dest/node/cbind/generated/sync.js +13 -31
- package/dest/node/cbind/naming.d.ts +16 -0
- package/dest/node/cbind/naming.d.ts.map +1 -0
- package/dest/node/cbind/naming.js +24 -0
- package/dest/node/cbind/rust_codegen.d.ts +26 -0
- package/dest/node/cbind/rust_codegen.d.ts.map +1 -0
- package/dest/node/cbind/rust_codegen.js +461 -0
- package/dest/node/cbind/schema_visitor.d.ts +47 -0
- package/dest/node/cbind/schema_visitor.d.ts.map +1 -0
- package/dest/node/cbind/schema_visitor.js +158 -0
- package/dest/node/cbind/typescript_codegen.d.ts +30 -0
- package/dest/node/cbind/typescript_codegen.d.ts.map +1 -0
- package/dest/node/cbind/typescript_codegen.js +365 -0
- package/dest/node/index.d.ts +2 -2
- package/dest/node/index.d.ts.map +1 -1
- package/dest/node/index.js +2 -2
- package/dest/node-cjs/barretenberg/backend.d.ts +49 -17
- package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg/backend.js +111 -9
- package/dest/node-cjs/barretenberg/backend.test.d.ts +2 -0
- package/dest/node-cjs/barretenberg/backend.test.d.ts.map +1 -0
- package/dest/node-cjs/barretenberg/backend.test.js +105 -0
- package/dest/node-cjs/barretenberg/index.d.ts +2 -2
- package/dest/node-cjs/barretenberg/index.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg/index.js +4 -2
- package/dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.js +1 -1
- package/dest/node-cjs/bb_backends/index.d.ts +3 -1
- package/dest/node-cjs/bb_backends/index.d.ts.map +1 -1
- package/dest/node-cjs/bb_backends/node/index.d.ts +1 -1
- package/dest/node-cjs/bb_backends/node/index.d.ts.map +1 -1
- package/dest/node-cjs/bb_backends/node/index.js +5 -5
- package/dest/node-cjs/bb_backends/node/native_shm.d.ts +3 -2
- package/dest/node-cjs/bb_backends/node/native_shm.d.ts.map +1 -1
- package/dest/node-cjs/bb_backends/node/native_shm.js +39 -20
- package/dest/node-cjs/bb_backends/node/native_shm_async.d.ts +2 -2
- package/dest/node-cjs/bb_backends/node/native_shm_async.d.ts.map +1 -1
- package/dest/node-cjs/bb_backends/node/native_shm_async.js +17 -21
- package/dest/node-cjs/bb_backends/node/native_socket.d.ts +1 -1
- package/dest/node-cjs/bb_backends/node/native_socket.d.ts.map +1 -1
- package/dest/node-cjs/bb_backends/node/native_socket.js +7 -5
- package/dest/node-cjs/bb_backends/node/platform.d.ts +1 -1
- package/dest/node-cjs/bb_backends/node/platform.d.ts.map +1 -1
- package/dest/node-cjs/bb_backends/node/platform.js +7 -2
- package/dest/node-cjs/cbind/generate.d.ts +5 -2
- package/dest/node-cjs/cbind/generate.d.ts.map +1 -1
- package/dest/node-cjs/cbind/generate.js +47 -25
- package/dest/node-cjs/cbind/generated/api_types.d.ts +765 -1672
- package/dest/node-cjs/cbind/generated/api_types.d.ts.map +1 -1
- package/dest/node-cjs/cbind/generated/api_types.js +1662 -1742
- package/dest/node-cjs/cbind/generated/async.d.ts +3 -5
- package/dest/node-cjs/cbind/generated/async.d.ts.map +1 -1
- package/dest/node-cjs/cbind/generated/async.js +12 -32
- package/dest/node-cjs/cbind/generated/sync.d.ts +3 -5
- package/dest/node-cjs/cbind/generated/sync.d.ts.map +1 -1
- package/dest/node-cjs/cbind/generated/sync.js +12 -30
- package/dest/node-cjs/cbind/naming.d.ts +16 -0
- package/dest/node-cjs/cbind/naming.d.ts.map +1 -0
- package/dest/node-cjs/cbind/naming.js +28 -0
- package/dest/node-cjs/cbind/rust_codegen.d.ts +26 -0
- package/dest/node-cjs/cbind/rust_codegen.d.ts.map +1 -0
- package/dest/node-cjs/cbind/rust_codegen.js +465 -0
- package/dest/node-cjs/cbind/schema_visitor.d.ts +47 -0
- package/dest/node-cjs/cbind/schema_visitor.d.ts.map +1 -0
- package/dest/node-cjs/cbind/schema_visitor.js +162 -0
- package/dest/node-cjs/cbind/typescript_codegen.d.ts +30 -0
- package/dest/node-cjs/cbind/typescript_codegen.d.ts.map +1 -0
- package/dest/node-cjs/cbind/typescript_codegen.js +369 -0
- package/dest/node-cjs/index.d.ts +2 -2
- package/dest/node-cjs/index.d.ts.map +1 -1
- package/dest/node-cjs/index.js +4 -2
- package/package.json +1 -1
- package/src/barretenberg/backend.test.ts +122 -0
- package/src/barretenberg/backend.ts +149 -23
- package/src/barretenberg/index.ts +9 -1
- package/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +1 -1
- package/src/bb_backends/index.ts +3 -0
- package/src/bb_backends/node/index.ts +9 -4
- package/src/bb_backends/node/native_shm.ts +38 -19
- package/src/bb_backends/node/native_shm_async.ts +15 -19
- package/src/bb_backends/node/native_socket.ts +7 -5
- package/src/bb_backends/node/platform.ts +6 -1
- package/src/cbind/generate.ts +51 -32
- package/src/cbind/naming.ts +27 -0
- package/src/cbind/rust_codegen.ts +504 -0
- package/src/cbind/schema_visitor.ts +219 -0
- package/src/cbind/typescript_codegen.ts +419 -0
- package/src/index.ts +4 -0
- package/dest/browser/cbind/schema_compiler.d.ts +0 -68
- package/dest/browser/cbind/schema_compiler.d.ts.map +0 -1
- package/dest/browser/cbind/schema_compiler.js +0 -600
- package/dest/node/cbind/schema_compiler.d.ts +0 -68
- package/dest/node/cbind/schema_compiler.d.ts.map +0 -1
- package/dest/node/cbind/schema_compiler.js +0 -600
- package/dest/node-cjs/cbind/schema_compiler.d.ts +0 -68
- package/dest/node-cjs/cbind/schema_compiler.d.ts.map +0 -1
- package/dest/node-cjs/cbind/schema_compiler.js +0 -607
- package/src/cbind/generated/api_types.ts +0 -4241
- package/src/cbind/generated/async.ts +0 -717
- package/src/cbind/generated/curve_constants.ts +0 -53
- package/src/cbind/generated/sync.ts +0 -663
- 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';
|