@aztec/foundation 0.62.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 (140) 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/encoder.d.ts.map +1 -1
  5. package/dest/abi/encoder.js +4 -1
  6. package/dest/abi/event_selector.d.ts +4 -0
  7. package/dest/abi/event_selector.d.ts.map +1 -1
  8. package/dest/abi/event_selector.js +7 -1
  9. package/dest/aztec-address/index.d.ts +19 -3
  10. package/dest/aztec-address/index.d.ts.map +1 -1
  11. package/dest/aztec-address/index.js +43 -14
  12. package/dest/buffer/buffer32.d.ts +1 -0
  13. package/dest/buffer/buffer32.d.ts.map +1 -1
  14. package/dest/buffer/buffer32.js +4 -1
  15. package/dest/config/env_var.d.ts +1 -1
  16. package/dest/config/env_var.d.ts.map +1 -1
  17. package/dest/crypto/index.d.ts +1 -0
  18. package/dest/crypto/index.d.ts.map +1 -1
  19. package/dest/crypto/index.js +2 -1
  20. package/dest/crypto/keys/index.d.ts +5 -0
  21. package/dest/crypto/keys/index.d.ts.map +1 -0
  22. package/dest/crypto/keys/index.js +8 -0
  23. package/dest/eth-address/index.d.ts +2 -6
  24. package/dest/eth-address/index.d.ts.map +1 -1
  25. package/dest/eth-address/index.js +3 -7
  26. package/dest/eth-signature/eth_signature.d.ts +2 -0
  27. package/dest/eth-signature/eth_signature.d.ts.map +1 -1
  28. package/dest/eth-signature/eth_signature.js +7 -1
  29. package/dest/fields/fields.d.ts +1 -3
  30. package/dest/fields/fields.d.ts.map +1 -1
  31. package/dest/fields/fields.js +2 -1
  32. package/dest/json-rpc/client/fetch.d.ts +21 -0
  33. package/dest/json-rpc/client/fetch.d.ts.map +1 -0
  34. package/dest/json-rpc/client/fetch.js +66 -0
  35. package/dest/json-rpc/client/index.d.ts +2 -1
  36. package/dest/json-rpc/client/index.d.ts.map +1 -1
  37. package/dest/json-rpc/client/index.js +3 -2
  38. package/dest/json-rpc/client/safe_json_rpc_client.d.ts +13 -0
  39. package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -0
  40. package/dest/json-rpc/client/safe_json_rpc_client.js +45 -0
  41. package/dest/json-rpc/convert.d.ts +11 -19
  42. package/dest/json-rpc/convert.d.ts.map +1 -1
  43. package/dest/json-rpc/convert.js +30 -123
  44. package/dest/json-rpc/fixtures/test_state.d.ts +45 -3
  45. package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -1
  46. package/dest/json-rpc/fixtures/test_state.js +58 -2
  47. package/dest/json-rpc/index.d.ts +1 -2
  48. package/dest/json-rpc/index.d.ts.map +1 -1
  49. package/dest/json-rpc/index.js +2 -3
  50. package/dest/json-rpc/js_utils.d.ts.map +1 -1
  51. package/dest/json-rpc/js_utils.js +2 -1
  52. package/dest/json-rpc/server/index.d.ts +1 -2
  53. package/dest/json-rpc/server/index.d.ts.map +1 -1
  54. package/dest/json-rpc/server/index.js +2 -3
  55. package/dest/json-rpc/server/safe_json_rpc_server.d.ts +112 -0
  56. package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -0
  57. package/dest/json-rpc/server/safe_json_rpc_server.js +275 -0
  58. package/dest/json-rpc/test/index.d.ts +2 -0
  59. package/dest/json-rpc/test/index.d.ts.map +1 -0
  60. package/dest/json-rpc/test/index.js +2 -0
  61. package/dest/json-rpc/test/integration.d.ts +13 -0
  62. package/dest/json-rpc/test/integration.d.ts.map +1 -0
  63. package/dest/json-rpc/test/integration.js +12 -0
  64. package/dest/log/logger.d.ts.map +1 -1
  65. package/dest/log/logger.js +2 -2
  66. package/dest/schemas/api.d.ts +21 -0
  67. package/dest/schemas/api.d.ts.map +1 -0
  68. package/dest/schemas/api.js +8 -0
  69. package/dest/schemas/index.d.ts +6 -0
  70. package/dest/schemas/index.d.ts.map +1 -0
  71. package/dest/schemas/index.js +6 -0
  72. package/dest/schemas/parse.d.ts +9 -0
  73. package/dest/schemas/parse.d.ts.map +1 -0
  74. package/dest/schemas/parse.js +26 -0
  75. package/dest/schemas/schemas.d.ts +79 -0
  76. package/dest/schemas/schemas.d.ts.map +1 -0
  77. package/dest/schemas/schemas.js +87 -0
  78. package/dest/schemas/types.d.ts +3 -0
  79. package/dest/schemas/types.d.ts.map +1 -0
  80. package/dest/schemas/types.js +2 -0
  81. package/dest/schemas/utils.d.ts +40 -0
  82. package/dest/schemas/utils.d.ts.map +1 -0
  83. package/dest/schemas/utils.js +56 -0
  84. package/dest/string/index.d.ts +7 -0
  85. package/dest/string/index.d.ts.map +1 -0
  86. package/dest/string/index.js +13 -0
  87. package/dest/types/index.d.ts +2 -0
  88. package/dest/types/index.d.ts.map +1 -1
  89. package/dest/validation/index.d.ts +6 -0
  90. package/dest/validation/index.d.ts.map +1 -1
  91. package/dest/validation/index.js +11 -1
  92. package/package.json +7 -4
  93. package/src/abi/abi.ts +203 -233
  94. package/src/abi/encoder.ts +2 -0
  95. package/src/abi/event_selector.ts +7 -0
  96. package/src/aztec-address/index.ts +64 -18
  97. package/src/buffer/buffer32.ts +5 -0
  98. package/src/config/env_var.ts +18 -8
  99. package/src/crypto/index.ts +1 -0
  100. package/src/crypto/keys/index.ts +9 -0
  101. package/src/eth-address/index.ts +2 -6
  102. package/src/eth-signature/eth_signature.ts +8 -0
  103. package/src/fields/fields.ts +2 -3
  104. package/src/json-rpc/client/fetch.ts +81 -0
  105. package/src/json-rpc/client/index.ts +2 -1
  106. package/src/json-rpc/client/safe_json_rpc_client.ts +61 -0
  107. package/src/json-rpc/convert.ts +29 -142
  108. package/src/json-rpc/fixtures/test_state.ts +87 -3
  109. package/src/json-rpc/index.ts +1 -8
  110. package/src/json-rpc/js_utils.ts +1 -0
  111. package/src/json-rpc/server/index.ts +1 -2
  112. package/src/json-rpc/server/safe_json_rpc_server.ts +336 -0
  113. package/src/json-rpc/test/index.ts +1 -0
  114. package/src/json-rpc/test/integration.ts +24 -0
  115. package/src/log/logger.ts +2 -1
  116. package/src/schemas/api.ts +47 -0
  117. package/src/schemas/index.ts +5 -0
  118. package/src/schemas/parse.ts +29 -0
  119. package/src/schemas/schemas.ts +111 -0
  120. package/src/schemas/types.ts +3 -0
  121. package/src/schemas/utils.ts +85 -0
  122. package/src/string/index.ts +15 -0
  123. package/src/types/index.ts +3 -0
  124. package/src/validation/index.ts +11 -0
  125. package/dest/json-rpc/class_converter.d.ts +0 -144
  126. package/dest/json-rpc/class_converter.d.ts.map +0 -1
  127. package/dest/json-rpc/class_converter.js +0 -102
  128. package/dest/json-rpc/client/json_rpc_client.d.ts +0 -35
  129. package/dest/json-rpc/client/json_rpc_client.d.ts.map +0 -1
  130. package/dest/json-rpc/client/json_rpc_client.js +0 -117
  131. package/dest/json-rpc/server/json_proxy.d.ts +0 -30
  132. package/dest/json-rpc/server/json_proxy.d.ts.map +0 -1
  133. package/dest/json-rpc/server/json_proxy.js +0 -46
  134. package/dest/json-rpc/server/json_rpc_server.d.ts +0 -102
  135. package/dest/json-rpc/server/json_rpc_server.d.ts.map +0 -1
  136. package/dest/json-rpc/server/json_rpc_server.js +0 -265
  137. package/src/json-rpc/class_converter.ts +0 -213
  138. package/src/json-rpc/client/json_rpc_client.ts +0 -148
  139. package/src/json-rpc/server/json_proxy.ts +0 -60
  140. package/src/json-rpc/server/json_rpc_server.ts +0 -332
@@ -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,102 +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 healthCheck;
18
- private log;
19
- /**
20
- * The proxy object.
21
- */
22
- proxy: JsonProxy;
23
- /**
24
- * The HTTP server accepting remote requests.
25
- * This member field is initialized when the server is started.
26
- */
27
- private httpServer?;
28
- constructor(handler: object, stringClassMap: StringClassConverterInput, objectClassMap: JsonClassConverterInput,
29
- /** List of methods to disallow from calling remotely */
30
- disallowedMethods?: string[], healthCheck?: StatusCheckFn, log?: import("../../log/logger.js").Logger);
31
- isHealthy(): boolean | Promise<boolean>;
32
- /**
33
- * Get an express app object.
34
- * @param prefix - Our server prefix.
35
- * @returns The app object.
36
- */
37
- getApp(prefix?: string): Koa<Koa.DefaultState, Koa.DefaultContext>;
38
- /**
39
- * Get a router object wrapping our RPC class.
40
- * @param prefix - The server prefix.
41
- * @returns The router object.
42
- */
43
- private getRouter;
44
- /**
45
- * Start this server with koa.
46
- * @param port - Port number.
47
- * @param prefix - Prefix string.
48
- */
49
- start(port: number, prefix?: string): void;
50
- /**
51
- * Stops the HTTP server
52
- */
53
- stop(): Promise<void>;
54
- /**
55
- * Get a list of methods.
56
- * @returns A list of methods.
57
- */
58
- getMethods(): string[];
59
- /**
60
- * Gets the class maps that were used to create the proxy.
61
- * @returns The string & object class maps.
62
- */
63
- getClassMaps(): ClassMaps;
64
- /**
65
- * Call an RPC method.
66
- * @param methodName - The RPC method.
67
- * @param jsonParams - The RPG parameters.
68
- * @param skipConversion - Whether to skip conversion of the parameters.
69
- * @returns The remote result.
70
- */
71
- call(methodName: string, jsonParams: any[] | undefined, skipConversion: boolean): Promise<any>;
72
- }
73
- export type StatusCheckFn = () => boolean | Promise<boolean>;
74
- /**
75
- * Creates a router for handling a plain status request that will return 200 status when running.
76
- * @param getCurrentStatus - List of health check functions to run.
77
- * @param apiPrefix - The prefix to use for all api requests
78
- * @returns - The router for handling status requests.
79
- */
80
- export declare function createStatusRouter(getCurrentStatus: StatusCheckFn, apiPrefix?: string): Router<any, {}>;
81
- /**
82
- * Creates an http server that forwards calls to the underlying instance and starts it on the given port.
83
- * @param instance - Instance to wrap in a JSON-RPC server.
84
- * @param jsonRpcFactoryFunc - Function that wraps the instance in a JSON-RPC server.
85
- * @param port - Port to listen in.
86
- * @returns A running http server.
87
- */
88
- export declare function startHttpRpcServer<T>(name: string, instance: T, jsonRpcFactoryFunc: (instance: T) => JsonRpcServer, port: string | number): http.Server;
89
- /**
90
- * List of namespace to server instance.
91
- */
92
- export type ServerList = {
93
- /** name of the service to be used for namespacing */
94
- [name: string]: JsonRpcServer;
95
- }[];
96
- /**
97
- * Creates a single JsonRpcServer from multiple servers.
98
- * @param servers - List of servers to be combined into a single server, passed as ServerList.
99
- * @returns A single JsonRpcServer with namespaced methods.
100
- */
101
- export declare function createNamespacedJsonRpcServer(servers: ServerList, log?: import("../../log/logger.js").Logger): JsonRpcServer;
102
- //# 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,WAAW;IACnB,OAAO,CAAC,GAAG;IAlBb;;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,WAAW,GAAE,aAA0B,EACvC,GAAG,uCAAuC;IAK7C,SAAS,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAI9C;;;;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,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE7D;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,aAAa,EAAE,SAAS,SAAK,mBAajF;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,CAwDf"}
@@ -1,265 +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 = [], healthCheck = () => true, log = createDebugLogger('json-rpc:server')) {
19
- this.handler = handler;
20
- this.stringClassMap = stringClassMap;
21
- this.objectClassMap = objectClassMap;
22
- this.disallowedMethods = disallowedMethods;
23
- this.healthCheck = healthCheck;
24
- this.log = log;
25
- this.proxy = new JsonProxy(handler, stringClassMap, objectClassMap);
26
- }
27
- isHealthy() {
28
- return this.healthCheck();
29
- }
30
- /**
31
- * Get an express app object.
32
- * @param prefix - Our server prefix.
33
- * @returns The app object.
34
- */
35
- getApp(prefix = '') {
36
- const router = this.getRouter(prefix);
37
- const exceptionHandler = async (ctx, next) => {
38
- try {
39
- await next();
40
- }
41
- catch (err) {
42
- this.log.error(err);
43
- if (err instanceof SyntaxError) {
44
- ctx.status = 400;
45
- ctx.body = {
46
- jsonrpc: '2.0',
47
- id: null,
48
- error: {
49
- code: -32700,
50
- message: 'Parse error',
51
- },
52
- };
53
- }
54
- else {
55
- ctx.status = 500;
56
- ctx.body = {
57
- jsonrpc: '2.0',
58
- id: null,
59
- error: {
60
- code: -32603,
61
- message: 'Internal error',
62
- },
63
- };
64
- }
65
- }
66
- };
67
- const app = new Koa();
68
- app.on('error', error => {
69
- this.log.error(`Error on API handler: ${error}`);
70
- });
71
- app.use(exceptionHandler);
72
- app.use(compress({ br: false }));
73
- app.use(bodyParser({
74
- jsonLimit: '50mb',
75
- enableTypes: ['json'],
76
- detectJSON: () => true,
77
- }));
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
- const proto = Object.getPrototypeOf(this.handler);
91
- // "JSON RPC mode" where a single endpoint is used and the method is given in the request body
92
- router.post('/', async (ctx) => {
93
- const { params = [], jsonrpc, id, method } = ctx.request.body;
94
- // Ignore if not a function
95
- if (method === 'constructor' || typeof proto[method] !== 'function' || this.disallowedMethods.includes(method)) {
96
- ctx.status = 400;
97
- ctx.body = {
98
- jsonrpc,
99
- id,
100
- error: {
101
- code: -32601,
102
- message: `Method not found: ${method}`,
103
- },
104
- };
105
- }
106
- else {
107
- try {
108
- const result = await this.proxy.call(method, params);
109
- ctx.body = {
110
- jsonrpc,
111
- id,
112
- result: convertBigintsInObj(result),
113
- };
114
- ctx.status = 200;
115
- }
116
- catch (err) {
117
- // Propagate the error message to the client. Plenty of the errors are expected to occur (e.g. adding
118
- // a duplicate recipient) so this is necessary.
119
- ctx.status = 400;
120
- ctx.body = {
121
- jsonrpc,
122
- id,
123
- error: {
124
- // TODO assign error codes - https://github.com/AztecProtocol/aztec-packages/issues/2633
125
- code: -32000,
126
- message: err.message,
127
- },
128
- };
129
- }
130
- }
131
- });
132
- return router;
133
- }
134
- /**
135
- * Start this server with koa.
136
- * @param port - Port number.
137
- * @param prefix - Prefix string.
138
- */
139
- start(port, prefix = '') {
140
- if (this.httpServer) {
141
- throw new Error('Server is already listening');
142
- }
143
- this.httpServer = http.createServer(this.getApp(prefix).callback());
144
- this.httpServer.listen(port);
145
- }
146
- /**
147
- * Stops the HTTP server
148
- */
149
- stop() {
150
- if (!this.httpServer) {
151
- return Promise.resolve();
152
- }
153
- const { promise, resolve, reject } = promiseWithResolvers();
154
- this.httpServer.close(err => {
155
- if (err) {
156
- reject(err);
157
- }
158
- else {
159
- resolve();
160
- }
161
- });
162
- return promise;
163
- }
164
- /**
165
- * Get a list of methods.
166
- * @returns A list of methods.
167
- */
168
- getMethods() {
169
- return Object.getOwnPropertyNames(Object.getPrototypeOf(this.handler));
170
- }
171
- /**
172
- * Gets the class maps that were used to create the proxy.
173
- * @returns The string & object class maps.
174
- */
175
- getClassMaps() {
176
- return { stringClassMap: this.stringClassMap, objectClassMap: this.objectClassMap };
177
- }
178
- /**
179
- * Call an RPC method.
180
- * @param methodName - The RPC method.
181
- * @param jsonParams - The RPG parameters.
182
- * @param skipConversion - Whether to skip conversion of the parameters.
183
- * @returns The remote result.
184
- */
185
- async call(methodName, jsonParams = [], skipConversion) {
186
- return await this.proxy.call(methodName, jsonParams, skipConversion);
187
- }
188
- }
189
- /**
190
- * Creates a router for handling a plain status request that will return 200 status when running.
191
- * @param getCurrentStatus - List of health check functions to run.
192
- * @param apiPrefix - The prefix to use for all api requests
193
- * @returns - The router for handling status requests.
194
- */
195
- export function createStatusRouter(getCurrentStatus, apiPrefix = '') {
196
- const router = new Router({ prefix: `${apiPrefix}` });
197
- router.get('/status', async (ctx) => {
198
- let ok;
199
- try {
200
- ok = (await getCurrentStatus()) === true;
201
- }
202
- catch (err) {
203
- ok = false;
204
- }
205
- ctx.status = ok ? 200 : 500;
206
- });
207
- return router;
208
- }
209
- /**
210
- * Creates an http server that forwards calls to the underlying instance and starts it on the given port.
211
- * @param instance - Instance to wrap in a JSON-RPC server.
212
- * @param jsonRpcFactoryFunc - Function that wraps the instance in a JSON-RPC server.
213
- * @param port - Port to listen in.
214
- * @returns A running http server.
215
- */
216
- export function startHttpRpcServer(name, instance, jsonRpcFactoryFunc, port) {
217
- const rpcServer = jsonRpcFactoryFunc(instance);
218
- const namespacedServer = createNamespacedJsonRpcServer([{ [name]: rpcServer }]);
219
- const app = namespacedServer.getApp();
220
- const httpServer = http.createServer(app.callback());
221
- httpServer.listen(port);
222
- return httpServer;
223
- }
224
- /**
225
- * Creates a single JsonRpcServer from multiple servers.
226
- * @param servers - List of servers to be combined into a single server, passed as ServerList.
227
- * @returns A single JsonRpcServer with namespaced methods.
228
- */
229
- export function createNamespacedJsonRpcServer(servers, log = createDebugLogger('json-rpc:multi-server')) {
230
- const handler = {};
231
- const disallowedMethods = [];
232
- const classMapsArr = [];
233
- for (const serverEntry of servers) {
234
- const [namespace, server] = Object.entries(serverEntry)[0];
235
- const serverMethods = server.getMethods();
236
- for (const method of serverMethods) {
237
- const namespacedMethod = `${namespace}_${method}`;
238
- handler[namespacedMethod] = (...args) => {
239
- return server.call(method, args, true);
240
- };
241
- }
242
- // get the combined disallowed methods from all servers.
243
- disallowedMethods.push(...server.disallowedMethods.map(method => `${namespace}_${method}`));
244
- // get the combined classmaps from all servers.
245
- const classMap = server.getClassMaps();
246
- classMapsArr.push({
247
- stringClassMap: classMap.stringClassMap,
248
- objectClassMap: classMap.objectClassMap,
249
- });
250
- }
251
- // Get the combined stringClassMap & objectClassMap from all servers
252
- const classMaps = classMapsArr.reduce((acc, curr) => {
253
- return {
254
- stringClassMap: { ...acc.stringClassMap, ...curr.stringClassMap },
255
- objectClassMap: { ...acc.objectClassMap, ...curr.objectClassMap },
256
- };
257
- }, { stringClassMap: {}, objectClassMap: {} });
258
- const aggregateHealthCheck = async () => {
259
- const statuses = await Promise.allSettled(servers.flatMap(services => Object.entries(services).map(async ([name, service]) => ({ name, healthy: await service.isHealthy() }))));
260
- const allHealthy = statuses.every(result => result.status === 'fulfilled' && result.value.healthy);
261
- return allHealthy;
262
- };
263
- return new JsonRpcServer(Object.create(handler), classMaps.stringClassMap, classMaps.objectClassMap, [], aggregateHealthCheck, log);
264
- }
265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbl9ycGNfc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2pzb24tcnBjL3NlcnZlci9qc29uX3JwY19zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFDdEIsT0FBTyxVQUFVLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxRQUFRLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sTUFBTSxNQUFNLFlBQVksQ0FBQztBQUVoQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFrQixTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQVl4QixZQUNVLE9BQWUsRUFDZixjQUF5QyxFQUN6QyxjQUF1QztJQUMvQyx3REFBd0Q7SUFDeEMsb0JBQThCLEVBQUUsRUFDeEMsY0FBNkIsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUN2QyxNQUFNLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDO1FBTjFDLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixtQkFBYyxHQUFkLGNBQWMsQ0FBMkI7UUFDekMsbUJBQWMsR0FBZCxjQUFjLENBQXlCO1FBRS9CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBZTtRQUN4QyxnQkFBVyxHQUFYLFdBQVcsQ0FBNEI7UUFDdkMsUUFBRyxHQUFILEdBQUcsQ0FBdUM7UUFFbEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsY0FBYyxF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