@aztec-labs/foundation 6.0.0-nightly.20260829
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/README.md +1 -0
- package/dest/array/array.d.ts +68 -0
- package/dest/array/array.d.ts.map +1 -0
- package/dest/array/array.js +100 -0
- package/dest/array/index.d.ts +3 -0
- package/dest/array/index.d.ts.map +1 -0
- package/dest/array/index.js +2 -0
- package/dest/array/sorted_array.d.ts +15 -0
- package/dest/array/sorted_array.d.ts.map +1 -0
- package/dest/array/sorted_array.js +109 -0
- package/dest/async-map/index.d.ts +13 -0
- package/dest/async-map/index.d.ts.map +1 -0
- package/dest/async-map/index.js +17 -0
- package/dest/async-pool/index.d.ts +3 -0
- package/dest/async-pool/index.d.ts.map +1 -0
- package/dest/async-pool/index.js +48 -0
- package/dest/bigint/index.d.ts +7 -0
- package/dest/bigint/index.d.ts.map +1 -0
- package/dest/bigint/index.js +15 -0
- package/dest/bigint-buffer/index.d.ts +40 -0
- package/dest/bigint-buffer/index.d.ts.map +1 -0
- package/dest/bigint-buffer/index.js +81 -0
- package/dest/branded-types/block_number.d.ts +56 -0
- package/dest/branded-types/block_number.d.ts.map +1 -0
- package/dest/branded-types/block_number.js +89 -0
- 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 +60 -0
- package/dest/branded-types/checkpoint_number.d.ts.map +1 -0
- package/dest/branded-types/checkpoint_number.js +88 -0
- package/dest/branded-types/epoch.d.ts +42 -0
- package/dest/branded-types/epoch.d.ts.map +1 -0
- package/dest/branded-types/epoch.js +59 -0
- package/dest/branded-types/index.d.ts +8 -0
- package/dest/branded-types/index.d.ts.map +1 -0
- package/dest/branded-types/index.js +6 -0
- package/dest/branded-types/index_within_checkpoint.d.ts +42 -0
- package/dest/branded-types/index_within_checkpoint.d.ts.map +1 -0
- package/dest/branded-types/index_within_checkpoint.js +59 -0
- package/dest/branded-types/slot.d.ts +45 -0
- package/dest/branded-types/slot.d.ts.map +1 -0
- package/dest/branded-types/slot.js +62 -0
- package/dest/branded-types/types.d.ts +5 -0
- package/dest/branded-types/types.d.ts.map +1 -0
- package/dest/branded-types/types.js +1 -0
- package/dest/buffer/buffer16.d.ts +82 -0
- package/dest/buffer/buffer16.d.ts.map +1 -0
- package/dest/buffer/buffer16.js +102 -0
- package/dest/buffer/buffer32.d.ts +54 -0
- package/dest/buffer/buffer32.d.ts.map +1 -0
- package/dest/buffer/buffer32.js +83 -0
- package/dest/buffer/index.d.ts +4 -0
- package/dest/buffer/index.d.ts.map +1 -0
- package/dest/buffer/index.js +3 -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 +135 -0
- package/dest/collection/array.d.ts.map +1 -0
- package/dest/collection/array.js +302 -0
- package/dest/collection/index.d.ts +5 -0
- package/dest/collection/index.d.ts.map +1 -0
- package/dest/collection/index.js +4 -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/collection/object.d.ts +30 -0
- package/dest/collection/object.d.ts.map +1 -0
- package/dest/collection/object.js +57 -0
- package/dest/committable/committable.d.ts +28 -0
- package/dest/committable/committable.d.ts.map +1 -0
- package/dest/committable/committable.js +36 -0
- package/dest/committable/index.d.ts +2 -0
- package/dest/committable/index.d.ts.map +1 -0
- package/dest/committable/index.js +1 -0
- package/dest/config/env_var.d.ts +2 -0
- package/dest/config/env_var.d.ts.map +1 -0
- package/dest/config/env_var.js +1 -0
- package/dest/config/index.d.ts +154 -0
- package/dest/config/index.d.ts.map +1 -0
- package/dest/config/index.js +272 -0
- package/dest/config/network_config.d.ts +28 -0
- package/dest/config/network_config.d.ts.map +1 -0
- package/dest/config/network_config.js +14 -0
- package/dest/config/network_name.d.ts +3 -0
- package/dest/config/network_name.d.ts.map +1 -0
- package/dest/config/network_name.js +19 -0
- package/dest/config/parse-env.d.ts +3 -0
- package/dest/config/parse-env.d.ts.map +1 -0
- package/dest/config/parse-env.js +7 -0
- package/dest/config/secret_value.d.ts +28 -0
- package/dest/config/secret_value.d.ts.map +1 -0
- package/dest/config/secret_value.js +36 -0
- package/dest/crypto/aes128/index.d.ts +33 -0
- package/dest/crypto/aes128/index.d.ts.map +1 -0
- package/dest/crypto/aes128/index.js +71 -0
- package/dest/crypto/bls/bn254_keystore.d.ts +129 -0
- package/dest/crypto/bls/bn254_keystore.d.ts.map +1 -0
- package/dest/crypto/bls/bn254_keystore.js +206 -0
- package/dest/crypto/bls/index.d.ts +13 -0
- package/dest/crypto/bls/index.d.ts.map +1 -0
- package/dest/crypto/bls/index.js +87 -0
- package/dest/crypto/bn254/index.d.ts +39 -0
- package/dest/crypto/bn254/index.d.ts.map +1 -0
- package/dest/crypto/bn254/index.js +56 -0
- package/dest/crypto/ecdsa/index.d.ts +39 -0
- package/dest/crypto/ecdsa/index.d.ts.map +1 -0
- package/dest/crypto/ecdsa/index.js +102 -0
- package/dest/crypto/ecdsa/signature.d.ts +69 -0
- package/dest/crypto/ecdsa/signature.d.ts.map +1 -0
- package/dest/crypto/ecdsa/signature.js +92 -0
- package/dest/crypto/grumpkin/index.d.ts +42 -0
- package/dest/crypto/grumpkin/index.d.ts.map +1 -0
- package/dest/crypto/grumpkin/index.js +160 -0
- package/dest/crypto/keccak/index.d.ts +26 -0
- package/dest/crypto/keccak/index.d.ts.map +1 -0
- package/dest/crypto/keccak/index.js +248 -0
- package/dest/crypto/keys/index.d.ts +4 -0
- package/dest/crypto/keys/index.d.ts.map +1 -0
- package/dest/crypto/keys/index.js +34 -0
- package/dest/crypto/pedersen/index.d.ts +2 -0
- package/dest/crypto/pedersen/index.d.ts.map +1 -0
- package/dest/crypto/pedersen/index.js +1 -0
- package/dest/crypto/pedersen/pedersen.noble.d.ts +9 -0
- package/dest/crypto/pedersen/pedersen.noble.d.ts.map +1 -0
- package/dest/crypto/pedersen/pedersen.noble.js +558 -0
- package/dest/crypto/pedersen/pedersen.wasm.d.ts +19 -0
- package/dest/crypto/pedersen/pedersen.wasm.d.ts.map +1 -0
- package/dest/crypto/pedersen/pedersen.wasm.js +51 -0
- package/dest/crypto/poseidon/index.d.ts +23 -0
- package/dest/crypto/poseidon/index.d.ts.map +1 -0
- package/dest/crypto/poseidon/index.js +71 -0
- package/dest/crypto/random/index.d.ts +23 -0
- package/dest/crypto/random/index.d.ts.map +1 -0
- package/dest/crypto/random/index.js +38 -0
- package/dest/crypto/random/randomness_singleton.d.ts +24 -0
- package/dest/crypto/random/randomness_singleton.d.ts.map +1 -0
- package/dest/crypto/random/randomness_singleton.js +55 -0
- package/dest/crypto/schnorr/index.d.ts +32 -0
- package/dest/crypto/schnorr/index.d.ts.map +1 -0
- package/dest/crypto/schnorr/index.js +60 -0
- package/dest/crypto/schnorr/signature.d.ts +48 -0
- package/dest/crypto/schnorr/signature.d.ts.map +1 -0
- package/dest/crypto/schnorr/signature.js +77 -0
- package/dest/crypto/secp256k1/index.d.ts +30 -0
- package/dest/crypto/secp256k1/index.d.ts.map +1 -0
- package/dest/crypto/secp256k1/index.js +121 -0
- package/dest/crypto/secp256k1-signer/index.d.ts +3 -0
- package/dest/crypto/secp256k1-signer/index.d.ts.map +1 -0
- package/dest/crypto/secp256k1-signer/index.js +2 -0
- package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts +24 -0
- package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts.map +1 -0
- package/dest/crypto/secp256k1-signer/secp256k1_signer.js +30 -0
- package/dest/crypto/secp256k1-signer/utils.d.ts +102 -0
- package/dest/crypto/secp256k1-signer/utils.d.ts.map +1 -0
- package/dest/crypto/secp256k1-signer/utils.js +196 -0
- package/dest/crypto/sha256/index.d.ts +37 -0
- package/dest/crypto/sha256/index.d.ts.map +1 -0
- package/dest/crypto/sha256/index.js +208 -0
- package/dest/crypto/sha512/index.d.ts +9 -0
- package/dest/crypto/sha512/index.d.ts.map +1 -0
- package/dest/crypto/sha512/index.js +12 -0
- package/dest/crypto/signature/index.d.ts +17 -0
- package/dest/crypto/signature/index.d.ts.map +1 -0
- package/dest/crypto/signature/index.js +3 -0
- package/dest/crypto/sync/index.d.ts +3 -0
- package/dest/crypto/sync/index.d.ts.map +1 -0
- package/dest/crypto/sync/index.js +4 -0
- package/dest/crypto/sync/pedersen/index.d.ts +19 -0
- package/dest/crypto/sync/pedersen/index.d.ts.map +1 -0
- package/dest/crypto/sync/pedersen/index.js +45 -0
- package/dest/crypto/sync/poseidon/index.d.ts +23 -0
- package/dest/crypto/sync/poseidon/index.d.ts.map +1 -0
- package/dest/crypto/sync/poseidon/index.js +60 -0
- package/dest/curves/bls12/field.d.ts +148 -0
- package/dest/curves/bls12/field.d.ts.map +1 -0
- package/dest/curves/bls12/field.js +357 -0
- package/dest/curves/bls12/index.d.ts +3 -0
- package/dest/curves/bls12/index.d.ts.map +1 -0
- package/dest/curves/bls12/index.js +2 -0
- package/dest/curves/bls12/point.d.ts +229 -0
- package/dest/curves/bls12/point.d.ts.map +1 -0
- package/dest/curves/bls12/point.js +400 -0
- package/dest/curves/bn254/field.d.ts +185 -0
- package/dest/curves/bn254/field.d.ts.map +1 -0
- package/dest/curves/bn254/field.js +420 -0
- package/dest/curves/bn254/index.d.ts +3 -0
- package/dest/curves/bn254/index.d.ts.map +1 -0
- package/dest/curves/bn254/index.js +2 -0
- package/dest/curves/bn254/point.d.ts +54 -0
- package/dest/curves/bn254/point.d.ts.map +1 -0
- package/dest/curves/bn254/point.js +143 -0
- package/dest/curves/grumpkin/index.d.ts +10 -0
- package/dest/curves/grumpkin/index.d.ts.map +1 -0
- package/dest/curves/grumpkin/index.js +3 -0
- package/dest/curves/grumpkin/point.d.ts +168 -0
- package/dest/curves/grumpkin/point.d.ts.map +1 -0
- package/dest/curves/grumpkin/point.js +263 -0
- package/dest/decorators/index.d.ts +2 -0
- package/dest/decorators/index.d.ts.map +1 -0
- package/dest/decorators/index.js +1 -0
- package/dest/decorators/memoize.d.ts +2 -0
- package/dest/decorators/memoize.d.ts.map +1 -0
- package/dest/decorators/memoize.js +11 -0
- package/dest/error/index.d.ts +21 -0
- package/dest/error/index.d.ts.map +1 -0
- package/dest/error/index.js +17 -0
- package/dest/eth-address/index.d.ts +143 -0
- package/dest/eth-address/index.d.ts.map +1 -0
- package/dest/eth-address/index.js +224 -0
- package/dest/eth-signature/eth_signature.d.ts +65 -0
- package/dest/eth-signature/eth_signature.d.ts.map +1 -0
- package/dest/eth-signature/eth_signature.js +110 -0
- package/dest/eth-signature/index.d.ts +2 -0
- package/dest/eth-signature/index.d.ts.map +1 -0
- package/dest/eth-signature/index.js +1 -0
- 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 +91 -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/fs/index.d.ts +3 -0
- package/dest/fs/index.d.ts.map +1 -0
- package/dest/fs/index.js +2 -0
- package/dest/fs/run_in_dir.d.ts +2 -0
- package/dest/fs/run_in_dir.d.ts.map +1 -0
- package/dest/fs/run_in_dir.js +31 -0
- package/dest/fs/try_rm_dir.d.ts +3 -0
- package/dest/fs/try_rm_dir.d.ts.map +1 -0
- package/dest/fs/try_rm_dir.js +16 -0
- package/dest/iterable/all.d.ts +9 -0
- package/dest/iterable/all.d.ts.map +1 -0
- package/dest/iterable/all.js +18 -0
- package/dest/iterable/filter.d.ts +10 -0
- package/dest/iterable/filter.d.ts.map +1 -0
- package/dest/iterable/filter.js +48 -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 +9 -0
- package/dest/iterable/index.d.ts.map +1 -0
- package/dest/iterable/index.js +8 -0
- package/dest/iterable/isAsyncIt.d.ts +7 -0
- package/dest/iterable/isAsyncIt.d.ts.map +1 -0
- package/dest/iterable/isAsyncIt.js +7 -0
- package/dest/iterable/map.d.ts +12 -0
- package/dest/iterable/map.d.ts.map +1 -0
- package/dest/iterable/map.js +36 -0
- package/dest/iterable/peek.d.ts +19 -0
- package/dest/iterable/peek.d.ts.map +1 -0
- package/dest/iterable/peek.js +33 -0
- package/dest/iterable/sort.d.ts +14 -0
- package/dest/iterable/sort.d.ts.map +1 -0
- package/dest/iterable/sort.js +15 -0
- package/dest/iterable/take.d.ts +10 -0
- package/dest/iterable/take.d.ts.map +1 -0
- package/dest/iterable/take.js +32 -0
- package/dest/iterable/toArray.d.ts +2 -0
- package/dest/iterable/toArray.d.ts.map +1 -0
- package/dest/iterable/toArray.js +7 -0
- package/dest/iterator/filter.d.ts +3 -0
- package/dest/iterator/filter.d.ts.map +1 -0
- package/dest/iterator/filter.js +7 -0
- package/dest/iterator/index.d.ts +2 -0
- package/dest/iterator/index.d.ts.map +1 -0
- package/dest/iterator/index.js +1 -0
- package/dest/jest/env.js +48 -0
- package/dest/jest/setup.js +34 -0
- package/dest/jest/setupAfterEnv.js +3 -0
- package/dest/json-rpc/client/fetch.d.ts +37 -0
- package/dest/json-rpc/client/fetch.d.ts.map +1 -0
- package/dest/json-rpc/client/fetch.js +67 -0
- package/dest/json-rpc/client/index.d.ts +3 -0
- package/dest/json-rpc/client/index.d.ts.map +1 -0
- package/dest/json-rpc/client/index.js +2 -0
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts +33 -0
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -0
- package/dest/json-rpc/client/safe_json_rpc_client.js +218 -0
- package/dest/json-rpc/client/undici.d.ts +16 -0
- package/dest/json-rpc/client/undici.d.ts.map +1 -0
- package/dest/json-rpc/client/undici.js +112 -0
- package/dest/json-rpc/convert.d.ts +20 -0
- package/dest/json-rpc/convert.d.ts.map +1 -0
- package/dest/json-rpc/convert.js +40 -0
- package/dest/json-rpc/errors.d.ts +4 -0
- package/dest/json-rpc/errors.d.ts.map +1 -0
- package/dest/json-rpc/errors.js +6 -0
- package/dest/json-rpc/fixtures/class_a.d.ts +13 -0
- package/dest/json-rpc/fixtures/class_a.d.ts.map +1 -0
- package/dest/json-rpc/fixtures/class_a.js +20 -0
- package/dest/json-rpc/fixtures/class_b.d.ts +13 -0
- package/dest/json-rpc/fixtures/class_b.d.ts.map +1 -0
- package/dest/json-rpc/fixtures/class_b.js +20 -0
- package/dest/json-rpc/fixtures/test_state.d.ts +85 -0
- package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -0
- package/dest/json-rpc/fixtures/test_state.js +171 -0
- package/dest/json-rpc/index.d.ts +3 -0
- package/dest/json-rpc/index.d.ts.map +1 -0
- package/dest/json-rpc/index.js +2 -0
- package/dest/json-rpc/js_utils.d.ts +13 -0
- package/dest/json-rpc/js_utils.d.ts.map +1 -0
- package/dest/json-rpc/js_utils.js +16 -0
- package/dest/json-rpc/server/api_key_auth.d.ts +19 -0
- package/dest/json-rpc/server/api_key_auth.d.ts.map +1 -0
- package/dest/json-rpc/server/api_key_auth.js +57 -0
- package/dest/json-rpc/server/index.d.ts +3 -0
- package/dest/json-rpc/server/index.d.ts.map +1 -0
- package/dest/json-rpc/server/index.js +2 -0
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts +177 -0
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -0
- package/dest/json-rpc/server/safe_json_rpc_server.js +570 -0
- package/dest/json-rpc/test/index.d.ts +2 -0
- package/dest/json-rpc/test/index.d.ts.map +1 -0
- package/dest/json-rpc/test/index.js +1 -0
- package/dest/json-rpc/test/integration.d.ts +14 -0
- package/dest/json-rpc/test/integration.d.ts.map +1 -0
- package/dest/json-rpc/test/integration.js +21 -0
- 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/bigint-utils.d.ts +5 -0
- package/dest/log/bigint-utils.d.ts.map +1 -0
- package/dest/log/bigint-utils.js +21 -0
- package/dest/log/console.d.ts +11 -0
- package/dest/log/console.d.ts.map +1 -0
- package/dest/log/console.js +36 -0
- package/dest/log/gcloud-logger-config.d.ts +13 -0
- package/dest/log/gcloud-logger-config.d.ts.map +1 -0
- package/dest/log/gcloud-logger-config.js +61 -0
- package/dest/log/index.d.ts +7 -0
- package/dest/log/index.d.ts.map +1 -0
- package/dest/log/index.js +6 -0
- package/dest/log/libp2p_logger.d.ts +10 -0
- package/dest/log/libp2p_logger.d.ts.map +1 -0
- package/dest/log/libp2p_logger.js +76 -0
- package/dest/log/log-filters.d.ts +20 -0
- package/dest/log/log-filters.d.ts.map +1 -0
- package/dest/log/log-filters.js +73 -0
- package/dest/log/log-levels.d.ts +3 -0
- package/dest/log/log-levels.d.ts.map +1 -0
- package/dest/log/log-levels.js +10 -0
- package/dest/log/log_fn.d.ts +7 -0
- package/dest/log/log_fn.d.ts.map +1 -0
- package/dest/log/log_fn.js +1 -0
- package/dest/log/noir_debug_log_util.d.ts +14 -0
- package/dest/log/noir_debug_log_util.d.ts.map +1 -0
- package/dest/log/noir_debug_log_util.js +14 -0
- package/dest/log/pino-logger-server.d.ts +9 -0
- package/dest/log/pino-logger-server.d.ts.map +1 -0
- package/dest/log/pino-logger-server.js +18 -0
- package/dest/log/pino-logger.d.ts +86 -0
- package/dest/log/pino-logger.d.ts.map +1 -0
- package/dest/log/pino-logger.js +347 -0
- package/dest/message/index.d.ts +32 -0
- package/dest/message/index.d.ts.map +1 -0
- package/dest/message/index.js +27 -0
- package/dest/mutex/index.d.ts +53 -0
- package/dest/mutex/index.d.ts.map +1 -0
- package/dest/mutex/index.js +78 -0
- package/dest/mutex/mutex_database.d.ts +10 -0
- package/dest/mutex/mutex_database.d.ts.map +1 -0
- package/dest/mutex/mutex_database.js +4 -0
- package/dest/noir/index.d.ts +2 -0
- package/dest/noir/index.d.ts.map +1 -0
- package/dest/noir/index.js +1 -0
- package/dest/noir/noir_package_config.d.ts +44 -0
- package/dest/noir/noir_package_config.d.ts.map +1 -0
- package/dest/noir/noir_package_config.js +36 -0
- package/dest/number/index.d.ts +3 -0
- package/dest/number/index.d.ts.map +1 -0
- package/dest/number/index.js +12 -0
- package/dest/profiler/index.d.ts +2 -0
- package/dest/profiler/index.d.ts.map +1 -0
- package/dest/profiler/index.js +1 -0
- package/dest/profiler/profiler.d.ts +8 -0
- package/dest/profiler/profiler.d.ts.map +1 -0
- package/dest/profiler/profiler.js +97 -0
- package/dest/promise/index.d.ts +3 -0
- package/dest/promise/index.d.ts.map +1 -0
- package/dest/promise/index.js +2 -0
- package/dest/promise/running-promise.d.ts +53 -0
- package/dest/promise/running-promise.d.ts.map +1 -0
- package/dest/promise/running-promise.js +122 -0
- package/dest/promise/utils.d.ts +25 -0
- package/dest/promise/utils.d.ts.map +1 -0
- package/dest/promise/utils.js +40 -0
- package/dest/queue/base_memory_queue.d.ts +65 -0
- package/dest/queue/base_memory_queue.d.ts.map +1 -0
- package/dest/queue/base_memory_queue.js +116 -0
- package/dest/queue/batch_queue.d.ts +47 -0
- package/dest/queue/batch_queue.d.ts.map +1 -0
- package/dest/queue/batch_queue.js +106 -0
- package/dest/queue/bounded_serial_queue.d.ts +56 -0
- package/dest/queue/bounded_serial_queue.d.ts.map +1 -0
- package/dest/queue/bounded_serial_queue.js +84 -0
- package/dest/queue/fifo_memory_queue.d.ts +21 -0
- package/dest/queue/fifo_memory_queue.d.ts.map +1 -0
- package/dest/queue/fifo_memory_queue.js +29 -0
- package/dest/queue/index.d.ts +7 -0
- package/dest/queue/index.d.ts.map +1 -0
- package/dest/queue/index.js +6 -0
- package/dest/queue/priority_memory_queue.d.ts +13 -0
- package/dest/queue/priority_memory_queue.d.ts.map +1 -0
- package/dest/queue/priority_memory_queue.js +16 -0
- package/dest/queue/priority_queue.d.ts +14 -0
- package/dest/queue/priority_queue.d.ts.map +1 -0
- package/dest/queue/priority_queue.js +29 -0
- package/dest/queue/semaphore.d.ts +27 -0
- package/dest/queue/semaphore.d.ts.map +1 -0
- package/dest/queue/semaphore.js +26 -0
- package/dest/queue/serial_queue.d.ts +49 -0
- package/dest/queue/serial_queue.d.ts.map +1 -0
- package/dest/queue/serial_queue.js +74 -0
- package/dest/retry/index.d.ts +83 -0
- package/dest/retry/index.d.ts.map +1 -0
- package/dest/retry/index.js +146 -0
- package/dest/running-promise/index.d.ts +2 -0
- package/dest/running-promise/index.d.ts.map +1 -0
- package/dest/running-promise/index.js +1 -0
- package/dest/schemas/api.d.ts +23 -0
- package/dest/schemas/api.d.ts.map +1 -0
- package/dest/schemas/api.js +9 -0
- package/dest/schemas/index.d.ts +6 -0
- package/dest/schemas/index.d.ts.map +1 -0
- package/dest/schemas/index.js +5 -0
- package/dest/schemas/parse.d.ts +9 -0
- package/dest/schemas/parse.d.ts.map +1 -0
- package/dest/schemas/parse.js +23 -0
- package/dest/schemas/schemas.d.ts +46 -0
- package/dest/schemas/schemas.d.ts.map +1 -0
- package/dest/schemas/schemas.js +56 -0
- package/dest/schemas/types.d.ts +33 -0
- package/dest/schemas/types.d.ts.map +1 -0
- package/dest/schemas/types.js +25 -0
- package/dest/schemas/utils.d.ts +47 -0
- package/dest/schemas/utils.d.ts.map +1 -0
- package/dest/schemas/utils.js +54 -0
- package/dest/serialize/buffer_reader.d.ts +274 -0
- package/dest/serialize/buffer_reader.d.ts.map +1 -0
- package/dest/serialize/buffer_reader.js +359 -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/field_reader.d.ts +121 -0
- package/dest/serialize/field_reader.d.ts.map +1 -0
- package/dest/serialize/field_reader.js +164 -0
- package/dest/serialize/free_funcs.d.ts +107 -0
- package/dest/serialize/free_funcs.d.ts.map +1 -0
- package/dest/serialize/free_funcs.js +183 -0
- package/dest/serialize/index.d.ts +8 -0
- package/dest/serialize/index.d.ts.map +1 -0
- package/dest/serialize/index.js +7 -0
- package/dest/serialize/serialize.d.ts +168 -0
- package/dest/serialize/serialize.d.ts.map +1 -0
- package/dest/serialize/serialize.js +258 -0
- package/dest/serialize/type_registry.d.ts +23 -0
- package/dest/serialize/type_registry.d.ts.map +1 -0
- package/dest/serialize/type_registry.js +61 -0
- package/dest/serialize/types.d.ts +33 -0
- package/dest/serialize/types.d.ts.map +1 -0
- package/dest/serialize/types.js +21 -0
- package/dest/sleep/index.d.ts +54 -0
- package/dest/sleep/index.d.ts.map +1 -0
- package/dest/sleep/index.js +80 -0
- package/dest/string/index.d.ts +18 -0
- package/dest/string/index.d.ts.map +1 -0
- package/dest/string/index.js +62 -0
- package/dest/testing/files/index.d.ts +20 -0
- package/dest/testing/files/index.d.ts.map +1 -0
- package/dest/testing/files/index.js +59 -0
- package/dest/testing/formatting.d.ts +4 -0
- package/dest/testing/formatting.d.ts.map +1 -0
- package/dest/testing/formatting.js +3 -0
- package/dest/testing/index.d.ts +5 -0
- package/dest/testing/index.d.ts.map +1 -0
- package/dest/testing/index.js +4 -0
- package/dest/testing/port_allocator.d.ts +10 -0
- package/dest/testing/port_allocator.d.ts.map +1 -0
- package/dest/testing/port_allocator.js +29 -0
- package/dest/testing/snapshot_serializer.d.ts +5 -0
- package/dest/testing/snapshot_serializer.d.ts.map +1 -0
- package/dest/testing/snapshot_serializer.js +32 -0
- package/dest/testing/test_data.d.ts +7 -0
- package/dest/testing/test_data.d.ts.map +1 -0
- package/dest/testing/test_data.js +29 -0
- package/dest/timer/date.d.ts +39 -0
- package/dest/timer/date.d.ts.map +1 -0
- package/dest/timer/date.js +62 -0
- package/dest/timer/elapsed.d.ts +13 -0
- package/dest/timer/elapsed.d.ts.map +1 -0
- package/dest/timer/elapsed.js +25 -0
- package/dest/timer/index.d.ts +5 -0
- package/dest/timer/index.d.ts.map +1 -0
- package/dest/timer/index.js +4 -0
- package/dest/timer/timeout.d.ts +56 -0
- package/dest/timer/timeout.d.ts.map +1 -0
- package/dest/timer/timeout.js +113 -0
- package/dest/timer/timer.d.ts +37 -0
- package/dest/timer/timer.d.ts.map +1 -0
- package/dest/timer/timer.js +40 -0
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts +111 -0
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts.map +1 -0
- package/dest/transport/dispatch/create_dispatch_proxy.js +59 -0
- package/dest/transport/dispatch/messages.d.ts +52 -0
- package/dest/transport/dispatch/messages.d.ts.map +1 -0
- package/dest/transport/dispatch/messages.js +13 -0
- package/dest/transport/index.d.ts +10 -0
- package/dest/transport/index.d.ts.map +1 -0
- package/dest/transport/index.js +9 -0
- package/dest/transport/interface/connector.d.ts +8 -0
- package/dest/transport/interface/connector.d.ts.map +1 -0
- package/dest/transport/interface/connector.js +3 -0
- package/dest/transport/interface/listener.d.ts +12 -0
- package/dest/transport/interface/listener.d.ts.map +1 -0
- package/dest/transport/interface/listener.js +4 -0
- package/dest/transport/interface/socket.d.ts +13 -0
- package/dest/transport/interface/socket.d.ts.map +1 -0
- package/dest/transport/interface/socket.js +7 -0
- package/dest/transport/interface/transferable.d.ts +68 -0
- package/dest/transport/interface/transferable.d.ts.map +1 -0
- package/dest/transport/interface/transferable.js +63 -0
- package/dest/transport/node/index.d.ts +3 -0
- package/dest/transport/node/index.d.ts.map +1 -0
- package/dest/transport/node/index.js +2 -0
- package/dest/transport/node/node_connector.d.ts +27 -0
- package/dest/transport/node/node_connector.d.ts.map +1 -0
- package/dest/transport/node/node_connector.js +26 -0
- package/dest/transport/node/node_connector_socket.d.ts +41 -0
- package/dest/transport/node/node_connector_socket.d.ts.map +1 -0
- package/dest/transport/node/node_connector_socket.js +44 -0
- package/dest/transport/node/node_listener.d.ts +25 -0
- package/dest/transport/node/node_listener.d.ts.map +1 -0
- package/dest/transport/node/node_listener.js +26 -0
- package/dest/transport/node/node_listener_socket.d.ts +36 -0
- package/dest/transport/node/node_listener_socket.d.ts.map +1 -0
- package/dest/transport/node/node_listener_socket.js +40 -0
- package/dest/transport/transport_client.d.ts +60 -0
- package/dest/transport/transport_client.d.ts.map +1 -0
- package/dest/transport/transport_client.js +96 -0
- package/dest/transport/transport_server.d.ts +47 -0
- package/dest/transport/transport_server.d.ts.map +1 -0
- package/dest/transport/transport_server.js +114 -0
- package/dest/trees/balanced_merkle_tree_root.d.ts +16 -0
- package/dest/trees/balanced_merkle_tree_root.d.ts.map +1 -0
- package/dest/trees/balanced_merkle_tree_root.js +50 -0
- package/dest/trees/hasher.d.ts +40 -0
- package/dest/trees/hasher.d.ts.map +1 -0
- package/dest/trees/hasher.js +10 -0
- package/dest/trees/index.d.ts +13 -0
- package/dest/trees/index.d.ts.map +1 -0
- package/dest/trees/index.js +12 -0
- package/dest/trees/indexed_merkle_tree.d.ts +11 -0
- package/dest/trees/indexed_merkle_tree.d.ts.map +1 -0
- package/dest/trees/indexed_merkle_tree.js +27 -0
- package/dest/trees/indexed_merkle_tree_calculator.d.ts +21 -0
- package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -0
- package/dest/trees/indexed_merkle_tree_calculator.js +87 -0
- package/dest/trees/indexed_tree_leaf.d.ts +55 -0
- package/dest/trees/indexed_tree_leaf.d.ts.map +1 -0
- package/dest/trees/indexed_tree_leaf.js +5 -0
- package/dest/trees/membership_witness.d.ts +63 -0
- package/dest/trees/membership_witness.d.ts.map +1 -0
- package/dest/trees/membership_witness.js +83 -0
- package/dest/trees/merkle_tree.d.ts +16 -0
- package/dest/trees/merkle_tree.d.ts.map +1 -0
- package/dest/trees/merkle_tree.js +58 -0
- package/dest/trees/merkle_tree_calculator.d.ts +16 -0
- package/dest/trees/merkle_tree_calculator.d.ts.map +1 -0
- package/dest/trees/merkle_tree_calculator.js +57 -0
- package/dest/trees/sibling_path.d.ts +96 -0
- package/dest/trees/sibling_path.d.ts.map +1 -0
- package/dest/trees/sibling_path.js +139 -0
- package/dest/trees/unbalanced_merkle_tree_calculator.d.ts +48 -0
- package/dest/trees/unbalanced_merkle_tree_calculator.d.ts.map +1 -0
- package/dest/trees/unbalanced_merkle_tree_calculator.js +154 -0
- package/dest/trees/unbalanced_merkle_tree_root.d.ts +27 -0
- package/dest/trees/unbalanced_merkle_tree_root.d.ts.map +1 -0
- package/dest/trees/unbalanced_merkle_tree_root.js +83 -0
- package/dest/trees/unbalanced_tree_store.d.ts +24 -0
- package/dest/trees/unbalanced_tree_store.d.ts.map +1 -0
- package/dest/trees/unbalanced_tree_store.js +148 -0
- package/dest/types/index.d.ts +68 -0
- package/dest/types/index.d.ts.map +1 -0
- package/dest/types/index.js +24 -0
- package/dest/url/index.d.ts +9 -0
- package/dest/url/index.d.ts.map +1 -0
- package/dest/url/index.js +62 -0
- package/dest/validation/index.d.ts +9 -0
- package/dest/validation/index.d.ts.map +1 -0
- package/dest/validation/index.js +15 -0
- package/package.json +213 -0
- package/src/array/array.ts +147 -0
- package/src/array/index.ts +2 -0
- package/src/array/sorted_array.ts +138 -0
- package/src/async-map/index.ts +18 -0
- package/src/async-pool/index.ts +51 -0
- package/src/bigint/index.ts +20 -0
- package/src/bigint-buffer/index.ts +92 -0
- package/src/branded-types/block_number.ts +135 -0
- package/src/branded-types/buffer32_hash.ts +38 -0
- package/src/branded-types/checkpoint_number.ts +130 -0
- package/src/branded-types/epoch.ts +88 -0
- package/src/branded-types/index.ts +8 -0
- package/src/branded-types/index_within_checkpoint.ts +88 -0
- package/src/branded-types/slot.ts +93 -0
- package/src/branded-types/types.ts +2 -0
- package/src/buffer/buffer16.ts +135 -0
- package/src/buffer/buffer32.ts +116 -0
- package/src/buffer/index.ts +3 -0
- package/src/buffer/utils.ts +8 -0
- package/src/collection/array.ts +351 -0
- package/src/collection/index.ts +4 -0
- package/src/collection/lru_map.ts +143 -0
- package/src/collection/lru_set.ts +115 -0
- package/src/collection/object.ts +89 -0
- package/src/committable/committable.ts +46 -0
- package/src/committable/index.ts +1 -0
- package/src/config/env_var.ts +412 -0
- package/src/config/index.ts +419 -0
- package/src/config/network_config.ts +21 -0
- package/src/config/network_name.ts +28 -0
- package/src/config/parse-env.ts +4 -0
- package/src/config/secret_value.ts +49 -0
- package/src/crypto/aes128/index.ts +77 -0
- package/src/crypto/bls/bn254_keystore.ts +276 -0
- package/src/crypto/bls/index.ts +76 -0
- package/src/crypto/bn254/index.ts +64 -0
- package/src/crypto/ecdsa/index.ts +88 -0
- package/src/crypto/ecdsa/signature.ts +100 -0
- package/src/crypto/grumpkin/index.ts +90 -0
- package/src/crypto/keccak/index.ts +283 -0
- package/src/crypto/keys/index.ts +26 -0
- package/src/crypto/pedersen/index.ts +1 -0
- package/src/crypto/pedersen/pedersen.noble.ts +573 -0
- package/src/crypto/pedersen/pedersen.wasm.ts +52 -0
- package/src/crypto/poseidon/index.ts +83 -0
- package/src/crypto/random/index.ts +47 -0
- package/src/crypto/random/randomness_singleton.ts +64 -0
- package/src/crypto/schnorr/index.ts +61 -0
- package/src/crypto/schnorr/signature.ts +87 -0
- package/src/crypto/secp256k1/index.ts +61 -0
- package/src/crypto/secp256k1-signer/index.ts +2 -0
- package/src/crypto/secp256k1-signer/secp256k1_signer.ts +38 -0
- package/src/crypto/secp256k1-signer/utils.ts +244 -0
- package/src/crypto/sha256/index.ts +194 -0
- package/src/crypto/sha512/index.ts +16 -0
- package/src/crypto/signature/index.ts +17 -0
- package/src/crypto/sync/index.ts +6 -0
- package/src/crypto/sync/pedersen/index.ts +46 -0
- package/src/crypto/sync/poseidon/index.ts +72 -0
- package/src/curves/bls12/field.ts +456 -0
- package/src/curves/bls12/index.ts +2 -0
- package/src/curves/bls12/point.ts +450 -0
- package/src/curves/bn254/field.ts +531 -0
- package/src/curves/bn254/index.ts +2 -0
- package/src/curves/bn254/point.ts +170 -0
- package/src/curves/grumpkin/index.ts +11 -0
- package/src/curves/grumpkin/point.ts +300 -0
- package/src/decorators/index.ts +1 -0
- package/src/decorators/memoize.ts +11 -0
- package/src/error/index.ts +22 -0
- package/src/eth-address/index.ts +269 -0
- package/src/eth-signature/eth_signature.ts +155 -0
- package/src/eth-signature/index.ts +1 -0
- package/src/fifo/fifo_frame_reader.ts +113 -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/fs/index.ts +2 -0
- package/src/fs/run_in_dir.ts +33 -0
- package/src/fs/try_rm_dir.ts +15 -0
- package/src/iterable/all.ts +32 -0
- package/src/iterable/filter.ts +77 -0
- package/src/iterable/first.ts +14 -0
- package/src/iterable/index.ts +8 -0
- package/src/iterable/isAsyncIt.ts +8 -0
- package/src/iterable/map.ts +66 -0
- package/src/iterable/peek.ts +58 -0
- package/src/iterable/sort.ts +39 -0
- package/src/iterable/take.ts +54 -0
- package/src/iterable/toArray.ts +9 -0
- package/src/iterator/filter.ts +11 -0
- package/src/iterator/index.ts +1 -0
- package/src/jest/env.mjs +52 -0
- package/src/jest/setup.mjs +38 -0
- package/src/jest/setupAfterEnv.mjs +3 -0
- package/src/json-rpc/README.md +55 -0
- package/src/json-rpc/client/fetch.ts +98 -0
- package/src/json-rpc/client/index.ts +2 -0
- package/src/json-rpc/client/safe_json_rpc_client.ts +283 -0
- package/src/json-rpc/client/undici.ts +128 -0
- package/src/json-rpc/convert.ts +52 -0
- package/src/json-rpc/errors.ts +6 -0
- package/src/json-rpc/fixtures/class_a.ts +18 -0
- package/src/json-rpc/fixtures/class_b.ts +18 -0
- package/src/json-rpc/fixtures/test_state.ts +143 -0
- package/src/json-rpc/index.ts +2 -0
- package/src/json-rpc/js_utils.ts +21 -0
- package/src/json-rpc/server/api_key_auth.ts +63 -0
- package/src/json-rpc/server/index.ts +2 -0
- package/src/json-rpc/server/safe_json_rpc_server.ts +626 -0
- package/src/json-rpc/test/index.ts +1 -0
- package/src/json-rpc/test/integration.ts +35 -0
- package/src/log/aws-logger-config.ts +32 -0
- package/src/log/bigint-utils.ts +25 -0
- package/src/log/console.ts +42 -0
- package/src/log/gcloud-logger-config.ts +72 -0
- package/src/log/index.ts +6 -0
- package/src/log/libp2p_logger.ts +93 -0
- package/src/log/log-filters.ts +81 -0
- package/src/log/log-levels.ts +3 -0
- package/src/log/log_fn.ts +5 -0
- package/src/log/noir_debug_log_util.ts +21 -0
- package/src/log/pino-logger-server.ts +25 -0
- package/src/log/pino-logger.ts +406 -0
- package/src/message/index.ts +47 -0
- package/src/mutex/index.ts +84 -0
- package/src/mutex/mutex_database.ts +11 -0
- package/src/noir/index.ts +1 -0
- package/src/noir/noir_package_config.ts +66 -0
- package/src/number/index.ts +14 -0
- package/src/profiler/index.ts +1 -0
- package/src/profiler/profiler.ts +125 -0
- package/src/promise/index.ts +2 -0
- package/src/promise/running-promise.ts +138 -0
- package/src/promise/utils.ts +60 -0
- package/src/queue/base_memory_queue.ts +138 -0
- package/src/queue/batch_queue.ts +121 -0
- package/src/queue/bounded_serial_queue.ts +103 -0
- package/src/queue/fifo_memory_queue.ts +39 -0
- package/src/queue/index.ts +6 -0
- package/src/queue/priority_memory_queue.ts +20 -0
- package/src/queue/priority_queue.ts +34 -0
- package/src/queue/semaphore.ts +38 -0
- package/src/queue/serial_queue.ts +86 -0
- package/src/retry/index.ts +185 -0
- package/src/running-promise/index.ts +1 -0
- package/src/schemas/api.ts +47 -0
- package/src/schemas/index.ts +5 -0
- package/src/schemas/parse.ts +32 -0
- package/src/schemas/schemas.ts +93 -0
- package/src/schemas/types.ts +36 -0
- package/src/schemas/utils.ts +91 -0
- package/src/serialize/buffer_reader.ts +472 -0
- package/src/serialize/buffer_sink.ts +350 -0
- package/src/serialize/field_reader.ts +208 -0
- package/src/serialize/free_funcs.ts +198 -0
- package/src/serialize/index.ts +7 -0
- package/src/serialize/serialize.ts +320 -0
- package/src/serialize/type_registry.ts +75 -0
- package/src/serialize/types.ts +40 -0
- package/src/sleep/index.ts +90 -0
- package/src/string/index.ts +80 -0
- package/src/testing/files/index.ts +74 -0
- package/src/testing/formatting.ts +3 -0
- package/src/testing/index.ts +4 -0
- package/src/testing/port_allocator.ts +31 -0
- package/src/testing/snapshot_serializer.ts +33 -0
- package/src/testing/test_data.ts +36 -0
- package/src/timer/date.ts +82 -0
- package/src/timer/elapsed.ts +23 -0
- package/src/timer/index.ts +4 -0
- package/src/timer/timeout.ts +136 -0
- package/src/timer/timer.ts +48 -0
- package/src/transport/dispatch/create_dispatch_proxy.ts +151 -0
- package/src/transport/dispatch/messages.ts +58 -0
- package/src/transport/index.ts +9 -0
- package/src/transport/interface/connector.ts +8 -0
- package/src/transport/interface/listener.ts +15 -0
- package/src/transport/interface/socket.ts +14 -0
- package/src/transport/interface/transferable.ts +125 -0
- package/src/transport/node/index.ts +2 -0
- package/src/transport/node/node_connector.ts +30 -0
- package/src/transport/node/node_connector_socket.ts +52 -0
- package/src/transport/node/node_listener.ts +34 -0
- package/src/transport/node/node_listener_socket.ts +48 -0
- package/src/transport/transport_client.ts +130 -0
- package/src/transport/transport_server.ts +111 -0
- package/src/trees/balanced_merkle_tree_root.ts +65 -0
- package/src/trees/hasher.ts +51 -0
- package/src/trees/index.ts +12 -0
- package/src/trees/indexed_merkle_tree.ts +40 -0
- package/src/trees/indexed_merkle_tree_calculator.ts +98 -0
- package/src/trees/indexed_tree_leaf.ts +56 -0
- package/src/trees/membership_witness.ts +112 -0
- package/src/trees/merkle_tree.ts +75 -0
- package/src/trees/merkle_tree_calculator.ts +66 -0
- package/src/trees/sibling_path.ts +177 -0
- package/src/trees/unbalanced_merkle_tree_calculator.ts +176 -0
- package/src/trees/unbalanced_merkle_tree_root.ts +112 -0
- package/src/trees/unbalanced_tree_store.ts +161 -0
- package/src/types/index.ts +103 -0
- package/src/url/index.ts +72 -0
- package/src/validation/index.ts +18 -0
|
@@ -0,0 +1,626 @@
|
|
|
1
|
+
import cors from '@koa/cors';
|
|
2
|
+
import http from 'http';
|
|
3
|
+
import { type default as Application, default as Koa } from 'koa';
|
|
4
|
+
import bodyParser from 'koa-bodyparser';
|
|
5
|
+
import compress from 'koa-compress';
|
|
6
|
+
import Router from 'koa-router';
|
|
7
|
+
import type { AddressInfo } from 'net';
|
|
8
|
+
import { format, inspect } from 'util';
|
|
9
|
+
import { ZodError } from 'zod';
|
|
10
|
+
|
|
11
|
+
import { type Logger, createLogger } from '../../log/index.js';
|
|
12
|
+
import { promiseWithResolvers } from '../../promise/utils.js';
|
|
13
|
+
import {
|
|
14
|
+
type ApiSchema,
|
|
15
|
+
type ApiSchemaFor,
|
|
16
|
+
getSchemaParameters,
|
|
17
|
+
parseWithOptionals,
|
|
18
|
+
schemaHasMethod,
|
|
19
|
+
} from '../../schemas/index.js';
|
|
20
|
+
import { Timer } from '../../timer/index.js';
|
|
21
|
+
import { jsonStringify } from '../convert.js';
|
|
22
|
+
import { assert } from '../js_utils.js';
|
|
23
|
+
|
|
24
|
+
export type DiagnosticsData = {
|
|
25
|
+
id: number | string | null;
|
|
26
|
+
method: string;
|
|
27
|
+
params: any[];
|
|
28
|
+
headers: http.IncomingHttpHeaders;
|
|
29
|
+
requestValidationDurationMs?: number;
|
|
30
|
+
requestValidationSucceeded?: boolean;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export type DiagnosticsMiddleware = (ctx: DiagnosticsData, next: () => Promise<void>) => Promise<void>;
|
|
34
|
+
|
|
35
|
+
export type SafeJsonRpcServerConfig = {
|
|
36
|
+
/** Maximum batch size for batched rpc requests */
|
|
37
|
+
maxBatchSize: number;
|
|
38
|
+
/** Return an HTTP 200 status code on errors, but include an error object as per the JSON RPC spec */
|
|
39
|
+
http200OnError: boolean;
|
|
40
|
+
/** The maximum body size the server will accept */
|
|
41
|
+
maxBodySizeBytes: string;
|
|
42
|
+
/** Origins allowed to make credentialed cross-origin requests. An empty list preserves wildcard CORS. */
|
|
43
|
+
corsAllowedOrigins?: string[];
|
|
44
|
+
/** Headers allowed in cross-origin requests. An empty list reflects the requested headers. */
|
|
45
|
+
corsAllowedHeaders?: string[];
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
type ResolvedSafeJsonRpcServerConfig = Omit<SafeJsonRpcServerConfig, 'corsAllowedOrigins' | 'corsAllowedHeaders'> & {
|
|
49
|
+
corsAllowedOrigins: string[];
|
|
50
|
+
corsAllowedHeaders: string[];
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const defaultServerConfig: ResolvedSafeJsonRpcServerConfig = {
|
|
54
|
+
http200OnError: false,
|
|
55
|
+
maxBatchSize: 100,
|
|
56
|
+
maxBodySizeBytes: '1mb',
|
|
57
|
+
corsAllowedOrigins: [],
|
|
58
|
+
corsAllowedHeaders: [],
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
function normalizeCorsOrigin(origin: string): string {
|
|
62
|
+
if (origin === '*') {
|
|
63
|
+
return origin;
|
|
64
|
+
}
|
|
65
|
+
const url = new URL(origin);
|
|
66
|
+
if (!['http:', 'https:'].includes(url.protocol)) {
|
|
67
|
+
throw new Error(`Invalid CORS origin protocol: ${origin}`);
|
|
68
|
+
}
|
|
69
|
+
if (url.username || url.password || (url.pathname !== '' && url.pathname !== '/') || url.search || url.hash) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`CORS allowed origin must not include credentials, a path, query parameters, or a fragment: ${origin}`,
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
return url.origin;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export class SafeJsonRpcServer {
|
|
78
|
+
/**
|
|
79
|
+
* The HTTP server accepting remote requests.
|
|
80
|
+
* This member field is initialized when the server is started.
|
|
81
|
+
*/
|
|
82
|
+
private httpServer?: http.Server;
|
|
83
|
+
|
|
84
|
+
private config: ResolvedSafeJsonRpcServerConfig;
|
|
85
|
+
|
|
86
|
+
constructor(
|
|
87
|
+
/** The proxy object to delegate requests to */
|
|
88
|
+
private readonly proxy: Proxy,
|
|
89
|
+
config: Partial<SafeJsonRpcServerConfig> = {},
|
|
90
|
+
/** Health check function */
|
|
91
|
+
private readonly healthCheck: StatusCheckFn = () => true,
|
|
92
|
+
/** Additional Koa middlewares */
|
|
93
|
+
private extraMiddlewares: Application.Middleware[] = [],
|
|
94
|
+
/** Additional per-request diagnostics middlewares */
|
|
95
|
+
private diagnosticsMiddleware?: DiagnosticsMiddleware,
|
|
96
|
+
/** Logger */
|
|
97
|
+
private log = createLogger('json-rpc:server'),
|
|
98
|
+
) {
|
|
99
|
+
this.config = { ...defaultServerConfig, ...config };
|
|
100
|
+
this.config.corsAllowedOrigins = this.config.corsAllowedOrigins.map(normalizeCorsOrigin);
|
|
101
|
+
|
|
102
|
+
// handle empty string
|
|
103
|
+
if (!this.config.maxBodySizeBytes) {
|
|
104
|
+
this.config.maxBodySizeBytes = defaultServerConfig.maxBodySizeBytes;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Returns the status of this server, including per-component health when the health check reports it. */
|
|
109
|
+
public getStatus(): Promise<ServerStatus> {
|
|
110
|
+
return Promise.resolve(this.healthCheck()).then(result => {
|
|
111
|
+
const { healthy, details } = normalizeStatusCheckResult(result);
|
|
112
|
+
return { ok: healthy, ...details };
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
public isHealthy(): boolean | Promise<boolean> {
|
|
117
|
+
return this.getStatus().then(status => status.ok);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Get an express app object.
|
|
122
|
+
* @param prefix - Our server prefix.
|
|
123
|
+
* @returns The app object.
|
|
124
|
+
*/
|
|
125
|
+
public getApp(prefix = '') {
|
|
126
|
+
const router = this.getRouter(prefix);
|
|
127
|
+
|
|
128
|
+
const exceptionHandler = async (ctx: Koa.Context, next: () => Promise<void>) => {
|
|
129
|
+
try {
|
|
130
|
+
await next();
|
|
131
|
+
} catch (err: any) {
|
|
132
|
+
const method = (ctx.request.body as any)?.method ?? 'unknown';
|
|
133
|
+
this.log.warn(`Uncaught error in JSON RPC server call ${method}: ${inspect(err)}`);
|
|
134
|
+
if (err && 'name' in err && err.name === 'BadRequestError') {
|
|
135
|
+
ctx.status = 400;
|
|
136
|
+
ctx.body = { jsonrpc: '2.0', id: null, error: { code: -32000, message: `Bad request: ${err.message}` } };
|
|
137
|
+
} else if (err && err instanceof SyntaxError) {
|
|
138
|
+
ctx.status = 400;
|
|
139
|
+
ctx.body = { jsonrpc: '2.0', id: null, error: { code: -32700, message: `Parse error: ${err.message}` } };
|
|
140
|
+
} else {
|
|
141
|
+
ctx.status = 500;
|
|
142
|
+
ctx.body = { jsonrpc: '2.0', id: null, error: { code: -32603, message: err.message ?? 'Internal error' } };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const jsonResponse = async (ctx: Koa.Context, next: () => Promise<void>) => {
|
|
148
|
+
try {
|
|
149
|
+
await next();
|
|
150
|
+
if (ctx.body && typeof ctx.body === 'object') {
|
|
151
|
+
ctx.body = jsonStringify(ctx.body);
|
|
152
|
+
}
|
|
153
|
+
} catch (err: any) {
|
|
154
|
+
ctx.status = 500;
|
|
155
|
+
ctx.body = { jsonrpc: '2.0', error: { code: -32700, message: `Unable to serialize response: ${err.message}` } };
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
const app = new Koa();
|
|
160
|
+
app.on('error', error => {
|
|
161
|
+
this.log.error(`Error on API handler: ${error}`);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
app.use(compress({ br: false }));
|
|
165
|
+
app.use(jsonResponse);
|
|
166
|
+
const corsAllowedHeaders =
|
|
167
|
+
this.config.corsAllowedHeaders.length > 0 ? { allowHeaders: this.config.corsAllowedHeaders } : {};
|
|
168
|
+
if (this.config.corsAllowedOrigins.length === 0) {
|
|
169
|
+
app.use(cors(corsAllowedHeaders));
|
|
170
|
+
} else {
|
|
171
|
+
const allowedOrigins = new Set(this.config.corsAllowedOrigins);
|
|
172
|
+
const allowAnyOrigin = allowedOrigins.has('*');
|
|
173
|
+
app.use(
|
|
174
|
+
cors({
|
|
175
|
+
origin: ctx => {
|
|
176
|
+
const origin = ctx.get('Origin');
|
|
177
|
+
if (!origin) {
|
|
178
|
+
return '';
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (allowAnyOrigin) {
|
|
182
|
+
return origin;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (allowedOrigins.has(origin)) {
|
|
186
|
+
return origin;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return '';
|
|
190
|
+
},
|
|
191
|
+
credentials: true,
|
|
192
|
+
...corsAllowedHeaders,
|
|
193
|
+
}),
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
for (const middleware of this.extraMiddlewares) {
|
|
197
|
+
app.use(middleware);
|
|
198
|
+
}
|
|
199
|
+
app.use(exceptionHandler);
|
|
200
|
+
app.use(
|
|
201
|
+
bodyParser({
|
|
202
|
+
jsonLimit: this.config.maxBodySizeBytes,
|
|
203
|
+
enableTypes: ['json'],
|
|
204
|
+
}),
|
|
205
|
+
);
|
|
206
|
+
app.use(router.routes());
|
|
207
|
+
app.use(router.allowedMethods());
|
|
208
|
+
|
|
209
|
+
return app;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Get a router object wrapping our RPC class.
|
|
214
|
+
* @param prefix - The server prefix.
|
|
215
|
+
* @returns The router object.
|
|
216
|
+
*/
|
|
217
|
+
private getRouter(prefix: string) {
|
|
218
|
+
const router = new Router({ prefix });
|
|
219
|
+
// "JSON RPC mode" where a single endpoint is used and the method is given in the request body
|
|
220
|
+
router.post('/', async (ctx: Koa.Context) => {
|
|
221
|
+
if (Array.isArray(ctx.request.body)) {
|
|
222
|
+
if (ctx.request.body.length > this.config.maxBatchSize) {
|
|
223
|
+
ctx.status = this.config.http200OnError ? 200 : 400;
|
|
224
|
+
ctx.body = {
|
|
225
|
+
jsonrpc: '2.0',
|
|
226
|
+
error: {
|
|
227
|
+
code: -32600,
|
|
228
|
+
message: `Batch request exceeds maximum allowed size of ${this.config.maxBatchSize}`,
|
|
229
|
+
},
|
|
230
|
+
id: null,
|
|
231
|
+
};
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const resp = await this.processBatch(ctx.request.body, ctx.request.headers);
|
|
235
|
+
if (Array.isArray(resp)) {
|
|
236
|
+
ctx.status = 200;
|
|
237
|
+
ctx.body = resp;
|
|
238
|
+
} else {
|
|
239
|
+
ctx.status = this.config.http200OnError ? 200 : 400;
|
|
240
|
+
ctx.body = resp;
|
|
241
|
+
}
|
|
242
|
+
} else {
|
|
243
|
+
const resp = await this.processRequest(ctx.request.body, ctx.request.headers);
|
|
244
|
+
if ('error' in resp) {
|
|
245
|
+
ctx.status = this.config.http200OnError ? 200 : 400;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
ctx.body = resp;
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
return router;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
private async processBatch(requests: any[], headers: http.IncomingHttpHeaders = {}) {
|
|
256
|
+
if (requests.length === 0) {
|
|
257
|
+
return { jsonrpc: '2.0', error: { code: -32600, message: 'Invalid Request' }, id: null };
|
|
258
|
+
}
|
|
259
|
+
const results = await Promise.allSettled(requests.map(req => this.processRequest(req, headers)));
|
|
260
|
+
return results.map(res => {
|
|
261
|
+
if (res.status === 'fulfilled') {
|
|
262
|
+
return res.value;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
this.log.warn(`Uncaught error executing request in batch: ${res.reason}.`);
|
|
266
|
+
return { jsonrpc: '2.0', error: { code: -32603, message: 'Internal error' }, id: null };
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
private async processRequest(request: any, headers: http.IncomingHttpHeaders = {}) {
|
|
271
|
+
if (!request || typeof request !== 'object') {
|
|
272
|
+
return { jsonrpc: '2.0', error: { code: -32600, message: 'Invalid Request' }, id: null };
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const { params = [], jsonrpc = '2.0', id, method } = request;
|
|
276
|
+
if (typeof method !== 'string' || !method) {
|
|
277
|
+
return { jsonrpc: '2.0', id, error: { code: -32600, message: `Invalid request` } };
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Fail if not a registered function in the proxy
|
|
281
|
+
if (typeof method !== 'string' || method === 'constructor' || !this.proxy.hasMethod(method)) {
|
|
282
|
+
return { jsonrpc, id, error: { code: -32601, message: `Method not found: ${method}` } };
|
|
283
|
+
} else {
|
|
284
|
+
try {
|
|
285
|
+
let result: any;
|
|
286
|
+
|
|
287
|
+
if (this.diagnosticsMiddleware) {
|
|
288
|
+
const diagnosticsData: DiagnosticsData = { id: id ?? null, method, params, headers };
|
|
289
|
+
await this.diagnosticsMiddleware(diagnosticsData, async () => {
|
|
290
|
+
result = await this.proxy.call(method, params, (durationMs, succeeded) => {
|
|
291
|
+
diagnosticsData.requestValidationDurationMs = durationMs;
|
|
292
|
+
diagnosticsData.requestValidationSucceeded = succeeded;
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
} else {
|
|
296
|
+
result = await this.proxy.call(method, params);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Coerce an undefined return value to null so the response always carries a `result` key.
|
|
300
|
+
// JSON.stringify drops undefined-valued keys, which would otherwise produce a JSON-RPC
|
|
301
|
+
// response with neither `result` nor `error` — a spec violation that leaves callers unable
|
|
302
|
+
// to distinguish "not found" from a malformed response.
|
|
303
|
+
return { jsonrpc, id, result: result ?? null };
|
|
304
|
+
} catch (err: any) {
|
|
305
|
+
if (err && err instanceof ZodError) {
|
|
306
|
+
const message = err.issues.map(e => `${e.message} (${e.path.join('.')})`).join('. ') || 'Validation error';
|
|
307
|
+
return { jsonrpc: '2.0', id, error: { code: -32701, message } };
|
|
308
|
+
} else if (err) {
|
|
309
|
+
return {
|
|
310
|
+
jsonrpc,
|
|
311
|
+
id,
|
|
312
|
+
error: { code: -32702, data: err.data, message: err.message },
|
|
313
|
+
};
|
|
314
|
+
} else {
|
|
315
|
+
return {
|
|
316
|
+
jsonrpc,
|
|
317
|
+
id,
|
|
318
|
+
error: { code: -32702, message: 'Error executing request' },
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Start this server with koa.
|
|
327
|
+
* @param port - Port number.
|
|
328
|
+
* @param prefix - Prefix string.
|
|
329
|
+
*/
|
|
330
|
+
public start(port: number, prefix = ''): void {
|
|
331
|
+
if (this.httpServer) {
|
|
332
|
+
throw new Error('Server is already listening');
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
336
|
+
this.httpServer = http.createServer(this.getApp(prefix).callback());
|
|
337
|
+
this.httpServer.listen(port);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Stops the HTTP server
|
|
342
|
+
*/
|
|
343
|
+
public stop(): Promise<void> {
|
|
344
|
+
if (!this.httpServer) {
|
|
345
|
+
return Promise.resolve();
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
const { promise, resolve, reject } = promiseWithResolvers<void>();
|
|
349
|
+
this.httpServer.close(err => {
|
|
350
|
+
if (err) {
|
|
351
|
+
reject(err);
|
|
352
|
+
} else {
|
|
353
|
+
resolve();
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
return promise;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Explicitly calls an RPC method.
|
|
361
|
+
* @param methodName - The RPC method.
|
|
362
|
+
* @param jsonParams - The RPC parameters.
|
|
363
|
+
* @returns The remote result.
|
|
364
|
+
*/
|
|
365
|
+
public async call(methodName: string, jsonParams: any[] = []) {
|
|
366
|
+
return await this.proxy.call(methodName, jsonParams);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/** Health of a single component, along with any details worth surfacing to whoever queries the status endpoint. */
|
|
371
|
+
export type StatusCheckResult = {
|
|
372
|
+
/** Whether the component is healthy. */
|
|
373
|
+
healthy: boolean;
|
|
374
|
+
/** Component-specific information, reported next to the healthy flag. */
|
|
375
|
+
details?: object;
|
|
376
|
+
};
|
|
377
|
+
|
|
378
|
+
/** Health check for a component. Returning a plain boolean is shorthand for `{ healthy: <boolean> }`. */
|
|
379
|
+
export type StatusCheckFn = () => boolean | StatusCheckResult | Promise<boolean | StatusCheckResult>;
|
|
380
|
+
|
|
381
|
+
/** Health of a component as reported on the status endpoint: its healthy flag flattened with its details. */
|
|
382
|
+
export type ComponentStatus = { healthy: boolean } & Record<string, unknown>;
|
|
383
|
+
|
|
384
|
+
/** Status of a server as reported on the status endpoint. */
|
|
385
|
+
export type ServerStatus = {
|
|
386
|
+
/** Whether every checked component reported healthy. */
|
|
387
|
+
ok: boolean;
|
|
388
|
+
/** Health of each component keyed by namespace, when the server has component-level health checks. */
|
|
389
|
+
components?: Record<string, ComponentStatus>;
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
/** Returns the status of a server. */
|
|
393
|
+
export type ServerStatusFn = () => ServerStatus | Promise<ServerStatus>;
|
|
394
|
+
|
|
395
|
+
function normalizeStatusCheckResult(result: boolean | StatusCheckResult): StatusCheckResult {
|
|
396
|
+
return typeof result === 'boolean' ? { healthy: result } : result;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
interface Proxy {
|
|
400
|
+
hasMethod(methodName: string): boolean;
|
|
401
|
+
call(
|
|
402
|
+
methodName: string,
|
|
403
|
+
jsonParams?: any[],
|
|
404
|
+
onRequestValidated?: (durationMs: number, succeeded: boolean) => void,
|
|
405
|
+
): Promise<any>;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Forwards calls to a handler. Relies on a schema definition to validate and convert inputs
|
|
410
|
+
* before forwarding calls, and then converts outputs into JSON using default conversions.
|
|
411
|
+
*/
|
|
412
|
+
export class SafeJsonProxy<T extends object = any> implements Proxy {
|
|
413
|
+
private log = createLogger('json-rpc:proxy');
|
|
414
|
+
private schema: ApiSchema;
|
|
415
|
+
|
|
416
|
+
constructor(
|
|
417
|
+
private handler: T,
|
|
418
|
+
schema: ApiSchemaFor<T>,
|
|
419
|
+
) {
|
|
420
|
+
this.schema = schema;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Call an RPC method.
|
|
425
|
+
* @param methodName - The RPC method.
|
|
426
|
+
* @param jsonParams - The RPC parameters.
|
|
427
|
+
* @returns The remote result.
|
|
428
|
+
*/
|
|
429
|
+
public async call(
|
|
430
|
+
methodName: string,
|
|
431
|
+
jsonParams: any[] = [],
|
|
432
|
+
onRequestValidated?: (durationMs: number, succeeded: boolean) => void,
|
|
433
|
+
) {
|
|
434
|
+
this.log.debug(format(`request`, methodName, jsonParams));
|
|
435
|
+
|
|
436
|
+
assert(schemaHasMethod(this.schema, methodName), `Method ${methodName} not found in schema`);
|
|
437
|
+
const method = this.handler[methodName as keyof T];
|
|
438
|
+
assert(typeof method === 'function', `Method ${methodName} is not a function`);
|
|
439
|
+
const validationTimer = new Timer();
|
|
440
|
+
let args: any[];
|
|
441
|
+
try {
|
|
442
|
+
assert(Array.isArray(jsonParams), `Params to ${methodName} is not an array: ${jsonParams}`);
|
|
443
|
+
args = await parseWithOptionals(jsonParams, getSchemaParameters(this.schema[methodName]));
|
|
444
|
+
onRequestValidated?.(validationTimer.ms(), true);
|
|
445
|
+
} catch (error) {
|
|
446
|
+
onRequestValidated?.(validationTimer.ms(), false);
|
|
447
|
+
throw error;
|
|
448
|
+
}
|
|
449
|
+
const ret = await method.apply(this.handler, args);
|
|
450
|
+
this.log.debug(format('response', methodName, ret));
|
|
451
|
+
return ret;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
public hasMethod(methodName: string): boolean {
|
|
455
|
+
return schemaHasMethod(this.schema, methodName) && typeof this.handler[methodName as keyof T] === 'function';
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
class NamespacedSafeJsonProxy implements Proxy {
|
|
460
|
+
private readonly proxies: Record<string, Proxy> = {};
|
|
461
|
+
|
|
462
|
+
constructor(handlers: NamespacedApiHandlers) {
|
|
463
|
+
for (const [namespace, [handler, schema]] of Object.entries(handlers)) {
|
|
464
|
+
this.proxies[namespace] = new SafeJsonProxy(handler, schema);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
public call(
|
|
469
|
+
namespacedMethodName: string,
|
|
470
|
+
jsonParams: any[] = [],
|
|
471
|
+
onRequestValidated?: (durationMs: number, succeeded: boolean) => void,
|
|
472
|
+
) {
|
|
473
|
+
const [namespace, methodName] = namespacedMethodName.split('_', 2);
|
|
474
|
+
assert(namespace && methodName, `Invalid namespaced method name: ${namespacedMethodName}`);
|
|
475
|
+
const handler = this.proxies[namespace];
|
|
476
|
+
assert(handler, `Namespace not found: ${namespace}`);
|
|
477
|
+
return handler.call(methodName, jsonParams, onRequestValidated);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
public hasMethod(namespacedMethodName: string): boolean {
|
|
481
|
+
const [namespace, methodName] = namespacedMethodName.split('_', 2);
|
|
482
|
+
const handler = this.proxies[namespace];
|
|
483
|
+
return handler?.hasMethod(methodName);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
export type NamespacedApiHandlers = Record<string, ApiHandler>;
|
|
488
|
+
|
|
489
|
+
export type ApiHandler<T extends object = any> = [T, ApiSchemaFor<T>, StatusCheckFn?];
|
|
490
|
+
|
|
491
|
+
export function makeHandler<T extends object>(handler: T, schema: ApiSchemaFor<T>): ApiHandler<T> {
|
|
492
|
+
return [handler, schema];
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
function makeAggregateHealthcheck(namedHandlers: NamespacedApiHandlers, log?: Logger): StatusCheckFn {
|
|
496
|
+
return async (): Promise<StatusCheckResult> => {
|
|
497
|
+
try {
|
|
498
|
+
const entries = await Promise.all(
|
|
499
|
+
Object.entries(namedHandlers).map(async ([name, [, , healthCheck]]): Promise<[string, ComponentStatus]> => {
|
|
500
|
+
const { healthy, details } = normalizeStatusCheckResult(healthCheck ? await healthCheck() : true);
|
|
501
|
+
return [name, { healthy, ...details }];
|
|
502
|
+
}),
|
|
503
|
+
);
|
|
504
|
+
const components = Object.fromEntries(entries);
|
|
505
|
+
const failed = entries.filter(([, status]) => !status.healthy).map(([name]) => name);
|
|
506
|
+
if (failed.length > 0) {
|
|
507
|
+
log?.warn(`Health check failed for ${failed.join(', ')}`, { components });
|
|
508
|
+
}
|
|
509
|
+
return { healthy: failed.length === 0, details: { components } };
|
|
510
|
+
} catch (err) {
|
|
511
|
+
log?.error(`Error during health check`, err);
|
|
512
|
+
return { healthy: false };
|
|
513
|
+
}
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
export type SafeJsonRpcServerOptions = Partial<
|
|
518
|
+
SafeJsonRpcServerConfig & {
|
|
519
|
+
healthCheck: StatusCheckFn;
|
|
520
|
+
diagnostic: DiagnosticsMiddleware;
|
|
521
|
+
log: Logger;
|
|
522
|
+
middlewares: Application.Middleware[];
|
|
523
|
+
}
|
|
524
|
+
>;
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Creates a single SafeJsonRpcServer from multiple handlers.
|
|
528
|
+
* @param servers - List of handlers to be combined.
|
|
529
|
+
* @returns A single JsonRpcServer with namespaced methods.
|
|
530
|
+
*/
|
|
531
|
+
export function createNamespacedSafeJsonRpcServer(
|
|
532
|
+
handlers: NamespacedApiHandlers,
|
|
533
|
+
options: Omit<SafeJsonRpcServerOptions, 'healthcheck'> = {},
|
|
534
|
+
): SafeJsonRpcServer {
|
|
535
|
+
const { diagnostic, middlewares, log } = options;
|
|
536
|
+
const proxy = new NamespacedSafeJsonProxy(handlers);
|
|
537
|
+
const healthCheck = makeAggregateHealthcheck(handlers, log);
|
|
538
|
+
return new SafeJsonRpcServer(proxy, options, healthCheck, middlewares, diagnostic, log);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
export function createSafeJsonRpcServer<T extends object = any>(
|
|
542
|
+
handler: T,
|
|
543
|
+
schema: ApiSchemaFor<T>,
|
|
544
|
+
options: SafeJsonRpcServerOptions = {},
|
|
545
|
+
) {
|
|
546
|
+
const { diagnostic, log, healthCheck, middlewares: extraMiddlewares } = options;
|
|
547
|
+
const proxy = new SafeJsonProxy(handler, schema);
|
|
548
|
+
return new SafeJsonRpcServer(proxy, options, healthCheck, extraMiddlewares, diagnostic, log);
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Creates a router for handling a status request that returns a 200 status code when healthy and a 500 otherwise,
|
|
553
|
+
* along with the reported status as a JSON body.
|
|
554
|
+
* @param getCurrentStatus - Function returning the current status of the server.
|
|
555
|
+
* @param apiPrefix - The prefix to use for all api requests
|
|
556
|
+
* @returns - The router for handling status requests.
|
|
557
|
+
*/
|
|
558
|
+
export function createStatusRouter(getCurrentStatus: ServerStatusFn, apiPrefix = '') {
|
|
559
|
+
const router = new Router({ prefix: `${apiPrefix}` });
|
|
560
|
+
router.get('/status', async (ctx: Koa.Context) => {
|
|
561
|
+
let status: ServerStatus;
|
|
562
|
+
try {
|
|
563
|
+
status = await getCurrentStatus();
|
|
564
|
+
} catch {
|
|
565
|
+
status = { ok: false };
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
ctx.status = status.ok === true ? 200 : 500;
|
|
569
|
+
ctx.type = 'application/json';
|
|
570
|
+
ctx.body = status;
|
|
571
|
+
});
|
|
572
|
+
return router;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* Wraps a JsonRpcServer in a nodejs http server and starts it.
|
|
577
|
+
* Installs a status router that reports the status of the server, using its getStatus method when available so that
|
|
578
|
+
* per-component health is included, and falling back to isHealthy otherwise.
|
|
579
|
+
* Returns once starts listening unless noWait is set.
|
|
580
|
+
* @returns A running http server.
|
|
581
|
+
*/
|
|
582
|
+
export async function startHttpRpcServer(
|
|
583
|
+
rpcServer: Pick<SafeJsonRpcServer, 'getApp' | 'isHealthy'> & Partial<Pick<SafeJsonRpcServer, 'getStatus'>>,
|
|
584
|
+
options: {
|
|
585
|
+
host?: string;
|
|
586
|
+
port?: number | string;
|
|
587
|
+
apiPrefix?: string;
|
|
588
|
+
timeoutMs?: number;
|
|
589
|
+
keepAliveTimeoutMs?: number;
|
|
590
|
+
headersTimeoutMs?: number;
|
|
591
|
+
noWait?: boolean;
|
|
592
|
+
} = {},
|
|
593
|
+
): Promise<http.Server & { port: number }> {
|
|
594
|
+
const app = rpcServer.getApp(options.apiPrefix);
|
|
595
|
+
|
|
596
|
+
const getStatus: ServerStatusFn = rpcServer.getStatus
|
|
597
|
+
? rpcServer.getStatus.bind(rpcServer)
|
|
598
|
+
: async () => ({ ok: (await rpcServer.isHealthy()) === true });
|
|
599
|
+
|
|
600
|
+
const statusRouter = createStatusRouter(getStatus, options.apiPrefix);
|
|
601
|
+
app.use(statusRouter.routes()).use(statusRouter.allowedMethods());
|
|
602
|
+
|
|
603
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
604
|
+
const httpServer = http.createServer(app.callback());
|
|
605
|
+
if (options.timeoutMs) {
|
|
606
|
+
httpServer.timeout = options.timeoutMs;
|
|
607
|
+
}
|
|
608
|
+
if (options.keepAliveTimeoutMs !== undefined) {
|
|
609
|
+
httpServer.keepAliveTimeout = options.keepAliveTimeoutMs;
|
|
610
|
+
}
|
|
611
|
+
if (options.headersTimeoutMs !== undefined) {
|
|
612
|
+
httpServer.headersTimeout = options.headersTimeoutMs;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
const { promise, resolve } = promiseWithResolvers<void>();
|
|
616
|
+
const listenPort = options.port ? (typeof options.port === 'string' ? parseInt(options.port) : options.port) : 0;
|
|
617
|
+
httpServer.listen({ host: options.host, port: listenPort, reuseAddress: true }, () => resolve());
|
|
618
|
+
|
|
619
|
+
// Wait until listen callback is called
|
|
620
|
+
if (!options.noWait) {
|
|
621
|
+
await promise;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
const port = (httpServer.address() as AddressInfo).port;
|
|
625
|
+
return Object.assign(httpServer, { port });
|
|
626
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createJsonRpcTestSetup, type JsonRpcTestContext } from './integration.js';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type http from 'http';
|
|
2
|
+
|
|
3
|
+
import type { ApiSchemaFor } from '../../schemas/api.js';
|
|
4
|
+
import { makeFetch } from '../client/fetch.js';
|
|
5
|
+
import { type SafeJsonRpcClientOptions, createSafeJsonRpcClient } from '../client/safe_json_rpc_client.js';
|
|
6
|
+
import {
|
|
7
|
+
type SafeJsonRpcServer,
|
|
8
|
+
type SafeJsonRpcServerOptions,
|
|
9
|
+
createSafeJsonRpcServer,
|
|
10
|
+
startHttpRpcServer,
|
|
11
|
+
} from '../server/safe_json_rpc_server.js';
|
|
12
|
+
|
|
13
|
+
export type JsonRpcTestContext<T extends object> = {
|
|
14
|
+
server: SafeJsonRpcServer;
|
|
15
|
+
client: T;
|
|
16
|
+
httpServer: http.Server & { port: number };
|
|
17
|
+
url: string;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export async function createJsonRpcTestSetup<T extends object>(
|
|
21
|
+
handler: T,
|
|
22
|
+
schema: ApiSchemaFor<T>,
|
|
23
|
+
serverOptions: SafeJsonRpcServerOptions = {},
|
|
24
|
+
clientOptions: SafeJsonRpcClientOptions = {},
|
|
25
|
+
): Promise<JsonRpcTestContext<T>> {
|
|
26
|
+
const server = createSafeJsonRpcServer<T>(handler, schema, serverOptions);
|
|
27
|
+
const httpServer = await startHttpRpcServer(server, { host: '127.0.0.1' });
|
|
28
|
+
const noRetryFetch = makeFetch([], true);
|
|
29
|
+
const url = `http://127.0.0.1:${httpServer.port}`;
|
|
30
|
+
const client = createSafeJsonRpcClient<T>(url, schema, {
|
|
31
|
+
fetch: noRetryFetch,
|
|
32
|
+
...clientOptions,
|
|
33
|
+
});
|
|
34
|
+
return { server, client, httpServer, url };
|
|
35
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { pino } from 'pino';
|
|
2
|
+
|
|
3
|
+
function getSeverity(label: string): { severityText: string; severityNumber: number } {
|
|
4
|
+
switch (label) {
|
|
5
|
+
case 'trace':
|
|
6
|
+
return { severityText: 'TRACE', severityNumber: 1 };
|
|
7
|
+
case 'debug':
|
|
8
|
+
return { severityText: 'DEBUG', severityNumber: 5 };
|
|
9
|
+
case 'verbose':
|
|
10
|
+
return { severityText: 'VERBOSE', severityNumber: 7 };
|
|
11
|
+
case 'info':
|
|
12
|
+
return { severityText: 'INFO', severityNumber: 9 };
|
|
13
|
+
case 'warn':
|
|
14
|
+
return { severityText: 'WARN', severityNumber: 13 };
|
|
15
|
+
case 'error':
|
|
16
|
+
return { severityText: 'ERROR', severityNumber: 17 };
|
|
17
|
+
case 'fatal':
|
|
18
|
+
return { severityText: 'FATAL', severityNumber: 21 };
|
|
19
|
+
default:
|
|
20
|
+
return { severityText: 'UNSPECIFIED', severityNumber: 0 };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Pino configuration that adds OpenTelemetry severity fields understood by CloudWatch Logs. */
|
|
25
|
+
export const AWSCloudLoggerConfig = {
|
|
26
|
+
messageKey: 'msg',
|
|
27
|
+
formatters: {
|
|
28
|
+
level(label: string, level: number): object {
|
|
29
|
+
return { level, ...getSeverity(label) };
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
} satisfies pino.LoggerOptions;
|