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 +30 -5
- package/lib/index.d.ts +22 -2
- package/lib/index.js +10 -6
- package/package.json +2 -2
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.
|
|
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
|
-
/**
|
|
6
|
-
const
|
|
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,
|
|
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,
|
|
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.
|
|
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.
|
|
61
|
+
"version": "0.3.0",
|
|
62
62
|
"jest": {
|
|
63
63
|
"coverageProvider": "v8",
|
|
64
64
|
"testMatch": [
|