@aztec/foundation 0.61.0 → 0.63.0

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 (150) hide show
  1. package/dest/abi/abi.d.ts +708 -228
  2. package/dest/abi/abi.d.ts.map +1 -1
  3. package/dest/abi/abi.js +92 -8
  4. package/dest/abi/decoder.d.ts.map +1 -1
  5. package/dest/abi/decoder.js +8 -6
  6. package/dest/abi/encoder.d.ts.map +1 -1
  7. package/dest/abi/encoder.js +4 -1
  8. package/dest/abi/event_selector.d.ts +4 -0
  9. package/dest/abi/event_selector.d.ts.map +1 -1
  10. package/dest/abi/event_selector.js +7 -1
  11. package/dest/abi/utils.d.ts +8 -0
  12. package/dest/abi/utils.d.ts.map +1 -1
  13. package/dest/abi/utils.js +23 -1
  14. package/dest/aztec-address/index.d.ts +19 -3
  15. package/dest/aztec-address/index.d.ts.map +1 -1
  16. package/dest/aztec-address/index.js +43 -14
  17. package/dest/buffer/buffer32.d.ts +1 -0
  18. package/dest/buffer/buffer32.d.ts.map +1 -1
  19. package/dest/buffer/buffer32.js +4 -1
  20. package/dest/config/env_var.d.ts +1 -1
  21. package/dest/config/env_var.d.ts.map +1 -1
  22. package/dest/crypto/index.d.ts +1 -0
  23. package/dest/crypto/index.d.ts.map +1 -1
  24. package/dest/crypto/index.js +2 -1
  25. package/dest/crypto/keys/index.d.ts +5 -0
  26. package/dest/crypto/keys/index.d.ts.map +1 -0
  27. package/dest/crypto/keys/index.js +8 -0
  28. package/dest/eth-address/index.d.ts +2 -6
  29. package/dest/eth-address/index.d.ts.map +1 -1
  30. package/dest/eth-address/index.js +3 -7
  31. package/dest/eth-signature/eth_signature.d.ts +2 -0
  32. package/dest/eth-signature/eth_signature.d.ts.map +1 -1
  33. package/dest/eth-signature/eth_signature.js +7 -1
  34. package/dest/fields/fields.d.ts +1 -3
  35. package/dest/fields/fields.d.ts.map +1 -1
  36. package/dest/fields/fields.js +2 -1
  37. package/dest/json-rpc/client/fetch.d.ts +21 -0
  38. package/dest/json-rpc/client/fetch.d.ts.map +1 -0
  39. package/dest/json-rpc/client/fetch.js +66 -0
  40. package/dest/json-rpc/client/index.d.ts +2 -1
  41. package/dest/json-rpc/client/index.d.ts.map +1 -1
  42. package/dest/json-rpc/client/index.js +3 -2
  43. package/dest/json-rpc/client/safe_json_rpc_client.d.ts +13 -0
  44. package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -0
  45. package/dest/json-rpc/client/safe_json_rpc_client.js +45 -0
  46. package/dest/json-rpc/convert.d.ts +11 -19
  47. package/dest/json-rpc/convert.d.ts.map +1 -1
  48. package/dest/json-rpc/convert.js +30 -123
  49. package/dest/json-rpc/fixtures/test_state.d.ts +45 -3
  50. package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -1
  51. package/dest/json-rpc/fixtures/test_state.js +58 -2
  52. package/dest/json-rpc/index.d.ts +1 -2
  53. package/dest/json-rpc/index.d.ts.map +1 -1
  54. package/dest/json-rpc/index.js +2 -3
  55. package/dest/json-rpc/js_utils.d.ts.map +1 -1
  56. package/dest/json-rpc/js_utils.js +2 -1
  57. package/dest/json-rpc/server/index.d.ts +1 -2
  58. package/dest/json-rpc/server/index.d.ts.map +1 -1
  59. package/dest/json-rpc/server/index.js +2 -3
  60. package/dest/json-rpc/server/safe_json_rpc_server.d.ts +112 -0
  61. package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -0
  62. package/dest/json-rpc/server/safe_json_rpc_server.js +275 -0
  63. package/dest/json-rpc/test/index.d.ts +2 -0
  64. package/dest/json-rpc/test/index.d.ts.map +1 -0
  65. package/dest/json-rpc/test/index.js +2 -0
  66. package/dest/json-rpc/test/integration.d.ts +13 -0
  67. package/dest/json-rpc/test/integration.d.ts.map +1 -0
  68. package/dest/json-rpc/test/integration.js +12 -0
  69. package/dest/log/logger.d.ts +10 -2
  70. package/dest/log/logger.d.ts.map +1 -1
  71. package/dest/log/logger.js +55 -12
  72. package/dest/schemas/api.d.ts +21 -0
  73. package/dest/schemas/api.d.ts.map +1 -0
  74. package/dest/schemas/api.js +8 -0
  75. package/dest/schemas/index.d.ts +6 -0
  76. package/dest/schemas/index.d.ts.map +1 -0
  77. package/dest/schemas/index.js +6 -0
  78. package/dest/schemas/parse.d.ts +9 -0
  79. package/dest/schemas/parse.d.ts.map +1 -0
  80. package/dest/schemas/parse.js +26 -0
  81. package/dest/schemas/schemas.d.ts +79 -0
  82. package/dest/schemas/schemas.d.ts.map +1 -0
  83. package/dest/schemas/schemas.js +87 -0
  84. package/dest/schemas/types.d.ts +3 -0
  85. package/dest/schemas/types.d.ts.map +1 -0
  86. package/dest/schemas/types.js +2 -0
  87. package/dest/schemas/utils.d.ts +40 -0
  88. package/dest/schemas/utils.d.ts.map +1 -0
  89. package/dest/schemas/utils.js +56 -0
  90. package/dest/string/index.d.ts +7 -0
  91. package/dest/string/index.d.ts.map +1 -0
  92. package/dest/string/index.js +13 -0
  93. package/dest/types/index.d.ts +2 -0
  94. package/dest/types/index.d.ts.map +1 -1
  95. package/dest/validation/index.d.ts +6 -0
  96. package/dest/validation/index.d.ts.map +1 -1
  97. package/dest/validation/index.js +11 -1
  98. package/dest/wasm/wasm_module.js +1 -1
  99. package/package.json +7 -4
  100. package/src/abi/abi.ts +203 -233
  101. package/src/abi/decoder.ts +9 -5
  102. package/src/abi/encoder.ts +2 -0
  103. package/src/abi/event_selector.ts +7 -0
  104. package/src/abi/utils.ts +28 -0
  105. package/src/aztec-address/index.ts +64 -18
  106. package/src/buffer/buffer32.ts +5 -0
  107. package/src/config/env_var.ts +22 -8
  108. package/src/crypto/index.ts +1 -0
  109. package/src/crypto/keys/index.ts +9 -0
  110. package/src/eth-address/index.ts +2 -6
  111. package/src/eth-signature/eth_signature.ts +8 -0
  112. package/src/fields/fields.ts +2 -3
  113. package/src/json-rpc/client/fetch.ts +81 -0
  114. package/src/json-rpc/client/index.ts +2 -1
  115. package/src/json-rpc/client/safe_json_rpc_client.ts +61 -0
  116. package/src/json-rpc/convert.ts +29 -142
  117. package/src/json-rpc/fixtures/test_state.ts +87 -3
  118. package/src/json-rpc/index.ts +1 -8
  119. package/src/json-rpc/js_utils.ts +1 -0
  120. package/src/json-rpc/server/index.ts +1 -2
  121. package/src/json-rpc/server/safe_json_rpc_server.ts +336 -0
  122. package/src/json-rpc/test/index.ts +1 -0
  123. package/src/json-rpc/test/integration.ts +24 -0
  124. package/src/log/logger.ts +59 -15
  125. package/src/schemas/api.ts +47 -0
  126. package/src/schemas/index.ts +5 -0
  127. package/src/schemas/parse.ts +29 -0
  128. package/src/schemas/schemas.ts +111 -0
  129. package/src/schemas/types.ts +3 -0
  130. package/src/schemas/utils.ts +85 -0
  131. package/src/string/index.ts +15 -0
  132. package/src/types/index.ts +3 -0
  133. package/src/validation/index.ts +11 -0
  134. package/src/wasm/wasm_module.ts +1 -1
  135. package/dest/json-rpc/class_converter.d.ts +0 -144
  136. package/dest/json-rpc/class_converter.d.ts.map +0 -1
  137. package/dest/json-rpc/class_converter.js +0 -102
  138. package/dest/json-rpc/client/json_rpc_client.d.ts +0 -35
  139. package/dest/json-rpc/client/json_rpc_client.d.ts.map +0 -1
  140. package/dest/json-rpc/client/json_rpc_client.js +0 -117
  141. package/dest/json-rpc/server/json_proxy.d.ts +0 -30
  142. package/dest/json-rpc/server/json_proxy.d.ts.map +0 -1
  143. package/dest/json-rpc/server/json_proxy.js +0 -46
  144. package/dest/json-rpc/server/json_rpc_server.d.ts +0 -98
  145. package/dest/json-rpc/server/json_rpc_server.d.ts.map +0 -1
  146. package/dest/json-rpc/server/json_rpc_server.js +0 -248
  147. package/src/json-rpc/class_converter.ts +0 -213
  148. package/src/json-rpc/client/json_rpc_client.ts +0 -148
  149. package/src/json-rpc/server/json_proxy.ts +0 -60
  150. package/src/json-rpc/server/json_rpc_server.ts +0 -300
@@ -0,0 +1,275 @@
1
+ import cors from '@koa/cors';
2
+ import http from 'http';
3
+ import Koa from 'koa';
4
+ import bodyParser from 'koa-bodyparser';
5
+ import compress from 'koa-compress';
6
+ import Router from 'koa-router';
7
+ import { format, inspect } from 'util';
8
+ import { ZodError } from 'zod';
9
+ import { createDebugLogger } from '../../log/index.js';
10
+ import { promiseWithResolvers } from '../../promise/utils.js';
11
+ import { parseWithOptionals, schemaHasMethod } from '../../schemas/index.js';
12
+ import { jsonStringify } from '../convert.js';
13
+ import { assert } from '../js_utils.js';
14
+ export class SafeJsonRpcServer {
15
+ constructor(
16
+ /** The proxy object to delegate requests to. */
17
+ proxy,
18
+ /** Health check function */
19
+ healthCheck = () => true,
20
+ /** Logger */
21
+ log = createDebugLogger('json-rpc:server')) {
22
+ this.proxy = proxy;
23
+ this.healthCheck = healthCheck;
24
+ this.log = log;
25
+ }
26
+ isHealthy() {
27
+ return this.healthCheck();
28
+ }
29
+ /**
30
+ * Get an express app object.
31
+ * @param prefix - Our server prefix.
32
+ * @returns The app object.
33
+ */
34
+ getApp(prefix = '') {
35
+ const router = this.getRouter(prefix);
36
+ const exceptionHandler = async (ctx, next) => {
37
+ try {
38
+ await next();
39
+ }
40
+ catch (err) {
41
+ const method = ctx.request.body?.method ?? 'unknown';
42
+ this.log.warn(`Error in JSON RPC server call ${method}: ${inspect(err)}`);
43
+ if (err instanceof SyntaxError) {
44
+ ctx.status = 400;
45
+ ctx.body = { jsonrpc: '2.0', id: null, error: { code: -32700, message: `Parse error: ${err.message}` } };
46
+ }
47
+ else if (err instanceof ZodError) {
48
+ const message = err.issues.map(e => `${e.message} (${e.path.join('.')})`).join('. ') || 'Validation error';
49
+ ctx.status = 400;
50
+ ctx.body = { jsonrpc: '2.0', id: null, error: { code: -32701, message } };
51
+ }
52
+ else {
53
+ ctx.status = 500;
54
+ ctx.body = { jsonrpc: '2.0', id: null, error: { code: -32600, message: err.message ?? 'Internal error' } };
55
+ }
56
+ }
57
+ };
58
+ const jsonResponse = async (ctx, next) => {
59
+ try {
60
+ await next();
61
+ if (ctx.body && typeof ctx.body === 'object') {
62
+ ctx.body = jsonStringify(ctx.body);
63
+ }
64
+ }
65
+ catch (err) {
66
+ ctx.status = 500;
67
+ ctx.body = { jsonrpc: '2.0', error: { code: -32700, message: `Unable to serialize response: ${err.message}` } };
68
+ }
69
+ };
70
+ const app = new Koa();
71
+ app.on('error', error => {
72
+ this.log.error(`Error on API handler: ${error}`);
73
+ });
74
+ app.use(compress({ br: false }));
75
+ app.use(jsonResponse);
76
+ app.use(exceptionHandler);
77
+ app.use(bodyParser({ jsonLimit: '50mb', enableTypes: ['json'], detectJSON: () => true }));
78
+ app.use(cors());
79
+ app.use(router.routes());
80
+ app.use(router.allowedMethods());
81
+ return app;
82
+ }
83
+ /**
84
+ * Get a router object wrapping our RPC class.
85
+ * @param prefix - The server prefix.
86
+ * @returns The router object.
87
+ */
88
+ getRouter(prefix) {
89
+ const router = new Router({ prefix });
90
+ // "JSON RPC mode" where a single endpoint is used and the method is given in the request body
91
+ router.post('/', async (ctx) => {
92
+ const { params = [], jsonrpc, id, method } = ctx.request.body;
93
+ // Fail if not a registered function in the proxy
94
+ if (typeof method !== 'string' || method === 'constructor' || !this.proxy.hasMethod(method)) {
95
+ ctx.status = 400;
96
+ ctx.body = { jsonrpc, id, error: { code: -32601, message: `Method not found: ${method}` } };
97
+ }
98
+ else {
99
+ const result = await this.proxy.call(method, params);
100
+ ctx.body = { jsonrpc, id, result };
101
+ ctx.status = 200;
102
+ }
103
+ });
104
+ return router;
105
+ }
106
+ /**
107
+ * Start this server with koa.
108
+ * @param port - Port number.
109
+ * @param prefix - Prefix string.
110
+ */
111
+ start(port, prefix = '') {
112
+ if (this.httpServer) {
113
+ throw new Error('Server is already listening');
114
+ }
115
+ this.httpServer = http.createServer(this.getApp(prefix).callback());
116
+ this.httpServer.listen(port);
117
+ }
118
+ /**
119
+ * Stops the HTTP server
120
+ */
121
+ stop() {
122
+ if (!this.httpServer) {
123
+ return Promise.resolve();
124
+ }
125
+ const { promise, resolve, reject } = promiseWithResolvers();
126
+ this.httpServer.close(err => {
127
+ if (err) {
128
+ reject(err);
129
+ }
130
+ else {
131
+ resolve();
132
+ }
133
+ });
134
+ return promise;
135
+ }
136
+ /**
137
+ * Explicitly calls an RPC method.
138
+ * @param methodName - The RPC method.
139
+ * @param jsonParams - The RPC parameters.
140
+ * @returns The remote result.
141
+ */
142
+ async call(methodName, jsonParams = []) {
143
+ return await this.proxy.call(methodName, jsonParams);
144
+ }
145
+ }
146
+ /**
147
+ * Forwards calls to a handler. Relies on a schema definition to validate and convert inputs
148
+ * before forwarding calls, and then converts outputs into JSON using default conversions.
149
+ */
150
+ export class SafeJsonProxy {
151
+ constructor(handler, schema) {
152
+ this.handler = handler;
153
+ this.log = createDebugLogger('json-rpc:proxy');
154
+ this.schema = schema;
155
+ }
156
+ /**
157
+ * Call an RPC method.
158
+ * @param methodName - The RPC method.
159
+ * @param jsonParams - The RPC parameters.
160
+ * @returns The remote result.
161
+ */
162
+ async call(methodName, jsonParams = []) {
163
+ this.log.debug(format(`request`, methodName, jsonParams));
164
+ assert(Array.isArray(jsonParams), `Params to ${methodName} is not an array: ${jsonParams}`);
165
+ assert(schemaHasMethod(this.schema, methodName), `Method ${methodName} not found in schema`);
166
+ const method = this.handler[methodName];
167
+ assert(typeof method === 'function', `Method ${methodName} is not a function`);
168
+ const args = parseWithOptionals(jsonParams, this.schema[methodName].parameters());
169
+ const ret = await method.apply(this.handler, args);
170
+ this.log.debug(format('response', methodName, ret));
171
+ return ret;
172
+ }
173
+ hasMethod(methodName) {
174
+ return schemaHasMethod(this.schema, methodName) && typeof this.handler[methodName] === 'function';
175
+ }
176
+ }
177
+ class NamespacedSafeJsonProxy {
178
+ constructor(handlers) {
179
+ this.proxies = {};
180
+ for (const [namespace, [handler, schema]] of Object.entries(handlers)) {
181
+ this.proxies[namespace] = new SafeJsonProxy(handler, schema);
182
+ }
183
+ }
184
+ call(namespacedMethodName, jsonParams = []) {
185
+ const [namespace, methodName] = namespacedMethodName.split('_', 2);
186
+ assert(namespace && methodName, `Invalid namespaced method name: ${namespacedMethodName}`);
187
+ const handler = this.proxies[namespace];
188
+ assert(handler, `Namespace not found: ${namespace}`);
189
+ return handler.call(methodName, jsonParams);
190
+ }
191
+ hasMethod(namespacedMethodName) {
192
+ const [namespace, methodName] = namespacedMethodName.split('_', 2);
193
+ const handler = this.proxies[namespace];
194
+ return handler?.hasMethod(methodName);
195
+ }
196
+ }
197
+ export function makeHandler(handler, schema) {
198
+ return [handler, schema];
199
+ }
200
+ function makeAggregateHealthcheck(namedHandlers, log) {
201
+ return async () => {
202
+ try {
203
+ const results = await Promise.all(Object.entries(namedHandlers).map(([name, [, , healthCheck]]) => [name, healthCheck ? healthCheck() : true]));
204
+ const failed = results.filter(([_, result]) => !result);
205
+ if (failed.length > 0) {
206
+ log?.warn(`Health check failed for ${failed.map(([name]) => name).join(', ')}`);
207
+ return false;
208
+ }
209
+ return true;
210
+ }
211
+ catch (err) {
212
+ log?.error(`Error during health check`, err);
213
+ return false;
214
+ }
215
+ };
216
+ }
217
+ /**
218
+ * Creates a single SafeJsonRpcServer from multiple handlers.
219
+ * @param servers - List of handlers to be combined.
220
+ * @returns A single JsonRpcServer with namespaced methods.
221
+ */
222
+ export function createNamespacedSafeJsonRpcServer(handlers, log = createDebugLogger('json-rpc:server')) {
223
+ const proxy = new NamespacedSafeJsonProxy(handlers);
224
+ const healthCheck = makeAggregateHealthcheck(handlers, log);
225
+ return new SafeJsonRpcServer(proxy, healthCheck, log);
226
+ }
227
+ export function createSafeJsonRpcServer(handler, schema, healthCheck) {
228
+ const proxy = new SafeJsonProxy(handler, schema);
229
+ return new SafeJsonRpcServer(proxy, healthCheck);
230
+ }
231
+ /**
232
+ * Creates a router for handling a plain status request that will return 200 status when running.
233
+ * @param getCurrentStatus - List of health check functions to run.
234
+ * @param apiPrefix - The prefix to use for all api requests
235
+ * @returns - The router for handling status requests.
236
+ */
237
+ export function createStatusRouter(getCurrentStatus, apiPrefix = '') {
238
+ const router = new Router({ prefix: `${apiPrefix}` });
239
+ router.get('/status', async (ctx) => {
240
+ let ok;
241
+ try {
242
+ ok = (await getCurrentStatus()) === true;
243
+ }
244
+ catch (err) {
245
+ ok = false;
246
+ }
247
+ ctx.status = ok ? 200 : 500;
248
+ });
249
+ return router;
250
+ }
251
+ /**
252
+ * Wraps a JsonRpcServer in a nodejs http server and starts it.
253
+ * Installs a status router that calls to the isHealthy method to the server.
254
+ * Returns once starts listening unless noWait is set.
255
+ * @returns A running http server.
256
+ */
257
+ export async function startHttpRpcServer(rpcServer, options = {}) {
258
+ const app = rpcServer.getApp(options.apiPrefix);
259
+ const statusRouter = createStatusRouter(rpcServer.isHealthy.bind(rpcServer), options.apiPrefix);
260
+ app.use(statusRouter.routes()).use(statusRouter.allowedMethods());
261
+ const httpServer = http.createServer(app.callback());
262
+ if (options.timeoutMs) {
263
+ httpServer.timeout = options.timeoutMs;
264
+ }
265
+ const { promise, resolve } = promiseWithResolvers();
266
+ const listenPort = options.port ? (typeof options.port === 'string' ? parseInt(options.port) : options.port) : 0;
267
+ httpServer.listen(listenPort, options.host, () => resolve());
268
+ // Wait until listen callback is called
269
+ if (!options.noWait) {
270
+ await promise;
271
+ }
272
+ const port = httpServer.address().port;
273
+ return Object.assign(httpServer, { port });
274
+ }
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZV9qc29uX3JwY19zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvanNvbi1ycGMvc2VydmVyL3NhZmVfanNvbl9ycGNfc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQ3RCLE9BQU8sVUFBVSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sUUFBUSxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLE1BQU0sTUFBTSxZQUFZLENBQUM7QUFFaEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUUvQixPQUFPLEVBQW9CLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUFxQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxNQUFNLE9BQU8saUJBQWlCO0lBTzVCO0lBQ0UsZ0RBQWdEO0lBQy9CLEtBQVk7SUFDN0IsNEJBQTRCO0lBQ1gsY0FBNkIsR0FBRyxFQUFFLENBQUMsSUFBSTtJQUN4RCxhQUFhO0lBQ0wsTUFBTSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQztRQUpqQyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBRVosZ0JBQVcsR0FBWCxXQUFXLENBQTRCO1FBRWhELFFBQUcsR0FBSCxHQUFHLENBQXVDO0lBQ2pELENBQUM7SUFFRyxT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
@@ -0,0 +1,2 @@
1
+ export { createJsonRpcTestSetup, type JsonRpcTestContext } from './integration.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/json-rpc/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createJsonRpcTestSetup } from './integration.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvanNvbi1ycGMvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQTJCLE1BQU0sa0JBQWtCLENBQUMifQ==
@@ -0,0 +1,13 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import type http from 'http';
3
+ import { type ApiSchemaFor } from '../../schemas/api.js';
4
+ import { type SafeJsonRpcServer } from '../server/safe_json_rpc_server.js';
5
+ export type JsonRpcTestContext<T extends object> = {
6
+ server: SafeJsonRpcServer;
7
+ client: T;
8
+ httpServer: http.Server & {
9
+ port: number;
10
+ };
11
+ };
12
+ export declare function createJsonRpcTestSetup<T extends object>(handler: T, schema: ApiSchemaFor<T>): Promise<JsonRpcTestContext<T>>;
13
+ //# sourceMappingURL=integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/json-rpc/test/integration.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzD,OAAO,EAAE,KAAK,iBAAiB,EAA2B,MAAM,mCAAmC,CAAC;AAEpG,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,MAAM,IAAI;IACjD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC;IACV,UAAU,EAAE,IAAI,CAAC,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAC3D,OAAO,EAAE,CAAC,EACV,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAMhC"}
@@ -0,0 +1,12 @@
1
+ import { makeFetch } from '../client/fetch.js';
2
+ import { createSafeJsonRpcClient } from '../client/safe_json_rpc_client.js';
3
+ import { startHttpRpcServer } from '../server/safe_json_rpc_server.js';
4
+ import { createSafeJsonRpcServer } from '../server/safe_json_rpc_server.js';
5
+ export async function createJsonRpcTestSetup(handler, schema) {
6
+ const server = createSafeJsonRpcServer(handler, schema);
7
+ const httpServer = await startHttpRpcServer(server, { host: '127.0.0.1' });
8
+ const noRetryFetch = makeFetch([], true);
9
+ const client = createSafeJsonRpcClient(`http://127.0.0.1:${httpServer.port}`, schema, false, false, noRetryFetch);
10
+ return { server, client, httpServer };
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvanNvbi1ycGMvdGVzdC9pbnRlZ3JhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDNUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUEwQix1QkFBdUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBUXBHLE1BQU0sQ0FBQyxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLE9BQVUsRUFDVixNQUF1QjtJQUV2QixNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBSSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMzRSxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLHVCQUF1QixDQUFJLG9CQUFvQixVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDckgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDeEMsQ0FBQyJ9
@@ -26,11 +26,19 @@ export type DebugLogger = Logger;
26
26
  * Uses npm debug for debug level and console.error for other levels.
27
27
  * @param name - Name of the module.
28
28
  * @param fixedLogData - Additional data to include in the log message.
29
- * @usage createDebugLogger('aztec:validator', {validatorAddress: '0x1234...'});
29
+ * @usage createDebugLogger('aztec:validator');
30
30
  * // will always add the validator address to the log labels
31
31
  * @returns A debug logger.
32
32
  */
33
- export declare function createDebugLogger(name: string, fixedLogData?: LogData): DebugLogger;
33
+ export declare function createDebugLogger(name: string): DebugLogger;
34
+ /**
35
+ * A function to create a logger that automatically includes fixed data in each log entry.
36
+ * @param debugLogger - The base DebugLogger instance to which we attach fixed log data.
37
+ * @param fixedLogData - The data to be included in every log entry.
38
+ * @returns A DebugLogger with log level methods (error, warn, info, verbose, debug) that
39
+ * automatically attach `fixedLogData` to every log message.
40
+ */
41
+ export declare function attachedFixedDataToLogger(debugLogger: DebugLogger, fixedLogData: LogData): DebugLogger;
34
42
  /** A callback to capture all logs. */
35
43
  export type LogHandler = (level: LogLevel, namespace: string, msg: string, data?: LogData) => void;
36
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/log/logger.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAEvD,QAAA,MAAM,SAAS,kEAAmE,CAAC;AAEnF;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AASlD,eAAO,IAAI,YAAY,4DAAgB,CAAC;AAKxC,oDAAoD;AACpD,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAE/E;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;KAAG,CAAC,IAAI,QAAQ,GAAG,KAAK;CAAE,GAAG;IAA4B,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAElG;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC;;;;;;;;;GASG;AAEH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,WAAW,CAkBnF;AACD,sCAAsC;AACtC,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAInG;;;GAGG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,UAAU,QAExC;AAED,mCAAmC;AACnC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,QAEvC;AA6BD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAIjD"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/log/logger.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAEvD,QAAA,MAAM,SAAS,kEAAmE,CAAC;AAEnF;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAUlD,eAAO,IAAI,YAAY,4DAAgB,CAAC;AAqBxC,oDAAoD;AACpD,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAE/E;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;KAAG,CAAC,IAAI,QAAQ,GAAG,KAAK;CAAE,GAAG;IAA4B,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAElG;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC;;;;;;;;;GASG;AAEH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAqB3D;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,GAAG,WAAW,CActG;AAED,sCAAsC;AACtC,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAInG;;;GAGG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,UAAU,QAExC;AAED,mCAAmC;AACnC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,QAEvC;AA6BD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAIjD"}
@@ -3,35 +3,78 @@ import { inspect } from 'util';
3
3
  const LogLevels = ['silent', 'error', 'warn', 'info', 'verbose', 'debug'];
4
4
  function getLogLevel() {
5
5
  const envLogLevel = process.env.LOG_LEVEL?.toLowerCase();
6
- const defaultNonTestLogLevel = process.env.DEBUG === undefined ? 'info' : 'debug';
6
+ const defaultNonTestLogLevel = process.env.DEBUG === undefined || process.env.DEBUG === '' ? 'info' : 'debug';
7
7
  const defaultLogLevel = process.env.NODE_ENV === 'test' ? 'silent' : defaultNonTestLogLevel;
8
8
  return LogLevels.includes(envLogLevel) ? envLogLevel : defaultLogLevel;
9
9
  }
10
10
  export let currentLevel = getLogLevel();
11
+ function filterNegativePatterns(debugString) {
12
+ return debugString
13
+ .split(',')
14
+ .filter(p => !p.startsWith('-'))
15
+ .join(',');
16
+ }
17
+ function extractNegativePatterns(debugString) {
18
+ return (debugString
19
+ .split(',')
20
+ .filter(p => p.startsWith('-'))
21
+ // Remove the leading '-' from the pattern
22
+ .map(p => p.slice(1)));
23
+ }
11
24
  const namespaces = process.env.DEBUG ?? 'aztec:*';
12
- debug.enable(namespaces);
25
+ debug.enable(filterNegativePatterns(namespaces));
13
26
  /**
14
27
  * Creates a new DebugLogger for the current module, defaulting to the LOG_LEVEL env var.
15
28
  * If DEBUG="[module]" env is set, will enable debug logging if the module matches.
16
29
  * Uses npm debug for debug level and console.error for other levels.
17
30
  * @param name - Name of the module.
18
31
  * @param fixedLogData - Additional data to include in the log message.
19
- * @usage createDebugLogger('aztec:validator', {validatorAddress: '0x1234...'});
32
+ * @usage createDebugLogger('aztec:validator');
20
33
  * // will always add the validator address to the log labels
21
34
  * @returns A debug logger.
22
35
  */
23
- export function createDebugLogger(name, fixedLogData) {
36
+ export function createDebugLogger(name) {
24
37
  const debugLogger = debug(name);
25
- const attatchFixedLogData = (data) => ({ ...fixedLogData, ...data });
38
+ const negativePatterns = extractNegativePatterns(namespaces);
39
+ const accepted = () => {
40
+ return !negativePatterns.some(pattern => name.match(pattern));
41
+ };
42
+ const log = (level, msg, data) => {
43
+ if (accepted()) {
44
+ logWithDebug(debugLogger, level, msg, data);
45
+ }
46
+ };
47
+ const logger = {
48
+ silent: () => { },
49
+ error: (msg, err, data) => log('error', fmtErr(msg, err), data),
50
+ warn: (msg, data) => log('warn', msg, data),
51
+ info: (msg, data) => log('info', msg, data),
52
+ verbose: (msg, data) => log('verbose', msg, data),
53
+ debug: (msg, data) => log('debug', msg, data),
54
+ };
55
+ return Object.assign((msg, data) => log('debug', msg, data), logger);
56
+ }
57
+ /**
58
+ * A function to create a logger that automatically includes fixed data in each log entry.
59
+ * @param debugLogger - The base DebugLogger instance to which we attach fixed log data.
60
+ * @param fixedLogData - The data to be included in every log entry.
61
+ * @returns A DebugLogger with log level methods (error, warn, info, verbose, debug) that
62
+ * automatically attach `fixedLogData` to every log message.
63
+ */
64
+ export function attachedFixedDataToLogger(debugLogger, fixedLogData) {
65
+ // Helper function to merge fixed data with additional data passed to log entries.
66
+ const attach = (data) => ({ ...fixedLogData, ...data });
67
+ // Define the logger with all the necessary log level methods.
26
68
  const logger = {
69
+ // Silent log level does nothing.
27
70
  silent: () => { },
28
- error: (msg, err, data) => logWithDebug(debugLogger, 'error', fmtErr(msg, err), attatchFixedLogData(data)),
29
- warn: (msg, data) => logWithDebug(debugLogger, 'warn', msg, attatchFixedLogData(data)),
30
- info: (msg, data) => logWithDebug(debugLogger, 'info', msg, attatchFixedLogData(data)),
31
- verbose: (msg, data) => logWithDebug(debugLogger, 'verbose', msg, attatchFixedLogData(data)),
32
- debug: (msg, data) => logWithDebug(debugLogger, 'debug', msg, attatchFixedLogData(data)),
71
+ error: (msg, err, data) => debugLogger.error(fmtErr(msg, err), attach(data)),
72
+ warn: (msg, data) => debugLogger.warn(msg, attach(data)),
73
+ info: (msg, data) => debugLogger.info(msg, attach(data)),
74
+ verbose: (msg, data) => debugLogger.verbose(msg, attach(data)),
75
+ debug: (msg, data) => debugLogger.debug(msg, attach(data)),
33
76
  };
34
- return Object.assign((msg, data) => logWithDebug(debugLogger, 'debug', msg, attatchFixedLogData(data)), logger);
77
+ return Object.assign((msg, data) => debugLogger.debug(msg, attach(data)), logger);
35
78
  }
36
79
  const logHandlers = [];
37
80
  /**
@@ -78,4 +121,4 @@ export function fmtLogData(data) {
78
121
  .map(([key, value]) => `${key}=${typeof value === 'object' && 'toString' in value ? value.toString() : value}`)
79
122
  .join(' ');
80
123
  }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy9sb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJL0IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBT25GLFNBQVMsV0FBVztJQUNsQixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQWMsQ0FBQztJQUNyRSxNQUFNLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUUsTUFBZ0IsQ0FBQyxDQUFDLENBQUUsT0FBaUIsQ0FBQztJQUN4RyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFFLFFBQWtCLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDO0lBQ3ZHLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7QUFDekUsQ0FBQztBQUVELE1BQU0sQ0FBQyxJQUFJLFlBQVksR0FBRyxXQUFXLEVBQUUsQ0FBQztBQUV4QyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUM7QUFDbEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQWdCekI7Ozs7Ozs7OztHQVNHO0FBRUgsTUFBTSxVQUFVLGlCQUFpQixDQUFDLElBQVksRUFBRSxZQUFzQjtJQUNwRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMs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
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy9sb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJL0IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBT25GLFNBQVMsV0FBVztJQUNsQixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQWMsQ0FBQztJQUNyRSxNQUFNLHNCQUFzQixHQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBRSxNQUFnQixDQUFDLENBQUMsQ0FBRSxPQUFpQixDQUFDO0lBQ3ZHLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUUsUUFBa0IsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUM7SUFDdkcsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxDQUFDLElBQUksWUFBWSxHQUFHLFdBQVcsRUFBRSxDQUFDO0FBRXhDLFNBQVMsc0JBQXNCLENBQUMsV0FBbUI7SUFDakQsT0FBTyxXQUFXO1NBQ2YsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMvQixJQUFJ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
@@ -0,0 +1,21 @@
1
+ import { type z } from 'zod';
2
+ import { type ZodNullableOptional } from './utils.js';
3
+ type ZodParameterTypeFor<T> = undefined extends T ? ZodNullableOptional<z.ZodType<T, z.ZodTypeDef, any>> : z.ZodType<T, z.ZodTypeDef, any>;
4
+ type ZodReturnTypeFor<T> = z.ZodType<T, z.ZodTypeDef, any>;
5
+ type ZodMapParameterTypes<T> = T extends [] ? [] : T extends [item: infer Head, ...infer Rest] ? [ZodParameterTypeFor<Head>, ...{
6
+ [K in keyof Rest]: ZodParameterTypeFor<Rest[K]>;
7
+ }] : T extends [item?: infer Head, ...infer Rest] ? [ZodNullableOptional<ZodParameterTypeFor<Head>>, ...{
8
+ [K in keyof Rest]: ZodParameterTypeFor<Rest[K]>;
9
+ }] : never;
10
+ /** Maps all functions in an interface to their schema representation. */
11
+ export type ApiSchemaFor<T> = {
12
+ [K in keyof T]: T[K] extends (...args: infer Args) => Promise<infer Ret> ? z.ZodFunction<z.ZodTuple<ZodMapParameterTypes<Args>, z.ZodUnknown>, ZodReturnTypeFor<Ret>> : never;
13
+ };
14
+ /** Generic Api schema not bounded to a specific implementation. */
15
+ export type ApiSchema = {
16
+ [key: string]: z.ZodFunction<z.ZodTuple<any, any>, z.ZodTypeAny>;
17
+ };
18
+ /** Return whether an API schema defines a valid function schema for a given method name. */
19
+ export declare function schemaHasMethod(schema: ApiSchema, methodName: string): boolean;
20
+ export {};
21
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/schemas/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtD,KAAK,mBAAmB,CAAC,CAAC,IAAI,SAAS,SAAS,CAAC,GAC7C,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,GACpD,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAEpC,KAAK,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAS3D,KAAK,oBAAoB,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,GACvC,EAAE,GACF,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,GAC3C,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,GAAG;KAAG,CAAC,IAAI,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,GACnF,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,GAC5C,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG;KAAG,CAAC,IAAI,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,GACxG,KAAK,CAAC;AAEV,yEAAyE;AACzE,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;KAC3B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,IAAI,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,GACpE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAC1F,KAAK;CACV,CAAC;AAEF,mEAAmE;AACnE,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;CAClE,CAAC;AAEF,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAOpE"}
@@ -0,0 +1,8 @@
1
+ /** Return whether an API schema defines a valid function schema for a given method name. */
2
+ export function schemaHasMethod(schema, methodName) {
3
+ return (typeof methodName === 'string' &&
4
+ Object.hasOwn(schema, methodName) &&
5
+ typeof schema[methodName].parameters === 'function' &&
6
+ typeof schema[methodName].returnType === 'function');
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjaGVtYXMvYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXNDQSw0RkFBNEY7QUFDNUYsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFpQixFQUFFLFVBQWtCO0lBQ25FLE9BQU8sQ0FDTCxPQUFPLFVBQVUsS0FBSyxRQUFRO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztRQUNqQyxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxVQUFVLEtBQUssVUFBVTtRQUNuRCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUNwRCxDQUFDO0FBQ0osQ0FBQyJ9
@@ -0,0 +1,6 @@
1
+ export * from './api.js';
2
+ export * from './parse.js';
3
+ export * from './schemas.js';
4
+ export * from './utils.js';
5
+ export * from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './api.js';
2
+ export * from './parse.js';
3
+ export * from './schemas.js';
4
+ export * from './utils.js';
5
+ export * from './types.js';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NoZW1hcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLFlBQVksQ0FBQyJ9
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod';
2
+ /** Parses the given arguments using a tuple from the provided schemas. */
3
+ export declare function parse<T extends [] | [z.ZodTypeAny, ...z.ZodTypeAny[]]>(args: IArguments, ...schemas: T): z.AssertArray<{ [k in keyof T]: T[k] extends z.ZodType<any, any, any> ? T[k]["_output"] : never; }>;
4
+ /**
5
+ * Parses the given arguments against a tuple, allowing empty for optional items.
6
+ * @dev Zod doesn't like tuplues with optional items. See https://github.com/colinhacks/zod/discussions/949.
7
+ */
8
+ export declare function parseWithOptionals<T extends z.AnyZodTuple>(args: any[], schema: T): T['_output'];
9
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/schemas/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,0EAA0E;AAC1E,wBAAgB,KAAK,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC,uGAEtG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAMhG"}
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ import { times } from '../collection/array.js';
3
+ /** Parses the given arguments using a tuple from the provided schemas. */
4
+ export function parse(args, ...schemas) {
5
+ return z.tuple(schemas).parse(args);
6
+ }
7
+ /**
8
+ * Parses the given arguments against a tuple, allowing empty for optional items.
9
+ * @dev Zod doesn't like tuplues with optional items. See https://github.com/colinhacks/zod/discussions/949.
10
+ */
11
+ export function parseWithOptionals(args, schema) {
12
+ const missingCount = schema.items.length - args.length;
13
+ const optionalCount = schema.items.filter(isOptional).length;
14
+ const toParse = missingCount > 0 && missingCount <= optionalCount ? args.concat(times(missingCount, () => undefined)) : args;
15
+ return schema.parse(toParse);
16
+ }
17
+ function isOptional(schema) {
18
+ try {
19
+ return schema.isOptional();
20
+ }
21
+ catch (err) {
22
+ // See https://github.com/colinhacks/zod/issues/1911
23
+ return schema._def.typeName === 'ZodOptional';
24
+ }
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NoZW1hcy9wYXJzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUvQywwRUFBMEU7QUFDMUUsTUFBTSxVQUFVLEtBQUssQ0FBbUQsSUFBZ0IsRUFBRSxHQUFHLE9BQVU7SUFDckcsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUEwQixJQUFXLEVBQUUsTUFBUztJQUNoRixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM3RCxNQUFNLE9BQU8sR0FDWCxZQUFZLEdBQUcsQ0FBQyxJQUFJLFlBQVksSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0csT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxNQUFvQjtJQUN0QyxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLG9EQUFvRDtRQUNwRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLGFBQWEsQ0FBQztJQUNoRCxDQUFDO0FBQ0gsQ0FBQyJ9