athena-query-execution-waiter 0.5.7 → 0.6.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 +47 -15
- package/lib/index.d.ts +59 -30
- package/lib/index.js +93 -28
- package/lib/wait-predicates.d.ts +24 -11
- package/lib/wait-predicates.js +14 -11
- package/package.json +3 -5
package/README.md
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/athena-query-execution-waiter)
|
|
4
4
|
[](https://github.com/gammarers-aws-sdk-extensions/athena-query-execution-waiter/blob/main/LICENSE)
|
|
5
5
|
|
|
6
|
-
A small library that waits for an AWS Athena query execution to complete. It
|
|
6
|
+
A small library that waits for an AWS Athena query execution to complete. It repeatedly calls the Athena API until the execution reaches a terminal state: **SUCCEEDED**, **FAILED**, or **CANCELLED**.
|
|
7
7
|
|
|
8
8
|
## Features
|
|
9
9
|
|
|
10
|
-
-
|
|
11
|
-
- Configurable **overall timeout** and
|
|
12
|
-
- Typed errors: **`AthenaQueryExecutionWaiterTimeoutError`**, **`AthenaQueryExecutionWaiterStateError`** (failed or cancelled runs), **`AthenaQueryExecutionWaiterMissingStateError`**, **`AthenaQueryExecutionWaiterUnsupportedStateError`**.
|
|
10
|
+
- Waits on `GetQueryExecution` until the run finishes or an **overall wall-clock timeout** is exceeded (separate from **wait interval**).
|
|
11
|
+
- Configurable **overall timeout**, **wait interval**, and **`AbortSignal`** cancellation via `wait()` options; default overall cap is **`DEFAULT_TIMEOUT_MS`** (2 minutes).
|
|
12
|
+
- Typed errors: **`AthenaQueryExecutionWaiterTimeoutError`**, **`AthenaQueryExecutionWaiterAbortedError`**, **`AthenaQueryExecutionWaiterStateError`** (failed or cancelled runs), **`AthenaQueryExecutionWaiterMissingStateError`**, **`AthenaQueryExecutionWaiterUnsupportedStateError`**.
|
|
13
13
|
- Built for **AWS SDK for JavaScript v3** (`@aws-sdk/client-athena`).
|
|
14
14
|
|
|
15
15
|
## Installation
|
|
@@ -64,12 +64,12 @@ try {
|
|
|
64
64
|
}
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
-
### Overall timeout vs
|
|
67
|
+
### Overall timeout vs wait interval
|
|
68
68
|
|
|
69
69
|
| | Meaning |
|
|
70
70
|
|---|--------|
|
|
71
|
-
| **`waitOptions.timeoutMs` / `DEFAULT_TIMEOUT_MS`** | **Overall** wall-clock limit from when `wait()` starts until **SUCCEEDED**, **FAILED**, or **CANCELLED** (or this cap is exceeded). Omit `timeoutMs` to use `DEFAULT_TIMEOUT_MS`. This is **not** how often
|
|
72
|
-
| **`
|
|
71
|
+
| **`waitOptions.timeoutMs` / `DEFAULT_TIMEOUT_MS`** | **Overall** wall-clock limit from when `wait()` starts until **SUCCEEDED**, **FAILED**, or **CANCELLED** (or this cap is exceeded). Omit `timeoutMs` to use `DEFAULT_TIMEOUT_MS`. This is **not** how often status is checked. |
|
|
72
|
+
| **`waitIntervalMs`** | Delay **between** `GetQueryExecution` calls. Independent of the overall timeout; a long wait interval still respects `waitOptions.timeoutMs` / `DEFAULT_TIMEOUT_MS`. |
|
|
73
73
|
|
|
74
74
|
Long-running jobs should pass a higher `timeoutMs` when needed:
|
|
75
75
|
|
|
@@ -79,17 +79,46 @@ const state = await waiter.wait(queryExecutionId, {
|
|
|
79
79
|
});
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
-
Default
|
|
82
|
+
Default wait interval is **1 second**. Increase it to reduce API calls (constructor or per `wait()`):
|
|
83
83
|
|
|
84
84
|
```typescript
|
|
85
|
-
const waiter = new AthenaQueryExecutionWaiter(client, {
|
|
85
|
+
const waiter = new AthenaQueryExecutionWaiter(client, { waitIntervalMs: 5000 });
|
|
86
86
|
|
|
87
87
|
const state = await waiter.wait(queryExecutionId, {
|
|
88
88
|
timeoutMs: 60_000,
|
|
89
|
-
|
|
89
|
+
waitIntervalMs: 3000,
|
|
90
90
|
});
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
+
### Cancelling a wait with `AbortSignal`
|
|
94
|
+
|
|
95
|
+
Pass an `AbortSignal` to stop waiting early—for example on request teardown, deploy shutdown, or user cancellation:
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
import {
|
|
99
|
+
AthenaQueryExecutionWaiter,
|
|
100
|
+
AthenaQueryExecutionWaiterAbortedError,
|
|
101
|
+
} from 'athena-query-execution-waiter';
|
|
102
|
+
|
|
103
|
+
const controller = new AbortController();
|
|
104
|
+
|
|
105
|
+
try {
|
|
106
|
+
const state = await waiter.wait(queryExecutionId, {
|
|
107
|
+
signal: controller.signal,
|
|
108
|
+
});
|
|
109
|
+
console.log('Query completed:', state);
|
|
110
|
+
} catch (err) {
|
|
111
|
+
if (err instanceof AthenaQueryExecutionWaiterAbortedError) {
|
|
112
|
+
console.error('Wait was aborted');
|
|
113
|
+
}
|
|
114
|
+
throw err;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Elsewhere: controller.abort();
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Waiting stops when the signal is aborted—before the next status check, after a status check returns, or during the wait interval.
|
|
121
|
+
|
|
93
122
|
## Options
|
|
94
123
|
|
|
95
124
|
### `AthenaQueryExecutionWaiterOptions` (constructor)
|
|
@@ -98,7 +127,7 @@ Passed to `new AthenaQueryExecutionWaiter(client, options?)`.
|
|
|
98
127
|
|
|
99
128
|
| Option | Type | Description |
|
|
100
129
|
|--------|------|-------------|
|
|
101
|
-
| `
|
|
130
|
+
| `waitIntervalMs` | `number` (optional) | Default milliseconds **between** `GetQueryExecution` calls when `wait()` omits `waitIntervalMs`. Default: `1000`. |
|
|
102
131
|
|
|
103
132
|
### `AthenaQueryExecutionWaitOptions` (`wait()`)
|
|
104
133
|
|
|
@@ -107,7 +136,8 @@ Passed to `wait(queryExecutionId, waitOptions?)`.
|
|
|
107
136
|
| Option | Type | Description |
|
|
108
137
|
|--------|------|-------------|
|
|
109
138
|
| `timeoutMs` | `number` (optional) | **Overall** wall-clock timeout in ms from the start of `wait()` until a terminal state. Default: `DEFAULT_TIMEOUT_MS` (**2 minutes**). |
|
|
110
|
-
| `
|
|
139
|
+
| `waitIntervalMs` | `number` (optional) | Milliseconds **between** status checks for this call. Default: constructor’s `waitIntervalMs` or `1000`. |
|
|
140
|
+
| `signal` | `AbortSignal` (optional) | When aborted, waiting stops and `AthenaQueryExecutionWaiterAbortedError` is thrown. |
|
|
111
141
|
|
|
112
142
|
## API reference
|
|
113
143
|
|
|
@@ -117,8 +147,9 @@ Passed to `wait(queryExecutionId, waitOptions?)`.
|
|
|
117
147
|
- **`wait(queryExecutionId: string, waitOptions?: AthenaQueryExecutionWaitOptions): Promise<QueryExecutionState>`**
|
|
118
148
|
- **Returns** `SUCCEEDED` on success.
|
|
119
149
|
- **Throws** `AthenaQueryExecutionWaiterTimeoutError` if overall wait exceeds the effective timeout.
|
|
150
|
+
- **Throws** `AthenaQueryExecutionWaiterAbortedError` when `waitOptions.signal` is aborted.
|
|
120
151
|
- **Throws** `AthenaQueryExecutionWaiterStateError` when the state is `FAILED` or `CANCELLED`.
|
|
121
|
-
- **Throws** `AthenaQueryExecutionWaiterMissingStateError` when `QueryExecution`, `Status`, or `State` is missing from the API response (fail-fast;
|
|
152
|
+
- **Throws** `AthenaQueryExecutionWaiterMissingStateError` when `QueryExecution`, `Status`, or `State` is missing from the API response (fail-fast; does not keep waiting until timeout).
|
|
122
153
|
- **Throws** `AthenaQueryExecutionWaiterUnsupportedStateError` when `State` is present but not a known `QueryExecutionState` (e.g. a future Athena enum value).
|
|
123
154
|
|
|
124
155
|
### Constants
|
|
@@ -129,9 +160,10 @@ Passed to `wait(queryExecutionId, waitOptions?)`.
|
|
|
129
160
|
|
|
130
161
|
- **`AthenaQueryExecutionWaiterError`** — Base class for waiter errors.
|
|
131
162
|
- **`AthenaQueryExecutionWaiterTimeoutError`** — Overall elapsed time since `wait()` started exceeded `waitOptions.timeoutMs` or `DEFAULT_TIMEOUT_MS`. Constructor: `(elapsedTime: number)`.
|
|
163
|
+
- **`AthenaQueryExecutionWaiterAbortedError`** — Wait was cancelled via `AbortSignal`. Property: `signal`. Constructor: `(signal?: AbortSignal)`.
|
|
132
164
|
- **`AthenaQueryExecutionWaiterStateError`** — Query ended in `FAILED` or `CANCELLED`. Properties: `state`, `reason`. Constructor: `(state: QueryExecutionState, reason?: string)`.
|
|
133
|
-
- **`AthenaQueryExecutionWaiterMissingStateError`** — `GetQueryExecution` response is missing `QueryExecution`, `Status`, or `State`. Property: `detail`. Fails on the first
|
|
134
|
-
- **`AthenaQueryExecutionWaiterUnsupportedStateError`** — `State` is not one of the known values (`QUEUED`, `RUNNING`, `SUCCEEDED`, `FAILED`, `CANCELLED`). Property: `state`. Fails on the first
|
|
165
|
+
- **`AthenaQueryExecutionWaiterMissingStateError`** — `GetQueryExecution` response is missing `QueryExecution`, `Status`, or `State`. Property: `detail`. Fails on the first status check.
|
|
166
|
+
- **`AthenaQueryExecutionWaiterUnsupportedStateError`** — `State` is not one of the known values (`QUEUED`, `RUNNING`, `SUCCEEDED`, `FAILED`, `CANCELLED`). Property: `state`. Fails on the first status check.
|
|
135
167
|
|
|
136
168
|
## License
|
|
137
169
|
|
package/lib/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { QueryExecutionState, AthenaClient } from '@aws-sdk/client-athena';
|
|
|
3
3
|
* Default overall wait timeout (milliseconds) when `wait()` is called without
|
|
4
4
|
* `waitOptions.timeoutMs`.
|
|
5
5
|
* This caps total wall-clock time from the start of `wait()` until a terminal state
|
|
6
|
-
* (or error)—it is not the delay between
|
|
6
|
+
* (or error)—it is not the delay between status checks (`waitIntervalMs`).
|
|
7
7
|
*
|
|
8
8
|
* **Why 2 minutes:** Athena often exceeds a few seconds (queueing, cold start, moderate
|
|
9
9
|
* scans). Ten seconds fails too often as a library default; unbounded or very large
|
|
@@ -12,53 +12,63 @@ import { QueryExecutionState, AthenaClient } from '@aws-sdk/client-athena';
|
|
|
12
12
|
* `wait(..., { timeoutMs })` for heavy analytics or ETL.
|
|
13
13
|
*/
|
|
14
14
|
export declare const DEFAULT_TIMEOUT_MS: number;
|
|
15
|
-
/**
|
|
15
|
+
/** Constructor options for {@link AthenaQueryExecutionWaiter}. */
|
|
16
16
|
export interface AthenaQueryExecutionWaiterOptions {
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* Default wait interval in milliseconds between status checks for `wait()` calls
|
|
19
|
+
* that omit `waitIntervalMs`.
|
|
19
20
|
* Increase for long-running queries to reduce API calls.
|
|
20
|
-
* Defaults to
|
|
21
|
+
* Defaults to `1000` when omitted.
|
|
21
22
|
*/
|
|
22
|
-
|
|
23
|
+
waitIntervalMs?: number;
|
|
23
24
|
}
|
|
24
|
-
/**
|
|
25
|
+
/** Per-call options for {@link AthenaQueryExecutionWaiter.wait}. */
|
|
25
26
|
export interface AthenaQueryExecutionWaitOptions {
|
|
26
27
|
/**
|
|
27
28
|
* Overall wall-clock timeout in milliseconds for this wait (from the start of `wait()`
|
|
28
|
-
* until a terminal state). Not the delay between
|
|
29
|
+
* until a terminal state). Not the delay between status checks.
|
|
29
30
|
* Defaults to {@link DEFAULT_TIMEOUT_MS} when omitted.
|
|
30
31
|
*/
|
|
31
32
|
timeoutMs?: number;
|
|
32
33
|
/**
|
|
33
|
-
*
|
|
34
|
-
* Overrides the waiter's default
|
|
34
|
+
* Wait interval in milliseconds between status checks for this wait.
|
|
35
|
+
* Overrides the waiter's default wait interval when specified.
|
|
35
36
|
*/
|
|
36
|
-
|
|
37
|
+
waitIntervalMs?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Optional abort signal. When aborted, waiting stops immediately and
|
|
40
|
+
* {@link AthenaQueryExecutionWaiterAbortedError} is thrown—before the next status
|
|
41
|
+
* check, after a status check returns, or during the wait interval.
|
|
42
|
+
*/
|
|
43
|
+
signal?: AbortSignal;
|
|
37
44
|
}
|
|
38
45
|
/**
|
|
39
|
-
* Waits for Athena query execution to
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
46
|
+
* Waits for an Athena query execution to reach a terminal state.
|
|
47
|
+
*
|
|
48
|
+
* Repeatedly calls `GetQueryExecution` until the execution becomes
|
|
49
|
+
* `SUCCEEDED`, `FAILED`, or `CANCELLED`. Overall wall-clock time is bounded by
|
|
50
|
+
* `waitOptions.timeoutMs` (or {@link DEFAULT_TIMEOUT_MS}); spacing between status
|
|
51
|
+
* checks is controlled separately by `waitIntervalMs`.
|
|
43
52
|
*/
|
|
44
53
|
export declare class AthenaQueryExecutionWaiter {
|
|
45
54
|
private readonly client;
|
|
46
|
-
private readonly
|
|
55
|
+
private readonly defaultWaitIntervalMs;
|
|
47
56
|
/**
|
|
48
57
|
* @param client Athena API client
|
|
49
|
-
* @param options Optional settings (e.g.
|
|
58
|
+
* @param options Optional settings (e.g. waitIntervalMs)
|
|
50
59
|
*/
|
|
51
60
|
constructor(client: AthenaClient, options?: AthenaQueryExecutionWaiterOptions);
|
|
52
61
|
/**
|
|
53
|
-
* Waits until the given query execution completes
|
|
62
|
+
* Waits until the given query execution completes, fails, or is cancelled.
|
|
54
63
|
*
|
|
55
|
-
* @param queryExecutionId Query execution ID
|
|
56
|
-
* @param waitOptions Optional per-call settings (`timeoutMs`, `
|
|
57
|
-
* @returns
|
|
58
|
-
* @throws AthenaQueryExecutionWaiterTimeoutError
|
|
59
|
-
* @throws
|
|
60
|
-
* @throws
|
|
61
|
-
* @throws
|
|
64
|
+
* @param queryExecutionId Query execution ID returned by `StartQueryExecution`
|
|
65
|
+
* @param waitOptions Optional per-call settings (`timeoutMs`, `waitIntervalMs`, `signal`)
|
|
66
|
+
* @returns `QueryExecutionState.SUCCEEDED` when the query completes successfully
|
|
67
|
+
* @throws AthenaQueryExecutionWaiterTimeoutError When overall wait exceeds the effective timeout
|
|
68
|
+
* @throws AthenaQueryExecutionWaiterAbortedError When `waitOptions.signal` is aborted
|
|
69
|
+
* @throws AthenaQueryExecutionWaiterStateError When the final state is `FAILED` or `CANCELLED`
|
|
70
|
+
* @throws AthenaQueryExecutionWaiterMissingStateError When `QueryExecution`, `Status`, or `State` is missing
|
|
71
|
+
* @throws AthenaQueryExecutionWaiterUnsupportedStateError When `State` is not a known {@link QueryExecutionState}
|
|
62
72
|
*/
|
|
63
73
|
wait(queryExecutionId: string, waitOptions?: AthenaQueryExecutionWaitOptions): Promise<QueryExecutionState>;
|
|
64
74
|
}
|
|
@@ -72,7 +82,19 @@ export declare class AthenaQueryExecutionWaiterError extends Error {
|
|
|
72
82
|
constructor(message: string);
|
|
73
83
|
}
|
|
74
84
|
/**
|
|
75
|
-
* Thrown when waiting
|
|
85
|
+
* Thrown when waiting is aborted via {@link AbortSignal}.
|
|
86
|
+
*
|
|
87
|
+
* @property signal Abort signal that triggered cancellation, if available
|
|
88
|
+
*/
|
|
89
|
+
export declare class AthenaQueryExecutionWaiterAbortedError extends AthenaQueryExecutionWaiterError {
|
|
90
|
+
readonly signal?: AbortSignal | undefined;
|
|
91
|
+
/**
|
|
92
|
+
* @param signal Abort signal that triggered cancellation, if available
|
|
93
|
+
*/
|
|
94
|
+
constructor(signal?: AbortSignal | undefined);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Thrown when the overall wait exceeds `timeoutMs` or {@link DEFAULT_TIMEOUT_MS}.
|
|
76
98
|
*/
|
|
77
99
|
export declare class AthenaQueryExecutionWaiterTimeoutError extends AthenaQueryExecutionWaiterError {
|
|
78
100
|
/**
|
|
@@ -81,19 +103,24 @@ export declare class AthenaQueryExecutionWaiterTimeoutError extends AthenaQueryE
|
|
|
81
103
|
constructor(elapsedTime: number);
|
|
82
104
|
}
|
|
83
105
|
/**
|
|
84
|
-
* Thrown when the query ends in FAILED or CANCELLED state.
|
|
106
|
+
* Thrown when the query ends in `FAILED` or `CANCELLED` state.
|
|
107
|
+
*
|
|
108
|
+
* @property state Terminal execution state (`FAILED` or `CANCELLED`)
|
|
109
|
+
* @property reason Athena-provided reason for the state change, or `'unknown'` when omitted
|
|
85
110
|
*/
|
|
86
111
|
export declare class AthenaQueryExecutionWaiterStateError extends AthenaQueryExecutionWaiterError {
|
|
87
112
|
readonly state: QueryExecutionState;
|
|
88
113
|
readonly reason: string;
|
|
89
114
|
/**
|
|
90
|
-
* @param state Final execution state (FAILED or CANCELLED)
|
|
91
|
-
* @param reason Reason for the state change (e.g. error details). Defaults to 'unknown' when omitted
|
|
115
|
+
* @param state Final execution state (`FAILED` or `CANCELLED`)
|
|
116
|
+
* @param reason Reason for the state change (e.g. error details). Defaults to `'unknown'` when omitted
|
|
92
117
|
*/
|
|
93
118
|
constructor(state: QueryExecutionState, reason?: string);
|
|
94
119
|
}
|
|
95
120
|
/**
|
|
96
|
-
* Thrown when GetQueryExecution response lacks QueryExecution
|
|
121
|
+
* Thrown when `GetQueryExecution` response lacks `QueryExecution`, `Status`, or `State`.
|
|
122
|
+
*
|
|
123
|
+
* @property detail Description of which part of the response was missing
|
|
97
124
|
*/
|
|
98
125
|
export declare class AthenaQueryExecutionWaiterMissingStateError extends AthenaQueryExecutionWaiterError {
|
|
99
126
|
readonly detail: string;
|
|
@@ -103,7 +130,9 @@ export declare class AthenaQueryExecutionWaiterMissingStateError extends AthenaQ
|
|
|
103
130
|
constructor(detail: string);
|
|
104
131
|
}
|
|
105
132
|
/**
|
|
106
|
-
* Thrown when State is present but not a known {@link QueryExecutionState} value.
|
|
133
|
+
* Thrown when `State` is present but not a known {@link QueryExecutionState} value.
|
|
134
|
+
*
|
|
135
|
+
* @property state Unsupported state string returned by Athena
|
|
107
136
|
*/
|
|
108
137
|
export declare class AthenaQueryExecutionWaiterUnsupportedStateError extends AthenaQueryExecutionWaiterError {
|
|
109
138
|
readonly state: string;
|
package/lib/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AthenaQueryExecutionWaiterUnsupportedStateError = exports.AthenaQueryExecutionWaiterMissingStateError = exports.AthenaQueryExecutionWaiterStateError = exports.AthenaQueryExecutionWaiterTimeoutError = exports.AthenaQueryExecutionWaiterError = exports.AthenaQueryExecutionWaiter = exports.DEFAULT_TIMEOUT_MS = void 0;
|
|
3
|
+
exports.AthenaQueryExecutionWaiterUnsupportedStateError = exports.AthenaQueryExecutionWaiterMissingStateError = exports.AthenaQueryExecutionWaiterStateError = exports.AthenaQueryExecutionWaiterTimeoutError = exports.AthenaQueryExecutionWaiterAbortedError = exports.AthenaQueryExecutionWaiterError = exports.AthenaQueryExecutionWaiter = exports.DEFAULT_TIMEOUT_MS = void 0;
|
|
4
4
|
const client_athena_1 = require("@aws-sdk/client-athena");
|
|
5
5
|
const wait_predicates_1 = require("./wait-predicates");
|
|
6
|
-
/** Default
|
|
7
|
-
const
|
|
6
|
+
/** Default wait interval in milliseconds between status checks. */
|
|
7
|
+
const DEFAULT_WAIT_INTERVAL_MS = 1000;
|
|
8
8
|
/**
|
|
9
9
|
* Default overall wait timeout (milliseconds) when `wait()` is called without
|
|
10
10
|
* `waitOptions.timeoutMs`.
|
|
11
11
|
* This caps total wall-clock time from the start of `wait()` until a terminal state
|
|
12
|
-
* (or error)—it is not the delay between
|
|
12
|
+
* (or error)—it is not the delay between status checks (`waitIntervalMs`).
|
|
13
13
|
*
|
|
14
14
|
* **Why 2 minutes:** Athena often exceeds a few seconds (queueing, cold start, moderate
|
|
15
15
|
* scans). Ten seconds fails too often as a library default; unbounded or very large
|
|
@@ -19,36 +19,77 @@ const DEFAULT_POLL_INTERVAL_MS = 1000;
|
|
|
19
19
|
*/
|
|
20
20
|
exports.DEFAULT_TIMEOUT_MS = 2 * 60 * 1000;
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
22
|
+
* Throws {@link AthenaQueryExecutionWaiterAbortedError} when `signal` is already aborted.
|
|
23
|
+
*
|
|
24
|
+
* @param signal Optional abort signal from `wait()` options
|
|
25
|
+
* @throws AthenaQueryExecutionWaiterAbortedError When `signal.aborted` is true
|
|
26
|
+
*/
|
|
27
|
+
const throwIfAborted = (signal) => {
|
|
28
|
+
if (signal?.aborted) {
|
|
29
|
+
throw new AthenaQueryExecutionWaiterAbortedError(signal);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Waits for `ms` milliseconds, rejecting early when `signal` is aborted.
|
|
34
|
+
*
|
|
35
|
+
* @param ms Delay in milliseconds
|
|
36
|
+
* @param signal Optional abort signal from `wait()` options
|
|
37
|
+
* @throws AthenaQueryExecutionWaiterAbortedError When `signal` is aborted before or during the delay
|
|
38
|
+
*/
|
|
39
|
+
const delay = async (ms, signal) => {
|
|
40
|
+
throwIfAborted(signal);
|
|
41
|
+
await new Promise((resolve, reject) => {
|
|
42
|
+
const timeoutId = setTimeout(() => {
|
|
43
|
+
cleanup();
|
|
44
|
+
resolve();
|
|
45
|
+
}, ms);
|
|
46
|
+
const onAbort = () => {
|
|
47
|
+
cleanup();
|
|
48
|
+
reject(new AthenaQueryExecutionWaiterAbortedError(signal));
|
|
49
|
+
};
|
|
50
|
+
const cleanup = () => {
|
|
51
|
+
clearTimeout(timeoutId);
|
|
52
|
+
signal?.removeEventListener('abort', onAbort);
|
|
53
|
+
};
|
|
54
|
+
signal?.addEventListener('abort', onAbort);
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Waits for an Athena query execution to reach a terminal state.
|
|
59
|
+
*
|
|
60
|
+
* Repeatedly calls `GetQueryExecution` until the execution becomes
|
|
61
|
+
* `SUCCEEDED`, `FAILED`, or `CANCELLED`. Overall wall-clock time is bounded by
|
|
62
|
+
* `waitOptions.timeoutMs` (or {@link DEFAULT_TIMEOUT_MS}); spacing between status
|
|
63
|
+
* checks is controlled separately by `waitIntervalMs`.
|
|
26
64
|
*/
|
|
27
65
|
class AthenaQueryExecutionWaiter {
|
|
28
66
|
/**
|
|
29
67
|
* @param client Athena API client
|
|
30
|
-
* @param options Optional settings (e.g.
|
|
68
|
+
* @param options Optional settings (e.g. waitIntervalMs)
|
|
31
69
|
*/
|
|
32
70
|
constructor(client, options) {
|
|
33
71
|
this.client = client;
|
|
34
|
-
this.
|
|
72
|
+
this.defaultWaitIntervalMs = options?.waitIntervalMs ?? DEFAULT_WAIT_INTERVAL_MS;
|
|
35
73
|
}
|
|
36
74
|
/**
|
|
37
|
-
* Waits until the given query execution completes
|
|
75
|
+
* Waits until the given query execution completes, fails, or is cancelled.
|
|
38
76
|
*
|
|
39
|
-
* @param queryExecutionId Query execution ID
|
|
40
|
-
* @param waitOptions Optional per-call settings (`timeoutMs`, `
|
|
41
|
-
* @returns
|
|
42
|
-
* @throws AthenaQueryExecutionWaiterTimeoutError
|
|
43
|
-
* @throws
|
|
44
|
-
* @throws
|
|
45
|
-
* @throws
|
|
77
|
+
* @param queryExecutionId Query execution ID returned by `StartQueryExecution`
|
|
78
|
+
* @param waitOptions Optional per-call settings (`timeoutMs`, `waitIntervalMs`, `signal`)
|
|
79
|
+
* @returns `QueryExecutionState.SUCCEEDED` when the query completes successfully
|
|
80
|
+
* @throws AthenaQueryExecutionWaiterTimeoutError When overall wait exceeds the effective timeout
|
|
81
|
+
* @throws AthenaQueryExecutionWaiterAbortedError When `waitOptions.signal` is aborted
|
|
82
|
+
* @throws AthenaQueryExecutionWaiterStateError When the final state is `FAILED` or `CANCELLED`
|
|
83
|
+
* @throws AthenaQueryExecutionWaiterMissingStateError When `QueryExecution`, `Status`, or `State` is missing
|
|
84
|
+
* @throws AthenaQueryExecutionWaiterUnsupportedStateError When `State` is not a known {@link QueryExecutionState}
|
|
46
85
|
*/
|
|
47
86
|
async wait(queryExecutionId, waitOptions) {
|
|
48
87
|
const effectiveTimeoutMs = waitOptions?.timeoutMs ?? exports.DEFAULT_TIMEOUT_MS;
|
|
49
|
-
const
|
|
88
|
+
const waitIntervalMs = waitOptions?.waitIntervalMs ?? this.defaultWaitIntervalMs;
|
|
89
|
+
const signal = waitOptions?.signal;
|
|
50
90
|
const startTime = Date.now();
|
|
51
91
|
do {
|
|
92
|
+
throwIfAborted(signal);
|
|
52
93
|
const elapsedTime = Date.now() - startTime;
|
|
53
94
|
if (elapsedTime > effectiveTimeoutMs) {
|
|
54
95
|
throw new AthenaQueryExecutionWaiterTimeoutError(elapsedTime);
|
|
@@ -56,7 +97,8 @@ class AthenaQueryExecutionWaiter {
|
|
|
56
97
|
const res = await this.client.send(new client_athena_1.GetQueryExecutionCommand({
|
|
57
98
|
QueryExecutionId: queryExecutionId,
|
|
58
99
|
}));
|
|
59
|
-
|
|
100
|
+
throwIfAborted(signal);
|
|
101
|
+
const outcome = (0, wait_predicates_1.classifyQueryExecutionWait)(res);
|
|
60
102
|
if (outcome.kind === 'succeeded') {
|
|
61
103
|
return client_athena_1.QueryExecutionState.SUCCEEDED;
|
|
62
104
|
}
|
|
@@ -69,7 +111,7 @@ class AthenaQueryExecutionWaiter {
|
|
|
69
111
|
if (outcome.kind === 'unsupported') {
|
|
70
112
|
throw new AthenaQueryExecutionWaiterUnsupportedStateError(outcome.state);
|
|
71
113
|
}
|
|
72
|
-
await
|
|
114
|
+
await delay(waitIntervalMs, signal);
|
|
73
115
|
} while (true);
|
|
74
116
|
}
|
|
75
117
|
}
|
|
@@ -88,7 +130,23 @@ class AthenaQueryExecutionWaiterError extends Error {
|
|
|
88
130
|
}
|
|
89
131
|
exports.AthenaQueryExecutionWaiterError = AthenaQueryExecutionWaiterError;
|
|
90
132
|
/**
|
|
91
|
-
* Thrown when waiting
|
|
133
|
+
* Thrown when waiting is aborted via {@link AbortSignal}.
|
|
134
|
+
*
|
|
135
|
+
* @property signal Abort signal that triggered cancellation, if available
|
|
136
|
+
*/
|
|
137
|
+
class AthenaQueryExecutionWaiterAbortedError extends AthenaQueryExecutionWaiterError {
|
|
138
|
+
/**
|
|
139
|
+
* @param signal Abort signal that triggered cancellation, if available
|
|
140
|
+
*/
|
|
141
|
+
constructor(signal) {
|
|
142
|
+
super('Athena query execution wait was aborted');
|
|
143
|
+
this.signal = signal;
|
|
144
|
+
this.name = 'AthenaQueryExecutionWaiterAbortedError';
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.AthenaQueryExecutionWaiterAbortedError = AthenaQueryExecutionWaiterAbortedError;
|
|
148
|
+
/**
|
|
149
|
+
* Thrown when the overall wait exceeds `timeoutMs` or {@link DEFAULT_TIMEOUT_MS}.
|
|
92
150
|
*/
|
|
93
151
|
class AthenaQueryExecutionWaiterTimeoutError extends AthenaQueryExecutionWaiterError {
|
|
94
152
|
/**
|
|
@@ -101,12 +159,15 @@ class AthenaQueryExecutionWaiterTimeoutError extends AthenaQueryExecutionWaiterE
|
|
|
101
159
|
}
|
|
102
160
|
exports.AthenaQueryExecutionWaiterTimeoutError = AthenaQueryExecutionWaiterTimeoutError;
|
|
103
161
|
/**
|
|
104
|
-
* Thrown when the query ends in FAILED or CANCELLED state.
|
|
162
|
+
* Thrown when the query ends in `FAILED` or `CANCELLED` state.
|
|
163
|
+
*
|
|
164
|
+
* @property state Terminal execution state (`FAILED` or `CANCELLED`)
|
|
165
|
+
* @property reason Athena-provided reason for the state change, or `'unknown'` when omitted
|
|
105
166
|
*/
|
|
106
167
|
class AthenaQueryExecutionWaiterStateError extends AthenaQueryExecutionWaiterError {
|
|
107
168
|
/**
|
|
108
|
-
* @param state Final execution state (FAILED or CANCELLED)
|
|
109
|
-
* @param reason Reason for the state change (e.g. error details). Defaults to 'unknown' when omitted
|
|
169
|
+
* @param state Final execution state (`FAILED` or `CANCELLED`)
|
|
170
|
+
* @param reason Reason for the state change (e.g. error details). Defaults to `'unknown'` when omitted
|
|
110
171
|
*/
|
|
111
172
|
constructor(state, reason = 'unknown') {
|
|
112
173
|
super(`Athena query execution failed with state ${state}: ${reason}`);
|
|
@@ -117,7 +178,9 @@ class AthenaQueryExecutionWaiterStateError extends AthenaQueryExecutionWaiterErr
|
|
|
117
178
|
}
|
|
118
179
|
exports.AthenaQueryExecutionWaiterStateError = AthenaQueryExecutionWaiterStateError;
|
|
119
180
|
/**
|
|
120
|
-
* Thrown when GetQueryExecution response lacks QueryExecution
|
|
181
|
+
* Thrown when `GetQueryExecution` response lacks `QueryExecution`, `Status`, or `State`.
|
|
182
|
+
*
|
|
183
|
+
* @property detail Description of which part of the response was missing
|
|
121
184
|
*/
|
|
122
185
|
class AthenaQueryExecutionWaiterMissingStateError extends AthenaQueryExecutionWaiterError {
|
|
123
186
|
/**
|
|
@@ -131,7 +194,9 @@ class AthenaQueryExecutionWaiterMissingStateError extends AthenaQueryExecutionWa
|
|
|
131
194
|
}
|
|
132
195
|
exports.AthenaQueryExecutionWaiterMissingStateError = AthenaQueryExecutionWaiterMissingStateError;
|
|
133
196
|
/**
|
|
134
|
-
* Thrown when State is present but not a known {@link QueryExecutionState} value.
|
|
197
|
+
* Thrown when `State` is present but not a known {@link QueryExecutionState} value.
|
|
198
|
+
*
|
|
199
|
+
* @property state Unsupported state string returned by Athena
|
|
135
200
|
*/
|
|
136
201
|
class AthenaQueryExecutionWaiterUnsupportedStateError extends AthenaQueryExecutionWaiterError {
|
|
137
202
|
/**
|
|
@@ -144,4 +209,4 @@ class AthenaQueryExecutionWaiterUnsupportedStateError extends AthenaQueryExecuti
|
|
|
144
209
|
}
|
|
145
210
|
}
|
|
146
211
|
exports.AthenaQueryExecutionWaiterUnsupportedStateError = AthenaQueryExecutionWaiterUnsupportedStateError;
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQXFHO0FBQ3JHLHVEQUErRDtBQUUvRCwwRUFBMEU7QUFDMUUsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUM7QUFFdEM7Ozs7Ozs7Ozs7O0dBV0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBMkJoRDs7Ozs7R0FLRztBQUNILE1BQWEsMEJBQTBCO0lBSXJDOzs7T0FHRztJQUNILFlBQ21CLE1BQW9CLEVBQ3JDLE9BQTJDO1FBRDFCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFHckMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE9BQU8sRUFBRSxjQUFjLElBQUksd0JBQXdCLENBQUM7SUFDbkYsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUNSLGdCQUF3QixFQUN4QixXQUE2QztRQUU3QyxNQUFNLGtCQUFrQixHQUFHLFdBQVcsRUFBRSxTQUFTLElBQUksMEJBQWtCLENBQUM7UUFDeEUsTUFBTSxjQUFjLEdBQUcsV0FBVyxFQUFFLGNBQWMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDakYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLEdBQUcsQ0FBQztZQUNGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7WUFDM0MsSUFBSSxXQUFXLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxJQUFJLHNDQUFzQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7WUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksd0NBQXdCLENBQUM7Z0JBQzlELGdCQUFnQixFQUFFLGdCQUFnQjthQUNuQyxDQUFDLENBQUMsQ0FBQztZQUNKLE1BQU0sT0FBTyxHQUFHLElBQUEsNENBQTBCLEVBQUMsR0FBRyxDQUFDLENBQUM7WUFFaEQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLG1DQUFtQixDQUFDLFNBQVMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksb0NBQW9DLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLDJDQUEyQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RSxDQUFDO1lBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRSxDQUFDO2dCQUNuQyxNQUFNLElBQUksK0NBQStDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNFLENBQUM7WUFFRCxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxRQUFRLElBQUksRUFBRTtJQUNqQixDQUFDO0NBQ0Y7QUE1REQsZ0VBNERDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLCtCQUFnQyxTQUFRLEtBQUs7SUFFeEQ7O09BRUc7SUFDSCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxpQ0FBaUMsQ0FBQztJQUNoRCxDQUFDO0NBQ0Y7QUFURCwwRUFTQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxzQ0FBdUMsU0FBUSwrQkFBK0I7SUFFekY7O09BRUc7SUFDSCxZQUFZLFdBQW1CO1FBQzdCLEtBQUssQ0FBQyxnQ0FBZ0MsV0FBVyxJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxHQUFHLHdDQUF3QyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQVRELHdGQVNDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLG9DQUFxQyxTQUFRLCtCQUErQjtJQUV2Rjs7O09BR0c7SUFDSCxZQUE0QixLQUEwQixFQUFrQixTQUFpQixTQUFTO1FBQ2hHLEtBQUssQ0FBQyw0Q0FBNEMsS0FBSyxLQUFLLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFENUMsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFBa0IsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFFaEcsSUFBSSxDQUFDLElBQUksR0FBRyxzQ0FBc0MsQ0FBQztJQUNyRCxDQUFDO0NBQ0Y7QUFWRCxvRkFVQztBQUVEOztHQUVHO0FBQ0gsTUFBYSwyQ0FBNEMsU0FBUSwrQkFBK0I7SUFFOUY7O09BRUc7SUFDSCxZQUE0QixNQUFjO1FBQ3hDLEtBQUssQ0FBQywyREFBMkQsTUFBTSxFQUFFLENBQUMsQ0FBQztRQURqRCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRXhDLElBQUksQ0FBQyxJQUFJLEdBQUcsNkNBQTZDLENBQUM7SUFDNUQsQ0FBQztDQUNGO0FBVEQsa0dBU0M7QUFFRDs7R0FFRztBQUNILE1BQWEsK0NBQWdELFNBQVEsK0JBQStCO0lBRWxHOztPQUVHO0lBQ0gsWUFBNEIsS0FBYTtRQUN2QyxLQUFLLENBQUMsc0RBQXNELEtBQUssRUFBRSxDQUFDLENBQUM7UUFEM0MsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUV2QyxJQUFJLENBQUMsSUFBSSxHQUFHLGlEQUFpRCxDQUFDO0lBQ2hFLENBQUM7Q0FDRjtBQVRELDBHQVNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2V0UXVlcnlFeGVjdXRpb25Db21tYW5kLCBRdWVyeUV4ZWN1dGlvblN0YXRlLCBBdGhlbmFDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtYXRoZW5hJztcbmltcG9ydCB7IGNsYXNzaWZ5UXVlcnlFeGVjdXRpb25Qb2xsIH0gZnJvbSAnLi93YWl0LXByZWRpY2F0ZXMnO1xuXG4vKiogRGVmYXVsdCBwb2xsaW5nIGludGVydmFsIChtaWxsaXNlY29uZHMpIGZvciBxdWVyeSBleGVjdXRpb24gc3RhdHVzLiAqL1xuY29uc3QgREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TID0gMTAwMDtcblxuLyoqXG4gKiBEZWZhdWx0IG92ZXJhbGwgd2FpdCB0aW1lb3V0IChtaWxsaXNlY29uZHMpIHdoZW4gYHdhaXQoKWAgaXMgY2FsbGVkIHdpdGhvdXRcbiAqIGB3YWl0T3B0aW9ucy50aW1lb3V0TXNgLlxuICogVGhpcyBjYXBzIHRvdGFsIHdhbGwtY2xvY2sgdGltZSBmcm9tIHRoZSBzdGFydCBvZiBgd2FpdCgpYCB1bnRpbCBhIHRlcm1pbmFsIHN0YXRlXG4gKiAob3IgZXJyb3Ip4oCUaXQgaXMgbm90IHRoZSBkZWxheSBiZXR3ZWVuIHBvbGxzIChgcG9sbEludGVydmFsTXNgKS5cbiAqXG4gKiAqKldoeSAyIG1pbnV0ZXM6KiogQXRoZW5hIG9mdGVuIGV4Y2VlZHMgYSBmZXcgc2Vjb25kcyAocXVldWVpbmcsIGNvbGQgc3RhcnQsIG1vZGVyYXRlXG4gKiBzY2FucykuIFRlbiBzZWNvbmRzIGZhaWxzIHRvbyBvZnRlbiBhcyBhIGxpYnJhcnkgZGVmYXVsdDsgdW5ib3VuZGVkIG9yIHZlcnkgbGFyZ2VcbiAqIGRlZmF1bHRzIHJpc2sgaGFuZ2luZyBjYWxsZXJzLiBUd28gbWludXRlcyBpcyBhIHByYWN0aWNhbCBtaWRkbGUgZ3JvdW5k4oCUdGlnaHQgZW5vdWdoXG4gKiB0byBzdXJmYWNlIHN0dWNrIHdvcmssIGxvbmcgZW5vdWdoIGZvciBtYW55IGludGVyYWN0aXZlIHdvcmtsb2Fkcy4gVXNlIGEgbGFyZ2VyXG4gKiBgd2FpdCguLi4sIHsgdGltZW91dE1zIH0pYCBmb3IgaGVhdnkgYW5hbHl0aWNzIG9yIEVUTC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElNRU9VVF9NUyA9IDIgKiA2MCAqIDEwMDA7XG5cbi8qKiBPcHRpb25zIGZvciBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlciBjb25zdHJ1Y3Rvci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBvbGxpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBJbmNyZWFzZSBmb3IgbG9uZy1ydW5uaW5nIHF1ZXJpZXMgdG8gcmVkdWNlIEFQSSBjYWxscy5cbiAgICogRGVmYXVsdHMgdG8gREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TICgxMDAwKSB3aGVuIG9taXR0ZWQuXG4gICAqL1xuICBwb2xsSW50ZXJ2YWxNcz86IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHdhaXQoKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPdmVyYWxsIHdhbGwtY2xvY2sgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoaXMgd2FpdCAoZnJvbSB0aGUgc3RhcnQgb2YgYHdhaXQoKWBcbiAgICogdW50aWwgYSB0ZXJtaW5hbCBzdGF0ZSkuIE5vdCB0aGUgZGVsYXkgYmV0d2VlbiBwb2xscy5cbiAgICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfVElNRU9VVF9NU30gd2hlbiBvbWl0dGVkLlxuICAgKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogUG9sbGluZyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoaXMgd2FpdC5cbiAgICogT3ZlcnJpZGVzIHRoZSB3YWl0ZXIncyBkZWZhdWx0IHBvbGwgaW50ZXJ2YWwgd2hlbiBzcGVjaWZpZWQuXG4gICAqL1xuICBwb2xsSW50ZXJ2YWxNcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXYWl0cyBmb3IgQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiB0byBjb21wbGV0ZS5cbiAqIFBvbGxzIGV4ZWN1dGlvbiBzdGF0dXMgdW50aWwgaXQgYmVjb21lcyBTVUNDRUVERUQsIEZBSUxFRCwgb3IgQ0FOQ0VMTEVELlxuICogT3ZlcmFsbCB0aW1lIGlzIGJvdW5kZWQgYnkgYHdhaXRPcHRpb25zLnRpbWVvdXRNc2AgKG9yIHtAbGluayBERUZBVUxUX1RJTUVPVVRfTVN9KTtcbiAqIHNwYWNpbmcgYmV0d2VlbiBwb2xscyBpcyBjb250cm9sbGVkIHNlcGFyYXRlbHkgYnkgYHBvbGxJbnRlcnZhbE1zYC5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQb2xsSW50ZXJ2YWxNczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gY2xpZW50IEF0aGVuYSBBUEkgY2xpZW50XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIHNldHRpbmdzIChlLmcuIHBvbGxJbnRlcnZhbE1zKVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IEF0aGVuYUNsaWVudCxcbiAgICBvcHRpb25zPzogQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLmRlZmF1bHRQb2xsSW50ZXJ2YWxNcyA9IG9wdGlvbnM/LnBvbGxJbnRlcnZhbE1zID8/IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUztcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCB0aGUgZ2l2ZW4gcXVlcnkgZXhlY3V0aW9uIGNvbXBsZXRlcyAob3IgZmFpbHMvY2FuY2VscykuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIFF1ZXJ5IGV4ZWN1dGlvbiBJRCB0byB3YWl0IGZvclxuICAgKiBAcGFyYW0gd2FpdE9wdGlvbnMgT3B0aW9uYWwgcGVyLWNhbGwgc2V0dGluZ3MgKGB0aW1lb3V0TXNgLCBgcG9sbEludGVydmFsTXNgKVxuICAgKiBAcmV0dXJucyBFeGVjdXRpb24gc3RhdGUgb24gc3VjY2VzcyAoU1VDQ0VFREVEKVxuICAgKiBAdGhyb3dzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyVGltZW91dEVycm9yIE9uIHRpbWVvdXRcbiAgICogQHRocm93cyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclN0YXRlRXJyb3IgV2hlbiBzdGF0ZSBpcyBGQUlMRUQgb3IgQ0FOQ0VMTEVEXG4gICAqIEB0aHJvd3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJNaXNzaW5nU3RhdGVFcnJvciBXaGVuIFF1ZXJ5RXhlY3V0aW9uIG9yIFN0YXR1cy5TdGF0ZSBpcyBtaXNzaW5nXG4gICAqIEB0aHJvd3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJVbnN1cHBvcnRlZFN0YXRlRXJyb3IgV2hlbiBzdGF0ZSBpcyBub3QgYSBrbm93biBRdWVyeUV4ZWN1dGlvblN0YXRlXG4gICAqL1xuICBhc3luYyB3YWl0KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICB3YWl0T3B0aW9ucz86IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UXVlcnlFeGVjdXRpb25TdGF0ZT4ge1xuICAgIGNvbnN0IGVmZmVjdGl2ZVRpbWVvdXRNcyA9IHdhaXRPcHRpb25zPy50aW1lb3V0TXMgPz8gREVGQVVMVF9USU1FT1VUX01TO1xuICAgIGNvbnN0IHBvbGxJbnRlcnZhbE1zID0gd2FpdE9wdGlvbnM/LnBvbGxJbnRlcnZhbE1zID8/IHRoaXMuZGVmYXVsdFBvbGxJbnRlcnZhbE1zO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgZG8ge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWUgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgaWYgKGVsYXBzZWRUaW1lID4gZWZmZWN0aXZlVGltZW91dE1zKSB7XG4gICAgICAgIHRocm93IG5ldyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclRpbWVvdXRFcnJvcihlbGFwc2VkVGltZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQobmV3IEdldFF1ZXJ5RXhlY3V0aW9uQ29tbWFuZCh7XG4gICAgICAgIFF1ZXJ5RXhlY3V0aW9uSWQ6IHF1ZXJ5RXhlY3V0aW9uSWQsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBvdXRjb21lID0gY2xhc3NpZnlRdWVyeUV4ZWN1dGlvblBvbGwocmVzKTtcblxuICAgICAgaWYgKG91dGNvbWUua2luZCA9PT0gJ3N1Y2NlZWRlZCcpIHtcbiAgICAgICAgcmV0dXJuIFF1ZXJ5RXhlY3V0aW9uU3RhdGUuU1VDQ0VFREVEO1xuICAgICAgfVxuICAgICAgaWYgKG91dGNvbWUua2luZCA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyU3RhdGVFcnJvcihvdXRjb21lLnN0YXRlLCBvdXRjb21lLnJlYXNvbik7XG4gICAgICB9XG4gICAgICBpZiAob3V0Y29tZS5raW5kID09PSAnbWlzc2luZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyTWlzc2luZ1N0YXRlRXJyb3Iob3V0Y29tZS5kZXRhaWwpO1xuICAgICAgfVxuICAgICAgaWYgKG91dGNvbWUua2luZCA9PT0gJ3Vuc3VwcG9ydGVkJykge1xuICAgICAgICB0aHJvdyBuZXcgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJVbnN1cHBvcnRlZFN0YXRlRXJyb3Iob3V0Y29tZS5zdGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIHBvbGxJbnRlcnZhbE1zKSk7XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGVycm9yIGZvciBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIHdhaXRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIEVycm9yIG1lc3NhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHdhaXRpbmcgZm9yIHF1ZXJ5IGV4ZWN1dGlvbiB0aW1lcyBvdXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclRpbWVvdXRFcnJvciBleHRlbmRzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gZWxhcHNlZFRpbWUgRWxhcHNlZCB0aW1lIGluIG1pbGxpc2Vjb25kcyB1bnRpbCB0aW1lb3V0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGFwc2VkVGltZTogbnVtYmVyKSB7XG4gICAgc3VwZXIoYEF0aGVuYSBxdWVyeSB0aW1lZCBvdXQgYWZ0ZXIgJHtlbGFwc2VkVGltZX1tc2ApO1xuICAgIHRoaXMubmFtZSA9ICdBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclRpbWVvdXRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgcXVlcnkgZW5kcyBpbiBGQUlMRUQgb3IgQ0FOQ0VMTEVEIHN0YXRlLlxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJTdGF0ZUVycm9yIGV4dGVuZHMgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJFcnJvciB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzdGF0ZSBGaW5hbCBleGVjdXRpb24gc3RhdGUgKEZBSUxFRCBvciBDQU5DRUxMRUQpXG4gICAqIEBwYXJhbSByZWFzb24gUmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlIChlLmcuIGVycm9yIGRldGFpbHMpLiBEZWZhdWx0cyB0byAndW5rbm93bicgd2hlbiBvbWl0dGVkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgc3RhdGU6IFF1ZXJ5RXhlY3V0aW9uU3RhdGUsIHB1YmxpYyByZWFkb25seSByZWFzb246IHN0cmluZyA9ICd1bmtub3duJykge1xuICAgIHN1cGVyKGBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGZhaWxlZCB3aXRoIHN0YXRlICR7c3RhdGV9OiAke3JlYXNvbn1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJTdGF0ZUVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIEdldFF1ZXJ5RXhlY3V0aW9uIHJlc3BvbnNlIGxhY2tzIFF1ZXJ5RXhlY3V0aW9uLCBTdGF0dXMsIG9yIFN0YXRlLlxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJNaXNzaW5nU3RhdGVFcnJvciBleHRlbmRzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGV0YWlsIFdoaWNoIHBhcnQgb2YgdGhlIHJlc3BvbnNlIHdhcyBtaXNzaW5nXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZGV0YWlsOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBzdGF0dXMgaXMgbWlzc2luZyBvciBpbmNvbXBsZXRlOiAke2RldGFpbH1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJNaXNzaW5nU3RhdGVFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBTdGF0ZSBpcyBwcmVzZW50IGJ1dCBub3QgYSBrbm93biB7QGxpbmsgUXVlcnlFeGVjdXRpb25TdGF0ZX0gdmFsdWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclVuc3VwcG9ydGVkU3RhdGVFcnJvciBleHRlbmRzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc3RhdGUgVW5zdXBwb3J0ZWQgc3RhdGUgc3RyaW5nIHJldHVybmVkIGJ5IEF0aGVuYVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHN0YXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiByZXR1cm5lZCB1bnN1cHBvcnRlZCBzdGF0ZTogJHtzdGF0ZX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJVbnN1cHBvcnRlZFN0YXRlRXJyb3InO1xuICB9XG59XG4iXX0=
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQXFHO0FBQ3JHLHVEQUErRDtBQUUvRCxtRUFBbUU7QUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUM7QUFFdEM7Ozs7Ozs7Ozs7O0dBV0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRWhEOzs7OztHQUtHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFvQixFQUFRLEVBQUU7SUFDcEQsSUFBSSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDcEIsTUFBTSxJQUFJLHNDQUFzQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNELENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLEtBQUssR0FBRyxLQUFLLEVBQUUsRUFBVSxFQUFFLE1BQW9CLEVBQWlCLEVBQUU7SUFDdEUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZCLE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDMUMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNoQyxPQUFPLEVBQUUsQ0FBQztZQUNWLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1AsTUFBTSxPQUFPLEdBQUcsR0FBUyxFQUFFO1lBQ3pCLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBTSxDQUFDLElBQUksc0NBQXNDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxHQUFTLEVBQUU7WUFDekIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FB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b3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHZXRRdWVyeUV4ZWN1dGlvbkNvbW1hbmQsIFF1ZXJ5RXhlY3V0aW9uU3RhdGUsIEF0aGVuYUNsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hdGhlbmEnO1xuaW1wb3J0IHsgY2xhc3NpZnlRdWVyeUV4ZWN1dGlvbldhaXQgfSBmcm9tICcuL3dhaXQtcHJlZGljYXRlcyc7XG5cbi8qKiBEZWZhdWx0IHdhaXQgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gc3RhdHVzIGNoZWNrcy4gKi9cbmNvbnN0IERFRkFVTFRfV0FJVF9JTlRFUlZBTF9NUyA9IDEwMDA7XG5cbi8qKlxuICogRGVmYXVsdCBvdmVyYWxsIHdhaXQgdGltZW91dCAobWlsbGlzZWNvbmRzKSB3aGVuIGB3YWl0KClgIGlzIGNhbGxlZCB3aXRob3V0XG4gKiBgd2FpdE9wdGlvbnMudGltZW91dE1zYC5cbiAqIFRoaXMgY2FwcyB0b3RhbCB3YWxsLWNsb2NrIHRpbWUgZnJvbSB0aGUgc3RhcnQgb2YgYHdhaXQoKWAgdW50aWwgYSB0ZXJtaW5hbCBzdGF0ZVxuICogKG9yIGVycm9yKeKAlGl0IGlzIG5vdCB0aGUgZGVsYXkgYmV0d2VlbiBzdGF0dXMgY2hlY2tzIChgd2FpdEludGVydmFsTXNgKS5cbiAqXG4gKiAqKldoeSAyIG1pbnV0ZXM6KiogQXRoZW5hIG9mdGVuIGV4Y2VlZHMgYSBmZXcgc2Vjb25kcyAocXVldWVpbmcsIGNvbGQgc3RhcnQsIG1vZGVyYXRlXG4gKiBzY2FucykuIFRlbiBzZWNvbmRzIGZhaWxzIHRvbyBvZnRlbiBhcyBhIGxpYnJhcnkgZGVmYXVsdDsgdW5ib3VuZGVkIG9yIHZlcnkgbGFyZ2VcbiAqIGRlZmF1bHRzIHJpc2sgaGFuZ2luZyBjYWxsZXJzLiBUd28gbWludXRlcyBpcyBhIHByYWN0aWNhbCBtaWRkbGUgZ3JvdW5k4oCUdGlnaHQgZW5vdWdoXG4gKiB0byBzdXJmYWNlIHN0dWNrIHdvcmssIGxvbmcgZW5vdWdoIGZvciBtYW55IGludGVyYWN0aXZlIHdvcmtsb2Fkcy4gVXNlIGEgbGFyZ2VyXG4gKiBgd2FpdCguLi4sIHsgdGltZW91dE1zIH0pYCBmb3IgaGVhdnkgYW5hbHl0aWNzIG9yIEVUTC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElNRU9VVF9NUyA9IDIgKiA2MCAqIDEwMDA7XG5cbi8qKlxuICogVGhyb3dzIHtAbGluayBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckFib3J0ZWRFcnJvcn0gd2hlbiBgc2lnbmFsYCBpcyBhbHJlYWR5IGFib3J0ZWQuXG4gKlxuICogQHBhcmFtIHNpZ25hbCBPcHRpb25hbCBhYm9ydCBzaWduYWwgZnJvbSBgd2FpdCgpYCBvcHRpb25zXG4gKiBAdGhyb3dzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyQWJvcnRlZEVycm9yIFdoZW4gYHNpZ25hbC5hYm9ydGVkYCBpcyB0cnVlXG4gKi9cbmNvbnN0IHRocm93SWZBYm9ydGVkID0gKHNpZ25hbD86IEFib3J0U2lnbmFsKTogdm9pZCA9PiB7XG4gIGlmIChzaWduYWw/LmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJBYm9ydGVkRXJyb3Ioc2lnbmFsKTtcbiAgfVxufTtcblxuLyoqXG4gKiBXYWl0cyBmb3IgYG1zYCBtaWxsaXNlY29uZHMsIHJlamVjdGluZyBlYXJseSB3aGVuIGBzaWduYWxgIGlzIGFib3J0ZWQuXG4gKlxuICogQHBhcmFtIG1zIERlbGF5IGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHNpZ25hbCBPcHRpb25hbCBhYm9ydCBzaWduYWwgZnJvbSBgd2FpdCgpYCBvcHRpb25zXG4gKiBAdGhyb3dzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyQWJvcnRlZEVycm9yIFdoZW4gYHNpZ25hbGAgaXMgYWJvcnRlZCBiZWZvcmUgb3IgZHVyaW5nIHRoZSBkZWxheVxuICovXG5jb25zdCBkZWxheSA9IGFzeW5jIChtczogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICB0aHJvd0lmQWJvcnRlZChzaWduYWwpO1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSwgbXMpO1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICByZWplY3QobmV3IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyQWJvcnRlZEVycm9yKHNpZ25hbCkpO1xuICAgIH07XG4gICAgY29uc3QgY2xlYW51cCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgIH07XG4gICAgc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICB9KTtcbn07XG5cbi8qKiBDb25zdHJ1Y3RvciBvcHRpb25zIGZvciB7QGxpbmsgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJ9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlck9wdGlvbnMge1xuICAvKipcbiAgICogRGVmYXVsdCB3YWl0IGludGVydmFsIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHN0YXR1cyBjaGVja3MgZm9yIGB3YWl0KClgIGNhbGxzXG4gICAqIHRoYXQgb21pdCBgd2FpdEludGVydmFsTXNgLlxuICAgKiBJbmNyZWFzZSBmb3IgbG9uZy1ydW5uaW5nIHF1ZXJpZXMgdG8gcmVkdWNlIEFQSSBjYWxscy5cbiAgICogRGVmYXVsdHMgdG8gYDEwMDBgIHdoZW4gb21pdHRlZC5cbiAgICovXG4gIHdhaXRJbnRlcnZhbE1zPzogbnVtYmVyO1xufVxuXG4vKiogUGVyLWNhbGwgb3B0aW9ucyBmb3Ige0BsaW5rIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyLndhaXR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIE92ZXJhbGwgd2FsbC1jbG9jayB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhpcyB3YWl0IChmcm9tIHRoZSBzdGFydCBvZiBgd2FpdCgpYFxuICAgKiB1bnRpbCBhIHRlcm1pbmFsIHN0YXRlKS4gTm90IHRoZSBkZWxheSBiZXR3ZWVuIHN0YXR1cyBjaGVja3MuXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1RJTUVPVVRfTVN9IHdoZW4gb21pdHRlZC5cbiAgICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdhaXQgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gc3RhdHVzIGNoZWNrcyBmb3IgdGhpcyB3YWl0LlxuICAgKiBPdmVycmlkZXMgdGhlIHdhaXRlcidzIGRlZmF1bHQgd2FpdCBpbnRlcnZhbCB3aGVuIHNwZWNpZmllZC5cbiAgICovXG4gIHdhaXRJbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogT3B0aW9uYWwgYWJvcnQgc2lnbmFsLiBXaGVuIGFib3J0ZWQsIHdhaXRpbmcgc3RvcHMgaW1tZWRpYXRlbHkgYW5kXG4gICAqIHtAbGluayBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckFib3J0ZWRFcnJvcn0gaXMgdGhyb3du4oCUYmVmb3JlIHRoZSBuZXh0IHN0YXR1c1xuICAgKiBjaGVjaywgYWZ0ZXIgYSBzdGF0dXMgY2hlY2sgcmV0dXJucywgb3IgZHVyaW5nIHRoZSB3YWl0IGludGVydmFsLlxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogV2FpdHMgZm9yIGFuIEF0aGVuYSBxdWVyeSBleGVjdXRpb24gdG8gcmVhY2ggYSB0ZXJtaW5hbCBzdGF0ZS5cbiAqXG4gKiBSZXBlYXRlZGx5IGNhbGxzIGBHZXRRdWVyeUV4ZWN1dGlvbmAgdW50aWwgdGhlIGV4ZWN1dGlvbiBiZWNvbWVzXG4gKiBgU1VDQ0VFREVEYCwgYEZBSUxFRGAsIG9yIGBDQU5DRUxMRURgLiBPdmVyYWxsIHdhbGwtY2xvY2sgdGltZSBpcyBib3VuZGVkIGJ5XG4gKiBgd2FpdE9wdGlvbnMudGltZW91dE1zYCAob3Ige0BsaW5rIERFRkFVTFRfVElNRU9VVF9NU30pOyBzcGFjaW5nIGJldHdlZW4gc3RhdHVzXG4gKiBjaGVja3MgaXMgY29udHJvbGxlZCBzZXBhcmF0ZWx5IGJ5IGB3YWl0SW50ZXJ2YWxNc2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlciB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0V2FpdEludGVydmFsTXM6IG51bWJlcjtcblxuICAvKipcbiAgICogQHBhcmFtIGNsaWVudCBBdGhlbmEgQVBJIGNsaWVudFxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBzZXR0aW5ncyAoZS5nLiB3YWl0SW50ZXJ2YWxNcylcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBBdGhlbmFDbGllbnQsXG4gICAgb3B0aW9ucz86IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5kZWZhdWx0V2FpdEludGVydmFsTXMgPSBvcHRpb25zPy53YWl0SW50ZXJ2YWxNcyA/PyBERUZBVUxUX1dBSVRfSU5URVJWQUxfTVM7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGdpdmVuIHF1ZXJ5IGV4ZWN1dGlvbiBjb21wbGV0ZXMsIGZhaWxzLCBvciBpcyBjYW5jZWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeUV4ZWN1dGlvbklkIFF1ZXJ5IGV4ZWN1dGlvbiBJRCByZXR1cm5lZCBieSBgU3RhcnRRdWVyeUV4ZWN1dGlvbmBcbiAgICogQHBhcmFtIHdhaXRPcHRpb25zIE9wdGlvbmFsIHBlci1jYWxsIHNldHRpbmdzIChgdGltZW91dE1zYCwgYHdhaXRJbnRlcnZhbE1zYCwgYHNpZ25hbGApXG4gICAqIEByZXR1cm5zIGBRdWVyeUV4ZWN1dGlvblN0YXRlLlNVQ0NFRURFRGAgd2hlbiB0aGUgcXVlcnkgY29tcGxldGVzIHN1Y2Nlc3NmdWxseVxuICAgKiBAdGhyb3dzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyVGltZW91dEVycm9yIFdoZW4gb3ZlcmFsbCB3YWl0IGV4Y2VlZHMgdGhlIGVmZmVjdGl2ZSB0aW1lb3V0XG4gICAqIEB0aHJvd3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJBYm9ydGVkRXJyb3IgV2hlbiBgd2FpdE9wdGlvbnMuc2lnbmFsYCBpcyBhYm9ydGVkXG4gICAqIEB0aHJvd3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJTdGF0ZUVycm9yIFdoZW4gdGhlIGZpbmFsIHN0YXRlIGlzIGBGQUlMRURgIG9yIGBDQU5DRUxMRURgXG4gICAqIEB0aHJvd3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJNaXNzaW5nU3RhdGVFcnJvciBXaGVuIGBRdWVyeUV4ZWN1dGlvbmAsIGBTdGF0dXNgLCBvciBgU3RhdGVgIGlzIG1pc3NpbmdcbiAgICogQHRocm93cyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclVuc3VwcG9ydGVkU3RhdGVFcnJvciBXaGVuIGBTdGF0ZWAgaXMgbm90IGEga25vd24ge0BsaW5rIFF1ZXJ5RXhlY3V0aW9uU3RhdGV9XG4gICAqL1xuICBhc3luYyB3YWl0KFxuICAgIHF1ZXJ5RXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICB3YWl0T3B0aW9ucz86IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UXVlcnlFeGVjdXRpb25TdGF0ZT4ge1xuICAgIGNvbnN0IGVmZmVjdGl2ZVRpbWVvdXRNcyA9IHdhaXRPcHRpb25zPy50aW1lb3V0TXMgPz8gREVGQVVMVF9USU1FT1VUX01TO1xuICAgIGNvbnN0IHdhaXRJbnRlcnZhbE1zID0gd2FpdE9wdGlvbnM/LndhaXRJbnRlcnZhbE1zID8/IHRoaXMuZGVmYXVsdFdhaXRJbnRlcnZhbE1zO1xuICAgIGNvbnN0IHNpZ25hbCA9IHdhaXRPcHRpb25zPy5zaWduYWw7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBkbyB7XG4gICAgICB0aHJvd0lmQWJvcnRlZChzaWduYWwpO1xuXG4gICAgICBjb25zdCBlbGFwc2VkVGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBpZiAoZWxhcHNlZFRpbWUgPiBlZmZlY3RpdmVUaW1lb3V0TXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyVGltZW91dEVycm9yKGVsYXBzZWRUaW1lKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgR2V0UXVlcnlFeGVjdXRpb25Db21tYW5kKHtcbiAgICAgICAgUXVlcnlFeGVjdXRpb25JZDogcXVlcnlFeGVjdXRpb25JZCxcbiAgICAgIH0pKTtcbiAgICAgIHRocm93SWZBYm9ydGVkKHNpZ25hbCk7XG5cbiAgICAgIGNvbnN0IG91dGNvbWUgPSBjbGFzc2lmeVF1ZXJ5RXhlY3V0aW9uV2FpdChyZXMpO1xuXG4gICAgICBpZiAob3V0Y29tZS5raW5kID09PSAnc3VjY2VlZGVkJykge1xuICAgICAgICByZXR1cm4gUXVlcnlFeGVjdXRpb25TdGF0ZS5TVUNDRUVERUQ7XG4gICAgICB9XG4gICAgICBpZiAob3V0Y29tZS5raW5kID09PSAnZmFpbGVkJykge1xuICAgICAgICB0aHJvdyBuZXcgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJTdGF0ZUVycm9yKG91dGNvbWUuc3RhdGUsIG91dGNvbWUucmVhc29uKTtcbiAgICAgIH1cbiAgICAgIGlmIChvdXRjb21lLmtpbmQgPT09ICdtaXNzaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJNaXNzaW5nU3RhdGVFcnJvcihvdXRjb21lLmRldGFpbCk7XG4gICAgICB9XG4gICAgICBpZiAob3V0Y29tZS5raW5kID09PSAndW5zdXBwb3J0ZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlclVuc3VwcG9ydGVkU3RhdGVFcnJvcihvdXRjb21lLnN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGVsYXkod2FpdEludGVydmFsTXMsIHNpZ25hbCk7XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGVycm9yIGZvciBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIHdhaXRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBtZXNzYWdlIEVycm9yIG1lc3NhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHdhaXRpbmcgaXMgYWJvcnRlZCB2aWEge0BsaW5rIEFib3J0U2lnbmFsfS5cbiAqXG4gKiBAcHJvcGVydHkgc2lnbmFsIEFib3J0IHNpZ25hbCB0aGF0IHRyaWdnZXJlZCBjYW5jZWxsYXRpb24sIGlmIGF2YWlsYWJsZVxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJBYm9ydGVkRXJyb3IgZXh0ZW5kcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckVycm9yIHtcblxuICAvKipcbiAgICogQHBhcmFtIHNpZ25hbCBBYm9ydCBzaWduYWwgdGhhdCB0cmlnZ2VyZWQgY2FuY2VsbGF0aW9uLCBpZiBhdmFpbGFibGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIHN1cGVyKCdBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIHdhaXQgd2FzIGFib3J0ZWQnKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJBYm9ydGVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIG92ZXJhbGwgd2FpdCBleGNlZWRzIGB0aW1lb3V0TXNgIG9yIHtAbGluayBERUZBVUxUX1RJTUVPVVRfTVN9LlxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJUaW1lb3V0RXJyb3IgZXh0ZW5kcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckVycm9yIHtcblxuICAvKipcbiAgICogQHBhcmFtIGVsYXBzZWRUaW1lIEVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMgdW50aWwgdGltZW91dFxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxhcHNlZFRpbWU6IG51bWJlcikge1xuICAgIHN1cGVyKGBBdGhlbmEgcXVlcnkgdGltZWQgb3V0IGFmdGVyICR7ZWxhcHNlZFRpbWV9bXNgKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJUaW1lb3V0RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHF1ZXJ5IGVuZHMgaW4gYEZBSUxFRGAgb3IgYENBTkNFTExFRGAgc3RhdGUuXG4gKlxuICogQHByb3BlcnR5IHN0YXRlIFRlcm1pbmFsIGV4ZWN1dGlvbiBzdGF0ZSAoYEZBSUxFRGAgb3IgYENBTkNFTExFRGApXG4gKiBAcHJvcGVydHkgcmVhc29uIEF0aGVuYS1wcm92aWRlZCByZWFzb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2UsIG9yIGAndW5rbm93bidgIHdoZW4gb21pdHRlZFxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJTdGF0ZUVycm9yIGV4dGVuZHMgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJFcnJvciB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzdGF0ZSBGaW5hbCBleGVjdXRpb24gc3RhdGUgKGBGQUlMRURgIG9yIGBDQU5DRUxMRURgKVxuICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZSAoZS5nLiBlcnJvciBkZXRhaWxzKS4gRGVmYXVsdHMgdG8gYCd1bmtub3duJ2Agd2hlbiBvbWl0dGVkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgc3RhdGU6IFF1ZXJ5RXhlY3V0aW9uU3RhdGUsIHB1YmxpYyByZWFkb25seSByZWFzb246IHN0cmluZyA9ICd1bmtub3duJykge1xuICAgIHN1cGVyKGBBdGhlbmEgcXVlcnkgZXhlY3V0aW9uIGZhaWxlZCB3aXRoIHN0YXRlICR7c3RhdGV9OiAke3JlYXNvbn1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJTdGF0ZUVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGBHZXRRdWVyeUV4ZWN1dGlvbmAgcmVzcG9uc2UgbGFja3MgYFF1ZXJ5RXhlY3V0aW9uYCwgYFN0YXR1c2AsIG9yIGBTdGF0ZWAuXG4gKlxuICogQHByb3BlcnR5IGRldGFpbCBEZXNjcmlwdGlvbiBvZiB3aGljaCBwYXJ0IG9mIHRoZSByZXNwb25zZSB3YXMgbWlzc2luZ1xuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJNaXNzaW5nU3RhdGVFcnJvciBleHRlbmRzIEF0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyRXJyb3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGV0YWlsIFdoaWNoIHBhcnQgb2YgdGhlIHJlc3BvbnNlIHdhcyBtaXNzaW5nXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZGV0YWlsOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgQXRoZW5hIHF1ZXJ5IGV4ZWN1dGlvbiBzdGF0dXMgaXMgbWlzc2luZyBvciBpbmNvbXBsZXRlOiAke2RldGFpbH1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJNaXNzaW5nU3RhdGVFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBgU3RhdGVgIGlzIHByZXNlbnQgYnV0IG5vdCBhIGtub3duIHtAbGluayBRdWVyeUV4ZWN1dGlvblN0YXRlfSB2YWx1ZS5cbiAqXG4gKiBAcHJvcGVydHkgc3RhdGUgVW5zdXBwb3J0ZWQgc3RhdGUgc3RyaW5nIHJldHVybmVkIGJ5IEF0aGVuYVxuICovXG5leHBvcnQgY2xhc3MgQXRoZW5hUXVlcnlFeGVjdXRpb25XYWl0ZXJVbnN1cHBvcnRlZFN0YXRlRXJyb3IgZXh0ZW5kcyBBdGhlbmFRdWVyeUV4ZWN1dGlvbldhaXRlckVycm9yIHtcblxuICAvKipcbiAgICogQHBhcmFtIHN0YXRlIFVuc3VwcG9ydGVkIHN0YXRlIHN0cmluZyByZXR1cm5lZCBieSBBdGhlbmFcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBzdGF0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYEF0aGVuYSBxdWVyeSBleGVjdXRpb24gcmV0dXJuZWQgdW5zdXBwb3J0ZWQgc3RhdGU6ICR7c3RhdGV9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0F0aGVuYVF1ZXJ5RXhlY3V0aW9uV2FpdGVyVW5zdXBwb3J0ZWRTdGF0ZUVycm9yJztcbiAgfVxufVxuIl19
|
package/lib/wait-predicates.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { QueryExecutionState } from '@aws-sdk/client-athena';
|
|
2
|
-
/**
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Minimal `GetQueryExecution` response shape used while waiting.
|
|
4
|
+
* `State` may be an unknown string at runtime.
|
|
5
|
+
*/
|
|
6
|
+
export interface QueryExecutionWaitResponse {
|
|
4
7
|
QueryExecution?: {
|
|
5
8
|
Status?: {
|
|
6
9
|
State?: string;
|
|
@@ -8,8 +11,16 @@ export interface QueryExecutionPollResponse {
|
|
|
8
11
|
};
|
|
9
12
|
};
|
|
10
13
|
}
|
|
11
|
-
/**
|
|
12
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Result of classifying a single `GetQueryExecution` response during a wait.
|
|
16
|
+
*
|
|
17
|
+
* - `succeeded` — execution completed successfully
|
|
18
|
+
* - `failed` — execution ended in `FAILED` or `CANCELLED`
|
|
19
|
+
* - `continue` — execution is still in progress (`QUEUED` or `RUNNING`)
|
|
20
|
+
* - `missing` — required fields are absent from the response
|
|
21
|
+
* - `unsupported` — `State` is not a known {@link QueryExecutionState}
|
|
22
|
+
*/
|
|
23
|
+
export type QueryExecutionWaitOutcome = {
|
|
13
24
|
readonly kind: 'succeeded';
|
|
14
25
|
} | {
|
|
15
26
|
readonly kind: 'failed';
|
|
@@ -25,14 +36,16 @@ export type QueryExecutionPollOutcome = {
|
|
|
25
36
|
readonly state: string;
|
|
26
37
|
};
|
|
27
38
|
/**
|
|
28
|
-
* Classifies GetQueryExecution response for the waiter
|
|
39
|
+
* Classifies a `GetQueryExecution` response for the waiter loop.
|
|
29
40
|
*
|
|
30
|
-
* @param response GetQueryExecution API response (or subset)
|
|
31
|
-
* @returns How the waiter should proceed for this
|
|
41
|
+
* @param response `GetQueryExecution` API response (or a compatible subset)
|
|
42
|
+
* @returns How the waiter should proceed for this status check
|
|
32
43
|
*/
|
|
33
|
-
export declare const
|
|
44
|
+
export declare const classifyQueryExecutionWait: (response: QueryExecutionWaitResponse) => QueryExecutionWaitOutcome;
|
|
34
45
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
46
|
+
* Returns whether the waiter should perform another status check after the wait interval.
|
|
47
|
+
*
|
|
48
|
+
* @param outcome Outcome from {@link classifyQueryExecutionWait}
|
|
49
|
+
* @returns `true` when `outcome.kind` is `'continue'`; otherwise `false`
|
|
37
50
|
*/
|
|
38
|
-
export declare const
|
|
51
|
+
export declare const shouldContinueWaiting: (outcome: QueryExecutionWaitOutcome) => boolean;
|
package/lib/wait-predicates.js
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.shouldContinueWaiting = exports.classifyQueryExecutionWait = void 0;
|
|
4
4
|
const client_athena_1 = require("@aws-sdk/client-athena");
|
|
5
|
+
/** Execution states that require further waiting before a terminal outcome. */
|
|
5
6
|
const IN_PROGRESS_STATES = new Set([
|
|
6
7
|
client_athena_1.QueryExecutionState.QUEUED,
|
|
7
8
|
client_athena_1.QueryExecutionState.RUNNING,
|
|
8
9
|
]);
|
|
9
10
|
/**
|
|
10
|
-
* Classifies GetQueryExecution response for the waiter
|
|
11
|
+
* Classifies a `GetQueryExecution` response for the waiter loop.
|
|
11
12
|
*
|
|
12
|
-
* @param response GetQueryExecution API response (or subset)
|
|
13
|
-
* @returns How the waiter should proceed for this
|
|
13
|
+
* @param response `GetQueryExecution` API response (or a compatible subset)
|
|
14
|
+
* @returns How the waiter should proceed for this status check
|
|
14
15
|
*/
|
|
15
|
-
const
|
|
16
|
+
const classifyQueryExecutionWait = (response) => {
|
|
16
17
|
const queryExecution = response.QueryExecution;
|
|
17
18
|
if (queryExecution === undefined) {
|
|
18
19
|
return {
|
|
@@ -56,11 +57,13 @@ const classifyQueryExecutionPoll = (response) => {
|
|
|
56
57
|
}
|
|
57
58
|
return { kind: 'unsupported', state };
|
|
58
59
|
};
|
|
59
|
-
exports.
|
|
60
|
+
exports.classifyQueryExecutionWait = classifyQueryExecutionWait;
|
|
60
61
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
62
|
+
* Returns whether the waiter should perform another status check after the wait interval.
|
|
63
|
+
*
|
|
64
|
+
* @param outcome Outcome from {@link classifyQueryExecutionWait}
|
|
65
|
+
* @returns `true` when `outcome.kind` is `'continue'`; otherwise `false`
|
|
63
66
|
*/
|
|
64
|
-
const
|
|
65
|
-
exports.
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
const shouldContinueWaiting = (outcome) => outcome.kind === 'continue';
|
|
68
|
+
exports.shouldContinueWaiting = shouldContinueWaiting;
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC1wcmVkaWNhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dhaXQtcHJlZGljYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwREFBNkQ7QUFtQzdELCtFQUErRTtBQUMvRSxNQUFNLGtCQUFrQixHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUN0RCxtQ0FBbUIsQ0FBQyxNQUFNO0lBQzFCLG1DQUFtQixDQUFDLE9BQU87Q0FDNUIsQ0FBQyxDQUFDO0FBRUg7Ozs7O0dBS0c7QUFDSSxNQUFNLDBCQUEwQixHQUFHLENBQ3hDLFFBQW9DLEVBQ1QsRUFBRTtJQUM3QixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQy9DLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLE9BQU87WUFDTCxJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSwyREFBMkQ7U0FDcEUsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO0lBQ3JDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLE9BQU87WUFDTCxJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSxrQ0FBa0M7U0FDM0MsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzNCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE9BQU87WUFDTCxJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSx3Q0FBd0M7U0FDakQsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLEtBQUssS0FBSyxtQ0FBbUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QyxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLEtBQUssS0FBSyxtQ0FBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QyxPQUFPO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxLQUFLLEVBQUUsbUNBQW1CLENBQUMsTUFBTTtZQUNqQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixJQUFJLFNBQVM7U0FDOUMsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLEtBQUssS0FBSyxtQ0FBbUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QyxPQUFPO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxLQUFLLEVBQUUsbUNBQW1CLENBQUMsU0FBUztZQUNwQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixJQUFJLFNBQVM7U0FDOUMsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQW5EVyxRQUFBLDBCQUEwQiw4QkFtRHJDO0FBRUY7Ozs7O0dBS0c7QUFDSSxNQUFNLHFCQUFxQixHQUFHLENBQUMsT0FBa0MsRUFBVyxFQUFFLENBQ25GLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0FBRGpCLFFBQUEscUJBQXFCLHlCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUXVlcnlFeGVjdXRpb25TdGF0ZSB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hdGhlbmEnO1xuXG4vKipcbiAqIE1pbmltYWwgYEdldFF1ZXJ5RXhlY3V0aW9uYCByZXNwb25zZSBzaGFwZSB1c2VkIHdoaWxlIHdhaXRpbmcuXG4gKiBgU3RhdGVgIG1heSBiZSBhbiB1bmtub3duIHN0cmluZyBhdCBydW50aW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5RXhlY3V0aW9uV2FpdFJlc3BvbnNlIHtcbiAgUXVlcnlFeGVjdXRpb24/OiB7XG4gICAgU3RhdHVzPzoge1xuICAgICAgU3RhdGU/OiBzdHJpbmc7XG4gICAgICBTdGF0ZUNoYW5nZVJlYXNvbj86IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBjbGFzc2lmeWluZyBhIHNpbmdsZSBgR2V0UXVlcnlFeGVjdXRpb25gIHJlc3BvbnNlIGR1cmluZyBhIHdhaXQuXG4gKlxuICogLSBgc3VjY2VlZGVkYCDigJQgZXhlY3V0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAqIC0gYGZhaWxlZGAg4oCUIGV4ZWN1dGlvbiBlbmRlZCBpbiBgRkFJTEVEYCBvciBgQ0FOQ0VMTEVEYFxuICogLSBgY29udGludWVgIOKAlCBleGVjdXRpb24gaXMgc3RpbGwgaW4gcHJvZ3Jlc3MgKGBRVUVVRURgIG9yIGBSVU5OSU5HYClcbiAqIC0gYG1pc3NpbmdgIOKAlCByZXF1aXJlZCBmaWVsZHMgYXJlIGFic2VudCBmcm9tIHRoZSByZXNwb25zZVxuICogLSBgdW5zdXBwb3J0ZWRgIOKAlCBgU3RhdGVgIGlzIG5vdCBhIGtub3duIHtAbGluayBRdWVyeUV4ZWN1dGlvblN0YXRlfVxuICovXG5leHBvcnQgdHlwZSBRdWVyeUV4ZWN1dGlvbldhaXRPdXRjb21lID1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdzdWNjZWVkZWQnIH1cbiAgfCB7XG4gICAgcmVhZG9ubHkga2luZDogJ2ZhaWxlZCc7XG4gICAgcmVhZG9ubHkgc3RhdGU6IHR5cGVvZiBRdWVyeUV4ZWN1dGlvblN0YXRlLkZBSUxFRCB8IHR5cGVvZiBRdWVyeUV4ZWN1dGlvblN0YXRlLkNBTkNFTExFRDtcbiAgICByZWFkb25seSByZWFzb246IHN0cmluZztcbiAgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2NvbnRpbnVlJyB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnbWlzc2luZyc7IHJlYWRvbmx5IGRldGFpbDogc3RyaW5nIH1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICd1bnN1cHBvcnRlZCc7IHJlYWRvbmx5IHN0YXRlOiBzdHJpbmcgfTtcblxuLyoqIEV4ZWN1dGlvbiBzdGF0ZXMgdGhhdCByZXF1aXJlIGZ1cnRoZXIgd2FpdGluZyBiZWZvcmUgYSB0ZXJtaW5hbCBvdXRjb21lLiAqL1xuY29uc3QgSU5fUFJPR1JFU1NfU1RBVEVTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFF1ZXJ5RXhlY3V0aW9uU3RhdGUuUVVFVUVELFxuICBRdWVyeUV4ZWN1dGlvblN0YXRlLlJVTk5JTkcsXG5dKTtcblxuLyoqXG4gKiBDbGFzc2lmaWVzIGEgYEdldFF1ZXJ5RXhlY3V0aW9uYCByZXNwb25zZSBmb3IgdGhlIHdhaXRlciBsb29wLlxuICpcbiAqIEBwYXJhbSByZXNwb25zZSBgR2V0UXVlcnlFeGVjdXRpb25gIEFQSSByZXNwb25zZSAob3IgYSBjb21wYXRpYmxlIHN1YnNldClcbiAqIEByZXR1cm5zIEhvdyB0aGUgd2FpdGVyIHNob3VsZCBwcm9jZWVkIGZvciB0aGlzIHN0YXR1cyBjaGVja1xuICovXG5leHBvcnQgY29uc3QgY2xhc3NpZnlRdWVyeUV4ZWN1dGlvbldhaXQgPSAoXG4gIHJlc3BvbnNlOiBRdWVyeUV4ZWN1dGlvbldhaXRSZXNwb25zZSxcbik6IFF1ZXJ5RXhlY3V0aW9uV2FpdE91dGNvbWUgPT4ge1xuICBjb25zdCBxdWVyeUV4ZWN1dGlvbiA9IHJlc3BvbnNlLlF1ZXJ5RXhlY3V0aW9uO1xuICBpZiAocXVlcnlFeGVjdXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnbWlzc2luZycsXG4gICAgICBkZXRhaWw6ICdRdWVyeUV4ZWN1dGlvbiBpcyBtaXNzaW5nIGZyb20gR2V0UXVlcnlFeGVjdXRpb24gcmVzcG9uc2UnLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBzdGF0dXMgPSBxdWVyeUV4ZWN1dGlvbi5TdGF0dXM7XG4gIGlmIChzdGF0dXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnbWlzc2luZycsXG4gICAgICBkZXRhaWw6ICdRdWVyeUV4ZWN1dGlvbi5TdGF0dXMgaXMgbWlzc2luZycsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlID0gc3RhdHVzLlN0YXRlO1xuICBpZiAoc3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnbWlzc2luZycsXG4gICAgICBkZXRhaWw6ICdRdWVyeUV4ZWN1dGlvbi5TdGF0dXMuU3RhdGUgaXMgbWlzc2luZycsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChzdGF0ZSA9PT0gUXVlcnlFeGVjdXRpb25TdGF0ZS5TVUNDRUVERUQpIHtcbiAgICByZXR1cm4geyBraW5kOiAnc3VjY2VlZGVkJyB9O1xuICB9XG5cbiAgaWYgKHN0YXRlID09PSBRdWVyeUV4ZWN1dGlvblN0YXRlLkZBSUxFRCkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnZmFpbGVkJyxcbiAgICAgIHN0YXRlOiBRdWVyeUV4ZWN1dGlvblN0YXRlLkZBSUxFRCxcbiAgICAgIHJlYXNvbjogc3RhdHVzLlN0YXRlQ2hhbmdlUmVhc29uID8/ICd1bmtub3duJyxcbiAgICB9O1xuICB9XG4gIGlmIChzdGF0ZSA9PT0gUXVlcnlFeGVjdXRpb25TdGF0ZS5DQU5DRUxMRUQpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ2ZhaWxlZCcsXG4gICAgICBzdGF0ZTogUXVlcnlFeGVjdXRpb25TdGF0ZS5DQU5DRUxMRUQsXG4gICAgICByZWFzb246IHN0YXR1cy5TdGF0ZUNoYW5nZVJlYXNvbiA/PyAndW5rbm93bicsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChJTl9QUk9HUkVTU19TVEFURVMuaGFzKHN0YXRlKSkge1xuICAgIHJldHVybiB7IGtpbmQ6ICdjb250aW51ZScgfTtcbiAgfVxuXG4gIHJldHVybiB7IGtpbmQ6ICd1bnN1cHBvcnRlZCcsIHN0YXRlIH07XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgd2FpdGVyIHNob3VsZCBwZXJmb3JtIGFub3RoZXIgc3RhdHVzIGNoZWNrIGFmdGVyIHRoZSB3YWl0IGludGVydmFsLlxuICpcbiAqIEBwYXJhbSBvdXRjb21lIE91dGNvbWUgZnJvbSB7QGxpbmsgY2xhc3NpZnlRdWVyeUV4ZWN1dGlvbldhaXR9XG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiBgb3V0Y29tZS5raW5kYCBpcyBgJ2NvbnRpbnVlJ2A7IG90aGVyd2lzZSBgZmFsc2VgXG4gKi9cbmV4cG9ydCBjb25zdCBzaG91bGRDb250aW51ZVdhaXRpbmcgPSAob3V0Y29tZTogUXVlcnlFeGVjdXRpb25XYWl0T3V0Y29tZSk6IGJvb2xlYW4gPT5cbiAgb3V0Y29tZS5raW5kID09PSAnY29udGludWUnO1xuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "athena-query-execution-waiter",
|
|
3
|
-
"description": "A small library that waits for an AWS Athena query execution to complete. It
|
|
3
|
+
"description": "A small library that waits for an AWS Athena query execution to complete. It repeatedly checks the Athena API until the execution reaches a terminal state: SUCCEEDED, FAILED, or CANCELLED.",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/gammarers-aws-sdk-extensions/athena-query-execution-waiter.git"
|
|
@@ -64,8 +64,7 @@
|
|
|
64
64
|
},
|
|
65
65
|
"devEngines": {
|
|
66
66
|
"packageManager": {
|
|
67
|
-
"name": "
|
|
68
|
-
"version": "1.22.22",
|
|
67
|
+
"name": "npm",
|
|
69
68
|
"onFail": "ignore"
|
|
70
69
|
}
|
|
71
70
|
},
|
|
@@ -74,7 +73,7 @@
|
|
|
74
73
|
"publishConfig": {
|
|
75
74
|
"access": "public"
|
|
76
75
|
},
|
|
77
|
-
"version": "0.
|
|
76
|
+
"version": "0.6.0",
|
|
78
77
|
"jest": {
|
|
79
78
|
"coverageProvider": "v8",
|
|
80
79
|
"testMatch": [
|
|
@@ -121,6 +120,5 @@
|
|
|
121
120
|
}
|
|
122
121
|
},
|
|
123
122
|
"types": "lib/index.d.ts",
|
|
124
|
-
"packageManager": "yarn@1.22.22",
|
|
125
123
|
"//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\"."
|
|
126
124
|
}
|