@eyevinn/player-analytics-shared 0.9.4 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/queue/BeanstalkdAdapter.ts +25 -0
- package/adapters/queue/RedisAdapter.ts +25 -0
- package/adapters/queue/SqsQueueAdapter.ts +68 -5
- package/build/adapters/queue/BeanstalkdAdapter.d.ts +1 -0
- package/build/adapters/queue/BeanstalkdAdapter.js +26 -0
- package/build/adapters/queue/BeanstalkdAdapter.js.map +1 -1
- package/build/adapters/queue/RedisAdapter.d.ts +1 -0
- package/build/adapters/queue/RedisAdapter.js +26 -0
- package/build/adapters/queue/RedisAdapter.js.map +1 -1
- package/build/adapters/queue/SqsQueueAdapter.d.ts +1 -0
- package/build/adapters/queue/SqsQueueAdapter.js +55 -4
- package/build/adapters/queue/SqsQueueAdapter.js.map +1 -1
- package/build/types/queue.d.ts +1 -0
- package/build/types/queue.js.map +1 -1
- package/package.json +1 -1
- package/spec/adapters/SqsQueueAdapter.spec.ts +88 -0
- package/types/queue.ts +1 -0
|
@@ -34,6 +34,31 @@ export class BeanstalkdAdapter implements AbstractQueueAdapter {
|
|
|
34
34
|
return result;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
async removeFromQueueBatch(messages: Record<string, any>[]): Promise<Object> {
|
|
38
|
+
const results: { successful: any[]; failed: any[] } = {
|
|
39
|
+
successful: [],
|
|
40
|
+
failed: [],
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
for (const message of messages) {
|
|
44
|
+
try {
|
|
45
|
+
const success = await this.removeFromQueue(message);
|
|
46
|
+
if (success) {
|
|
47
|
+
results.successful.push({ id: message.id });
|
|
48
|
+
} else {
|
|
49
|
+
results.failed.push({ id: message.id, reason: 'delete failed' });
|
|
50
|
+
}
|
|
51
|
+
} catch (err) {
|
|
52
|
+
results.failed.push({
|
|
53
|
+
id: message.id,
|
|
54
|
+
reason: err instanceof Error ? err.message : 'Unknown error',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return results;
|
|
60
|
+
}
|
|
61
|
+
|
|
37
62
|
getEventJSONsFromMessages(body: any[]): Object[] {
|
|
38
63
|
this.logger.warn("Method not implemented.");
|
|
39
64
|
return body;
|
|
@@ -27,6 +27,31 @@ export class RedisAdapter implements AbstractQueueAdapter {
|
|
|
27
27
|
return result === 'completed';
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
async removeFromQueueBatch(messages: Record<string, any>[]): Promise<Object> {
|
|
31
|
+
const results: { successful: any[]; failed: any[] } = {
|
|
32
|
+
successful: [],
|
|
33
|
+
failed: [],
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
for (const message of messages) {
|
|
37
|
+
try {
|
|
38
|
+
const success = await this.removeFromQueue(message);
|
|
39
|
+
if (success) {
|
|
40
|
+
results.successful.push({ id: message.id });
|
|
41
|
+
} else {
|
|
42
|
+
results.failed.push({ id: message.id, reason: 'not completed' });
|
|
43
|
+
}
|
|
44
|
+
} catch (err) {
|
|
45
|
+
results.failed.push({
|
|
46
|
+
id: message.id,
|
|
47
|
+
reason: err instanceof Error ? err.message : 'Unknown error',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return results;
|
|
53
|
+
}
|
|
54
|
+
|
|
30
55
|
getEventJSONsFromMessages(body: any[]): Object[] {
|
|
31
56
|
this.logger.warn("Method not implemented.");
|
|
32
57
|
return body;
|
|
@@ -5,6 +5,9 @@ import {
|
|
|
5
5
|
ReceiveMessageCommandInput,
|
|
6
6
|
ReceiveMessageCommand,
|
|
7
7
|
DeleteMessageCommandInput,
|
|
8
|
+
DeleteMessageBatchCommand,
|
|
9
|
+
DeleteMessageBatchCommandInput,
|
|
10
|
+
DeleteMessageBatchRequestEntry,
|
|
8
11
|
Message,
|
|
9
12
|
DeleteMessageCommand,
|
|
10
13
|
paginateListQueues,
|
|
@@ -160,10 +163,10 @@ export class SqsQueueAdapter implements AbstractQueueAdapter {
|
|
|
160
163
|
const sendMessageResult = await this.client.send(sendMessageCommand);
|
|
161
164
|
const duration = Date.now() - startTime;
|
|
162
165
|
|
|
163
|
-
if (duration >
|
|
166
|
+
if (duration > 5000) {
|
|
164
167
|
const socketStats = this.getSocketStats();
|
|
165
|
-
this.logger.
|
|
166
|
-
`SQS message send took ${duration}ms (>
|
|
168
|
+
this.logger.debug(
|
|
169
|
+
`SQS message send took ${duration}ms (>5000ms threshold). Socket stats: ${JSON.stringify(socketStats)}`
|
|
167
170
|
);
|
|
168
171
|
}
|
|
169
172
|
|
|
@@ -173,10 +176,10 @@ export class SqsQueueAdapter implements AbstractQueueAdapter {
|
|
|
173
176
|
return sendMessageResult;
|
|
174
177
|
} catch (err) {
|
|
175
178
|
const duration = Date.now() - startTime;
|
|
176
|
-
if (duration >
|
|
179
|
+
if (duration > 5000) {
|
|
177
180
|
const socketStats = this.getSocketStats();
|
|
178
181
|
this.logger.warn(
|
|
179
|
-
`SQS message send failed after ${duration}ms (>
|
|
182
|
+
`SQS message send failed after ${duration}ms (>5000ms threshold). Socket stats: ${JSON.stringify(socketStats)}`
|
|
180
183
|
);
|
|
181
184
|
}
|
|
182
185
|
this.logger.error(err);
|
|
@@ -255,6 +258,66 @@ export class SqsQueueAdapter implements AbstractQueueAdapter {
|
|
|
255
258
|
}
|
|
256
259
|
}
|
|
257
260
|
|
|
261
|
+
async removeFromQueueBatch(messages: Message[]): Promise<any> {
|
|
262
|
+
if (process.env.SQS_QUEUE_URL === 'undefined') {
|
|
263
|
+
return { message: 'SQS_QUEUE_URL is undefined' };
|
|
264
|
+
}
|
|
265
|
+
if (!messages || messages.length === 0) {
|
|
266
|
+
return { successful: [], failed: [] };
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const results: { successful: any[]; failed: any[] } = {
|
|
270
|
+
successful: [],
|
|
271
|
+
failed: [],
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
// SQS allows max 10 messages per batch
|
|
275
|
+
const batchSize = 10;
|
|
276
|
+
for (let i = 0; i < messages.length; i += batchSize) {
|
|
277
|
+
const batch = messages.slice(i, i + batchSize);
|
|
278
|
+
const entries: DeleteMessageBatchRequestEntry[] = batch.map(
|
|
279
|
+
(msg, index) => ({
|
|
280
|
+
Id: `${i + index}`,
|
|
281
|
+
ReceiptHandle: msg.ReceiptHandle!,
|
|
282
|
+
})
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
const params: DeleteMessageBatchCommandInput = {
|
|
286
|
+
QueueUrl: process.env.SQS_QUEUE_URL,
|
|
287
|
+
Entries: entries,
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
const deleteMessageBatchCommand = new DeleteMessageBatchCommand(params);
|
|
291
|
+
try {
|
|
292
|
+
const batchResult = await this.client.send(deleteMessageBatchCommand);
|
|
293
|
+
this.logger.debug(
|
|
294
|
+
`Batch delete response from SQS: ${JSON.stringify(batchResult)}`
|
|
295
|
+
);
|
|
296
|
+
if (batchResult.Successful) {
|
|
297
|
+
results.successful.push(...batchResult.Successful);
|
|
298
|
+
}
|
|
299
|
+
if (batchResult.Failed) {
|
|
300
|
+
results.failed.push(...batchResult.Failed);
|
|
301
|
+
}
|
|
302
|
+
} catch (err) {
|
|
303
|
+
this.logger.error(`Batch delete error: ${JSON.stringify(err)}`);
|
|
304
|
+
// Mark all messages in this batch as failed
|
|
305
|
+
entries.forEach((entry) => {
|
|
306
|
+
results.failed.push({
|
|
307
|
+
Id: entry.Id,
|
|
308
|
+
Code: 'BatchError',
|
|
309
|
+
Message: err instanceof Error ? err.message : 'Unknown error',
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
this.logger.debug(
|
|
316
|
+
`Batch remove complete: ${results.successful.length} successful, ${results.failed.length} failed`
|
|
317
|
+
);
|
|
318
|
+
return results;
|
|
319
|
+
}
|
|
320
|
+
|
|
258
321
|
getEventJSONsFromMessages(messages: Message[]): any[] {
|
|
259
322
|
return messages.map((item) => (item.Body ? JSON.parse(item.Body) : {}));
|
|
260
323
|
}
|
|
@@ -9,5 +9,6 @@ export declare class BeanstalkdAdapter implements AbstractQueueAdapter {
|
|
|
9
9
|
pushToQueue(body: Object): Promise<Object>;
|
|
10
10
|
pullFromQueue(): Promise<Object>;
|
|
11
11
|
removeFromQueue(body: Record<string, any>): Promise<boolean>;
|
|
12
|
+
removeFromQueueBatch(messages: Record<string, any>[]): Promise<Object>;
|
|
12
13
|
getEventJSONsFromMessages(body: any[]): Object[];
|
|
13
14
|
}
|
|
@@ -46,6 +46,32 @@ class BeanstalkdAdapter {
|
|
|
46
46
|
return result;
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
|
+
removeFromQueueBatch(messages) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
const results = {
|
|
52
|
+
successful: [],
|
|
53
|
+
failed: [],
|
|
54
|
+
};
|
|
55
|
+
for (const message of messages) {
|
|
56
|
+
try {
|
|
57
|
+
const success = yield this.removeFromQueue(message);
|
|
58
|
+
if (success) {
|
|
59
|
+
results.successful.push({ id: message.id });
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
results.failed.push({ id: message.id, reason: 'delete failed' });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
results.failed.push({
|
|
67
|
+
id: message.id,
|
|
68
|
+
reason: err instanceof Error ? err.message : 'Unknown error',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return results;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
49
75
|
getEventJSONsFromMessages(body) {
|
|
50
76
|
this.logger.warn("Method not implemented.");
|
|
51
77
|
return body;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BeanstalkdAdapter.js","sourceRoot":"","sources":["../../../adapters/queue/BeanstalkdAdapter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAwC;AAIxC,MAAa,iBAAiB;IAI5B,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,uBAAM,EAAE,CAAC;IAC7B,CAAC;IAEa,OAAO;;YACnB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;KAAA;IAEK,WAAW,CAAC,IAAY;;YAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;gBAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;IAEK,aAAa;;YACjB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;gBAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACpD,OAAO,GAAG,IAAI,EAAE,CAAC;QACnB,CAAC;KAAA;IAEK,eAAe,CAAC,IAAyB;;YAC7C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;gBAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/C,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;IAED,yBAAyB,CAAC,IAAW;QACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"BeanstalkdAdapter.js","sourceRoot":"","sources":["../../../adapters/queue/BeanstalkdAdapter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAwC;AAIxC,MAAa,iBAAiB;IAI5B,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,uBAAM,EAAE,CAAC;IAC7B,CAAC;IAEa,OAAO;;YACnB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;KAAA;IAEK,WAAW,CAAC,IAAY;;YAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;gBAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;IAEK,aAAa;;YACjB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;gBAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACpD,OAAO,GAAG,IAAI,EAAE,CAAC;QACnB,CAAC;KAAA;IAEK,eAAe,CAAC,IAAyB;;YAC7C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;gBAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/C,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;IAEK,oBAAoB,CAAC,QAA+B;;YACxD,MAAM,OAAO,GAAyC;gBACpD,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE,EAAE;aACX,CAAC;YAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC9B,IAAI;oBACF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;oBACpD,IAAI,OAAO,EAAE;wBACX,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;qBAC7C;yBAAM;wBACL,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;qBAClE;iBACF;gBAAC,OAAO,GAAG,EAAE;oBACZ,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;wBAClB,EAAE,EAAE,OAAO,CAAC,EAAE;wBACd,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;qBAC7D,CAAC,CAAC;iBACJ;aACF;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KAAA;IAED,yBAAyB,CAAC,IAAW;QACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA7DD,8CA6DC"}
|
|
@@ -8,5 +8,6 @@ export declare class RedisAdapter implements AbstractQueueAdapter {
|
|
|
8
8
|
pushToQueue(body: Object): Promise<Object>;
|
|
9
9
|
pullFromQueue(): Promise<Object>;
|
|
10
10
|
removeFromQueue(body: Record<string, any>): Promise<boolean>;
|
|
11
|
+
removeFromQueueBatch(messages: Record<string, any>[]): Promise<Object>;
|
|
11
12
|
getEventJSONsFromMessages(body: any[]): Object[];
|
|
12
13
|
}
|
|
@@ -35,6 +35,32 @@ class RedisAdapter {
|
|
|
35
35
|
return result === 'completed';
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
+
removeFromQueueBatch(messages) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
const results = {
|
|
41
|
+
successful: [],
|
|
42
|
+
failed: [],
|
|
43
|
+
};
|
|
44
|
+
for (const message of messages) {
|
|
45
|
+
try {
|
|
46
|
+
const success = yield this.removeFromQueue(message);
|
|
47
|
+
if (success) {
|
|
48
|
+
results.successful.push({ id: message.id });
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
results.failed.push({ id: message.id, reason: 'not completed' });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
results.failed.push({
|
|
56
|
+
id: message.id,
|
|
57
|
+
reason: err instanceof Error ? err.message : 'Unknown error',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return results;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
38
64
|
getEventJSONsFromMessages(body) {
|
|
39
65
|
this.logger.warn("Method not implemented.");
|
|
40
66
|
return body;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisAdapter.js","sourceRoot":"","sources":["../../../adapters/queue/RedisAdapter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAoD;AAIpD,MAAa,YAAY;IAIvB,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;IACrC,CAAC;IAEK,WAAW,CAAC,IAAY;;YAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;IAEK,aAAa;;YACjB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACpC,OAAO,GAAG,IAAI,EAAE,CAAC;QACnB,CAAC;KAAA;IAEK,eAAe,CAAC,IAAyB;;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAClD,OAAO,MAAM,KAAK,WAAW,CAAC;QAChC,CAAC;KAAA;IAED,yBAAyB,CAAC,IAAW;QACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"RedisAdapter.js","sourceRoot":"","sources":["../../../adapters/queue/RedisAdapter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAoD;AAIpD,MAAa,YAAY;IAIvB,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;IACrC,CAAC;IAEK,WAAW,CAAC,IAAY;;YAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;IAEK,aAAa;;YACjB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACpC,OAAO,GAAG,IAAI,EAAE,CAAC;QACnB,CAAC;KAAA;IAEK,eAAe,CAAC,IAAyB;;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAClD,OAAO,MAAM,KAAK,WAAW,CAAC;QAChC,CAAC;KAAA;IAEK,oBAAoB,CAAC,QAA+B;;YACxD,MAAM,OAAO,GAAyC;gBACpD,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE,EAAE;aACX,CAAC;YAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC9B,IAAI;oBACF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;oBACpD,IAAI,OAAO,EAAE;wBACX,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;qBAC7C;yBAAM;wBACL,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;qBAClE;iBACF;gBAAC,OAAO,GAAG,EAAE;oBACZ,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;wBAClB,EAAE,EAAE,OAAO,CAAC,EAAE;wBACd,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;qBAC7D,CAAC,CAAC;iBACJ;aACF;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KAAA;IAED,yBAAyB,CAAC,IAAW;QACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAtDD,oCAsDC"}
|
|
@@ -18,5 +18,6 @@ export declare class SqsQueueAdapter implements AbstractQueueAdapter {
|
|
|
18
18
|
pushToQueue(event: Object): Promise<any>;
|
|
19
19
|
pullFromQueue(): Promise<any>;
|
|
20
20
|
removeFromQueue(queueMsg: Message): Promise<any>;
|
|
21
|
+
removeFromQueueBatch(messages: Message[]): Promise<any>;
|
|
21
22
|
getEventJSONsFromMessages(messages: Message[]): any[];
|
|
22
23
|
}
|
|
@@ -159,18 +159,18 @@ class SqsQueueAdapter {
|
|
|
159
159
|
try {
|
|
160
160
|
const sendMessageResult = yield this.client.send(sendMessageCommand);
|
|
161
161
|
const duration = Date.now() - startTime;
|
|
162
|
-
if (duration >
|
|
162
|
+
if (duration > 5000) {
|
|
163
163
|
const socketStats = this.getSocketStats();
|
|
164
|
-
this.logger.
|
|
164
|
+
this.logger.debug(`SQS message send took ${duration}ms (>5000ms threshold). Socket stats: ${JSON.stringify(socketStats)}`);
|
|
165
165
|
}
|
|
166
166
|
this.logger.debug(`Response from SQS: ${JSON.stringify(sendMessageResult)}`);
|
|
167
167
|
return sendMessageResult;
|
|
168
168
|
}
|
|
169
169
|
catch (err) {
|
|
170
170
|
const duration = Date.now() - startTime;
|
|
171
|
-
if (duration >
|
|
171
|
+
if (duration > 5000) {
|
|
172
172
|
const socketStats = this.getSocketStats();
|
|
173
|
-
this.logger.warn(`SQS message send failed after ${duration}ms (>
|
|
173
|
+
this.logger.warn(`SQS message send failed after ${duration}ms (>5000ms threshold). Socket stats: ${JSON.stringify(socketStats)}`);
|
|
174
174
|
}
|
|
175
175
|
this.logger.error(err);
|
|
176
176
|
return err;
|
|
@@ -245,6 +245,57 @@ class SqsQueueAdapter {
|
|
|
245
245
|
}
|
|
246
246
|
});
|
|
247
247
|
}
|
|
248
|
+
removeFromQueueBatch(messages) {
|
|
249
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
250
|
+
if (process.env.SQS_QUEUE_URL === 'undefined') {
|
|
251
|
+
return { message: 'SQS_QUEUE_URL is undefined' };
|
|
252
|
+
}
|
|
253
|
+
if (!messages || messages.length === 0) {
|
|
254
|
+
return { successful: [], failed: [] };
|
|
255
|
+
}
|
|
256
|
+
const results = {
|
|
257
|
+
successful: [],
|
|
258
|
+
failed: [],
|
|
259
|
+
};
|
|
260
|
+
// SQS allows max 10 messages per batch
|
|
261
|
+
const batchSize = 10;
|
|
262
|
+
for (let i = 0; i < messages.length; i += batchSize) {
|
|
263
|
+
const batch = messages.slice(i, i + batchSize);
|
|
264
|
+
const entries = batch.map((msg, index) => ({
|
|
265
|
+
Id: `${i + index}`,
|
|
266
|
+
ReceiptHandle: msg.ReceiptHandle,
|
|
267
|
+
}));
|
|
268
|
+
const params = {
|
|
269
|
+
QueueUrl: process.env.SQS_QUEUE_URL,
|
|
270
|
+
Entries: entries,
|
|
271
|
+
};
|
|
272
|
+
const deleteMessageBatchCommand = new client_sqs_1.DeleteMessageBatchCommand(params);
|
|
273
|
+
try {
|
|
274
|
+
const batchResult = yield this.client.send(deleteMessageBatchCommand);
|
|
275
|
+
this.logger.debug(`Batch delete response from SQS: ${JSON.stringify(batchResult)}`);
|
|
276
|
+
if (batchResult.Successful) {
|
|
277
|
+
results.successful.push(...batchResult.Successful);
|
|
278
|
+
}
|
|
279
|
+
if (batchResult.Failed) {
|
|
280
|
+
results.failed.push(...batchResult.Failed);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
this.logger.error(`Batch delete error: ${JSON.stringify(err)}`);
|
|
285
|
+
// Mark all messages in this batch as failed
|
|
286
|
+
entries.forEach((entry) => {
|
|
287
|
+
results.failed.push({
|
|
288
|
+
Id: entry.Id,
|
|
289
|
+
Code: 'BatchError',
|
|
290
|
+
Message: err instanceof Error ? err.message : 'Unknown error',
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
this.logger.debug(`Batch remove complete: ${results.successful.length} successful, ${results.failed.length} failed`);
|
|
296
|
+
return results;
|
|
297
|
+
});
|
|
298
|
+
}
|
|
248
299
|
getEventJSONsFromMessages(messages) {
|
|
249
300
|
return messages.map((item) => (item.Body ? JSON.parse(item.Body) : {}));
|
|
250
301
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqsQueueAdapter.js","sourceRoot":"","sources":["../../../adapters/queue/SqsQueueAdapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"SqsQueueAdapter.js","sourceRoot":"","sources":["../../../adapters/queue/SqsQueueAdapter.ts"],"names":[],"mappings":"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"}
|
package/build/types/queue.d.ts
CHANGED
|
@@ -11,5 +11,6 @@ export declare abstract class AbstractQueueAdapter {
|
|
|
11
11
|
abstract pushToQueue(body: Object): Promise<Object>;
|
|
12
12
|
abstract pullFromQueue(): Promise<Object>;
|
|
13
13
|
abstract removeFromQueue(body: Object): Promise<Object>;
|
|
14
|
+
abstract removeFromQueueBatch(messages: Object[]): Promise<Object>;
|
|
14
15
|
abstract getEventJSONsFromMessages(body: any[]): Object[];
|
|
15
16
|
}
|
package/build/types/queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../types/queue.ts"],"names":[],"mappings":";;;AASA,MAAsB,oBAAoB;
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../types/queue.ts"],"names":[],"mappings":";;;AASA,MAAsB,oBAAoB;CAQzC;AARD,oDAQC"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DeleteMessageCommand,
|
|
3
|
+
DeleteMessageBatchCommand,
|
|
3
4
|
Message,
|
|
4
5
|
ReceiveMessageCommand,
|
|
5
6
|
SendMessageCommand,
|
|
@@ -177,4 +178,91 @@ describe('SQS Queue Adapter', () => {
|
|
|
177
178
|
expect(readResult.toString()).toEqual(errMsg.Code);
|
|
178
179
|
expect(removeResult.toString()).toEqual(errMsg.Code);
|
|
179
180
|
});
|
|
181
|
+
|
|
182
|
+
it('should batch remove messages from queue', async () => {
|
|
183
|
+
const batchResp = {
|
|
184
|
+
Successful: [{ Id: '0' }, { Id: '1' }],
|
|
185
|
+
Failed: [],
|
|
186
|
+
};
|
|
187
|
+
sqsMock.on(DeleteMessageBatchCommand).resolves(batchResp);
|
|
188
|
+
const queueAdapter = new SqsQueueAdapter(Logger, { skipQueueExistsCheck: true });
|
|
189
|
+
const messages: Message[] = [
|
|
190
|
+
{
|
|
191
|
+
MessageId: 'msg-1',
|
|
192
|
+
ReceiptHandle: 'receipt-1',
|
|
193
|
+
Body: JSON.stringify({ event: 'loading' }),
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
MessageId: 'msg-2',
|
|
197
|
+
ReceiptHandle: 'receipt-2',
|
|
198
|
+
Body: JSON.stringify({ event: 'playing' }),
|
|
199
|
+
},
|
|
200
|
+
];
|
|
201
|
+
const result = await queueAdapter.removeFromQueueBatch(messages);
|
|
202
|
+
expect(result).toEqual({ successful: batchResp.Successful, failed: [] });
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('should handle empty messages array in batch remove', async () => {
|
|
206
|
+
const queueAdapter = new SqsQueueAdapter(Logger, { skipQueueExistsCheck: true });
|
|
207
|
+
const result = await queueAdapter.removeFromQueueBatch([]);
|
|
208
|
+
expect(result).toEqual({ successful: [], failed: [] });
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it('should not batch remove from queue if sqs queue env is not set', async () => {
|
|
212
|
+
process.env.SQS_QUEUE_URL = undefined;
|
|
213
|
+
const queueAdapter = new SqsQueueAdapter(Logger);
|
|
214
|
+
const messages: Message[] = [
|
|
215
|
+
{
|
|
216
|
+
MessageId: 'msg-1',
|
|
217
|
+
ReceiptHandle: 'receipt-1',
|
|
218
|
+
Body: JSON.stringify({ event: 'loading' }),
|
|
219
|
+
},
|
|
220
|
+
];
|
|
221
|
+
const result = await queueAdapter.removeFromQueueBatch(messages);
|
|
222
|
+
expect(result).toEqual({ message: 'SQS_QUEUE_URL is undefined' });
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it('should handle batch delete with more than 10 messages', async () => {
|
|
226
|
+
const batchResp = {
|
|
227
|
+
Successful: Array.from({ length: 10 }, (_, i) => ({ Id: `${i}` })),
|
|
228
|
+
Failed: [],
|
|
229
|
+
};
|
|
230
|
+
sqsMock.on(DeleteMessageBatchCommand).resolves(batchResp);
|
|
231
|
+
const queueAdapter = new SqsQueueAdapter(Logger, { skipQueueExistsCheck: true });
|
|
232
|
+
const messages: Message[] = Array.from({ length: 15 }, (_, i) => ({
|
|
233
|
+
MessageId: `msg-${i}`,
|
|
234
|
+
ReceiptHandle: `receipt-${i}`,
|
|
235
|
+
Body: JSON.stringify({ event: 'loading' }),
|
|
236
|
+
}));
|
|
237
|
+
const result: any = await queueAdapter.removeFromQueueBatch(messages);
|
|
238
|
+
// Should make 2 batch calls (10 + 5 messages)
|
|
239
|
+
expect(result.successful.length).toBe(20); // 10 from first batch + 10 from second mock response
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
it('should handle batch delete errors', async () => {
|
|
243
|
+
const errMsg: AwsError = {
|
|
244
|
+
Type: 'Sender',
|
|
245
|
+
Code: 'AWS.SimpleQueueService.NonExistentQueue',
|
|
246
|
+
name: 'AWS.SimpleQueueService.NonExistentQueue',
|
|
247
|
+
$fault: 'client',
|
|
248
|
+
$metadata: {
|
|
249
|
+
httpStatusCode: 400,
|
|
250
|
+
requestId: 'df840ab9-e68b-5c0e-b4a0-5094f2dfaee8',
|
|
251
|
+
attempts: 1,
|
|
252
|
+
totalRetryDelay: 0,
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
sqsMock.on(DeleteMessageBatchCommand).rejects(errMsg);
|
|
256
|
+
const queueAdapter = new SqsQueueAdapter(Logger, { skipQueueExistsCheck: true });
|
|
257
|
+
const messages: Message[] = [
|
|
258
|
+
{
|
|
259
|
+
MessageId: 'msg-1',
|
|
260
|
+
ReceiptHandle: 'receipt-1',
|
|
261
|
+
Body: JSON.stringify({ event: 'loading' }),
|
|
262
|
+
},
|
|
263
|
+
];
|
|
264
|
+
const result: any = await queueAdapter.removeFromQueueBatch(messages);
|
|
265
|
+
expect(result.failed.length).toBe(1);
|
|
266
|
+
expect(result.failed[0].Code).toBe('BatchError');
|
|
267
|
+
});
|
|
180
268
|
});
|
package/types/queue.ts
CHANGED
|
@@ -13,5 +13,6 @@ export abstract class AbstractQueueAdapter {
|
|
|
13
13
|
abstract pushToQueue(body: Object): Promise<Object>;
|
|
14
14
|
abstract pullFromQueue(): Promise<Object>;
|
|
15
15
|
abstract removeFromQueue(body: Object): Promise<Object>;
|
|
16
|
+
abstract removeFromQueueBatch(messages: Object[]): Promise<Object>;
|
|
16
17
|
abstract getEventJSONsFromMessages(body: any[]): Object[];
|
|
17
18
|
}
|