@aztec/foundation 0.7.2 → 0.7.4
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/.tsbuildinfo +1 -0
- package/dest/abi/abi.d.ts +237 -0
- package/dest/abi/abi.d.ts.map +1 -0
- package/dest/abi/abi.js +37 -0
- package/dest/abi/abi_coder.d.ts +8 -0
- package/dest/abi/abi_coder.d.ts.map +1 -0
- package/dest/abi/abi_coder.js +24 -0
- package/dest/abi/decoder.d.ts +57 -0
- package/dest/abi/decoder.d.ts.map +1 -0
- package/dest/abi/decoder.js +149 -0
- package/dest/abi/decoder.test.d.ts +2 -0
- package/dest/abi/decoder.test.d.ts.map +1 -0
- package/dest/abi/decoder.test.js +70 -0
- package/dest/abi/encoder.d.ts +10 -0
- package/dest/abi/encoder.d.ts.map +1 -0
- package/dest/abi/encoder.js +92 -0
- package/dest/abi/encoder.test.d.ts +2 -0
- package/dest/abi/encoder.test.d.ts.map +1 -0
- package/dest/abi/encoder.test.js +74 -0
- package/dest/abi/function_selector.d.ts +73 -0
- package/dest/abi/function_selector.d.ts.map +1 -0
- package/dest/abi/function_selector.js +104 -0
- package/dest/abi/index.d.ts +6 -0
- package/dest/abi/index.d.ts.map +1 -0
- package/dest/abi/index.js +6 -0
- package/dest/async-map/async_map.test.d.ts +2 -0
- package/dest/async-map/async_map.test.d.ts.map +1 -0
- package/dest/async-map/async_map.test.js +9 -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 +19 -0
- package/dest/aztec-address/index.d.ts +114 -0
- package/dest/aztec-address/index.d.ts.map +1 -0
- package/dest/aztec-address/index.js +148 -0
- package/dest/bigint-buffer/bigint-buffer.test.d.ts +2 -0
- package/dest/bigint-buffer/bigint-buffer.test.d.ts.map +1 -0
- package/dest/bigint-buffer/bigint-buffer.test.js +18 -0
- package/dest/bigint-buffer/index.d.ts +35 -0
- package/dest/bigint-buffer/index.d.ts.map +1 -0
- package/dest/bigint-buffer/index.js +68 -0
- package/dest/collection/array.d.ts +30 -0
- package/dest/collection/array.d.ts.map +1 -0
- package/dest/collection/array.js +47 -0
- package/dest/collection/index.d.ts +2 -0
- package/dest/collection/index.d.ts.map +1 -0
- package/dest/collection/index.js +2 -0
- package/dest/committable/committable.d.ts +28 -0
- package/dest/committable/committable.d.ts.map +1 -0
- package/dest/committable/committable.js +41 -0
- package/dest/committable/committable.test.d.ts +2 -0
- package/dest/committable/committable.test.d.ts.map +1 -0
- package/dest/committable/committable.test.js +26 -0
- package/dest/committable/index.d.ts +2 -0
- package/dest/committable/index.d.ts.map +1 -0
- package/dest/committable/index.js +2 -0
- package/dest/crypto/index.d.ts +4 -0
- package/dest/crypto/index.d.ts.map +1 -0
- package/dest/crypto/index.js +4 -0
- package/dest/crypto/keccak/index.d.ts +20 -0
- package/dest/crypto/keccak/index.d.ts.map +1 -0
- package/dest/crypto/keccak/index.js +31 -0
- package/dest/crypto/random/index.d.ts +3 -0
- package/dest/crypto/random/index.d.ts.map +1 -0
- package/dest/crypto/random/index.js +36 -0
- package/dest/crypto/random/index.test.d.ts +2 -0
- package/dest/crypto/random/index.test.d.ts.map +1 -0
- package/dest/crypto/random/index.test.js +13 -0
- package/dest/crypto/sha256/index.d.ts +11 -0
- package/dest/crypto/sha256/index.d.ts.map +1 -0
- package/dest/crypto/sha256/index.js +14 -0
- package/dest/crypto/sha256/index.test.d.ts +2 -0
- package/dest/crypto/sha256/index.test.d.ts.map +1 -0
- package/dest/crypto/sha256/index.test.js +11 -0
- package/dest/errors/index.d.ts +8 -0
- package/dest/errors/index.d.ts.map +1 -0
- package/dest/errors/index.js +8 -0
- package/dest/eth-address/eth_address.test.d.ts +2 -0
- package/dest/eth-address/eth_address.test.d.ts.map +1 -0
- package/dest/eth-address/eth_address.test.js +95 -0
- package/dest/eth-address/index.d.ts +144 -0
- package/dest/eth-address/index.d.ts.map +1 -0
- package/dest/eth-address/index.js +228 -0
- package/dest/fields/coordinate.d.ts +67 -0
- package/dest/fields/coordinate.d.ts.map +1 -0
- package/dest/fields/coordinate.js +95 -0
- package/dest/fields/coordinate.test.d.ts +2 -0
- package/dest/fields/coordinate.test.d.ts.map +1 -0
- package/dest/fields/coordinate.test.js +22 -0
- package/dest/fields/fields.d.ts +177 -0
- package/dest/fields/fields.d.ts.map +1 -0
- package/dest/fields/fields.js +219 -0
- package/dest/fields/grumpkin_scalar.d.ts +96 -0
- package/dest/fields/grumpkin_scalar.d.ts.map +1 -0
- package/dest/fields/grumpkin_scalar.js +125 -0
- package/dest/fields/grumpkin_scalar.test.d.ts +2 -0
- package/dest/fields/grumpkin_scalar.test.d.ts.map +1 -0
- package/dest/fields/grumpkin_scalar.test.js +45 -0
- package/dest/fields/index.d.ts +5 -0
- package/dest/fields/index.d.ts.map +1 -0
- package/dest/fields/index.js +5 -0
- package/dest/fields/point.d.ts +105 -0
- package/dest/fields/point.d.ts.map +1 -0
- package/dest/fields/point.js +125 -0
- package/dest/fifo/bounded_serial_queue.d.ts +56 -0
- package/dest/fifo/bounded_serial_queue.d.ts.map +1 -0
- package/dest/fifo/bounded_serial_queue.js +94 -0
- package/dest/fifo/index.d.ts +5 -0
- package/dest/fifo/index.d.ts.map +1 -0
- package/dest/fifo/index.js +5 -0
- package/dest/fifo/memory_fifo.d.ts +55 -0
- package/dest/fifo/memory_fifo.d.ts.map +1 -0
- package/dest/fifo/memory_fifo.js +109 -0
- package/dest/fifo/semaphore.d.ts +23 -0
- package/dest/fifo/semaphore.d.ts.map +1 -0
- package/dest/fifo/semaphore.js +30 -0
- package/dest/fifo/serial_queue.d.ts +48 -0
- package/dest/fifo/serial_queue.d.ts.map +1 -0
- package/dest/fifo/serial_queue.js +74 -0
- package/dest/json-rpc/class_converter.d.ts +144 -0
- package/dest/json-rpc/class_converter.d.ts.map +1 -0
- package/dest/json-rpc/class_converter.js +100 -0
- package/dest/json-rpc/client/index.d.ts +2 -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/json_rpc_client.d.ts +29 -0
- package/dest/json-rpc/client/json_rpc_client.d.ts.map +1 -0
- package/dest/json-rpc/client/json_rpc_client.js +104 -0
- package/dest/json-rpc/client/json_rpc_client.test.d.ts +2 -0
- package/dest/json-rpc/client/json_rpc_client.test.d.ts.map +1 -0
- package/dest/json-rpc/client/json_rpc_client.test.js +20 -0
- package/dest/json-rpc/convert.d.ts +28 -0
- package/dest/json-rpc/convert.d.ts.map +1 -0
- package/dest/json-rpc/convert.js +139 -0
- package/dest/json-rpc/convert.test.d.ts +2 -0
- package/dest/json-rpc/convert.test.d.ts.map +1 -0
- package/dest/json-rpc/convert.test.js +68 -0
- package/dest/json-rpc/fixtures/class_a.d.ts +11 -0
- package/dest/json-rpc/fixtures/class_a.d.ts.map +1 -0
- package/dest/json-rpc/fixtures/class_a.js +17 -0
- package/dest/json-rpc/fixtures/class_b.d.ts +11 -0
- package/dest/json-rpc/fixtures/class_b.d.ts.map +1 -0
- package/dest/json-rpc/fixtures/class_b.js +17 -0
- package/dest/json-rpc/fixtures/test_state.d.ts +47 -0
- package/dest/json-rpc/fixtures/test_state.d.ts.map +1 -0
- package/dest/json-rpc/fixtures/test_state.js +62 -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 +3 -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 +18 -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 +3 -0
- package/dest/json-rpc/server/json_proxy.d.ts +18 -0
- package/dest/json-rpc/server/json_proxy.d.ts.map +1 -0
- package/dest/json-rpc/server/json_proxy.js +36 -0
- package/dest/json-rpc/server/json_rpc_server.d.ts +34 -0
- package/dest/json-rpc/server/json_rpc_server.d.ts.map +1 -0
- package/dest/json-rpc/server/json_rpc_server.js +133 -0
- package/dest/json-rpc/server/json_rpc_server.test.d.ts +2 -0
- package/dest/json-rpc/server/json_rpc_server.test.d.ts.map +1 -0
- package/dest/json-rpc/server/json_rpc_server.test.js +22 -0
- package/dest/log/console.d.ts +11 -0
- package/dest/log/console.d.ts.map +1 -0
- package/dest/log/console.js +38 -0
- package/dest/log/debug.d.ts +43 -0
- package/dest/log/debug.d.ts.map +1 -0
- package/dest/log/debug.js +75 -0
- package/dest/log/index.d.ts +9 -0
- package/dest/log/index.d.ts.map +1 -0
- package/dest/log/index.js +5 -0
- package/dest/log/log_history.d.ts +31 -0
- package/dest/log/log_history.d.ts.map +1 -0
- package/dest/log/log_history.js +42 -0
- package/dest/log/log_history.test.d.ts +2 -0
- package/dest/log/log_history.test.d.ts.map +1 -0
- package/dest/log/log_history.test.js +78 -0
- package/dest/log/logger.d.ts +34 -0
- package/dest/log/logger.d.ts.map +1 -0
- package/dest/log/logger.js +78 -0
- package/dest/mutex/index.d.ts +53 -0
- package/dest/mutex/index.d.ts.map +1 -0
- package/dest/mutex/index.js +74 -0
- package/dest/mutex/mutex.test.d.ts +9 -0
- package/dest/mutex/mutex.test.d.ts.map +1 -0
- package/dest/mutex/mutex.test.js +58 -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 +2 -0
- package/dest/retry/index.d.ts +44 -0
- package/dest/retry/index.d.ts.map +1 -0
- package/dest/retry/index.js +89 -0
- package/dest/running-promise/index.d.ts +35 -0
- package/dest/running-promise/index.d.ts.map +1 -0
- package/dest/running-promise/index.js +59 -0
- package/dest/serialize/buffer_reader.d.ts +188 -0
- package/dest/serialize/buffer_reader.d.ts.map +1 -0
- package/dest/serialize/buffer_reader.js +229 -0
- package/dest/serialize/buffer_reader.test.d.ts +2 -0
- package/dest/serialize/buffer_reader.test.d.ts.map +1 -0
- package/dest/serialize/buffer_reader.test.js +156 -0
- package/dest/serialize/deserializer.d.ts +134 -0
- package/dest/serialize/deserializer.d.ts.map +1 -0
- package/dest/serialize/deserializer.js +145 -0
- package/dest/serialize/free_funcs.d.ts +203 -0
- package/dest/serialize/free_funcs.d.ts.map +1 -0
- package/dest/serialize/free_funcs.js +250 -0
- package/dest/serialize/index.d.ts +6 -0
- package/dest/serialize/index.d.ts.map +1 -0
- package/dest/serialize/index.js +6 -0
- package/dest/serialize/serialize.test.d.ts +2 -0
- package/dest/serialize/serialize.test.d.ts.map +1 -0
- package/dest/serialize/serialize.test.js +68 -0
- package/dest/serialize/serializer.d.ts +89 -0
- package/dest/serialize/serializer.d.ts.map +1 -0
- package/dest/serialize/serializer.js +111 -0
- package/dest/serialize/types.d.ts +33 -0
- package/dest/serialize/types.d.ts.map +1 -0
- package/dest/serialize/types.js +22 -0
- package/dest/sleep/index.d.ts +52 -0
- package/dest/sleep/index.d.ts.map +1 -0
- package/dest/sleep/index.js +70 -0
- package/dest/timer/index.d.ts +3 -0
- package/dest/timer/index.d.ts.map +1 -0
- package/dest/timer/index.js +3 -0
- package/dest/timer/timeout.d.ts +41 -0
- package/dest/timer/timeout.d.ts.map +1 -0
- package/dest/timer/timeout.js +62 -0
- package/dest/timer/timer.d.ts +33 -0
- package/dest/timer/timer.d.ts.map +1 -0
- package/dest/timer/timer.js +38 -0
- package/dest/transport/browser/index.d.ts +5 -0
- package/dest/transport/browser/index.d.ts.map +1 -0
- package/dest/transport/browser/index.js +5 -0
- package/dest/transport/browser/message_port_socket.d.ts +37 -0
- package/dest/transport/browser/message_port_socket.d.ts.map +1 -0
- package/dest/transport/browser/message_port_socket.js +46 -0
- package/dest/transport/browser/shared_worker_connector.d.ts +19 -0
- package/dest/transport/browser/shared_worker_connector.d.ts.map +1 -0
- package/dest/transport/browser/shared_worker_connector.js +21 -0
- package/dest/transport/browser/shared_worker_listener.d.ts +38 -0
- package/dest/transport/browser/shared_worker_listener.d.ts.map +1 -0
- package/dest/transport/browser/shared_worker_listener.js +37 -0
- package/dest/transport/browser/worker_connector.d.ts +26 -0
- package/dest/transport/browser/worker_connector.d.ts.map +1 -0
- package/dest/transport/browser/worker_connector.js +30 -0
- package/dest/transport/browser/worker_listener.d.ts +39 -0
- package/dest/transport/browser/worker_listener.d.ts.map +1 -0
- package/dest/transport/browser/worker_listener.js +39 -0
- package/dest/transport/dispatch/create_dispatch_fn.d.ts +25 -0
- package/dest/transport/dispatch/create_dispatch_fn.d.ts.map +1 -0
- package/dest/transport/dispatch/create_dispatch_fn.js +18 -0
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts +102 -0
- package/dest/transport/dispatch/create_dispatch_proxy.d.ts.map +1 -0
- package/dest/transport/dispatch/create_dispatch_proxy.js +56 -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 +12 -0
- package/dest/transport/index.d.ts +12 -0
- package/dest/transport/index.d.ts.map +1 -0
- package/dest/transport/index.js +12 -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 +2 -0
- package/dest/transport/interface/listener.d.ts +13 -0
- package/dest/transport/interface/listener.d.ts.map +1 -0
- package/dest/transport/interface/listener.js +2 -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 +2 -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 +3 -0
- package/dest/transport/node/node_connector.d.ts +28 -0
- package/dest/transport/node/node_connector.d.ts.map +1 -0
- package/dest/transport/node/node_connector.js +28 -0
- package/dest/transport/node/node_connector_socket.d.ts +42 -0
- package/dest/transport/node/node_connector_socket.d.ts.map +1 -0
- package/dest/transport/node/node_connector_socket.js +48 -0
- package/dest/transport/node/node_listener.d.ts +26 -0
- package/dest/transport/node/node_listener.d.ts.map +1 -0
- package/dest/transport/node/node_listener.js +30 -0
- package/dest/transport/node/node_listener_socket.d.ts +37 -0
- package/dest/transport/node/node_listener_socket.d.ts.map +1 -0
- package/dest/transport/node/node_listener_socket.js +44 -0
- package/dest/transport/transport_client.d.ts +61 -0
- package/dest/transport/transport_client.d.ts.map +1 -0
- package/dest/transport/transport_client.js +94 -0
- package/dest/transport/transport_server.d.ts +56 -0
- package/dest/transport/transport_server.d.ts.map +1 -0
- package/dest/transport/transport_server.js +101 -0
- package/dest/types/index.d.ts +7 -0
- package/dest/types/index.d.ts.map +1 -0
- package/dest/types/index.js +2 -0
- package/dest/url/index.d.ts +9 -0
- package/dest/url/index.d.ts.map +1 -0
- package/dest/url/index.js +66 -0
- package/dest/wasm/empty_wasi_sdk.d.ts +130 -0
- package/dest/wasm/empty_wasi_sdk.d.ts.map +1 -0
- package/dest/wasm/empty_wasi_sdk.js +166 -0
- package/dest/wasm/index.d.ts +2 -0
- package/dest/wasm/index.d.ts.map +1 -0
- package/dest/wasm/index.js +2 -0
- package/dest/wasm/wasm_module.d.ts +135 -0
- package/dest/wasm/wasm_module.d.ts.map +1 -0
- package/dest/wasm/wasm_module.js +205 -0
- package/dest/wasm/wasm_module.test.d.ts +2 -0
- package/dest/wasm/wasm_module.test.d.ts.map +1 -0
- package/dest/wasm/wasm_module.test.js +24 -0
- package/dest/worker/browser/index.d.ts +3 -0
- package/dest/worker/browser/index.d.ts.map +1 -0
- package/dest/worker/browser/index.js +3 -0
- package/dest/worker/browser/start_web_module.d.ts +7 -0
- package/dest/worker/browser/start_web_module.d.ts.map +1 -0
- package/dest/worker/browser/start_web_module.js +22 -0
- package/dest/worker/browser/web_data_store.d.ts +23 -0
- package/dest/worker/browser/web_data_store.d.ts.map +1 -0
- package/dest/worker/browser/web_data_store.js +32 -0
- package/dest/worker/browser/web_worker.d.ts +10 -0
- package/dest/worker/browser/web_worker.d.ts.map +1 -0
- package/dest/worker/browser/web_worker.js +23 -0
- package/dest/worker/data_store.d.ts +20 -0
- package/dest/worker/data_store.d.ts.map +1 -0
- package/dest/worker/data_store.js +2 -0
- package/dest/worker/index.d.ts +3 -0
- package/dest/worker/index.d.ts.map +1 -0
- package/dest/worker/index.js +2 -0
- package/dest/worker/node/index.d.ts +3 -0
- package/dest/worker/node/index.d.ts.map +1 -0
- package/dest/worker/node/index.js +3 -0
- package/dest/worker/node/node_data_store.d.ts +12 -0
- package/dest/worker/node/node_data_store.d.ts.map +1 -0
- package/dest/worker/node/node_data_store.js +21 -0
- package/dest/worker/node/node_worker.d.ts +6 -0
- package/dest/worker/node/node_worker.d.ts.map +1 -0
- package/dest/worker/node/node_worker.js +20 -0
- package/dest/worker/node/start_node_module.d.ts +7 -0
- package/dest/worker/node/start_node_module.d.ts.map +1 -0
- package/dest/worker/node/start_node_module.js +26 -0
- package/dest/worker/wasm_worker.d.ts +9 -0
- package/dest/worker/wasm_worker.d.ts.map +1 -0
- package/dest/worker/wasm_worker.js +2 -0
- package/dest/worker/worker_pool.d.ts +40 -0
- package/dest/worker/worker_pool.d.ts.map +1 -0
- package/dest/worker/worker_pool.js +62 -0
- package/package.json +1 -1
- package/src/abi/abi.ts +8 -2
- package/src/abi/encoder.ts +5 -3
- package/Dockerfile +0 -15
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import debug from 'debug';
|
|
2
|
+
import isNode from 'detect-node';
|
|
3
|
+
import { isatty } from 'tty';
|
|
4
|
+
// Matches a subset of Winston log levels
|
|
5
|
+
const LogLevels = ['silent', 'error', 'warn', 'info', 'verbose', 'debug'];
|
|
6
|
+
const DefaultLogLevel = 'info';
|
|
7
|
+
const envLogLevel = process.env.LOG_LEVEL?.toLowerCase();
|
|
8
|
+
const currentLevel = LogLevels.includes(envLogLevel) ? envLogLevel : DefaultLogLevel;
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new DebugLogger for the current module, defaulting to the LOG_LEVEL env var.
|
|
11
|
+
* If DEBUG="[module]" env is set, will enable debug logging if the module matches.
|
|
12
|
+
* Uses npm debug for debug level and console.error for other levels.
|
|
13
|
+
* @param name - Name of the module.
|
|
14
|
+
* @returns A debug logger.
|
|
15
|
+
*/
|
|
16
|
+
export function createDebugLogger(name) {
|
|
17
|
+
const debugLogger = debug(name);
|
|
18
|
+
if (currentLevel === 'debug')
|
|
19
|
+
debugLogger.enabled = true;
|
|
20
|
+
const logger = {
|
|
21
|
+
silent: () => { },
|
|
22
|
+
error: (...args) => logWithDebug(debugLogger, 'error', args),
|
|
23
|
+
warn: (...args) => logWithDebug(debugLogger, 'warn', args),
|
|
24
|
+
info: (...args) => logWithDebug(debugLogger, 'info', args),
|
|
25
|
+
verbose: (...args) => logWithDebug(debugLogger, 'verbose', args),
|
|
26
|
+
debug: (...args) => logWithDebug(debugLogger, 'debug', args),
|
|
27
|
+
};
|
|
28
|
+
return Object.assign((...args) => logWithDebug(debugLogger, 'debug', args), logger);
|
|
29
|
+
}
|
|
30
|
+
const logHandlers = [];
|
|
31
|
+
/**
|
|
32
|
+
* Registers a callback for all logs, whether they are emitted in the current log level or not.
|
|
33
|
+
* @param handler - Callback to be called on every log.
|
|
34
|
+
*/
|
|
35
|
+
export function onLog(handler) {
|
|
36
|
+
logHandlers.push(handler);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Logs args to npm debug if enabled or log level is debug, console.error otherwise.
|
|
40
|
+
* @param debug - Instance of npm debug.
|
|
41
|
+
* @param level - Intended log level.
|
|
42
|
+
* @param args - Args to log.
|
|
43
|
+
*/
|
|
44
|
+
function logWithDebug(debug, level, args) {
|
|
45
|
+
for (const handler of logHandlers) {
|
|
46
|
+
handler(level, debug.namespace, args);
|
|
47
|
+
}
|
|
48
|
+
if (debug.enabled) {
|
|
49
|
+
debug(args[0], ...args.slice(1));
|
|
50
|
+
}
|
|
51
|
+
else if (LogLevels.indexOf(level) <= LogLevels.indexOf(currentLevel) && process.env.NODE_ENV !== 'test') {
|
|
52
|
+
printLog([getPrefix(debug, level), ...args]);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Returns a log prefix that emulates that of npm debug. Uses colors if in node and in a tty.
|
|
57
|
+
* @param debugLogger - Instance of npm debug logger.
|
|
58
|
+
* @param level - Intended log level (printed out if strictly above current log level).
|
|
59
|
+
* @returns Log prefix.
|
|
60
|
+
*/
|
|
61
|
+
function getPrefix(debugLogger, level) {
|
|
62
|
+
const levelLabel = currentLevel !== level ? ` ${level.toUpperCase()}` : '';
|
|
63
|
+
const prefix = `${debugLogger.namespace.replace(/^aztec:/, '')}${levelLabel}`;
|
|
64
|
+
if (!isNode || !isatty(process.stderr.fd))
|
|
65
|
+
return prefix;
|
|
66
|
+
const colorIndex = debug.selectColor(debugLogger.namespace);
|
|
67
|
+
const colorCode = '\u001B[3' + (colorIndex < 8 ? colorIndex : '8;5;' + colorIndex);
|
|
68
|
+
return ` ${colorCode};1m${prefix}\u001B[0m`;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Outputs to console error.
|
|
72
|
+
* @param args - Args to log.
|
|
73
|
+
*/
|
|
74
|
+
function printLog(args) {
|
|
75
|
+
// eslint-disable-next-line no-console
|
|
76
|
+
console.error(...args);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy9sb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBSTdCLHlDQUF5QztBQUN6QyxNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFDbkYsTUFBTSxlQUFlLEdBQUcsTUFBZSxDQUFDO0FBT3hDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBYyxDQUFDO0FBQ3JFLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO0FBYXJGOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFZO0lBQzVDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxJQUFJLFlBQVksS0FBSyxPQUFPO1FBQUUsV0FBVyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFFekQsTUFBTSxNQUFNLEdBQUc7UUFDYixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztRQUNoQixLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDO1FBQ25FLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUM7UUFDakUsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQztRQUNqRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDO1FBQ3ZFLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUM7S0FDcEUsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM3RixDQUFDO0FBS0QsTUFBTSxXQUFXLEdBQWlCLEVBQUUsQ0FBQztBQUVyQzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLE9BQW1CO0lBQ3ZDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBcUIsRUFBRSxLQUFlLEVBQUUsSUFBVztJQUN2RSxLQUFLLE1BQU0sT0FBTyxJQUFJLFdBQVcsRUFBRTtRQUNqQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDdkM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7UUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNsQztTQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLE1BQU0sRUFBRTtRQUN6RyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUM5QztBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsU0FBUyxDQUFDLFdBQTJCLEVBQUUsS0FBZTtJQUM3RCxNQUFNLFVBQVUsR0FBRyxZQUFZLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDM0UsTUFBTSxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDOUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3pELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBVyxDQUFDO0lBQ3RFLE1BQU0sU0FBUyxHQUFHLFVBQVUsR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDO0lBQ25GLE9BQU8sS0FBSyxTQUFTLE1BQU0sTUFBTSxXQUFXLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsUUFBUSxDQUFDLElBQVc7SUFDM0Isc0NBQXNDO0lBQ3RDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN6QixDQUFDIn0=
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { MutexDatabase } from './mutex_database.js';
|
|
2
|
+
export * from './mutex_database.js';
|
|
3
|
+
/**
|
|
4
|
+
* Mutex class provides a mutual exclusion mechanism for critical sections of code using a named lock.
|
|
5
|
+
* The lock is acquired and released via the `lock` and `unlock` methods. Locks can be optionally pinged
|
|
6
|
+
* to keep them alive when they are held for longer durations, avoiding unintended release due to timeouts.
|
|
7
|
+
*
|
|
8
|
+
* The underlying lock state is managed in a MutexDatabase instance which can be shared across multiple Mutex instances.
|
|
9
|
+
* This allows for synchronization between different parts of an application or even across different instances of an application.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* const mutex = new Mutex(mutexDatabase, 'myLock');
|
|
13
|
+
* await mutex.lock();
|
|
14
|
+
* // Critical section here
|
|
15
|
+
* await mutex.unlock();
|
|
16
|
+
*/
|
|
17
|
+
export declare class Mutex {
|
|
18
|
+
private readonly db;
|
|
19
|
+
private readonly name;
|
|
20
|
+
private readonly timeout;
|
|
21
|
+
private readonly tryLockInterval;
|
|
22
|
+
private readonly pingInterval;
|
|
23
|
+
private id;
|
|
24
|
+
private pingTimeout;
|
|
25
|
+
constructor(db: MutexDatabase, name: string, timeout?: number, tryLockInterval?: number, pingInterval?: number);
|
|
26
|
+
/**
|
|
27
|
+
* Acquire a lock on the mutex. If 'untilAcquired' is true, the method will keep trying to acquire the lock until it
|
|
28
|
+
* successfully acquires it. If 'untilAcquired' is false, the method will try to acquire the lock once and return
|
|
29
|
+
* immediately with a boolean indicating if the lock has been acquired or not.
|
|
30
|
+
*
|
|
31
|
+
* @param untilAcquired - Optional parameter, set to true by default. If true, the method will keep trying to acquire the lock until success. If false, the method will try only once and return a boolean value.
|
|
32
|
+
* @returns A Promise that resolves to true if the lock has been acquired, or false when 'untilAcquired' is false and the lock could not be immediately acquired.
|
|
33
|
+
*/
|
|
34
|
+
lock(untilAcquired?: boolean): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Unlocks the mutex, allowing other instances to acquire the lock.
|
|
37
|
+
* This method also clears the internal ping timeout and increments the internal ID
|
|
38
|
+
* to ensure stale pings do not extend the lock after it has been released.
|
|
39
|
+
*
|
|
40
|
+
* @returns A promise that resolves once the lock has been released in the database.
|
|
41
|
+
*/
|
|
42
|
+
unlock(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Periodically extends the lock's lifetime by updating the database record with a new expiration time.
|
|
45
|
+
* This method is called recursively using setTimeout. If the id passed to the ping method does not match
|
|
46
|
+
* the current lock instance's id, it means the lock has been released or acquired by another instance
|
|
47
|
+
* and the ping should not proceed further.
|
|
48
|
+
*
|
|
49
|
+
* @param id - The id of the current lock instance.
|
|
50
|
+
*/
|
|
51
|
+
private ping;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mutex/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,cAAc,qBAAqB,CAAC;AAEpC;;;;;;;;;;;;;GAaG;AACH,qBAAa,KAAK;IAKd,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAR/B,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,WAAW,CAAkB;gBAGlB,EAAE,EAAE,aAAa,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,SAAO,EACd,eAAe,SAAO,EACtB,YAAY,SAAO;IAGtC;;;;;;;OAOG;IACU,IAAI,CAAC,aAAa,UAAO;IAetC;;;;;;OAMG;IACU,MAAM;IAMnB;;;;;;;OAOG;YACW,IAAI;CAQnB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export * from './mutex_database.js';
|
|
2
|
+
/**
|
|
3
|
+
* Mutex class provides a mutual exclusion mechanism for critical sections of code using a named lock.
|
|
4
|
+
* The lock is acquired and released via the `lock` and `unlock` methods. Locks can be optionally pinged
|
|
5
|
+
* to keep them alive when they are held for longer durations, avoiding unintended release due to timeouts.
|
|
6
|
+
*
|
|
7
|
+
* The underlying lock state is managed in a MutexDatabase instance which can be shared across multiple Mutex instances.
|
|
8
|
+
* This allows for synchronization between different parts of an application or even across different instances of an application.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const mutex = new Mutex(mutexDatabase, 'myLock');
|
|
12
|
+
* await mutex.lock();
|
|
13
|
+
* // Critical section here
|
|
14
|
+
* await mutex.unlock();
|
|
15
|
+
*/
|
|
16
|
+
export class Mutex {
|
|
17
|
+
constructor(db, name, timeout = 5000, tryLockInterval = 2000, pingInterval = 2000) {
|
|
18
|
+
this.db = db;
|
|
19
|
+
this.name = name;
|
|
20
|
+
this.timeout = timeout;
|
|
21
|
+
this.tryLockInterval = tryLockInterval;
|
|
22
|
+
this.pingInterval = pingInterval;
|
|
23
|
+
this.id = 0;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Acquire a lock on the mutex. If 'untilAcquired' is true, the method will keep trying to acquire the lock until it
|
|
27
|
+
* successfully acquires it. If 'untilAcquired' is false, the method will try to acquire the lock once and return
|
|
28
|
+
* immediately with a boolean indicating if the lock has been acquired or not.
|
|
29
|
+
*
|
|
30
|
+
* @param untilAcquired - Optional parameter, set to true by default. If true, the method will keep trying to acquire the lock until success. If false, the method will try only once and return a boolean value.
|
|
31
|
+
* @returns A Promise that resolves to true if the lock has been acquired, or false when 'untilAcquired' is false and the lock could not be immediately acquired.
|
|
32
|
+
*/
|
|
33
|
+
async lock(untilAcquired = true) {
|
|
34
|
+
while (true) {
|
|
35
|
+
if (await this.db.acquireLock(this.name, this.timeout)) {
|
|
36
|
+
const id = this.id;
|
|
37
|
+
this.pingTimeout = setTimeout(() => this.ping(id), this.pingInterval);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
if (!untilAcquired) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
await new Promise(resolve => setTimeout(resolve, this.tryLockInterval));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Unlocks the mutex, allowing other instances to acquire the lock.
|
|
48
|
+
* This method also clears the internal ping timeout and increments the internal ID
|
|
49
|
+
* to ensure stale pings do not extend the lock after it has been released.
|
|
50
|
+
*
|
|
51
|
+
* @returns A promise that resolves once the lock has been released in the database.
|
|
52
|
+
*/
|
|
53
|
+
async unlock() {
|
|
54
|
+
clearTimeout(this.pingTimeout);
|
|
55
|
+
this.id++;
|
|
56
|
+
await this.db.releaseLock(this.name);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Periodically extends the lock's lifetime by updating the database record with a new expiration time.
|
|
60
|
+
* This method is called recursively using setTimeout. If the id passed to the ping method does not match
|
|
61
|
+
* the current lock instance's id, it means the lock has been released or acquired by another instance
|
|
62
|
+
* and the ping should not proceed further.
|
|
63
|
+
*
|
|
64
|
+
* @param id - The id of the current lock instance.
|
|
65
|
+
*/
|
|
66
|
+
async ping(id) {
|
|
67
|
+
if (id !== this.id) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
await this.db.extendLock(this.name, this.timeout);
|
|
71
|
+
this.pingTimeout = setTimeout(() => this.ping(id), this.pingInterval);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXV0ZXgvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsY0FBYyxxQkFBcUIsQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxPQUFPLEtBQUs7SUFJaEIsWUFDbUIsRUFBaUIsRUFDakIsSUFBWSxFQUNaLFVBQVUsSUFBSSxFQUNkLGtCQUFrQixJQUFJLEVBQ3RCLGVBQWUsSUFBSTtRQUpuQixPQUFFLEdBQUYsRUFBRSxDQUFlO1FBQ2pCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixZQUFPLEdBQVAsT0FBTyxDQUFPO1FBQ2Qsb0JBQWUsR0FBZixlQUFlLENBQU87UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQU87UUFSOUIsT0FBRSxHQUFHLENBQUMsQ0FBQztJQVNaLENBQUM7SUFFSjs7Ozs7OztPQU9HO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSTtRQUNwQyxPQUFPLElBQUksRUFBRTtZQUNYLElBQUksTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDdEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3RFLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNsQixPQUFPLEtBQUssQ0FBQzthQUNkO1lBQ0QsTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7U0FDekU7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLE1BQU07UUFDakIsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBVTtRQUMzQixJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2xCLE9BQU87U0FDUjtRQUVELE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEUsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sleep function for introducing a delay in the execution of code.
|
|
3
|
+
* Returns a Promise that resolves after the specified number of milliseconds.
|
|
4
|
+
*
|
|
5
|
+
* @param ms - The number of milliseconds to pause the execution.
|
|
6
|
+
* @returns A Promise that resolves after the specified delay.
|
|
7
|
+
*/
|
|
8
|
+
export declare function sleep(ms: number): Promise<unknown>;
|
|
9
|
+
//# sourceMappingURL=mutex.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutex.test.d.ts","sourceRoot":"","sources":["../../src/mutex/mutex.test.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,oBAE/B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jest } from '@jest/globals';
|
|
2
|
+
import { Mutex } from './index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Sleep function for introducing a delay in the execution of code.
|
|
5
|
+
* Returns a Promise that resolves after the specified number of milliseconds.
|
|
6
|
+
*
|
|
7
|
+
* @param ms - The number of milliseconds to pause the execution.
|
|
8
|
+
* @returns A Promise that resolves after the specified delay.
|
|
9
|
+
*/
|
|
10
|
+
export function sleep(ms) {
|
|
11
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
12
|
+
}
|
|
13
|
+
describe('mutex', () => {
|
|
14
|
+
let db;
|
|
15
|
+
let mutex;
|
|
16
|
+
const mutexName = 'test-mutex';
|
|
17
|
+
const timeout = 500;
|
|
18
|
+
const tryLockInterval = 100;
|
|
19
|
+
const pingInterval = 200;
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
db = {
|
|
22
|
+
acquireLock: jest.fn().mockImplementation(() => false),
|
|
23
|
+
extendLock: jest.fn().mockImplementation(() => {
|
|
24
|
+
db.acquireLock.mockResolvedValueOnce(false);
|
|
25
|
+
}),
|
|
26
|
+
releaseLock: jest.fn().mockImplementation(() => {
|
|
27
|
+
db.acquireLock.mockResolvedValueOnce(true);
|
|
28
|
+
}),
|
|
29
|
+
};
|
|
30
|
+
db.acquireLock.mockResolvedValueOnce(true);
|
|
31
|
+
mutex = new Mutex(db, mutexName, timeout, tryLockInterval, pingInterval);
|
|
32
|
+
});
|
|
33
|
+
it('cannot lock if locked', async () => {
|
|
34
|
+
const result = [];
|
|
35
|
+
const fn1 = async (runAfterLocked) => {
|
|
36
|
+
await mutex.lock();
|
|
37
|
+
const pm = runAfterLocked();
|
|
38
|
+
await sleep(500);
|
|
39
|
+
result.push('fn1');
|
|
40
|
+
await mutex.unlock();
|
|
41
|
+
return pm;
|
|
42
|
+
};
|
|
43
|
+
const fn2 = async () => {
|
|
44
|
+
await mutex.lock();
|
|
45
|
+
result.push('fn2');
|
|
46
|
+
await mutex.unlock();
|
|
47
|
+
};
|
|
48
|
+
await fn1(fn2);
|
|
49
|
+
expect(result).toEqual(['fn1', 'fn2']);
|
|
50
|
+
});
|
|
51
|
+
it('automatically extend the expiry time of the lock', async () => {
|
|
52
|
+
await mutex.lock();
|
|
53
|
+
await sleep(1000);
|
|
54
|
+
await mutex.unlock();
|
|
55
|
+
expect(db.extendLock).toHaveBeenCalledWith(mutexName, timeout);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV0ZXgudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tdXRleC9tdXRleC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUduQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLEVBQVU7SUFDOUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBVUQsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7SUFDckIsSUFBSSxFQUEwQixDQUFDO0lBQy9CLElBQUksS0FBWSxDQUFDO0lBQ2pCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQztJQUMvQixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDcEIsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDO0lBQzVCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztJQUV6QixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsRUFBRSxHQUFHO1lBQ0gsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDdEQsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUU7Z0JBQzNDLEVBQUUsQ0FBQyxXQUFXLENBQUMscUJBQTZCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsQ0FBQyxDQUFDO1lBQ0YsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUU7Z0JBQzVDLEVBQUUsQ0FBQyxXQUFXLENBQUMscUJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDO1NBQ0ksQ0FBQztRQUNSLEVBQUUsQ0FBQyxXQUFXLENBQUMscUJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEQsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEVBQW1CLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxjQUFtQyxFQUFFLEVBQUU7WUFDeEQsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsTUFBTSxFQUFFLEdBQUcsY0FBYyxFQUFFLENBQUM7WUFDNUIsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixNQUFNLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQztRQUVGLE1BQU0sR0FBRyxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ3JCLE1BQU0sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkIsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDO1FBRUYsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDaEUsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFckIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a mutual exclusion (mutex) database interface.
|
|
3
|
+
* Provides functionality for acquiring, extending, and releasing locks on resources to ensure exclusive access and prevent conflicts in concurrent applications.
|
|
4
|
+
*/
|
|
5
|
+
export interface MutexDatabase {
|
|
6
|
+
acquireLock(name: string, timeout: number): Promise<boolean>;
|
|
7
|
+
extendLock(name: string, timeout: number): Promise<void>;
|
|
8
|
+
releaseLock(name: string): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=mutex_database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutex_database.d.ts","sourceRoot":"","sources":["../../src/mutex/mutex_database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,aAAa;IAE5B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7D,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** An error that indicates that the operation should not be retried. */
|
|
2
|
+
export declare class NoRetryError extends Error {
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Generates a backoff sequence for retrying operations with an increasing delay.
|
|
6
|
+
* The backoff sequence follows this pattern: 1, 1, 1, 2, 4, 8, 16, 32, 64, ...
|
|
7
|
+
* This generator can be used in combination with the `retry` function to perform
|
|
8
|
+
* retries with exponential backoff and capped at 64 seconds between attempts.
|
|
9
|
+
*
|
|
10
|
+
* @returns A generator that yields the next backoff value in seconds as an integer.
|
|
11
|
+
*/
|
|
12
|
+
export declare function backoffGenerator(): Generator<number, void, unknown>;
|
|
13
|
+
/**
|
|
14
|
+
* Generates a backoff sequence based on the array of retry intervals to use with the `retry` function.
|
|
15
|
+
* @param retries - Intervals to retry (in seconds).
|
|
16
|
+
* @returns A generator sequence.
|
|
17
|
+
*/
|
|
18
|
+
export declare function makeBackoff(retries: number[]): Generator<number, void, unknown>;
|
|
19
|
+
/**
|
|
20
|
+
* Retry a given asynchronous function with a specific backoff strategy, until it succeeds or backoff generator ends.
|
|
21
|
+
* It logs the error and retry interval in case an error is caught. The function can be named for better log output.
|
|
22
|
+
*
|
|
23
|
+
* @param fn - The asynchronous function to be retried.
|
|
24
|
+
* @param name - The optional name of the operation, used for logging purposes.
|
|
25
|
+
* @param backoff - The optional backoff generator providing the intervals in seconds between retries. Defaults to a predefined series.
|
|
26
|
+
* @param log - Logger to use for logging.
|
|
27
|
+
* @param failSilently - Do not log errors while retrying.
|
|
28
|
+
* @returns A Promise that resolves with the successful result of the provided function, or rejects if backoff generator ends.
|
|
29
|
+
* @throws If `NoRetryError` is thrown by the `fn`, it is rethrown.
|
|
30
|
+
*/
|
|
31
|
+
export declare function retry<Result>(fn: () => Promise<Result>, name?: string, backoff?: Generator<number, void, unknown>, log?: import("../log/logger.js").DebugLogger, failSilently?: boolean): Promise<Result>;
|
|
32
|
+
/**
|
|
33
|
+
* Retry an asynchronous function until it returns a truthy value or the specified timeout is exceeded.
|
|
34
|
+
* The function is retried periodically with a fixed interval between attempts. The operation can be named for better error messages.
|
|
35
|
+
* Will never timeout if the value is 0.
|
|
36
|
+
*
|
|
37
|
+
* @param fn - The asynchronous function to be retried, which should return a truthy value upon success or undefined otherwise.
|
|
38
|
+
* @param name - The optional name of the operation, used for generating timeout error message.
|
|
39
|
+
* @param timeout - The optional maximum time, in seconds, to keep retrying before throwing a timeout error. Defaults to 0 (never timeout).
|
|
40
|
+
* @param interval - The optional interval, in seconds, between retry attempts. Defaults to 1 second.
|
|
41
|
+
* @returns A Promise that resolves with the successful (truthy) result of the provided function, or rejects if timeout is exceeded.
|
|
42
|
+
*/
|
|
43
|
+
export declare function retryUntil<T>(fn: () => Promise<T | undefined>, name?: string, timeout?: number, interval?: number): Promise<NonNullable<Awaited<T>>>;
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/retry/index.ts"],"names":[],"mappings":"AAIA,wEAAwE;AACxE,qBAAa,YAAa,SAAQ,KAAK;CAAG;AAE1C;;;;;;;GAOG;AACH,wBAAiB,gBAAgB,qCAMhC;AAED;;;;GAIG;AACH,wBAAiB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,oCAI7C;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,KAAK,CAAC,MAAM,EAChC,EAAE,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EACzB,IAAI,SAAc,EAClB,OAAO,mCAAqB,EAC5B,GAAG,yCAA8C,EACjD,YAAY,UAAQ,mBAoBrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,IAAI,SAAK,EAAE,OAAO,SAAI,EAAE,QAAQ,SAAI,oCAczG"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { createDebugLogger } from '../log/index.js';
|
|
2
|
+
import { sleep } from '../sleep/index.js';
|
|
3
|
+
import { Timer } from '../timer/index.js';
|
|
4
|
+
/** An error that indicates that the operation should not be retried. */
|
|
5
|
+
export class NoRetryError extends Error {
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Generates a backoff sequence for retrying operations with an increasing delay.
|
|
9
|
+
* The backoff sequence follows this pattern: 1, 1, 1, 2, 4, 8, 16, 32, 64, ...
|
|
10
|
+
* This generator can be used in combination with the `retry` function to perform
|
|
11
|
+
* retries with exponential backoff and capped at 64 seconds between attempts.
|
|
12
|
+
*
|
|
13
|
+
* @returns A generator that yields the next backoff value in seconds as an integer.
|
|
14
|
+
*/
|
|
15
|
+
export function* backoffGenerator() {
|
|
16
|
+
const v = [1, 1, 1, 2, 4, 8, 16, 32, 64];
|
|
17
|
+
let i = 0;
|
|
18
|
+
while (true) {
|
|
19
|
+
yield v[Math.min(i++, v.length - 1)];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generates a backoff sequence based on the array of retry intervals to use with the `retry` function.
|
|
24
|
+
* @param retries - Intervals to retry (in seconds).
|
|
25
|
+
* @returns A generator sequence.
|
|
26
|
+
*/
|
|
27
|
+
export function* makeBackoff(retries) {
|
|
28
|
+
for (const retry of retries) {
|
|
29
|
+
yield retry;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Retry a given asynchronous function with a specific backoff strategy, until it succeeds or backoff generator ends.
|
|
34
|
+
* It logs the error and retry interval in case an error is caught. The function can be named for better log output.
|
|
35
|
+
*
|
|
36
|
+
* @param fn - The asynchronous function to be retried.
|
|
37
|
+
* @param name - The optional name of the operation, used for logging purposes.
|
|
38
|
+
* @param backoff - The optional backoff generator providing the intervals in seconds between retries. Defaults to a predefined series.
|
|
39
|
+
* @param log - Logger to use for logging.
|
|
40
|
+
* @param failSilently - Do not log errors while retrying.
|
|
41
|
+
* @returns A Promise that resolves with the successful result of the provided function, or rejects if backoff generator ends.
|
|
42
|
+
* @throws If `NoRetryError` is thrown by the `fn`, it is rethrown.
|
|
43
|
+
*/
|
|
44
|
+
export async function retry(fn, name = 'Operation', backoff = backoffGenerator(), log = createDebugLogger('aztec:foundation:retry'), failSilently = false) {
|
|
45
|
+
while (true) {
|
|
46
|
+
try {
|
|
47
|
+
return await fn();
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
if (err instanceof NoRetryError) {
|
|
51
|
+
// A special error that indicates that the operation should not be retried. Rethrow it.
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
const s = backoff.next().value;
|
|
55
|
+
if (s === undefined) {
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
log(`${name} failed. Will retry in ${s}s...`);
|
|
59
|
+
!failSilently && log.error(err);
|
|
60
|
+
await sleep(s * 1000);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Retry an asynchronous function until it returns a truthy value or the specified timeout is exceeded.
|
|
67
|
+
* The function is retried periodically with a fixed interval between attempts. The operation can be named for better error messages.
|
|
68
|
+
* Will never timeout if the value is 0.
|
|
69
|
+
*
|
|
70
|
+
* @param fn - The asynchronous function to be retried, which should return a truthy value upon success or undefined otherwise.
|
|
71
|
+
* @param name - The optional name of the operation, used for generating timeout error message.
|
|
72
|
+
* @param timeout - The optional maximum time, in seconds, to keep retrying before throwing a timeout error. Defaults to 0 (never timeout).
|
|
73
|
+
* @param interval - The optional interval, in seconds, between retry attempts. Defaults to 1 second.
|
|
74
|
+
* @returns A Promise that resolves with the successful (truthy) result of the provided function, or rejects if timeout is exceeded.
|
|
75
|
+
*/
|
|
76
|
+
export async function retryUntil(fn, name = '', timeout = 0, interval = 1) {
|
|
77
|
+
const timer = new Timer();
|
|
78
|
+
while (true) {
|
|
79
|
+
const result = await fn();
|
|
80
|
+
if (result) {
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
await sleep(interval * 1000);
|
|
84
|
+
if (timeout && timer.s() > timeout) {
|
|
85
|
+
throw new Error(name ? `Timeout awaiting ${name}` : 'Timeout');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmV0cnkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUxQyx3RUFBd0U7QUFDeEUsTUFBTSxPQUFPLFlBQWEsU0FBUSxLQUFLO0NBQUc7QUFFMUM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sU0FBUyxDQUFDLENBQUMsZ0JBQWdCO0lBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixPQUFPLElBQUksRUFBRTtRQUNYLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3RDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFpQjtJQUM1QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRTtRQUMzQixNQUFNLEtBQUssQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxLQUFLLENBQ3pCLEVBQXlCLEVBQ3pCLElBQUksR0FBRyxXQUFXLEVBQ2xCLE9BQU8sR0FBRyxnQkFBZ0IsRUFBRSxFQUM1QixHQUFHLEdBQUcsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsRUFDakQsWUFBWSxHQUFHLEtBQUs7SUFFcEIsT0FBTyxJQUFJLEVBQUU7UUFDWCxJQUFJO1lBQ0YsT0FBTyxNQUFNLEVBQUUsRUFBRSxDQUFDO1NBQ25CO1FBQUMsT0FBTyxHQUFRLEVBQUU7WUFDakIsSUFBSSxHQUFHLFlBQVksWUFBWSxFQUFFO2dCQUMvQix1RkFBdUY7Z0JBQ3ZGLE1BQU0sR0FBRyxDQUFDO2FBQ1g7WUFDRCxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDbkIsTUFBTSxHQUFHLENBQUM7YUFDWDtZQUNELEdBQUcsQ0FBQyxHQUFHLElBQUksMEJBQTBCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUMsQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDdEIsU0FBUztTQUNWO0tBQ0Y7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsVUFBVSxDQUFJLEVBQWdDLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDO0lBQ3hHLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7SUFDMUIsT0FBTyxJQUFJLEVBQUU7UUFDWCxNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQzFCLElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUVELE1BQU0sS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUU3QixJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2hFO0tBQ0Y7QUFDSCxDQUFDIn0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunningPromise is a utility class that helps manage the execution of an asynchronous function
|
|
3
|
+
* at a specified polling interval. It allows starting, stopping, and checking the status of the
|
|
4
|
+
* internally managed promise. The class also supports interrupting the polling process when stopped.
|
|
5
|
+
*/
|
|
6
|
+
export declare class RunningPromise {
|
|
7
|
+
private fn;
|
|
8
|
+
private pollingInterval;
|
|
9
|
+
private running;
|
|
10
|
+
private runningPromise;
|
|
11
|
+
private interruptPromise;
|
|
12
|
+
private interruptResolve;
|
|
13
|
+
constructor(fn: () => Promise<void>, pollingInterval?: number);
|
|
14
|
+
/**
|
|
15
|
+
* Starts the running promise.
|
|
16
|
+
*/
|
|
17
|
+
start(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Stops the running promise, resolves any pending interruptable sleep,
|
|
20
|
+
* and waits for the currently executing function to complete.
|
|
21
|
+
*/
|
|
22
|
+
stop(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* A sleep function that can be interrupted before the specified time.
|
|
25
|
+
* The sleep duration is determined by 'timeInMs', and it can be terminated early if the 'interruptPromise' is resolved.
|
|
26
|
+
* @param timeInMs - The time in milliseconds.
|
|
27
|
+
*/
|
|
28
|
+
private interruptableSleep;
|
|
29
|
+
/**
|
|
30
|
+
* Checks if the running promise is currently active.
|
|
31
|
+
* @returns True if the promise is running.
|
|
32
|
+
*/
|
|
33
|
+
isRunning(): boolean;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/running-promise/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,cAAc;IAKb,OAAO,CAAC,EAAE;IAAuB,OAAO,CAAC,eAAe;IAJpE,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,gBAAgB,CAAY;gBAChB,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAU,eAAe,SAAQ;IAE5E;;OAEG;IACI,KAAK;IAaZ;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B;;;;OAIG;YACW,kBAAkB;IAShC;;;OAGG;IACI,SAAS;CAGjB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunningPromise is a utility class that helps manage the execution of an asynchronous function
|
|
3
|
+
* at a specified polling interval. It allows starting, stopping, and checking the status of the
|
|
4
|
+
* internally managed promise. The class also supports interrupting the polling process when stopped.
|
|
5
|
+
*/
|
|
6
|
+
export class RunningPromise {
|
|
7
|
+
constructor(fn, pollingInterval = 10000) {
|
|
8
|
+
this.fn = fn;
|
|
9
|
+
this.pollingInterval = pollingInterval;
|
|
10
|
+
this.running = false;
|
|
11
|
+
this.runningPromise = Promise.resolve();
|
|
12
|
+
this.interruptPromise = Promise.resolve();
|
|
13
|
+
this.interruptResolve = () => { };
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Starts the running promise.
|
|
17
|
+
*/
|
|
18
|
+
start() {
|
|
19
|
+
this.running = true;
|
|
20
|
+
this.interruptPromise = new Promise(resolve => (this.interruptResolve = resolve));
|
|
21
|
+
const poll = async () => {
|
|
22
|
+
while (this.running) {
|
|
23
|
+
await this.fn();
|
|
24
|
+
await this.interruptableSleep(this.pollingInterval);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
this.runningPromise = poll();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Stops the running promise, resolves any pending interruptable sleep,
|
|
31
|
+
* and waits for the currently executing function to complete.
|
|
32
|
+
*/
|
|
33
|
+
async stop() {
|
|
34
|
+
this.running = false;
|
|
35
|
+
this.interruptResolve();
|
|
36
|
+
await this.runningPromise;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A sleep function that can be interrupted before the specified time.
|
|
40
|
+
* The sleep duration is determined by 'timeInMs', and it can be terminated early if the 'interruptPromise' is resolved.
|
|
41
|
+
* @param timeInMs - The time in milliseconds.
|
|
42
|
+
*/
|
|
43
|
+
async interruptableSleep(timeInMs) {
|
|
44
|
+
let timeout;
|
|
45
|
+
const sleepPromise = new Promise(resolve => {
|
|
46
|
+
timeout = setTimeout(resolve, timeInMs);
|
|
47
|
+
});
|
|
48
|
+
await Promise.race([sleepPromise, this.interruptPromise]);
|
|
49
|
+
clearTimeout(timeout);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Checks if the running promise is currently active.
|
|
53
|
+
* @returns True if the promise is running.
|
|
54
|
+
*/
|
|
55
|
+
isRunning() {
|
|
56
|
+
return this.running;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVubmluZy1wcm9taXNlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUt6QixZQUFvQixFQUF1QixFQUFVLGtCQUFrQixLQUFLO1FBQXhELE9BQUUsR0FBRixFQUFFLENBQXFCO1FBQVUsb0JBQWUsR0FBZixlQUFlLENBQVE7UUFKcEUsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixtQkFBYyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMscUJBQWdCLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQzJDLENBQUM7SUFFaEY7O09BRUc7SUFDSSxLQUFLO1FBQ1YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUVsRixNQUFNLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtZQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ25CLE1BQU0sSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDckQ7UUFDSCxDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFnQjtRQUMvQyxJQUFJLE9BQXdCLENBQUM7UUFDN0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUMxRCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFNBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztDQUNGIn0=
|