sqs-partial-batch-processor 0.4.5 → 0.5.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/.editorconfig ADDED
@@ -0,0 +1,12 @@
1
+ # ~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen".
2
+
3
+ root=true
4
+
5
+ [*]
6
+ end_of_line=lf
7
+ charset=utf-8
8
+
9
+ [*\.{js,ts}]
10
+ indent_style=space
11
+ indent_size=2
12
+ max_line_length=160
package/README.md CHANGED
@@ -1,49 +1,52 @@
1
1
  # SQS Partial Batch Processor
2
2
 
3
- [![npm](https://img.shields.io/npm/v/sqs-partial-batch-processor)](https://www.npmjs.com/package/sqs-partial-batch-processor)
4
- [![build](https://img.shields.io/github/actions/workflow/status/gammarers-aws-sdk-extensions/sqs-partial-batch-processor/build.yml?branch=main)](https://github.com/gammarers-aws-sdk-extensions/sqs-partial-batch-processor/actions/workflows/build.yml)
3
+ [![npm version](https://img.shields.io/npm/v/sqs-partial-batch-processor?style=flat-square)](https://www.npmjs.com/package/sqs-partial-batch-processor)
4
+ [![license](https://img.shields.io/npm/l/sqs-partial-batch-processor?style=flat-square)](https://www.npmjs.com/package/sqs-partial-batch-processor)
5
+ [![Node.js](https://img.shields.io/node/v/sqs-partial-batch-processor?style=flat-square)](https://www.npmjs.com/package/sqs-partial-batch-processor)
6
+ [![build](https://img.shields.io/github/actions/workflow/status/gammarers-aws-sdk-extensions/sqs-partial-batch-processor/build.yml?label=build&style=flat-square)](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 **partial batch response** pattern (only failed messages are retried).
16
- - Per-record error boundary (failures are isolated to each record).
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
- - Throw-style (`processPartialBatch`) and Result-style (`processPartialBatchWithResult`) APIs.
19
- - Typed Result callback via `ProcessRecordResult` (`{ ok: true }` | `{ ok: false }`).
20
- - Optional bounded concurrency (`concurrency`), error hook (`onRecordError`), and custom `itemIdentifier` mapping (`mapMessageId`).
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
- ## Requirements
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
- - Node.js **20+** (runtime requirement)
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
- Result-style callback (no throw for control flow). Return a `ProcessRecordResult`:
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
- // Do not log record.body — it may contain secrets or PII.
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
- - `mapMessageId?: (record) => string`: customize the `itemIdentifier` (defaults to `record.messageId`).
119
- - Typical uses: align the identifier with an **application-level id** (e.g., an id stored in `messageAttributes` or the parsed payload), or normalize identifiers across FIFO/standard queues for easier correlation.
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
- * Result of a per-record handler used by {@link processPartialBatchWithResult}.
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 {RangeError} When `concurrency` is less than 1.
25
- * @throws {TypeError} When `concurrency` is not a finite integer.
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 is treated as failed (thrown error or `{ ok: false }`).
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 thrown value, or a synthesized `Error` when `{ ok: false }` was returned.
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, ProcessRecordResult } from './types';
2
- export { processPartialBatch } from './processor/process-partial-batch';
3
- export { processPartialBatchWithResult } from './processor/process-partial-batch-with-result';
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.processPartialBatchWithResult = exports.processPartialBatch = void 0;
4
- var process_partial_batch_1 = require("./processor/process-partial-batch");
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
- var process_partial_batch_with_result_1 = require("./processor/process-partial-batch-with-result");
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 '../types';
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 {RangeError} When `options.concurrency` is less than 1.
12
- * @throws {TypeError} When `options.concurrency` is not a finite integer.
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",
@@ -73,7 +74,7 @@
73
74
  "publishConfig": {
74
75
  "access": "public"
75
76
  },
76
- "version": "0.4.5",
77
+ "version": "0.5.0",
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=
@@ -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