sqs-consumer 7.1.0 → 7.2.0-canary.2
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/.github/DISCUSSION_TEMPLATE/help.yml +2 -2
- package/dist/consumer.d.ts +2 -1
- package/dist/consumer.js +33 -17
- package/dist/emitter.d.ts +22 -0
- package/dist/emitter.js +32 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.js +7 -0
- package/dist/types.d.ts +0 -21
- package/dist/types.js +0 -28
- package/package.json +13 -14
- package/src/consumer.ts +38 -32
- package/src/emitter.ts +37 -0
- package/src/logger.ts +5 -0
- package/src/types.ts +0 -33
|
@@ -8,6 +8,6 @@ body:
|
|
|
8
8
|
- type: input
|
|
9
9
|
attributes:
|
|
10
10
|
label: Example
|
|
11
|
-
description: A link to a minimal reproduction is helpful for debugging!
|
|
11
|
+
description: A link to a minimal reproduction is helpful for debugging! You can fork [this stackblitz setup](https://stackblitz.com/edit/sqs-consumer-starter) to get a reproduction setup quickly.
|
|
12
12
|
validations:
|
|
13
|
-
required: false
|
|
13
|
+
required: false
|
package/dist/consumer.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ConsumerOptions,
|
|
1
|
+
import { ConsumerOptions, StopOptions, UpdatableOptions } from './types';
|
|
2
|
+
import { TypedEventEmitter } from './emitter';
|
|
2
3
|
/**
|
|
3
4
|
* [Usage](https://bbc.github.io/sqs-consumer/index.html#usage)
|
|
4
5
|
*/
|
package/dist/consumer.js
CHANGED
|
@@ -2,17 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Consumer = void 0;
|
|
4
4
|
const client_sqs_1 = require("@aws-sdk/client-sqs");
|
|
5
|
-
const
|
|
6
|
-
const types_1 = require("./types");
|
|
5
|
+
const emitter_1 = require("./emitter");
|
|
7
6
|
const bind_1 = require("./bind");
|
|
8
7
|
const errors_1 = require("./errors");
|
|
9
8
|
const validation_1 = require("./validation");
|
|
10
9
|
const controllers_1 = require("./controllers");
|
|
11
|
-
const
|
|
10
|
+
const logger_1 = require("./logger");
|
|
12
11
|
/**
|
|
13
12
|
* [Usage](https://bbc.github.io/sqs-consumer/index.html#usage)
|
|
14
13
|
*/
|
|
15
|
-
class Consumer extends
|
|
14
|
+
class Consumer extends emitter_1.TypedEventEmitter {
|
|
16
15
|
constructor(options) {
|
|
17
16
|
var _a, _b, _c, _d;
|
|
18
17
|
super();
|
|
@@ -59,7 +58,7 @@ class Consumer extends types_1.TypedEventEmitter {
|
|
|
59
58
|
*/
|
|
60
59
|
start() {
|
|
61
60
|
if (this.stopped) {
|
|
62
|
-
debug('
|
|
61
|
+
logger_1.logger.debug('starting');
|
|
63
62
|
this.stopped = false;
|
|
64
63
|
this.emit('started');
|
|
65
64
|
this.poll();
|
|
@@ -70,17 +69,17 @@ class Consumer extends types_1.TypedEventEmitter {
|
|
|
70
69
|
*/
|
|
71
70
|
stop(options) {
|
|
72
71
|
if (this.stopped) {
|
|
73
|
-
debug('
|
|
72
|
+
logger_1.logger.debug('already_stopped');
|
|
74
73
|
return;
|
|
75
74
|
}
|
|
76
|
-
debug('
|
|
75
|
+
logger_1.logger.debug('stopping');
|
|
77
76
|
this.stopped = true;
|
|
78
77
|
if (this.pollingTimeoutId) {
|
|
79
78
|
clearTimeout(this.pollingTimeoutId);
|
|
80
79
|
this.pollingTimeoutId = undefined;
|
|
81
80
|
}
|
|
82
81
|
if (options === null || options === void 0 ? void 0 : options.abort) {
|
|
83
|
-
debug('
|
|
82
|
+
logger_1.logger.debug('aborting');
|
|
84
83
|
controllers_1.abortController.abort();
|
|
85
84
|
this.emit('aborted');
|
|
86
85
|
}
|
|
@@ -99,7 +98,6 @@ class Consumer extends types_1.TypedEventEmitter {
|
|
|
99
98
|
*/
|
|
100
99
|
updateOption(option, value) {
|
|
101
100
|
(0, validation_1.validateOption)(option, value, this, true);
|
|
102
|
-
debug(`Updating the ${option} option to the value ${value}`);
|
|
103
101
|
this[option] = value;
|
|
104
102
|
this.emit('option_updated', option, value);
|
|
105
103
|
}
|
|
@@ -127,10 +125,12 @@ class Consumer extends types_1.TypedEventEmitter {
|
|
|
127
125
|
*/
|
|
128
126
|
poll() {
|
|
129
127
|
if (this.stopped) {
|
|
130
|
-
debug('
|
|
128
|
+
logger_1.logger.debug('cancelling_poll', {
|
|
129
|
+
detail: 'Poll was called while consumer was stopped, cancelling poll...'
|
|
130
|
+
});
|
|
131
131
|
return;
|
|
132
132
|
}
|
|
133
|
-
debug('
|
|
133
|
+
logger_1.logger.debug('polling');
|
|
134
134
|
let currentPollingTimeout = this.pollingWaitTimeMs;
|
|
135
135
|
this.receiveMessage({
|
|
136
136
|
QueueUrl: this.queueUrl,
|
|
@@ -144,7 +144,9 @@ class Consumer extends types_1.TypedEventEmitter {
|
|
|
144
144
|
.catch((err) => {
|
|
145
145
|
this.emitError(err);
|
|
146
146
|
if ((0, errors_1.isConnectionError)(err)) {
|
|
147
|
-
debug('
|
|
147
|
+
logger_1.logger.debug('authentication_error', {
|
|
148
|
+
detail: 'There was an authentication error. Pausing before retrying.'
|
|
149
|
+
});
|
|
148
150
|
currentPollingTimeout = this.authenticationErrorTimeout;
|
|
149
151
|
}
|
|
150
152
|
return;
|
|
@@ -178,12 +180,18 @@ class Consumer extends types_1.TypedEventEmitter {
|
|
|
178
180
|
*/
|
|
179
181
|
async handleSqsResponse(response) {
|
|
180
182
|
if ((0, validation_1.hasMessages)(response)) {
|
|
183
|
+
const handlerProcessingDebugger = setInterval(() => {
|
|
184
|
+
logger_1.logger.debug('handler_processing', {
|
|
185
|
+
detail: 'The handler is still processing the message(s)...'
|
|
186
|
+
});
|
|
187
|
+
}, 1000);
|
|
181
188
|
if (this.handleMessageBatch) {
|
|
182
189
|
await this.processMessageBatch(response.Messages);
|
|
183
190
|
}
|
|
184
191
|
else {
|
|
185
192
|
await Promise.all(response.Messages.map(this.processMessage));
|
|
186
193
|
}
|
|
194
|
+
clearInterval(handlerProcessingDebugger);
|
|
187
195
|
this.emit('response_processed');
|
|
188
196
|
}
|
|
189
197
|
else if (response) {
|
|
@@ -215,7 +223,9 @@ class Consumer extends types_1.TypedEventEmitter {
|
|
|
215
223
|
}
|
|
216
224
|
}
|
|
217
225
|
finally {
|
|
218
|
-
|
|
226
|
+
if (this.heartbeatInterval) {
|
|
227
|
+
clearInterval(heartbeatTimeoutId);
|
|
228
|
+
}
|
|
219
229
|
}
|
|
220
230
|
}
|
|
221
231
|
/**
|
|
@@ -356,10 +366,12 @@ class Consumer extends types_1.TypedEventEmitter {
|
|
|
356
366
|
*/
|
|
357
367
|
async deleteMessage(message) {
|
|
358
368
|
if (!this.shouldDeleteMessages) {
|
|
359
|
-
debug('
|
|
369
|
+
logger_1.logger.debug('skipping_delete', {
|
|
370
|
+
detail: 'Skipping message delete since shouldDeleteMessages is set to false'
|
|
371
|
+
});
|
|
360
372
|
return;
|
|
361
373
|
}
|
|
362
|
-
debug('
|
|
374
|
+
logger_1.logger.debug('deleting_message', { messageId: message.MessageId });
|
|
363
375
|
const deleteParams = {
|
|
364
376
|
QueueUrl: this.queueUrl,
|
|
365
377
|
ReceiptHandle: message.ReceiptHandle
|
|
@@ -377,10 +389,14 @@ class Consumer extends types_1.TypedEventEmitter {
|
|
|
377
389
|
*/
|
|
378
390
|
async deleteMessageBatch(messages) {
|
|
379
391
|
if (!this.shouldDeleteMessages) {
|
|
380
|
-
debug('
|
|
392
|
+
logger_1.logger.debug('skipping_delete', {
|
|
393
|
+
detail: 'Skipping message delete since shouldDeleteMessages is set to false'
|
|
394
|
+
});
|
|
381
395
|
return;
|
|
382
396
|
}
|
|
383
|
-
debug('
|
|
397
|
+
logger_1.logger.debug('deleting_messages', {
|
|
398
|
+
messageIds: messages.map((msg) => msg.MessageId)
|
|
399
|
+
});
|
|
384
400
|
const deleteParams = {
|
|
385
401
|
QueueUrl: this.queueUrl,
|
|
386
402
|
Entries: messages.map((message) => ({
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import { Events } from './types';
|
|
4
|
+
export declare class TypedEventEmitter extends EventEmitter {
|
|
5
|
+
/**
|
|
6
|
+
* Trigger a listener on all emitted events
|
|
7
|
+
* @param event The name of the event to listen to
|
|
8
|
+
* @param listener A function to trigger when the event is emitted
|
|
9
|
+
*/
|
|
10
|
+
on<E extends keyof Events>(event: E, listener: (...args: Events[E]) => void): this;
|
|
11
|
+
/**
|
|
12
|
+
* Trigger a listener only once for an emitted event
|
|
13
|
+
* @param event The name of the event to listen to
|
|
14
|
+
* @param listener A function to trigger when the event is emitted
|
|
15
|
+
*/
|
|
16
|
+
once<E extends keyof Events>(event: E, listener: (...args: Events[E]) => void): this;
|
|
17
|
+
/**
|
|
18
|
+
* Emits an event with the provided arguments
|
|
19
|
+
* @param event The name of the event to emit
|
|
20
|
+
*/
|
|
21
|
+
emit<E extends keyof Events>(event: E, ...args: Events[E]): boolean;
|
|
22
|
+
}
|
package/dist/emitter.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TypedEventEmitter = void 0;
|
|
4
|
+
const events_1 = require("events");
|
|
5
|
+
const logger_1 = require("./logger");
|
|
6
|
+
class TypedEventEmitter extends events_1.EventEmitter {
|
|
7
|
+
/**
|
|
8
|
+
* Trigger a listener on all emitted events
|
|
9
|
+
* @param event The name of the event to listen to
|
|
10
|
+
* @param listener A function to trigger when the event is emitted
|
|
11
|
+
*/
|
|
12
|
+
on(event, listener) {
|
|
13
|
+
return super.on(event, listener);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Trigger a listener only once for an emitted event
|
|
17
|
+
* @param event The name of the event to listen to
|
|
18
|
+
* @param listener A function to trigger when the event is emitted
|
|
19
|
+
*/
|
|
20
|
+
once(event, listener) {
|
|
21
|
+
return super.once(event, listener);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Emits an event with the provided arguments
|
|
25
|
+
* @param event The name of the event to emit
|
|
26
|
+
*/
|
|
27
|
+
emit(event, ...args) {
|
|
28
|
+
logger_1.logger.debug(event, ...args);
|
|
29
|
+
return super.emit(event, ...args);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.TypedEventEmitter = TypedEventEmitter;
|
package/dist/logger.d.ts
ADDED
package/dist/logger.js
ADDED
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
1
|
import { SQSClient, Message } from '@aws-sdk/client-sqs';
|
|
3
|
-
import { EventEmitter } from 'events';
|
|
4
2
|
export interface ConsumerOptions {
|
|
5
3
|
/**
|
|
6
4
|
* The SQS queue URL.
|
|
@@ -163,25 +161,6 @@ export interface Events {
|
|
|
163
161
|
*/
|
|
164
162
|
option_updated: [UpdatableOptions, ConsumerOptions[UpdatableOptions]];
|
|
165
163
|
}
|
|
166
|
-
export declare class TypedEventEmitter extends EventEmitter {
|
|
167
|
-
/**
|
|
168
|
-
* Trigger a listener on all emitted events
|
|
169
|
-
* @param event The name of the event to listen to
|
|
170
|
-
* @param listener A function to trigger when the event is emitted
|
|
171
|
-
*/
|
|
172
|
-
on<E extends keyof Events>(event: E, listener: (...args: Events[E]) => void): this;
|
|
173
|
-
/**
|
|
174
|
-
* Trigger a listener only once for an emitted event
|
|
175
|
-
* @param event The name of the event to listen to
|
|
176
|
-
* @param listener A function to trigger when the event is emitted
|
|
177
|
-
*/
|
|
178
|
-
once<E extends keyof Events>(event: E, listener: (...args: Events[E]) => void): this;
|
|
179
|
-
/**
|
|
180
|
-
* Emits an event with the provided arguments
|
|
181
|
-
* @param event The name of the event to emit
|
|
182
|
-
*/
|
|
183
|
-
emit<E extends keyof Events>(event: E, ...args: Events[E]): boolean;
|
|
184
|
-
}
|
|
185
164
|
export type AWSError = {
|
|
186
165
|
/**
|
|
187
166
|
* Name, eg. ConditionalCheckFailedException
|
package/dist/types.js
CHANGED
|
@@ -1,30 +1,2 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TypedEventEmitter = void 0;
|
|
4
|
-
const events_1 = require("events");
|
|
5
|
-
class TypedEventEmitter extends events_1.EventEmitter {
|
|
6
|
-
/**
|
|
7
|
-
* Trigger a listener on all emitted events
|
|
8
|
-
* @param event The name of the event to listen to
|
|
9
|
-
* @param listener A function to trigger when the event is emitted
|
|
10
|
-
*/
|
|
11
|
-
on(event, listener) {
|
|
12
|
-
return super.on(event, listener);
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Trigger a listener only once for an emitted event
|
|
16
|
-
* @param event The name of the event to listen to
|
|
17
|
-
* @param listener A function to trigger when the event is emitted
|
|
18
|
-
*/
|
|
19
|
-
once(event, listener) {
|
|
20
|
-
return super.once(event, listener);
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Emits an event with the provided arguments
|
|
24
|
-
* @param event The name of the event to emit
|
|
25
|
-
*/
|
|
26
|
-
emit(event, ...args) {
|
|
27
|
-
return super.emit(event, ...args);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
exports.TypedEventEmitter = TypedEventEmitter;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sqs-consumer",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.2.0-canary.2",
|
|
4
4
|
"description": "Build SQS-based Node applications without the boilerplate",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -41,32 +41,31 @@
|
|
|
41
41
|
],
|
|
42
42
|
"license": "Apache-2.0",
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@cucumber/cucumber": "^
|
|
45
|
-
"@types/chai": "^4.3.
|
|
46
|
-
"@types/debug": "^4.1.7",
|
|
44
|
+
"@cucumber/cucumber": "^9.1.2",
|
|
45
|
+
"@types/chai": "^4.3.5",
|
|
47
46
|
"@types/mocha": "^10.0.1",
|
|
48
47
|
"@types/node": "^18.11.18",
|
|
49
|
-
"@types/sinon": "^10.0.
|
|
48
|
+
"@types/sinon": "^10.0.15",
|
|
50
49
|
"chai": "^4.3.7",
|
|
51
|
-
"eslint": "^8.
|
|
52
|
-
"eslint-config-iplayer-ts": "^4.1.
|
|
53
|
-
"eslint-config-prettier": "^8.
|
|
50
|
+
"eslint": "^8.42.0",
|
|
51
|
+
"eslint-config-iplayer-ts": "^4.1.1",
|
|
52
|
+
"eslint-config-prettier": "^8.8.0",
|
|
54
53
|
"mocha": "^10.2.0",
|
|
55
54
|
"nyc": "^15.1.0",
|
|
56
55
|
"p-event": "^4.2.0",
|
|
57
|
-
"prettier": "^2.8.
|
|
58
|
-
"sinon": "^15.0
|
|
59
|
-
"sqs-producer": "^3.1.
|
|
56
|
+
"prettier": "^2.8.8",
|
|
57
|
+
"sinon": "^15.1.0",
|
|
58
|
+
"sqs-producer": "^3.1.2",
|
|
60
59
|
"ts-node": "^10.9.1",
|
|
61
|
-
"typedoc": "^0.
|
|
60
|
+
"typedoc": "^0.24.8",
|
|
62
61
|
"typescript": "^4.9.4"
|
|
63
62
|
},
|
|
64
63
|
"dependencies": {
|
|
65
|
-
"@aws-sdk/client-sqs": "^3.
|
|
64
|
+
"@aws-sdk/client-sqs": "^3.348.0",
|
|
66
65
|
"debug": "^4.3.4"
|
|
67
66
|
},
|
|
68
67
|
"peerDependencies": {
|
|
69
|
-
"@aws-sdk/client-sqs": "^3.
|
|
68
|
+
"@aws-sdk/client-sqs": "^3.348.0"
|
|
70
69
|
},
|
|
71
70
|
"mocha": {
|
|
72
71
|
"spec": "test/tests/**/**/*.test.ts",
|
package/src/consumer.ts
CHANGED
|
@@ -15,14 +15,9 @@ import {
|
|
|
15
15
|
ReceiveMessageCommandInput,
|
|
16
16
|
ReceiveMessageCommandOutput
|
|
17
17
|
} from '@aws-sdk/client-sqs';
|
|
18
|
-
import Debug from 'debug';
|
|
19
18
|
|
|
20
|
-
import {
|
|
21
|
-
|
|
22
|
-
TypedEventEmitter,
|
|
23
|
-
StopOptions,
|
|
24
|
-
UpdatableOptions
|
|
25
|
-
} from './types';
|
|
19
|
+
import { ConsumerOptions, StopOptions, UpdatableOptions } from './types';
|
|
20
|
+
import { TypedEventEmitter } from './emitter';
|
|
26
21
|
import { autoBind } from './bind';
|
|
27
22
|
import {
|
|
28
23
|
SQSError,
|
|
@@ -32,8 +27,7 @@ import {
|
|
|
32
27
|
} from './errors';
|
|
33
28
|
import { validateOption, assertOptions, hasMessages } from './validation';
|
|
34
29
|
import { abortController } from './controllers';
|
|
35
|
-
|
|
36
|
-
const debug = Debug('sqs-consumer');
|
|
30
|
+
import { logger } from './logger';
|
|
37
31
|
|
|
38
32
|
/**
|
|
39
33
|
* [Usage](https://bbc.github.io/sqs-consumer/index.html#usage)
|
|
@@ -96,7 +90,7 @@ export class Consumer extends TypedEventEmitter {
|
|
|
96
90
|
*/
|
|
97
91
|
public start(): void {
|
|
98
92
|
if (this.stopped) {
|
|
99
|
-
debug('
|
|
93
|
+
logger.debug('starting');
|
|
100
94
|
this.stopped = false;
|
|
101
95
|
this.emit('started');
|
|
102
96
|
this.poll();
|
|
@@ -108,11 +102,11 @@ export class Consumer extends TypedEventEmitter {
|
|
|
108
102
|
*/
|
|
109
103
|
public stop(options?: StopOptions): void {
|
|
110
104
|
if (this.stopped) {
|
|
111
|
-
debug('
|
|
105
|
+
logger.debug('already_stopped');
|
|
112
106
|
return;
|
|
113
107
|
}
|
|
114
108
|
|
|
115
|
-
debug('
|
|
109
|
+
logger.debug('stopping');
|
|
116
110
|
this.stopped = true;
|
|
117
111
|
|
|
118
112
|
if (this.pollingTimeoutId) {
|
|
@@ -121,10 +115,8 @@ export class Consumer extends TypedEventEmitter {
|
|
|
121
115
|
}
|
|
122
116
|
|
|
123
117
|
if (options?.abort) {
|
|
124
|
-
debug('
|
|
125
|
-
|
|
118
|
+
logger.debug('aborting');
|
|
126
119
|
abortController.abort();
|
|
127
|
-
|
|
128
120
|
this.emit('aborted');
|
|
129
121
|
}
|
|
130
122
|
|
|
@@ -149,8 +141,6 @@ export class Consumer extends TypedEventEmitter {
|
|
|
149
141
|
) {
|
|
150
142
|
validateOption(option, value, this, true);
|
|
151
143
|
|
|
152
|
-
debug(`Updating the ${option} option to the value ${value}`);
|
|
153
|
-
|
|
154
144
|
this[option] = value;
|
|
155
145
|
|
|
156
146
|
this.emit('option_updated', option, value);
|
|
@@ -185,11 +175,13 @@ export class Consumer extends TypedEventEmitter {
|
|
|
185
175
|
*/
|
|
186
176
|
private poll(): void {
|
|
187
177
|
if (this.stopped) {
|
|
188
|
-
debug('
|
|
178
|
+
logger.debug('cancelling_poll', {
|
|
179
|
+
detail: 'Poll was called while consumer was stopped, cancelling poll...'
|
|
180
|
+
});
|
|
189
181
|
return;
|
|
190
182
|
}
|
|
191
183
|
|
|
192
|
-
debug('
|
|
184
|
+
logger.debug('polling');
|
|
193
185
|
|
|
194
186
|
let currentPollingTimeout = this.pollingWaitTimeMs;
|
|
195
187
|
this.receiveMessage({
|
|
@@ -204,7 +196,10 @@ export class Consumer extends TypedEventEmitter {
|
|
|
204
196
|
.catch((err) => {
|
|
205
197
|
this.emitError(err);
|
|
206
198
|
if (isConnectionError(err)) {
|
|
207
|
-
debug('
|
|
199
|
+
logger.debug('authentication_error', {
|
|
200
|
+
detail:
|
|
201
|
+
'There was an authentication error. Pausing before retrying.'
|
|
202
|
+
});
|
|
208
203
|
currentPollingTimeout = this.authenticationErrorTimeout;
|
|
209
204
|
}
|
|
210
205
|
return;
|
|
@@ -246,12 +241,20 @@ export class Consumer extends TypedEventEmitter {
|
|
|
246
241
|
response: ReceiveMessageCommandOutput
|
|
247
242
|
): Promise<void> {
|
|
248
243
|
if (hasMessages(response)) {
|
|
244
|
+
const handlerProcessingDebugger = setInterval(() => {
|
|
245
|
+
logger.debug('handler_processing', {
|
|
246
|
+
detail: 'The handler is still processing the message(s)...'
|
|
247
|
+
});
|
|
248
|
+
}, 1000);
|
|
249
|
+
|
|
249
250
|
if (this.handleMessageBatch) {
|
|
250
251
|
await this.processMessageBatch(response.Messages);
|
|
251
252
|
} else {
|
|
252
253
|
await Promise.all(response.Messages.map(this.processMessage));
|
|
253
254
|
}
|
|
254
255
|
|
|
256
|
+
clearInterval(handlerProcessingDebugger);
|
|
257
|
+
|
|
255
258
|
this.emit('response_processed');
|
|
256
259
|
} else if (response) {
|
|
257
260
|
this.emit('empty');
|
|
@@ -287,7 +290,9 @@ export class Consumer extends TypedEventEmitter {
|
|
|
287
290
|
await this.changeVisibilityTimeout(message, 0);
|
|
288
291
|
}
|
|
289
292
|
} finally {
|
|
290
|
-
|
|
293
|
+
if (this.heartbeatInterval) {
|
|
294
|
+
clearInterval(heartbeatTimeoutId);
|
|
295
|
+
}
|
|
291
296
|
}
|
|
292
297
|
}
|
|
293
298
|
|
|
@@ -462,12 +467,13 @@ export class Consumer extends TypedEventEmitter {
|
|
|
462
467
|
*/
|
|
463
468
|
private async deleteMessage(message: Message): Promise<void> {
|
|
464
469
|
if (!this.shouldDeleteMessages) {
|
|
465
|
-
debug(
|
|
466
|
-
|
|
467
|
-
|
|
470
|
+
logger.debug('skipping_delete', {
|
|
471
|
+
detail:
|
|
472
|
+
'Skipping message delete since shouldDeleteMessages is set to false'
|
|
473
|
+
});
|
|
468
474
|
return;
|
|
469
475
|
}
|
|
470
|
-
debug('
|
|
476
|
+
logger.debug('deleting_message', { messageId: message.MessageId });
|
|
471
477
|
|
|
472
478
|
const deleteParams: DeleteMessageCommandInput = {
|
|
473
479
|
QueueUrl: this.queueUrl,
|
|
@@ -490,15 +496,15 @@ export class Consumer extends TypedEventEmitter {
|
|
|
490
496
|
*/
|
|
491
497
|
private async deleteMessageBatch(messages: Message[]): Promise<void> {
|
|
492
498
|
if (!this.shouldDeleteMessages) {
|
|
493
|
-
debug(
|
|
494
|
-
|
|
495
|
-
|
|
499
|
+
logger.debug('skipping_delete', {
|
|
500
|
+
detail:
|
|
501
|
+
'Skipping message delete since shouldDeleteMessages is set to false'
|
|
502
|
+
});
|
|
496
503
|
return;
|
|
497
504
|
}
|
|
498
|
-
debug(
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
);
|
|
505
|
+
logger.debug('deleting_messages', {
|
|
506
|
+
messageIds: messages.map((msg) => msg.MessageId)
|
|
507
|
+
});
|
|
502
508
|
|
|
503
509
|
const deleteParams: DeleteMessageBatchCommandInput = {
|
|
504
510
|
QueueUrl: this.queueUrl,
|
package/src/emitter.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
|
|
3
|
+
import { logger } from './logger';
|
|
4
|
+
import { Events } from './types';
|
|
5
|
+
|
|
6
|
+
export class TypedEventEmitter extends EventEmitter {
|
|
7
|
+
/**
|
|
8
|
+
* Trigger a listener on all emitted events
|
|
9
|
+
* @param event The name of the event to listen to
|
|
10
|
+
* @param listener A function to trigger when the event is emitted
|
|
11
|
+
*/
|
|
12
|
+
on<E extends keyof Events>(
|
|
13
|
+
event: E,
|
|
14
|
+
listener: (...args: Events[E]) => void
|
|
15
|
+
): this {
|
|
16
|
+
return super.on(event, listener);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Trigger a listener only once for an emitted event
|
|
20
|
+
* @param event The name of the event to listen to
|
|
21
|
+
* @param listener A function to trigger when the event is emitted
|
|
22
|
+
*/
|
|
23
|
+
once<E extends keyof Events>(
|
|
24
|
+
event: E,
|
|
25
|
+
listener: (...args: Events[E]) => void
|
|
26
|
+
): this {
|
|
27
|
+
return super.once(event, listener);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Emits an event with the provided arguments
|
|
31
|
+
* @param event The name of the event to emit
|
|
32
|
+
*/
|
|
33
|
+
emit<E extends keyof Events>(event: E, ...args: Events[E]): boolean {
|
|
34
|
+
logger.debug(event, ...args);
|
|
35
|
+
return super.emit(event, ...args);
|
|
36
|
+
}
|
|
37
|
+
}
|
package/src/logger.ts
ADDED
package/src/types.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { SQSClient, Message } from '@aws-sdk/client-sqs';
|
|
2
|
-
import { EventEmitter } from 'events';
|
|
3
2
|
|
|
4
3
|
export interface ConsumerOptions {
|
|
5
4
|
/**
|
|
@@ -170,38 +169,6 @@ export interface Events {
|
|
|
170
169
|
option_updated: [UpdatableOptions, ConsumerOptions[UpdatableOptions]];
|
|
171
170
|
}
|
|
172
171
|
|
|
173
|
-
export class TypedEventEmitter extends EventEmitter {
|
|
174
|
-
/**
|
|
175
|
-
* Trigger a listener on all emitted events
|
|
176
|
-
* @param event The name of the event to listen to
|
|
177
|
-
* @param listener A function to trigger when the event is emitted
|
|
178
|
-
*/
|
|
179
|
-
on<E extends keyof Events>(
|
|
180
|
-
event: E,
|
|
181
|
-
listener: (...args: Events[E]) => void
|
|
182
|
-
): this {
|
|
183
|
-
return super.on(event, listener);
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Trigger a listener only once for an emitted event
|
|
187
|
-
* @param event The name of the event to listen to
|
|
188
|
-
* @param listener A function to trigger when the event is emitted
|
|
189
|
-
*/
|
|
190
|
-
once<E extends keyof Events>(
|
|
191
|
-
event: E,
|
|
192
|
-
listener: (...args: Events[E]) => void
|
|
193
|
-
): this {
|
|
194
|
-
return super.once(event, listener);
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Emits an event with the provided arguments
|
|
198
|
-
* @param event The name of the event to emit
|
|
199
|
-
*/
|
|
200
|
-
emit<E extends keyof Events>(event: E, ...args: Events[E]): boolean {
|
|
201
|
-
return super.emit(event, ...args);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
172
|
export type AWSError = {
|
|
206
173
|
/**
|
|
207
174
|
* Name, eg. ConditionalCheckFailedException
|