@aztec/foundation 0.0.1-commit.f504929 → 0.0.1-commit.f5a9928

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 (288) hide show
  1. package/dest/bigint-buffer/index.d.ts +1 -1
  2. package/dest/bigint-buffer/index.d.ts.map +1 -1
  3. package/dest/bigint-buffer/index.js +6 -1
  4. package/dest/branded-types/block_number.d.ts +3 -3
  5. package/dest/branded-types/block_number.d.ts.map +1 -1
  6. package/dest/branded-types/block_number.js +15 -4
  7. package/dest/branded-types/buffer32_hash.d.ts +27 -0
  8. package/dest/branded-types/buffer32_hash.d.ts.map +1 -0
  9. package/dest/branded-types/buffer32_hash.js +12 -0
  10. package/dest/branded-types/checkpoint_number.d.ts +9 -3
  11. package/dest/branded-types/checkpoint_number.d.ts.map +1 -1
  12. package/dest/branded-types/checkpoint_number.js +11 -0
  13. package/dest/branded-types/epoch.d.ts +2 -2
  14. package/dest/branded-types/epoch.d.ts.map +1 -1
  15. package/dest/branded-types/index.d.ts +2 -1
  16. package/dest/branded-types/index.d.ts.map +1 -1
  17. package/dest/branded-types/index.js +1 -0
  18. package/dest/branded-types/index_within_checkpoint.d.ts +2 -2
  19. package/dest/branded-types/index_within_checkpoint.d.ts.map +1 -1
  20. package/dest/branded-types/slot.d.ts +5 -2
  21. package/dest/branded-types/slot.d.ts.map +1 -1
  22. package/dest/branded-types/slot.js +3 -0
  23. package/dest/buffer/buffer16.d.ts +3 -1
  24. package/dest/buffer/buffer16.d.ts.map +1 -1
  25. package/dest/buffer/buffer32.d.ts +28 -61
  26. package/dest/buffer/buffer32.d.ts.map +1 -1
  27. package/dest/buffer/buffer32.js +29 -63
  28. package/dest/buffer/index.d.ts +2 -1
  29. package/dest/buffer/index.d.ts.map +1 -1
  30. package/dest/buffer/index.js +1 -0
  31. package/dest/buffer/utils.d.ts +3 -0
  32. package/dest/buffer/utils.d.ts.map +1 -0
  33. package/dest/buffer/utils.js +7 -0
  34. package/dest/collection/array.d.ts +11 -1
  35. package/dest/collection/array.d.ts.map +1 -1
  36. package/dest/collection/array.js +33 -0
  37. package/dest/collection/index.d.ts +3 -1
  38. package/dest/collection/index.d.ts.map +1 -1
  39. package/dest/collection/index.js +2 -0
  40. package/dest/collection/lru_map.d.ts +41 -0
  41. package/dest/collection/lru_map.d.ts.map +1 -0
  42. package/dest/collection/lru_map.js +119 -0
  43. package/dest/collection/lru_set.d.ts +35 -0
  44. package/dest/collection/lru_set.d.ts.map +1 -0
  45. package/dest/collection/lru_set.js +95 -0
  46. package/dest/committable/committable.js +1 -1
  47. package/dest/config/env_var.d.ts +2 -2
  48. package/dest/config/env_var.d.ts.map +1 -1
  49. package/dest/config/index.d.ts +67 -37
  50. package/dest/config/index.d.ts.map +1 -1
  51. package/dest/config/index.js +72 -71
  52. package/dest/config/network_config.d.ts +13 -45
  53. package/dest/config/network_config.d.ts.map +1 -1
  54. package/dest/config/network_config.js +3 -1
  55. package/dest/config/network_name.d.ts +2 -2
  56. package/dest/config/network_name.d.ts.map +1 -1
  57. package/dest/config/network_name.js +1 -3
  58. package/dest/config/secret_value.d.ts +2 -2
  59. package/dest/config/secret_value.d.ts.map +1 -1
  60. package/dest/crypto/aes128/index.d.ts +2 -1
  61. package/dest/crypto/aes128/index.d.ts.map +1 -1
  62. package/dest/crypto/aes128/index.js +11 -2
  63. package/dest/crypto/bls/bn254_keystore.d.ts +10 -177
  64. package/dest/crypto/bls/bn254_keystore.d.ts.map +1 -1
  65. package/dest/crypto/bls/bn254_keystore.js +22 -34
  66. package/dest/crypto/poseidon/index.d.ts +1 -1
  67. package/dest/crypto/poseidon/index.d.ts.map +1 -1
  68. package/dest/crypto/poseidon/index.js +40 -33
  69. package/dest/crypto/schnorr/index.d.ts +8 -7
  70. package/dest/crypto/schnorr/index.d.ts.map +1 -1
  71. package/dest/crypto/schnorr/index.js +6 -6
  72. package/dest/crypto/schnorr/signature.d.ts +9 -29
  73. package/dest/crypto/schnorr/signature.d.ts.map +1 -1
  74. package/dest/crypto/schnorr/signature.js +20 -36
  75. package/dest/curves/bls12/field.d.ts +3 -3
  76. package/dest/curves/bls12/field.d.ts.map +1 -1
  77. package/dest/curves/bls12/field.js +0 -5
  78. package/dest/curves/bls12/point.d.ts +2 -2
  79. package/dest/curves/bls12/point.d.ts.map +1 -1
  80. package/dest/curves/bn254/field.d.ts +23 -19
  81. package/dest/curves/bn254/field.d.ts.map +1 -1
  82. package/dest/curves/bn254/field.js +23 -17
  83. package/dest/curves/grumpkin/point.d.ts +14 -28
  84. package/dest/curves/grumpkin/point.d.ts.map +1 -1
  85. package/dest/curves/grumpkin/point.js +29 -43
  86. package/dest/eth-address/index.d.ts +2 -2
  87. package/dest/eth-address/index.d.ts.map +1 -1
  88. package/dest/eth-address/index.js +0 -3
  89. package/dest/eth-signature/eth_signature.d.ts +2 -2
  90. package/dest/eth-signature/eth_signature.d.ts.map +1 -1
  91. package/dest/fifo/fifo_frame_reader.d.ts +41 -0
  92. package/dest/fifo/fifo_frame_reader.d.ts.map +1 -0
  93. package/dest/fifo/fifo_frame_reader.js +74 -0
  94. package/dest/fifo/index.d.ts +2 -0
  95. package/dest/fifo/index.d.ts.map +1 -0
  96. package/dest/fifo/index.js +1 -0
  97. package/dest/fifo_set/fifo_set.d.ts +15 -0
  98. package/dest/fifo_set/fifo_set.d.ts.map +1 -0
  99. package/dest/fifo_set/fifo_set.js +39 -0
  100. package/dest/fifo_set/index.d.ts +2 -0
  101. package/dest/fifo_set/index.d.ts.map +1 -0
  102. package/dest/fifo_set/index.js +1 -0
  103. package/dest/iterable/first.d.ts +8 -0
  104. package/dest/iterable/first.d.ts.map +1 -0
  105. package/dest/iterable/first.js +11 -0
  106. package/dest/iterable/index.d.ts +2 -1
  107. package/dest/iterable/index.d.ts.map +1 -1
  108. package/dest/iterable/index.js +1 -0
  109. package/dest/json-rpc/client/fetch.d.ts +8 -3
  110. package/dest/json-rpc/client/fetch.d.ts.map +1 -1
  111. package/dest/json-rpc/client/fetch.js +11 -7
  112. package/dest/json-rpc/client/safe_json_rpc_client.d.ts +1 -1
  113. package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -1
  114. package/dest/json-rpc/client/safe_json_rpc_client.js +2 -2
  115. package/dest/json-rpc/client/undici.d.ts +14 -3
  116. package/dest/json-rpc/client/undici.d.ts.map +1 -1
  117. package/dest/json-rpc/client/undici.js +47 -14
  118. package/dest/json-rpc/fixtures/test_state.d.ts +4 -8
  119. package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -1
  120. package/dest/json-rpc/fixtures/test_state.js +57 -17
  121. package/dest/json-rpc/server/safe_json_rpc_server.d.ts +49 -11
  122. package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -1
  123. package/dest/json-rpc/server/safe_json_rpc_server.js +159 -40
  124. package/dest/log/aws-logger-config.d.ts +8 -0
  125. package/dest/log/aws-logger-config.d.ts.map +1 -0
  126. package/dest/log/aws-logger-config.js +55 -0
  127. package/dest/log/pino-logger.d.ts +1 -1
  128. package/dest/log/pino-logger.d.ts.map +1 -1
  129. package/dest/log/pino-logger.js +29 -8
  130. package/dest/noir/noir_package_config.d.ts +19 -104
  131. package/dest/noir/noir_package_config.d.ts.map +1 -1
  132. package/dest/noir/noir_package_config.js +1 -1
  133. package/dest/promise/running-promise.d.ts +8 -2
  134. package/dest/promise/running-promise.d.ts.map +1 -1
  135. package/dest/promise/running-promise.js +17 -5
  136. package/dest/promise/utils.d.ts +14 -1
  137. package/dest/promise/utils.d.ts.map +1 -1
  138. package/dest/promise/utils.js +20 -0
  139. package/dest/queue/batch_queue.d.ts +1 -1
  140. package/dest/queue/batch_queue.d.ts.map +1 -1
  141. package/dest/queue/batch_queue.js +1 -0
  142. package/dest/retry/index.d.ts +31 -3
  143. package/dest/retry/index.d.ts.map +1 -1
  144. package/dest/retry/index.js +44 -2
  145. package/dest/schemas/api.d.ts +12 -10
  146. package/dest/schemas/api.d.ts.map +1 -1
  147. package/dest/schemas/api.js +7 -1
  148. package/dest/schemas/parse.d.ts +4 -4
  149. package/dest/schemas/parse.d.ts.map +1 -1
  150. package/dest/schemas/parse.js +6 -5
  151. package/dest/schemas/schemas.d.ts +15 -15
  152. package/dest/schemas/types.d.ts +3 -3
  153. package/dest/schemas/types.d.ts.map +1 -1
  154. package/dest/schemas/utils.d.ts +7 -11
  155. package/dest/schemas/utils.d.ts.map +1 -1
  156. package/dest/schemas/utils.js +2 -18
  157. package/dest/serialize/buffer_reader.d.ts +1 -1
  158. package/dest/serialize/buffer_reader.d.ts.map +1 -1
  159. package/dest/serialize/buffer_reader.js +5 -0
  160. package/dest/serialize/buffer_sink.d.ts +134 -0
  161. package/dest/serialize/buffer_sink.d.ts.map +1 -0
  162. package/dest/serialize/buffer_sink.js +297 -0
  163. package/dest/serialize/index.d.ts +2 -1
  164. package/dest/serialize/index.d.ts.map +1 -1
  165. package/dest/serialize/index.js +1 -0
  166. package/dest/serialize/serialize.d.ts +1 -32
  167. package/dest/serialize/serialize.d.ts.map +1 -1
  168. package/dest/serialize/serialize.js +0 -21
  169. package/dest/string/index.js +1 -1
  170. package/dest/testing/files/index.d.ts +2 -3
  171. package/dest/testing/files/index.d.ts.map +1 -1
  172. package/dest/testing/files/index.js +1 -2
  173. package/dest/timer/index.d.ts +2 -2
  174. package/dest/timer/index.d.ts.map +1 -1
  175. package/dest/timer/index.js +1 -1
  176. package/dest/timer/timeout.d.ts +3 -1
  177. package/dest/timer/timeout.d.ts.map +1 -1
  178. package/dest/timer/timeout.js +26 -0
  179. package/dest/transport/dispatch/create_dispatch_proxy.d.ts +11 -2
  180. package/dest/transport/dispatch/create_dispatch_proxy.d.ts.map +1 -1
  181. package/dest/transport/index.d.ts +1 -2
  182. package/dest/transport/index.d.ts.map +1 -1
  183. package/dest/transport/index.js +0 -1
  184. package/dest/trees/balanced_merkle_tree_root.d.ts +2 -3
  185. package/dest/trees/balanced_merkle_tree_root.d.ts.map +1 -1
  186. package/dest/trees/balanced_merkle_tree_root.js +2 -3
  187. package/dest/trees/hasher.d.ts +3 -2
  188. package/dest/trees/hasher.d.ts.map +1 -1
  189. package/dest/trees/hasher.js +5 -5
  190. package/dest/trees/indexed_merkle_tree_calculator.d.ts +1 -1
  191. package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -1
  192. package/dest/trees/indexed_merkle_tree_calculator.js +5 -1
  193. package/dest/trees/membership_witness.d.ts +2 -6
  194. package/dest/trees/membership_witness.d.ts.map +1 -1
  195. package/dest/trees/membership_witness.js +0 -9
  196. package/dest/trees/merkle_tree_calculator.d.ts +4 -2
  197. package/dest/trees/merkle_tree_calculator.d.ts.map +1 -1
  198. package/dest/trees/merkle_tree_calculator.js +1 -5
  199. package/dest/trees/sibling_path.d.ts +13 -14
  200. package/dest/trees/sibling_path.d.ts.map +1 -1
  201. package/dest/trees/sibling_path.js +23 -28
  202. package/dest/trees/unbalanced_merkle_tree_root.d.ts +2 -3
  203. package/dest/trees/unbalanced_merkle_tree_root.d.ts.map +1 -1
  204. package/dest/trees/unbalanced_merkle_tree_root.js +2 -3
  205. package/dest/types/index.d.ts +23 -1
  206. package/dest/types/index.d.ts.map +1 -1
  207. package/dest/types/index.js +15 -0
  208. package/package.json +6 -4
  209. package/src/bigint-buffer/index.ts +6 -1
  210. package/src/branded-types/block_number.ts +20 -2
  211. package/src/branded-types/buffer32_hash.ts +38 -0
  212. package/src/branded-types/checkpoint_number.ts +16 -1
  213. package/src/branded-types/epoch.ts +1 -1
  214. package/src/branded-types/index.ts +1 -0
  215. package/src/branded-types/index_within_checkpoint.ts +1 -1
  216. package/src/branded-types/slot.ts +6 -1
  217. package/src/buffer/buffer16.ts +3 -0
  218. package/src/buffer/buffer32.ts +39 -68
  219. package/src/buffer/index.ts +1 -0
  220. package/src/buffer/utils.ts +8 -0
  221. package/src/collection/array.ts +34 -0
  222. package/src/collection/index.ts +2 -0
  223. package/src/collection/lru_map.ts +143 -0
  224. package/src/collection/lru_set.ts +115 -0
  225. package/src/committable/committable.ts +1 -1
  226. package/src/config/env_var.ts +65 -25
  227. package/src/config/index.ts +143 -122
  228. package/src/config/network_config.ts +2 -0
  229. package/src/config/network_name.ts +2 -5
  230. package/src/config/secret_value.ts +1 -1
  231. package/src/crypto/aes128/index.ts +11 -2
  232. package/src/crypto/bls/bn254_keystore.ts +33 -43
  233. package/src/crypto/poseidon/index.ts +42 -34
  234. package/src/crypto/schnorr/index.ts +9 -8
  235. package/src/crypto/schnorr/signature.ts +17 -46
  236. package/src/curves/bls12/field.ts +0 -7
  237. package/src/curves/bn254/field.ts +35 -34
  238. package/src/curves/grumpkin/point.ts +23 -40
  239. package/src/eth-address/index.ts +0 -4
  240. package/src/fifo/fifo_frame_reader.ts +98 -0
  241. package/src/fifo/index.ts +1 -0
  242. package/src/fifo_set/fifo_set.ts +52 -0
  243. package/src/fifo_set/index.ts +1 -0
  244. package/src/iterable/first.ts +14 -0
  245. package/src/iterable/index.ts +1 -0
  246. package/src/json-rpc/client/fetch.ts +19 -5
  247. package/src/json-rpc/client/safe_json_rpc_client.ts +2 -2
  248. package/src/json-rpc/client/undici.ts +54 -12
  249. package/src/json-rpc/fixtures/test_state.ts +10 -10
  250. package/src/json-rpc/server/safe_json_rpc_server.ts +204 -47
  251. package/src/log/aws-logger-config.ts +32 -0
  252. package/src/log/pino-logger.ts +33 -6
  253. package/src/noir/noir_package_config.ts +32 -20
  254. package/src/promise/running-promise.ts +20 -7
  255. package/src/promise/utils.ts +31 -0
  256. package/src/queue/batch_queue.ts +1 -0
  257. package/src/retry/index.ts +66 -4
  258. package/src/schemas/api.ts +25 -25
  259. package/src/schemas/parse.ts +9 -6
  260. package/src/schemas/schemas.ts +4 -4
  261. package/src/schemas/types.ts +2 -2
  262. package/src/schemas/utils.ts +4 -38
  263. package/src/serialize/buffer_reader.ts +5 -0
  264. package/src/serialize/buffer_sink.ts +350 -0
  265. package/src/serialize/index.ts +1 -0
  266. package/src/serialize/serialize.ts +0 -50
  267. package/src/string/index.ts +1 -1
  268. package/src/testing/files/index.ts +1 -2
  269. package/src/timer/index.ts +1 -1
  270. package/src/timer/timeout.ts +31 -0
  271. package/src/transport/dispatch/create_dispatch_proxy.ts +11 -1
  272. package/src/transport/index.ts +0 -1
  273. package/src/trees/balanced_merkle_tree_root.ts +2 -5
  274. package/src/trees/hasher.ts +6 -3
  275. package/src/trees/indexed_merkle_tree_calculator.ts +5 -1
  276. package/src/trees/membership_witness.ts +0 -8
  277. package/src/trees/merkle_tree_calculator.ts +4 -10
  278. package/src/trees/sibling_path.ts +24 -30
  279. package/src/trees/unbalanced_merkle_tree_root.ts +2 -5
  280. package/src/types/index.ts +47 -0
  281. package/dest/crypto/serialize.d.ts +0 -51
  282. package/dest/crypto/serialize.d.ts.map +0 -1
  283. package/dest/crypto/serialize.js +0 -68
  284. package/dest/transport/dispatch/create_dispatch_fn.d.ts +0 -25
  285. package/dest/transport/dispatch/create_dispatch_fn.d.ts.map +0 -1
  286. package/dest/transport/dispatch/create_dispatch_fn.js +0 -17
  287. package/src/crypto/serialize.ts +0 -85
  288. package/src/transport/dispatch/create_dispatch_fn.ts +0 -35
@@ -8,40 +8,71 @@ import { format, inspect } from 'util';
8
8
  import { ZodError } from 'zod';
9
9
  import { createLogger } from '../../log/index.js';
10
10
  import { promiseWithResolvers } from '../../promise/utils.js';
11
- import { parseWithOptionals, schemaHasMethod } from '../../schemas/index.js';
11
+ import { getSchemaParameters, parseWithOptionals, schemaHasMethod } from '../../schemas/index.js';
12
+ import { Timer } from '../../timer/index.js';
12
13
  import { jsonStringify } from '../convert.js';
13
14
  import { assert } from '../js_utils.js';
14
15
  const defaultServerConfig = {
15
16
  http200OnError: false,
16
17
  maxBatchSize: 100,
17
- maxBodySizeBytes: '1mb'
18
+ maxBodySizeBytes: '1mb',
19
+ corsAllowedOrigins: [],
20
+ corsAllowedHeaders: []
18
21
  };
22
+ function normalizeCorsOrigin(origin) {
23
+ if (origin === '*') {
24
+ return origin;
25
+ }
26
+ const url = new URL(origin);
27
+ if (![
28
+ 'http:',
29
+ 'https:'
30
+ ].includes(url.protocol)) {
31
+ throw new Error(`Invalid CORS origin protocol: ${origin}`);
32
+ }
33
+ if (url.username || url.password || url.pathname !== '' && url.pathname !== '/' || url.search || url.hash) {
34
+ throw new Error(`CORS allowed origin must not include credentials, a path, query parameters, or a fragment: ${origin}`);
35
+ }
36
+ return url.origin;
37
+ }
19
38
  export class SafeJsonRpcServer {
20
39
  proxy;
21
40
  healthCheck;
22
41
  extraMiddlewares;
42
+ diagnosticsMiddleware;
23
43
  log;
24
44
  /**
25
45
  * The HTTP server accepting remote requests.
26
46
  * This member field is initialized when the server is started.
27
47
  */ httpServer;
28
48
  config;
29
- constructor(/** The proxy object to delegate requests to */ proxy, config = {}, /** Health check function */ healthCheck = ()=>true, /** Additional middlewares */ extraMiddlewares = [], /** Logger */ log = createLogger('json-rpc:server')){
49
+ constructor(/** The proxy object to delegate requests to */ proxy, config = {}, /** Health check function */ healthCheck = ()=>true, /** Additional Koa middlewares */ extraMiddlewares = [], /** Additional per-request diagnostics middlewares */ diagnosticsMiddleware, /** Logger */ log = createLogger('json-rpc:server')){
30
50
  this.proxy = proxy;
31
51
  this.healthCheck = healthCheck;
32
52
  this.extraMiddlewares = extraMiddlewares;
53
+ this.diagnosticsMiddleware = diagnosticsMiddleware;
33
54
  this.log = log;
34
55
  this.config = {
35
56
  ...defaultServerConfig,
36
57
  ...config
37
58
  };
59
+ this.config.corsAllowedOrigins = this.config.corsAllowedOrigins.map(normalizeCorsOrigin);
38
60
  // handle empty string
39
61
  if (!this.config.maxBodySizeBytes) {
40
62
  this.config.maxBodySizeBytes = defaultServerConfig.maxBodySizeBytes;
41
63
  }
42
64
  }
65
+ /** Returns the status of this server, including per-component health when the health check reports it. */ getStatus() {
66
+ return Promise.resolve(this.healthCheck()).then((result)=>{
67
+ const { healthy, details } = normalizeStatusCheckResult(result);
68
+ return {
69
+ ok: healthy,
70
+ ...details
71
+ };
72
+ });
73
+ }
43
74
  isHealthy() {
44
- return this.healthCheck();
75
+ return this.getStatus().then((status)=>status.ok);
45
76
  }
46
77
  /**
47
78
  * Get an express app object.
@@ -81,7 +112,7 @@ export class SafeJsonRpcServer {
81
112
  jsonrpc: '2.0',
82
113
  id: null,
83
114
  error: {
84
- code: -32600,
115
+ code: -32603,
85
116
  message: err.message ?? 'Internal error'
86
117
  }
87
118
  };
@@ -113,6 +144,32 @@ export class SafeJsonRpcServer {
113
144
  br: false
114
145
  }));
115
146
  app.use(jsonResponse);
147
+ const corsAllowedHeaders = this.config.corsAllowedHeaders.length > 0 ? {
148
+ allowHeaders: this.config.corsAllowedHeaders
149
+ } : {};
150
+ if (this.config.corsAllowedOrigins.length === 0) {
151
+ app.use(cors(corsAllowedHeaders));
152
+ } else {
153
+ const allowedOrigins = new Set(this.config.corsAllowedOrigins);
154
+ const allowAnyOrigin = allowedOrigins.has('*');
155
+ app.use(cors({
156
+ origin: (ctx)=>{
157
+ const origin = ctx.get('Origin');
158
+ if (!origin) {
159
+ return '';
160
+ }
161
+ if (allowAnyOrigin) {
162
+ return origin;
163
+ }
164
+ if (allowedOrigins.has(origin)) {
165
+ return origin;
166
+ }
167
+ return '';
168
+ },
169
+ credentials: true,
170
+ ...corsAllowedHeaders
171
+ }));
172
+ }
116
173
  for (const middleware of this.extraMiddlewares){
117
174
  app.use(middleware);
118
175
  }
@@ -123,7 +180,6 @@ export class SafeJsonRpcServer {
123
180
  'json'
124
181
  ]
125
182
  }));
126
- app.use(cors());
127
183
  app.use(router.routes());
128
184
  app.use(router.allowedMethods());
129
185
  return app;
@@ -151,7 +207,7 @@ export class SafeJsonRpcServer {
151
207
  };
152
208
  return;
153
209
  }
154
- const resp = await this.processBatch(ctx.request.body);
210
+ const resp = await this.processBatch(ctx.request.body, ctx.request.headers);
155
211
  if (Array.isArray(resp)) {
156
212
  ctx.status = 200;
157
213
  ctx.body = resp;
@@ -160,7 +216,7 @@ export class SafeJsonRpcServer {
160
216
  ctx.body = resp;
161
217
  }
162
218
  } else {
163
- const resp = await this.processRequest(ctx.request.body);
219
+ const resp = await this.processRequest(ctx.request.body, ctx.request.headers);
164
220
  if ('error' in resp) {
165
221
  ctx.status = this.config.http200OnError ? 200 : 400;
166
222
  }
@@ -169,7 +225,7 @@ export class SafeJsonRpcServer {
169
225
  });
170
226
  return router;
171
227
  }
172
- async processBatch(requests) {
228
+ async processBatch(requests, headers = {}) {
173
229
  if (requests.length === 0) {
174
230
  return {
175
231
  jsonrpc: '2.0',
@@ -180,7 +236,7 @@ export class SafeJsonRpcServer {
180
236
  id: null
181
237
  };
182
238
  }
183
- const results = await Promise.allSettled(requests.map((req)=>this.processRequest(req)));
239
+ const results = await Promise.allSettled(requests.map((req)=>this.processRequest(req, headers)));
184
240
  return results.map((res)=>{
185
241
  if (res.status === 'fulfilled') {
186
242
  return res.value;
@@ -189,14 +245,14 @@ export class SafeJsonRpcServer {
189
245
  return {
190
246
  jsonrpc: '2.0',
191
247
  error: {
192
- code: -32600,
193
- message: 'Invalid Request'
248
+ code: -32603,
249
+ message: 'Internal error'
194
250
  },
195
251
  id: null
196
252
  };
197
253
  });
198
254
  }
199
- async processRequest(request) {
255
+ async processRequest(request, headers = {}) {
200
256
  if (!request || typeof request !== 'object') {
201
257
  return {
202
258
  jsonrpc: '2.0',
@@ -230,11 +286,31 @@ export class SafeJsonRpcServer {
230
286
  };
231
287
  } else {
232
288
  try {
233
- const result = await this.proxy.call(method, params);
289
+ let result;
290
+ if (this.diagnosticsMiddleware) {
291
+ const diagnosticsData = {
292
+ id: id ?? null,
293
+ method,
294
+ params,
295
+ headers
296
+ };
297
+ await this.diagnosticsMiddleware(diagnosticsData, async ()=>{
298
+ result = await this.proxy.call(method, params, (durationMs, succeeded)=>{
299
+ diagnosticsData.requestValidationDurationMs = durationMs;
300
+ diagnosticsData.requestValidationSucceeded = succeeded;
301
+ });
302
+ });
303
+ } else {
304
+ result = await this.proxy.call(method, params);
305
+ }
306
+ // Coerce an undefined return value to null so the response always carries a `result` key.
307
+ // JSON.stringify drops undefined-valued keys, which would otherwise produce a JSON-RPC
308
+ // response with neither `result` nor `error` — a spec violation that leaves callers unable
309
+ // to distinguish "not found" from a malformed response.
234
310
  return {
235
311
  jsonrpc,
236
312
  id,
237
- result
313
+ result: result ?? null
238
314
  };
239
315
  } catch (err) {
240
316
  if (err && err instanceof ZodError) {
@@ -307,6 +383,11 @@ export class SafeJsonRpcServer {
307
383
  return await this.proxy.call(methodName, jsonParams);
308
384
  }
309
385
  }
386
+ function normalizeStatusCheckResult(result) {
387
+ return typeof result === 'boolean' ? {
388
+ healthy: result
389
+ } : result;
390
+ }
310
391
  /**
311
392
  * Forwards calls to a handler. Relies on a schema definition to validate and convert inputs
312
393
  * before forwarding calls, and then converts outputs into JSON using default conversions.
@@ -324,13 +405,21 @@ export class SafeJsonRpcServer {
324
405
  * @param methodName - The RPC method.
325
406
  * @param jsonParams - The RPC parameters.
326
407
  * @returns The remote result.
327
- */ async call(methodName, jsonParams = []) {
408
+ */ async call(methodName, jsonParams = [], onRequestValidated) {
328
409
  this.log.debug(format(`request`, methodName, jsonParams));
329
- assert(Array.isArray(jsonParams), `Params to ${methodName} is not an array: ${jsonParams}`);
330
410
  assert(schemaHasMethod(this.schema, methodName), `Method ${methodName} not found in schema`);
331
411
  const method = this.handler[methodName];
332
412
  assert(typeof method === 'function', `Method ${methodName} is not a function`);
333
- const args = await parseWithOptionals(jsonParams, this.schema[methodName].parameters());
413
+ const validationTimer = new Timer();
414
+ let args;
415
+ try {
416
+ assert(Array.isArray(jsonParams), `Params to ${methodName} is not an array: ${jsonParams}`);
417
+ args = await parseWithOptionals(jsonParams, getSchemaParameters(this.schema[methodName]));
418
+ onRequestValidated?.(validationTimer.ms(), true);
419
+ } catch (error) {
420
+ onRequestValidated?.(validationTimer.ms(), false);
421
+ throw error;
422
+ }
334
423
  const ret = await method.apply(this.handler, args);
335
424
  this.log.debug(format('response', methodName, ret));
336
425
  return ret;
@@ -346,12 +435,12 @@ class NamespacedSafeJsonProxy {
346
435
  this.proxies[namespace] = new SafeJsonProxy(handler, schema);
347
436
  }
348
437
  }
349
- call(namespacedMethodName, jsonParams = []) {
438
+ call(namespacedMethodName, jsonParams = [], onRequestValidated) {
350
439
  const [namespace, methodName] = namespacedMethodName.split('_', 2);
351
440
  assert(namespace && methodName, `Invalid namespaced method name: ${namespacedMethodName}`);
352
441
  const handler = this.proxies[namespace];
353
442
  assert(handler, `Namespace not found: ${namespace}`);
354
- return handler.call(methodName, jsonParams);
443
+ return handler.call(methodName, jsonParams, onRequestValidated);
355
444
  }
356
445
  hasMethod(namespacedMethodName) {
357
446
  const [namespace, methodName] = namespacedMethodName.split('_', 2);
@@ -368,19 +457,34 @@ export function makeHandler(handler, schema) {
368
457
  function makeAggregateHealthcheck(namedHandlers, log) {
369
458
  return async ()=>{
370
459
  try {
371
- const results = await Promise.all(Object.entries(namedHandlers).map(async ([name, [, , healthCheck]])=>[
460
+ const entries = await Promise.all(Object.entries(namedHandlers).map(async ([name, [, , healthCheck]])=>{
461
+ const { healthy, details } = normalizeStatusCheckResult(healthCheck ? await healthCheck() : true);
462
+ return [
372
463
  name,
373
- healthCheck ? await healthCheck() : true
374
- ]));
375
- const failed = results.filter(([_, result])=>!result);
464
+ {
465
+ healthy,
466
+ ...details
467
+ }
468
+ ];
469
+ }));
470
+ const components = Object.fromEntries(entries);
471
+ const failed = entries.filter(([, status])=>!status.healthy).map(([name])=>name);
376
472
  if (failed.length > 0) {
377
- log?.warn(`Health check failed for ${failed.map(([name])=>name).join(', ')}`);
378
- return false;
473
+ log?.warn(`Health check failed for ${failed.join(', ')}`, {
474
+ components
475
+ });
379
476
  }
380
- return true;
477
+ return {
478
+ healthy: failed.length === 0,
479
+ details: {
480
+ components
481
+ }
482
+ };
381
483
  } catch (err) {
382
484
  log?.error(`Error during health check`, err);
383
- return false;
485
+ return {
486
+ healthy: false
487
+ };
384
488
  }
385
489
  };
386
490
  }
@@ -389,19 +493,20 @@ function makeAggregateHealthcheck(namedHandlers, log) {
389
493
  * @param servers - List of handlers to be combined.
390
494
  * @returns A single JsonRpcServer with namespaced methods.
391
495
  */ export function createNamespacedSafeJsonRpcServer(handlers, options = {}) {
392
- const { middlewares, log } = options;
496
+ const { diagnostic, middlewares, log } = options;
393
497
  const proxy = new NamespacedSafeJsonProxy(handlers);
394
498
  const healthCheck = makeAggregateHealthcheck(handlers, log);
395
- return new SafeJsonRpcServer(proxy, options, healthCheck, middlewares, log);
499
+ return new SafeJsonRpcServer(proxy, options, healthCheck, middlewares, diagnostic, log);
396
500
  }
397
501
  export function createSafeJsonRpcServer(handler, schema, options = {}) {
398
- const { log, healthCheck, middlewares: extraMiddlewares } = options;
502
+ const { diagnostic, log, healthCheck, middlewares: extraMiddlewares } = options;
399
503
  const proxy = new SafeJsonProxy(handler, schema);
400
- return new SafeJsonRpcServer(proxy, options, healthCheck, extraMiddlewares, log);
504
+ return new SafeJsonRpcServer(proxy, options, healthCheck, extraMiddlewares, diagnostic, log);
401
505
  }
402
506
  /**
403
- * Creates a router for handling a plain status request that will return 200 status when running.
404
- * @param getCurrentStatus - List of health check functions to run.
507
+ * Creates a router for handling a status request that returns a 200 status code when healthy and a 500 otherwise,
508
+ * along with the reported status as a JSON body.
509
+ * @param getCurrentStatus - Function returning the current status of the server.
405
510
  * @param apiPrefix - The prefix to use for all api requests
406
511
  * @returns - The router for handling status requests.
407
512
  */ export function createStatusRouter(getCurrentStatus, apiPrefix = '') {
@@ -409,30 +514,44 @@ export function createSafeJsonRpcServer(handler, schema, options = {}) {
409
514
  prefix: `${apiPrefix}`
410
515
  });
411
516
  router.get('/status', async (ctx)=>{
412
- let ok;
517
+ let status;
413
518
  try {
414
- ok = await getCurrentStatus() === true;
519
+ status = await getCurrentStatus();
415
520
  } catch {
416
- ok = false;
521
+ status = {
522
+ ok: false
523
+ };
417
524
  }
418
- ctx.status = ok ? 200 : 500;
525
+ ctx.status = status.ok === true ? 200 : 500;
526
+ ctx.type = 'application/json';
527
+ ctx.body = status;
419
528
  });
420
529
  return router;
421
530
  }
422
531
  /**
423
532
  * Wraps a JsonRpcServer in a nodejs http server and starts it.
424
- * Installs a status router that calls to the isHealthy method to the server.
533
+ * Installs a status router that reports the status of the server, using its getStatus method when available so that
534
+ * per-component health is included, and falling back to isHealthy otherwise.
425
535
  * Returns once starts listening unless noWait is set.
426
536
  * @returns A running http server.
427
537
  */ export async function startHttpRpcServer(rpcServer, options = {}) {
428
538
  const app = rpcServer.getApp(options.apiPrefix);
429
- const statusRouter = createStatusRouter(rpcServer.isHealthy.bind(rpcServer), options.apiPrefix);
539
+ const getStatus = rpcServer.getStatus ? rpcServer.getStatus.bind(rpcServer) : async ()=>({
540
+ ok: await rpcServer.isHealthy() === true
541
+ });
542
+ const statusRouter = createStatusRouter(getStatus, options.apiPrefix);
430
543
  app.use(statusRouter.routes()).use(statusRouter.allowedMethods());
431
544
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
432
545
  const httpServer = http.createServer(app.callback());
433
546
  if (options.timeoutMs) {
434
547
  httpServer.timeout = options.timeoutMs;
435
548
  }
549
+ if (options.keepAliveTimeoutMs !== undefined) {
550
+ httpServer.keepAliveTimeout = options.keepAliveTimeoutMs;
551
+ }
552
+ if (options.headersTimeoutMs !== undefined) {
553
+ httpServer.headersTimeout = options.headersTimeoutMs;
554
+ }
436
555
  const { promise, resolve } = promiseWithResolvers();
437
556
  const listenPort = options.port ? typeof options.port === 'string' ? parseInt(options.port) : options.port : 0;
438
557
  httpServer.listen({
@@ -0,0 +1,8 @@
1
+ /** Pino configuration that adds OpenTelemetry severity fields understood by CloudWatch Logs. */
2
+ export declare const AWSCloudLoggerConfig: {
3
+ messageKey: string;
4
+ formatters: {
5
+ level(label: string, level: number): object;
6
+ };
7
+ };
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWxvZ2dlci1jb25maWcuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2cvYXdzLWxvZ2dlci1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBdUJBLGdHQUFnRztBQUNoRyxlQUFPLE1BQU0sb0JBQW9COzs7OztDQU9ILENBQUMifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-logger-config.d.ts","sourceRoot":"","sources":["../../src/log/aws-logger-config.ts"],"names":[],"mappings":"AAuBA,gGAAgG;AAChG,eAAO,MAAM,oBAAoB;;;;;CAOH,CAAC"}
@@ -0,0 +1,55 @@
1
+ function getSeverity(label) {
2
+ switch(label){
3
+ case 'trace':
4
+ return {
5
+ severityText: 'TRACE',
6
+ severityNumber: 1
7
+ };
8
+ case 'debug':
9
+ return {
10
+ severityText: 'DEBUG',
11
+ severityNumber: 5
12
+ };
13
+ case 'verbose':
14
+ return {
15
+ severityText: 'VERBOSE',
16
+ severityNumber: 7
17
+ };
18
+ case 'info':
19
+ return {
20
+ severityText: 'INFO',
21
+ severityNumber: 9
22
+ };
23
+ case 'warn':
24
+ return {
25
+ severityText: 'WARN',
26
+ severityNumber: 13
27
+ };
28
+ case 'error':
29
+ return {
30
+ severityText: 'ERROR',
31
+ severityNumber: 17
32
+ };
33
+ case 'fatal':
34
+ return {
35
+ severityText: 'FATAL',
36
+ severityNumber: 21
37
+ };
38
+ default:
39
+ return {
40
+ severityText: 'UNSPECIFIED',
41
+ severityNumber: 0
42
+ };
43
+ }
44
+ }
45
+ /** Pino configuration that adds OpenTelemetry severity fields understood by CloudWatch Logs. */ export const AWSCloudLoggerConfig = {
46
+ messageKey: 'msg',
47
+ formatters: {
48
+ level (label, level) {
49
+ return {
50
+ level,
51
+ ...getSeverity(label)
52
+ };
53
+ }
54
+ }
55
+ };
@@ -83,4 +83,4 @@ export type Logger = {
83
83
  getBindings: () => LoggerBindings;
84
84
  };
85
85
  export {};
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGluby1sb2dnZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2cvcGluby1sb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssS0FBSyxFQUFrQyxNQUFNLFdBQVcsQ0FBQztBQUd2RSxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFTdkMsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRCx3RUFBd0U7QUFDeEUsTUFBTSxNQUFNLGNBQWMsR0FBRztJQUMzQiwrREFBK0Q7SUFDL0QsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2YsdUZBQXVGO0lBQ3ZGLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUNyQixDQUFDO0FBSUYsS0FBSyxrQkFBa0IsR0FBRyxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUM7QUFHM0Qsd0JBQWdCLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxrQkFBa0IsR0FBRyxJQUFJLENBRXZFO0FBRUQsd0JBQWdCLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxrQkFBa0IsUUFLbkU7QUFZRCx3QkFBZ0IsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUUsY0FBYyxHQUFHLE1BQU0sQ0E2QzlFO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQWdCLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxHQUFHLGNBQWMsR0FBRyxNQUFNLENBS2hHO0FBSUQsS0FBSyxjQUFjLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxLQUFLLE9BQU8sQ0FBQztBQUdqRCx3QkFBZ0IsaUJBQWlCLENBQUMsT0FBTyxFQUFFLGNBQWMsR0FBRyxJQUFJLENBRS9EO0FBZUQsZUFBTyxNQUFPLFFBQVEsa0ZBQUUsVUFBVSx1Q0FBK0QsQ0FBQztBQTZDbEcsZUFBTyxNQUFNLE1BQU07Ozs7O0NBR2xCLENBQUM7QUFlRiwyRkFBMkY7QUFDM0Ysd0JBQWdCLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLEtBQUssQ0FRbEQ7QUFFRCw2REFBNkQ7QUFDN0Qsd0JBQWdCLGdCQUFnQixJQUFJLElBQUksQ0FHdkM7QUFNRCxLQUFLLFNBQVMsR0FBRztJQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtDQUFFLENBQUM7QUFFeEYseUdBQXlHO0FBQ3pHLHdCQUFnQixnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQWtCM0U7QUFjRDs7O0dBR0c7QUFDSCxlQUFPLE1BQU0sY0FBYzs7Ozs7Ozs7OztDQUcxQixDQUFDO0FBMERGLGVBQU8sTUFBTSxNQUFNLDJDQUFlLENBQUM7QUFhbkM7OztHQUdHO0FBQ0gsd0JBQWdCLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUU3RDtBQUVEOzs7R0FHRztBQUNILHdCQUFnQixxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FlNUQ7QUFFRCxvREFBb0Q7QUFDcEQsS0FBSyxVQUFVLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxPQUFPLEtBQUssSUFBSSxDQUFDO0FBRXZFOztHQUVHO0FBQ0gsTUFBTSxNQUFNLE1BQU0sR0FBRztLQUFHLENBQUMsSUFBSSxRQUFRLEdBQUcsS0FBSztDQUFFLEdBQUc7SUFBNEIsS0FBSyxFQUFFLFVBQVUsQ0FBQTtDQUFFLEdBQUc7SUFDbEcsS0FBSyxFQUFFLFFBQVEsQ0FBQztJQUNoQixjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxLQUFLLE9BQU8sQ0FBQztJQUM3QyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2YsV0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLE1BQU0sS0FBSyxNQUFNLENBQUM7SUFDN0MsZ0VBQWdFO0lBQ2hFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztDQUNuQyxDQUFDIn0=
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGluby1sb2dnZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2cvcGluby1sb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssS0FBSyxFQUFrQyxNQUFNLFdBQVcsQ0FBQztBQUd2RSxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFVdkMsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRCx3RUFBd0U7QUFDeEUsTUFBTSxNQUFNLGNBQWMsR0FBRztJQUMzQiwrREFBK0Q7SUFDL0QsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2YsdUZBQXVGO0lBQ3ZGLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUNyQixDQUFDO0FBTUYsS0FBSyxrQkFBa0IsR0FBRyxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUM7QUFHM0Qsd0JBQWdCLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxrQkFBa0IsR0FBRyxJQUFJLENBRXZFO0FBRUQsd0JBQWdCLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxrQkFBa0IsUUFLbkU7QUFZRCx3QkFBZ0IsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUUsY0FBYyxHQUFHLE1BQU0sQ0E2QzlFO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQWdCLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxHQUFHLGNBQWMsR0FBRyxNQUFNLENBS2hHO0FBSUQsS0FBSyxjQUFjLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxLQUFLLE9BQU8sQ0FBQztBQUdqRCx3QkFBZ0IsaUJBQWlCLENBQUMsT0FBTyxFQUFFLGNBQWMsR0FBRyxJQUFJLENBRS9EO0FBZUQsZUFBTyxNQUFPLFFBQVEsa0ZBQUUsVUFBVSx1Q0FBK0QsQ0FBQztBQXNEbEcsZUFBTyxNQUFNLE1BQU07Ozs7O0NBR2xCLENBQUM7QUFlRiwyRkFBMkY7QUFDM0Ysd0JBQWdCLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLEtBQUssQ0FRbEQ7QUFFRCw2REFBNkQ7QUFDN0Qsd0JBQWdCLGdCQUFnQixJQUFJLElBQUksQ0FHdkM7QUFNRCxLQUFLLFNBQVMsR0FBRztJQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtDQUFFLENBQUM7QUFFeEYseUdBQXlHO0FBQ3pHLHdCQUFnQixnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQWtCM0U7QUFjRDs7O0dBR0c7QUFDSCxlQUFPLE1BQU0sY0FBYzs7Ozs7Ozs7OztDQUcxQixDQUFDO0FBMERGLGVBQU8sTUFBTSxNQUFNLDJDQUFlLENBQUM7QUFhbkM7OztHQUdHO0FBQ0gsd0JBQWdCLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUU3RDtBQUVEOzs7R0FHRztBQUNILHdCQUFnQixxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FlNUQ7QUFFRCxvREFBb0Q7QUFDcEQsS0FBSyxVQUFVLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxPQUFPLEtBQUssSUFBSSxDQUFDO0FBRXZFOztHQUVHO0FBQ0gsTUFBTSxNQUFNLE1BQU0sR0FBRztLQUFHLENBQUMsSUFBSSxRQUFRLEdBQUcsS0FBSztDQUFFLEdBQUc7SUFBNEIsS0FBSyxFQUFFLFVBQVUsQ0FBQTtDQUFFLEdBQUc7SUFDbEcsS0FBSyxFQUFFLFFBQVEsQ0FBQztJQUNoQixjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxLQUFLLE9BQU8sQ0FBQztJQUM3QyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2YsV0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLE1BQU0sS0FBSyxNQUFNLENBQUM7SUFDN0MsZ0VBQWdFO0lBQ2hFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztDQUNuQyxDQUFDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"pino-logger.d.ts","sourceRoot":"","sources":["../../src/log/pino-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAkC,MAAM,WAAW,CAAC;AAGvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AASvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAElD,wEAAwE;AACxE,MAAM,MAAM,cAAc,GAAG;IAC3B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAIF,KAAK,kBAAkB,GAAG,MAAM,cAAc,GAAG,SAAS,CAAC;AAG3D,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAEvE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,QAKnE;AAYD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CA6C9E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,MAAM,CAKhG;AAID,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;AAGjD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAE/D;AAeD,eAAO,MAAO,QAAQ,kFAAE,UAAU,uCAA+D,CAAC;AA6ClG,eAAO,MAAM,MAAM;;;;;CAGlB,CAAC;AAeF,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAQlD;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAMD,KAAK,SAAS,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExF,yGAAyG;AACzG,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAkB3E;AAcD;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;CAG1B,CAAC;AA0DF,eAAO,MAAM,MAAM,2CAAe,CAAC;AAanC;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAE7D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAe5D;AAED,oDAAoD;AACpD,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;KAAG,CAAC,IAAI,QAAQ,GAAG,KAAK;CAAE,GAAG;IAA4B,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG;IAClG,KAAK,EAAE,QAAQ,CAAC;IAChB,cAAc,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7C,gEAAgE;IAChE,WAAW,EAAE,MAAM,cAAc,CAAC;CACnC,CAAC"}
1
+ {"version":3,"file":"pino-logger.d.ts","sourceRoot":"","sources":["../../src/log/pino-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAkC,MAAM,WAAW,CAAC;AAGvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAUvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAElD,wEAAwE;AACxE,MAAM,MAAM,cAAc,GAAG;IAC3B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAMF,KAAK,kBAAkB,GAAG,MAAM,cAAc,GAAG,SAAS,CAAC;AAG3D,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAEvE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,QAKnE;AAYD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CA6C9E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,MAAM,CAKhG;AAID,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;AAGjD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAE/D;AAeD,eAAO,MAAO,QAAQ,kFAAE,UAAU,uCAA+D,CAAC;AAsDlG,eAAO,MAAM,MAAM;;;;;CAGlB,CAAC;AAeF,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAQlD;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAMD,KAAK,SAAS,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExF,yGAAyG;AACzG,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAkB3E;AAcD;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;CAG1B,CAAC;AA0DF,eAAO,MAAM,MAAM,2CAAe,CAAC;AAanC;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAE7D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAe5D;AAED,oDAAoD;AACpD,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;KAAG,CAAC,IAAI,QAAQ,GAAG,KAAK;CAAE,GAAG;IAA4B,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG;IAClG,KAAK,EAAE,QAAQ,CAAC;IAChB,cAAc,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7C,gEAAgE;IAChE,WAAW,EAAE,MAAM,cAAc,CAAC;CACnC,CAAC"}
@@ -4,9 +4,11 @@ import { pino, symbols } from 'pino';
4
4
  import { inspect } from 'util';
5
5
  import { compactArray } from '../collection/array.js';
6
6
  import { parseBooleanEnv } from '../config/parse-env.js';
7
+ import { AWSCloudLoggerConfig } from './aws-logger-config.js';
7
8
  import { convertBigintsToStrings } from './bigint-utils.js';
8
9
  import { GoogleCloudLoggerConfig } from './gcloud-logger-config.js';
9
10
  import { getLogLevelFromFilters, parseLogLevelEnvVar } from './log-filters.js';
11
+ const MAX_MODULE_NAME_LENGTH = 256;
10
12
  const logBindingsHandlers = [];
11
13
  export function addLogBindingsHandler(handler) {
12
14
  logBindingsHandlers.push(handler);
@@ -27,7 +29,7 @@ function getBindingsFromHandlers() {
27
29
  return undefined;
28
30
  }
29
31
  export function createLogger(module, bindings) {
30
- module = module.replace(/^aztec:/, '');
32
+ module = module.slice(0, MAX_MODULE_NAME_LENGTH).replace(/^aztec:/, '');
31
33
  const resolvedBindings = {
32
34
  ...getBindingsFromHandlers(),
33
35
  ...bindings
@@ -98,8 +100,13 @@ export const [logLevel, logFilters] = parseLogLevelEnvVar(process.env.LOG_LEVEL,
98
100
  const customLevels = {
99
101
  verbose: 25
100
102
  };
101
- // Global pino options, tweaked for google cloud if running there.
103
+ // Global pino options, tweaked for the active cloud logging backend.
102
104
  const useGcloudLogging = parseBooleanEnv(process.env['USE_GCLOUD_LOGGING']);
105
+ const useAwsLogging = parseBooleanEnv(process.env['USE_AWS_LOGGING']);
106
+ const loggingConfig = useGcloudLogging ? GoogleCloudLoggerConfig : useAwsLogging ? AWSCloudLoggerConfig : {
107
+ formatters: {},
108
+ messageKey: 'msg'
109
+ };
103
110
  const redactedPaths = [
104
111
  'validatorPrivateKeys',
105
112
  // for both the validator and the prover
@@ -118,7 +125,7 @@ const redactedPaths = [
118
125
  ];
119
126
  const pinoOpts = {
120
127
  customLevels,
121
- messageKey: 'msg',
128
+ messageKey: loggingConfig.messageKey,
122
129
  useOnlyCustomLevels: false,
123
130
  level: logLevel,
124
131
  redact: {
@@ -131,9 +138,9 @@ const pinoOpts = {
131
138
  ]
132
139
  },
133
140
  formatters: {
134
- log: (obj)=>convertBigintsToStrings(obj)
135
- },
136
- ...useGcloudLogging ? GoogleCloudLoggerConfig : {}
141
+ log: (obj)=>convertBigintsToStrings(obj),
142
+ ...loggingConfig.formatters
143
+ }
137
144
  };
138
145
  export const levels = {
139
146
  labels: {
@@ -203,7 +210,7 @@ const pinoPrettyBaseOpts = {
203
210
  destination: 2,
204
211
  sync: true,
205
212
  colorize: useColor,
206
- ignore: 'module,actor,instanceId,pid,hostname,trace_id,span_id,trace_flags,severity',
213
+ ignore: 'module,actor,instanceId,pid,hostname,trace_id,span_id,trace_flags,severity,severityText,severityNumber',
207
214
  customLevels: 'fatal:60,error:50,warn:40,info:30,verbose:25,debug:20,trace:10',
208
215
  customColors: 'fatal:bgRed,error:red,warn:yellow,info:green,verbose:magenta,debug:blue,trace:gray',
209
216
  minimumLevel: 'trace',
@@ -322,5 +329,19 @@ logger.verbose({
322
329
  * @param err - Error to log
323
330
  * @returns A string with both the log message and the error message.
324
331
  */ function formatErr(msg, err) {
325
- return err ? `${msg}: ${inspect(err)}` : msg;
332
+ if (!err) {
333
+ return msg;
334
+ }
335
+ try {
336
+ return `${msg}: ${inspect(err)}`;
337
+ } catch {
338
+ // inspect can crash on error objects with broken property descriptors
339
+ try {
340
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
341
+ return `${msg}: ${err instanceof Error ? `${err.name}: ${err.message}` : String(err)}`;
342
+ } catch {
343
+ // if even String(err) fails, return the original message with a note about the error
344
+ return `${msg}: [unserializable error]`;
345
+ }
346
+ }
326
347
  }