athena-query-execution-waiter 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,12 +4,18 @@ A small library that waits for an AWS Athena query execution to complete. It pol
4
4
 
5
5
  ## Installation
6
6
 
7
+ **yarn:**
8
+
7
9
  ```bash
8
- npm install athena-query-execution-waiter
9
- # or
10
10
  yarn add athena-query-execution-waiter
11
11
  ```
12
12
 
13
+ **npm:**
14
+
15
+ ```bash
16
+ npm install athena-query-execution-waiter
17
+ ```
18
+
13
19
  ## Requirements
14
20
 
15
21
  - **Node.js** >= 20.0.0
@@ -53,19 +59,38 @@ The default timeout is 10 seconds. You can pass a custom timeout in milliseconds
53
59
  const state = await waiter.wait(queryExecutionId, 60_000); // 60 seconds
54
60
  ```
55
61
 
62
+ ### Polling interval
63
+
64
+ The default polling interval is 1 second. For long-running queries, you can increase it to reduce API calls. Set it at construction time or per `wait()` call:
65
+
66
+ ```typescript
67
+ // Waiter-wide: poll every 5 seconds
68
+ const waiter = new AthenaQueryExecutionWaiter(client, { pollIntervalMs: 5000 });
69
+
70
+ // Or per call (overrides the waiter default)
71
+ const state = await waiter.wait(queryExecutionId, 60_000, { pollIntervalMs: 3000 });
72
+ ```
73
+
56
74
  ## API
57
75
 
58
76
  ### `AthenaQueryExecutionWaiter`
59
77
 
60
- - **Constructor:** `new AthenaQueryExecutionWaiter(client: AthenaClient)`
78
+ - **Constructor:** `new AthenaQueryExecutionWaiter(client: AthenaClient, options?: AthenaQueryExecutionWaiterOptions)`
61
79
  - `client` – An AWS SDK v3 `AthenaClient` instance.
80
+ - `options.pollIntervalMs` – Optional. Polling interval in ms (default: 1000).
62
81
 
63
- - **`wait(queryExecutionId: string, timeoutMs?: number): Promise<QueryExecutionState>`**
82
+ - **`wait(queryExecutionId: string, timeoutMs?: number, waitOptions?: AthenaQueryExecutionWaitOptions): Promise<QueryExecutionState>`**
64
83
  - Polls the query execution status until it completes.
65
84
  - **Returns** the execution state (`SUCCEEDED`) on success.
66
85
  - **Throws** `AthenaQueryExecutionWaiterTimeoutError` if the timeout is exceeded.
67
86
  - **Throws** `AthenaQueryExecutionWaiterStateError` when the state is `FAILED` or `CANCELLED`.
68
- - `timeoutMs` defaults to 10,000 ms when omitted. Polling interval is 1 second.
87
+ - `timeoutMs` defaults to 10,000 ms when omitted.
88
+ - `waitOptions.pollIntervalMs` – Optional. Overrides the polling interval for this call (default: use constructor value or 1000).
89
+
90
+ ### Types
91
+
92
+ - **`AthenaQueryExecutionWaiterOptions`** – `{ pollIntervalMs?: number }` (constructor options).
93
+ - **`AthenaQueryExecutionWaitOptions`** – `{ pollIntervalMs?: number }` (options for `wait()`).
69
94
 
70
95
  ### Errors
71
96
 
package/lib/index.d.ts CHANGED
@@ -1,24 +1,44 @@
1
1
  import { QueryExecutionState, AthenaClient } from '@aws-sdk/client-athena';
2
+ /** Options for AthenaQueryExecutionWaiter constructor. */
3
+ export interface AthenaQueryExecutionWaiterOptions {
4
+ /**
5
+ * Polling interval in milliseconds.
6
+ * Increase for long-running queries to reduce API calls.
7
+ * Defaults to DEFAULT_POLL_INTERVAL_MS (1000) when omitted.
8
+ */
9
+ pollIntervalMs?: number;
10
+ }
11
+ /** Options for wait(). */
12
+ export interface AthenaQueryExecutionWaitOptions {
13
+ /**
14
+ * Polling interval in milliseconds for this wait.
15
+ * Overrides the waiter's default poll interval when specified.
16
+ */
17
+ pollIntervalMs?: number;
18
+ }
2
19
  /**
3
20
  * Waits for Athena query execution to complete.
4
21
  * Polls execution status until it becomes SUCCEEDED, FAILED, or CANCELLED.
5
22
  */
6
23
  export declare class AthenaQueryExecutionWaiter {
7
24
  private readonly client;
25
+ private readonly defaultPollIntervalMs;
8
26
  /**
9
27
  * @param client Athena API client
28
+ * @param options Optional settings (e.g. pollIntervalMs for polling interval)
10
29
  */
11
- constructor(client: AthenaClient);
30
+ constructor(client: AthenaClient, options?: AthenaQueryExecutionWaiterOptions);
12
31
  /**
13
32
  * Waits until the given query execution completes (or fails/cancels).
14
33
  *
15
34
  * @param queryExecutionId Query execution ID to wait for
16
35
  * @param timeoutMs Timeout in milliseconds. Defaults to DEFAULT_TIMEOUT_MS when omitted
36
+ * @param waitOptions Optional per-call options (e.g. pollIntervalMs overrides default)
17
37
  * @returns Execution state on success (SUCCEEDED)
18
38
  * @throws AthenaQueryExecutionWaiterTimeoutError On timeout
19
39
  * @throws AthenaQueryExecutionWaiterStateError When state is FAILED or CANCELLED
20
40
  */
21
- wait(queryExecutionId: string, timeoutMs?: number): Promise<QueryExecutionState>;
41
+ wait(queryExecutionId: string, timeoutMs?: number, waitOptions?: AthenaQueryExecutionWaitOptions): Promise<QueryExecutionState>;
22
42
  }
23
43
  /**
24
44
  * Base error for Athena query execution waiter.
package/lib/index.js CHANGED
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AthenaQueryExecutionWaiterStateError = exports.AthenaQueryExecutionWaiterTimeoutError = exports.AthenaQueryExecutionWaiterError = exports.AthenaQueryExecutionWaiter = void 0;
4
4
  const client_athena_1 = require("@aws-sdk/client-athena");
5
- /** Polling interval (milliseconds) for query execution status. */
6
- const WAIT_TIME_MS = 1000;
5
+ /** Default polling interval (milliseconds) for query execution status. */
6
+ const DEFAULT_POLL_INTERVAL_MS = 1000;
7
7
  /** Default timeout (milliseconds) for waiting for query execution to complete. */
8
8
  const DEFAULT_TIMEOUT_MS = 1000 * 10;
9
9
  /**
@@ -13,20 +13,24 @@ const DEFAULT_TIMEOUT_MS = 1000 * 10;
13
13
  class AthenaQueryExecutionWaiter {
14
14
  /**
15
15
  * @param client Athena API client
16
+ * @param options Optional settings (e.g. pollIntervalMs for polling interval)
16
17
  */
17
- constructor(client) {
18
+ constructor(client, options) {
18
19
  this.client = client;
20
+ this.defaultPollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
19
21
  }
20
22
  /**
21
23
  * Waits until the given query execution completes (or fails/cancels).
22
24
  *
23
25
  * @param queryExecutionId Query execution ID to wait for
24
26
  * @param timeoutMs Timeout in milliseconds. Defaults to DEFAULT_TIMEOUT_MS when omitted
27
+ * @param waitOptions Optional per-call options (e.g. pollIntervalMs overrides default)
25
28
  * @returns Execution state on success (SUCCEEDED)
26
29
  * @throws AthenaQueryExecutionWaiterTimeoutError On timeout
27
30
  * @throws AthenaQueryExecutionWaiterStateError When state is FAILED or CANCELLED
28
31
  */
29
- async wait(queryExecutionId, timeoutMs = DEFAULT_TIMEOUT_MS) {
32
+ async wait(queryExecutionId, timeoutMs = DEFAULT_TIMEOUT_MS, waitOptions) {
33
+ const pollIntervalMs = waitOptions?.pollIntervalMs ?? this.defaultPollIntervalMs;
30
34
  const startTime = Date.now();
31
35
  do {
32
36
  const elapsedTime = Date.now() - startTime;
@@ -45,7 +49,7 @@ class AthenaQueryExecutionWaiter {
45
49
  if (state === client_athena_1.QueryExecutionState.FAILED || state === client_athena_1.QueryExecutionState.CANCELLED) {
46
50
  throw new AthenaQueryExecutionWaiterStateError(state, reason ?? 'unknown');
47
51
  }
48
- await new Promise((r) => setTimeout(r, WAIT_TIME_MS));
52
+ await new Promise((r) => setTimeout(r, pollIntervalMs));
49
53
  } while (true);
50
54
  }
51
55
  }
@@ -92,4 +96,4 @@ class AthenaQueryExecutionWaiterStateError extends AthenaQueryExecutionWaiterErr
92
96
  }
93
97
  }
94
98
  exports.AthenaQueryExecutionWaiterStateError = AthenaQueryExecutionWaiterStateError;
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQXFHO0FBRXJHLGtFQUFrRTtBQUNsRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7QUFFMUIsa0ZBQWtGO0FBQ2xGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUVyQzs7O0dBR0c7QUFDSCxNQUFhLDBCQUEwQjtJQUVyQzs7T0FFRztJQUNILFlBQTZCLE1BQW9CO1FBQXBCLFdBQU0sR0FBTixNQUFNLENBQWM7SUFBRyxDQUFDO0lBRXJEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBd0IsRUFBRSxZQUFvQixrQkFBa0I7UUFDekUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLEdBQUcsQ0FBQztZQUNGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7WUFDM0MsSUFBSSxXQUFXLEdBQUcsU0FBUyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxzQ0FBc0MsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBRUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLHdDQUF3QixDQUFDO2dCQUM5RCxnQkFBZ0IsRUFBRSxnQkFBZ0I7YUFDbkMsQ0FBQyxDQUFDLENBQUM7WUFDSixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQztZQUN0QyxNQUFNLEtBQUssR0FBRyxFQUFFLEVBQUUsS0FBd0MsQ0FBQztZQUMzRCxNQUFNLE1BQU0sR0FBRyxFQUFFLEVBQUUsaUJBQWlCLENBQUM7WUFFckMsSUFBSSxLQUFLLEtBQUssbUNBQW1CLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzVDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELElBQUksS0FBSyxLQUFLLG1DQUFtQixDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssbUNBQW1CLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3BGLE1BQU0sSUFBSSxvQ0FBb0MsQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFDRCxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDeEQsQ0FBQyxRQUFRLElBQUksRUFBRTtJQUNqQixDQUFDO0NBQ0Y7QUF4Q0QsZ0VBd0NDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLCtCQUFnQyxTQUFRLEtBQUs7SUFFeEQ7O09BRUc7SUFDSCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxpQ0FBaUMsQ0FBQztJQUNoRCxDQUFDO0NBQ0Y7QUFURCwwRUFTQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxzQ0FBdUMsU0FBUSwrQkFBK0I7SUFFekY7O09BRUc7SUFDSCxZQUFZLFdBQW1CO1FBQzdCLEtBQUssQ0FBQyxnQ0FBZ0MsV0FBVyxJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxHQUFHLHdDQUF3QyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQVRELHdGQVNDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLG9DQUFxQyxTQUFRLCtCQUErQjtJQUV2Rjs7O09BR0c7SUFDSCxZQUE0QixLQUEwQixFQUFrQixTQUFpQixTQUFTO1FBQ2hHLEtBQUssQ0FBQyw0Q0FBNEMsS0FBSyxLQUFLLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFENUMsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFBa0IsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFFaEcsSUFBSSxDQUFDLElBQUksR0FBRyxzQ0FBc0MsQ0FBQztJQUNyRCxDQUFDO0NBQ0Y7QUFWRCxvRkFVQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdldFF1ZXJ5RXhlY3V0aW9uQ29tbWFuZCwgUXVlcnlFeGVjdXRpb25TdGF0ZSwgQXRoZW5hQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWF0aGVuYSc7XG5cbi8qKiBQb2xsaW5nIGludGVydmFsIChtaWxsaXNlY29uZHMpIGZvciBxdWVyeSBleGVjdXRpb24gc3RhdHVzLiAqL1xuY29uc3QgV0FJVF9USU1FX01TID0gMTAwMDtcblxuLyoqIERlZmF1bHQgdGltZW91dCAobWlsbGlzZWNvbmRzKSBmb3Igd2FpdGluZyBmb3IgcXVlcnkgZXhlY3V0aW9uIHRvIGNvbXBsZXRlLiAqL1xuY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gMTAwMCAqIDEwO1xuXG4vKipcbiAqIFdhaXRzIGZvciBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIHRvIGNvbXBsZXRlLlxuICogUG9sbHMgZXhlY3V0aW9uIHN0YXR1cyB1bnRpbCBpdCBiZWNvbWVzIFNVQ0NFRURFRCwgRkFJTEVELCBvciBDQU5DRUxMRUQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlciB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjbGllbnQgQXRoZW5hIEFQSSBjbGllbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBBdGhlbmFDbGllbnQpIHt9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIHRoZSBnaXZlbiBxdWVyeSBleGVjdXRpb24gY29tcGxldGVzIChvciBmYWlscy9jYW5jZWxzKS5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5RXhlY3V0aW9uSWQgUXVlcnkgZXhlY3V0aW9uIElEIHRvIHdhaXQgZm9yXG4gICAqIEBwYXJhbSB0aW1lb3V0TXMgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIERFRkFVTFRfVElNRU9VVF9NUyB3aGVuIG9taXR0ZWRcbiAgICogQHJldHVybnMgRXhlY3V0aW9uIHN0YXRlIG9uIHN1Y2Nlc3MgKFNVQ0NFRURFRClcbiAgICogQHRocm93cyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclRpbWVvdXRFcnJvciBPbiB0aW1lb3V0XG4gICAqIEB0aHJvd3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJTdGF0ZUVycm9yIFdoZW4gc3RhdGUgaXMgRkFJTEVEIG9yIENBTkNFTExFRFxuICAgKi9cbiAgYXN5bmMgd2FpdChxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsIHRpbWVvdXRNczogbnVtYmVyID0gREVGQVVMVF9USU1FT1VUX01TKTogUHJvbWlzZTxRdWVyeUV4ZWN1dGlvblN0YXRlPiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBkbyB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBpZiAoZWxhcHNlZFRpbWUgPiB0aW1lb3V0TXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyVGltZW91dEVycm9yKGVsYXBzZWRUaW1lKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgR2V0UXVlcnlFeGVjdXRpb25Db21tYW5kKHtcbiAgICAgICAgUXVlcnlFeGVjdXRpb25JZDogcXVlcnlFeGVjdXRpb25JZCxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHN0ID0gcmVzLlF1ZXJ5RXhlY3V0aW9uPy5TdGF0dXM7XG4gICAgICBjb25zdCBzdGF0ZSA9IHN0Py5TdGF0ZSBhcyBRdWVyeUV4ZWN1dGlvblN0YXRlIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmVhc29uID0gc3Q/LlN0YXRlQ2hhbmdlUmVhc29uO1xuXG4gICAgICBpZiAoc3RhdGUgPT09IFF1ZXJ5RXhlY3V0aW9uU3RhdGUuU1VDQ0VFREVEKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZSA9PT0gUXVlcnlFeGVjdXRpb25TdGF0ZS5GQUlMRUQgfHwgc3RhdGUgPT09IFF1ZXJ5RXhlY3V0aW9uU3RhdGUuQ0FOQ0VMTEVEKSB7XG4gICAgICAgIHRocm93IG5ldyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclN0YXRlRXJyb3Ioc3RhdGUsIHJlYXNvbiA/PyAndW5rbm93bicpO1xuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgV0FJVF9USU1FX01TKSk7XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGVycm9yIGZvciBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIHdhaXRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIEVycm9yIG1lc3NhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHdhaXRpbmcgZm9yIHF1ZXJ5IGV4ZWN1dGlvbiB0aW1lcyBvdXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclRpbWVvdXRFcnJvciBleHRlbmRzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gZWxhcHNlZFRpbWUgRWxhcHNlZCB0aW1lIGluIG1pbGxpc2Vjb25kcyB1bnRpbCB0aW1lb3V0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGFwc2VkVGltZTogbnVtYmVyKSB7XG4gICAgc3VwZXIoYEF0aGVuYSBxdWVyeSB0aW1lZCBvdXQgYWZ0ZXIgJHtlbGFwc2VkVGltZX1tc2ApO1xuICAgIHRoaXMubmFtZSA9ICdBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclRpbWVvdXRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgcXVlcnkgZW5kcyBpbiBGQUlMRUQgb3IgQ0FOQ0VMTEVEIHN0YXRlLlxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJTdGF0ZUVycm9yIGV4dGVuZHMgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJFcnJvciB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzdGF0ZSBGaW5hbCBleGVjdXRpb24gc3RhdGUgKEZBSUxFRCBvciBDQU5DRUxMRUQpXG4gICAqIEBwYXJhbSByZWFzb24gUmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlIChlLmcuIGVycm9yIGRldGFpbHMpLiBEZWZhdWx0cyB0byAndW5rbm93bicgd2hlbiBvbWl0dGVkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgc3RhdGU6IFF1ZXJ5RXhlY3V0aW9uU3RhdGUsIHB1YmxpYyByZWFkb25seSByZWFzb246IHN0cmluZyA9ICd1bmtub3duJykge1xuICAgIHN1cGVyKGBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGZhaWxlZCB3aXRoIHN0YXRlICR7c3RhdGV9OiAke3JlYXNvbn1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJTdGF0ZUVycm9yJztcbiAgfVxufVxuIl19
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQXFHO0FBRXJHLDBFQUEwRTtBQUMxRSxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQztBQUV0QyxrRkFBa0Y7QUFDbEYsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBcUJyQzs7O0dBR0c7QUFDSCxNQUFhLDBCQUEwQjtJQUlyQzs7O09BR0c7SUFDSCxZQUNtQixNQUFvQixFQUNyQyxPQUEyQztRQUQxQixXQUFNLEdBQU4sTUFBTSxDQUFjO1FBR3JDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxPQUFPLEVBQUUsY0FBYyxJQUFJLHdCQUF3QixDQUFDO0lBQ25GLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUNSLGdCQUF3QixFQUN4QixZQUFvQixrQkFBa0IsRUFDdEMsV0FBNkM7UUFFN0MsTUFBTSxjQUFjLEdBQUcsV0FBVyxFQUFFLGNBQWMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDakYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLEdBQUcsQ0FBQztZQUNGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7WUFDM0MsSUFBSSxXQUFXLEdBQUcsU0FBUyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxzQ0FBc0MsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBRUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLHdDQUF3QixDQUFDO2dCQUM5RCxnQkFBZ0IsRUFBRSxnQkFBZ0I7YUFDbkMsQ0FBQyxDQUFDLENBQUM7WUFDSixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQztZQUN0QyxNQUFNLEtBQUssR0FBRyxFQUFFLEVBQUUsS0FBd0MsQ0FBQztZQUMzRCxNQUFNLE1BQU0sR0FBRyxFQUFFLEVBQUUsaUJBQWlCLENBQUM7WUFFckMsSUFBSSxLQUFLLEtBQUssbUNBQW1CLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzVDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELElBQUksS0FBSyxLQUFLLG1DQUFtQixDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssbUNBQW1CLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3BGLE1BQU0sSUFBSSxvQ0FBb0MsQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFDRCxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxRQUFRLElBQUksRUFBRTtJQUNqQixDQUFDO0NBQ0Y7QUF0REQsZ0VBc0RDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLCtCQUFnQyxTQUFRLEtBQUs7SUFFeEQ7O09BRUc7SUFDSCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxpQ0FBaUMsQ0FBQztJQUNoRCxDQUFDO0NBQ0Y7QUFURCwwRUFTQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxzQ0FBdUMsU0FBUSwrQkFBK0I7SUFFekY7O09BRUc7SUFDSCxZQUFZLFdBQW1CO1FBQzdCLEtBQUssQ0FBQyxnQ0FBZ0MsV0FBVyxJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxHQUFHLHdDQUF3QyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQVRELHdGQVNDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLG9DQUFxQyxTQUFRLCtCQUErQjtJQUV2Rjs7O09BR0c7SUFDSCxZQUE0QixLQUEwQixFQUFrQixTQUFpQixTQUFTO1FBQ2hHLEtBQUssQ0FBQyw0Q0FBNEMsS0FBSyxLQUFLLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFENUMsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFBa0IsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFFaEcsSUFBSSxDQUFDLElBQUksR0FBRyxzQ0FBc0MsQ0FBQztJQUNyRCxDQUFDO0NBQ0Y7QUFWRCxvRkFVQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdldFF1ZXJ5RXhlY3V0aW9uQ29tbWFuZCwgUXVlcnlFeGVjdXRpb25TdGF0ZSwgQXRoZW5hQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWF0aGVuYSc7XG5cbi8qKiBEZWZhdWx0IHBvbGxpbmcgaW50ZXJ2YWwgKG1pbGxpc2Vjb25kcykgZm9yIHF1ZXJ5IGV4ZWN1dGlvbiBzdGF0dXMuICovXG5jb25zdCBERUZBVUxUX1BPTExfSU5URVJWQUxfTVMgPSAxMDAwO1xuXG4vKiogRGVmYXVsdCB0aW1lb3V0IChtaWxsaXNlY29uZHMpIGZvciB3YWl0aW5nIGZvciBxdWVyeSBleGVjdXRpb24gdG8gY29tcGxldGUuICovXG5jb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSAxMDAwICogMTA7XG5cbi8qKiBPcHRpb25zIGZvciBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlciBjb25zdHJ1Y3Rvci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBvbGxpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBJbmNyZWFzZSBmb3IgbG9uZy1ydW5uaW5nIHF1ZXJpZXMgdG8gcmVkdWNlIEFQSSBjYWxscy5cbiAgICogRGVmYXVsdHMgdG8gREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TICgxMDAwKSB3aGVuIG9taXR0ZWQuXG4gICAqL1xuICBwb2xsSW50ZXJ2YWxNcz86IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHdhaXQoKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQb2xsaW5nIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhpcyB3YWl0LlxuICAgKiBPdmVycmlkZXMgdGhlIHdhaXRlcidzIGRlZmF1bHQgcG9sbCBpbnRlcnZhbCB3aGVuIHNwZWNpZmllZC5cbiAgICovXG4gIHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdhaXRzIGZvciBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIHRvIGNvbXBsZXRlLlxuICogUG9sbHMgZXhlY3V0aW9uIHN0YXR1cyB1bnRpbCBpdCBiZWNvbWVzIFNVQ0NFRURFRCwgRkFJTEVELCBvciBDQU5DRUxMRUQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlciB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UG9sbEludGVydmFsTXM6IG51bWJlcjtcblxuICAvKipcbiAgICogQHBhcmFtIGNsaWVudCBBdGhlbmEgQVBJIGNsaWVudFxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBzZXR0aW5ncyAoZS5nLiBwb2xsSW50ZXJ2YWxNcyBmb3IgcG9sbGluZyBpbnRlcnZhbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBBdGhlbmFDbGllbnQsXG4gICAgb3B0aW9ucz86IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5kZWZhdWx0UG9sbEludGVydmFsTXMgPSBvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcyA/PyBERUZBVUxUX1BPTExfSU5URVJWQUxfTVM7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGdpdmVuIHF1ZXJ5IGV4ZWN1dGlvbiBjb21wbGV0ZXMgKG9yIGZhaWxzL2NhbmNlbHMpLlxuICAgKlxuICAgKiBAcGFyYW0gcXVlcnlFeGVjdXRpb25JZCBRdWVyeSBleGVjdXRpb24gSUQgdG8gd2FpdCBmb3JcbiAgICogQHBhcmFtIHRpbWVvdXRNcyBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gREVGQVVMVF9USU1FT1VUX01TIHdoZW4gb21pdHRlZFxuICAgKiBAcGFyYW0gd2FpdE9wdGlvbnMgT3B0aW9uYWwgcGVyLWNhbGwgb3B0aW9ucyAoZS5nLiBwb2xsSW50ZXJ2YWxNcyBvdmVycmlkZXMgZGVmYXVsdClcbiAgICogQHJldHVybnMgRXhlY3V0aW9uIHN0YXRlIG9uIHN1Y2Nlc3MgKFNVQ0NFRURFRClcbiAgICogQHRocm93cyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclRpbWVvdXRFcnJvciBPbiB0aW1lb3V0XG4gICAqIEB0aHJvd3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJTdGF0ZUVycm9yIFdoZW4gc3RhdGUgaXMgRkFJTEVEIG9yIENBTkNFTExFRFxuICAgKi9cbiAgYXN5bmMgd2FpdChcbiAgICBxdWVyeUV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgdGltZW91dE1zOiBudW1iZXIgPSBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgd2FpdE9wdGlvbnM/OiBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRPcHRpb25zLFxuICApOiBQcm9taXNlPFF1ZXJ5RXhlY3V0aW9uU3RhdGU+IHtcbiAgICBjb25zdCBwb2xsSW50ZXJ2YWxNcyA9IHdhaXRPcHRpb25zPy5wb2xsSW50ZXJ2YWxNcyA/PyB0aGlzLmRlZmF1bHRQb2xsSW50ZXJ2YWxNcztcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGlmIChlbGFwc2VkVGltZSA+IHRpbWVvdXRNcykge1xuICAgICAgICB0aHJvdyBuZXcgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJUaW1lb3V0RXJyb3IoZWxhcHNlZFRpbWUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBHZXRRdWVyeUV4ZWN1dGlvbkNvbW1hbmQoe1xuICAgICAgICBRdWVyeUV4ZWN1dGlvbklkOiBxdWVyeUV4ZWN1dGlvbklkLFxuICAgICAgfSkpO1xuICAgICAgY29uc3Qgc3QgPSByZXMuUXVlcnlFeGVjdXRpb24/LlN0YXR1cztcbiAgICAgIGNvbnN0IHN0YXRlID0gc3Q/LlN0YXRlIGFzIFF1ZXJ5RXhlY3V0aW9uU3RhdGUgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZWFzb24gPSBzdD8uU3RhdGVDaGFuZ2VSZWFzb247XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gUXVlcnlFeGVjdXRpb25TdGF0ZS5TVUNDRUVERUQpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlID09PSBRdWVyeUV4ZWN1dGlvblN0YXRlLkZBSUxFRCB8fCBzdGF0ZSA9PT0gUXVlcnlFeGVjdXRpb25TdGF0ZS5DQU5DRUxMRUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyU3RhdGVFcnJvcihzdGF0ZSwgcmVhc29uID8/ICd1bmtub3duJyk7XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBwb2xsSW50ZXJ2YWxNcykpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBlcnJvciBmb3IgQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiB3YWl0ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSBFcnJvciBtZXNzYWdlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB3YWl0aW5nIGZvciBxdWVyeSBleGVjdXRpb24gdGltZXMgb3V0LlxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJUaW1lb3V0RXJyb3IgZXh0ZW5kcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckVycm9yIHtcblxuICAvKipcbiAgICogQHBhcmFtIGVsYXBzZWRUaW1lIEVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMgdW50aWwgdGltZW91dFxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxhcHNlZFRpbWU6IG51bWJlcikge1xuICAgIHN1cGVyKGBBdGhlbmEgcXVlcnkgdGltZWQgb3V0IGFmdGVyICR7ZWxhcHNlZFRpbWV9bXNgKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJUaW1lb3V0RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHF1ZXJ5IGVuZHMgaW4gRkFJTEVEIG9yIENBTkNFTExFRCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyU3RhdGVFcnJvciBleHRlbmRzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc3RhdGUgRmluYWwgZXhlY3V0aW9uIHN0YXRlIChGQUlMRUQgb3IgQ0FOQ0VMTEVEKVxuICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZSAoZS5nLiBlcnJvciBkZXRhaWxzKS4gRGVmYXVsdHMgdG8gJ3Vua25vd24nIHdoZW4gb21pdHRlZFxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHN0YXRlOiBRdWVyeUV4ZWN1dGlvblN0YXRlLCBwdWJsaWMgcmVhZG9ubHkgcmVhc29uOiBzdHJpbmcgPSAndW5rbm93bicpIHtcbiAgICBzdXBlcihgQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBmYWlsZWQgd2l0aCBzdGF0ZSAke3N0YXRlfTogJHtyZWFzb259YCk7XG4gICAgdGhpcy5uYW1lID0gJ0F0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyU3RhdGVFcnJvcic7XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -42,7 +42,7 @@
42
42
  "eslint-plugin-import": "^2.32.0",
43
43
  "jest": "^30.2.0",
44
44
  "jest-junit": "^16",
45
- "projen": "^0.99.10",
45
+ "projen": "^0.99.11",
46
46
  "ts-jest": "^29.4.6",
47
47
  "ts-node": "^10.9.2",
48
48
  "typescript": "5.9.x"
@@ -58,7 +58,7 @@
58
58
  "publishConfig": {
59
59
  "access": "public"
60
60
  },
61
- "version": "0.2.4",
61
+ "version": "0.3.0",
62
62
  "jest": {
63
63
  "coverageProvider": "v8",
64
64
  "testMatch": [