athena-query-execution-waiter 0.5.7 → 0.6.1

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
@@ -3,13 +3,13 @@
3
3
  [![npm version](https://img.shields.io/npm/v/athena-query-execution-waiter.svg)](https://www.npmjs.com/package/athena-query-execution-waiter)
4
4
  [![License](https://img.shields.io/npm/l/athena-query-execution-waiter.svg)](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 polls the Athena API until the execution reaches a terminal state: **SUCCEEDED**, **FAILED**, or **CANCELLED**.
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
- - Polls `GetQueryExecution` until the run finishes or an **overall wall-clock timeout** is exceeded (separate from **polling interval**).
11
- - Configurable **overall timeout** and **poll spacing** via `wait()` options; default overall cap is **`DEFAULT_TIMEOUT_MS`** (2 minutes).
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 polling interval
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 Athena is polled. |
72
- | **`pollIntervalMs`** | Delay **between** `GetQueryExecution` calls. Independent of the overall timeout; a long poll interval still respects `waitOptions.timeoutMs` / `DEFAULT_TIMEOUT_MS`. |
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 polling interval is **1 second**. Increase it to reduce API calls (constructor or per `wait()`):
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, { pollIntervalMs: 5000 });
85
+ const waiter = new AthenaQueryExecutionWaiter(client, { waitIntervalMs: 5000 });
86
86
 
87
87
  const state = await waiter.wait(queryExecutionId, {
88
88
  timeoutMs: 60_000,
89
- pollIntervalMs: 3000,
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
- | `pollIntervalMs` | `number` (optional) | Default milliseconds **between** `GetQueryExecution` calls when `wait()` omits `pollIntervalMs`. Default: `1000`. |
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
- | `pollIntervalMs` | `number` (optional) | Milliseconds **between** polls for this call. Default: constructor’s `pollIntervalMs` or `1000`. |
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; no polling until timeout).
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 poll.
134
- - **`AthenaQueryExecutionWaiterUnsupportedStateError`** — `State` is not one of the known values (`QUEUED`, `RUNNING`, `SUCCEEDED`, `FAILED`, `CANCELLED`). Property: `state`. Fails on the first poll.
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 polls (`pollIntervalMs`).
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
- /** Options for AthenaQueryExecutionWaiter constructor. */
15
+ /** Constructor options for {@link AthenaQueryExecutionWaiter}. */
16
16
  export interface AthenaQueryExecutionWaiterOptions {
17
17
  /**
18
- * Polling interval in milliseconds.
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 DEFAULT_POLL_INTERVAL_MS (1000) when omitted.
21
+ * Defaults to `1000` when omitted.
21
22
  */
22
- pollIntervalMs?: number;
23
+ waitIntervalMs?: number;
23
24
  }
24
- /** Options for wait(). */
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 polls.
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
- * Polling interval in milliseconds for this wait.
34
- * Overrides the waiter's default poll interval when specified.
34
+ * Wait interval in milliseconds between status checks for this wait.
35
+ * Overrides the waiter's default wait interval when specified.
35
36
  */
36
- pollIntervalMs?: number;
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 complete.
40
- * Polls execution status until it becomes SUCCEEDED, FAILED, or CANCELLED.
41
- * Overall time is bounded by `waitOptions.timeoutMs` (or {@link DEFAULT_TIMEOUT_MS});
42
- * spacing between polls is controlled separately by `pollIntervalMs`.
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 defaultPollIntervalMs;
55
+ private readonly defaultWaitIntervalMs;
47
56
  /**
48
57
  * @param client Athena API client
49
- * @param options Optional settings (e.g. pollIntervalMs)
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 (or fails/cancels).
62
+ * Waits until the given query execution completes, fails, or is cancelled.
54
63
  *
55
- * @param queryExecutionId Query execution ID to wait for
56
- * @param waitOptions Optional per-call settings (`timeoutMs`, `pollIntervalMs`)
57
- * @returns Execution state on success (SUCCEEDED)
58
- * @throws AthenaQueryExecutionWaiterTimeoutError On timeout
59
- * @throws AthenaQueryExecutionWaiterStateError When state is FAILED or CANCELLED
60
- * @throws AthenaQueryExecutionWaiterMissingStateError When QueryExecution or Status.State is missing
61
- * @throws AthenaQueryExecutionWaiterUnsupportedStateError When state is not a known QueryExecutionState
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 for query execution times out.
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, Status, or State.
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 polling interval (milliseconds) for query execution status. */
7
- const DEFAULT_POLL_INTERVAL_MS = 1000;
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 polls (`pollIntervalMs`).
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
- * Waits for Athena query execution to complete.
23
- * Polls execution status until it becomes SUCCEEDED, FAILED, or CANCELLED.
24
- * Overall time is bounded by `waitOptions.timeoutMs` (or {@link DEFAULT_TIMEOUT_MS});
25
- * spacing between polls is controlled separately by `pollIntervalMs`.
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. pollIntervalMs)
68
+ * @param options Optional settings (e.g. waitIntervalMs)
31
69
  */
32
70
  constructor(client, options) {
33
71
  this.client = client;
34
- this.defaultPollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
72
+ this.defaultWaitIntervalMs = options?.waitIntervalMs ?? DEFAULT_WAIT_INTERVAL_MS;
35
73
  }
36
74
  /**
37
- * Waits until the given query execution completes (or fails/cancels).
75
+ * Waits until the given query execution completes, fails, or is cancelled.
38
76
  *
39
- * @param queryExecutionId Query execution ID to wait for
40
- * @param waitOptions Optional per-call settings (`timeoutMs`, `pollIntervalMs`)
41
- * @returns Execution state on success (SUCCEEDED)
42
- * @throws AthenaQueryExecutionWaiterTimeoutError On timeout
43
- * @throws AthenaQueryExecutionWaiterStateError When state is FAILED or CANCELLED
44
- * @throws AthenaQueryExecutionWaiterMissingStateError When QueryExecution or Status.State is missing
45
- * @throws AthenaQueryExecutionWaiterUnsupportedStateError When state is not a known QueryExecutionState
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 pollIntervalMs = waitOptions?.pollIntervalMs ?? this.defaultPollIntervalMs;
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
- const outcome = (0, wait_predicates_1.classifyQueryExecutionPoll)(res);
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 new Promise((r) => setTimeout(r, pollIntervalMs));
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 for query execution times out.
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, Status, or State.
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
@@ -1,6 +1,9 @@
1
1
  import { QueryExecutionState } from '@aws-sdk/client-athena';
2
- /** Minimal GetQueryExecution shape used for polling (State may be unknown at runtime). */
3
- export interface QueryExecutionPollResponse {
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
- /** Result of classifying a single GetQueryExecution poll. */
12
- export type QueryExecutionPollOutcome = {
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 poll loop.
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 poll
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 classifyQueryExecutionPoll: (response: QueryExecutionPollResponse) => QueryExecutionPollOutcome;
44
+ export declare const classifyQueryExecutionWait: (response: QueryExecutionWaitResponse) => QueryExecutionWaitOutcome;
34
45
  /**
35
- * @param outcome Outcome from {@link classifyQueryExecutionPoll}
36
- * @returns Whether the waiter should poll again after the interval
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 shouldContinuePolling: (outcome: QueryExecutionPollOutcome) => boolean;
51
+ export declare const shouldContinueWaiting: (outcome: QueryExecutionWaitOutcome) => boolean;
@@ -1,18 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.shouldContinuePolling = exports.classifyQueryExecutionPoll = void 0;
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 poll loop.
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 poll
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 classifyQueryExecutionPoll = (response) => {
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.classifyQueryExecutionPoll = classifyQueryExecutionPoll;
60
+ exports.classifyQueryExecutionWait = classifyQueryExecutionWait;
60
61
  /**
61
- * @param outcome Outcome from {@link classifyQueryExecutionPoll}
62
- * @returns Whether the waiter should poll again after the interval
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 shouldContinuePolling = (outcome) => outcome.kind === 'continue';
65
- exports.shouldContinuePolling = shouldContinuePolling;
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC1wcmVkaWNhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dhaXQtcHJlZGljYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwREFBNkQ7QUF3QjdELE1BQU0sa0JBQWtCLEdBQXdCLElBQUksR0FBRyxDQUFDO0lBQ3RELG1DQUFtQixDQUFDLE1BQU07SUFDMUIsbUNBQW1CLENBQUMsT0FBTztDQUM1QixDQUFDLENBQUM7QUFFSDs7Ozs7R0FLRztBQUNJLE1BQU0sMEJBQTBCLEdBQUcsQ0FDeEMsUUFBb0MsRUFDVCxFQUFFO0lBQzdCLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUM7SUFDL0MsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDakMsT0FBTztZQUNMLElBQUksRUFBRSxTQUFTO1lBQ2YsTUFBTSxFQUFFLDJEQUEyRDtTQUNwRSxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUM7SUFDckMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekIsT0FBTztZQUNMLElBQUksRUFBRSxTQUFTO1lBQ2YsTUFBTSxFQUFFLGtDQUFrQztTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEIsT0FBTztZQUNMLElBQUksRUFBRSxTQUFTO1lBQ2YsTUFBTSxFQUFFLHdDQUF3QztTQUNqRCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksS0FBSyxLQUFLLG1DQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVDLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksS0FBSyxLQUFLLG1DQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pDLE9BQU87WUFDTCxJQUFJLEVBQUUsUUFBUTtZQUNkLEtBQUssRUFBRSxtQ0FBbUIsQ0FBQyxNQUFNO1lBQ2pDLE1BQU0sRUFBRSxNQUFNLENBQUMsaUJBQWlCLElBQUksU0FBUztTQUM5QyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksS0FBSyxLQUFLLG1DQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVDLE9BQU87WUFDTCxJQUFJLEVBQUUsUUFBUTtZQUNkLEtBQUssRUFBRSxtQ0FBbUIsQ0FBQyxTQUFTO1lBQ3BDLE1BQU0sRUFBRSxNQUFNLENBQUMsaUJBQWlCLElBQUksU0FBUztTQUM5QyxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDeEMsQ0FBQyxDQUFDO0FBbkRXLFFBQUEsMEJBQTBCLDhCQW1EckM7QUFFRjs7O0dBR0c7QUFDSSxNQUFNLHFCQUFxQixHQUFHLENBQUMsT0FBa0MsRUFBVyxFQUFFLENBQ25GLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0FBRGpCLFFBQUEscUJBQXFCLHlCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUXVlcnlFeGVjdXRpb25TdGF0ZSB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1hdGhlbmEnO1xuXG4vKiogTWluaW1hbCBHZXRRdWVyeUV4ZWN1dGlvbiBzaGFwZSB1c2VkIGZvciBwb2xsaW5nIChTdGF0ZSBtYXkgYmUgdW5rbm93biBhdCBydW50aW1lKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlFeGVjdXRpb25Qb2xsUmVzcG9uc2Uge1xuICBRdWVyeUV4ZWN1dGlvbj86IHtcbiAgICBTdGF0dXM/OiB7XG4gICAgICBTdGF0ZT86IHN0cmluZztcbiAgICAgIFN0YXRlQ2hhbmdlUmVhc29uPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cbi8qKiBSZXN1bHQgb2YgY2xhc3NpZnlpbmcgYSBzaW5nbGUgR2V0UXVlcnlFeGVjdXRpb24gcG9sbC4gKi9cbmV4cG9ydCB0eXBlIFF1ZXJ5RXhlY3V0aW9uUG9sbE91dGNvbWUgPVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3N1Y2NlZWRlZCcgfVxuICB8IHtcbiAgICByZWFkb25seSBraW5kOiAnZmFpbGVkJztcbiAgICByZWFkb25seSBzdGF0ZTogdHlwZW9mIFF1ZXJ5RXhlY3V0aW9uU3RhdGUuRkFJTEVEIHwgdHlwZW9mIFF1ZXJ5RXhlY3V0aW9uU3RhdGUuQ0FOQ0VMTEVEO1xuICAgIHJlYWRvbmx5IHJlYXNvbjogc3RyaW5nO1xuICB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnY29udGludWUnIH1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdtaXNzaW5nJzsgcmVhZG9ubHkgZGV0YWlsOiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3Vuc3VwcG9ydGVkJzsgcmVhZG9ubHkgc3RhdGU6IHN0cmluZyB9O1xuXG5jb25zdCBJTl9QUk9HUkVTU19TVEFURVM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgUXVlcnlFeGVjdXRpb25TdGF0ZS5RVUVVRUQsXG4gIFF1ZXJ5RXhlY3V0aW9uU3RhdGUuUlVOTklORyxcbl0pO1xuXG4vKipcbiAqIENsYXNzaWZpZXMgR2V0UXVlcnlFeGVjdXRpb24gcmVzcG9uc2UgZm9yIHRoZSB3YWl0ZXIgcG9sbCBsb29wLlxuICpcbiAqIEBwYXJhbSByZXNwb25zZSBHZXRRdWVyeUV4ZWN1dGlvbiBBUEkgcmVzcG9uc2UgKG9yIHN1YnNldClcbiAqIEByZXR1cm5zIEhvdyB0aGUgd2FpdGVyIHNob3VsZCBwcm9jZWVkIGZvciB0aGlzIHBvbGxcbiAqL1xuZXhwb3J0IGNvbnN0IGNsYXNzaWZ5UXVlcnlFeGVjdXRpb25Qb2xsID0gKFxuICByZXNwb25zZTogUXVlcnlFeGVjdXRpb25Qb2xsUmVzcG9uc2UsXG4pOiBRdWVyeUV4ZWN1dGlvblBvbGxPdXRjb21lID0+IHtcbiAgY29uc3QgcXVlcnlFeGVjdXRpb24gPSByZXNwb25zZS5RdWVyeUV4ZWN1dGlvbjtcbiAgaWYgKHF1ZXJ5RXhlY3V0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ21pc3NpbmcnLFxuICAgICAgZGV0YWlsOiAnUXVlcnlFeGVjdXRpb24gaXMgbWlzc2luZyBmcm9tIEdldFF1ZXJ5RXhlY3V0aW9uIHJlc3BvbnNlJyxcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qgc3RhdHVzID0gcXVlcnlFeGVjdXRpb24uU3RhdHVzO1xuICBpZiAoc3RhdHVzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ21pc3NpbmcnLFxuICAgICAgZGV0YWlsOiAnUXVlcnlFeGVjdXRpb24uU3RhdHVzIGlzIG1pc3NpbmcnLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IHN0YXR1cy5TdGF0ZTtcbiAgaWYgKHN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ21pc3NpbmcnLFxuICAgICAgZGV0YWlsOiAnUXVlcnlFeGVjdXRpb24uU3RhdHVzLlN0YXRlIGlzIG1pc3NpbmcnLFxuICAgIH07XG4gIH1cblxuICBpZiAoc3RhdGUgPT09IFF1ZXJ5RXhlY3V0aW9uU3RhdGUuU1VDQ0VFREVEKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ3N1Y2NlZWRlZCcgfTtcbiAgfVxuXG4gIGlmIChzdGF0ZSA9PT0gUXVlcnlFeGVjdXRpb25TdGF0ZS5GQUlMRUQpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogJ2ZhaWxlZCcsXG4gICAgICBzdGF0ZTogUXVlcnlFeGVjdXRpb25TdGF0ZS5GQUlMRUQsXG4gICAgICByZWFzb246IHN0YXR1cy5TdGF0ZUNoYW5nZVJlYXNvbiA/PyAndW5rbm93bicsXG4gICAgfTtcbiAgfVxuICBpZiAoc3RhdGUgPT09IFF1ZXJ5RXhlY3V0aW9uU3RhdGUuQ0FOQ0VMTEVEKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdmYWlsZWQnLFxuICAgICAgc3RhdGU6IFF1ZXJ5RXhlY3V0aW9uU3RhdGUuQ0FOQ0VMTEVELFxuICAgICAgcmVhc29uOiBzdGF0dXMuU3RhdGVDaGFuZ2VSZWFzb24gPz8gJ3Vua25vd24nLFxuICAgIH07XG4gIH1cblxuICBpZiAoSU5fUFJPR1JFU1NfU1RBVEVTLmhhcyhzdGF0ZSkpIHtcbiAgICByZXR1cm4geyBraW5kOiAnY29udGludWUnIH07XG4gIH1cblxuICByZXR1cm4geyBraW5kOiAndW5zdXBwb3J0ZWQnLCBzdGF0ZSB9O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gb3V0Y29tZSBPdXRjb21lIGZyb20ge0BsaW5rIGNsYXNzaWZ5UXVlcnlFeGVjdXRpb25Qb2xsfVxuICogQHJldHVybnMgV2hldGhlciB0aGUgd2FpdGVyIHNob3VsZCBwb2xsIGFnYWluIGFmdGVyIHRoZSBpbnRlcnZhbFxuICovXG5leHBvcnQgY29uc3Qgc2hvdWxkQ29udGludWVQb2xsaW5nID0gKG91dGNvbWU6IFF1ZXJ5RXhlY3V0aW9uUG9sbE91dGNvbWUpOiBib29sZWFuID0+XG4gIG91dGNvbWUua2luZCA9PT0gJ2NvbnRpbnVlJztcbiJdfQ==
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 polls the Athena API until the execution reaches a terminal state: SUCCEEDED, FAILED, or CANCELLED.",
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"
@@ -43,7 +43,7 @@
43
43
  "eslint-plugin-import": "^2.32.0",
44
44
  "jest": "^30.4.2",
45
45
  "jest-junit": "^17",
46
- "projen": "^0.101.4",
46
+ "projen": "^0.101.11",
47
47
  "ts-jest": "^29.4.11",
48
48
  "ts-node": "^10.9.2",
49
49
  "typescript": "5.9.x"
@@ -64,8 +64,7 @@
64
64
  },
65
65
  "devEngines": {
66
66
  "packageManager": {
67
- "name": "yarn",
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.5.7",
76
+ "version": "0.6.1",
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
  }