@aztec/foundation 0.0.0-test.0 → 0.0.1-commit.0208eb9
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/array/array.d.ts +6 -9
- package/dest/array/array.d.ts.map +1 -1
- package/dest/array/array.js +11 -11
- package/dest/array/index.d.ts +2 -1
- package/dest/array/index.d.ts.map +1 -1
- package/dest/array/index.js +1 -0
- package/dest/array/sorted_array.d.ts +10 -0
- package/dest/array/sorted_array.d.ts.map +1 -0
- package/dest/array/sorted_array.js +106 -0
- package/dest/async-map/index.d.ts +1 -1
- package/dest/async-pool/index.d.ts +1 -1
- package/dest/async-pool/index.d.ts.map +1 -1
- package/dest/async-pool/index.js +1 -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 +1 -3
- package/dest/bigint-buffer/index.d.ts.map +1 -1
- 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 +78 -0
- package/dest/branded-types/checkpoint_number.d.ts +54 -0
- package/dest/branded-types/checkpoint_number.d.ts.map +1 -0
- package/dest/branded-types/checkpoint_number.js +77 -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 +7 -0
- package/dest/branded-types/index.d.ts.map +1 -0
- package/dest/branded-types/index.js +5 -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 +42 -0
- package/dest/branded-types/slot.d.ts.map +1 -0
- package/dest/branded-types/slot.js +59 -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 +80 -0
- package/dest/buffer/buffer16.d.ts.map +1 -0
- package/dest/buffer/buffer16.js +102 -0
- package/dest/buffer/buffer32.d.ts +5 -9
- package/dest/buffer/buffer32.d.ts.map +1 -1
- package/dest/buffer/buffer32.js +9 -7
- 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/collection/array.d.ts +28 -4
- package/dest/collection/array.d.ts.map +1 -1
- package/dest/collection/array.js +108 -3
- package/dest/collection/index.d.ts +1 -1
- package/dest/collection/object.d.ts +17 -1
- package/dest/collection/object.d.ts.map +1 -1
- package/dest/collection/object.js +25 -0
- package/dest/committable/committable.d.ts +1 -1
- package/dest/committable/committable.d.ts.map +1 -1
- package/dest/committable/index.d.ts +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 +62 -4
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +143 -12
- package/dest/config/network_config.d.ts +54 -0
- package/dest/config/network_config.d.ts.map +1 -0
- package/dest/config/network_config.js +11 -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 +3 -5
- package/dest/crypto/aes128/index.d.ts.map +1 -1
- package/dest/crypto/aes128/index.js +19 -6
- package/dest/crypto/bls/bn254_keystore.d.ts +296 -0
- package/dest/crypto/bls/bn254_keystore.d.ts.map +1 -0
- package/dest/crypto/bls/bn254_keystore.js +218 -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 +3 -3
- package/dest/crypto/ecdsa/index.d.ts.map +1 -1
- package/dest/crypto/ecdsa/index.js +62 -48
- package/dest/crypto/ecdsa/signature.d.ts +3 -5
- package/dest/crypto/ecdsa/signature.d.ts.map +1 -1
- package/dest/crypto/ecdsa/signature.js +2 -2
- package/dest/crypto/grumpkin/index.d.ts +10 -15
- package/dest/crypto/grumpkin/index.d.ts.map +1 -1
- package/dest/crypto/grumpkin/index.js +61 -55
- package/dest/crypto/keccak/index.d.ts +3 -5
- package/dest/crypto/keccak/index.d.ts.map +1 -1
- package/dest/crypto/keys/index.d.ts +2 -4
- package/dest/crypto/keys/index.d.ts.map +1 -1
- package/dest/crypto/keys/index.js +8 -5
- package/dest/crypto/pedersen/index.d.ts +1 -1
- package/dest/crypto/pedersen/pedersen.noble.d.ts +3 -5
- package/dest/crypto/pedersen/pedersen.noble.d.ts.map +1 -1
- package/dest/crypto/pedersen/pedersen.wasm.d.ts +4 -6
- package/dest/crypto/pedersen/pedersen.wasm.d.ts.map +1 -1
- package/dest/crypto/pedersen/pedersen.wasm.js +24 -14
- package/dest/crypto/poseidon/index.d.ts +2 -5
- package/dest/crypto/poseidon/index.d.ts.map +1 -1
- package/dest/crypto/poseidon/index.js +27 -21
- package/dest/crypto/random/index.d.ts +2 -4
- package/dest/crypto/random/index.d.ts.map +1 -1
- package/dest/crypto/random/index.js +2 -34
- package/dest/crypto/random/randomness_singleton.d.ts +4 -5
- package/dest/crypto/random/randomness_singleton.d.ts.map +1 -1
- package/dest/crypto/random/randomness_singleton.js +5 -5
- package/dest/crypto/schnorr/index.d.ts +3 -2
- package/dest/crypto/schnorr/index.d.ts.map +1 -1
- package/dest/crypto/schnorr/index.js +30 -38
- package/dest/crypto/schnorr/signature.d.ts +5 -7
- package/dest/crypto/schnorr/signature.d.ts.map +1 -1
- package/dest/crypto/schnorr/signature.js +2 -2
- package/dest/crypto/secp256k1/index.d.ts +5 -7
- package/dest/crypto/secp256k1/index.d.ts.map +1 -1
- package/dest/crypto/secp256k1/index.js +23 -18
- package/dest/crypto/secp256k1-signer/index.d.ts +1 -1
- package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts +1 -1
- package/dest/crypto/secp256k1-signer/secp256k1_signer.d.ts.map +1 -1
- package/dest/crypto/secp256k1-signer/utils.d.ts +56 -5
- package/dest/crypto/secp256k1-signer/utils.d.ts.map +1 -1
- package/dest/crypto/secp256k1-signer/utils.js +92 -6
- package/dest/crypto/serialize.d.ts +5 -7
- package/dest/crypto/serialize.d.ts.map +1 -1
- package/dest/crypto/sha256/index.d.ts +23 -6
- package/dest/crypto/sha256/index.d.ts.map +1 -1
- package/dest/crypto/sha256/index.js +43 -1
- package/dest/crypto/sha512/index.d.ts +3 -5
- package/dest/crypto/sha512/index.d.ts.map +1 -1
- package/dest/crypto/sha512/index.js +1 -1
- package/dest/crypto/signature/index.d.ts +2 -4
- package/dest/crypto/signature/index.d.ts.map +1 -1
- package/dest/crypto/sync/index.d.ts +1 -1
- package/dest/crypto/sync/index.js +1 -1
- package/dest/crypto/sync/pedersen/index.d.ts +4 -6
- package/dest/crypto/sync/pedersen/index.d.ts.map +1 -1
- package/dest/crypto/sync/pedersen/index.js +18 -11
- package/dest/crypto/sync/poseidon/index.d.ts +2 -5
- package/dest/crypto/sync/poseidon/index.d.ts.map +1 -1
- package/dest/crypto/sync/poseidon/index.js +23 -16
- 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 +362 -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 +180 -0
- package/dest/curves/bn254/field.d.ts.map +1 -0
- package/dest/{fields/fields.js → curves/bn254/field.js} +90 -62
- 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/{fields → curves/grumpkin}/point.d.ts +14 -7
- package/dest/curves/grumpkin/point.d.ts.map +1 -0
- package/dest/{fields → curves/grumpkin}/point.js +27 -10
- package/dest/decorators/index.d.ts +1 -1
- package/dest/decorators/memoize.d.ts +1 -1
- package/dest/decorators/memoize.d.ts.map +1 -1
- package/dest/error/index.d.ts +1 -1
- package/dest/eth-address/index.d.ts +18 -9
- package/dest/eth-address/index.d.ts.map +1 -1
- package/dest/eth-address/index.js +31 -2
- package/dest/eth-signature/eth_signature.d.ts +17 -15
- package/dest/eth-signature/eth_signature.d.ts.map +1 -1
- package/dest/eth-signature/eth_signature.js +31 -17
- package/dest/eth-signature/index.d.ts +1 -1
- package/dest/fs/index.d.ts +2 -1
- package/dest/fs/index.d.ts.map +1 -1
- package/dest/fs/index.js +1 -0
- package/dest/fs/run_in_dir.d.ts +1 -1
- 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 +1 -1
- package/dest/iterable/filter.d.ts +1 -1
- package/dest/iterable/filter.js +1 -1
- package/dest/iterable/index.d.ts +1 -1
- package/dest/iterable/isAsyncIt.d.ts +1 -1
- package/dest/iterable/map.d.ts +1 -1
- package/dest/iterable/map.js +1 -1
- package/dest/iterable/peek.d.ts +1 -1
- package/dest/iterable/sort.d.ts +1 -1
- package/dest/iterable/take.d.ts +1 -1
- package/dest/iterable/toArray.d.ts +1 -1
- 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 +4 -1
- package/dest/jest/setupAfterEnv.js +3 -0
- package/dest/json-rpc/client/fetch.d.ts +3 -3
- package/dest/json-rpc/client/fetch.d.ts.map +1 -1
- package/dest/json-rpc/client/fetch.js +16 -30
- package/dest/json-rpc/client/index.d.ts +1 -1
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts +10 -4
- package/dest/json-rpc/client/safe_json_rpc_client.d.ts.map +1 -1
- package/dest/json-rpc/client/safe_json_rpc_client.js +173 -13
- package/dest/json-rpc/client/undici.d.ts +1 -1
- package/dest/json-rpc/client/undici.d.ts.map +1 -1
- package/dest/json-rpc/client/undici.js +27 -11
- package/dest/json-rpc/convert.d.ts +3 -10
- package/dest/json-rpc/convert.d.ts.map +1 -1
- package/dest/json-rpc/convert.js +1 -9
- 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 +6 -4
- package/dest/json-rpc/fixtures/class_a.d.ts.map +1 -1
- package/dest/json-rpc/fixtures/class_b.d.ts +6 -4
- package/dest/json-rpc/fixtures/class_b.d.ts.map +1 -1
- package/dest/json-rpc/fixtures/test_state.d.ts +1 -1
- package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -1
- package/dest/json-rpc/index.d.ts +3 -2
- package/dest/json-rpc/index.d.ts.map +1 -1
- package/dest/json-rpc/index.js +2 -1
- package/dest/json-rpc/js_utils.d.ts +1 -1
- package/dest/json-rpc/js_utils.d.ts.map +1 -1
- package/dest/json-rpc/server/index.d.ts +1 -1
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts +22 -23
- package/dest/json-rpc/server/safe_json_rpc_server.d.ts.map +1 -1
- package/dest/json-rpc/server/safe_json_rpc_server.js +161 -56
- package/dest/json-rpc/test/index.d.ts +1 -1
- package/dest/json-rpc/test/integration.d.ts +2 -3
- package/dest/json-rpc/test/integration.d.ts.map +1 -1
- package/dest/log/console.d.ts +1 -1
- package/dest/log/console.d.ts.map +1 -1
- package/dest/log/gcloud-logger-config.d.ts +1 -2
- package/dest/log/gcloud-logger-config.d.ts.map +1 -1
- package/dest/log/gcloud-logger-config.js +1 -9
- package/dest/log/index.d.ts +5 -5
- package/dest/log/index.d.ts.map +1 -1
- package/dest/log/index.js +4 -4
- package/dest/log/libp2p_logger.d.ts +5 -2
- package/dest/log/libp2p_logger.d.ts.map +1 -1
- package/dest/log/libp2p_logger.js +27 -6
- package/dest/log/log-filters.d.ts +1 -1
- package/dest/log/log-levels.d.ts +1 -1
- package/dest/log/log_fn.d.ts +2 -2
- package/dest/log/log_fn.d.ts.map +1 -1
- 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 +40 -11
- package/dest/log/pino-logger.d.ts.map +1 -1
- package/dest/log/pino-logger.js +143 -28
- package/dest/message/index.d.ts +1 -1
- package/dest/message/index.d.ts.map +1 -1
- package/dest/mutex/index.d.ts +1 -1
- package/dest/mutex/index.d.ts.map +1 -1
- package/dest/mutex/mutex_database.d.ts +1 -1
- package/dest/mutex/mutex_database.d.ts.map +1 -1
- package/dest/noir/index.d.ts +1 -1
- package/dest/noir/noir_package_config.d.ts +9 -9
- 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 +1 -1
- package/dest/promise/running-promise.d.ts +2 -2
- package/dest/promise/running-promise.d.ts.map +1 -1
- package/dest/promise/running-promise.js +2 -2
- package/dest/promise/utils.d.ts +1 -1
- package/dest/queue/base_memory_queue.d.ts +1 -1
- package/dest/queue/base_memory_queue.d.ts.map +1 -1
- package/dest/queue/batch_queue.d.ts +2 -2
- package/dest/queue/batch_queue.d.ts.map +1 -1
- package/dest/queue/batch_queue.js +1 -1
- package/dest/queue/bounded_serial_queue.d.ts +1 -1
- package/dest/queue/bounded_serial_queue.d.ts.map +1 -1
- package/dest/queue/fifo_memory_queue.d.ts +1 -1
- package/dest/queue/fifo_memory_queue.d.ts.map +1 -1
- package/dest/queue/index.d.ts +1 -1
- package/dest/queue/priority_memory_queue.d.ts +1 -1
- package/dest/queue/priority_memory_queue.d.ts.map +1 -1
- package/dest/queue/priority_queue.d.ts +1 -1
- package/dest/queue/priority_queue.d.ts.map +1 -1
- package/dest/queue/semaphore.d.ts +5 -1
- package/dest/queue/semaphore.d.ts.map +1 -1
- package/dest/queue/serial_queue.d.ts +3 -3
- package/dest/queue/serial_queue.d.ts.map +1 -1
- package/dest/queue/serial_queue.js +7 -5
- package/dest/retry/index.d.ts +14 -3
- package/dest/retry/index.d.ts.map +1 -1
- package/dest/retry/index.js +13 -2
- package/dest/running-promise/index.d.ts +1 -1
- package/dest/schemas/api.d.ts +1 -1
- package/dest/schemas/api.d.ts.map +1 -1
- package/dest/schemas/index.d.ts +1 -1
- package/dest/schemas/parse.d.ts +1 -1
- package/dest/schemas/parse.js +1 -1
- package/dest/schemas/schemas.d.ts +21 -20
- package/dest/schemas/schemas.d.ts.map +1 -1
- package/dest/schemas/schemas.js +29 -11
- package/dest/schemas/types.d.ts +31 -1
- package/dest/schemas/types.d.ts.map +1 -1
- package/dest/schemas/types.js +25 -1
- package/dest/schemas/utils.d.ts +4 -6
- package/dest/schemas/utils.d.ts.map +1 -1
- package/dest/schemas/utils.js +15 -5
- package/dest/serialize/buffer_reader.d.ts +34 -6
- package/dest/serialize/buffer_reader.d.ts.map +1 -1
- package/dest/serialize/buffer_reader.js +57 -6
- package/dest/serialize/field_reader.d.ts +12 -3
- package/dest/serialize/field_reader.d.ts.map +1 -1
- package/dest/serialize/field_reader.js +19 -2
- package/dest/serialize/free_funcs.d.ts +25 -23
- package/dest/serialize/free_funcs.d.ts.map +1 -1
- package/dest/serialize/free_funcs.js +22 -28
- package/dest/serialize/index.d.ts +1 -1
- package/dest/serialize/serialize.d.ts +6 -7
- package/dest/serialize/serialize.d.ts.map +1 -1
- package/dest/serialize/serialize.js +1 -1
- package/dest/serialize/type_registry.d.ts +1 -1
- package/dest/serialize/type_registry.d.ts.map +1 -1
- package/dest/serialize/types.d.ts +1 -1
- package/dest/sleep/index.d.ts +3 -1
- package/dest/sleep/index.d.ts.map +1 -1
- package/dest/sleep/index.js +4 -0
- package/dest/string/index.d.ts +8 -3
- package/dest/string/index.d.ts.map +1 -1
- package/dest/string/index.js +27 -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 +3 -3
- 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 +2 -1
- package/dest/testing/index.d.ts.map +1 -1
- package/dest/testing/index.js +1 -0
- package/dest/testing/port_allocator.d.ts +1 -1
- package/dest/testing/snapshot_serializer.d.ts +1 -1
- package/dest/testing/test_data.d.ts +1 -1
- package/dest/timer/date.d.ts +4 -2
- package/dest/timer/date.d.ts.map +1 -1
- package/dest/timer/date.js +8 -3
- package/dest/timer/elapsed.d.ts +1 -1
- 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 +19 -6
- package/dest/timer/timeout.d.ts.map +1 -1
- package/dest/timer/timeout.js +43 -22
- package/dest/timer/timer.d.ts +1 -1
- package/dest/timer/timer.d.ts.map +1 -1
- package/dest/transport/dispatch/create_dispatch_fn.d.ts +1 -1
- package/dest/transport/dispatch/create_dispatch_fn.d.ts.map +1 -1
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts +1 -1
- package/dest/transport/dispatch/messages.d.ts +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/transport/interface/connector.d.ts +1 -1
- package/dest/transport/interface/connector.d.ts.map +1 -1
- package/dest/transport/interface/listener.d.ts +1 -2
- package/dest/transport/interface/listener.d.ts.map +1 -1
- package/dest/transport/interface/socket.d.ts +1 -1
- package/dest/transport/interface/socket.d.ts.map +1 -1
- package/dest/transport/interface/transferable.d.ts +1 -1
- package/dest/transport/node/index.d.ts +1 -1
- package/dest/transport/node/node_connector.d.ts +1 -2
- package/dest/transport/node/node_connector.d.ts.map +1 -1
- package/dest/transport/node/node_connector_socket.d.ts +1 -2
- package/dest/transport/node/node_connector_socket.d.ts.map +1 -1
- package/dest/transport/node/node_listener.d.ts +1 -2
- package/dest/transport/node/node_listener.d.ts.map +1 -1
- package/dest/transport/node/node_listener_socket.d.ts +1 -2
- package/dest/transport/node/node_listener_socket.d.ts.map +1 -1
- package/dest/transport/transport_client.d.ts +1 -2
- package/dest/transport/transport_client.d.ts.map +1 -1
- package/dest/transport/transport_server.d.ts +1 -10
- package/dest/transport/transport_server.d.ts.map +1 -1
- package/dest/trees/balanced_merkle_tree_root.d.ts +17 -0
- package/dest/trees/balanced_merkle_tree_root.d.ts.map +1 -0
- package/dest/trees/balanced_merkle_tree_root.js +51 -0
- package/dest/trees/hasher.d.ts +7 -7
- package/dest/trees/hasher.d.ts.map +1 -1
- package/dest/trees/hasher.js +10 -5
- package/dest/trees/index.d.ts +5 -3
- package/dest/trees/index.d.ts.map +1 -1
- package/dest/trees/index.js +4 -2
- package/dest/trees/indexed_merkle_tree.d.ts +1 -3
- package/dest/trees/indexed_merkle_tree.d.ts.map +1 -1
- package/dest/trees/indexed_merkle_tree.js +1 -1
- package/dest/trees/indexed_merkle_tree_calculator.d.ts +2 -4
- package/dest/trees/indexed_merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/indexed_tree_leaf.d.ts +1 -3
- package/dest/trees/indexed_tree_leaf.d.ts.map +1 -1
- package/dest/trees/membership_witness.d.ts +10 -5
- package/dest/trees/membership_witness.d.ts.map +1 -1
- package/dest/trees/membership_witness.js +23 -1
- package/dest/trees/merkle_tree.d.ts +1 -3
- package/dest/trees/merkle_tree.d.ts.map +1 -1
- package/dest/trees/merkle_tree_calculator.d.ts +2 -4
- package/dest/trees/merkle_tree_calculator.d.ts.map +1 -1
- package/dest/trees/merkle_tree_calculator.js +2 -2
- package/dest/trees/sibling_path.d.ts +6 -41
- package/dest/trees/sibling_path.d.ts.map +1 -1
- package/dest/trees/sibling_path.js +3 -3
- 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 +28 -0
- package/dest/trees/unbalanced_merkle_tree_root.d.ts.map +1 -0
- package/dest/trees/unbalanced_merkle_tree_root.js +84 -0
- package/dest/trees/unbalanced_tree_store.d.ts +6 -1
- package/dest/trees/unbalanced_tree_store.d.ts.map +1 -1
- package/dest/trees/unbalanced_tree_store.js +55 -1
- package/dest/types/index.d.ts +30 -3
- package/dest/types/index.d.ts.map +1 -1
- package/dest/types/index.js +6 -0
- package/dest/url/index.d.ts +1 -1
- package/dest/url/index.d.ts.map +1 -1
- package/dest/url/index.js +1 -1
- package/dest/validation/index.d.ts +1 -1
- package/package.json +60 -45
- package/src/array/array.ts +13 -16
- package/src/array/index.ts +1 -0
- package/src/array/sorted_array.ts +133 -0
- package/src/async-pool/index.ts +1 -0
- package/src/bigint/index.ts +20 -0
- package/src/branded-types/block_number.ts +117 -0
- package/src/branded-types/checkpoint_number.ts +115 -0
- package/src/branded-types/epoch.ts +88 -0
- package/src/branded-types/index.ts +7 -0
- package/src/branded-types/index_within_checkpoint.ts +88 -0
- package/src/branded-types/slot.ts +88 -0
- package/src/branded-types/types.ts +2 -0
- package/src/buffer/buffer16.ts +133 -0
- package/src/buffer/buffer32.ts +10 -8
- package/src/buffer/index.ts +1 -0
- package/src/collection/array.ts +118 -4
- package/src/collection/object.ts +37 -0
- package/src/config/env_var.ts +194 -59
- package/src/config/index.ts +226 -10
- package/src/config/network_config.ts +18 -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 +19 -10
- package/src/crypto/bls/bn254_keystore.ts +287 -0
- package/src/crypto/bls/index.ts +77 -0
- package/src/crypto/bn254/index.ts +64 -0
- package/src/crypto/ecdsa/index.ts +41 -23
- package/src/crypto/ecdsa/signature.ts +2 -2
- package/src/crypto/grumpkin/index.ts +38 -46
- package/src/crypto/keys/index.ts +6 -6
- package/src/crypto/pedersen/pedersen.wasm.ts +23 -19
- package/src/crypto/poseidon/index.ts +27 -29
- package/src/crypto/random/index.ts +2 -40
- package/src/crypto/random/randomness_singleton.ts +6 -4
- package/src/crypto/schnorr/index.ts +22 -18
- package/src/crypto/schnorr/signature.ts +2 -2
- package/src/crypto/secp256k1/index.ts +15 -11
- package/src/crypto/secp256k1-signer/utils.ts +120 -7
- package/src/crypto/sha256/index.ts +48 -1
- package/src/crypto/sha512/index.ts +1 -1
- package/src/crypto/signature/index.ts +1 -1
- package/src/crypto/sync/index.ts +1 -1
- package/src/crypto/sync/pedersen/index.ts +17 -16
- package/src/crypto/sync/poseidon/index.ts +23 -27
- package/src/curves/bls12/field.ts +463 -0
- package/src/curves/bls12/index.ts +2 -0
- package/src/curves/bls12/point.ts +450 -0
- package/src/{fields/fields.ts → curves/bn254/field.ts} +84 -63
- 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/{fields → curves/grumpkin}/point.ts +27 -10
- package/src/eth-address/index.ts +35 -3
- package/src/eth-signature/eth_signature.ts +44 -22
- package/src/fs/index.ts +1 -0
- package/src/fs/try_rm_dir.ts +15 -0
- package/src/iterable/filter.ts +1 -1
- package/src/iterable/map.ts +1 -1
- 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 +4 -1
- package/src/jest/setupAfterEnv.mjs +3 -0
- package/src/json-rpc/client/fetch.ts +14 -33
- package/src/json-rpc/client/safe_json_rpc_client.ts +226 -13
- package/src/json-rpc/client/undici.ts +29 -18
- package/src/json-rpc/convert.ts +3 -12
- package/src/json-rpc/errors.ts +6 -0
- package/src/json-rpc/fixtures/class_a.ts +4 -1
- package/src/json-rpc/fixtures/class_b.ts +4 -1
- package/src/json-rpc/index.ts +2 -1
- package/src/json-rpc/server/safe_json_rpc_server.ts +141 -48
- package/src/json-rpc/test/integration.ts +1 -1
- package/src/log/console.ts +4 -1
- package/src/log/gcloud-logger-config.ts +3 -7
- package/src/log/index.ts +4 -4
- package/src/log/libp2p_logger.ts +33 -7
- package/src/log/log_fn.ts +1 -1
- 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 +169 -37
- package/src/message/index.ts +5 -1
- package/src/mutex/mutex_database.ts +2 -3
- package/src/number/index.ts +14 -0
- package/src/profiler/index.ts +1 -0
- package/src/profiler/profiler.ts +125 -0
- package/src/promise/running-promise.ts +2 -2
- package/src/queue/batch_queue.ts +1 -1
- package/src/queue/bounded_serial_queue.ts +4 -1
- package/src/queue/semaphore.ts +5 -0
- package/src/queue/serial_queue.ts +5 -5
- package/src/retry/index.ts +28 -5
- package/src/schemas/api.ts +4 -4
- package/src/schemas/parse.ts +1 -1
- package/src/schemas/schemas.ts +42 -13
- package/src/schemas/types.ts +33 -0
- package/src/schemas/utils.ts +21 -8
- package/src/serialize/buffer_reader.ts +81 -12
- package/src/serialize/field_reader.ts +28 -4
- package/src/serialize/free_funcs.ts +26 -32
- package/src/serialize/serialize.ts +3 -1
- package/src/sleep/index.ts +6 -0
- package/src/string/index.ts +36 -1
- package/src/testing/files/index.ts +7 -3
- package/src/testing/formatting.ts +3 -0
- package/src/testing/index.ts +1 -0
- package/src/timer/date.ts +13 -3
- package/src/timer/index.ts +1 -1
- package/src/timer/timeout.ts +54 -19
- package/src/transport/index.ts +0 -1
- package/src/transport/interface/connector.ts +0 -1
- package/src/transport/interface/listener.ts +2 -3
- package/src/transport/interface/socket.ts +2 -3
- package/src/transport/transport_client.ts +3 -4
- package/src/transport/transport_server.ts +4 -1
- package/src/trees/balanced_merkle_tree_root.ts +68 -0
- package/src/trees/hasher.ts +13 -4
- package/src/trees/index.ts +4 -2
- package/src/trees/indexed_merkle_tree.ts +6 -2
- package/src/trees/indexed_merkle_tree_calculator.ts +2 -2
- package/src/trees/membership_witness.ts +22 -1
- package/src/trees/merkle_tree.ts +4 -1
- package/src/trees/merkle_tree_calculator.ts +10 -5
- package/src/trees/sibling_path.ts +3 -3
- package/src/trees/unbalanced_merkle_tree_calculator.ts +176 -0
- package/src/trees/unbalanced_merkle_tree_root.ts +115 -0
- package/src/trees/unbalanced_tree_store.ts +62 -3
- package/src/types/index.ts +35 -4
- package/src/url/index.ts +0 -1
- package/dest/crypto/index.d.ts +0 -15
- package/dest/crypto/index.d.ts.map +0 -1
- package/dest/crypto/index.js +0 -14
- package/dest/crypto/pedersen/pedersen.elliptic.d.ts +0 -13
- package/dest/crypto/pedersen/pedersen.elliptic.d.ts.map +0 -1
- package/dest/crypto/pedersen/pedersen.elliptic.js +0 -582
- package/dest/fields/coordinate.d.ts +0 -68
- package/dest/fields/coordinate.d.ts.map +0 -1
- package/dest/fields/coordinate.js +0 -96
- package/dest/fields/fields.d.ts +0 -176
- package/dest/fields/fields.d.ts.map +0 -1
- package/dest/fields/index.d.ts +0 -4
- package/dest/fields/index.d.ts.map +0 -1
- package/dest/fields/index.js +0 -3
- package/dest/fields/point.d.ts.map +0 -1
- package/dest/index.d.ts +0 -31
- package/dest/index.d.ts.map +0 -1
- package/dest/index.js +0 -31
- package/dest/json-rpc/server/telemetry.d.ts +0 -2
- package/dest/json-rpc/server/telemetry.d.ts.map +0 -1
- package/dest/json-rpc/server/telemetry.js +0 -0
- package/dest/log/debug.d.ts +0 -56
- package/dest/log/debug.d.ts.map +0 -1
- package/dest/log/debug.js +0 -75
- package/dest/log/log_history.d.ts +0 -31
- package/dest/log/log_history.d.ts.map +0 -1
- package/dest/log/log_history.js +0 -38
- package/dest/transport/browser/index.d.ts +0 -5
- package/dest/transport/browser/index.d.ts.map +0 -1
- package/dest/transport/browser/index.js +0 -4
- package/dest/transport/browser/message_port_socket.d.ts +0 -37
- package/dest/transport/browser/message_port_socket.d.ts.map +0 -1
- package/dest/transport/browser/message_port_socket.js +0 -42
- package/dest/transport/browser/shared_worker_connector.d.ts +0 -19
- package/dest/transport/browser/shared_worker_connector.d.ts.map +0 -1
- package/dest/transport/browser/shared_worker_connector.js +0 -19
- package/dest/transport/browser/shared_worker_listener.d.ts +0 -38
- package/dest/transport/browser/shared_worker_listener.d.ts.map +0 -1
- package/dest/transport/browser/shared_worker_listener.js +0 -33
- package/dest/transport/browser/worker_connector.d.ts +0 -26
- package/dest/transport/browser/worker_connector.d.ts.map +0 -1
- package/dest/transport/browser/worker_connector.js +0 -30
- package/dest/transport/browser/worker_listener.d.ts +0 -39
- package/dest/transport/browser/worker_listener.d.ts.map +0 -1
- package/dest/transport/browser/worker_listener.js +0 -35
- package/dest/trees/unbalanced_merkle_tree.d.ts +0 -17
- package/dest/trees/unbalanced_merkle_tree.d.ts.map +0 -1
- package/dest/trees/unbalanced_merkle_tree.js +0 -100
- package/dest/wasm/empty_wasi_sdk.d.ts +0 -130
- package/dest/wasm/empty_wasi_sdk.d.ts.map +0 -1
- package/dest/wasm/empty_wasi_sdk.js +0 -148
- package/dest/wasm/index.d.ts +0 -2
- package/dest/wasm/index.d.ts.map +0 -1
- package/dest/wasm/index.js +0 -1
- package/dest/wasm/wasm_module.d.ts +0 -136
- package/dest/wasm/wasm_module.d.ts.map +0 -1
- package/dest/wasm/wasm_module.js +0 -196
- package/dest/worker/browser/index.d.ts +0 -3
- package/dest/worker/browser/index.d.ts.map +0 -1
- package/dest/worker/browser/index.js +0 -2
- package/dest/worker/browser/start_web_module.d.ts +0 -7
- package/dest/worker/browser/start_web_module.d.ts.map +0 -1
- package/dest/worker/browser/start_web_module.js +0 -27
- package/dest/worker/browser/web_data_store.d.ts +0 -24
- package/dest/worker/browser/web_data_store.d.ts.map +0 -1
- package/dest/worker/browser/web_data_store.js +0 -29
- package/dest/worker/browser/web_worker.d.ts +0 -10
- package/dest/worker/browser/web_worker.d.ts.map +0 -1
- package/dest/worker/browser/web_worker.js +0 -25
- package/dest/worker/data_store.d.ts +0 -21
- package/dest/worker/data_store.d.ts.map +0 -1
- package/dest/worker/data_store.js +0 -3
- package/dest/worker/index.d.ts +0 -3
- package/dest/worker/index.d.ts.map +0 -1
- package/dest/worker/index.js +0 -1
- package/dest/worker/node/index.d.ts +0 -3
- package/dest/worker/node/index.d.ts.map +0 -1
- package/dest/worker/node/index.js +0 -2
- package/dest/worker/node/node_data_store.d.ts +0 -13
- package/dest/worker/node/node_data_store.d.ts.map +0 -1
- package/dest/worker/node/node_data_store.js +0 -20
- package/dest/worker/node/node_worker.d.ts +0 -6
- package/dest/worker/node/node_worker.d.ts.map +0 -1
- package/dest/worker/node/node_worker.js +0 -22
- package/dest/worker/node/start_node_module.d.ts +0 -7
- package/dest/worker/node/start_node_module.d.ts.map +0 -1
- package/dest/worker/node/start_node_module.js +0 -31
- package/dest/worker/wasm_worker.d.ts +0 -9
- package/dest/worker/wasm_worker.d.ts.map +0 -1
- package/dest/worker/wasm_worker.js +0 -3
- package/dest/worker/worker_pool.d.ts +0 -40
- package/dest/worker/worker_pool.d.ts.map +0 -1
- package/dest/worker/worker_pool.js +0 -51
- package/src/crypto/index.ts +0 -14
- package/src/crypto/pedersen/pedersen.elliptic.ts +0 -584
- package/src/fields/coordinate.ts +0 -104
- package/src/fields/index.ts +0 -3
- package/src/index.ts +0 -31
- package/src/json-rpc/server/telemetry.ts +0 -0
- package/src/log/debug.ts +0 -104
- package/src/log/log_history.ts +0 -44
- package/src/transport/browser/index.ts +0 -4
- package/src/transport/browser/message_port_socket.ts +0 -48
- package/src/transport/browser/shared_worker_connector.ts +0 -21
- package/src/transport/browser/shared_worker_listener.ts +0 -53
- package/src/transport/browser/worker_connector.ts +0 -30
- package/src/transport/browser/worker_listener.ts +0 -54
- package/src/trees/unbalanced_merkle_tree.ts +0 -103
- package/src/wasm/README.md +0 -6
- package/src/wasm/empty_wasi_sdk.ts +0 -166
- package/src/wasm/fixtures/gcd.wasm +0 -0
- package/src/wasm/fixtures/gcd.wat +0 -27
- package/src/wasm/index.ts +0 -1
- package/src/wasm/wasm_module.ts +0 -260
- package/src/worker/browser/index.ts +0 -2
- package/src/worker/browser/start_web_module.ts +0 -24
- package/src/worker/browser/web_data_store.ts +0 -38
- package/src/worker/browser/web_worker.ts +0 -25
- package/src/worker/data_store.ts +0 -19
- package/src/worker/index.ts +0 -2
- package/src/worker/node/index.ts +0 -2
- package/src/worker/node/node_data_store.ts +0 -27
- package/src/worker/node/node_worker.ts +0 -23
- package/src/worker/node/start_node_module.ts +0 -30
- package/src/worker/wasm_worker.ts +0 -7
- package/src/worker/worker_pool.ts +0 -73
|
@@ -5,27 +5,30 @@ import { z } from 'zod';
|
|
|
5
5
|
|
|
6
6
|
import { hasHexPrefix, hexToBuffer } from '../string/index.js';
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
*
|
|
10
|
-
* A version of the Signature class that uses `0x${string}` values for r and s rather than
|
|
11
|
-
* Buffer32s
|
|
8
|
+
/**
|
|
9
|
+
* A version of the Signature class that uses `0x${string}` values for r and s rather than Buffer32s
|
|
12
10
|
*/
|
|
13
11
|
export type ViemSignature = {
|
|
14
12
|
r: `0x${string}`;
|
|
15
13
|
s: `0x${string}`;
|
|
16
14
|
v: number;
|
|
17
|
-
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type ViemTransactionSignature = {
|
|
18
|
+
r: `0x${string}`;
|
|
19
|
+
s: `0x${string}`;
|
|
20
|
+
yParity: 0 | 1;
|
|
18
21
|
};
|
|
19
22
|
|
|
20
23
|
/**
|
|
21
|
-
* Signature
|
|
22
|
-
*
|
|
23
24
|
* Contains a signature split into it's primary components (r,s,v)
|
|
24
25
|
*/
|
|
25
26
|
export class Signature {
|
|
26
27
|
// Cached values
|
|
27
28
|
private size: number | undefined;
|
|
28
29
|
|
|
30
|
+
public readonly empty: boolean;
|
|
31
|
+
|
|
29
32
|
constructor(
|
|
30
33
|
/** The r value of the signature */
|
|
31
34
|
public readonly r: Buffer32,
|
|
@@ -33,9 +36,9 @@ export class Signature {
|
|
|
33
36
|
public readonly s: Buffer32,
|
|
34
37
|
/** The v value of the signature */
|
|
35
38
|
public readonly v: number,
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
) {
|
|
40
|
+
this.empty = r.isZero() && s.isZero() && v === 0;
|
|
41
|
+
}
|
|
39
42
|
|
|
40
43
|
static fromBuffer(buf: Buffer | BufferReader): Signature {
|
|
41
44
|
const reader = BufferReader.asReader(buf);
|
|
@@ -44,9 +47,7 @@ export class Signature {
|
|
|
44
47
|
const s = reader.readObject(Buffer32);
|
|
45
48
|
const v = reader.readNumber();
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return new Signature(r, s, v, isEmpty);
|
|
50
|
+
return new Signature(r, s, v);
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
static isValidString(sig: `0x${string}`): boolean {
|
|
@@ -65,27 +66,35 @@ export class Signature {
|
|
|
65
66
|
const s = reader.readObject(Buffer32);
|
|
66
67
|
const v = parseInt(sig.slice(2 + 64 * 2), 16);
|
|
67
68
|
|
|
68
|
-
|
|
69
|
+
return new Signature(r, s, v);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
static fromViemSignature(sig: ViemSignature): Signature {
|
|
73
|
+
return new Signature(Buffer32.fromBuffer(hexToBuffer(sig.r)), Buffer32.fromBuffer(hexToBuffer(sig.s)), sig.v);
|
|
74
|
+
}
|
|
69
75
|
|
|
70
|
-
|
|
76
|
+
static fromViemTransactionSignature(sig: ViemTransactionSignature): Signature {
|
|
77
|
+
return new Signature(Buffer32.fromBuffer(hexToBuffer(sig.r)), Buffer32.fromBuffer(hexToBuffer(sig.s)), sig.yParity);
|
|
71
78
|
}
|
|
72
79
|
|
|
73
80
|
static random(): Signature {
|
|
74
|
-
return new Signature(Buffer32.random(), Buffer32.random(),
|
|
81
|
+
return new Signature(Buffer32.random(), Buffer32.random(), 1);
|
|
75
82
|
}
|
|
76
83
|
|
|
77
84
|
static empty(): Signature {
|
|
78
|
-
return new Signature(Buffer32.ZERO, Buffer32.ZERO, 0
|
|
85
|
+
return new Signature(Buffer32.ZERO, Buffer32.ZERO, 0);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
isEmpty(): boolean {
|
|
89
|
+
return this.empty;
|
|
79
90
|
}
|
|
80
91
|
|
|
81
92
|
equals(other: Signature): boolean {
|
|
82
|
-
return this.r.equals(other.r) && this.s.equals(other.s) && this.v === other.v && this.
|
|
93
|
+
return this.r.equals(other.r) && this.s.equals(other.s) && this.v === other.v && this.empty === other.empty;
|
|
83
94
|
}
|
|
84
95
|
|
|
85
96
|
toBuffer(): Buffer {
|
|
86
|
-
|
|
87
|
-
this.size = buffer.length;
|
|
88
|
-
return buffer;
|
|
97
|
+
return serializeToBuffer([this.r, this.s, this.v]);
|
|
89
98
|
}
|
|
90
99
|
|
|
91
100
|
getSize(): number {
|
|
@@ -110,7 +119,20 @@ export class Signature {
|
|
|
110
119
|
r: this.r.toString(),
|
|
111
120
|
s: this.s.toString(),
|
|
112
121
|
v: this.v,
|
|
113
|
-
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Return the signature with `0x${string}` encodings for r and s. Verifies v is valid
|
|
127
|
+
*/
|
|
128
|
+
toViemTransactionSignature(): ViemTransactionSignature {
|
|
129
|
+
if (this.v !== 0 && this.v !== 1) {
|
|
130
|
+
throw new Error('Invalid transaction signature');
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
r: this.r.toString(),
|
|
134
|
+
s: this.s.toString(),
|
|
135
|
+
yParity: this.v,
|
|
114
136
|
};
|
|
115
137
|
}
|
|
116
138
|
|
package/src/fs/index.ts
CHANGED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { rm } from 'fs/promises';
|
|
2
|
+
|
|
3
|
+
import type { Logger } from '../log/index.js';
|
|
4
|
+
|
|
5
|
+
export async function tryRmDir(dir: string | undefined, logger?: Logger): Promise<void> {
|
|
6
|
+
if (dir === undefined) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
logger?.debug(`Cleaning up directory at ${dir}`);
|
|
11
|
+
await rm(dir, { recursive: true, force: true, maxRetries: 3 });
|
|
12
|
+
} catch (err) {
|
|
13
|
+
logger?.warn(`Failed to delete directory at ${dir}: ${err}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
package/src/iterable/filter.ts
CHANGED
package/src/iterable/map.ts
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Wraps an async iterable iterator such that it filters values based on a predicate. */
|
|
2
|
+
export async function* filter<T>(
|
|
3
|
+
iterator: AsyncIterableIterator<T>,
|
|
4
|
+
predicate: (item: T) => boolean | Promise<boolean>,
|
|
5
|
+
): AsyncIterableIterator<T> {
|
|
6
|
+
for await (const item of iterator) {
|
|
7
|
+
if (await predicate(item)) {
|
|
8
|
+
yield item;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { filter } from './filter.js';
|
package/src/jest/env.mjs
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { TestEnvironment } from 'jest-environment-node';
|
|
2
|
+
|
|
3
|
+
// What errors should be ignored in after hooks
|
|
4
|
+
const IgnoredErrors = ['HttpRequestError', 'CodeError'];
|
|
5
|
+
|
|
6
|
+
/** Custom Jest environment that ignores any whitelisted unhandled rejections that occur during `after` hooks */
|
|
7
|
+
export default class CustomEnvironment extends TestEnvironment {
|
|
8
|
+
constructor(config, context) {
|
|
9
|
+
super(config, context);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
async handleTestEvent(event, state) {
|
|
13
|
+
if (event.name === 'setup') {
|
|
14
|
+
// Jest 29 reports both unhandledRejection and uncaughtException events as plain `error`, without any means to differentiate them
|
|
15
|
+
// (see https://github.com/jestjs/jest/issues/9210). Jest 30 fixes it as part of a larger change (see
|
|
16
|
+
// https://github.com/jestjs/jest/pull/14315/files#diff-9bdc1fdb60c8631b1e346eff6e4899c4e64ae3a44f4f12d0d7ac70c2aabd1d93R12-R29),
|
|
17
|
+
// but we cannot update to 30 as it is still in beta at the time of writing this code. So we remove jest's unhandledRejection listener,
|
|
18
|
+
// replace it with our own, and delegate to the original listener only if the error is not in the ignored list.
|
|
19
|
+
const parentProcess = event.parentProcess;
|
|
20
|
+
const [jestListener] = parentProcess.listeners('unhandledRejection');
|
|
21
|
+
parentProcess.removeAllListeners('unhandledRejection');
|
|
22
|
+
const patchedListener = (err, _promise) => {
|
|
23
|
+
if (state.isInAfterHook && IgnoredErrors.some(error => err && err.name && err.name.includes(error))) {
|
|
24
|
+
// Ignore the error only if it was an unhandled async rejection (not sync exception), it's on the IgnoredErrors list, and we're in an after hook.
|
|
25
|
+
console.error('Ignoring unhandled rejection in after hook:', err);
|
|
26
|
+
} else if (state.isInAfterHook) {
|
|
27
|
+
// Log non-ignored unhandled rejection in an after hook, and pass the error to the original jest listener to fail the test.
|
|
28
|
+
console.error(`Unhandled rejection in after hook:`, err);
|
|
29
|
+
jestListener && jestListener(err);
|
|
30
|
+
} else {
|
|
31
|
+
// Otherwise, just delegate to the original jest listener, to emit the `error` event under the hood.
|
|
32
|
+
jestListener && jestListener(err);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
parentProcess.on('unhandledRejection', patchedListener);
|
|
36
|
+
state.patchedListener = patchedListener;
|
|
37
|
+
} else if (event.name === 'teardown') {
|
|
38
|
+
// Remove the patched handler we added in setup.
|
|
39
|
+
const parentProcess = state.parentProcess;
|
|
40
|
+
parentProcess.removeListener('unhandledRejection', state.patchedListener);
|
|
41
|
+
} else if (event.name === 'hook_start' && event.hook.type.startsWith('after')) {
|
|
42
|
+
// Track that we have entered an after hook.
|
|
43
|
+
state.isInAfterHook = true;
|
|
44
|
+
} else if (
|
|
45
|
+
(event.name === 'hook_success' || event.name === 'hook_failure') &&
|
|
46
|
+
event.hook.type.startsWith('after')
|
|
47
|
+
) {
|
|
48
|
+
// Reset the flag that we are in an after hook when we exit it.
|
|
49
|
+
state.isInAfterHook = false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
package/src/jest/setup.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseBooleanEnv } from '@aztec/foundation/config';
|
|
1
2
|
import { overwriteLoggingStream, pinoPrettyOpts } from '@aztec/foundation/log';
|
|
2
3
|
|
|
3
4
|
import pretty from 'pino-pretty';
|
|
@@ -6,4 +7,6 @@ import pretty from 'pino-pretty';
|
|
|
6
7
|
// file so we don't mess up with dependencies in non-testing environments,
|
|
7
8
|
// since pino-pretty messes up with browser bundles.
|
|
8
9
|
// See also https://www.npmjs.com/package/pino-pretty?activeTab=readme#user-content-usage-with-jest
|
|
9
|
-
|
|
10
|
+
if (!parseBooleanEnv(process.env.LOG_JSON)) {
|
|
11
|
+
overwriteLoggingStream(pretty(pinoPrettyOpts));
|
|
12
|
+
}
|
|
@@ -8,9 +8,7 @@ const log = createLogger('json-rpc:json_rpc_client');
|
|
|
8
8
|
|
|
9
9
|
export type JsonRpcFetch = (
|
|
10
10
|
host: string,
|
|
11
|
-
rpcMethod: string,
|
|
12
11
|
body: any,
|
|
13
|
-
useApiEndpoints: boolean,
|
|
14
12
|
extraHeaders?: Record<string, string>,
|
|
15
13
|
noRetry?: boolean,
|
|
16
14
|
) => Promise<{ response: any; headers: { get: (header: string) => string | null | undefined } }>;
|
|
@@ -27,45 +25,35 @@ export type JsonRpcFetch = (
|
|
|
27
25
|
*/
|
|
28
26
|
export async function defaultFetch(
|
|
29
27
|
host: string,
|
|
30
|
-
|
|
31
|
-
body: any,
|
|
32
|
-
useApiEndpoints: boolean,
|
|
28
|
+
body: unknown,
|
|
33
29
|
extraHeaders: Record<string, string> = {},
|
|
34
30
|
noRetry = false,
|
|
35
31
|
): Promise<{ response: any; headers: { get: (header: string) => string | null | undefined } }> {
|
|
36
|
-
log.debug(format(`JsonRpcClient.fetch`, host,
|
|
32
|
+
log.debug(format(`JsonRpcClient.fetch`, host, '->', body));
|
|
37
33
|
let resp: Response;
|
|
38
34
|
try {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
});
|
|
45
|
-
} else {
|
|
46
|
-
resp = await fetch(host, {
|
|
47
|
-
method: 'POST',
|
|
48
|
-
body: jsonStringify({ ...body, method: rpcMethod }),
|
|
49
|
-
headers: { 'content-type': 'application/json', ...extraHeaders },
|
|
50
|
-
});
|
|
51
|
-
}
|
|
35
|
+
resp = await fetch(host, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
body: jsonStringify(body),
|
|
38
|
+
headers: { 'content-type': 'application/json', ...extraHeaders },
|
|
39
|
+
});
|
|
52
40
|
} catch (err) {
|
|
53
|
-
const errorMessage = `Error fetching from host ${host}
|
|
41
|
+
const errorMessage = `Error fetching from host ${host}: ${inspect(err)}`;
|
|
54
42
|
throw new Error(errorMessage);
|
|
55
43
|
}
|
|
56
44
|
|
|
57
45
|
let responseJson;
|
|
58
46
|
try {
|
|
59
47
|
responseJson = await resp.json();
|
|
60
|
-
} catch
|
|
48
|
+
} catch {
|
|
61
49
|
if (!resp.ok) {
|
|
62
50
|
throw new Error(resp.statusText);
|
|
63
51
|
}
|
|
64
|
-
throw new Error(`Failed to parse body as JSON: ${resp.text()}`);
|
|
52
|
+
throw new Error(`Failed to parse body as JSON: ${await resp.text()}`);
|
|
65
53
|
}
|
|
66
54
|
|
|
67
55
|
if (!resp.ok) {
|
|
68
|
-
const errorMessage = `Error ${resp.status} from server ${host}
|
|
56
|
+
const errorMessage = `Error ${resp.status} from server ${host}: ${responseJson.error.message}`;
|
|
69
57
|
if (noRetry || (resp.status >= 400 && resp.status < 500)) {
|
|
70
58
|
throw new NoRetryError(errorMessage);
|
|
71
59
|
} else {
|
|
@@ -84,17 +72,10 @@ export async function defaultFetch(
|
|
|
84
72
|
* @returns A fetch function.
|
|
85
73
|
*/
|
|
86
74
|
export function makeFetch(retries: number[], defaultNoRetry: boolean, log?: Logger): typeof defaultFetch {
|
|
87
|
-
return async (
|
|
88
|
-
host: string,
|
|
89
|
-
rpcMethod: string,
|
|
90
|
-
body: any,
|
|
91
|
-
useApiEndpoints: boolean,
|
|
92
|
-
extraHeaders: Record<string, string> = {},
|
|
93
|
-
noRetry?: boolean,
|
|
94
|
-
) => {
|
|
75
|
+
return async (host: string, body: unknown, extraHeaders: Record<string, string> = {}, noRetry?: boolean) => {
|
|
95
76
|
return await retry(
|
|
96
|
-
() => defaultFetch(host,
|
|
97
|
-
`JsonRpcClient request
|
|
77
|
+
() => defaultFetch(host, body, extraHeaders, noRetry ?? defaultNoRetry),
|
|
78
|
+
`JsonRpcClient request to ${host}`,
|
|
98
79
|
makeBackoff(retries),
|
|
99
80
|
log,
|
|
100
81
|
false,
|
|
@@ -1,27 +1,67 @@
|
|
|
1
1
|
import { format } from 'util';
|
|
2
2
|
|
|
3
3
|
import { type Logger, createLogger } from '../../log/pino-logger.js';
|
|
4
|
+
import { type PromiseWithResolvers, promiseWithResolvers } from '../../promise/utils.js';
|
|
4
5
|
import { type ApiSchema, type ApiSchemaFor, schemaHasMethod } from '../../schemas/api.js';
|
|
6
|
+
import { jsonStringify } from '../convert.js';
|
|
5
7
|
import { type JsonRpcFetch, defaultFetch } from './fetch.js';
|
|
6
8
|
|
|
9
|
+
// batch window of 0 would capture all requests in the current sync iteration of the event loop
|
|
10
|
+
// and send them all at once in a single batch
|
|
11
|
+
// minimal latency
|
|
12
|
+
const DEFAULT_BATCH_WINDOW_MS = 0;
|
|
13
|
+
|
|
14
|
+
// the maximum size of a batched request
|
|
15
|
+
const DEFAULT_MAX_BATCH_SIZE = 100;
|
|
16
|
+
|
|
17
|
+
// 10 mb
|
|
18
|
+
const DEFAULT_MAX_REQUESTY_BODY_SIZE = 10 * 1024 * 1024;
|
|
19
|
+
|
|
7
20
|
export type SafeJsonRpcClientOptions = {
|
|
8
|
-
useApiEndpoints?: boolean;
|
|
9
21
|
namespaceMethods?: string | false;
|
|
10
22
|
fetch?: JsonRpcFetch;
|
|
11
23
|
log?: Logger;
|
|
24
|
+
batchWindowMS?: number;
|
|
25
|
+
maxBatchSize?: number;
|
|
26
|
+
maxRequestBodySize?: number;
|
|
12
27
|
onResponse?: (res: {
|
|
13
28
|
response: any;
|
|
14
29
|
headers: { get: (header: string) => string | null | undefined };
|
|
15
30
|
}) => Promise<void>;
|
|
16
31
|
};
|
|
17
32
|
|
|
33
|
+
type JsonRpcRequest = {
|
|
34
|
+
jsonrpc: '2.0';
|
|
35
|
+
id?: number;
|
|
36
|
+
method: string;
|
|
37
|
+
params?: Array<any>;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
type JsonRpcResponse =
|
|
41
|
+
| {
|
|
42
|
+
jsonrpc: '2.0';
|
|
43
|
+
id?: number;
|
|
44
|
+
result: any;
|
|
45
|
+
}
|
|
46
|
+
| {
|
|
47
|
+
jsonrpc: '2.0';
|
|
48
|
+
id?: number;
|
|
49
|
+
error: { code: number; data?: any; message: string };
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// expose helpful information on the RPC clients such that we can recognize them later
|
|
53
|
+
const SEND_BATCH = Symbol('JsonRpcClient.sendBatch');
|
|
54
|
+
const CLIENT_ID = Symbol('JsonRpcClient.clientId');
|
|
55
|
+
|
|
56
|
+
let nextClientId = 1;
|
|
57
|
+
// keep a reference to clients so that we can force send a batch
|
|
58
|
+
const clients = new Map<number, WeakRef<{ [SEND_BATCH]: () => Promise<void> }>>();
|
|
59
|
+
|
|
18
60
|
/**
|
|
19
61
|
* Creates a Proxy object that delegates over RPC and validates outputs against a given schema.
|
|
20
62
|
* The server is expected to be a JsonRpcServer.
|
|
21
63
|
* @param host - The host URL.
|
|
22
64
|
* @param schema - The api schema to validate returned data against.
|
|
23
|
-
* @param useApiEndpoints - Whether to use the API endpoints or the default RPC endpoint.
|
|
24
|
-
* @param namespaceMethods - String value (or false/empty) to namespace all methods sent to the server. e.g. 'getInfo' -\> 'pxe_getInfo'
|
|
25
65
|
* @param fetch - The fetch implementation to use.
|
|
26
66
|
*/
|
|
27
67
|
export function createSafeJsonRpcClient<T extends object>(
|
|
@@ -31,25 +71,164 @@ export function createSafeJsonRpcClient<T extends object>(
|
|
|
31
71
|
): T {
|
|
32
72
|
const fetch = config.fetch ?? defaultFetch;
|
|
33
73
|
const log = config.log ?? createLogger('json-rpc:client');
|
|
34
|
-
const {
|
|
74
|
+
const {
|
|
75
|
+
namespaceMethods = false,
|
|
76
|
+
batchWindowMS = DEFAULT_BATCH_WINDOW_MS,
|
|
77
|
+
maxBatchSize = DEFAULT_MAX_BATCH_SIZE,
|
|
78
|
+
maxRequestBodySize = DEFAULT_MAX_REQUESTY_BODY_SIZE,
|
|
79
|
+
} = config;
|
|
35
80
|
|
|
36
81
|
let id = 0;
|
|
82
|
+
let sendBatchTimeoutHandle: NodeJS.Timeout | undefined;
|
|
83
|
+
const queue: Array<{
|
|
84
|
+
request: JsonRpcRequest;
|
|
85
|
+
deferred: PromiseWithResolvers<JsonRpcResponse>;
|
|
86
|
+
encodedLength: number;
|
|
87
|
+
}> = [];
|
|
88
|
+
|
|
89
|
+
const sendBatch = async (): Promise<void> => {
|
|
90
|
+
if (sendBatchTimeoutHandle !== undefined) {
|
|
91
|
+
clearTimeout(sendBatchTimeoutHandle);
|
|
92
|
+
sendBatchTimeoutHandle = undefined;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const rpcCalls: typeof queue = [];
|
|
96
|
+
let bodySize = 0;
|
|
97
|
+
|
|
98
|
+
while (queue.length > 0 && rpcCalls.length < maxBatchSize && bodySize < maxRequestBodySize) {
|
|
99
|
+
const item = queue[0];
|
|
100
|
+
if (!item) {
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const tmpBodySize = bodySize + item.encodedLength;
|
|
105
|
+
if (tmpBodySize >= maxRequestBodySize) {
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
bodySize = tmpBodySize;
|
|
110
|
+
queue.shift();
|
|
111
|
+
rpcCalls.push(item);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// no-op
|
|
115
|
+
if (rpcCalls.length === 0) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// schedule another call if there are more items to send
|
|
120
|
+
if (queue.length > 0) {
|
|
121
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
122
|
+
sendBatchTimeoutHandle = setTimeout(sendBatch, batchWindowMS);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
log.debug(`Executing JSON-RPC batch of size: ${rpcCalls.length} body size: ${bodySize} bytes`, {
|
|
126
|
+
methods: rpcCalls.map(({ request }) => request.method),
|
|
127
|
+
});
|
|
128
|
+
try {
|
|
129
|
+
const { response, headers } = await fetch(
|
|
130
|
+
host,
|
|
131
|
+
rpcCalls.map(({ request }) => request),
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
if (config.onResponse) {
|
|
135
|
+
await config.onResponse({ response, headers });
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (!Array.isArray(response) || response.length !== rpcCalls.length) {
|
|
139
|
+
log.warn(
|
|
140
|
+
`Invalid response received from JSON-RPC server. Expected array of responses of length ${rpcCalls.length}`,
|
|
141
|
+
{ response },
|
|
142
|
+
);
|
|
143
|
+
for (let i = 0; i < rpcCalls.length; i++) {
|
|
144
|
+
const { request, deferred } = rpcCalls[i];
|
|
145
|
+
deferred.resolve({
|
|
146
|
+
id: request.id,
|
|
147
|
+
jsonrpc: '2.0',
|
|
148
|
+
error: {
|
|
149
|
+
code: -32000,
|
|
150
|
+
data: response,
|
|
151
|
+
message: response.message ?? 'Failed request',
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
} else {
|
|
156
|
+
for (let i = 0; i < response.length; i++) {
|
|
157
|
+
const resp: JsonRpcResponse = response[i];
|
|
158
|
+
const { request, deferred } = rpcCalls[i];
|
|
159
|
+
|
|
160
|
+
if (resp.id !== request.id) {
|
|
161
|
+
log.warn(`Invalid response received at index ${i} from JSON-RPC server: id mismatch`, {
|
|
162
|
+
requestMethod: request.method,
|
|
163
|
+
requestId: request.id,
|
|
164
|
+
responseId: resp.id,
|
|
165
|
+
});
|
|
166
|
+
deferred.resolve({
|
|
167
|
+
id: request.id,
|
|
168
|
+
jsonrpc: '2.0',
|
|
169
|
+
error: {
|
|
170
|
+
code: -32001,
|
|
171
|
+
data: resp,
|
|
172
|
+
message: 'RPC id mismatch',
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
} else {
|
|
176
|
+
deferred.resolve(resp);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
} catch (err) {
|
|
181
|
+
// Re-throw ComponentsVersionsError immediately without converting to JSON-RPC error
|
|
182
|
+
// This ensures version mismatch errors are surfaced to the user instead of being hidden
|
|
183
|
+
if (err && typeof err === 'object' && 'name' in err && err.name === 'ComponentsVersionsError') {
|
|
184
|
+
// Reject all pending requests with the version error
|
|
185
|
+
for (let i = 0; i < rpcCalls.length; i++) {
|
|
186
|
+
rpcCalls[i].deferred.reject(err);
|
|
187
|
+
}
|
|
188
|
+
return; // Return early, the promises are already rejected
|
|
189
|
+
}
|
|
190
|
+
log.warn(`Failed to fetch from the remote server`, err);
|
|
191
|
+
for (let i = 0; i < rpcCalls.length; i++) {
|
|
192
|
+
const { request, deferred } = rpcCalls[i];
|
|
193
|
+
deferred.resolve({
|
|
194
|
+
id: request.id,
|
|
195
|
+
jsonrpc: '2.0',
|
|
196
|
+
error: {
|
|
197
|
+
code: -32000,
|
|
198
|
+
data: err,
|
|
199
|
+
message: (err as any).message ?? 'Failed request',
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
37
206
|
const request = async (methodName: string, params: any[]): Promise<any> => {
|
|
38
207
|
if (!schemaHasMethod(schema, methodName)) {
|
|
39
208
|
throw new Error(`Unspecified method ${methodName} in client schema`);
|
|
40
209
|
}
|
|
41
210
|
const method = namespaceMethods ? `${namespaceMethods}_${methodName}` : methodName;
|
|
42
|
-
const body = { jsonrpc: '2.0', id: id++, method, params };
|
|
211
|
+
const body: JsonRpcRequest = { jsonrpc: '2.0', id: id++, method, params };
|
|
212
|
+
|
|
213
|
+
const deferred = promiseWithResolvers<JsonRpcResponse>();
|
|
214
|
+
const encodedLength = jsonStringify(body).length;
|
|
215
|
+
if (encodedLength >= maxRequestBodySize) {
|
|
216
|
+
throw new Error(`Request body too large: ${encodedLength}`);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
queue.push({ request: body, deferred, encodedLength });
|
|
220
|
+
|
|
221
|
+
if (sendBatchTimeoutHandle === undefined) {
|
|
222
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
223
|
+
sendBatchTimeoutHandle = setTimeout(sendBatch, batchWindowMS);
|
|
224
|
+
}
|
|
43
225
|
|
|
44
226
|
log.debug(format(`request`, method, params));
|
|
45
|
-
const
|
|
227
|
+
const response = await deferred.promise;
|
|
46
228
|
log.debug(format(`result`, method, response));
|
|
47
229
|
|
|
48
|
-
if (
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
if (response.error) {
|
|
52
|
-
throw response.error;
|
|
230
|
+
if ('error' in response) {
|
|
231
|
+
throw new Error(response.error.message, { cause: response.error });
|
|
53
232
|
}
|
|
54
233
|
// TODO(palla/schemas): Find a better way to handle null responses (JSON.stringify(null) is string "null").
|
|
55
234
|
if ([null, undefined, 'null', 'undefined'].includes(response.result)) {
|
|
@@ -58,10 +237,44 @@ export function createSafeJsonRpcClient<T extends object>(
|
|
|
58
237
|
return (schema as ApiSchema)[methodName].returnType().parseAsync(response.result);
|
|
59
238
|
};
|
|
60
239
|
|
|
61
|
-
const
|
|
240
|
+
const clientId = nextClientId++;
|
|
241
|
+
const proxy: any = { [CLIENT_ID]: clientId, [SEND_BATCH]: sendBatch };
|
|
62
242
|
for (const method of Object.keys(schema)) {
|
|
63
|
-
|
|
243
|
+
// attach the clientId to the promise so that if we want to trigger a batch immediately, we can do that
|
|
244
|
+
proxy[method] = (...params: any[]) => Object.assign(request(method, params), { [CLIENT_ID]: clientId });
|
|
64
245
|
}
|
|
65
246
|
|
|
247
|
+
clients.set(clientId, new WeakRef(proxy));
|
|
248
|
+
|
|
66
249
|
return proxy as T;
|
|
67
250
|
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Triggers a batch to be sent immediately
|
|
254
|
+
*/
|
|
255
|
+
export async function batch<T extends readonly unknown[]>(
|
|
256
|
+
values: T,
|
|
257
|
+
): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }> {
|
|
258
|
+
const clientIdsSeen = new Set<number>();
|
|
259
|
+
|
|
260
|
+
await Promise.allSettled(
|
|
261
|
+
values.map(val => {
|
|
262
|
+
if (typeof val === 'object' && val && Object.hasOwn(val, CLIENT_ID)) {
|
|
263
|
+
const clientId = (val as { [CLIENT_ID]: any })[CLIENT_ID];
|
|
264
|
+
if (typeof clientId === 'number') {
|
|
265
|
+
if (clientIdsSeen.has(clientId)) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
clientIdsSeen.add(clientId);
|
|
270
|
+
const client = clients.get(clientId)?.deref();
|
|
271
|
+
if (client) {
|
|
272
|
+
return client[SEND_BATCH]();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}),
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
return Promise.all(values);
|
|
280
|
+
}
|