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 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 `messageId`s into `batchItemFailures`.
16
- - Optional bounded concurrency (`concurrency`) and error hook (`onRecordError`).
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** (`"module": "CommonJS"`). Usable from both CJS and ESM runtimes.
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
- // Avoid logging sensitive contents from record.body.
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 (Apache-2.0) License.
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 `batchItemFailures` is not guaranteed)
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 value for `itemIdentifier` for a record. Defaults to `record.messageId`.
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
- * If `processRecord` throws, the record is still treated as failed and `onRecordError` is invoked when set.
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
- * If `processRecord` throws, the record is still treated as failed and `onRecordError` is invoked when set.
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
- options.onRecordError(record, new Error('processRecord returned { ok: false }'));
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.4",
46
+ "projen": "^0.101.11",
47
47
  "ts-jest": "^29.4.11",
48
48
  "ts-node": "^10.9.2",
49
- "typescript": "5.9.x"
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": "yarn",
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.2.6",
75
+ "version": "0.3.0",
77
76
  "jest": {
78
77
  "coverageProvider": "v8",
79
78
  "testMatch": [