@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.
- package/dest/bigint-buffer/index.d.ts +1 -1
- package/dest/bigint-buffer/index.d.ts.map +1 -1
- package/dest/bigint-buffer/index.js +6 -1
- package/dest/branded-types/block_number.d.ts +3 -3
- package/dest/branded-types/block_number.d.ts.map +1 -1
- package/dest/branded-types/block_number.js +15 -4
- package/dest/branded-types/buffer32_hash.d.ts +27 -0
- package/dest/branded-types/buffer32_hash.d.ts.map +1 -0
- package/dest/branded-types/buffer32_hash.js +12 -0
- package/dest/branded-types/checkpoint_number.d.ts +9 -3
- package/dest/branded-types/checkpoint_number.d.ts.map +1 -1
- package/dest/branded-types/checkpoint_number.js +11 -0
- package/dest/branded-types/epoch.d.ts +2 -2
- package/dest/branded-types/epoch.d.ts.map +1 -1
- package/dest/branded-types/index.d.ts +2 -1
- package/dest/branded-types/index.d.ts.map +1 -1
- package/dest/branded-types/index.js +1 -0
- package/dest/branded-types/index_within_checkpoint.d.ts +2 -2
- package/dest/branded-types/index_within_checkpoint.d.ts.map +1 -1
- package/dest/branded-types/slot.d.ts +5 -2
- package/dest/branded-types/slot.d.ts.map +1 -1
- package/dest/branded-types/slot.js +3 -0
- package/dest/buffer/buffer16.d.ts +3 -1
- package/dest/buffer/buffer16.d.ts.map +1 -1
- package/dest/buffer/buffer32.d.ts +28 -61
- package/dest/buffer/buffer32.d.ts.map +1 -1
- package/dest/buffer/buffer32.js +29 -63
- package/dest/buffer/index.d.ts +2 -1
- package/dest/buffer/index.d.ts.map +1 -1
- package/dest/buffer/index.js +1 -0
- package/dest/buffer/utils.d.ts +3 -0
- package/dest/buffer/utils.d.ts.map +1 -0
- package/dest/buffer/utils.js +7 -0
- package/dest/collection/array.d.ts +11 -1
- package/dest/collection/array.d.ts.map +1 -1
- package/dest/collection/array.js +33 -0
- package/dest/collection/index.d.ts +3 -1
- package/dest/collection/index.d.ts.map +1 -1
- package/dest/collection/index.js +2 -0
- package/dest/collection/lru_map.d.ts +41 -0
- package/dest/collection/lru_map.d.ts.map +1 -0
- package/dest/collection/lru_map.js +119 -0
- package/dest/collection/lru_set.d.ts +35 -0
- package/dest/collection/lru_set.d.ts.map +1 -0
- package/dest/collection/lru_set.js +95 -0
- package/dest/committable/committable.js +1 -1
- package/dest/config/env_var.d.ts +2 -2
- package/dest/config/env_var.d.ts.map +1 -1
- package/dest/config/index.d.ts +67 -37
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +72 -71
- package/dest/config/network_config.d.ts +13 -45
- package/dest/config/network_config.d.ts.map +1 -1
- package/dest/config/network_config.js +3 -1
- package/dest/config/network_name.d.ts +2 -2
- package/dest/config/network_name.d.ts.map +1 -1
- package/dest/config/network_name.js +1 -3
- package/dest/config/secret_value.d.ts +2 -2
- package/dest/config/secret_value.d.ts.map +1 -1
- package/dest/crypto/aes128/index.d.ts +2 -1
- package/dest/crypto/aes128/index.d.ts.map +1 -1
- package/dest/crypto/aes128/index.js +11 -2
- package/dest/crypto/bls/bn254_keystore.d.ts +10 -177
- package/dest/crypto/bls/bn254_keystore.d.ts.map +1 -1
- package/dest/crypto/bls/bn254_keystore.js +22 -34
- package/dest/crypto/poseidon/index.d.ts +1 -1
- package/dest/crypto/poseidon/index.d.ts.map +1 -1
- package/dest/crypto/poseidon/index.js +40 -33
- package/dest/crypto/schnorr/index.d.ts +8 -7
- package/dest/crypto/schnorr/index.d.ts.map +1 -1
- package/dest/crypto/schnorr/index.js +6 -6
- package/dest/crypto/schnorr/signature.d.ts +9 -29
- package/dest/crypto/schnorr/signature.d.ts.map +1 -1
- package/dest/crypto/schnorr/signature.js +20 -36
- package/dest/curves/bls12/field.d.ts +3 -3
- package/dest/curves/bls12/field.d.ts.map +1 -1
- package/dest/curves/bls12/field.js +0 -5
- package/dest/curves/bls12/point.d.ts +2 -2
- package/dest/curves/bls12/point.d.ts.map +1 -1
- package/dest/curves/bn254/field.d.ts +23 -19
- package/dest/curves/bn254/field.d.ts.map +1 -1
- package/dest/curves/bn254/field.js +23 -17
- package/dest/curves/grumpkin/point.d.ts +14 -28
- package/dest/curves/grumpkin/point.d.ts.map +1 -1
- package/dest/curves/grumpkin/point.js +29 -43
- package/dest/eth-address/index.d.ts +2 -2
- package/dest/eth-address/index.d.ts.map +1 -1
- package/dest/eth-address/index.js +0 -3
- package/dest/eth-signature/eth_signature.d.ts +2 -2
- package/dest/eth-signature/eth_signature.d.ts.map +1 -1
- package/dest/fifo/fifo_frame_reader.d.ts +41 -0
- package/dest/fifo/fifo_frame_reader.d.ts.map +1 -0
- package/dest/fifo/fifo_frame_reader.js +74 -0
- package/dest/fifo/index.d.ts +2 -0
- package/dest/fifo/index.d.ts.map +1 -0
- package/dest/fifo/index.js +1 -0
- package/dest/fifo_set/fifo_set.d.ts +15 -0
- package/dest/fifo_set/fifo_set.d.ts.map +1 -0
- package/dest/fifo_set/fifo_set.js +39 -0
- package/dest/fifo_set/index.d.ts +2 -0
- package/dest/fifo_set/index.d.ts.map +1 -0
- package/dest/fifo_set/index.js +1 -0
- package/dest/iterable/first.d.ts +8 -0
- package/dest/iterable/first.d.ts.map +1 -0
- package/dest/iterable/first.js +11 -0
- package/dest/iterable/index.d.ts +2 -1
- package/dest/iterable/index.d.ts.map +1 -1
- package/dest/iterable/index.js +1 -0
- package/dest/json-rpc/client/fetch.d.ts +8 -3
- package/dest/json-rpc/client/fetch.d.ts.map +1 -1
- package/dest/json-rpc/client/fetch.js +11 -7
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts +1 -1
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -1
- package/dest/json-rpc/client/safe_json_rpc_client.js +2 -2
- package/dest/json-rpc/client/undici.d.ts +14 -3
- package/dest/json-rpc/client/undici.d.ts.map +1 -1
- package/dest/json-rpc/client/undici.js +47 -14
- package/dest/json-rpc/fixtures/test_state.d.ts +4 -8
- package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -1
- package/dest/json-rpc/fixtures/test_state.js +57 -17
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts +49 -11
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -1
- package/dest/json-rpc/server/safe_json_rpc_server.js +159 -40
- package/dest/log/aws-logger-config.d.ts +8 -0
- package/dest/log/aws-logger-config.d.ts.map +1 -0
- package/dest/log/aws-logger-config.js +55 -0
- package/dest/log/pino-logger.d.ts +1 -1
- package/dest/log/pino-logger.d.ts.map +1 -1
- package/dest/log/pino-logger.js +29 -8
- package/dest/noir/noir_package_config.d.ts +19 -104
- package/dest/noir/noir_package_config.d.ts.map +1 -1
- package/dest/noir/noir_package_config.js +1 -1
- package/dest/promise/running-promise.d.ts +8 -2
- package/dest/promise/running-promise.d.ts.map +1 -1
- package/dest/promise/running-promise.js +17 -5
- package/dest/promise/utils.d.ts +14 -1
- package/dest/promise/utils.d.ts.map +1 -1
- package/dest/promise/utils.js +20 -0
- package/dest/queue/batch_queue.d.ts +1 -1
- package/dest/queue/batch_queue.d.ts.map +1 -1
- package/dest/queue/batch_queue.js +1 -0
- package/dest/retry/index.d.ts +31 -3
- package/dest/retry/index.d.ts.map +1 -1
- package/dest/retry/index.js +44 -2
- package/dest/schemas/api.d.ts +12 -10
- package/dest/schemas/api.d.ts.map +1 -1
- package/dest/schemas/api.js +7 -1
- package/dest/schemas/parse.d.ts +4 -4
- package/dest/schemas/parse.d.ts.map +1 -1
- package/dest/schemas/parse.js +6 -5
- package/dest/schemas/schemas.d.ts +15 -15
- package/dest/schemas/types.d.ts +3 -3
- package/dest/schemas/types.d.ts.map +1 -1
- package/dest/schemas/utils.d.ts +7 -11
- package/dest/schemas/utils.d.ts.map +1 -1
- package/dest/schemas/utils.js +2 -18
- package/dest/serialize/buffer_reader.d.ts +1 -1
- package/dest/serialize/buffer_reader.d.ts.map +1 -1
- package/dest/serialize/buffer_reader.js +5 -0
- package/dest/serialize/buffer_sink.d.ts +134 -0
- package/dest/serialize/buffer_sink.d.ts.map +1 -0
- package/dest/serialize/buffer_sink.js +297 -0
- package/dest/serialize/index.d.ts +2 -1
- package/dest/serialize/index.d.ts.map +1 -1
- package/dest/serialize/index.js +1 -0
- package/dest/serialize/serialize.d.ts +1 -32
- package/dest/serialize/serialize.d.ts.map +1 -1
- package/dest/serialize/serialize.js +0 -21
- package/dest/string/index.js +1 -1
- package/dest/testing/files/index.d.ts +2 -3
- package/dest/testing/files/index.d.ts.map +1 -1
- package/dest/testing/files/index.js +1 -2
- package/dest/timer/index.d.ts +2 -2
- package/dest/timer/index.d.ts.map +1 -1
- package/dest/timer/index.js +1 -1
- package/dest/timer/timeout.d.ts +3 -1
- package/dest/timer/timeout.d.ts.map +1 -1
- package/dest/timer/timeout.js +26 -0
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts +11 -2
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts.map +1 -1
- package/dest/transport/index.d.ts +1 -2
- package/dest/transport/index.d.ts.map +1 -1
- package/dest/transport/index.js +0 -1
- package/dest/trees/balanced_merkle_tree_root.d.ts +2 -3
- package/dest/trees/balanced_merkle_tree_root.d.ts.map +1 -1
- package/dest/trees/balanced_merkle_tree_root.js +2 -3
- package/dest/trees/hasher.d.ts +3 -2
- package/dest/trees/hasher.d.ts.map +1 -1
- package/dest/trees/hasher.js +5 -5
- package/dest/trees/indexed_merkle_tree_calculator.d.ts +1 -1
- package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/indexed_merkle_tree_calculator.js +5 -1
- package/dest/trees/membership_witness.d.ts +2 -6
- package/dest/trees/membership_witness.d.ts.map +1 -1
- package/dest/trees/membership_witness.js +0 -9
- package/dest/trees/merkle_tree_calculator.d.ts +4 -2
- package/dest/trees/merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/merkle_tree_calculator.js +1 -5
- package/dest/trees/sibling_path.d.ts +13 -14
- package/dest/trees/sibling_path.d.ts.map +1 -1
- package/dest/trees/sibling_path.js +23 -28
- package/dest/trees/unbalanced_merkle_tree_root.d.ts +2 -3
- package/dest/trees/unbalanced_merkle_tree_root.d.ts.map +1 -1
- package/dest/trees/unbalanced_merkle_tree_root.js +2 -3
- package/dest/types/index.d.ts +23 -1
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +15 -0
- package/package.json +6 -4
- package/src/bigint-buffer/index.ts +6 -1
- package/src/branded-types/block_number.ts +20 -2
- package/src/branded-types/buffer32_hash.ts +38 -0
- package/src/branded-types/checkpoint_number.ts +16 -1
- package/src/branded-types/epoch.ts +1 -1
- package/src/branded-types/index.ts +1 -0
- package/src/branded-types/index_within_checkpoint.ts +1 -1
- package/src/branded-types/slot.ts +6 -1
- package/src/buffer/buffer16.ts +3 -0
- package/src/buffer/buffer32.ts +39 -68
- package/src/buffer/index.ts +1 -0
- package/src/buffer/utils.ts +8 -0
- package/src/collection/array.ts +34 -0
- package/src/collection/index.ts +2 -0
- package/src/collection/lru_map.ts +143 -0
- package/src/collection/lru_set.ts +115 -0
- package/src/committable/committable.ts +1 -1
- package/src/config/env_var.ts +65 -25
- package/src/config/index.ts +143 -122
- package/src/config/network_config.ts +2 -0
- package/src/config/network_name.ts +2 -5
- package/src/config/secret_value.ts +1 -1
- package/src/crypto/aes128/index.ts +11 -2
- package/src/crypto/bls/bn254_keystore.ts +33 -43
- package/src/crypto/poseidon/index.ts +42 -34
- package/src/crypto/schnorr/index.ts +9 -8
- package/src/crypto/schnorr/signature.ts +17 -46
- package/src/curves/bls12/field.ts +0 -7
- package/src/curves/bn254/field.ts +35 -34
- package/src/curves/grumpkin/point.ts +23 -40
- package/src/eth-address/index.ts +0 -4
- package/src/fifo/fifo_frame_reader.ts +98 -0
- package/src/fifo/index.ts +1 -0
- package/src/fifo_set/fifo_set.ts +52 -0
- package/src/fifo_set/index.ts +1 -0
- package/src/iterable/first.ts +14 -0
- package/src/iterable/index.ts +1 -0
- package/src/json-rpc/client/fetch.ts +19 -5
- package/src/json-rpc/client/safe_json_rpc_client.ts +2 -2
- package/src/json-rpc/client/undici.ts +54 -12
- package/src/json-rpc/fixtures/test_state.ts +10 -10
- package/src/json-rpc/server/safe_json_rpc_server.ts +204 -47
- package/src/log/aws-logger-config.ts +32 -0
- package/src/log/pino-logger.ts +33 -6
- package/src/noir/noir_package_config.ts +32 -20
- package/src/promise/running-promise.ts +20 -7
- package/src/promise/utils.ts +31 -0
- package/src/queue/batch_queue.ts +1 -0
- package/src/retry/index.ts +66 -4
- package/src/schemas/api.ts +25 -25
- package/src/schemas/parse.ts +9 -6
- package/src/schemas/schemas.ts +4 -4
- package/src/schemas/types.ts +2 -2
- package/src/schemas/utils.ts +4 -38
- package/src/serialize/buffer_reader.ts +5 -0
- package/src/serialize/buffer_sink.ts +350 -0
- package/src/serialize/index.ts +1 -0
- package/src/serialize/serialize.ts +0 -50
- package/src/string/index.ts +1 -1
- package/src/testing/files/index.ts +1 -2
- package/src/timer/index.ts +1 -1
- package/src/timer/timeout.ts +31 -0
- package/src/transport/dispatch/create_dispatch_proxy.ts +11 -1
- package/src/transport/index.ts +0 -1
- package/src/trees/balanced_merkle_tree_root.ts +2 -5
- package/src/trees/hasher.ts +6 -3
- package/src/trees/indexed_merkle_tree_calculator.ts +5 -1
- package/src/trees/membership_witness.ts +0 -8
- package/src/trees/merkle_tree_calculator.ts +4 -10
- package/src/trees/sibling_path.ts +24 -30
- package/src/trees/unbalanced_merkle_tree_root.ts +2 -5
- package/src/types/index.ts +47 -0
- package/dest/crypto/serialize.d.ts +0 -51
- package/dest/crypto/serialize.d.ts.map +0 -1
- package/dest/crypto/serialize.js +0 -68
- package/dest/transport/dispatch/create_dispatch_fn.d.ts +0 -25
- package/dest/transport/dispatch/create_dispatch_fn.d.ts.map +0 -1
- package/dest/transport/dispatch/create_dispatch_fn.js +0 -17
- package/src/crypto/serialize.ts +0 -85
- 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.
|
|
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: -
|
|
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: -
|
|
193
|
-
message: '
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
374
|
-
|
|
375
|
-
|
|
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.
|
|
378
|
-
|
|
473
|
+
log?.warn(`Health check failed for ${failed.join(', ')}`, {
|
|
474
|
+
components
|
|
475
|
+
});
|
|
379
476
|
}
|
|
380
|
-
return
|
|
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
|
|
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
|
|
404
|
-
*
|
|
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
|
|
517
|
+
let status;
|
|
413
518
|
try {
|
|
414
|
-
|
|
519
|
+
status = await getCurrentStatus();
|
|
415
520
|
} catch {
|
|
416
|
-
|
|
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
|
|
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
|
|
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,
|
|
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;
|
|
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"}
|
package/dest/log/pino-logger.js
CHANGED
|
@@ -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
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|