Skip to content

Commit 097ab87

Browse files
authored
Fixed a timer issue (#99)
1 parent 73d0341 commit 097ab87

File tree

13 files changed

+776
-840
lines changed

13 files changed

+776
-840
lines changed

.circleci/config.yml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ version: 2.1
22
parameters:
33
node-version:
44
type: string
5-
default: "16.13.2"
5+
default: "18.13.0"
66
orbs:
77
node: circleci/[email protected]
88
slack: circleci/[email protected]
@@ -72,23 +72,23 @@ commands:
7272
jobs:
7373
test:
7474
docker:
75-
- image: circleci/node:16-stretch
75+
- image: cimg/node:18.13.0
7676
steps:
7777
- checkout
7878
- node/install:
7979
node-version: << pipeline.parameters.node-version >>
80-
- run:
81-
name: Audit Dependencies
82-
command: npm audit --production --audit-level=high
8380
- node/install-packages:
8481
cache-path: ./node_modules
8582
override-ci-command: npm install
83+
- run:
84+
name: Audit Dependencies
85+
command: npm run audit
8686
- run:
8787
name: Running Mocha Tests
8888
command: npm test
8989
build:
9090
docker:
91-
- image: circleci/node:16-stretch
91+
- image: cimg/node:18.13.0
9292
user: root
9393
steps:
9494
- checkout
@@ -118,8 +118,10 @@ workflows:
118118
jobs:
119119
- build:
120120
name: "Build and publish docker image"
121+
context:
122+
- componentspusher
121123
filters:
122124
branches:
123125
ignore: /.*/
124126
tags:
125-
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
127+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/

.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ELASTICIO_OBJECT_STORAGE_TOKEN=token
2+
ELASTICIO_OBJECT_STORAGE_URI=http://127.0.0.1:3002

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@ build/Release
2727
node_modules
2828

2929
.idea
30+
.env

.grype-ignore.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
ignore:
2+
- vulnerability: CVE-2022-3996
3+
package:
4+
name: libssl3
5+
version: 3.0.7-r0
6+
7+
- vulnerability: CVE-2022-3996
8+
package:
9+
name: libcrypto3
10+
version: 3.0.7-r0

.nsprc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"GHSA-27h2-hvpr-p74q": {
3+
"active": true,
4+
"notes": "We don't use verify function from jsonwebtoken, so not affected"
5+
}
6+
}

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 1.4.4 (March 28, 2023)
2+
* Fix [issue](https://github.com/elasticio/splitter-component/issues/97) with timer
3+
14
## 1.4.3 (November 04, 2022)
25
* Update Sailor version to 2.7.1
36

component.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"title": "Splitter",
33
"description": "Splits a message into multiple messages.",
4-
"version": "1.4.3",
4+
"version": "1.4.4",
55
"actions": {
66
"split": {
77
"deprecated": true,

lib/actions/reassemble.js

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,28 @@ const { messages } = require('elasticio-node');
33
const { v4: uuidv4 } = require('uuid');
44
const ObjectStorageWrapperExtended = require('./utils-wrapper/ObjectStorageWrapperExtended');
55

6-
let timeHandle;
7-
let groupList = [];
6+
const groupList = {};
87
let delay;
98

10-
async function timer(this_) {
11-
for (let i = 0; i < groupList.length; i += 1) {
9+
async function timer(this_, groupId) {
10+
try {
1211
const storage = new ObjectStorageWrapperExtended(this_);
13-
// eslint-disable-next-line no-await-in-loop
14-
const results = await storage.lookupObjectById(groupList[i]);
12+
const results = await storage.lookupObjectById(groupId);
1513
const incomingData = {};
1614
results.messages.forEach((message) => {
1715
incomingData[message.messageId] = message.messageData;
1816
});
19-
20-
// eslint-disable-next-line no-await-in-loop
2117
await this_.emit('data', messages.newMessageWithBody({
2218
groupSize: Object.keys(results.messageIdsSeen).length,
2319
groupId: results.messages[0].groupId,
2420
messageData: incomingData,
2521
}));
26-
// eslint-disable-next-line no-await-in-loop
27-
await storage.deleteObjectById(groupList[i]);
22+
await storage.deleteObjectById(groupId);
23+
delete groupList[groupId];
24+
} catch (e) {
25+
this_.emit('error', e.message);
26+
this_.logger.error(e);
2827
}
29-
groupList = [];
3028
}
3129

3230
async function processAction(msg, cfg) {
@@ -65,23 +63,17 @@ async function processAction(msg, cfg) {
6563
messageGroupSize,
6664
isCreated,
6765
} = await storage.createMessageGroupIfNotExists(groupId, groupSize);
66+
await storage.createNewObjectInMessageGroup(object, messageGroupId);
6867

6968
if (isCreated) {
70-
await storage.createNewObjectInMessageGroup(object, messageGroupId);
7169
this.logger.info('New Group created. Added message');
7270
}
7371
if (!isCreated) {
74-
await storage.createNewObjectInMessageGroup(object, messageGroupId);
7572
this.logger.info('Existed Group found. Added message');
7673
this.logger.info(`Saved messages: ${Object.keys(messageGroup.messageIdsSeen).join(', ')}`);
7774
}
78-
const parsedMessageGroup = await storage.lookupObjectById(messageGroupId);
79-
const filteredMessages = parsedMessageGroup.messages
80-
.filter((message) => message.messageId !== messageId);
81-
filteredMessages.push(object);
82-
parsedMessageGroup.messages = filteredMessages;
83-
await storage.updateObjectById(messageGroupId, parsedMessageGroup);
84-
const messagesNumberSeen = Object.keys(parsedMessageGroup.messageIdsSeen).length;
75+
const updatedMessageGroup = await storage.lookupObjectById(messageGroupId);
76+
const messagesNumberSeen = Object.keys(updatedMessageGroup.messageIdsSeen).length;
8577

8678
this.logger.info(
8779
`Saw message ${messageId} of group ${groupId}.
@@ -90,7 +82,7 @@ async function processAction(msg, cfg) {
9082
// when groupSized option is selected
9183
if (mode === 'groupSize') {
9284
if (messagesNumberSeen >= messageGroupSize) {
93-
parsedMessageGroup.messages.forEach((message) => {
85+
updatedMessageGroup.messages.forEach((message) => {
9486
incomingData[message.messageId] = message.messageData;
9587
});
9688
await this.emit('data', messages.newMessageWithBody({
@@ -106,25 +98,30 @@ async function processAction(msg, cfg) {
10698
// When delay timer option is selected
10799
if (mode === 'timeout') {
108100
delay = (timersec >= 20000) ? 20000 : timersec;
109-
clearTimeout(timeHandle);
110-
timeHandle = setTimeout(timer, delay, this);
111-
if (!groupList.includes(messageGroupId)) {
112-
groupList.push(messageGroupId);
101+
if (!groupList[messageGroupId]) {
102+
groupList[messageGroupId] = {};
103+
}
104+
const group = groupList[messageGroupId];
105+
if (group.timeoutId) {
106+
clearTimeout(group.timeoutId);
113107
}
108+
group.timeoutId = setTimeout(timer, delay, this, messageGroupId);
114109
}
115110

116111
// When both groupSize and delay timer option is selected
117112
if (mode === 'groupSize&timeout') {
118113
delay = (timersec >= 20000) ? 20000 : timersec;
119-
clearTimeout(timeHandle);
120-
timeHandle = setTimeout(timer, delay, this);
121-
122-
if (!groupList.includes(messageGroupId)) {
123-
groupList.push(messageGroupId);
114+
if (!groupList[messageGroupId]) {
115+
groupList[messageGroupId] = {};
124116
}
117+
const group = groupList[messageGroupId];
118+
if (group.timeoutId) {
119+
clearTimeout(group.timeoutId);
120+
}
121+
group.timeoutId = setTimeout(timer, delay, this, messageGroupId);
125122

126123
if (messagesNumberSeen >= messageGroupSize) {
127-
parsedMessageGroup.messages.forEach((message) => {
124+
updatedMessageGroup.messages.forEach((message) => {
128125
incomingData[message.messageId] = message.messageData;
129126
});
130127

@@ -133,9 +130,12 @@ async function processAction(msg, cfg) {
133130
groupId,
134131
messageData: incomingData,
135132
}));
136-
await storage.deleteObjectById(messageGroupId);
137-
this.logger.info(`Message group with id ${messageGroupId} has been deleted`);
138-
groupList = groupList.filter((def) => def !== messageGroupId);
133+
if (groupList[messageGroupId]) {
134+
clearTimeout(groupList[messageGroupId].timeoutId);
135+
await storage.deleteObjectById(messageGroupId);
136+
delete groupList[messageGroupId];
137+
this.logger.info(`Message group with id ${messageGroupId} has been deleted`);
138+
}
139139
}
140140
}
141141
}

0 commit comments

Comments
 (0)