@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
@@ -1,117 +0,0 @@
1
- import { format } from 'util';
2
- import { createDebugLogger } from '../../log/index.js';
3
- import { NoRetryError, makeBackoff, retry } from '../../retry/index.js';
4
- import { ClassConverter } from '../class_converter.js';
5
- import { JsonStringify, convertFromJsonObj, convertToJsonObj } from '../convert.js';
6
- export { JsonStringify } from '../convert.js';
7
- const log = createDebugLogger('json-rpc:json_rpc_client');
8
- /**
9
- * A normal fetch function that does not retry.
10
- * Alternatives are a fetch function with retries, or a mocked fetch.
11
- * @param host - The host URL.
12
- * @param method - The RPC method name.
13
- * @param body - The RPC payload.
14
- * @param noRetry - Whether to throw a `NoRetryError` in case the response is a 5xx error and the body contains an error
15
- * message (see `retry` function for more details).
16
- * @returns The parsed JSON response, or throws an error.
17
- */
18
- export async function defaultFetch(host, rpcMethod, body, useApiEndpoints, noRetry = false) {
19
- log.debug(format(`JsonRpcClient.fetch`, host, rpcMethod, '->', body));
20
- let resp;
21
- if (useApiEndpoints) {
22
- resp = await fetch(`${host}/${rpcMethod}`, {
23
- method: 'POST',
24
- body: JsonStringify(body),
25
- headers: { 'content-type': 'application/json' },
26
- });
27
- }
28
- else {
29
- resp = await fetch(host, {
30
- method: 'POST',
31
- body: JsonStringify({ ...body, method: rpcMethod }),
32
- headers: { 'content-type': 'application/json' },
33
- });
34
- }
35
- let responseJson;
36
- try {
37
- responseJson = await resp.json();
38
- }
39
- catch (err) {
40
- if (!resp.ok) {
41
- throw new Error(resp.statusText);
42
- }
43
- throw new Error(`Failed to parse body as JSON: ${resp.text()}`);
44
- }
45
- if (!resp.ok) {
46
- const errorMessage = `(JSON-RPC PROPAGATED) (host ${host}) (method ${rpcMethod}) (code ${resp.status}) ${responseJson.error.message}`;
47
- if (noRetry || (resp.status >= 400 && resp.status < 500)) {
48
- throw new NoRetryError(errorMessage);
49
- }
50
- else {
51
- throw new Error(errorMessage);
52
- }
53
- }
54
- return responseJson;
55
- }
56
- /**
57
- * Makes a fetch function that retries based on the given attempts.
58
- * @param retries - Sequence of intervals (in seconds) to retry.
59
- * @param noRetry - Whether to stop retries on server errors.
60
- * @param log - Optional logger for logging attempts.
61
- * @returns A fetch function.
62
- */
63
- export function makeFetch(retries, noRetry, log) {
64
- return async (host, rpcMethod, body, useApiEndpoints) => {
65
- return await retry(() => defaultFetch(host, rpcMethod, body, useApiEndpoints, noRetry), `JsonRpcClient request ${rpcMethod} to ${host}`, makeBackoff(retries), log, false);
66
- };
67
- }
68
- /**
69
- * Creates a Proxy object that delegates over RPC and satisfies RemoteObject<T>.
70
- * The server should have ran new JsonRpcServer().
71
- * @param host - The host URL.
72
- * @param stringClassMap - A map of class names to string representations.
73
- * @param objectClassMap - A map of class names to class constructors.
74
- * @param useApiEndpoints - Whether to use the API endpoints or the default RPC endpoint.
75
- * @param namespaceMethods - String value (or false/empty) to namespace all methods sent to the server. e.g. 'getInfo' -\> 'pxe_getInfo'
76
- * @param fetch - The fetch implementation to use.
77
- */
78
- export function createJsonRpcClient(host, stringClassMap, objectClassMap, useApiEndpoints, namespaceMethods, fetch = defaultFetch) {
79
- const classConverter = new ClassConverter(stringClassMap, objectClassMap);
80
- let id = 0;
81
- const request = async (method, params) => {
82
- const body = {
83
- jsonrpc: '2.0',
84
- id: id++,
85
- method,
86
- params: params.map(param => convertToJsonObj(classConverter, param)),
87
- };
88
- log.debug(format(`JsonRpcClient.request`, method, '<-', params));
89
- const res = await fetch(host, method, body, useApiEndpoints);
90
- log.debug(format(`JsonRpcClient.result`, method, '->', res));
91
- if (res.error) {
92
- throw res.error;
93
- }
94
- if ([null, undefined, 'null', 'undefined'].includes(res.result)) {
95
- return;
96
- }
97
- return convertFromJsonObj(classConverter, res.result);
98
- };
99
- // Intercept any RPC methods with a proxy
100
- // This wraps 'request' with a method-call syntax wrapper
101
- return new Proxy({}, {
102
- get: (target, method) => {
103
- let rpcMethod = method;
104
- if (namespaceMethods) {
105
- rpcMethod = `${namespaceMethods}_${method}`;
106
- }
107
- if (['then', 'catch'].includes(method)) {
108
- return Reflect.get(target, method);
109
- }
110
- return (...params) => {
111
- log.debug(format(`JsonRpcClient.constructor`, 'proxy', rpcMethod, '<-', params));
112
- return request(rpcMethod, params);
113
- };
114
- },
115
- });
116
- }
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbl9ycGNfY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2pzb24tcnBjL2NsaWVudC9qc29uX3JwY19jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5QixPQUFPLEVBQW9CLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBZ0UsTUFBTSx1QkFBdUIsQ0FBQztBQUNySCxPQUFPLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUMsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztBQUMxRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FDaEMsSUFBWSxFQUNaLFNBQWlCLEVBQ2pCLElBQVMsRUFDVCxlQUF3QixFQUN4QixPQUFPLEdBQUcsS0FBSztJQUVmLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEUsSUFBSSxJQUFjLENBQUM7SUFDbkIsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQixJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksU0FBUyxFQUFFLEVBQUU7WUFDekMsTUFBTSxFQUFFLE1BQU07WUFDZCxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQztZQUN6QixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JB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
@@ -1,30 +0,0 @@
1
- import { ClassConverter, type JsonClassConverterInput, type StringClassConverterInput } from '../class_converter.js';
2
- /**
3
- * A map of class names to class constructors.
4
- */
5
- export type ClassMaps = {
6
- /** The String class map */
7
- stringClassMap: StringClassConverterInput;
8
- /** The object class map */
9
- objectClassMap: JsonClassConverterInput;
10
- };
11
- /**
12
- * Handles conversion of objects over the write.
13
- * Delegates to a ClassConverter object.
14
- */
15
- export declare class JsonProxy {
16
- private handler;
17
- private stringClassMap;
18
- private objectClassMap;
19
- classConverter: ClassConverter;
20
- constructor(handler: object, stringClassMap: StringClassConverterInput, objectClassMap: JsonClassConverterInput);
21
- /**
22
- * Call an RPC method.
23
- * @param methodName - The RPC method.
24
- * @param jsonParams - The RPG parameters.
25
- * @param skipConversion - Whether to skip conversion of the parameters.
26
- * @returns The remote result.
27
- */
28
- call(methodName: string, jsonParams?: any[], skipConversion?: boolean): Promise<any>;
29
- }
30
- //# sourceMappingURL=json_proxy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"json_proxy.d.ts","sourceRoot":"","sources":["../../../src/json-rpc/server/json_proxy.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,KAAK,uBAAuB,EAAE,KAAK,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAMrH;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,2BAA2B;IAC3B,cAAc,EAAE,yBAAyB,CAAC;IAC1C,2BAA2B;IAC3B,cAAc,EAAE,uBAAuB,CAAC;CACzC,CAAC;AAEF;;;GAGG;AACH,qBAAa,SAAS;IAGlB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,cAAc;IAJxB,cAAc,EAAE,cAAc,CAAC;gBAErB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,yBAAyB,EACzC,cAAc,EAAE,uBAAuB;IAIjD;;;;;;OAMG;IACU,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,GAAE,GAAG,EAAO,EAAE,cAAc,UAAQ;CAoBrF"}
@@ -1,46 +0,0 @@
1
- import { format } from 'util';
2
- import { createDebugLogger } from '../../log/index.js';
3
- import { ClassConverter } from '../class_converter.js';
4
- import { convertFromJsonObj, convertToJsonObj } from '../convert.js';
5
- import { assert, hasOwnProperty } from '../js_utils.js';
6
- const log = createDebugLogger('json-rpc:json_proxy');
7
- /**
8
- * Handles conversion of objects over the write.
9
- * Delegates to a ClassConverter object.
10
- */
11
- export class JsonProxy {
12
- constructor(handler, stringClassMap, objectClassMap) {
13
- this.handler = handler;
14
- this.stringClassMap = stringClassMap;
15
- this.objectClassMap = objectClassMap;
16
- this.classConverter = new ClassConverter(stringClassMap, objectClassMap);
17
- }
18
- /**
19
- * Call an RPC method.
20
- * @param methodName - The RPC method.
21
- * @param jsonParams - The RPG parameters.
22
- * @param skipConversion - Whether to skip conversion of the parameters.
23
- * @returns The remote result.
24
- */
25
- async call(methodName, jsonParams = [], skipConversion = false) {
26
- log.debug(format(`JsonProxy:call`, methodName, jsonParams));
27
- // Get access to our class members
28
- const proto = Object.getPrototypeOf(this.handler);
29
- assert(hasOwnProperty(proto, methodName), `JsonProxy: Method ${methodName} not found!`);
30
- assert(Array.isArray(jsonParams), `JsonProxy: ${methodName} params not an array: ${jsonParams}`);
31
- // convert the params from json representation to classes
32
- let convertedParams = jsonParams;
33
- if (!skipConversion) {
34
- convertedParams = jsonParams.map(param => convertFromJsonObj(this.classConverter, param));
35
- }
36
- log.debug(format('JsonProxy:call', methodName, '<-', convertedParams));
37
- const rawRet = await this.handler[methodName](...convertedParams);
38
- let ret = rawRet;
39
- if (!skipConversion) {
40
- ret = convertToJsonObj(this.classConverter, rawRet);
41
- }
42
- log.debug(format('JsonProxy:call', methodName, '->', ret));
43
- return ret;
44
- }
45
- }
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbl9wcm94eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9qc29uLXJwYy9zZXJ2ZXIvanNvbl9wcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQWdFLE1BQU0sdUJBQXVCLENBQUM7QUFDckgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEQsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQVlyRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUVwQixZQUNVLE9BQWUsRUFDZixjQUF5QyxFQUN6QyxjQUF1QztRQUZ2QyxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsbUJBQWMsR0FBZCxjQUFjLENBQTJCO1FBQ3pDLG1CQUFjLEdBQWQsY0FBYyxDQUF5QjtRQUUvQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0Q7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFrQixFQUFFLGFBQW9CLEVBQUUsRUFBRSxjQUFjLEdBQUcsS0FBSztRQUNsRixHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUM1RCxrQ0FBa0M7UUFDbEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUscUJBQXFCLFVBQVUsYUFBYSxDQUFDLENBQUM7UUFDeEYsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsY0FBYyxVQUFVLHlCQUF5QixVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLHlEQUF5RDtRQUN6RCxJQUFJLGVBQWUsR0FBRyxVQUFVLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLGVBQWUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDdkUsTUFBTSxNQUFNLEdBQUcsTUFBTyxJQUFJLENBQUMsT0FBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUM7UUFDM0UsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixHQUFHLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIn0=
@@ -1,98 +0,0 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- import http from 'http';
3
- import Koa from 'koa';
4
- import Router from 'koa-router';
5
- import { type JsonClassConverterInput, type StringClassConverterInput } from '../class_converter.js';
6
- import { type ClassMaps, JsonProxy } from './json_proxy.js';
7
- /**
8
- * JsonRpcServer.
9
- * Minimal, dev-friendly mechanism to create a server from an object.
10
- */
11
- export declare class JsonRpcServer {
12
- private handler;
13
- private stringClassMap;
14
- private objectClassMap;
15
- /** List of methods to disallow from calling remotely */
16
- readonly disallowedMethods: string[];
17
- private log;
18
- /**
19
- * The proxy object.
20
- */
21
- proxy: JsonProxy;
22
- /**
23
- * The HTTP server accepting remote requests.
24
- * This member field is initialized when the server is started.
25
- */
26
- private httpServer?;
27
- constructor(handler: object, stringClassMap: StringClassConverterInput, objectClassMap: JsonClassConverterInput,
28
- /** List of methods to disallow from calling remotely */
29
- disallowedMethods?: string[], log?: import("../../log/logger.js").Logger);
30
- /**
31
- * Get an express app object.
32
- * @param prefix - Our server prefix.
33
- * @returns The app object.
34
- */
35
- getApp(prefix?: string): Koa<Koa.DefaultState, Koa.DefaultContext>;
36
- /**
37
- * Get a router object wrapping our RPC class.
38
- * @param prefix - The server prefix.
39
- * @returns The router object.
40
- */
41
- private getRouter;
42
- /**
43
- * Start this server with koa.
44
- * @param port - Port number.
45
- * @param prefix - Prefix string.
46
- */
47
- start(port: number, prefix?: string): void;
48
- /**
49
- * Stops the HTTP server
50
- */
51
- stop(): Promise<void>;
52
- /**
53
- * Get a list of methods.
54
- * @returns A list of methods.
55
- */
56
- getMethods(): string[];
57
- /**
58
- * Gets the class maps that were used to create the proxy.
59
- * @returns The string & object class maps.
60
- */
61
- getClassMaps(): ClassMaps;
62
- /**
63
- * Call an RPC method.
64
- * @param methodName - The RPC method.
65
- * @param jsonParams - The RPG parameters.
66
- * @param skipConversion - Whether to skip conversion of the parameters.
67
- * @returns The remote result.
68
- */
69
- call(methodName: string, jsonParams: any[] | undefined, skipConversion: boolean): Promise<any>;
70
- }
71
- /**
72
- * Creates a router for handling a plain status request that will return 200 status when running.
73
- * @param apiPrefix - The prefix to use for all api requests
74
- * @returns - The router for handling status requests.
75
- */
76
- export declare function createStatusRouter(apiPrefix?: string): Router<any, {}>;
77
- /**
78
- * Creates an http server that forwards calls to the underlying instance and starts it on the given port.
79
- * @param instance - Instance to wrap in a JSON-RPC server.
80
- * @param jsonRpcFactoryFunc - Function that wraps the instance in a JSON-RPC server.
81
- * @param port - Port to listen in.
82
- * @returns A running http server.
83
- */
84
- export declare function startHttpRpcServer<T>(name: string, instance: T, jsonRpcFactoryFunc: (instance: T) => JsonRpcServer, port: string | number): http.Server;
85
- /**
86
- * List of namespace to server instance.
87
- */
88
- export type ServerList = {
89
- /** name of the service to be used for namespacing */
90
- [name: string]: JsonRpcServer;
91
- }[];
92
- /**
93
- * Creates a single JsonRpcServer from multiple servers.
94
- * @param servers - List of servers to be combined into a single server, passed as ServerList.
95
- * @returns A single JsonRpcServer with namespaced methods.
96
- */
97
- export declare function createNamespacedJsonRpcServer(servers: ServerList, log?: import("../../log/logger.js").Logger): JsonRpcServer;
98
- //# sourceMappingURL=json_rpc_server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"json_rpc_server.d.ts","sourceRoot":"","sources":["../../../src/json-rpc/server/json_rpc_server.ts"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,OAAO,MAAM,MAAM,YAAY,CAAC;AAIhC,OAAO,EAAE,KAAK,uBAAuB,EAAE,KAAK,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAErG,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5D;;;GAGG;AACH,qBAAa,aAAa;IAatB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,cAAc;IACtB,wDAAwD;aACxC,iBAAiB,EAAE,MAAM,EAAE;IAC3C,OAAO,CAAC,GAAG;IAjBb;;OAEG;IACI,KAAK,EAAE,SAAS,CAAC;IAExB;;;OAGG;IACH,OAAO,CAAC,UAAU,CAAC,CAAc;gBAGvB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,yBAAyB,EACzC,cAAc,EAAE,uBAAuB;IAC/C,wDAAwD;IACxC,iBAAiB,GAAE,MAAM,EAAO,EACxC,GAAG,uCAAuC;IAKpD;;;;OAIG;IACI,MAAM,CAAC,MAAM,SAAK;IAkDzB;;;;OAIG;IACH,OAAO,CAAC,SAAS;IA8CjB;;;;OAIG;IACI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,IAAI;IAS7C;;OAEG;IACI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5B;;;OAGG;IACI,UAAU,IAAI,MAAM,EAAE;IAI7B;;;OAGG;IACI,YAAY,IAAI,SAAS;IAIhC;;;;;;OAMG;IACU,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,mBAAY,EAAE,cAAc,EAAE,OAAO;CAGtF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,SAAK,mBAMhD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,EACX,kBAAkB,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,aAAa,EAClD,IAAI,EAAE,MAAM,GAAG,MAAM,GACpB,IAAI,CAAC,MAAM,CAWb;AACD;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,qDAAqD;IACrD,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;CAC/B,EAAE,CAAC;AAEJ;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,UAAU,EACnB,GAAG,uCAA6C,GAC/C,aAAa,CAuCf"}
@@ -1,248 +0,0 @@
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 { createDebugLogger } from '../../log/index.js';
8
- import { promiseWithResolvers } from '../../promise/utils.js';
9
- import { convertBigintsInObj } from '../convert.js';
10
- import { JsonProxy } from './json_proxy.js';
11
- /**
12
- * JsonRpcServer.
13
- * Minimal, dev-friendly mechanism to create a server from an object.
14
- */
15
- export class JsonRpcServer {
16
- constructor(handler, stringClassMap, objectClassMap,
17
- /** List of methods to disallow from calling remotely */
18
- disallowedMethods = [], log = createDebugLogger('json-rpc:server')) {
19
- this.handler = handler;
20
- this.stringClassMap = stringClassMap;
21
- this.objectClassMap = objectClassMap;
22
- this.disallowedMethods = disallowedMethods;
23
- this.log = log;
24
- this.proxy = new JsonProxy(handler, stringClassMap, objectClassMap);
25
- }
26
- /**
27
- * Get an express app object.
28
- * @param prefix - Our server prefix.
29
- * @returns The app object.
30
- */
31
- getApp(prefix = '') {
32
- const router = this.getRouter(prefix);
33
- const exceptionHandler = async (ctx, next) => {
34
- try {
35
- await next();
36
- }
37
- catch (err) {
38
- this.log.error(err);
39
- if (err instanceof SyntaxError) {
40
- ctx.status = 400;
41
- ctx.body = {
42
- jsonrpc: '2.0',
43
- id: null,
44
- error: {
45
- code: -32700,
46
- message: 'Parse error',
47
- },
48
- };
49
- }
50
- else {
51
- ctx.status = 500;
52
- ctx.body = {
53
- jsonrpc: '2.0',
54
- id: null,
55
- error: {
56
- code: -32603,
57
- message: 'Internal error',
58
- },
59
- };
60
- }
61
- }
62
- };
63
- const app = new Koa();
64
- app.on('error', error => {
65
- this.log.error(`Error on API handler: ${error}`);
66
- });
67
- app.use(exceptionHandler);
68
- app.use(compress({ br: false }));
69
- app.use(bodyParser({
70
- jsonLimit: '50mb',
71
- enableTypes: ['json'],
72
- detectJSON: () => true,
73
- }));
74
- app.use(cors());
75
- app.use(router.routes());
76
- app.use(router.allowedMethods());
77
- return app;
78
- }
79
- /**
80
- * Get a router object wrapping our RPC class.
81
- * @param prefix - The server prefix.
82
- * @returns The router object.
83
- */
84
- getRouter(prefix) {
85
- const router = new Router({ prefix });
86
- const proto = Object.getPrototypeOf(this.handler);
87
- // "JSON RPC mode" where a single endpoint is used and the method is given in the request body
88
- router.post('/', async (ctx) => {
89
- const { params = [], jsonrpc, id, method } = ctx.request.body;
90
- // Ignore if not a function
91
- if (method === 'constructor' || typeof proto[method] !== 'function' || this.disallowedMethods.includes(method)) {
92
- ctx.status = 400;
93
- ctx.body = {
94
- jsonrpc,
95
- id,
96
- error: {
97
- code: -32601,
98
- message: `Method not found: ${method}`,
99
- },
100
- };
101
- }
102
- else {
103
- try {
104
- const result = await this.proxy.call(method, params);
105
- ctx.body = {
106
- jsonrpc,
107
- id,
108
- result: convertBigintsInObj(result),
109
- };
110
- ctx.status = 200;
111
- }
112
- catch (err) {
113
- // Propagate the error message to the client. Plenty of the errors are expected to occur (e.g. adding
114
- // a duplicate recipient) so this is necessary.
115
- ctx.status = 400;
116
- ctx.body = {
117
- jsonrpc,
118
- id,
119
- error: {
120
- // TODO assign error codes - https://github.com/AztecProtocol/aztec-packages/issues/2633
121
- code: -32000,
122
- message: err.message,
123
- },
124
- };
125
- }
126
- }
127
- });
128
- return router;
129
- }
130
- /**
131
- * Start this server with koa.
132
- * @param port - Port number.
133
- * @param prefix - Prefix string.
134
- */
135
- start(port, prefix = '') {
136
- if (this.httpServer) {
137
- throw new Error('Server is already listening');
138
- }
139
- this.httpServer = http.createServer(this.getApp(prefix).callback());
140
- this.httpServer.listen(port);
141
- }
142
- /**
143
- * Stops the HTTP server
144
- */
145
- stop() {
146
- if (!this.httpServer) {
147
- return Promise.resolve();
148
- }
149
- const { promise, resolve, reject } = promiseWithResolvers();
150
- this.httpServer.close(err => {
151
- if (err) {
152
- reject(err);
153
- }
154
- else {
155
- resolve();
156
- }
157
- });
158
- return promise;
159
- }
160
- /**
161
- * Get a list of methods.
162
- * @returns A list of methods.
163
- */
164
- getMethods() {
165
- return Object.getOwnPropertyNames(Object.getPrototypeOf(this.handler));
166
- }
167
- /**
168
- * Gets the class maps that were used to create the proxy.
169
- * @returns The string & object class maps.
170
- */
171
- getClassMaps() {
172
- return { stringClassMap: this.stringClassMap, objectClassMap: this.objectClassMap };
173
- }
174
- /**
175
- * Call an RPC method.
176
- * @param methodName - The RPC method.
177
- * @param jsonParams - The RPG parameters.
178
- * @param skipConversion - Whether to skip conversion of the parameters.
179
- * @returns The remote result.
180
- */
181
- async call(methodName, jsonParams = [], skipConversion) {
182
- return await this.proxy.call(methodName, jsonParams, skipConversion);
183
- }
184
- }
185
- /**
186
- * Creates a router for handling a plain status request that will return 200 status when running.
187
- * @param apiPrefix - The prefix to use for all api requests
188
- * @returns - The router for handling status requests.
189
- */
190
- export function createStatusRouter(apiPrefix = '') {
191
- const router = new Router({ prefix: `${apiPrefix}` });
192
- router.get('/status', (ctx) => {
193
- ctx.status = 200;
194
- });
195
- return router;
196
- }
197
- /**
198
- * Creates an http server that forwards calls to the underlying instance and starts it on the given port.
199
- * @param instance - Instance to wrap in a JSON-RPC server.
200
- * @param jsonRpcFactoryFunc - Function that wraps the instance in a JSON-RPC server.
201
- * @param port - Port to listen in.
202
- * @returns A running http server.
203
- */
204
- export function startHttpRpcServer(name, instance, jsonRpcFactoryFunc, port) {
205
- const rpcServer = jsonRpcFactoryFunc(instance);
206
- const namespacedServer = createNamespacedJsonRpcServer([{ [name]: rpcServer }]);
207
- const app = namespacedServer.getApp();
208
- const httpServer = http.createServer(app.callback());
209
- httpServer.listen(port);
210
- return httpServer;
211
- }
212
- /**
213
- * Creates a single JsonRpcServer from multiple servers.
214
- * @param servers - List of servers to be combined into a single server, passed as ServerList.
215
- * @returns A single JsonRpcServer with namespaced methods.
216
- */
217
- export function createNamespacedJsonRpcServer(servers, log = createDebugLogger('json-rpc:multi-server')) {
218
- const handler = {};
219
- const disallowedMethods = [];
220
- const classMapsArr = [];
221
- for (const serverEntry of servers) {
222
- const [namespace, server] = Object.entries(serverEntry)[0];
223
- const serverMethods = server.getMethods();
224
- for (const method of serverMethods) {
225
- const namespacedMethod = `${namespace}_${method}`;
226
- handler[namespacedMethod] = (...args) => {
227
- return server.call(method, args, true);
228
- };
229
- }
230
- // get the combined disallowed methods from all servers.
231
- disallowedMethods.push(...server.disallowedMethods.map(method => `${namespace}_${method}`));
232
- // get the combined classmaps from all servers.
233
- const classMap = server.getClassMaps();
234
- classMapsArr.push({
235
- stringClassMap: classMap.stringClassMap,
236
- objectClassMap: classMap.objectClassMap,
237
- });
238
- }
239
- // Get the combined stringClassMap & objectClassMap from all servers
240
- const classMaps = classMapsArr.reduce((acc, curr) => {
241
- return {
242
- stringClassMap: { ...acc.stringClassMap, ...curr.stringClassMap },
243
- objectClassMap: { ...acc.objectClassMap, ...curr.objectClassMap },
244
- };
245
- }, { stringClassMap: {}, objectClassMap: {} });
246
- return new JsonRpcServer(Object.create(handler), classMaps.stringClassMap, classMaps.objectClassMap, [], log);
247
- }
248
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbl9ycGNfc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2pzb24tcnBjL3NlcnZlci9qc29uX3JwY19zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDdEIsT0FBTyxVQUFVLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxRQUFRLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sTUFBTSxNQUFNLFlBQVksQ0FBQztBQUVoQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFrQixTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQVl4QixZQUNVLE9BQWUsRUFDZixjQUF5QyxFQUN6QyxjQUF1QztJQUMvQyx3REFBd0Q7SUFDeEMsb0JBQThCLEVBQUUsRUFDeEMsTUFBTSxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQztRQUwxQyxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsbUJBQWMsR0FBZCxjQUFjLENBQTJCO1FBQ3pDLG1CQUFjLEdBQWQsY0FBYyxDQUF5QjtRQUUvQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWU7UUFDeEMsUUFBRyxHQUFILEdBQUcsQ0FBdUM7UUFFbEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE1B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