2
2
const { messages } = require ( 'elasticio-node' ) ;
3
3
const ObjectStorageWrapperExtended = require ( './utils-wrapper/ObjectStorageWrapperExtended' ) ;
4
4
5
+ let timeHandle ;
6
+ var groupList = [ ] ;
7
+ var groupElements = [ { groupSize : undefined , groupId : undefined , messageData :undefined } ] ;
8
+
9
+ async function timer ( this_ ) {
10
+ for ( var i = 1 ; i < groupElements . length ; i ++ ) {
11
+ await this_ . emit ( 'data' , messages . newMessageWithBody ( groupElements [ i ] ) )
12
+ }
13
+ }
14
+
5
15
async function processAction ( msg ) {
6
16
const storage = new ObjectStorageWrapperExtended ( this ) ;
7
17
const {
@@ -17,13 +27,18 @@ async function processAction(msg) {
17
27
messageData,
18
28
} ;
19
29
20
- if ( groupSize <= 0 ) {
21
- throw new Error ( 'Size must be a positive integer.' ) ;
22
- }
30
+ // in case no delay was defined
31
+ var delay = msg . body . timersec ? msg . body . timersec : '40000'
32
+ if ( delay >= 40000 ) { delay == 40000 }
33
+ clearTimeout ( timeHandle ) ;
34
+ timeHandle = setTimeout ( timer , delay , this ) ;
35
+
23
36
if ( ! messageData ) {
24
37
incomingData [ messageId ] = undefined ;
25
38
}
26
-
39
+ if ( groupSize <= 0 ) {
40
+ throw new Error ( 'Size must be a positive integer.' ) ;
41
+ }
27
42
const {
28
43
messageGroup,
29
44
messageGroupId,
@@ -53,19 +68,73 @@ async function processAction(msg) {
53
68
`Saw message ${ messageId } of group ${ groupId } .
54
69
Currently the group has ${ messagesNumberSeen } of ${ messageGroupSize } message(s).` ,
55
70
) ;
71
+ if ( messageGroupSize !== '' && messageGroupSize !== undefined ) {
72
+ clearTimeout ( timeHandle ) ;
73
+
74
+ if ( groupList . includes ( groupId ) ) {
75
+ parsedMessageGroup . messages . forEach ( ( message ) => {
76
+ incomingData [ message . messageId ] = message . messageData ;
77
+ } ) ;
78
+
79
+ for ( var key in groupElements ) {
80
+ if ( groupElements [ key ] . groupId === groupId ) {
81
+ groupElements [ key ] . groupSize == messagesNumberSeen
82
+ groupElements [ key ] . messageData == incomingData
83
+ }
84
+ }
85
+ }
86
+ else {
87
+ parsedMessageGroup . messages . forEach ( ( message ) => {
88
+ incomingData [ message . messageId ] = message . messageData ;
89
+ } ) ;
56
90
57
- if ( messagesNumberSeen >= messageGroupSize ) {
58
- parsedMessageGroup . messages . forEach ( ( message ) => {
59
- incomingData [ message . messageId ] = message . messageData ;
60
- } ) ;
91
+ groupList . push ( groupId )
92
+ groupElements . push ( { groupSize : messagesNumberSeen , groupId : groupId , messageData :incomingData } )
93
+
94
+ }
95
+ if ( messagesNumberSeen >= messageGroupSize ) {
96
+ parsedMessageGroup . messages . forEach ( ( message ) => {
97
+ incomingData [ message . messageId ] = message . messageData ;
98
+ } ) ;
99
+
100
+ await this . emit ( 'data' , messages . newMessageWithBody ( {
101
+ groupSize,
102
+ groupId,
103
+ messageData : incomingData ,
104
+ } ) ) ;
105
+ await storage . deleteObjectById ( messageGroupId ) ;
106
+ this . logger . info ( `Message group with id ${ messageGroupId } has been deleted` ) ;
107
+ groupList = groupList . filter ( def => def != groupId ) ;
108
+ groupElements = groupElements . filter ( def => def . groupId != groupId ) ;
109
+ }
110
+ else {
111
+ timeHandle = setTimeout ( timer , delay , this ) ;
112
+ }
113
+ }
114
+ else {
115
+ if ( groupList . includes ( groupId ) ) {
116
+
117
+ parsedMessageGroup . messages . forEach ( ( message ) => {
118
+ incomingData [ message . messageId ] = message . messageData ;
119
+ } ) ;
120
+
121
+ for ( var key in groupElements ) {
122
+ if ( groupElements [ key ] . groupId === groupId ) {
123
+ groupElements [ key ] . groupSize == messagesNumberSeen
124
+ groupElements [ key ] . messageData == incomingData
125
+ }
126
+ }
127
+ }
128
+ else {
129
+
130
+ parsedMessageGroup . messages . forEach ( ( message ) => {
131
+ incomingData [ message . messageId ] = message . messageData ;
132
+ } ) ;
61
133
62
- await this . emit ( 'data' , messages . newMessageWithBody ( {
63
- groupSize,
64
- groupId,
65
- messageData : incomingData ,
66
- } ) ) ;
67
- await storage . deleteObjectById ( messageGroupId ) ;
68
- this . logger . info ( `Message group with id ${ messageGroupId } has been deleted` ) ;
134
+ groupList . push ( groupId )
135
+ groupElements . push ( { groupSize : messagesNumberSeen , groupId : groupId , messageData :incomingData } )
136
+
137
+ }
69
138
}
70
139
}
71
140
0 commit comments