sqs-partial-batch-processor 0.4.5 → 0.5.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/.editorconfig +12 -0
- package/README.md +36 -54
- package/lib/core/concurrency-predicates.d.ts +18 -0
- package/lib/core/concurrency-predicates.js +24 -0
- package/lib/core/concurrency.d.ts +32 -0
- package/lib/core/concurrency.js +95 -0
- package/lib/core/errors.d.ts +30 -0
- package/lib/core/errors.js +46 -0
- package/lib/core/item-failure.js +14 -0
- package/lib/core/report-record-failure.d.ts +16 -0
- package/lib/core/report-record-failure.js +28 -0
- package/lib/{types/index.d.ts → core/types.d.ts} +14 -20
- package/lib/core/types.js +3 -0
- package/lib/index.d.ts +3 -3
- package/lib/index.js +7 -5
- package/lib/{processor/process-partial-batch.d.ts → process-partial-batch.d.ts} +7 -3
- package/lib/process-partial-batch.js +43 -0
- package/package.json +3 -2
- package/lib/processor/concurrency.d.ts +0 -19
- package/lib/processor/concurrency.js +0 -77
- package/lib/processor/item-failure.js +0 -14
- package/lib/processor/process-partial-batch-with-result.d.ts +0 -18
- package/lib/processor/process-partial-batch-with-result.js +0 -63
- package/lib/processor/process-partial-batch.js +0 -48
- package/lib/types/index.js +0 -3
- /package/lib/{processor → core}/item-failure.d.ts +0 -0
package/.editorconfig
ADDED
package/README.md
CHANGED
|
@@ -1,49 +1,52 @@
|
|
|
1
1
|
# SQS Partial Batch Processor
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/sqs-partial-batch-processor)
|
|
4
|
-
[](https://www.npmjs.com/package/sqs-partial-batch-processor)
|
|
4
|
+
[](https://www.npmjs.com/package/sqs-partial-batch-processor)
|
|
5
|
+
[](https://www.npmjs.com/package/sqs-partial-batch-processor)
|
|
6
|
+
[](https://github.com/gammarers-aws-sdk-extensions/sqs-partial-batch-processor/actions/workflows/build.yml)
|
|
5
7
|
|
|
6
8
|
A small TypeScript helper for AWS Lambda SQS triggers using **partial batch responses** (`SQSBatchResponse.batchItemFailures`).
|
|
7
9
|
You supply per-record async logic; the library handles looping, per-record error boundaries, and the response shape.
|
|
8
10
|
|
|
9
|
-
This library intentionally does **not** parse message bodies, validate schemas, create AWS SDK clients, or make retry/business decisions for you.
|
|
10
|
-
|
|
11
|
-
Import the public API from the package root (`processPartialBatch`, `processPartialBatchWithResult`, `ProcessPartialBatchOptions`, `ProcessRecordResult`).
|
|
12
|
-
|
|
13
11
|
## Features
|
|
14
12
|
|
|
15
|
-
- Implements Lambda SQS
|
|
16
|
-
-
|
|
13
|
+
- Implements the Lambda SQS partial batch response pattern, so only failed messages are retried.
|
|
14
|
+
- Keeps a failure inside the record that raised it.
|
|
17
15
|
- Aggregates failed identifiers into `batchItemFailures` (defaults to `messageId`).
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
- Shared options type `ProcessPartialBatchOptions` for both APIs.
|
|
22
|
-
- For `{ ok: false }`, `onRecordError` receives an `Error` that includes the resolved `itemIdentifier` (message and `cause`) for easier debugging.
|
|
16
|
+
- Marks a record failed by throwing from the per-record function passed to `processPartialBatch`.
|
|
17
|
+
- Accepts bounded concurrency (`concurrency`), an error hook (`onRecordError`), and custom `itemIdentifier` mapping (`mapMessageId`) through `ProcessPartialBatchOptions`.
|
|
18
|
+
- Throws `SqsPartialBatchProcessorRangeError` or `SqsPartialBatchProcessorTypeError` for invalid `concurrency`. Check the subclass before `SqsPartialBatchProcessorError`.
|
|
23
19
|
|
|
24
|
-
##
|
|
20
|
+
## How it works
|
|
21
|
+
|
|
22
|
+
An SQS event source mapping invokes your Lambda function with a batch of records. Pass that event and a per-record function to `processPartialBatch`. Throw from that function to fail one record. The returned `SQSBatchResponse` lists failed records in `batchItemFailures`. Enable **Report batch item failures** on the event source mapping so SQS retries those messages and deletes the successful ones. See the [AWS Lambda SQS error handling docs](https://docs.aws.amazon.com/lambda/latest/dg/services-sqs-errorhandling.html#services-sqs-batchfailurereporting).
|
|
25
23
|
|
|
26
|
-
|
|
27
|
-
- Module system: published as **CommonJS** (`"main": "lib/index.js"`). Usable from both CJS and ESM runtimes.
|
|
28
|
-
- Lambda SQS event source mapping has **Report batch item failures** enabled.
|
|
29
|
-
See: [AWS Lambda SQS error handling docs](https://docs.aws.amazon.com/lambda/latest/dg/services-sqs-errorhandling.html#services-sqs-batchfailurereporting)
|
|
24
|
+
Your function owns message parsing, schema validation, AWS SDK clients, and retry policy. The package is published as CommonJS (`lib/index.js`) and can be imported from CommonJS or ESM.
|
|
30
25
|
|
|
31
26
|
## Installation
|
|
32
27
|
|
|
28
|
+
### npm
|
|
29
|
+
|
|
33
30
|
```bash
|
|
34
31
|
npm install sqs-partial-batch-processor
|
|
35
32
|
```
|
|
36
33
|
|
|
34
|
+
### yarn
|
|
35
|
+
|
|
37
36
|
```bash
|
|
38
37
|
yarn add sqs-partial-batch-processor
|
|
39
38
|
```
|
|
40
39
|
|
|
40
|
+
### pnpm
|
|
41
|
+
|
|
41
42
|
```bash
|
|
42
43
|
pnpm add sqs-partial-batch-processor
|
|
43
44
|
```
|
|
44
45
|
|
|
45
46
|
## Usage
|
|
46
47
|
|
|
48
|
+
Import the public API from the package root.
|
|
49
|
+
|
|
47
50
|
Throw to mark a record as failed:
|
|
48
51
|
|
|
49
52
|
```ts
|
|
@@ -57,39 +60,7 @@ export const handler = async (event: SQSEvent) =>
|
|
|
57
60
|
});
|
|
58
61
|
```
|
|
59
62
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
- `{ ok: true }`: success (not listed in `batchItemFailures`)
|
|
63
|
-
- `{ ok: false }`: failure (listed in `batchItemFailures`)
|
|
64
|
-
- thrown errors: still treated as failures
|
|
65
|
-
|
|
66
|
-
```ts
|
|
67
|
-
import type { SQSEvent } from 'aws-lambda';
|
|
68
|
-
import {
|
|
69
|
-
processPartialBatchWithResult,
|
|
70
|
-
type ProcessRecordResult,
|
|
71
|
-
} from 'sqs-partial-batch-processor';
|
|
72
|
-
|
|
73
|
-
export const handler = async (event: SQSEvent) =>
|
|
74
|
-
processPartialBatchWithResult(event, async (record): Promise<ProcessRecordResult> => {
|
|
75
|
-
if (record.body === '') {
|
|
76
|
-
return { ok: false };
|
|
77
|
-
}
|
|
78
|
-
return { ok: true };
|
|
79
|
-
});
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## Options
|
|
83
|
-
|
|
84
|
-
Both `processPartialBatch` and `processPartialBatchWithResult` accept an optional `ProcessPartialBatchOptions` object:
|
|
85
|
-
|
|
86
|
-
- `concurrency?: number` (default: `1`): maximum parallelism. Must be a finite integer `>= 1` (`1` = sequential, `> 1` = bounded concurrency). If invalid, the function throws (`RangeError` for `< 1`, `TypeError` for non-integer / non-finite).
|
|
87
|
-
- **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.
|
|
88
|
-
- **Note**: when `concurrency > 1`, the order of `batchItemFailures` is **not guaranteed**. Tests should compare as a set, not by array order.
|
|
89
|
-
- `onRecordError?: (record, error) => void`: called when a record is treated as failed (useful for structured logs / metrics).
|
|
90
|
-
- **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.
|
|
91
|
-
- When `processPartialBatchWithResult` receives `{ ok: false }`, the hook gets an `Error` whose message (and `cause.itemIdentifier`) includes the resolved `itemIdentifier` for easier debugging.
|
|
92
|
-
- Example (structured log / metrics hook):
|
|
63
|
+
`onRecordError` is a logging or metrics hook. A throw from the hook stays on that record.
|
|
93
64
|
|
|
94
65
|
```ts
|
|
95
66
|
import type { SQSEvent } from 'aws-lambda';
|
|
@@ -107,7 +78,7 @@ export const handler = async (event: SQSEvent) =>
|
|
|
107
78
|
level: 'error',
|
|
108
79
|
msg: 'record failed',
|
|
109
80
|
messageId: record.messageId,
|
|
110
|
-
//
|
|
81
|
+
// Avoid logging record.body — it may contain secrets or personal data.
|
|
111
82
|
error: error instanceof Error ? { name: error.name, message: error.message } : { message: String(error) },
|
|
112
83
|
}));
|
|
113
84
|
},
|
|
@@ -115,8 +86,19 @@ export const handler = async (event: SQSEvent) =>
|
|
|
115
86
|
);
|
|
116
87
|
```
|
|
117
88
|
|
|
118
|
-
|
|
119
|
-
|
|
89
|
+
## Options
|
|
90
|
+
|
|
91
|
+
`processPartialBatch` accepts an optional `ProcessPartialBatchOptions` object.
|
|
92
|
+
|
|
93
|
+
| Name | Type | Default | Description |
|
|
94
|
+
| --- | --- | --- | --- |
|
|
95
|
+
| `concurrency` | `number` | `1` | Maximum number of records processed in parallel. `1` runs records one at a time. A value greater than `1` uses a bounded pool, and the order of `batchItemFailures` is not guaranteed. The value must be a finite integer greater than or equal to 1. A smaller value throws `SqsPartialBatchProcessorRangeError`. Any other invalid value throws `SqsPartialBatchProcessorTypeError`. Check the subclass before `SqsPartialBatchProcessorError`. Start with `1` and raise it while watching downstream limits such as API rate limits, database pools, and Lambda reserved concurrency. |
|
|
96
|
+
| `onRecordError` | `(record, error) => void` | | Called when a record handler throws. A throw from this hook leaves that record in `batchItemFailures` and lets the other records continue. Avoid logging `record.body`. Prefer `messageId`, the `mapMessageId` result, and a sanitized error summary. When `mapMessageId` throws, `error` is that thrown value and the reported identifier is `record.messageId`. |
|
|
97
|
+
| `mapMessageId` | `(record) => string` | `record.messageId` | Returns the `itemIdentifier` reported for a record. Use it to align the identifier with an application-level id, such as one stored in `messageAttributes` or the parsed payload. When this function throws, that record is reported with `record.messageId` and the remaining records are still processed. |
|
|
98
|
+
|
|
99
|
+
## Requirements
|
|
100
|
+
|
|
101
|
+
- Node.js `>= 20.0.0`
|
|
120
102
|
|
|
121
103
|
## License
|
|
122
104
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimum accepted `concurrency`. Also the default when the option is omitted.
|
|
3
|
+
*/
|
|
4
|
+
export declare const MIN_CONCURRENCY = 1;
|
|
5
|
+
/**
|
|
6
|
+
* Returns whether records run one at a time.
|
|
7
|
+
*
|
|
8
|
+
* @param concurrency Validated concurrency value.
|
|
9
|
+
* @returns `true` when `concurrency` is at most {@link MIN_CONCURRENCY}.
|
|
10
|
+
*/
|
|
11
|
+
export declare const isSequentialConcurrency: (concurrency: number) => boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Returns whether a worker still has an index to process.
|
|
14
|
+
*
|
|
15
|
+
* @param workIndex The index claimed from the work queue, or `undefined` when empty.
|
|
16
|
+
* @returns `true` when `workIndex` is a remaining item index.
|
|
17
|
+
*/
|
|
18
|
+
export declare const hasRemainingWork: (workIndex: number | undefined) => workIndex is number;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hasRemainingWork = exports.isSequentialConcurrency = exports.MIN_CONCURRENCY = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Minimum accepted `concurrency`. Also the default when the option is omitted.
|
|
6
|
+
*/
|
|
7
|
+
exports.MIN_CONCURRENCY = 1;
|
|
8
|
+
/**
|
|
9
|
+
* Returns whether records run one at a time.
|
|
10
|
+
*
|
|
11
|
+
* @param concurrency Validated concurrency value.
|
|
12
|
+
* @returns `true` when `concurrency` is at most {@link MIN_CONCURRENCY}.
|
|
13
|
+
*/
|
|
14
|
+
const isSequentialConcurrency = (concurrency) => concurrency <= exports.MIN_CONCURRENCY;
|
|
15
|
+
exports.isSequentialConcurrency = isSequentialConcurrency;
|
|
16
|
+
/**
|
|
17
|
+
* Returns whether a worker still has an index to process.
|
|
18
|
+
*
|
|
19
|
+
* @param workIndex The index claimed from the work queue, or `undefined` when empty.
|
|
20
|
+
* @returns `true` when `workIndex` is a remaining item index.
|
|
21
|
+
*/
|
|
22
|
+
const hasRemainingWork = (workIndex) => workIndex !== undefined;
|
|
23
|
+
exports.hasRemainingWork = hasRemainingWork;
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY3VycmVuY3ktcHJlZGljYXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL2NvbmN1cnJlbmN5LXByZWRpY2F0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDVSxRQUFBLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFFakM7Ozs7O0dBS0c7QUFDSSxNQUFNLHVCQUF1QixHQUFHLENBQUMsV0FBbUIsRUFBVyxFQUFFLENBQ3RFLFdBQVcsSUFBSSx1QkFBZSxDQUFDO0FBRHBCLFFBQUEsdUJBQXVCLDJCQUNIO0FBRWpDOzs7OztHQUtHO0FBQ0ksTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFNBQTZCLEVBQXVCLEVBQUUsQ0FDckYsU0FBUyxLQUFLLFNBQVMsQ0FBQztBQURiLFFBQUEsZ0JBQWdCLG9CQUNIIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNaW5pbXVtIGFjY2VwdGVkIGBjb25jdXJyZW5jeWAuIEFsc28gdGhlIGRlZmF1bHQgd2hlbiB0aGUgb3B0aW9uIGlzIG9taXR0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNSU5fQ09OQ1VSUkVOQ1kgPSAxO1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciByZWNvcmRzIHJ1biBvbmUgYXQgYSB0aW1lLlxuICpcbiAqIEBwYXJhbSBjb25jdXJyZW5jeSBWYWxpZGF0ZWQgY29uY3VycmVuY3kgdmFsdWUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiBgY29uY3VycmVuY3lgIGlzIGF0IG1vc3Qge0BsaW5rIE1JTl9DT05DVVJSRU5DWX0uXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NlcXVlbnRpYWxDb25jdXJyZW5jeSA9IChjb25jdXJyZW5jeTogbnVtYmVyKTogYm9vbGVhbiA9PlxuICBjb25jdXJyZW5jeSA8PSBNSU5fQ09OQ1VSUkVOQ1k7XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgd29ya2VyIHN0aWxsIGhhcyBhbiBpbmRleCB0byBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSB3b3JrSW5kZXggVGhlIGluZGV4IGNsYWltZWQgZnJvbSB0aGUgd29yayBxdWV1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBlbXB0eS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIGB3b3JrSW5kZXhgIGlzIGEgcmVtYWluaW5nIGl0ZW0gaW5kZXguXG4gKi9cbmV4cG9ydCBjb25zdCBoYXNSZW1haW5pbmdXb3JrID0gKHdvcmtJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkKTogd29ya0luZGV4IGlzIG51bWJlciA9PlxuICB3b3JrSW5kZXggIT09IHVuZGVmaW5lZDtcbiJdfQ==
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves and validates the `concurrency` option.
|
|
3
|
+
*
|
|
4
|
+
* @param value User-provided concurrency.
|
|
5
|
+
* @returns A validated concurrency value (defaults to {@link MIN_CONCURRENCY}).
|
|
6
|
+
* @throws {@link SqsPartialBatchProcessorRangeError} When `value` is less than {@link MIN_CONCURRENCY}.
|
|
7
|
+
* @throws {@link SqsPartialBatchProcessorTypeError} When `value` is not a finite integer.
|
|
8
|
+
*/
|
|
9
|
+
export declare const resolveConcurrency: (value: number | undefined) => number;
|
|
10
|
+
/**
|
|
11
|
+
* Runs `fn` over `items` with at most `concurrency` parallel workers.
|
|
12
|
+
* Each worker pulls the next index until none remain.
|
|
13
|
+
*
|
|
14
|
+
* An `undefined` item ends that worker. With one worker, later indexes stay unclaimed.
|
|
15
|
+
*
|
|
16
|
+
* @param items Items to process.
|
|
17
|
+
* @param concurrency Maximum parallel workers (validated integer `>= 1`).
|
|
18
|
+
* @param fn Async handler invoked for each item.
|
|
19
|
+
* @returns A promise that resolves when every claimed item has been processed.
|
|
20
|
+
*/
|
|
21
|
+
export declare const runWithConcurrency: <T>(items: readonly T[], concurrency: number, fn: (item: T) => Promise<void>) => Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Runs `fn` over `items` one at a time, or through the bounded worker pool.
|
|
24
|
+
*
|
|
25
|
+
* @param items Items to process.
|
|
26
|
+
* @param concurrency User-provided concurrency. Omitted means sequential.
|
|
27
|
+
* @param fn Async handler invoked for each item.
|
|
28
|
+
* @returns A promise that resolves when every item has been processed.
|
|
29
|
+
* @throws {@link SqsPartialBatchProcessorRangeError} When `concurrency` is less than {@link MIN_CONCURRENCY}.
|
|
30
|
+
* @throws {@link SqsPartialBatchProcessorTypeError} When `concurrency` is not a finite integer.
|
|
31
|
+
*/
|
|
32
|
+
export declare const runAtConcurrency: <T>(items: readonly T[], concurrency: number | undefined, fn: (item: T) => Promise<void>) => Promise<void>;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runAtConcurrency = exports.runWithConcurrency = exports.resolveConcurrency = void 0;
|
|
4
|
+
const concurrency_predicates_1 = require("./concurrency-predicates");
|
|
5
|
+
const errors_1 = require("./errors");
|
|
6
|
+
/**
|
|
7
|
+
* Resolves and validates the `concurrency` option.
|
|
8
|
+
*
|
|
9
|
+
* @param value User-provided concurrency.
|
|
10
|
+
* @returns A validated concurrency value (defaults to {@link MIN_CONCURRENCY}).
|
|
11
|
+
* @throws {@link SqsPartialBatchProcessorRangeError} When `value` is less than {@link MIN_CONCURRENCY}.
|
|
12
|
+
* @throws {@link SqsPartialBatchProcessorTypeError} When `value` is not a finite integer.
|
|
13
|
+
*/
|
|
14
|
+
const resolveConcurrency = (value) => {
|
|
15
|
+
if (value === undefined) {
|
|
16
|
+
return concurrency_predicates_1.MIN_CONCURRENCY;
|
|
17
|
+
}
|
|
18
|
+
if (!Number.isFinite(value) || !Number.isInteger(value)) {
|
|
19
|
+
throw new errors_1.SqsPartialBatchProcessorTypeError('concurrency must be a finite integer');
|
|
20
|
+
}
|
|
21
|
+
if (value < concurrency_predicates_1.MIN_CONCURRENCY) {
|
|
22
|
+
throw new errors_1.SqsPartialBatchProcessorRangeError(`concurrency must be >= ${concurrency_predicates_1.MIN_CONCURRENCY}`);
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
};
|
|
26
|
+
exports.resolveConcurrency = resolveConcurrency;
|
|
27
|
+
/**
|
|
28
|
+
* Runs `fn` over `items` with at most `concurrency` parallel workers.
|
|
29
|
+
* Each worker pulls the next index until none remain.
|
|
30
|
+
*
|
|
31
|
+
* An `undefined` item ends that worker. With one worker, later indexes stay unclaimed.
|
|
32
|
+
*
|
|
33
|
+
* @param items Items to process.
|
|
34
|
+
* @param concurrency Maximum parallel workers (validated integer `>= 1`).
|
|
35
|
+
* @param fn Async handler invoked for each item.
|
|
36
|
+
* @returns A promise that resolves when every claimed item has been processed.
|
|
37
|
+
*/
|
|
38
|
+
const runWithConcurrency = async (items, concurrency, fn) => {
|
|
39
|
+
if (items.length === 0) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const limit = Math.min(concurrency, items.length);
|
|
43
|
+
let next = 0;
|
|
44
|
+
/**
|
|
45
|
+
* Claims the next work index, or `undefined` when the queue is empty.
|
|
46
|
+
*
|
|
47
|
+
* @returns The next index to process, or `undefined` if none remain.
|
|
48
|
+
*/
|
|
49
|
+
const takeNextIndex = () => {
|
|
50
|
+
const index = next;
|
|
51
|
+
next += 1;
|
|
52
|
+
if (index >= items.length) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
return index;
|
|
56
|
+
};
|
|
57
|
+
const workers = [];
|
|
58
|
+
for (let w = 0; w < limit; w++) {
|
|
59
|
+
workers.push((async () => {
|
|
60
|
+
let workIndex = takeNextIndex();
|
|
61
|
+
while ((0, concurrency_predicates_1.hasRemainingWork)(workIndex)) {
|
|
62
|
+
const item = items[workIndex];
|
|
63
|
+
if (item === undefined) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
await fn(item);
|
|
67
|
+
workIndex = takeNextIndex();
|
|
68
|
+
}
|
|
69
|
+
})());
|
|
70
|
+
}
|
|
71
|
+
await Promise.all(workers);
|
|
72
|
+
};
|
|
73
|
+
exports.runWithConcurrency = runWithConcurrency;
|
|
74
|
+
/**
|
|
75
|
+
* Runs `fn` over `items` one at a time, or through the bounded worker pool.
|
|
76
|
+
*
|
|
77
|
+
* @param items Items to process.
|
|
78
|
+
* @param concurrency User-provided concurrency. Omitted means sequential.
|
|
79
|
+
* @param fn Async handler invoked for each item.
|
|
80
|
+
* @returns A promise that resolves when every item has been processed.
|
|
81
|
+
* @throws {@link SqsPartialBatchProcessorRangeError} When `concurrency` is less than {@link MIN_CONCURRENCY}.
|
|
82
|
+
* @throws {@link SqsPartialBatchProcessorTypeError} When `concurrency` is not a finite integer.
|
|
83
|
+
*/
|
|
84
|
+
const runAtConcurrency = async (items, concurrency, fn) => {
|
|
85
|
+
const limit = (0, exports.resolveConcurrency)(concurrency);
|
|
86
|
+
if ((0, concurrency_predicates_1.isSequentialConcurrency)(limit)) {
|
|
87
|
+
for (const item of items) {
|
|
88
|
+
await fn(item);
|
|
89
|
+
}
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
await (0, exports.runWithConcurrency)(items, limit, fn);
|
|
93
|
+
};
|
|
94
|
+
exports.runAtConcurrency = runAtConcurrency;
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY3VycmVuY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9jb25jdXJyZW5jeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBc0c7QUFDdEcscUNBQWlHO0FBRWpHOzs7Ozs7O0dBT0c7QUFDSSxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBeUIsRUFBVSxFQUFFO0lBQ3RFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sd0NBQWUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEQsTUFBTSxJQUFJLDBDQUFpQyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUNELElBQUksS0FBSyxHQUFHLHdDQUFlLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksMkNBQWtDLENBQUMsMEJBQTBCLHdDQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQVhXLFFBQUEsa0JBQWtCLHNCQVc3QjtBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSSxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFDckMsS0FBbUIsRUFDbkIsV0FBbUIsRUFDbkIsRUFBOEIsRUFDZixFQUFFO0lBQ2pCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFFYjs7OztPQUlHO0lBQ0gsTUFBTSxhQUFhLEdBQUcsR0FBdUIsRUFBRTtRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNWLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFFRixNQUFNLE9BQU8sR0FBb0IsRUFBRSxDQUFDO0lBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDdkIsSUFBSSxTQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFBLHlDQUFnQixFQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3ZCLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDZixTQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNSLENBQUM7SUFDRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0IsQ0FBQyxDQUFDO0FBeENXLFFBQUEsa0JBQWtCLHNCQXdDN0I7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSSxNQUFNLGdCQUFnQixHQUFHLEtBQUssRUFDbkMsS0FBbUIsRUFDbkIsV0FBK0IsRUFDL0IsRUFBOEIsRUFDZixFQUFFO0lBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUEsMEJBQWtCLEVBQUMsV0FBVyxDQUFDLENBQUM7SUFFOUMsSUFBSSxJQUFBLGdEQUF1QixFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLElBQUEsMEJBQWtCLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM3QyxDQUFDLENBQUM7QUFmVyxRQUFBLGdCQUFnQixvQkFlM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBoYXNSZW1haW5pbmdXb3JrLCBpc1NlcXVlbnRpYWxDb25jdXJyZW5jeSwgTUlOX0NPTkNVUlJFTkNZIH0gZnJvbSAnLi9jb25jdXJyZW5jeS1wcmVkaWNhdGVzJztcbmltcG9ydCB7IFNxc1BhcnRpYWxCYXRjaFByb2Nlc3NvclJhbmdlRXJyb3IsIFNxc1BhcnRpYWxCYXRjaFByb2Nlc3NvclR5cGVFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBSZXNvbHZlcyBhbmQgdmFsaWRhdGVzIHRoZSBgY29uY3VycmVuY3lgIG9wdGlvbi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVXNlci1wcm92aWRlZCBjb25jdXJyZW5jeS5cbiAqIEByZXR1cm5zIEEgdmFsaWRhdGVkIGNvbmN1cnJlbmN5IHZhbHVlIChkZWZhdWx0cyB0byB7QGxpbmsgTUlOX0NPTkNVUlJFTkNZfSkuXG4gKiBAdGhyb3dzIHtAbGluayBTcXNQYXJ0aWFsQmF0Y2hQcm9jZXNzb3JSYW5nZUVycm9yfSBXaGVuIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIHtAbGluayBNSU5fQ09OQ1VSUkVOQ1l9LlxuICogQHRocm93cyB7QGxpbmsgU3FzUGFydGlhbEJhdGNoUHJvY2Vzc29yVHlwZUVycm9yfSBXaGVuIGB2YWx1ZWAgaXMgbm90IGEgZmluaXRlIGludGVnZXIuXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlQ29uY3VycmVuY3kgPSAodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIE1JTl9DT05DVVJSRU5DWTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgIU51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFNxc1BhcnRpYWxCYXRjaFByb2Nlc3NvclR5cGVFcnJvcignY29uY3VycmVuY3kgbXVzdCBiZSBhIGZpbml0ZSBpbnRlZ2VyJyk7XG4gIH1cbiAgaWYgKHZhbHVlIDwgTUlOX0NPTkNVUlJFTkNZKSB7XG4gICAgdGhyb3cgbmV3IFNxc1BhcnRpYWxCYXRjaFByb2Nlc3NvclJhbmdlRXJyb3IoYGNvbmN1cnJlbmN5IG11c3QgYmUgPj0gJHtNSU5fQ09OQ1VSUkVOQ1l9YCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBSdW5zIGBmbmAgb3ZlciBgaXRlbXNgIHdpdGggYXQgbW9zdCBgY29uY3VycmVuY3lgIHBhcmFsbGVsIHdvcmtlcnMuXG4gKiBFYWNoIHdvcmtlciBwdWxscyB0aGUgbmV4dCBpbmRleCB1bnRpbCBub25lIHJlbWFpbi5cbiAqXG4gKiBBbiBgdW5kZWZpbmVkYCBpdGVtIGVuZHMgdGhhdCB3b3JrZXIuIFdpdGggb25lIHdvcmtlciwgbGF0ZXIgaW5kZXhlcyBzdGF5IHVuY2xhaW1lZC5cbiAqXG4gKiBAcGFyYW0gaXRlbXMgSXRlbXMgdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSBjb25jdXJyZW5jeSBNYXhpbXVtIHBhcmFsbGVsIHdvcmtlcnMgKHZhbGlkYXRlZCBpbnRlZ2VyIGA+PSAxYCkuXG4gKiBAcGFyYW0gZm4gQXN5bmMgaGFuZGxlciBpbnZva2VkIGZvciBlYWNoIGl0ZW0uXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IGNsYWltZWQgaXRlbSBoYXMgYmVlbiBwcm9jZXNzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBydW5XaXRoQ29uY3VycmVuY3kgPSBhc3luYyA8VD4oXG4gIGl0ZW1zOiByZWFkb25seSBUW10sXG4gIGNvbmN1cnJlbmN5OiBudW1iZXIsXG4gIGZuOiAoaXRlbTogVCkgPT4gUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oY29uY3VycmVuY3ksIGl0ZW1zLmxlbmd0aCk7XG4gIGxldCBuZXh0ID0gMDtcblxuICAvKipcbiAgICogQ2xhaW1zIHRoZSBuZXh0IHdvcmsgaW5kZXgsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmV4dCBpbmRleCB0byBwcm9jZXNzLCBvciBgdW5kZWZpbmVkYCBpZiBub25lIHJlbWFpbi5cbiAgICovXG4gIGNvbnN0IHRha2VOZXh0SW5kZXggPSAoKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IG5leHQ7XG4gICAgbmV4dCArPSAxO1xuICAgIGlmIChpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfTtcblxuICBjb25zdCB3b3JrZXJzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgZm9yIChsZXQgdyA9IDA7IHcgPCBsaW1pdDsgdysrKSB7XG4gICAgd29ya2Vycy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgd29ya0luZGV4ID0gdGFrZU5leHRJbmRleCgpO1xuICAgICAgd2hpbGUgKGhhc1JlbWFpbmluZ1dvcmsod29ya0luZGV4KSkge1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbd29ya0luZGV4XTtcbiAgICAgICAgaWYgKGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBmbihpdGVtKTtcbiAgICAgICAgd29ya0luZGV4ID0gdGFrZU5leHRJbmRleCgpO1xuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKHdvcmtlcnMpO1xufTtcblxuLyoqXG4gKiBSdW5zIGBmbmAgb3ZlciBgaXRlbXNgIG9uZSBhdCBhIHRpbWUsIG9yIHRocm91Z2ggdGhlIGJvdW5kZWQgd29ya2VyIHBvb2wuXG4gKlxuICogQHBhcmFtIGl0ZW1zIEl0ZW1zIHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0gY29uY3VycmVuY3kgVXNlci1wcm92aWRlZCBjb25jdXJyZW5jeS4gT21pdHRlZCBtZWFucyBzZXF1ZW50aWFsLlxuICogQHBhcmFtIGZuIEFzeW5jIGhhbmRsZXIgaW52b2tlZCBmb3IgZWFjaCBpdGVtLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBpdGVtIGhhcyBiZWVuIHByb2Nlc3NlZC5cbiAqIEB0aHJvd3Mge0BsaW5rIFNxc1BhcnRpYWxCYXRjaFByb2Nlc3NvclJhbmdlRXJyb3J9IFdoZW4gYGNvbmN1cnJlbmN5YCBpcyBsZXNzIHRoYW4ge0BsaW5rIE1JTl9DT05DVVJSRU5DWX0uXG4gKiBAdGhyb3dzIHtAbGluayBTcXNQYXJ0aWFsQmF0Y2hQcm9jZXNzb3JUeXBlRXJyb3J9IFdoZW4gYGNvbmN1cnJlbmN5YCBpcyBub3QgYSBmaW5pdGUgaW50ZWdlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHJ1bkF0Q29uY3VycmVuY3kgPSBhc3luYyA8VD4oXG4gIGl0ZW1zOiByZWFkb25seSBUW10sXG4gIGNvbmN1cnJlbmN5OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGZuOiAoaXRlbTogVCkgPT4gUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBsaW1pdCA9IHJlc29sdmVDb25jdXJyZW5jeShjb25jdXJyZW5jeSk7XG5cbiAgaWYgKGlzU2VxdWVudGlhbENvbmN1cnJlbmN5KGxpbWl0KSkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgYXdhaXQgZm4oaXRlbSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHJ1bldpdGhDb25jdXJyZW5jeShpdGVtcywgbGltaXQsIGZuKTtcbn07XG4iXX0=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error for failures thrown by this package.
|
|
3
|
+
*/
|
|
4
|
+
export declare abstract class SqsPartialBatchProcessorError extends Error {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
/**
|
|
7
|
+
* @param message Error message.
|
|
8
|
+
*/
|
|
9
|
+
protected constructor(message: string);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Thrown when `concurrency` is less than 1.
|
|
13
|
+
*/
|
|
14
|
+
export declare class SqsPartialBatchProcessorRangeError extends SqsPartialBatchProcessorError {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
/**
|
|
17
|
+
* @param message Error message.
|
|
18
|
+
*/
|
|
19
|
+
constructor(message: string);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Thrown when `concurrency` is not a finite integer.
|
|
23
|
+
*/
|
|
24
|
+
export declare class SqsPartialBatchProcessorTypeError extends SqsPartialBatchProcessorError {
|
|
25
|
+
readonly name: string;
|
|
26
|
+
/**
|
|
27
|
+
* @param message Error message.
|
|
28
|
+
*/
|
|
29
|
+
constructor(message: string);
|
|
30
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SqsPartialBatchProcessorTypeError = exports.SqsPartialBatchProcessorRangeError = exports.SqsPartialBatchProcessorError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Base error for failures thrown by this package.
|
|
6
|
+
*/
|
|
7
|
+
class SqsPartialBatchProcessorError extends Error {
|
|
8
|
+
/**
|
|
9
|
+
* @param message Error message.
|
|
10
|
+
*/
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'SqsPartialBatchProcessorError';
|
|
14
|
+
Object.setPrototypeOf(this, SqsPartialBatchProcessorError.prototype);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.SqsPartialBatchProcessorError = SqsPartialBatchProcessorError;
|
|
18
|
+
/**
|
|
19
|
+
* Thrown when `concurrency` is less than 1.
|
|
20
|
+
*/
|
|
21
|
+
class SqsPartialBatchProcessorRangeError extends SqsPartialBatchProcessorError {
|
|
22
|
+
/**
|
|
23
|
+
* @param message Error message.
|
|
24
|
+
*/
|
|
25
|
+
constructor(message) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.name = 'SqsPartialBatchProcessorRangeError';
|
|
28
|
+
Object.setPrototypeOf(this, SqsPartialBatchProcessorRangeError.prototype);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.SqsPartialBatchProcessorRangeError = SqsPartialBatchProcessorRangeError;
|
|
32
|
+
/**
|
|
33
|
+
* Thrown when `concurrency` is not a finite integer.
|
|
34
|
+
*/
|
|
35
|
+
class SqsPartialBatchProcessorTypeError extends SqsPartialBatchProcessorError {
|
|
36
|
+
/**
|
|
37
|
+
* @param message Error message.
|
|
38
|
+
*/
|
|
39
|
+
constructor(message) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.name = 'SqsPartialBatchProcessorTypeError';
|
|
42
|
+
Object.setPrototypeOf(this, SqsPartialBatchProcessorTypeError.prototype);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.SqsPartialBatchProcessorTypeError = SqsPartialBatchProcessorTypeError;
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsTUFBc0IsNkJBQThCLFNBQVEsS0FBSztJQUcvRDs7T0FFRztJQUNILFlBQXNCLE9BQWU7UUFDbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBTkMsU0FBSSxHQUFXLCtCQUErQixDQUFDO1FBTy9ELE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLDZCQUE2QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7Q0FDRjtBQVZELHNFQVVDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLGtDQUFtQyxTQUFRLDZCQUE2QjtJQUduRjs7T0FFRztJQUNILFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFOQyxTQUFJLEdBQVcsb0NBQW9DLENBQUM7UUFPcEUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUUsQ0FBQztDQUNGO0FBVkQsZ0ZBVUM7QUFFRDs7R0FFRztBQUNILE1BQWEsaUNBQWtDLFNBQVEsNkJBQTZCO0lBR2xGOztPQUVHO0lBQ0gsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQU5DLFNBQUksR0FBVyxtQ0FBbUMsQ0FBQztRQU9uRSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxpQ0FBaUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRSxDQUFDO0NBQ0Y7QUFWRCw4RUFVQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZSBlcnJvciBmb3IgZmFpbHVyZXMgdGhyb3duIGJ5IHRoaXMgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNxc1BhcnRpYWxCYXRjaFByb2Nlc3NvckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBuYW1lOiBzdHJpbmcgPSAnU3FzUGFydGlhbEJhdGNoUHJvY2Vzc29yRXJyb3InO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSBFcnJvciBtZXNzYWdlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBTcXNQYXJ0aWFsQmF0Y2hQcm9jZXNzb3JFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYGNvbmN1cnJlbmN5YCBpcyBsZXNzIHRoYW4gMS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNxc1BhcnRpYWxCYXRjaFByb2Nlc3NvclJhbmdlRXJyb3IgZXh0ZW5kcyBTcXNQYXJ0aWFsQmF0Y2hQcm9jZXNzb3JFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9ICdTcXNQYXJ0aWFsQmF0Y2hQcm9jZXNzb3JSYW5nZUVycm9yJztcblxuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgRXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBTcXNQYXJ0aWFsQmF0Y2hQcm9jZXNzb3JSYW5nZUVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBgY29uY3VycmVuY3lgIGlzIG5vdCBhIGZpbml0ZSBpbnRlZ2VyLlxuICovXG5leHBvcnQgY2xhc3MgU3FzUGFydGlhbEJhdGNoUHJvY2Vzc29yVHlwZUVycm9yIGV4dGVuZHMgU3FzUGFydGlhbEJhdGNoUHJvY2Vzc29yRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBuYW1lOiBzdHJpbmcgPSAnU3FzUGFydGlhbEJhdGNoUHJvY2Vzc29yVHlwZUVycm9yJztcblxuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgRXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBTcXNQYXJ0aWFsQmF0Y2hQcm9jZXNzb3JUeXBlRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.itemFailure = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Creates a single `batchItemFailures` entry for a failed record.
|
|
6
|
+
*
|
|
7
|
+
* @param itemIdentifier The identifier reported back to Lambda.
|
|
8
|
+
* @returns An object suitable for {@link SQSBatchResponse.batchItemFailures}.
|
|
9
|
+
*/
|
|
10
|
+
const itemFailure = (itemIdentifier) => ({
|
|
11
|
+
itemIdentifier,
|
|
12
|
+
});
|
|
13
|
+
exports.itemFailure = itemFailure;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS1mYWlsdXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvaXRlbS1mYWlsdXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBOzs7OztHQUtHO0FBQ0ksTUFBTSxXQUFXLEdBQUcsQ0FDekIsY0FBc0IsRUFDeUIsRUFBRSxDQUFDLENBQUM7SUFDbkQsY0FBYztDQUNmLENBQUMsQ0FBQztBQUpVLFFBQUEsV0FBVyxlQUlyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU1FTQmF0Y2hSZXNwb25zZSB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW5nbGUgYGJhdGNoSXRlbUZhaWx1cmVzYCBlbnRyeSBmb3IgYSBmYWlsZWQgcmVjb3JkLlxuICpcbiAqIEBwYXJhbSBpdGVtSWRlbnRpZmllciBUaGUgaWRlbnRpZmllciByZXBvcnRlZCBiYWNrIHRvIExhbWJkYS5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBzdWl0YWJsZSBmb3Ige0BsaW5rIFNRU0JhdGNoUmVzcG9uc2UuYmF0Y2hJdGVtRmFpbHVyZXN9LlxuICovXG5leHBvcnQgY29uc3QgaXRlbUZhaWx1cmUgPSAoXG4gIGl0ZW1JZGVudGlmaWVyOiBzdHJpbmcsXG4pOiBTUVNCYXRjaFJlc3BvbnNlWydiYXRjaEl0ZW1GYWlsdXJlcyddW251bWJlcl0gPT4gKHtcbiAgaXRlbUlkZW50aWZpZXIsXG59KTtcbiJdfQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SQSBatchResponse, SQSRecord } from 'aws-lambda';
|
|
2
|
+
import type { ProcessPartialBatchOptions } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Reports one failed record inside the per-record boundary.
|
|
5
|
+
*
|
|
6
|
+
* Invokes `onRecordError` when set. A throw from the hook is caught here so
|
|
7
|
+
* the processor promise still resolves and other records keep running.
|
|
8
|
+
* The resolved `itemIdentifier` is always appended to `batchItemFailures`.
|
|
9
|
+
*
|
|
10
|
+
* @param batchItemFailures Failure list for the current batch.
|
|
11
|
+
* @param record The SQS record that failed.
|
|
12
|
+
* @param itemIdentifier Identifier already resolved for this record.
|
|
13
|
+
* @param error The failure passed to `onRecordError`.
|
|
14
|
+
* @param onRecordError Optional per-record error hook.
|
|
15
|
+
*/
|
|
16
|
+
export declare const reportRecordFailure: (batchItemFailures: SQSBatchResponse["batchItemFailures"], record: SQSRecord, itemIdentifier: string, error: unknown, onRecordError: ProcessPartialBatchOptions["onRecordError"]) => void;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reportRecordFailure = void 0;
|
|
4
|
+
const item_failure_1 = require("./item-failure");
|
|
5
|
+
/**
|
|
6
|
+
* Reports one failed record inside the per-record boundary.
|
|
7
|
+
*
|
|
8
|
+
* Invokes `onRecordError` when set. A throw from the hook is caught here so
|
|
9
|
+
* the processor promise still resolves and other records keep running.
|
|
10
|
+
* The resolved `itemIdentifier` is always appended to `batchItemFailures`.
|
|
11
|
+
*
|
|
12
|
+
* @param batchItemFailures Failure list for the current batch.
|
|
13
|
+
* @param record The SQS record that failed.
|
|
14
|
+
* @param itemIdentifier Identifier already resolved for this record.
|
|
15
|
+
* @param error The failure passed to `onRecordError`.
|
|
16
|
+
* @param onRecordError Optional per-record error hook.
|
|
17
|
+
*/
|
|
18
|
+
const reportRecordFailure = (batchItemFailures, record, itemIdentifier, error, onRecordError) => {
|
|
19
|
+
try {
|
|
20
|
+
onRecordError?.(record, error);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Hook failures stay inside this record. The item is still reported below.
|
|
24
|
+
}
|
|
25
|
+
batchItemFailures.push((0, item_failure_1.itemFailure)(itemIdentifier));
|
|
26
|
+
};
|
|
27
|
+
exports.reportRecordFailure = reportRecordFailure;
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXJlY29yZC1mYWlsdXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcmVwb3J0LXJlY29yZC1mYWlsdXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGlEQUE2QztBQUc3Qzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSSxNQUFNLG1CQUFtQixHQUFHLENBQ2pDLGlCQUF3RCxFQUN4RCxNQUFpQixFQUNqQixjQUFzQixFQUN0QixLQUFjLEVBQ2QsYUFBMEQsRUFDcEQsRUFBRTtJQUNSLElBQUksQ0FBQztRQUNILGFBQWEsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsMkVBQTJFO0lBQzdFLENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBQSwwQkFBVyxFQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQyxDQUFDO0FBYlcsUUFBQSxtQkFBbUIsdUJBYTlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTUVNCYXRjaFJlc3BvbnNlLCBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IGl0ZW1GYWlsdXJlIH0gZnJvbSAnLi9pdGVtLWZhaWx1cmUnO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzUGFydGlhbEJhdGNoT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFJlcG9ydHMgb25lIGZhaWxlZCByZWNvcmQgaW5zaWRlIHRoZSBwZXItcmVjb3JkIGJvdW5kYXJ5LlxuICpcbiAqIEludm9rZXMgYG9uUmVjb3JkRXJyb3JgIHdoZW4gc2V0LiBBIHRocm93IGZyb20gdGhlIGhvb2sgaXMgY2F1Z2h0IGhlcmUgc29cbiAqIHRoZSBwcm9jZXNzb3IgcHJvbWlzZSBzdGlsbCByZXNvbHZlcyBhbmQgb3RoZXIgcmVjb3JkcyBrZWVwIHJ1bm5pbmcuXG4gKiBUaGUgcmVzb2x2ZWQgYGl0ZW1JZGVudGlmaWVyYCBpcyBhbHdheXMgYXBwZW5kZWQgdG8gYGJhdGNoSXRlbUZhaWx1cmVzYC5cbiAqXG4gKiBAcGFyYW0gYmF0Y2hJdGVtRmFpbHVyZXMgRmFpbHVyZSBsaXN0IGZvciB0aGUgY3VycmVudCBiYXRjaC5cbiAqIEBwYXJhbSByZWNvcmQgVGhlIFNRUyByZWNvcmQgdGhhdCBmYWlsZWQuXG4gKiBAcGFyYW0gaXRlbUlkZW50aWZpZXIgSWRlbnRpZmllciBhbHJlYWR5IHJlc29sdmVkIGZvciB0aGlzIHJlY29yZC5cbiAqIEBwYXJhbSBlcnJvciBUaGUgZmFpbHVyZSBwYXNzZWQgdG8gYG9uUmVjb3JkRXJyb3JgLlxuICogQHBhcmFtIG9uUmVjb3JkRXJyb3IgT3B0aW9uYWwgcGVyLXJlY29yZCBlcnJvciBob29rLlxuICovXG5leHBvcnQgY29uc3QgcmVwb3J0UmVjb3JkRmFpbHVyZSA9IChcbiAgYmF0Y2hJdGVtRmFpbHVyZXM6IFNRU0JhdGNoUmVzcG9uc2VbJ2JhdGNoSXRlbUZhaWx1cmVzJ10sXG4gIHJlY29yZDogU1FTUmVjb3JkLFxuICBpdGVtSWRlbnRpZmllcjogc3RyaW5nLFxuICBlcnJvcjogdW5rbm93bixcbiAgb25SZWNvcmRFcnJvcjogUHJvY2Vzc1BhcnRpYWxCYXRjaE9wdGlvbnNbJ29uUmVjb3JkRXJyb3InXSxcbik6IHZvaWQgPT4ge1xuICB0cnkge1xuICAgIG9uUmVjb3JkRXJyb3I/LihyZWNvcmQsIGVycm9yKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSG9vayBmYWlsdXJlcyBzdGF5IGluc2lkZSB0aGlzIHJlY29yZC4gVGhlIGl0ZW0gaXMgc3RpbGwgcmVwb3J0ZWQgYmVsb3cuXG4gIH1cbiAgYmF0Y2hJdGVtRmFpbHVyZXMucHVzaChpdGVtRmFpbHVyZShpdGVtSWRlbnRpZmllcikpO1xufTtcbiJdfQ==
|
|
@@ -1,17 +1,6 @@
|
|
|
1
1
|
import type { SQSRecord } from 'aws-lambda';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* - `{ ok: true }`: success (not listed in `batchItemFailures`)
|
|
6
|
-
* - `{ ok: false }`: failure (listed in `batchItemFailures`)
|
|
7
|
-
*/
|
|
8
|
-
export type ProcessRecordResult = {
|
|
9
|
-
ok: true;
|
|
10
|
-
} | {
|
|
11
|
-
ok: false;
|
|
12
|
-
};
|
|
13
|
-
/**
|
|
14
|
-
* Options for {@link processPartialBatch} and {@link processPartialBatchWithResult}.
|
|
3
|
+
* Options for {@link processPartialBatch}.
|
|
15
4
|
*/
|
|
16
5
|
export interface ProcessPartialBatchOptions {
|
|
17
6
|
/**
|
|
@@ -21,30 +10,35 @@ export interface ProcessPartialBatchOptions {
|
|
|
21
10
|
* - `> 1`: bounded concurrency pool (order of {@link SQSBatchResponse.batchItemFailures} is not guaranteed)
|
|
22
11
|
*
|
|
23
12
|
* @default 1
|
|
24
|
-
* @throws {
|
|
25
|
-
* @throws {
|
|
13
|
+
* @throws {@link SqsPartialBatchProcessorRangeError} When `concurrency` is less than 1.
|
|
14
|
+
* @throws {@link SqsPartialBatchProcessorTypeError} When `concurrency` is not a finite integer.
|
|
26
15
|
*/
|
|
27
16
|
readonly concurrency?: number;
|
|
28
17
|
/**
|
|
29
|
-
* Called when a record
|
|
18
|
+
* Called when a record handler throws.
|
|
30
19
|
* Use for logging or metrics; the library does not write to `console` by default.
|
|
31
20
|
*
|
|
32
|
-
* For `{ ok: false }` from {@link processPartialBatchWithResult}, `error` is an `Error`
|
|
33
|
-
* whose message includes the resolved `itemIdentifier`, and whose `cause` is
|
|
34
|
-
* `{ itemIdentifier }` for structured logging.
|
|
35
|
-
*
|
|
36
21
|
* Do not log `record.body` as-is — it may contain secrets or personal data.
|
|
37
22
|
* Prefer identifiers such as `record.messageId` (or your `mapMessageId` result)
|
|
38
23
|
* and a sanitized error summary.
|
|
39
24
|
*
|
|
25
|
+
* A throw from this hook does not reject the processor. The record is still
|
|
26
|
+
* listed in `batchItemFailures` with the identifier already resolved for it.
|
|
27
|
+
* When `mapMessageId` throws, `error` is that thrown value and the identifier
|
|
28
|
+
* falls back to `record.messageId`.
|
|
29
|
+
*
|
|
40
30
|
* @param record The failed SQS record.
|
|
41
|
-
* @param error The
|
|
31
|
+
* @param error The value thrown by the record handler or by `mapMessageId`.
|
|
42
32
|
*/
|
|
43
33
|
readonly onRecordError?: (record: SQSRecord, error: unknown) => void;
|
|
44
34
|
/**
|
|
45
35
|
* Returns the `itemIdentifier` reported in `batchItemFailures` for a record.
|
|
46
36
|
* Defaults to `record.messageId` when omitted.
|
|
47
37
|
*
|
|
38
|
+
* When this function throws, that record is reported with `record.messageId`
|
|
39
|
+
* and the remaining records are still processed. The thrown value is passed
|
|
40
|
+
* to `onRecordError` when the hook is set.
|
|
41
|
+
*
|
|
48
42
|
* @param record The SQS record being processed.
|
|
49
43
|
* @returns The identifier sent back to Lambda in `batchItemFailures`.
|
|
50
44
|
*/
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcHJvY2Vzc1BhcnRpYWxCYXRjaH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc1BhcnRpYWxCYXRjaE9wdGlvbnMge1xuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgcmVjb3JkcyBwcm9jZXNzZWQgaW4gcGFyYWxsZWwuXG4gICAqXG4gICAqIC0gYDFgOiBzZXF1ZW50aWFsIHByb2Nlc3NpbmdcbiAgICogLSBgPiAxYDogYm91bmRlZCBjb25jdXJyZW5jeSBwb29sIChvcmRlciBvZiB7QGxpbmsgU1FTQmF0Y2hSZXNwb25zZS5iYXRjaEl0ZW1GYWlsdXJlc30gaXMgbm90IGd1YXJhbnRlZWQpXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICogQHRocm93cyB7QGxpbmsgU3FzUGFydGlhbEJhdGNoUHJvY2Vzc29yUmFuZ2VFcnJvcn0gV2hlbiBgY29uY3VycmVuY3lgIGlzIGxlc3MgdGhhbiAxLlxuICAgKiBAdGhyb3dzIHtAbGluayBTcXNQYXJ0aWFsQmF0Y2hQcm9jZXNzb3JUeXBlRXJyb3J9IFdoZW4gYGNvbmN1cnJlbmN5YCBpcyBub3QgYSBmaW5pdGUgaW50ZWdlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmN1cnJlbmN5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIHJlY29yZCBoYW5kbGVyIHRocm93cy5cbiAgICogVXNlIGZvciBsb2dnaW5nIG9yIG1ldHJpY3M7IHRoZSBsaWJyYXJ5IGRvZXMgbm90IHdyaXRlIHRvIGBjb25zb2xlYCBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBEbyBub3QgbG9nIGByZWNvcmQuYm9keWAgYXMtaXMg4oCUIGl0IG1heSBjb250YWluIHNlY3JldHMgb3IgcGVyc29uYWwgZGF0YS5cbiAgICogUHJlZmVyIGlkZW50aWZpZXJzIHN1Y2ggYXMgYHJlY29yZC5tZXNzYWdlSWRgIChvciB5b3VyIGBtYXBNZXNzYWdlSWRgIHJlc3VsdClcbiAgICogYW5kIGEgc2FuaXRpemVkIGVycm9yIHN1bW1hcnkuXG4gICAqXG4gICAqIEEgdGhyb3cgZnJvbSB0aGlzIGhvb2sgZG9lcyBub3QgcmVqZWN0IHRoZSBwcm9jZXNzb3IuIFRoZSByZWNvcmQgaXMgc3RpbGxcbiAgICogbGlzdGVkIGluIGBiYXRjaEl0ZW1GYWlsdXJlc2Agd2l0aCB0aGUgaWRlbnRpZmllciBhbHJlYWR5IHJlc29sdmVkIGZvciBpdC5cbiAgICogV2hlbiBgbWFwTWVzc2FnZUlkYCB0aHJvd3MsIGBlcnJvcmAgaXMgdGhhdCB0aHJvd24gdmFsdWUgYW5kIHRoZSBpZGVudGlmaWVyXG4gICAqIGZhbGxzIGJhY2sgdG8gYHJlY29yZC5tZXNzYWdlSWRgLlxuICAgKlxuICAgKiBAcGFyYW0gcmVjb3JkIFRoZSBmYWlsZWQgU1FTIHJlY29yZC5cbiAgICogQHBhcmFtIGVycm9yIFRoZSB2YWx1ZSB0aHJvd24gYnkgdGhlIHJlY29yZCBoYW5kbGVyIG9yIGJ5IGBtYXBNZXNzYWdlSWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgb25SZWNvcmRFcnJvcj86IChyZWNvcmQ6IFNRU1JlY29yZCwgZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGBpdGVtSWRlbnRpZmllcmAgcmVwb3J0ZWQgaW4gYGJhdGNoSXRlbUZhaWx1cmVzYCBmb3IgYSByZWNvcmQuXG4gICAqIERlZmF1bHRzIHRvIGByZWNvcmQubWVzc2FnZUlkYCB3aGVuIG9taXR0ZWQuXG4gICAqXG4gICAqIFdoZW4gdGhpcyBmdW5jdGlvbiB0aHJvd3MsIHRoYXQgcmVjb3JkIGlzIHJlcG9ydGVkIHdpdGggYHJlY29yZC5tZXNzYWdlSWRgXG4gICAqIGFuZCB0aGUgcmVtYWluaW5nIHJlY29yZHMgYXJlIHN0aWxsIHByb2Nlc3NlZC4gVGhlIHRocm93biB2YWx1ZSBpcyBwYXNzZWRcbiAgICogdG8gYG9uUmVjb3JkRXJyb3JgIHdoZW4gdGhlIGhvb2sgaXMgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVjb3JkIFRoZSBTUVMgcmVjb3JkIGJlaW5nIHByb2Nlc3NlZC5cbiAgICogQHJldHVybnMgVGhlIGlkZW50aWZpZXIgc2VudCBiYWNrIHRvIExhbWJkYSBpbiBgYmF0Y2hJdGVtRmFpbHVyZXNgLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFwTWVzc2FnZUlkPzogKHJlY29yZDogU1FTUmVjb3JkKSA9PiBzdHJpbmc7XG59XG4iXX0=
|
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type { ProcessPartialBatchOptions
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
1
|
+
export type { ProcessPartialBatchOptions } from './core/types';
|
|
2
|
+
export { SqsPartialBatchProcessorError, SqsPartialBatchProcessorRangeError, SqsPartialBatchProcessorTypeError, } from './core/errors';
|
|
3
|
+
export { processPartialBatch } from './process-partial-batch';
|
package/lib/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
var
|
|
3
|
+
exports.processPartialBatch = exports.SqsPartialBatchProcessorTypeError = exports.SqsPartialBatchProcessorRangeError = exports.SqsPartialBatchProcessorError = void 0;
|
|
4
|
+
var errors_1 = require("./core/errors");
|
|
5
|
+
Object.defineProperty(exports, "SqsPartialBatchProcessorError", { enumerable: true, get: function () { return errors_1.SqsPartialBatchProcessorError; } });
|
|
6
|
+
Object.defineProperty(exports, "SqsPartialBatchProcessorRangeError", { enumerable: true, get: function () { return errors_1.SqsPartialBatchProcessorRangeError; } });
|
|
7
|
+
Object.defineProperty(exports, "SqsPartialBatchProcessorTypeError", { enumerable: true, get: function () { return errors_1.SqsPartialBatchProcessorTypeError; } });
|
|
8
|
+
var process_partial_batch_1 = require("./process-partial-batch");
|
|
5
9
|
Object.defineProperty(exports, "processPartialBatch", { enumerable: true, get: function () { return process_partial_batch_1.processPartialBatch; } });
|
|
6
|
-
|
|
7
|
-
Object.defineProperty(exports, "processPartialBatchWithResult", { enumerable: true, get: function () { return process_partial_batch_with_result_1.processPartialBatchWithResult; } });
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkVBQXdFO0FBQS9ELDRIQUFBLG1CQUFtQixPQUFBO0FBQzVCLG1HQUE4RjtBQUFyRixrSkFBQSw2QkFBNkIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgUHJvY2Vzc1BhcnRpYWxCYXRjaE9wdGlvbnMsIFByb2Nlc3NSZWNvcmRSZXN1bHQgfSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB7IHByb2Nlc3NQYXJ0aWFsQmF0Y2ggfSBmcm9tICcuL3Byb2Nlc3Nvci9wcm9jZXNzLXBhcnRpYWwtYmF0Y2gnO1xuZXhwb3J0IHsgcHJvY2Vzc1BhcnRpYWxCYXRjaFdpdGhSZXN1bHQgfSBmcm9tICcuL3Byb2Nlc3Nvci9wcm9jZXNzLXBhcnRpYWwtYmF0Y2gtd2l0aC1yZXN1bHQnO1xuIl19
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esd0NBSXVCO0FBSHJCLHVIQUFBLDZCQUE2QixPQUFBO0FBQzdCLDRIQUFBLGtDQUFrQyxPQUFBO0FBQ2xDLDJIQUFBLGlDQUFpQyxPQUFBO0FBRW5DLGlFQUE4RDtBQUFyRCw0SEFBQSxtQkFBbUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgUHJvY2Vzc1BhcnRpYWxCYXRjaE9wdGlvbnMgfSBmcm9tICcuL2NvcmUvdHlwZXMnO1xuZXhwb3J0IHtcbiAgU3FzUGFydGlhbEJhdGNoUHJvY2Vzc29yRXJyb3IsXG4gIFNxc1BhcnRpYWxCYXRjaFByb2Nlc3NvclJhbmdlRXJyb3IsXG4gIFNxc1BhcnRpYWxCYXRjaFByb2Nlc3NvclR5cGVFcnJvcixcbn0gZnJvbSAnLi9jb3JlL2Vycm9ycyc7XG5leHBvcnQgeyBwcm9jZXNzUGFydGlhbEJhdGNoIH0gZnJvbSAnLi9wcm9jZXNzLXBhcnRpYWwtYmF0Y2gnO1xuIl19
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import type { SQSBatchResponse, SQSEvent, SQSRecord } from 'aws-lambda';
|
|
2
|
-
import type { ProcessPartialBatchOptions } from '
|
|
2
|
+
import type { ProcessPartialBatchOptions } from './core/types';
|
|
3
3
|
/**
|
|
4
4
|
* Runs `processRecord` for each SQS record. Thrown errors are mapped to
|
|
5
5
|
* `batchItemFailures`; successful records are not listed.
|
|
6
6
|
*
|
|
7
|
+
* Throws from `processRecord`, `mapMessageId`, and `onRecordError` stay inside
|
|
8
|
+
* the record that raised them. The returned promise still resolves. When
|
|
9
|
+
* `mapMessageId` throws, that record is reported with `record.messageId`.
|
|
10
|
+
*
|
|
7
11
|
* @param event The SQS Lambda event.
|
|
8
12
|
* @param processRecord Per-record handler. Throw to mark only that record as failed.
|
|
9
13
|
* @param options Optional concurrency, error hook, and message id mapping.
|
|
10
14
|
* @returns An {@link SQSBatchResponse} listing only failed `itemIdentifier`s.
|
|
11
|
-
* @throws {
|
|
12
|
-
* @throws {
|
|
15
|
+
* @throws {@link SqsPartialBatchProcessorRangeError} When `options.concurrency` is less than 1.
|
|
16
|
+
* @throws {@link SqsPartialBatchProcessorTypeError} When `options.concurrency` is not a finite integer.
|
|
13
17
|
*/
|
|
14
18
|
export declare const processPartialBatch: (event: SQSEvent, processRecord: (record: SQSRecord) => Promise<void>, options?: ProcessPartialBatchOptions) => Promise<SQSBatchResponse>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processPartialBatch = void 0;
|
|
4
|
+
const concurrency_1 = require("./core/concurrency");
|
|
5
|
+
const report_record_failure_1 = require("./core/report-record-failure");
|
|
6
|
+
/**
|
|
7
|
+
* Runs `processRecord` for each SQS record. Thrown errors are mapped to
|
|
8
|
+
* `batchItemFailures`; successful records are not listed.
|
|
9
|
+
*
|
|
10
|
+
* Throws from `processRecord`, `mapMessageId`, and `onRecordError` stay inside
|
|
11
|
+
* the record that raised them. The returned promise still resolves. When
|
|
12
|
+
* `mapMessageId` throws, that record is reported with `record.messageId`.
|
|
13
|
+
*
|
|
14
|
+
* @param event The SQS Lambda event.
|
|
15
|
+
* @param processRecord Per-record handler. Throw to mark only that record as failed.
|
|
16
|
+
* @param options Optional concurrency, error hook, and message id mapping.
|
|
17
|
+
* @returns An {@link SQSBatchResponse} listing only failed `itemIdentifier`s.
|
|
18
|
+
* @throws {@link SqsPartialBatchProcessorRangeError} When `options.concurrency` is less than 1.
|
|
19
|
+
* @throws {@link SqsPartialBatchProcessorTypeError} When `options.concurrency` is not a finite integer.
|
|
20
|
+
*/
|
|
21
|
+
const processPartialBatch = async (event, processRecord, options) => {
|
|
22
|
+
const batchItemFailures = [];
|
|
23
|
+
/**
|
|
24
|
+
* Processes one record and records a batch item failure on error.
|
|
25
|
+
* Identifier resolution and the error hook stay inside this boundary.
|
|
26
|
+
*
|
|
27
|
+
* @param record The SQS record to process.
|
|
28
|
+
*/
|
|
29
|
+
const handle = async (record) => {
|
|
30
|
+
let id = record.messageId;
|
|
31
|
+
try {
|
|
32
|
+
id = options?.mapMessageId?.(record) ?? record.messageId;
|
|
33
|
+
await processRecord(record);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
(0, report_record_failure_1.reportRecordFailure)(batchItemFailures, record, id, error, options?.onRecordError);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
await (0, concurrency_1.runAtConcurrency)(event.Records, options?.concurrency, handle);
|
|
40
|
+
return { batchItemFailures };
|
|
41
|
+
};
|
|
42
|
+
exports.processPartialBatch = processPartialBatch;
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1wYXJ0aWFsLWJhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb2Nlc3MtcGFydGlhbC1iYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxvREFBc0Q7QUFDdEQsd0VBQW1FO0FBR25FOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0ksTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEVBQ3RDLEtBQWUsRUFDZixhQUFtRCxFQUNuRCxPQUFvQyxFQUNULEVBQUU7SUFDN0IsTUFBTSxpQkFBaUIsR0FBaUMsRUFBRSxDQUFDO0lBRTNEOzs7OztPQUtHO0lBQ0gsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUFFLE1BQWlCLEVBQWlCLEVBQUU7UUFDeEQsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUUxQixJQUFJLENBQUM7WUFDSCxFQUFFLEdBQUcsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDekQsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFBLDJDQUFtQixFQUFDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNwRixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsTUFBTSxJQUFBLDhCQUFnQixFQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztBQUMvQixDQUFDLENBQUM7QUExQlcsUUFBQSxtQkFBbUIsdUJBMEI5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU1FTQmF0Y2hSZXNwb25zZSwgU1FTRXZlbnQsIFNRU1JlY29yZCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgcnVuQXRDb25jdXJyZW5jeSB9IGZyb20gJy4vY29yZS9jb25jdXJyZW5jeSc7XG5pbXBvcnQgeyByZXBvcnRSZWNvcmRGYWlsdXJlIH0gZnJvbSAnLi9jb3JlL3JlcG9ydC1yZWNvcmQtZmFpbHVyZSc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NQYXJ0aWFsQmF0Y2hPcHRpb25zIH0gZnJvbSAnLi9jb3JlL3R5cGVzJztcblxuLyoqXG4gKiBSdW5zIGBwcm9jZXNzUmVjb3JkYCBmb3IgZWFjaCBTUVMgcmVjb3JkLiBUaHJvd24gZXJyb3JzIGFyZSBtYXBwZWQgdG9cbiAqIGBiYXRjaEl0ZW1GYWlsdXJlc2A7IHN1Y2Nlc3NmdWwgcmVjb3JkcyBhcmUgbm90IGxpc3RlZC5cbiAqXG4gKiBUaHJvd3MgZnJvbSBgcHJvY2Vzc1JlY29yZGAsIGBtYXBNZXNzYWdlSWRgLCBhbmQgYG9uUmVjb3JkRXJyb3JgIHN0YXkgaW5zaWRlXG4gKiB0aGUgcmVjb3JkIHRoYXQgcmFpc2VkIHRoZW0uIFRoZSByZXR1cm5lZCBwcm9taXNlIHN0aWxsIHJlc29sdmVzLiBXaGVuXG4gKiBgbWFwTWVzc2FnZUlkYCB0aHJvd3MsIHRoYXQgcmVjb3JkIGlzIHJlcG9ydGVkIHdpdGggYHJlY29yZC5tZXNzYWdlSWRgLlxuICpcbiAqIEBwYXJhbSBldmVudCBUaGUgU1FTIExhbWJkYSBldmVudC5cbiAqIEBwYXJhbSBwcm9jZXNzUmVjb3JkIFBlci1yZWNvcmQgaGFuZGxlci4gVGhyb3cgdG8gbWFyayBvbmx5IHRoYXQgcmVjb3JkIGFzIGZhaWxlZC5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmN1cnJlbmN5LCBlcnJvciBob29rLCBhbmQgbWVzc2FnZSBpZCBtYXBwaW5nLlxuICogQHJldHVybnMgQW4ge0BsaW5rIFNRU0JhdGNoUmVzcG9uc2V9IGxpc3Rpbmcgb25seSBmYWlsZWQgYGl0ZW1JZGVudGlmaWVyYHMuXG4gKiBAdGhyb3dzIHtAbGluayBTcXNQYXJ0aWFsQmF0Y2hQcm9jZXNzb3JSYW5nZUVycm9yfSBXaGVuIGBvcHRpb25zLmNvbmN1cnJlbmN5YCBpcyBsZXNzIHRoYW4gMS5cbiAqIEB0aHJvd3Mge0BsaW5rIFNxc1BhcnRpYWxCYXRjaFByb2Nlc3NvclR5cGVFcnJvcn0gV2hlbiBgb3B0aW9ucy5jb25jdXJyZW5jeWAgaXMgbm90IGEgZmluaXRlIGludGVnZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzUGFydGlhbEJhdGNoID0gYXN5bmMgKFxuICBldmVudDogU1FTRXZlbnQsXG4gIHByb2Nlc3NSZWNvcmQ6IChyZWNvcmQ6IFNRU1JlY29yZCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgb3B0aW9ucz86IFByb2Nlc3NQYXJ0aWFsQmF0Y2hPcHRpb25zLFxuKTogUHJvbWlzZTxTUVNCYXRjaFJlc3BvbnNlPiA9PiB7XG4gIGNvbnN0IGJhdGNoSXRlbUZhaWx1cmVzOiB7IGl0ZW1JZGVudGlmaWVyOiBzdHJpbmcgfVtdID0gW107XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBvbmUgcmVjb3JkIGFuZCByZWNvcmRzIGEgYmF0Y2ggaXRlbSBmYWlsdXJlIG9uIGVycm9yLlxuICAgKiBJZGVudGlmaWVyIHJlc29sdXRpb24gYW5kIHRoZSBlcnJvciBob29rIHN0YXkgaW5zaWRlIHRoaXMgYm91bmRhcnkuXG4gICAqXG4gICAqIEBwYXJhbSByZWNvcmQgVGhlIFNRUyByZWNvcmQgdG8gcHJvY2Vzcy5cbiAgICovXG4gIGNvbnN0IGhhbmRsZSA9IGFzeW5jIChyZWNvcmQ6IFNRU1JlY29yZCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGxldCBpZCA9IHJlY29yZC5tZXNzYWdlSWQ7XG5cbiAgICB0cnkge1xuICAgICAgaWQgPSBvcHRpb25zPy5tYXBNZXNzYWdlSWQ/LihyZWNvcmQpID8/IHJlY29yZC5tZXNzYWdlSWQ7XG4gICAgICBhd2FpdCBwcm9jZXNzUmVjb3JkKHJlY29yZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlcG9ydFJlY29yZEZhaWx1cmUoYmF0Y2hJdGVtRmFpbHVyZXMsIHJlY29yZCwgaWQsIGVycm9yLCBvcHRpb25zPy5vblJlY29yZEVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgYXdhaXQgcnVuQXRDb25jdXJyZW5jeShldmVudC5SZWNvcmRzLCBvcHRpb25zPy5jb25jdXJyZW5jeSwgaGFuZGxlKTtcbiAgcmV0dXJuIHsgYmF0Y2hJdGVtRmFpbHVyZXMgfTtcbn07XG4iXX0=
|
package/package.json
CHANGED
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"organization": false
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
+
"@gammarers/projen-projects": "^0.5.7",
|
|
35
36
|
"@stylistic/eslint-plugin": "^2",
|
|
36
37
|
"@types/jest": "^30.0.0",
|
|
37
38
|
"@types/node": "^20",
|
|
@@ -44,7 +45,7 @@
|
|
|
44
45
|
"eslint-plugin-import": "^2.32.0",
|
|
45
46
|
"jest": "^30.5.2",
|
|
46
47
|
"jest-junit": "^17",
|
|
47
|
-
"projen": "^0.
|
|
48
|
+
"projen": "^0.104.4",
|
|
48
49
|
"ts-jest": "^29.4.14",
|
|
49
50
|
"ts-node": "^10.9.2",
|
|
50
51
|
"typescript": "6.0.x"
|
|
@@ -73,7 +74,7 @@
|
|
|
73
74
|
"publishConfig": {
|
|
74
75
|
"access": "public"
|
|
75
76
|
},
|
|
76
|
-
"version": "0.
|
|
77
|
+
"version": "0.5.1",
|
|
77
78
|
"jest": {
|
|
78
79
|
"coverageProvider": "v8",
|
|
79
80
|
"testMatch": [
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolves and validates the `concurrency` option.
|
|
3
|
-
*
|
|
4
|
-
* @param value User-provided concurrency.
|
|
5
|
-
* @returns A validated concurrency value (defaults to `1`).
|
|
6
|
-
* @throws {RangeError} When `value` is less than 1.
|
|
7
|
-
* @throws {TypeError} When `value` is not a finite integer.
|
|
8
|
-
*/
|
|
9
|
-
export declare const resolveConcurrency: (value: number | undefined) => number;
|
|
10
|
-
/**
|
|
11
|
-
* Runs `fn` over `items` with at most `concurrency` parallel workers.
|
|
12
|
-
* Each worker pulls the next index until none remain.
|
|
13
|
-
*
|
|
14
|
-
* @param items Items to process.
|
|
15
|
-
* @param concurrency Maximum parallel workers (must be `>= 1`).
|
|
16
|
-
* @param fn Async handler invoked for each item.
|
|
17
|
-
* @returns A promise that resolves when every item has been processed.
|
|
18
|
-
*/
|
|
19
|
-
export declare const runWithConcurrency: <T>(items: readonly T[], concurrency: number, fn: (item: T) => Promise<void>) => Promise<void>;
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.runWithConcurrency = exports.resolveConcurrency = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Returns whether a worker still has an index to process.
|
|
6
|
-
*
|
|
7
|
-
* @param workIndex The index claimed from the work queue, or `undefined` when empty.
|
|
8
|
-
* @returns `true` when `workIndex` is a remaining item index.
|
|
9
|
-
*/
|
|
10
|
-
const hasRemainingWork = (workIndex) => workIndex !== undefined;
|
|
11
|
-
/**
|
|
12
|
-
* Resolves and validates the `concurrency` option.
|
|
13
|
-
*
|
|
14
|
-
* @param value User-provided concurrency.
|
|
15
|
-
* @returns A validated concurrency value (defaults to `1`).
|
|
16
|
-
* @throws {RangeError} When `value` is less than 1.
|
|
17
|
-
* @throws {TypeError} When `value` is not a finite integer.
|
|
18
|
-
*/
|
|
19
|
-
const resolveConcurrency = (value) => {
|
|
20
|
-
if (value === undefined) {
|
|
21
|
-
return 1;
|
|
22
|
-
}
|
|
23
|
-
if (!Number.isFinite(value) || !Number.isInteger(value)) {
|
|
24
|
-
throw new TypeError('concurrency must be a finite integer');
|
|
25
|
-
}
|
|
26
|
-
if (value < 1) {
|
|
27
|
-
throw new RangeError('concurrency must be >= 1');
|
|
28
|
-
}
|
|
29
|
-
return value;
|
|
30
|
-
};
|
|
31
|
-
exports.resolveConcurrency = resolveConcurrency;
|
|
32
|
-
/**
|
|
33
|
-
* Runs `fn` over `items` with at most `concurrency` parallel workers.
|
|
34
|
-
* Each worker pulls the next index until none remain.
|
|
35
|
-
*
|
|
36
|
-
* @param items Items to process.
|
|
37
|
-
* @param concurrency Maximum parallel workers (must be `>= 1`).
|
|
38
|
-
* @param fn Async handler invoked for each item.
|
|
39
|
-
* @returns A promise that resolves when every item has been processed.
|
|
40
|
-
*/
|
|
41
|
-
const runWithConcurrency = async (items, concurrency, fn) => {
|
|
42
|
-
if (items.length === 0) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
const limit = Math.min(concurrency, items.length);
|
|
46
|
-
let next = 0;
|
|
47
|
-
/**
|
|
48
|
-
* Claims the next work index, or `undefined` when the queue is empty.
|
|
49
|
-
*
|
|
50
|
-
* @returns The next index to process, or `undefined` if none remain.
|
|
51
|
-
*/
|
|
52
|
-
const takeNextIndex = () => {
|
|
53
|
-
const index = next;
|
|
54
|
-
next += 1;
|
|
55
|
-
if (index >= items.length) {
|
|
56
|
-
return undefined;
|
|
57
|
-
}
|
|
58
|
-
return index;
|
|
59
|
-
};
|
|
60
|
-
const workers = [];
|
|
61
|
-
for (let w = 0; w < limit; w++) {
|
|
62
|
-
workers.push((async () => {
|
|
63
|
-
let workIndex = takeNextIndex();
|
|
64
|
-
while (hasRemainingWork(workIndex)) {
|
|
65
|
-
const item = items[workIndex];
|
|
66
|
-
if (item === undefined) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
await fn(item);
|
|
70
|
-
workIndex = takeNextIndex();
|
|
71
|
-
}
|
|
72
|
-
})());
|
|
73
|
-
}
|
|
74
|
-
await Promise.all(workers);
|
|
75
|
-
};
|
|
76
|
-
exports.runWithConcurrency = runWithConcurrency;
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY3VycmVuY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvY2Vzc29yL2NvbmN1cnJlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7OztHQUtHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFNBQTZCLEVBQXVCLEVBQUUsQ0FDOUUsU0FBUyxLQUFLLFNBQVMsQ0FBQztBQUUxQjs7Ozs7OztHQU9HO0FBQ0ksTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQXlCLEVBQVUsRUFBRTtJQUN0RSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4RCxNQUFNLElBQUksU0FBUyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQVhXLFFBQUEsa0JBQWtCLHNCQVc3QjtBQUVGOzs7Ozs7OztHQVFHO0FBQ0ksTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQ3JDLEtBQW1CLEVBQ25CLFdBQW1CLEVBQ25CLEVBQThCLEVBQ2YsRUFBRTtJQUNqQixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBRWI7Ozs7T0FJRztJQUNILE1BQU0sYUFBYSxHQUFHLEdBQXVCLEVBQUU7UUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLENBQUM7UUFDVixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQW9CLEVBQUUsQ0FBQztJQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3ZCLElBQUksU0FBUyxHQUFHLGFBQWEsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDdkIsT0FBTztnQkFDVCxDQUFDO2dCQUNELE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNmLFNBQVMsR0FBRyxhQUFhLEVBQUUsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUM7QUF4Q1csUUFBQSxrQkFBa0Isc0JBd0M3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgd29ya2VyIHN0aWxsIGhhcyBhbiBpbmRleCB0byBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSB3b3JrSW5kZXggVGhlIGluZGV4IGNsYWltZWQgZnJvbSB0aGUgd29yayBxdWV1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBlbXB0eS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIGB3b3JrSW5kZXhgIGlzIGEgcmVtYWluaW5nIGl0ZW0gaW5kZXguXG4gKi9cbmNvbnN0IGhhc1JlbWFpbmluZ1dvcmsgPSAod29ya0luZGV4OiBudW1iZXIgfCB1bmRlZmluZWQpOiB3b3JrSW5kZXggaXMgbnVtYmVyID0+XG4gIHdvcmtJbmRleCAhPT0gdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJlc29sdmVzIGFuZCB2YWxpZGF0ZXMgdGhlIGBjb25jdXJyZW5jeWAgb3B0aW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBVc2VyLXByb3ZpZGVkIGNvbmN1cnJlbmN5LlxuICogQHJldHVybnMgQSB2YWxpZGF0ZWQgY29uY3VycmVuY3kgdmFsdWUgKGRlZmF1bHRzIHRvIGAxYCkuXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBXaGVuIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIDEuXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IFdoZW4gYHZhbHVlYCBpcyBub3QgYSBmaW5pdGUgaW50ZWdlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVDb25jdXJyZW5jeSA9ICh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgIU51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY29uY3VycmVuY3kgbXVzdCBiZSBhIGZpbml0ZSBpbnRlZ2VyJyk7XG4gIH1cbiAgaWYgKHZhbHVlIDwgMSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdjb25jdXJyZW5jeSBtdXN0IGJlID49IDEnKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIFJ1bnMgYGZuYCBvdmVyIGBpdGVtc2Agd2l0aCBhdCBtb3N0IGBjb25jdXJyZW5jeWAgcGFyYWxsZWwgd29ya2Vycy5cbiAqIEVhY2ggd29ya2VyIHB1bGxzIHRoZSBuZXh0IGluZGV4IHVudGlsIG5vbmUgcmVtYWluLlxuICpcbiAqIEBwYXJhbSBpdGVtcyBJdGVtcyB0byBwcm9jZXNzLlxuICogQHBhcmFtIGNvbmN1cnJlbmN5IE1heGltdW0gcGFyYWxsZWwgd29ya2VycyAobXVzdCBiZSBgPj0gMWApLlxuICogQHBhcmFtIGZuIEFzeW5jIGhhbmRsZXIgaW52b2tlZCBmb3IgZWFjaCBpdGVtLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBpdGVtIGhhcyBiZWVuIHByb2Nlc3NlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJ1bldpdGhDb25jdXJyZW5jeSA9IGFzeW5jIDxUPihcbiAgaXRlbXM6IHJlYWRvbmx5IFRbXSxcbiAgY29uY3VycmVuY3k6IG51bWJlcixcbiAgZm46IChpdGVtOiBUKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihjb25jdXJyZW5jeSwgaXRlbXMubGVuZ3RoKTtcbiAgbGV0IG5leHQgPSAwO1xuXG4gIC8qKlxuICAgKiBDbGFpbXMgdGhlIG5leHQgd29yayBpbmRleCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBuZXh0IGluZGV4IHRvIHByb2Nlc3MsIG9yIGB1bmRlZmluZWRgIGlmIG5vbmUgcmVtYWluLlxuICAgKi9cbiAgY29uc3QgdGFrZU5leHRJbmRleCA9ICgpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gbmV4dDtcbiAgICBuZXh0ICs9IDE7XG4gICAgaWYgKGluZGV4ID49IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9O1xuXG4gIGNvbnN0IHdvcmtlcnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBmb3IgKGxldCB3ID0gMDsgdyA8IGxpbWl0OyB3KyspIHtcbiAgICB3b3JrZXJzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCB3b3JrSW5kZXggPSB0YWtlTmV4dEluZGV4KCk7XG4gICAgICB3aGlsZSAoaGFzUmVtYWluaW5nV29yayh3b3JrSW5kZXgpKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1t3b3JrSW5kZXhdO1xuICAgICAgICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGZuKGl0ZW0pO1xuICAgICAgICB3b3JrSW5kZXggPSB0YWtlTmV4dEluZGV4KCk7XG4gICAgICB9XG4gICAgfSkoKSk7XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwod29ya2Vycyk7XG59O1xuIl19
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.itemFailure = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Creates a single `batchItemFailures` entry for a failed record.
|
|
6
|
-
*
|
|
7
|
-
* @param itemIdentifier The identifier reported back to Lambda.
|
|
8
|
-
* @returns An object suitable for {@link SQSBatchResponse.batchItemFailures}.
|
|
9
|
-
*/
|
|
10
|
-
const itemFailure = (itemIdentifier) => ({
|
|
11
|
-
itemIdentifier,
|
|
12
|
-
});
|
|
13
|
-
exports.itemFailure = itemFailure;
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS1mYWlsdXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb2Nlc3Nvci9pdGVtLWZhaWx1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUE7Ozs7O0dBS0c7QUFDSSxNQUFNLFdBQVcsR0FBRyxDQUN6QixjQUFzQixFQUN5QixFQUFFLENBQUMsQ0FBQztJQUNuRCxjQUFjO0NBQ2YsQ0FBQyxDQUFDO0FBSlUsUUFBQSxXQUFXLGVBSXJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTUVNCYXRjaFJlc3BvbnNlIH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpbmdsZSBgYmF0Y2hJdGVtRmFpbHVyZXNgIGVudHJ5IGZvciBhIGZhaWxlZCByZWNvcmQuXG4gKlxuICogQHBhcmFtIGl0ZW1JZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIHJlcG9ydGVkIGJhY2sgdG8gTGFtYmRhLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHN1aXRhYmxlIGZvciB7QGxpbmsgU1FTQmF0Y2hSZXNwb25zZS5iYXRjaEl0ZW1GYWlsdXJlc30uXG4gKi9cbmV4cG9ydCBjb25zdCBpdGVtRmFpbHVyZSA9IChcbiAgaXRlbUlkZW50aWZpZXI6IHN0cmluZyxcbik6IFNRU0JhdGNoUmVzcG9uc2VbJ2JhdGNoSXRlbUZhaWx1cmVzJ11bbnVtYmVyXSA9PiAoe1xuICBpdGVtSWRlbnRpZmllcixcbn0pO1xuIl19
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { SQSBatchResponse, SQSEvent, SQSRecord } from 'aws-lambda';
|
|
2
|
-
import type { ProcessPartialBatchOptions, ProcessRecordResult } from '../types';
|
|
3
|
-
/**
|
|
4
|
-
* Like {@link processPartialBatch}, but uses a Result-style callback (no throw for control flow).
|
|
5
|
-
*
|
|
6
|
-
* - `{ ok: true }`: success (not listed in `batchItemFailures`)
|
|
7
|
-
* - `{ ok: false }`: failure; if `onRecordError` is set, it receives an `Error` whose
|
|
8
|
-
* message includes the resolved `itemIdentifier`, and whose `cause` is `{ itemIdentifier }`
|
|
9
|
-
* - thrown errors: still treated as failures; `onRecordError` receives the thrown value when set
|
|
10
|
-
*
|
|
11
|
-
* @param event The SQS Lambda event.
|
|
12
|
-
* @param processRecord Per-record handler returning `{ ok: true }` or `{ ok: false }`.
|
|
13
|
-
* @param options Optional concurrency, error hook, and message id mapping.
|
|
14
|
-
* @returns An {@link SQSBatchResponse} listing only failed `itemIdentifier`s.
|
|
15
|
-
* @throws {RangeError} When `options.concurrency` is less than 1.
|
|
16
|
-
* @throws {TypeError} When `options.concurrency` is not a finite integer.
|
|
17
|
-
*/
|
|
18
|
-
export declare const processPartialBatchWithResult: (event: SQSEvent, processRecord: (record: SQSRecord) => Promise<ProcessRecordResult>, options?: ProcessPartialBatchOptions) => Promise<SQSBatchResponse>;
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.processPartialBatchWithResult = void 0;
|
|
4
|
-
const concurrency_1 = require("./concurrency");
|
|
5
|
-
const item_failure_1 = require("./item-failure");
|
|
6
|
-
/**
|
|
7
|
-
* Like {@link processPartialBatch}, but uses a Result-style callback (no throw for control flow).
|
|
8
|
-
*
|
|
9
|
-
* - `{ ok: true }`: success (not listed in `batchItemFailures`)
|
|
10
|
-
* - `{ ok: false }`: failure; if `onRecordError` is set, it receives an `Error` whose
|
|
11
|
-
* message includes the resolved `itemIdentifier`, and whose `cause` is `{ itemIdentifier }`
|
|
12
|
-
* - thrown errors: still treated as failures; `onRecordError` receives the thrown value when set
|
|
13
|
-
*
|
|
14
|
-
* @param event The SQS Lambda event.
|
|
15
|
-
* @param processRecord Per-record handler returning `{ ok: true }` or `{ ok: false }`.
|
|
16
|
-
* @param options Optional concurrency, error hook, and message id mapping.
|
|
17
|
-
* @returns An {@link SQSBatchResponse} listing only failed `itemIdentifier`s.
|
|
18
|
-
* @throws {RangeError} When `options.concurrency` is less than 1.
|
|
19
|
-
* @throws {TypeError} When `options.concurrency` is not a finite integer.
|
|
20
|
-
*/
|
|
21
|
-
const processPartialBatchWithResult = async (event, processRecord, options) => {
|
|
22
|
-
const concurrency = (0, concurrency_1.resolveConcurrency)(options?.concurrency);
|
|
23
|
-
const batchItemFailures = [];
|
|
24
|
-
/**
|
|
25
|
-
* Processes one record; maps throws and `{ ok: false }` to batch item failures.
|
|
26
|
-
*
|
|
27
|
-
* @param record The SQS record to process.
|
|
28
|
-
*/
|
|
29
|
-
const handle = async (record) => {
|
|
30
|
-
const id = options?.mapMessageId?.(record) ?? record.messageId;
|
|
31
|
-
let result;
|
|
32
|
-
try {
|
|
33
|
-
result = await processRecord(record);
|
|
34
|
-
}
|
|
35
|
-
catch (error) {
|
|
36
|
-
if (options?.onRecordError) {
|
|
37
|
-
options.onRecordError(record, error);
|
|
38
|
-
}
|
|
39
|
-
batchItemFailures.push((0, item_failure_1.itemFailure)(id));
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
if (result.ok) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
if (options?.onRecordError) {
|
|
46
|
-
const error = new Error(`processRecord returned { ok: false } (itemIdentifier=${id})`);
|
|
47
|
-
Object.assign(error, { cause: { itemIdentifier: id } });
|
|
48
|
-
options.onRecordError(record, error);
|
|
49
|
-
}
|
|
50
|
-
batchItemFailures.push((0, item_failure_1.itemFailure)(id));
|
|
51
|
-
};
|
|
52
|
-
if (concurrency <= 1) {
|
|
53
|
-
for (const record of event.Records) {
|
|
54
|
-
await handle(record);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
await (0, concurrency_1.runWithConcurrency)(event.Records, concurrency, handle);
|
|
59
|
-
}
|
|
60
|
-
return { batchItemFailures };
|
|
61
|
-
};
|
|
62
|
-
exports.processPartialBatchWithResult = processPartialBatchWithResult;
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1wYXJ0aWFsLWJhdGNoLXdpdGgtcmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb2Nlc3Nvci9wcm9jZXNzLXBhcnRpYWwtYmF0Y2gtd2l0aC1yZXN1bHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsK0NBQXVFO0FBQ3ZFLGlEQUE2QztBQUU3Qzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNJLE1BQU0sNkJBQTZCLEdBQUcsS0FBSyxFQUNoRCxLQUFlLEVBQ2YsYUFBa0UsRUFDbEUsT0FBb0MsRUFDVCxFQUFFO0lBQzdCLE1BQU0sV0FBVyxHQUFHLElBQUEsZ0NBQWtCLEVBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdELE1BQU0saUJBQWlCLEdBQWlDLEVBQUUsQ0FBQztJQUUzRDs7OztPQUlHO0lBQ0gsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUFFLE1BQWlCLEVBQWlCLEVBQUU7UUFDeEQsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDL0QsSUFBSSxNQUEyQixDQUFDO1FBQ2hDLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO2dCQUMzQixPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUEsMEJBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDZCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLHdEQUF3RCxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4RCxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUEsMEJBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQztJQUVGLElBQUksV0FBVyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JCLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25DLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBQSxnQ0FBa0IsRUFBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLENBQUM7QUFDL0IsQ0FBQyxDQUFDO0FBN0NXLFFBQUEsNkJBQTZCLGlDQTZDeEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNRU0JhdGNoUmVzcG9uc2UsIFNRU0V2ZW50LCBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB0eXBlIHsgUHJvY2Vzc1BhcnRpYWxCYXRjaE9wdGlvbnMsIFByb2Nlc3NSZWNvcmRSZXN1bHQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyByZXNvbHZlQ29uY3VycmVuY3ksIHJ1bldpdGhDb25jdXJyZW5jeSB9IGZyb20gJy4vY29uY3VycmVuY3knO1xuaW1wb3J0IHsgaXRlbUZhaWx1cmUgfSBmcm9tICcuL2l0ZW0tZmFpbHVyZSc7XG5cbi8qKlxuICogTGlrZSB7QGxpbmsgcHJvY2Vzc1BhcnRpYWxCYXRjaH0sIGJ1dCB1c2VzIGEgUmVzdWx0LXN0eWxlIGNhbGxiYWNrIChubyB0aHJvdyBmb3IgY29udHJvbCBmbG93KS5cbiAqXG4gKiAtIGB7IG9rOiB0cnVlIH1gOiBzdWNjZXNzIChub3QgbGlzdGVkIGluIGBiYXRjaEl0ZW1GYWlsdXJlc2ApXG4gKiAtIGB7IG9rOiBmYWxzZSB9YDogZmFpbHVyZTsgaWYgYG9uUmVjb3JkRXJyb3JgIGlzIHNldCwgaXQgcmVjZWl2ZXMgYW4gYEVycm9yYCB3aG9zZVxuICogICBtZXNzYWdlIGluY2x1ZGVzIHRoZSByZXNvbHZlZCBgaXRlbUlkZW50aWZpZXJgLCBhbmQgd2hvc2UgYGNhdXNlYCBpcyBgeyBpdGVtSWRlbnRpZmllciB9YFxuICogLSB0aHJvd24gZXJyb3JzOiBzdGlsbCB0cmVhdGVkIGFzIGZhaWx1cmVzOyBgb25SZWNvcmRFcnJvcmAgcmVjZWl2ZXMgdGhlIHRocm93biB2YWx1ZSB3aGVuIHNldFxuICpcbiAqIEBwYXJhbSBldmVudCBUaGUgU1FTIExhbWJkYSBldmVudC5cbiAqIEBwYXJhbSBwcm9jZXNzUmVjb3JkIFBlci1yZWNvcmQgaGFuZGxlciByZXR1cm5pbmcgYHsgb2s6IHRydWUgfWAgb3IgYHsgb2s6IGZhbHNlIH1gLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgY29uY3VycmVuY3ksIGVycm9yIGhvb2ssIGFuZCBtZXNzYWdlIGlkIG1hcHBpbmcuXG4gKiBAcmV0dXJucyBBbiB7QGxpbmsgU1FTQmF0Y2hSZXNwb25zZX0gbGlzdGluZyBvbmx5IGZhaWxlZCBgaXRlbUlkZW50aWZpZXJgcy5cbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IFdoZW4gYG9wdGlvbnMuY29uY3VycmVuY3lgIGlzIGxlc3MgdGhhbiAxLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBXaGVuIGBvcHRpb25zLmNvbmN1cnJlbmN5YCBpcyBub3QgYSBmaW5pdGUgaW50ZWdlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHByb2Nlc3NQYXJ0aWFsQmF0Y2hXaXRoUmVzdWx0ID0gYXN5bmMgKFxuICBldmVudDogU1FTRXZlbnQsXG4gIHByb2Nlc3NSZWNvcmQ6IChyZWNvcmQ6IFNRU1JlY29yZCkgPT4gUHJvbWlzZTxQcm9jZXNzUmVjb3JkUmVzdWx0PixcbiAgb3B0aW9ucz86IFByb2Nlc3NQYXJ0aWFsQmF0Y2hPcHRpb25zLFxuKTogUHJvbWlzZTxTUVNCYXRjaFJlc3BvbnNlPiA9PiB7XG4gIGNvbnN0IGNvbmN1cnJlbmN5ID0gcmVzb2x2ZUNvbmN1cnJlbmN5KG9wdGlvbnM/LmNvbmN1cnJlbmN5KTtcbiAgY29uc3QgYmF0Y2hJdGVtRmFpbHVyZXM6IHsgaXRlbUlkZW50aWZpZXI6IHN0cmluZyB9W10gPSBbXTtcblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG9uZSByZWNvcmQ7IG1hcHMgdGhyb3dzIGFuZCBgeyBvazogZmFsc2UgfWAgdG8gYmF0Y2ggaXRlbSBmYWlsdXJlcy5cbiAgICpcbiAgICogQHBhcmFtIHJlY29yZCBUaGUgU1FTIHJlY29yZCB0byBwcm9jZXNzLlxuICAgKi9cbiAgY29uc3QgaGFuZGxlID0gYXN5bmMgKHJlY29yZDogU1FTUmVjb3JkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgaWQgPSBvcHRpb25zPy5tYXBNZXNzYWdlSWQ/LihyZWNvcmQpID8/IHJlY29yZC5tZXNzYWdlSWQ7XG4gICAgbGV0IHJlc3VsdDogUHJvY2Vzc1JlY29yZFJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc1JlY29yZChyZWNvcmQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAob3B0aW9ucz8ub25SZWNvcmRFcnJvcikge1xuICAgICAgICBvcHRpb25zLm9uUmVjb3JkRXJyb3IocmVjb3JkLCBlcnJvcik7XG4gICAgICB9XG4gICAgICBiYXRjaEl0ZW1GYWlsdXJlcy5wdXNoKGl0ZW1GYWlsdXJlKGlkKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZXN1bHQub2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnM/Lm9uUmVjb3JkRXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBwcm9jZXNzUmVjb3JkIHJldHVybmVkIHsgb2s6IGZhbHNlIH0gKGl0ZW1JZGVudGlmaWVyPSR7aWR9KWApO1xuICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjYXVzZTogeyBpdGVtSWRlbnRpZmllcjogaWQgfSB9KTtcbiAgICAgIG9wdGlvbnMub25SZWNvcmRFcnJvcihyZWNvcmQsIGVycm9yKTtcbiAgICB9XG4gICAgYmF0Y2hJdGVtRmFpbHVyZXMucHVzaChpdGVtRmFpbHVyZShpZCkpO1xuICB9O1xuXG4gIGlmIChjb25jdXJyZW5jeSA8PSAxKSB7XG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXZlbnQuUmVjb3Jkcykge1xuICAgICAgYXdhaXQgaGFuZGxlKHJlY29yZCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGF3YWl0IHJ1bldpdGhDb25jdXJyZW5jeShldmVudC5SZWNvcmRzLCBjb25jdXJyZW5jeSwgaGFuZGxlKTtcbiAgfVxuXG4gIHJldHVybiB7IGJhdGNoSXRlbUZhaWx1cmVzIH07XG59O1xuIl19
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.processPartialBatch = void 0;
|
|
4
|
-
const concurrency_1 = require("./concurrency");
|
|
5
|
-
const item_failure_1 = require("./item-failure");
|
|
6
|
-
/**
|
|
7
|
-
* Runs `processRecord` for each SQS record. Thrown errors are mapped to
|
|
8
|
-
* `batchItemFailures`; successful records are not listed.
|
|
9
|
-
*
|
|
10
|
-
* @param event The SQS Lambda event.
|
|
11
|
-
* @param processRecord Per-record handler. Throw to mark only that record as failed.
|
|
12
|
-
* @param options Optional concurrency, error hook, and message id mapping.
|
|
13
|
-
* @returns An {@link SQSBatchResponse} listing only failed `itemIdentifier`s.
|
|
14
|
-
* @throws {RangeError} When `options.concurrency` is less than 1.
|
|
15
|
-
* @throws {TypeError} When `options.concurrency` is not a finite integer.
|
|
16
|
-
*/
|
|
17
|
-
const processPartialBatch = async (event, processRecord, options) => {
|
|
18
|
-
const concurrency = (0, concurrency_1.resolveConcurrency)(options?.concurrency);
|
|
19
|
-
const batchItemFailures = [];
|
|
20
|
-
/**
|
|
21
|
-
* Processes one record and records a batch item failure on error.
|
|
22
|
-
*
|
|
23
|
-
* @param record The SQS record to process.
|
|
24
|
-
*/
|
|
25
|
-
const handle = async (record) => {
|
|
26
|
-
const id = options?.mapMessageId?.(record) ?? record.messageId;
|
|
27
|
-
try {
|
|
28
|
-
await processRecord(record);
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
if (options?.onRecordError) {
|
|
32
|
-
options.onRecordError(record, error);
|
|
33
|
-
}
|
|
34
|
-
batchItemFailures.push((0, item_failure_1.itemFailure)(id));
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
if (concurrency <= 1) {
|
|
38
|
-
for (const record of event.Records) {
|
|
39
|
-
await handle(record);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
await (0, concurrency_1.runWithConcurrency)(event.Records, concurrency, handle);
|
|
44
|
-
}
|
|
45
|
-
return { batchItemFailures };
|
|
46
|
-
};
|
|
47
|
-
exports.processPartialBatch = processPartialBatch;
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1wYXJ0aWFsLWJhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb2Nlc3Nvci9wcm9jZXNzLXBhcnRpYWwtYmF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsK0NBQXVFO0FBQ3ZFLGlEQUE2QztBQUU3Qzs7Ozs7Ozs7OztHQVVHO0FBQ0ksTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEVBQ3RDLEtBQWUsRUFDZixhQUFtRCxFQUNuRCxPQUFvQyxFQUNULEVBQUU7SUFDN0IsTUFBTSxXQUFXLEdBQUcsSUFBQSxnQ0FBa0IsRUFBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDN0QsTUFBTSxpQkFBaUIsR0FBaUMsRUFBRSxDQUFDO0lBRTNEOzs7O09BSUc7SUFDSCxNQUFNLE1BQU0sR0FBRyxLQUFLLEVBQUUsTUFBaUIsRUFBaUIsRUFBRTtRQUN4RCxNQUFNLEVBQUUsR0FBRyxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUMvRCxJQUFJLENBQUM7WUFDSCxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO2dCQUMzQixPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUEsMEJBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNyQixLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUEsZ0NBQWtCLEVBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQWxDVyxRQUFBLG1CQUFtQix1QkFrQzlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTUVNCYXRjaFJlc3BvbnNlLCBTUVNFdmVudCwgU1FTUmVjb3JkIH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NQYXJ0aWFsQmF0Y2hPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgcmVzb2x2ZUNvbmN1cnJlbmN5LCBydW5XaXRoQ29uY3VycmVuY3kgfSBmcm9tICcuL2NvbmN1cnJlbmN5JztcbmltcG9ydCB7IGl0ZW1GYWlsdXJlIH0gZnJvbSAnLi9pdGVtLWZhaWx1cmUnO1xuXG4vKipcbiAqIFJ1bnMgYHByb2Nlc3NSZWNvcmRgIGZvciBlYWNoIFNRUyByZWNvcmQuIFRocm93biBlcnJvcnMgYXJlIG1hcHBlZCB0b1xuICogYGJhdGNoSXRlbUZhaWx1cmVzYDsgc3VjY2Vzc2Z1bCByZWNvcmRzIGFyZSBub3QgbGlzdGVkLlxuICpcbiAqIEBwYXJhbSBldmVudCBUaGUgU1FTIExhbWJkYSBldmVudC5cbiAqIEBwYXJhbSBwcm9jZXNzUmVjb3JkIFBlci1yZWNvcmQgaGFuZGxlci4gVGhyb3cgdG8gbWFyayBvbmx5IHRoYXQgcmVjb3JkIGFzIGZhaWxlZC5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGNvbmN1cnJlbmN5LCBlcnJvciBob29rLCBhbmQgbWVzc2FnZSBpZCBtYXBwaW5nLlxuICogQHJldHVybnMgQW4ge0BsaW5rIFNRU0JhdGNoUmVzcG9uc2V9IGxpc3Rpbmcgb25seSBmYWlsZWQgYGl0ZW1JZGVudGlmaWVyYHMuXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBXaGVuIGBvcHRpb25zLmNvbmN1cnJlbmN5YCBpcyBsZXNzIHRoYW4gMS5cbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gV2hlbiBgb3B0aW9ucy5jb25jdXJyZW5jeWAgaXMgbm90IGEgZmluaXRlIGludGVnZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzUGFydGlhbEJhdGNoID0gYXN5bmMgKFxuICBldmVudDogU1FTRXZlbnQsXG4gIHByb2Nlc3NSZWNvcmQ6IChyZWNvcmQ6IFNRU1JlY29yZCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgb3B0aW9ucz86IFByb2Nlc3NQYXJ0aWFsQmF0Y2hPcHRpb25zLFxuKTogUHJvbWlzZTxTUVNCYXRjaFJlc3BvbnNlPiA9PiB7XG4gIGNvbnN0IGNvbmN1cnJlbmN5ID0gcmVzb2x2ZUNvbmN1cnJlbmN5KG9wdGlvbnM/LmNvbmN1cnJlbmN5KTtcbiAgY29uc3QgYmF0Y2hJdGVtRmFpbHVyZXM6IHsgaXRlbUlkZW50aWZpZXI6IHN0cmluZyB9W10gPSBbXTtcblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG9uZSByZWNvcmQgYW5kIHJlY29yZHMgYSBiYXRjaCBpdGVtIGZhaWx1cmUgb24gZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSByZWNvcmQgVGhlIFNRUyByZWNvcmQgdG8gcHJvY2Vzcy5cbiAgICovXG4gIGNvbnN0IGhhbmRsZSA9IGFzeW5jIChyZWNvcmQ6IFNRU1JlY29yZCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGlkID0gb3B0aW9ucz8ubWFwTWVzc2FnZUlkPy4ocmVjb3JkKSA/PyByZWNvcmQubWVzc2FnZUlkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwcm9jZXNzUmVjb3JkKHJlY29yZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChvcHRpb25zPy5vblJlY29yZEVycm9yKSB7XG4gICAgICAgIG9wdGlvbnMub25SZWNvcmRFcnJvcihyZWNvcmQsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIGJhdGNoSXRlbUZhaWx1cmVzLnB1c2goaXRlbUZhaWx1cmUoaWQpKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKGNvbmN1cnJlbmN5IDw9IDEpIHtcbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBldmVudC5SZWNvcmRzKSB7XG4gICAgICBhd2FpdCBoYW5kbGUocmVjb3JkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgcnVuV2l0aENvbmN1cnJlbmN5KGV2ZW50LlJlY29yZHMsIGNvbmN1cnJlbmN5LCBoYW5kbGUpO1xuICB9XG5cbiAgcmV0dXJuIHsgYmF0Y2hJdGVtRmFpbHVyZXMgfTtcbn07XG4iXX0=
|
package/lib/types/index.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU1FTUmVjb3JkIH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgcGVyLXJlY29yZCBoYW5kbGVyIHVzZWQgYnkge0BsaW5rIHByb2Nlc3NQYXJ0aWFsQmF0Y2hXaXRoUmVzdWx0fS5cbiAqXG4gKiAtIGB7IG9rOiB0cnVlIH1gOiBzdWNjZXNzIChub3QgbGlzdGVkIGluIGBiYXRjaEl0ZW1GYWlsdXJlc2ApXG4gKiAtIGB7IG9rOiBmYWxzZSB9YDogZmFpbHVyZSAobGlzdGVkIGluIGBiYXRjaEl0ZW1GYWlsdXJlc2ApXG4gKi9cbmV4cG9ydCB0eXBlIFByb2Nlc3NSZWNvcmRSZXN1bHQgPSB7IG9rOiB0cnVlIH0gfCB7IG9rOiBmYWxzZSB9O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwcm9jZXNzUGFydGlhbEJhdGNofSBhbmQge0BsaW5rIHByb2Nlc3NQYXJ0aWFsQmF0Y2hXaXRoUmVzdWx0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzUGFydGlhbEJhdGNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiByZWNvcmRzIHByb2Nlc3NlZCBpbiBwYXJhbGxlbC5cbiAgICpcbiAgICogLSBgMWA6IHNlcXVlbnRpYWwgcHJvY2Vzc2luZ1xuICAgKiAtIGA+IDFgOiBib3VuZGVkIGNvbmN1cnJlbmN5IHBvb2wgKG9yZGVyIG9mIHtAbGluayBTUVNCYXRjaFJlc3BvbnNlLmJhdGNoSXRlbUZhaWx1cmVzfSBpcyBub3QgZ3VhcmFudGVlZClcbiAgICpcbiAgICogQGRlZmF1bHQgMVxuICAgKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBXaGVuIGBjb25jdXJyZW5jeWAgaXMgbGVzcyB0aGFuIDEuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gV2hlbiBgY29uY3VycmVuY3lgIGlzIG5vdCBhIGZpbml0ZSBpbnRlZ2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uY3VycmVuY3k/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgcmVjb3JkIGlzIHRyZWF0ZWQgYXMgZmFpbGVkICh0aHJvd24gZXJyb3Igb3IgYHsgb2s6IGZhbHNlIH1gKS5cbiAgICogVXNlIGZvciBsb2dnaW5nIG9yIG1ldHJpY3M7IHRoZSBsaWJyYXJ5IGRvZXMgbm90IHdyaXRlIHRvIGBjb25zb2xlYCBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBGb3IgYHsgb2s6IGZhbHNlIH1gIGZyb20ge0BsaW5rIHByb2Nlc3NQYXJ0aWFsQmF0Y2hXaXRoUmVzdWx0fSwgYGVycm9yYCBpcyBhbiBgRXJyb3JgXG4gICAqIHdob3NlIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIHJlc29sdmVkIGBpdGVtSWRlbnRpZmllcmAsIGFuZCB3aG9zZSBgY2F1c2VgIGlzXG4gICAqIGB7IGl0ZW1JZGVudGlmaWVyIH1gIGZvciBzdHJ1Y3R1cmVkIGxvZ2dpbmcuXG4gICAqXG4gICAqIERvIG5vdCBsb2cgYHJlY29yZC5ib2R5YCBhcy1pcyDigJQgaXQgbWF5IGNvbnRhaW4gc2VjcmV0cyBvciBwZXJzb25hbCBkYXRhLlxuICAgKiBQcmVmZXIgaWRlbnRpZmllcnMgc3VjaCBhcyBgcmVjb3JkLm1lc3NhZ2VJZGAgKG9yIHlvdXIgYG1hcE1lc3NhZ2VJZGAgcmVzdWx0KVxuICAgKiBhbmQgYSBzYW5pdGl6ZWQgZXJyb3Igc3VtbWFyeS5cbiAgICpcbiAgICogQHBhcmFtIHJlY29yZCBUaGUgZmFpbGVkIFNRUyByZWNvcmQuXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgdGhyb3duIHZhbHVlLCBvciBhIHN5bnRoZXNpemVkIGBFcnJvcmAgd2hlbiBgeyBvazogZmFsc2UgfWAgd2FzIHJldHVybmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb25SZWNvcmRFcnJvcj86IChyZWNvcmQ6IFNRU1JlY29yZCwgZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGBpdGVtSWRlbnRpZmllcmAgcmVwb3J0ZWQgaW4gYGJhdGNoSXRlbUZhaWx1cmVzYCBmb3IgYSByZWNvcmQuXG4gICAqIERlZmF1bHRzIHRvIGByZWNvcmQubWVzc2FnZUlkYCB3aGVuIG9taXR0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSByZWNvcmQgVGhlIFNRUyByZWNvcmQgYmVpbmcgcHJvY2Vzc2VkLlxuICAgKiBAcmV0dXJucyBUaGUgaWRlbnRpZmllciBzZW50IGJhY2sgdG8gTGFtYmRhIGluIGBiYXRjaEl0ZW1GYWlsdXJlc2AuXG4gICAqL1xuICByZWFkb25seSBtYXBNZXNzYWdlSWQ/OiAocmVjb3JkOiBTUVNSZWNvcmQpID0+IHN0cmluZztcbn1cbiJdfQ==
|
|
File without changes
|