sqs-partial-batch-processor 0.2.6 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -5
- package/lib/index.d.ts +38 -6
- package/lib/index.js +41 -3
- package/package.json +4 -5
package/README.md
CHANGED
|
@@ -12,13 +12,15 @@ This library intentionally does **not** parse message bodies, validate schemas,
|
|
|
12
12
|
|
|
13
13
|
- Implements Lambda SQS **partial batch response** pattern (only failed messages are retried).
|
|
14
14
|
- Per-record error boundary (failures are isolated to each record).
|
|
15
|
-
- Aggregates failed `
|
|
16
|
-
-
|
|
15
|
+
- Aggregates failed identifiers into `batchItemFailures` (defaults to `messageId`).
|
|
16
|
+
- Throw-style (`processPartialBatch`) and Result-style (`processPartialBatchWithResult`) APIs.
|
|
17
|
+
- Optional bounded concurrency (`concurrency`), error hook (`onRecordError`), and custom `itemIdentifier` mapping (`mapMessageId`).
|
|
18
|
+
- For `{ ok: false }`, `onRecordError` receives an `Error` that includes the resolved `itemIdentifier` (message and `cause`) for easier debugging.
|
|
17
19
|
|
|
18
20
|
## Requirements
|
|
19
21
|
|
|
20
22
|
- Node.js **20+** (runtime requirement)
|
|
21
|
-
- Module system: published as **CommonJS** (`"
|
|
23
|
+
- Module system: published as **CommonJS** (`"main": "lib/index.js"`). Usable from both CJS and ESM runtimes.
|
|
22
24
|
- Lambda SQS event source mapping has **Report batch item failures** enabled.
|
|
23
25
|
See: [AWS Lambda SQS error handling docs](https://docs.aws.amazon.com/lambda/latest/dg/services-sqs-errorhandling.html#services-sqs-batchfailurereporting)
|
|
24
26
|
|
|
@@ -34,6 +36,8 @@ yarn add sqs-partial-batch-processor
|
|
|
34
36
|
|
|
35
37
|
## Usage
|
|
36
38
|
|
|
39
|
+
Throw to mark a record as failed:
|
|
40
|
+
|
|
37
41
|
```ts
|
|
38
42
|
import type { SQSEvent } from 'aws-lambda';
|
|
39
43
|
import { processPartialBatch } from 'sqs-partial-batch-processor';
|
|
@@ -68,6 +72,8 @@ Both `processPartialBatch` and `processPartialBatchWithResult` accept an optiona
|
|
|
68
72
|
- **Tip**: start with `1` and increase gradually while watching downstream limits (external API rate limits, DB connection pools, and Lambda reserved concurrency). SQS batches are typically small, so a large value rarely helps.
|
|
69
73
|
- **Note**: when `concurrency > 1`, the order of `batchItemFailures` is **not guaranteed**. Tests should compare as a set, not by array order.
|
|
70
74
|
- `onRecordError?: (record, error) => void`: called when a record is treated as failed (useful for structured logs / metrics).
|
|
75
|
+
- **Caution**: do **not** log `record.body` as-is in `onRecordError`. Message bodies often contain secrets or personal data. Prefer `messageId` / your `mapMessageId` result and a sanitized error summary.
|
|
76
|
+
- When `processPartialBatchWithResult` receives `{ ok: false }`, the hook gets an `Error` whose message (and `cause.itemIdentifier`) includes the resolved `itemIdentifier` for easier debugging.
|
|
71
77
|
- Example (structured log / metrics hook):
|
|
72
78
|
|
|
73
79
|
```ts
|
|
@@ -86,7 +92,7 @@ export const handler = async (event: SQSEvent) =>
|
|
|
86
92
|
level: 'error',
|
|
87
93
|
msg: 'record failed',
|
|
88
94
|
messageId: record.messageId,
|
|
89
|
-
//
|
|
95
|
+
// Do not log record.body — it may contain secrets or PII.
|
|
90
96
|
error: error instanceof Error ? { name: error.name, message: error.message } : { message: String(error) },
|
|
91
97
|
}));
|
|
92
98
|
},
|
|
@@ -99,4 +105,4 @@ export const handler = async (event: SQSEvent) =>
|
|
|
99
105
|
|
|
100
106
|
## License
|
|
101
107
|
|
|
102
|
-
This project is licensed under the
|
|
108
|
+
This project is licensed under the Apache-2.0 License.
|
package/lib/index.d.ts
CHANGED
|
@@ -7,32 +7,64 @@ export interface ProcessPartialBatchOptions {
|
|
|
7
7
|
* Maximum number of records processed in parallel.
|
|
8
8
|
*
|
|
9
9
|
* - `1`: sequential processing
|
|
10
|
-
* - `> 1`: bounded concurrency pool (order of
|
|
10
|
+
* - `> 1`: bounded concurrency pool (order of {@link SQSBatchResponse.batchItemFailures} is not guaranteed)
|
|
11
11
|
*
|
|
12
|
+
* @default 1
|
|
12
13
|
* @throws {RangeError} When `concurrency` is less than 1.
|
|
13
14
|
* @throws {TypeError} When `concurrency` is not a finite integer.
|
|
14
|
-
* Order of entries in {@link SQSBatchResponse.batchItemFailures} is not guaranteed.
|
|
15
|
-
* @default 1
|
|
16
15
|
*/
|
|
17
16
|
readonly concurrency?: number;
|
|
18
17
|
/**
|
|
19
18
|
* Called when a record is treated as failed (thrown error or `{ ok: false }`).
|
|
20
|
-
* Use for logging; the library does not write to `console` by default.
|
|
19
|
+
* Use for logging or metrics; the library does not write to `console` by default.
|
|
20
|
+
*
|
|
21
|
+
* For `{ ok: false }` from {@link processPartialBatchWithResult}, `error` is an `Error`
|
|
22
|
+
* whose message includes the resolved `itemIdentifier`, and whose `cause` is
|
|
23
|
+
* `{ itemIdentifier }` for structured logging.
|
|
24
|
+
*
|
|
25
|
+
* Do not log `record.body` as-is — it may contain secrets or personal data.
|
|
26
|
+
* Prefer identifiers such as `record.messageId` (or your `mapMessageId` result)
|
|
27
|
+
* and a sanitized error summary.
|
|
28
|
+
*
|
|
29
|
+
* @param record The failed SQS record.
|
|
30
|
+
* @param error The thrown value, or a synthesized `Error` when `{ ok: false }` was returned.
|
|
21
31
|
*/
|
|
22
32
|
readonly onRecordError?: (record: SQSRecord, error: unknown) => void;
|
|
23
33
|
/**
|
|
24
|
-
* Returns the
|
|
34
|
+
* Returns the `itemIdentifier` reported in `batchItemFailures` for a record.
|
|
35
|
+
* Defaults to `record.messageId` when omitted.
|
|
36
|
+
*
|
|
37
|
+
* @param record The SQS record being processed.
|
|
38
|
+
* @returns The identifier sent back to Lambda in `batchItemFailures`.
|
|
25
39
|
*/
|
|
26
40
|
readonly mapMessageId?: (record: SQSRecord) => string;
|
|
27
41
|
}
|
|
28
42
|
/**
|
|
29
43
|
* Runs `processRecord` for each SQS record. Thrown errors are mapped to
|
|
30
44
|
* `batchItemFailures`; successful records are not listed.
|
|
45
|
+
*
|
|
46
|
+
* @param event The SQS Lambda event.
|
|
47
|
+
* @param processRecord Per-record handler. Throw to mark only that record as failed.
|
|
48
|
+
* @param options Optional concurrency, error hook, and message id mapping.
|
|
49
|
+
* @returns An {@link SQSBatchResponse} listing only failed `itemIdentifier`s.
|
|
50
|
+
* @throws {RangeError} When `options.concurrency` is less than 1.
|
|
51
|
+
* @throws {TypeError} When `options.concurrency` is not a finite integer.
|
|
31
52
|
*/
|
|
32
53
|
export declare const processPartialBatch: (event: SQSEvent, processRecord: (record: SQSRecord) => Promise<void>, options?: ProcessPartialBatchOptions) => Promise<SQSBatchResponse>;
|
|
33
54
|
/**
|
|
34
55
|
* Like {@link processPartialBatch}, but uses a Result-style callback (no throw for control flow).
|
|
35
|
-
*
|
|
56
|
+
*
|
|
57
|
+
* - `{ ok: true }`: success (not listed in `batchItemFailures`)
|
|
58
|
+
* - `{ ok: false }`: failure; if `onRecordError` is set, it receives an `Error` whose
|
|
59
|
+
* message includes the resolved `itemIdentifier`, and whose `cause` is `{ itemIdentifier }`
|
|
60
|
+
* - thrown errors: still treated as failures; `onRecordError` receives the thrown value when set
|
|
61
|
+
*
|
|
62
|
+
* @param event The SQS Lambda event.
|
|
63
|
+
* @param processRecord Per-record handler returning `{ ok: true }` or `{ ok: false }`.
|
|
64
|
+
* @param options Optional concurrency, error hook, and message id mapping.
|
|
65
|
+
* @returns An {@link SQSBatchResponse} listing only failed `itemIdentifier`s.
|
|
66
|
+
* @throws {RangeError} When `options.concurrency` is less than 1.
|
|
67
|
+
* @throws {TypeError} When `options.concurrency` is not a finite integer.
|
|
36
68
|
*/
|
|
37
69
|
export declare const processPartialBatchWithResult: (event: SQSEvent, processRecord: (record: SQSRecord) => Promise<{
|
|
38
70
|
ok: true;
|
package/lib/index.js
CHANGED
|
@@ -3,7 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.processPartialBatchWithResult = exports.processPartialBatch = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Creates a single `batchItemFailures` entry for a failed record.
|
|
6
|
+
*
|
|
6
7
|
* @param itemIdentifier The identifier reported back to Lambda.
|
|
8
|
+
* @returns An object suitable for {@link SQSBatchResponse.batchItemFailures}.
|
|
7
9
|
*/
|
|
8
10
|
const itemFailure = (itemIdentifier) => ({
|
|
9
11
|
itemIdentifier,
|
|
@@ -35,6 +37,7 @@ const resolveConcurrency = (value) => {
|
|
|
35
37
|
* @param items Items to process.
|
|
36
38
|
* @param concurrency Maximum parallel workers (must be `>= 1`).
|
|
37
39
|
* @param fn Async handler invoked for each item.
|
|
40
|
+
* @returns A promise that resolves when every item has been processed.
|
|
38
41
|
*/
|
|
39
42
|
const runWithConcurrency = async (items, concurrency, fn) => {
|
|
40
43
|
if (items.length === 0) {
|
|
@@ -42,6 +45,11 @@ const runWithConcurrency = async (items, concurrency, fn) => {
|
|
|
42
45
|
}
|
|
43
46
|
const limit = Math.min(concurrency, items.length);
|
|
44
47
|
let next = 0;
|
|
48
|
+
/**
|
|
49
|
+
* Claims the next work index, or `undefined` when the queue is empty.
|
|
50
|
+
*
|
|
51
|
+
* @returns The next index to process, or `undefined` if none remain.
|
|
52
|
+
*/
|
|
45
53
|
const takeNextIndex = () => {
|
|
46
54
|
const index = next;
|
|
47
55
|
next += 1;
|
|
@@ -69,10 +77,22 @@ const runWithConcurrency = async (items, concurrency, fn) => {
|
|
|
69
77
|
/**
|
|
70
78
|
* Runs `processRecord` for each SQS record. Thrown errors are mapped to
|
|
71
79
|
* `batchItemFailures`; successful records are not listed.
|
|
80
|
+
*
|
|
81
|
+
* @param event The SQS Lambda event.
|
|
82
|
+
* @param processRecord Per-record handler. Throw to mark only that record as failed.
|
|
83
|
+
* @param options Optional concurrency, error hook, and message id mapping.
|
|
84
|
+
* @returns An {@link SQSBatchResponse} listing only failed `itemIdentifier`s.
|
|
85
|
+
* @throws {RangeError} When `options.concurrency` is less than 1.
|
|
86
|
+
* @throws {TypeError} When `options.concurrency` is not a finite integer.
|
|
72
87
|
*/
|
|
73
88
|
const processPartialBatch = async (event, processRecord, options) => {
|
|
74
89
|
const concurrency = resolveConcurrency(options?.concurrency);
|
|
75
90
|
const batchItemFailures = [];
|
|
91
|
+
/**
|
|
92
|
+
* Processes one record and records a batch item failure on error.
|
|
93
|
+
*
|
|
94
|
+
* @param record The SQS record to process.
|
|
95
|
+
*/
|
|
76
96
|
const handle = async (record) => {
|
|
77
97
|
const id = options?.mapMessageId?.(record) ?? record.messageId;
|
|
78
98
|
try {
|
|
@@ -98,11 +118,27 @@ const processPartialBatch = async (event, processRecord, options) => {
|
|
|
98
118
|
exports.processPartialBatch = processPartialBatch;
|
|
99
119
|
/**
|
|
100
120
|
* Like {@link processPartialBatch}, but uses a Result-style callback (no throw for control flow).
|
|
101
|
-
*
|
|
121
|
+
*
|
|
122
|
+
* - `{ ok: true }`: success (not listed in `batchItemFailures`)
|
|
123
|
+
* - `{ ok: false }`: failure; if `onRecordError` is set, it receives an `Error` whose
|
|
124
|
+
* message includes the resolved `itemIdentifier`, and whose `cause` is `{ itemIdentifier }`
|
|
125
|
+
* - thrown errors: still treated as failures; `onRecordError` receives the thrown value when set
|
|
126
|
+
*
|
|
127
|
+
* @param event The SQS Lambda event.
|
|
128
|
+
* @param processRecord Per-record handler returning `{ ok: true }` or `{ ok: false }`.
|
|
129
|
+
* @param options Optional concurrency, error hook, and message id mapping.
|
|
130
|
+
* @returns An {@link SQSBatchResponse} listing only failed `itemIdentifier`s.
|
|
131
|
+
* @throws {RangeError} When `options.concurrency` is less than 1.
|
|
132
|
+
* @throws {TypeError} When `options.concurrency` is not a finite integer.
|
|
102
133
|
*/
|
|
103
134
|
const processPartialBatchWithResult = async (event, processRecord, options) => {
|
|
104
135
|
const concurrency = resolveConcurrency(options?.concurrency);
|
|
105
136
|
const batchItemFailures = [];
|
|
137
|
+
/**
|
|
138
|
+
* Processes one record; maps throws and `{ ok: false }` to batch item failures.
|
|
139
|
+
*
|
|
140
|
+
* @param record The SQS record to process.
|
|
141
|
+
*/
|
|
106
142
|
const handle = async (record) => {
|
|
107
143
|
const id = options?.mapMessageId?.(record) ?? record.messageId;
|
|
108
144
|
let result;
|
|
@@ -120,7 +156,9 @@ const processPartialBatchWithResult = async (event, processRecord, options) => {
|
|
|
120
156
|
return;
|
|
121
157
|
}
|
|
122
158
|
if (options?.onRecordError) {
|
|
123
|
-
|
|
159
|
+
const error = new Error(`processRecord returned { ok: false } (itemIdentifier=${id})`);
|
|
160
|
+
Object.assign(error, { cause: { itemIdentifier: id } });
|
|
161
|
+
options.onRecordError(record, error);
|
|
124
162
|
}
|
|
125
163
|
batchItemFailures.push(itemFailure(id));
|
|
126
164
|
};
|
|
@@ -135,4 +173,4 @@ const processPartialBatchWithResult = async (event, processRecord, options) => {
|
|
|
135
173
|
return { batchItemFailures };
|
|
136
174
|
};
|
|
137
175
|
exports.processPartialBatchWithResult = processPartialBatchWithResult;
|
|
138
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBK0JBOzs7R0FHRztBQUNILE1BQU0sV0FBVyxHQUFHLENBQUMsY0FBc0IsRUFBOEIsRUFBRSxDQUFDLENBQUM7SUFDM0UsY0FBYztDQUNmLENBQUMsQ0FBQztBQUVIOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBeUIsRUFBVSxFQUFFO0lBQy9ELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hELE1BQU0sSUFBSSxTQUFTLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksVUFBVSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7R0FPRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUM5QixLQUFtQixFQUNuQixXQUFtQixFQUNuQixFQUE4QixFQUNmLEVBQUU7SUFDakIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUViLE1BQU0sYUFBYSxHQUFHLEdBQXVCLEVBQUU7UUFDN0MsTUFBTSxLQUFL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ZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU1FTQmF0Y2hSZXNwb25zZSwgU1FTRXZlbnQsIFNRU1JlY29yZCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwcm9jZXNzUGFydGlhbEJhdGNofSBhbmQge0BsaW5rIHByb2Nlc3NQYXJ0aWFsQmF0Y2hXaXRoUmVzdWx0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzUGFydGlhbEJhdGNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiByZWNvcmRzIHByb2Nlc3NlZCBpbiBwYXJhbGxlbC5cbiAgICpcbiAgICogLSBgMWA6IHNlcXVlbnRpYWwgcHJvY2Vzc2luZ1xuICAgKiAtIGA+IDFgOiBib3VuZGVkIGNvbmN1cnJlbmN5IHBvb2wgKG9yZGVyIG9mIGBiYXRjaEl0ZW1GYWlsdXJlc2AgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAqXG4gICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IFdoZW4gYGNvbmN1cnJlbmN5YCBpcyBsZXNzIHRoYW4gMS5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBXaGVuIGBjb25jdXJyZW5jeWAgaXMgbm90IGEgZmluaXRlIGludGVnZXIuXG4gICAqIE9yZGVyIG9mIGVudHJpZXMgaW4ge0BsaW5rIFNRU0JhdGNoUmVzcG9uc2UuYmF0Y2hJdGVtRmFpbHVyZXN9IGlzIG5vdCBndWFyYW50ZWVkLlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBjb25jdXJyZW5jeT86IG51bWJlcjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSByZWNvcmQgaXMgdHJlYXRlZCBhcyBmYWlsZWQgKHRocm93biBlcnJvciBvciBgeyBvazogZmFsc2UgfWApLlxuICAgKiBVc2UgZm9yIGxvZ2dpbmc7IHRoZSBsaWJyYXJ5IGRvZXMgbm90IHdyaXRlIHRvIGBjb25zb2xlYCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgb25SZWNvcmRFcnJvcj86IChyZWNvcmQ6IFNRU1JlY29yZCwgZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciBgaXRlbUlkZW50aWZpZXJgIGZvciBhIHJlY29yZC4gRGVmYXVsdHMgdG8gYHJlY29yZC5tZXNzYWdlSWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFwTWVzc2FnZUlkPzogKHJlY29yZDogU1FTUmVjb3JkKSA9PiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpbmdsZSBgYmF0Y2hJdGVtRmFpbHVyZXNgIGVudHJ5IGZvciBhIGZhaWxlZCByZWNvcmQuXG4gKiBAcGFyYW0gaXRlbUlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgcmVwb3J0ZWQgYmFjayB0byBMYW1iZGEuXG4gKi9cbmNvbnN0IGl0ZW1GYWlsdXJlID0gKGl0ZW1JZGVudGlmaWVyOiBzdHJpbmcpOiB7IGl0ZW1JZGVudGlmaWVyOiBzdHJpbmcgfSA9PiAoe1xuICBpdGVtSWRlbnRpZmllcixcbn0pO1xuXG4vKipcbiAqIFJlc29sdmVzIGFuZCB2YWxpZGF0ZXMgdGhlIGBjb25jdXJyZW5jeWAgb3B0aW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBVc2VyLXByb3ZpZGVkIGNvbmN1cnJlbmN5LlxuICogQHJldHVybnMgQSB2YWxpZGF0ZWQgY29uY3VycmVuY3kgdmFsdWUgKGRlZmF1bHRzIHRvIGAxYCkuXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBXaGVuIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIDEuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IFdoZW4gYHZhbHVlYCBpcyBub3QgYSBmaW5pdGUgaW50ZWdlci5cbiAqL1xuY29uc3QgcmVzb2x2ZUNvbmN1cnJlbmN5ID0gKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgPT4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCAhTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb25jdXJyZW5jeSBtdXN0IGJlIGEgZmluaXRlIGludGVnZXInKTtcbiAgfVxuICBpZiAodmFsdWUgPCAxKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2NvbmN1cnJlbmN5IG11c3QgYmUgPj0gMScpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogUnVucyBgZm5gIG92ZXIgYGl0ZW1zYCB3aXRoIGF0IG1vc3QgYGNvbmN1cnJlbmN5YCBwYXJhbGxlbCB3b3JrZXJzLlxuICogRWFjaCB3b3JrZXIgcHVsbHMgdGhlIG5leHQgaW5kZXggdW50aWwgbm9uZSByZW1haW4uXG4gKlxuICogQHBhcmFtIGl0ZW1zIEl0ZW1zIHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0gY29uY3VycmVuY3kgTWF4aW11bSBwYXJhbGxlbCB3b3JrZXJzIChtdXN0IGJlIGA+PSAxYCkuXG4gKiBAcGFyYW0gZm4gQXN5bmMgaGFuZGxlciBpbnZva2VkIGZvciBlYWNoIGl0ZW0uXG4gKi9cbmNvbnN0IHJ1bldpdGhDb25jdXJyZW5jeSA9IGFzeW5jIDxUPihcbiAgaXRlbXM6IHJlYWRvbmx5IFRbXSxcbiAgY29uY3VycmVuY3k6IG51bWJlcixcbiAgZm46IChpdGVtOiBUKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihjb25jdXJyZW5jeSwgaXRlbXMubGVuZ3RoKTtcbiAgbGV0IG5leHQgPSAwO1xuXG4gIGNvbnN0IHRha2VOZXh0SW5kZXggPSAoKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IG5leHQ7XG4gICAgbmV4dCArPSAxO1xuICAgIGlmIChpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfTtcblxuICBjb25zdCB3b3JrZXJzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgZm9yIChsZXQgdyA9IDA7IHcgPCBsaW1pdDsgdysrKSB7XG4gICAgd29ya2Vycy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgd29ya0luZGV4ID0gdGFrZU5leHRJbmRleCgpO1xuICAgICAgd2hpbGUgKHdvcmtJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1t3b3JrSW5kZXhdO1xuICAgICAgICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGZuKGl0ZW0pO1xuICAgICAgICB3b3JrSW5kZXggPSB0YWtlTmV4dEluZGV4KCk7XG4gICAgICB9XG4gICAgfSkoKSk7XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwod29ya2Vycyk7XG59O1xuXG4vKipcbiAqIFJ1bnMgYHByb2Nlc3NSZWNvcmRgIGZvciBlYWNoIFNRUyByZWNvcmQuIFRocm93biBlcnJvcnMgYXJlIG1hcHBlZCB0b1xuICogYGJhdGNoSXRlbUZhaWx1cmVzYDsgc3VjY2Vzc2Z1bCByZWNvcmRzIGFyZSBub3QgbGlzdGVkLlxuICovXG5leHBvcnQgY29uc3QgcHJvY2Vzc1BhcnRpYWxCYXRjaCA9IGFzeW5jIChcbiAgZXZlbnQ6IFNRU0V2ZW50LFxuICBwcm9jZXNzUmVjb3JkOiAocmVjb3JkOiBTUVNSZWNvcmQpID0+IFByb21pc2U8dm9pZD4sXG4gIG9wdGlvbnM/OiBQcm9jZXNzUGFydGlhbEJhdGNoT3B0aW9ucyxcbik6IFByb21pc2U8U1FTQmF0Y2hSZXNwb25zZT4gPT4ge1xuICBjb25zdCBjb25jdXJyZW5jeSA9IHJlc29sdmVDb25jdXJyZW5jeShvcHRpb25zPy5jb25jdXJyZW5jeSk7XG4gIGNvbnN0IGJhdGNoSXRlbUZhaWx1cmVzOiB7IGl0ZW1JZGVudGlmaWVyOiBzdHJpbmcgfVtdID0gW107XG5cbiAgY29uc3QgaGFuZGxlID0gYXN5bmMgKHJlY29yZDogU1FTUmVjb3JkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgaWQgPSBvcHRpb25zPy5tYXBNZXNzYWdlSWQ/LihyZWNvcmQpID8/IHJlY29yZC5tZXNzYWdlSWQ7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHByb2Nlc3NSZWNvcmQocmVjb3JkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG9wdGlvbnM/Lm9uUmVjb3JkRXJyb3IpIHtcbiAgICAgICAgb3B0aW9ucy5vblJlY29yZEVycm9yKHJlY29yZCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgYmF0Y2hJdGVtRmFpbHVyZXMucHVzaChpdGVtRmFpbHVyZShpZCkpO1xuICAgIH1cbiAgfTtcblxuICBpZiAoY29uY3VycmVuY3kgPD0gMSkge1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGV2ZW50LlJlY29yZHMpIHtcbiAgICAgIGF3YWl0IGhhbmRsZShyZWNvcmQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBydW5XaXRoQ29uY3VycmVuY3koZXZlbnQuUmVjb3JkcywgY29uY3VycmVuY3ksIGhhbmRsZSk7XG4gIH1cblxuICByZXR1cm4geyBiYXRjaEl0ZW1GYWlsdXJlcyB9O1xufTtcblxuLyoqXG4gKiBMaWtlIHtAbGluayBwcm9jZXNzUGFydGlhbEJhdGNofSwgYnV0IHVzZXMgYSBSZXN1bHQtc3R5bGUgY2FsbGJhY2sgKG5vIHRocm93IGZvciBjb250cm9sIGZsb3cpLlxuICogSWYgYHByb2Nlc3NSZWNvcmRgIHRocm93cywgdGhlIHJlY29yZCBpcyBzdGlsbCB0cmVhdGVkIGFzIGZhaWxlZCBhbmQgYG9uUmVjb3JkRXJyb3JgIGlzIGludm9rZWQgd2hlbiBzZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzUGFydGlhbEJhdGNoV2l0aFJlc3VsdCA9IGFzeW5jIChcbiAgZXZlbnQ6IFNRU0V2ZW50LFxuICBwcm9jZXNzUmVjb3JkOiAocmVjb3JkOiBTUVNSZWNvcmQpID0+IFByb21pc2U8eyBvazogdHJ1ZSB9IHwgeyBvazogZmFsc2UgfT4sXG4gIG9wdGlvbnM/OiBQcm9jZXNzUGFydGlhbEJhdGNoT3B0aW9ucyxcbik6IFByb21pc2U8U1FTQmF0Y2hSZXNwb25zZT4gPT4ge1xuICBjb25zdCBjb25jdXJyZW5jeSA9IHJlc29sdmVDb25jdXJyZW5jeShvcHRpb25zPy5jb25jdXJyZW5jeSk7XG4gIGNvbnN0IGJhdGNoSXRlbUZhaWx1cmVzOiB7IGl0ZW1JZGVudGlmaWVyOiBzdHJpbmcgfVtdID0gW107XG5cbiAgY29uc3QgaGFuZGxlID0gYXN5bmMgKHJlY29yZDogU1FTUmVjb3JkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgaWQgPSBvcHRpb25zPy5tYXBNZXNzYWdlSWQ/LihyZWNvcmQpID8/IHJlY29yZC5tZXNzYWdlSWQ7XG4gICAgbGV0IHJlc3VsdDogeyBvazogdHJ1ZSB9IHwgeyBvazogZmFsc2UgfTtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc1JlY29yZChyZWNvcmQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAob3B0aW9ucz8ub25SZWNvcmRFcnJvcikge1xuICAgICAgICBvcHRpb25zLm9uUmVjb3JkRXJyb3IocmVjb3JkLCBlcnJvcik7XG4gICAgICB9XG4gICAgICBiYXRjaEl0ZW1GYWlsdXJlcy5wdXNoKGl0ZW1GYWlsdXJlKGlkKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZXN1bHQub2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnM/Lm9uUmVjb3JkRXJyb3IpIHtcbiAgICAgIG9wdGlvbnMub25SZWNvcmRFcnJvcihyZWNvcmQsIG5ldyBFcnJvcigncHJvY2Vzc1JlY29yZCByZXR1cm5lZCB7IG9rOiBmYWxzZSB9JykpO1xuICAgIH1cbiAgICBiYXRjaEl0ZW1GYWlsdXJlcy5wdXNoKGl0ZW1GYWlsdXJlKGlkKSk7XG4gIH07XG5cbiAgaWYgKGNvbmN1cnJlbmN5IDw9IDEpIHtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBldmVudC5SZWNvcmRzKSB7XG4gICAgICBhd2FpdCBoYW5kbGUocmVjb3JkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgcnVuV2l0aENvbmN1cnJlbmN5KGV2ZW50LlJlY29yZHMsIGNvbmN1cnJlbmN5LCBoYW5kbGUpO1xuICB9XG5cbiAgcmV0dXJuIHsgYmF0Y2hJdGVtRmFpbHVyZXMgfTtcbn07XG4iXX0=
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBNkNBOzs7OztHQUtHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsQ0FBQyxjQUFzQixFQUE4QixFQUFFLENBQUMsQ0FBQztJQUMzRSxjQUFjO0NBQ2YsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7R0FPRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxLQUF5QixFQUFVLEVBQUU7SUFDL0QsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEIsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEQsTUFBTSxJQUFJLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxVQUFVLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUM5QixLQUFtQixFQUNuQixXQUFtQixFQUNuQixFQUE4QixFQUNmLEVBQUU7SUFDakIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUViOzs7O09BSUc7SUFDSCxNQUFNLGFBQWEsR0FBRyxHQUF1QixFQUFF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QztRQUN2QixDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztBQUMvQixDQUFDLENBQUM7QUE3Q1csUUFBQSw2QkFBNkIsaUNBNkN4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU1FTQmF0Y2hSZXNwb25zZSwgU1FTRXZlbnQsIFNRU1JlY29yZCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwcm9jZXNzUGFydGlhbEJhdGNofSBhbmQge0BsaW5rIHByb2Nlc3NQYXJ0aWFsQmF0Y2hXaXRoUmVzdWx0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzUGFydGlhbEJhdGNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiByZWNvcmRzIHByb2Nlc3NlZCBpbiBwYXJhbGxlbC5cbiAgICpcbiAgICogLSBgMWA6IHNlcXVlbnRpYWwgcHJvY2Vzc2luZ1xuICAgKiAtIGA+IDFgOiBib3VuZGVkIGNvbmN1cnJlbmN5IHBvb2wgKG9yZGVyIG9mIHtAbGluayBTUVNCYXRjaFJlc3BvbnNlLmJhdGNoSXRlbUZhaWx1cmVzfSBpcyBub3QgZ3VhcmFudGVlZClcbiAgICpcbiAgICogQGRlZmF1bHQgMVxuICAgKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBXaGVuIGBjb25jdXJyZW5jeWAgaXMgbGVzcyB0aGFuIDEuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gV2hlbiBgY29uY3VycmVuY3lgIGlzIG5vdCBhIGZpbml0ZSBpbnRlZ2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uY3VycmVuY3k/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgcmVjb3JkIGlzIHRyZWF0ZWQgYXMgZmFpbGVkICh0aHJvd24gZXJyb3Igb3IgYHsgb2s6IGZhbHNlIH1gKS5cbiAgICogVXNlIGZvciBsb2dnaW5nIG9yIG1ldHJpY3M7IHRoZSBsaWJyYXJ5IGRvZXMgbm90IHdyaXRlIHRvIGBjb25zb2xlYCBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBGb3IgYHsgb2s6IGZhbHNlIH1gIGZyb20ge0BsaW5rIHByb2Nlc3NQYXJ0aWFsQmF0Y2hXaXRoUmVzdWx0fSwgYGVycm9yYCBpcyBhbiBgRXJyb3JgXG4gICAqIHdob3NlIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIHJlc29sdmVkIGBpdGVtSWRlbnRpZmllcmAsIGFuZCB3aG9zZSBgY2F1c2VgIGlzXG4gICAqIGB7IGl0ZW1JZGVudGlmaWVyIH1gIGZvciBzdHJ1Y3R1cmVkIGxvZ2dpbmcuXG4gICAqXG4gICAqIERvIG5vdCBsb2cgYHJlY29yZC5ib2R5YCBhcy1pcyDigJQgaXQgbWF5IGNvbnRhaW4gc2VjcmV0cyBvciBwZXJzb25hbCBkYXRhLlxuICAgKiBQcmVmZXIgaWRlbnRpZmllcnMgc3VjaCBhcyBgcmVjb3JkLm1lc3NhZ2VJZGAgKG9yIHlvdXIgYG1hcE1lc3NhZ2VJZGAgcmVzdWx0KVxuICAgKiBhbmQgYSBzYW5pdGl6ZWQgZXJyb3Igc3VtbWFyeS5cbiAgICpcbiAgICogQHBhcmFtIHJlY29yZCBUaGUgZmFpbGVkIFNRUyByZWNvcmQuXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgdGhyb3duIHZhbHVlLCBvciBhIHN5bnRoZXNpemVkIGBFcnJvcmAgd2hlbiBgeyBvazogZmFsc2UgfWAgd2FzIHJldHVybmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb25SZWNvcmRFcnJvcj86IChyZWNvcmQ6IFNRU1JlY29yZCwgZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGBpdGVtSWRlbnRpZmllcmAgcmVwb3J0ZWQgaW4gYGJhdGNoSXRlbUZhaWx1cmVzYCBmb3IgYSByZWNvcmQuXG4gICAqIERlZmF1bHRzIHRvIGByZWNvcmQubWVzc2FnZUlkYCB3aGVuIG9taXR0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSByZWNvcmQgVGhlIFNRUyByZWNvcmQgYmVpbmcgcHJvY2Vzc2VkLlxuICAgKiBAcmV0dXJucyBUaGUgaWRlbnRpZmllciBzZW50IGJhY2sgdG8gTGFtYmRhIGluIGBiYXRjaEl0ZW1GYWlsdXJlc2AuXG4gICAqL1xuICByZWFkb25seSBtYXBNZXNzYWdlSWQ/OiAocmVjb3JkOiBTUVNSZWNvcmQpID0+IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIGBiYXRjaEl0ZW1GYWlsdXJlc2AgZW50cnkgZm9yIGEgZmFpbGVkIHJlY29yZC5cbiAqXG4gKiBAcGFyYW0gaXRlbUlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgcmVwb3J0ZWQgYmFjayB0byBMYW1iZGEuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgc3VpdGFibGUgZm9yIHtAbGluayBTUVNCYXRjaFJlc3BvbnNlLmJhdGNoSXRlbUZhaWx1cmVzfS5cbiAqL1xuY29uc3QgaXRlbUZhaWx1cmUgPSAoaXRlbUlkZW50aWZpZXI6IHN0cmluZyk6IHsgaXRlbUlkZW50aWZpZXI6IHN0cmluZyB9ID0+ICh7XG4gIGl0ZW1JZGVudGlmaWVyLFxufSk7XG5cbi8qKlxuICogUmVzb2x2ZXMgYW5kIHZhbGlkYXRlcyB0aGUgYGNvbmN1cnJlbmN5YCBvcHRpb24uXG4gKlxuICogQHBhcmFtIHZhbHVlIFVzZXItcHJvdmlkZWQgY29uY3VycmVuY3kuXG4gKiBAcmV0dXJucyBBIHZhbGlkYXRlZCBjb25jdXJyZW5jeSB2YWx1ZSAoZGVmYXVsdHMgdG8gYDFgKS5cbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IFdoZW4gYHZhbHVlYCBpcyBsZXNzIHRoYW4gMS5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gV2hlbiBgdmFsdWVgIGlzIG5vdCBhIGZpbml0ZSBpbnRlZ2VyLlxuICovXG5jb25zdCByZXNvbHZlQ29uY3VycmVuY3kgPSAodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvbmN1cnJlbmN5IG11c3QgYmUgYSBmaW5pdGUgaW50ZWdlcicpO1xuICB9XG4gIGlmICh2YWx1ZSA8IDEpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignY29uY3VycmVuY3kgbXVzdCBiZSA+PSAxJyk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBSdW5zIGBmbmAgb3ZlciBgaXRlbXNgIHdpdGggYXQgbW9zdCBgY29uY3VycmVuY3lgIHBhcmFsbGVsIHdvcmtlcnMuXG4gKiBFYWNoIHdvcmtlciBwdWxscyB0aGUgbmV4dCBpbmRleCB1bnRpbCBub25lIHJlbWFpbi5cbiAqXG4gKiBAcGFyYW0gaXRlbXMgSXRlbXMgdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSBjb25jdXJyZW5jeSBNYXhpbXVtIHBhcmFsbGVsIHdvcmtlcnMgKG11c3QgYmUgYD49IDFgKS5cbiAqIEBwYXJhbSBmbiBBc3luYyBoYW5kbGVyIGludm9rZWQgZm9yIGVhY2ggaXRlbS5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlcnkgaXRlbSBoYXMgYmVlbiBwcm9jZXNzZWQuXG4gKi9cbmNvbnN0IHJ1bldpdGhDb25jdXJyZW5jeSA9IGFzeW5jIDxUPihcbiAgaXRlbXM6IHJlYWRvbmx5IFRbXSxcbiAgY29uY3VycmVuY3k6IG51bWJlcixcbiAgZm46IChpdGVtOiBUKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihjb25jdXJyZW5jeSwgaXRlbXMubGVuZ3RoKTtcbiAgbGV0IG5leHQgPSAwO1xuXG4gIC8qKlxuICAgKiBDbGFpbXMgdGhlIG5leHQgd29yayBpbmRleCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBuZXh0IGluZGV4IHRvIHByb2Nlc3MsIG9yIGB1bmRlZmluZWRgIGlmIG5vbmUgcmVtYWluLlxuICAgKi9cbiAgY29uc3QgdGFrZU5leHRJbmRleCA9ICgpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gbmV4dDtcbiAgICBuZXh0ICs9IDE7XG4gICAgaWYgKGluZGV4ID49IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9O1xuXG4gIGNvbnN0IHdvcmtlcnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBmb3IgKGxldCB3ID0gMDsgdyA8IGxpbWl0OyB3KyspIHtcbiAgICB3b3JrZXJzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCB3b3JrSW5kZXggPSB0YWtlTmV4dEluZGV4KCk7XG4gICAgICB3aGlsZSAod29ya0luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW3dvcmtJbmRleF07XG4gICAgICAgIGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZm4oaXRlbSk7XG4gICAgICAgIHdvcmtJbmRleCA9IHRha2VOZXh0SW5kZXgoKTtcbiAgICAgIH1cbiAgICB9KSgpKTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbCh3b3JrZXJzKTtcbn07XG5cbi8qKlxuICogUnVucyBgcHJvY2Vzc1JlY29yZGAgZm9yIGVhY2ggU1FTIHJlY29yZC4gVGhyb3duIGVycm9ycyBhcmUgbWFwcGVkIHRvXG4gKiBgYmF0Y2hJdGVtRmFpbHVyZXNgOyBzdWNjZXNzZnVsIHJlY29yZHMgYXJlIG5vdCBsaXN0ZWQuXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSBTUVMgTGFtYmRhIGV2ZW50LlxuICogQHBhcmFtIHByb2Nlc3NSZWNvcmQgUGVyLXJlY29yZCBoYW5kbGVyLiBUaHJvdyB0byBtYXJrIG9ubHkgdGhhdCByZWNvcmQgYXMgZmFpbGVkLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgY29uY3VycmVuY3ksIGVycm9yIGhvb2ssIGFuZCBtZXNzYWdlIGlkIG1hcHBpbmcuXG4gKiBAcmV0dXJucyBBbiB7QGxpbmsgU1FTQmF0Y2hSZXNwb25zZX0gbGlzdGluZyBvbmx5IGZhaWxlZCBgaXRlbUlkZW50aWZpZXJgcy5cbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IFdoZW4gYG9wdGlvbnMuY29uY3VycmVuY3lgIGlzIGxlc3MgdGhhbiAxLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBXaGVuIGBvcHRpb25zLmNvbmN1cnJlbmN5YCBpcyBub3QgYSBmaW5pdGUgaW50ZWdlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHByb2Nlc3NQYXJ0aWFsQmF0Y2ggPSBhc3luYyAoXG4gIGV2ZW50OiBTUVNFdmVudCxcbiAgcHJvY2Vzc1JlY29yZDogKHJlY29yZDogU1FTUmVjb3JkKSA9PiBQcm9taXNlPHZvaWQ+LFxuICBvcHRpb25zPzogUHJvY2Vzc1BhcnRpYWxCYXRjaE9wdGlvbnMsXG4pOiBQcm9taXNlPFNRU0JhdGNoUmVzcG9uc2U+ID0+IHtcbiAgY29uc3QgY29uY3VycmVuY3kgPSByZXNvbHZlQ29uY3VycmVuY3kob3B0aW9ucz8uY29uY3VycmVuY3kpO1xuICBjb25zdCBiYXRjaEl0ZW1GYWlsdXJlczogeyBpdGVtSWRlbnRpZmllcjogc3RyaW5nIH1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgb25lIHJlY29yZCBhbmQgcmVjb3JkcyBhIGJhdGNoIGl0ZW0gZmFpbHVyZSBvbiBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHJlY29yZCBUaGUgU1FTIHJlY29yZCB0byBwcm9jZXNzLlxuICAgKi9cbiAgY29uc3QgaGFuZGxlID0gYXN5bmMgKHJlY29yZDogU1FTUmVjb3JkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgaWQgPSBvcHRpb25zPy5tYXBNZXNzYWdlSWQ/LihyZWNvcmQpID8/IHJlY29yZC5tZXNzYWdlSWQ7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHByb2Nlc3NSZWNvcmQocmVjb3JkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG9wdGlvbnM/Lm9uUmVjb3JkRXJyb3IpIHtcbiAgICAgICAgb3B0aW9ucy5vblJlY29yZEVycm9yKHJlY29yZCwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgYmF0Y2hJdGVtRmFpbHVyZXMucHVzaChpdGVtRmFpbHVyZShpZCkpO1xuICAgIH1cbiAgfTtcblxuICBpZiAoY29uY3VycmVuY3kgPD0gMSkge1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGV2ZW50LlJlY29yZHMpIHtcbiAgICAgIGF3YWl0IGhhbmRsZShyZWNvcmQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBydW5XaXRoQ29uY3VycmVuY3koZXZlbnQuUmVjb3JkcywgY29uY3VycmVuY3ksIGhhbmRsZSk7XG4gIH1cblxuICByZXR1cm4geyBiYXRjaEl0ZW1GYWlsdXJlcyB9O1xufTtcblxuLyoqXG4gKiBMaWtlIHtAbGluayBwcm9jZXNzUGFydGlhbEJhdGNofSwgYnV0IHVzZXMgYSBSZXN1bHQtc3R5bGUgY2FsbGJhY2sgKG5vIHRocm93IGZvciBjb250cm9sIGZsb3cpLlxuICpcbiAqIC0gYHsgb2s6IHRydWUgfWA6IHN1Y2Nlc3MgKG5vdCBsaXN0ZWQgaW4gYGJhdGNoSXRlbUZhaWx1cmVzYClcbiAqIC0gYHsgb2s6IGZhbHNlIH1gOiBmYWlsdXJlOyBpZiBgb25SZWNvcmRFcnJvcmAgaXMgc2V0LCBpdCByZWNlaXZlcyBhbiBgRXJyb3JgIHdob3NlXG4gKiAgIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIHJlc29sdmVkIGBpdGVtSWRlbnRpZmllcmAsIGFuZCB3aG9zZSBgY2F1c2VgIGlzIGB7IGl0ZW1JZGVudGlmaWVyIH1gXG4gKiAtIHRocm93biBlcnJvcnM6IHN0aWxsIHRyZWF0ZWQgYXMgZmFpbHVyZXM7IGBvblJlY29yZEVycm9yYCByZWNlaXZlcyB0aGUgdGhyb3duIHZhbHVlIHdoZW4gc2V0XG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSBTUVMgTGFtYmRhIGV2ZW50LlxuICogQHBhcmFtIHByb2Nlc3NSZWNvcmQgUGVyLXJlY29yZCBoYW5kbGVyIHJldHVybmluZyBgeyBvazogdHJ1ZSB9YCBvciBgeyBvazogZmFsc2UgfWAuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBjb25jdXJyZW5jeSwgZXJyb3IgaG9vaywgYW5kIG1lc3NhZ2UgaWQgbWFwcGluZy5cbiAqIEByZXR1cm5zIEFuIHtAbGluayBTUVNCYXRjaFJlc3BvbnNlfSBsaXN0aW5nIG9ubHkgZmFpbGVkIGBpdGVtSWRlbnRpZmllcmBzLlxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gV2hlbiBgb3B0aW9ucy5jb25jdXJyZW5jeWAgaXMgbGVzcyB0aGFuIDEuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IFdoZW4gYG9wdGlvbnMuY29uY3VycmVuY3lgIGlzIG5vdCBhIGZpbml0ZSBpbnRlZ2VyLlxuICovXG5leHBvcnQgY29uc3QgcHJvY2Vzc1BhcnRpYWxCYXRjaFdpdGhSZXN1bHQgPSBhc3luYyAoXG4gIGV2ZW50OiBTUVNFdmVudCxcbiAgcHJvY2Vzc1JlY29yZDogKHJlY29yZDogU1FTUmVjb3JkKSA9PiBQcm9taXNlPHsgb2s6IHRydWUgfSB8IHsgb2s6IGZhbHNlIH0+LFxuICBvcHRpb25zPzogUHJvY2Vzc1BhcnRpYWxCYXRjaE9wdGlvbnMsXG4pOiBQcm9taXNlPFNRU0JhdGNoUmVzcG9uc2U+ID0+IHtcbiAgY29uc3QgY29uY3VycmVuY3kgPSByZXNvbHZlQ29uY3VycmVuY3kob3B0aW9ucz8uY29uY3VycmVuY3kpO1xuICBjb25zdCBiYXRjaEl0ZW1GYWlsdXJlczogeyBpdGVtSWRlbnRpZmllcjogc3RyaW5nIH1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgb25lIHJlY29yZDsgbWFwcyB0aHJvd3MgYW5kIGB7IG9rOiBmYWxzZSB9YCB0byBiYXRjaCBpdGVtIGZhaWx1cmVzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVjb3JkIFRoZSBTUVMgcmVjb3JkIHRvIHByb2Nlc3MuXG4gICAqL1xuICBjb25zdCBoYW5kbGUgPSBhc3luYyAocmVjb3JkOiBTUVNSZWNvcmQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBpZCA9IG9wdGlvbnM/Lm1hcE1lc3NhZ2VJZD8uKHJlY29yZCkgPz8gcmVjb3JkLm1lc3NhZ2VJZDtcbiAgICBsZXQgcmVzdWx0OiB7IG9rOiB0cnVlIH0gfCB7IG9rOiBmYWxzZSB9O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBwcm9jZXNzUmVjb3JkKHJlY29yZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChvcHRpb25zPy5vblJlY29yZEVycm9yKSB7XG4gICAgICAgIG9wdGlvbnMub25SZWNvcmRFcnJvcihyZWNvcmQsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIGJhdGNoSXRlbUZhaWx1cmVzLnB1c2goaXRlbUZhaWx1cmUoaWQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucz8ub25SZWNvcmRFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYHByb2Nlc3NSZWNvcmQgcmV0dXJuZWQgeyBvazogZmFsc2UgfSAoaXRlbUlkZW50aWZpZXI9JHtpZH0pYCk7XG4gICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGNhdXNlOiB7IGl0ZW1JZGVudGlmaWVyOiBpZCB9IH0pO1xuICAgICAgb3B0aW9ucy5vblJlY29yZEVycm9yKHJlY29yZCwgZXJyb3IpO1xuICAgIH1cbiAgICBiYXRjaEl0ZW1GYWlsdXJlcy5wdXNoKGl0ZW1GYWlsdXJlKGlkKSk7XG4gIH07XG5cbiAgaWYgKGNvbmN1cnJlbmN5IDw9IDEpIHtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBldmVudC5SZWNvcmRzKSB7XG4gICAgICBhd2FpdCBoYW5kbGUocmVjb3JkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgcnVuV2l0aENvbmN1cnJlbmN5KGV2ZW50LlJlY29yZHMsIGNvbmN1cnJlbmN5LCBoYW5kbGUpO1xuICB9XG5cbiAgcmV0dXJuIHsgYmF0Y2hJdGVtRmFpbHVyZXMgfTtcbn07XG4iXX0=
|
package/package.json
CHANGED
|
@@ -43,10 +43,10 @@
|
|
|
43
43
|
"eslint-plugin-import": "^2.32.0",
|
|
44
44
|
"jest": "^30.4.2",
|
|
45
45
|
"jest-junit": "^17",
|
|
46
|
-
"projen": "^0.101.
|
|
46
|
+
"projen": "^0.101.11",
|
|
47
47
|
"ts-jest": "^29.4.11",
|
|
48
48
|
"ts-node": "^10.9.2",
|
|
49
|
-
"typescript": "
|
|
49
|
+
"typescript": "6.0.x"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"@types/aws-lambda": "^8.10.145"
|
|
@@ -63,8 +63,7 @@
|
|
|
63
63
|
},
|
|
64
64
|
"devEngines": {
|
|
65
65
|
"packageManager": {
|
|
66
|
-
"name": "
|
|
67
|
-
"version": "1.22.22",
|
|
66
|
+
"name": "npm",
|
|
68
67
|
"onFail": "ignore"
|
|
69
68
|
}
|
|
70
69
|
},
|
|
@@ -73,7 +72,7 @@
|
|
|
73
72
|
"publishConfig": {
|
|
74
73
|
"access": "public"
|
|
75
74
|
},
|
|
76
|
-
"version": "0.
|
|
75
|
+
"version": "0.3.0",
|
|
77
76
|
"jest": {
|
|
78
77
|
"coverageProvider": "v8",
|
|
79
78
|
"testMatch": [
|