@tiledesk/tiledesk-server 2.3.5 → 2.3.7-1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. package/.github/workflows/docker-community-worker-push-latest.yml +23 -0
  2. package/.github/workflows/docker-image-tag-worker-community-tag-push.yml +22 -0
  3. package/CHANGELOG.md +361 -3
  4. package/Dockerfile-jobs +31 -0
  5. package/app.js +62 -69
  6. package/channels/chat21/chat21Handler.js +37 -6
  7. package/channels/chat21/chat21WebHook.js +52 -29
  8. package/channels/chat21/package-lock.json +663 -706
  9. package/channels/chat21/package.json +2 -2
  10. package/config/labels/widget.json +337 -136
  11. package/deploy.sh +2 -0
  12. package/event/messageEvent.js +110 -9
  13. package/jobs.js +80 -0
  14. package/jobsManager.js +47 -0
  15. package/middleware/has-role.js +10 -3
  16. package/middleware/ipFilter.js +220 -0
  17. package/middleware/passport.js +8 -2
  18. package/models/department.js +1 -1
  19. package/models/faq.js +77 -25
  20. package/models/faq_kb.js +19 -0
  21. package/models/message.js +10 -8
  22. package/models/project.js +10 -0
  23. package/models/project_user.js +10 -0
  24. package/models/request.js +12 -1
  25. package/package.json +12 -11
  26. package/pubmodules/activities/activityArchiver.js +216 -90
  27. package/pubmodules/activities/routes/activity.js +1 -1
  28. package/pubmodules/apps/index.js +8 -0
  29. package/pubmodules/apps/listener.js +27 -0
  30. package/pubmodules/cache/index.js +2 -0
  31. package/pubmodules/cache/mongoose-cachegoose-fn.js +630 -0
  32. package/pubmodules/canned/cannedResponse.js +4 -0
  33. package/pubmodules/canned/cannedResponseRoute.js +10 -5
  34. package/pubmodules/dialogflow/index.js +10 -0
  35. package/pubmodules/dialogflow/listener.js +66 -0
  36. package/pubmodules/emailNotification/requestNotification.js +58 -28
  37. package/pubmodules/events/eventRoute.js +49 -24
  38. package/pubmodules/messageTransformer/messageHandlebarsTransformerInterceptor.js +6 -1
  39. package/pubmodules/messageTransformer/messageTransformerInterceptor.js +10 -4
  40. package/pubmodules/pubModulesManager.js +173 -7
  41. package/pubmodules/queue/index.js +4 -0
  42. package/pubmodules/queue/reconnect.js +331 -0
  43. package/pubmodules/queue/reconnectFanout.js +256 -0
  44. package/pubmodules/rasa/listener.js +5 -5
  45. package/pubmodules/routing-queue/index.js +3 -0
  46. package/pubmodules/routing-queue/listener.js +328 -0
  47. package/pubmodules/rules/conciergeBot.js +4 -4
  48. package/pubmodules/scheduler/tasks/closeAgentUnresponsiveRequestTask.js +6 -1
  49. package/pubmodules/scheduler/tasks/closeBotUnresponsiveRequestTask.js +7 -1
  50. package/pubmodules/tilebot/index.js +11 -0
  51. package/pubmodules/tilebot/listener.js +85 -0
  52. package/pubmodules/trigger/rulesTrigger.js +137 -14
  53. package/pubmodules/trigger/start.js +5 -1
  54. package/pubmodules/whatsapp/index.js +7 -0
  55. package/pubmodules/whatsapp/listener.js +32 -0
  56. package/routes/auth.js +7 -2
  57. package/routes/campaigns.js +3 -3
  58. package/routes/department.js +3 -2
  59. package/routes/email.js +32 -2
  60. package/routes/faq.js +37 -2
  61. package/routes/faq_kb.js +496 -133
  62. package/routes/faqpub.js +5 -0
  63. package/routes/lead.js +56 -0
  64. package/routes/message.js +196 -14
  65. package/routes/messagesRoot.js +39 -0
  66. package/routes/project.js +76 -4
  67. package/routes/project_user.js +11 -1
  68. package/routes/project_user_test.js +19 -0
  69. package/routes/request.js +134 -30
  70. package/routes/troubleshooting.js +12 -0
  71. package/routes/users-util.js +39 -0
  72. package/routes/users.js +1 -1
  73. package/routes/widget.js +64 -2
  74. package/services/BotSubscriptionNotifier.js +5 -0
  75. package/services/banUserNotifier.js +86 -0
  76. package/services/cacheEnabler.js +56 -0
  77. package/services/chatbotService.js +101 -0
  78. package/services/departmentService.js +25 -3
  79. package/services/emailService.js +170 -28
  80. package/services/faqBotHandler.js +2 -3
  81. package/services/faqService.js +28 -3
  82. package/services/geoService.js +36 -6
  83. package/services/labelService.js +1 -1
  84. package/services/leadService.js +3 -2
  85. package/services/messageService.js +4 -2
  86. package/services/modulesManager.js +23 -76
  87. package/services/operatingHoursService.js +9 -4
  88. package/services/requestService.js +75 -39
  89. package/services/subscriptionNotifier.js +9 -4
  90. package/services/trainingService.js +106 -0
  91. package/template/email/assignedEmailMessage.html +21 -11
  92. package/template/email/assignedRequest.html +21 -11
  93. package/template/email/beenInvitedExistingUser.html +16 -6
  94. package/template/email/beenInvitedNewUser.html +16 -6
  95. package/template/email/emailDirect.html +130 -0
  96. package/template/email/newMessage.html +18 -8
  97. package/template/email/newMessageFollower.html +22 -12
  98. package/template/email/passwordChanged.html +15 -5
  99. package/template/email/pooledEmailMessage.html +21 -11
  100. package/template/email/pooledRequest.html +20 -10
  101. package/template/email/resetPassword.html +15 -5
  102. package/template/email/sendTranscript.html +7 -4
  103. package/template/email/ticket.html +17 -7
  104. package/template/email/verify.html +15 -5
  105. package/test/cannedRoute.js +157 -0
  106. package/test/chatbot-mock.js +127 -0
  107. package/test/example-json-intents.txt +1 -0
  108. package/test/example-json.txt +1 -0
  109. package/test/example.json +1 -0
  110. package/test/faqRoute.js +353 -208
  111. package/test/faqkbRoute.js +669 -64
  112. package/test/imageRoute.js +1 -1
  113. package/test/messageRoute.js +387 -5
  114. package/test/requestRoute.js +6 -6
  115. package/test/requestService.js +55 -4
  116. package/test-int/cache-project.js +90 -0
  117. package/test-int/cache-project_user.js +88 -0
  118. package/utils/UIDGenerator.js +20 -0
  119. package/utils/cacheUtil.js +2 -2
  120. package/utils/orgUtil.js +3 -3
  121. package/utils/promiseUtil.js +31 -0
  122. package/utils/recipientEmailUtil.js +66 -0
  123. package/utils/sendEmailUtil.js +34 -0
  124. package/utils/sendMessageUtil.js +1 -1
  125. package/utils/stringUtil.js +12 -0
  126. package/websocket/webSocketServer.js +33 -10
@@ -0,0 +1,88 @@
1
+
2
+ process.env.NODE_ENV = 'test';
3
+
4
+
5
+ //Require the dev-dependencies
6
+ let chai = require('chai');
7
+ let chaiHttp = require('chai-http');
8
+ let server = require('../app');
9
+ var projectService = require('../services/projectService');
10
+ var userService = require('../services/userService');
11
+ let should = chai.should();
12
+ var Project_user = require("../models/project_user");
13
+
14
+ var expect = chai.expect;
15
+ var assert = chai.assert;
16
+
17
+ //server client
18
+ var express = require('express');
19
+ const bodyParser = require('body-parser');
20
+
21
+ //end server client
22
+
23
+ chai.use(chaiHttp);
24
+
25
+ describe('Cache', () => {
26
+
27
+ if (process.env.CACHE_ENABLED == "true") {
28
+
29
+ }else {
30
+ console.log("Cache disabled");
31
+ expect(true).to.equal(false);
32
+ }
33
+
34
+ describe('/project_user', () => {
35
+
36
+
37
+ // mocha test-int/bot.js --grep 'createSimpleExatMatch'
38
+ it('getCurrentProjectUser', (done) => {
39
+
40
+ var email = "test-bot-" + Date.now() + "@email.com";
41
+ var pwd = "pwd";
42
+
43
+
44
+
45
+ userService.signup( email ,pwd, "Test Firstname", "Test lastname").then(function(savedUser) {
46
+ projectService.create("test-getCurrentProjectUser", savedUser._id).then(function(savedProject) {
47
+
48
+ chai.request(server)
49
+ .get('/'+ savedProject._id + '/project_users_test/test')
50
+ .auth(email, pwd)
51
+ .set('content-type', 'application/json')
52
+ .send()
53
+ .end((err, res) => {
54
+ console.log("res.body", JSON.stringify(res.body));
55
+ // console.dir("res.body 1", res.body);
56
+ console.log("res.headers", res.headers);
57
+ res.should.have.status(200);
58
+ res.body.should.be.a('object');
59
+ expect(res.body.role).to.equal("owner");
60
+ expect(res.body.isAuthenticated).to.equal(true);
61
+ expect(res.body.id_project).to.equal(savedProject._id.toString());
62
+
63
+
64
+ chai.request(server)
65
+ .get('/'+ savedProject._id + '/project_users_test/test')
66
+ .auth(email, pwd)
67
+ .set('content-type', 'application/json') //from cache
68
+ .send()
69
+ .end((err, res) => {
70
+ console.log("res.body", JSON.stringify(res.body));
71
+ // console.dir("res.body 1", res.body);
72
+ console.log("res.headers", res.headers);
73
+ res.should.have.status(200);
74
+ res.body.should.be.a('object');
75
+ expect(res.body.role).to.equal("owner");
76
+ expect(res.body.isAuthenticated).to.equal(true);
77
+ expect(res.body.id_project).to.equal(savedProject._id.toString());
78
+
79
+ done()
80
+ });
81
+ });
82
+ });
83
+ });
84
+
85
+ });
86
+ });
87
+
88
+ });
@@ -0,0 +1,20 @@
1
+ let stringUtil = require("../utils/stringUtil");
2
+ const uuidv4 = require('uuid/v4');
3
+
4
+ class UIDGenerator {
5
+
6
+ generate() {
7
+ let uid = uuidv4();
8
+ // console.log("uid",uid);
9
+ let uidWithoutChar = stringUtil.replaceAll(uid, "-", "");
10
+ // console.log("uidWithoutChar",uidWithoutChar);
11
+ return uidWithoutChar;
12
+ }
13
+ }
14
+
15
+ var uidGenerator = new UIDGenerator();
16
+
17
+ module.exports = uidGenerator;
18
+
19
+
20
+
@@ -1,6 +1,6 @@
1
1
  module.exports = {
2
- defaultTTL: Number(process.env.CACHE_DEFAULT_TTL) || 120,
2
+ defaultTTL: Number(process.env.CACHE_DEFAULT_TTL) || 300, //5 minutes
3
3
  queryTTL: Number(process.env.CACHE_QUERY_TTL) || 30,
4
- longTTL: Number(process.env.CACHE_LONG_TTL) || 1200,
4
+ longTTL: Number(process.env.CACHE_LONG_TTL) || 3600, //1 hour
5
5
  };
6
6
 
package/utils/orgUtil.js CHANGED
@@ -36,10 +36,10 @@ class OrgUtil {
36
36
  // winston.info("host: "+ host );
37
37
 
38
38
  let origin = req.get('origin');
39
- winston.info("origin: "+ origin );
39
+ winston.debug("origin: "+ origin );
40
40
 
41
41
  // winston.info("email: " + email.baseUrl);
42
- winston.info("this.ORGANIZATION_BASE_URL: " + this.ORGANIZATION_BASE_URL);
42
+ winston.debug("this.ORGANIZATION_BASE_URL: " + this.ORGANIZATION_BASE_URL);
43
43
  // global.organizationBaseUrl
44
44
  // if (host !=email.baseUrl ) {
45
45
  if (origin && origin.indexOf(this.ORGANIZATION_BASE_URL)>-1) {
@@ -49,7 +49,7 @@ class OrgUtil {
49
49
  winston.info("origin found: "+ origin );
50
50
  return origin;
51
51
  }
52
- winston.info("origin not found: "+ origin );
52
+ winston.debug("origin not found: "+ origin );
53
53
 
54
54
  // winston.info("host not found: "+ host );
55
55
  // if (host.indexOf("localhost1")>-1) {
@@ -0,0 +1,31 @@
1
+ class PromiseUtil {
2
+
3
+ async doAllSequentually(promises) {
4
+ // return new Promise(async function (resolve, reject) {
5
+ // console.log("promises",promises);
6
+ var values = [];
7
+ for (let i=0; i < promises.length; i++) {
8
+ // console.log("promises[i]",promises[i]);
9
+
10
+ // const val = await
11
+ var value = await promises[i]
12
+ // .then(function(value) {
13
+ // console.log("done promises[i]",value);
14
+ // values.push(value);
15
+ // console.log("values before",values);
16
+ // });
17
+ values.push(value);
18
+ };
19
+
20
+ console.log("values",values);
21
+ // return resolve(values);
22
+
23
+ // });
24
+ return values;
25
+ }
26
+ }
27
+
28
+ var promiseUtil = new PromiseUtil();
29
+
30
+
31
+ module.exports = promiseUtil;
@@ -0,0 +1,66 @@
1
+ var Project_user = require("../models/project_user");
2
+ var Group = require("../models/group");
3
+ var RoleConstants = require("../models/roleConstants");
4
+
5
+
6
+ class RecipientEmailUtil {
7
+
8
+ iterateProjectUser(project_users) {
9
+ let arr = [];
10
+ if (project_users && project_users.length>0) {
11
+ project_users.forEach(project_user => {
12
+ if (project_user.id_user && project_user.id_user.email) {
13
+ // tonew = tonew + project_user.id_user.email + ", ";
14
+ arr.push(project_user.id_user.email)
15
+ }
16
+ });
17
+ }
18
+ return arr;
19
+ }
20
+
21
+ async process(to, projectid) {
22
+
23
+ if (to.startsWith('@')) { //mention
24
+ // console.log("startsWith", to);
25
+
26
+ let project_users = await Project_user.find({ id_project: projectid, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN]}, status: "active"} ).populate('id_user').exec();
27
+
28
+ let tonewArr = this.iterateProjectUser(project_users);
29
+
30
+ let tonew = tonewArr.toString();
31
+ // console.log("tonew mention", tonew);
32
+ return tonew;
33
+
34
+
35
+
36
+ }
37
+ if (to.indexOf('@')==-1) { //group
38
+ // console.log("indexOf-1", to);
39
+ let tonewArr = []
40
+ let group = await Group.findOne({name: to, id_project: projectid}).exec();
41
+ if (group) {
42
+ // console.log("group", group);
43
+ let project_users = await Project_user.find({ id_project: projectid, id_user: { $in : group.members}, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]}, status: "active" }).populate('id_user').exec();
44
+ // console.log("project_users", project_users);
45
+ tonewArr = this.iterateProjectUser(project_users);
46
+ }
47
+ let tonew = tonewArr.toString();
48
+ // console.log("tonew group", tonew);
49
+ return tonew;
50
+
51
+ }
52
+ // console.log("to.indexOf('@')",to.indexOf('@'));
53
+ if (to.indexOf('@')>0) { //standard email
54
+ // console.log("indexOf>0", to);
55
+ // console.log("tonew standard", to);
56
+
57
+ return to;
58
+ }
59
+
60
+ }
61
+ }
62
+
63
+ var recipientEmailUtil = new RecipientEmailUtil();
64
+
65
+
66
+ module.exports = recipientEmailUtil;
@@ -0,0 +1,34 @@
1
+ var winston = require('../config/winston');
2
+ const emailService = require("../services/emailService");
3
+ const Project = require("../models/project");
4
+ var handlebars = require('handlebars');
5
+
6
+ class SendEmailUtil {
7
+ async sendEmailDirect(to, text, id_project, recipient, subject, message) {
8
+
9
+ let project = await Project.findById(id_project);
10
+ winston.debug("project", project);
11
+
12
+ winston.debug("text: " + text);
13
+ winston.debug("recipient:"+ recipient);
14
+ winston.debug("to:" + to);
15
+
16
+ var template = handlebars.compile(text);
17
+
18
+ var replacements = {
19
+ message: message,
20
+ };
21
+
22
+ var finaltext = template(replacements);
23
+ winston.debug("finaltext:" + finaltext);
24
+
25
+
26
+ // sendEmailDirect(to, text, project, request_id, subject, tokenQueryString, sourcePage) {
27
+ emailService.sendEmailDirect(to, finaltext, project, recipient, subject, undefined, undefined);
28
+ // emailService.sendEmailDirect(to, text, project, recipient, subject, undefined, undefined);
29
+ }
30
+ }
31
+
32
+ var sendEmailUtil = new SendEmailUtil();
33
+
34
+ module.exports = sendEmailUtil;
@@ -30,7 +30,7 @@ async send(sender, senderFullname, recipient, text, id_project, createdBy, attri
30
30
  } else {
31
31
  winston.debug("user id: "+sender);
32
32
  var user = await User.findById(sender)
33
- //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:id:"+sender)
33
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:id:"+sender) //user_cache
34
34
  .exec()
35
35
  winston.debug("user", user);
36
36
  senderFullname = user.fullName;
@@ -0,0 +1,12 @@
1
+
2
+ class StringUtil {
3
+
4
+ replaceAll(string, characterToReplace, replacement) {
5
+ return string.split(characterToReplace).join(replacement);
6
+ }
7
+ }
8
+
9
+ var stringUtil = new StringUtil();
10
+
11
+ module.exports = stringUtil;
12
+
@@ -23,7 +23,7 @@ var mongoose = require('mongoose');
23
23
  const requestConstants = require("../models/requestConstants");
24
24
  var RoleConstants = require('../models/roleConstants');
25
25
  let configSecret = process.env.GLOBAL_SECRET || config.secret;
26
-
26
+ var cacheEnabler = require("../services/cacheEnabler");
27
27
 
28
28
 
29
29
  var lastRequestsLimit = process.env.WS_HISTORY_REQUESTS_LIMIT || 100;
@@ -93,7 +93,7 @@ class WebSocketServer {
93
93
  // winston.debug('ok websocket');
94
94
 
95
95
  User.findOne({_id: identifier, status: 100}, 'email firstname lastname emailverified id')
96
- //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:id:"+identifier)
96
+ //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "users:id:"+identifier) //user_cache
97
97
  .exec(function (err, user) {
98
98
 
99
99
 
@@ -169,15 +169,30 @@ class WebSocketServer {
169
169
 
170
170
  winston.debug(' req.user._id: '+ req.user);
171
171
 
172
+ if (!topic) {
173
+ winston.error('WebSocket - Error getting topic. Topic can t be null');
174
+ return reject('WebSocket - Error getting topic. Topic can t be null');
175
+ }
172
176
  var urlSub = topic.split('/');
173
177
 
178
+ if (!urlSub || (urlSub && urlSub.length==0)) {
179
+ winston.error('WebSocket - Error getting topic. Topic is not properly configured');
180
+ return reject('WebSocket - Error getting topic. Topic is not properly configured');
181
+ }
182
+ // Error getting Project Cast to ObjectId failed for value "N7VJlLZ1" (type string) at path "_id" for model "project" {"kind":"ObjectId","path":"_id","reason":{},"stack":"CastError: Cast to ObjectId failed for value \"N7VJlLZ1\" (type string) at path \"_id\" for model \"project\"\n at model.Query.exec (/usr/src/app/node_modules/mongoose/lib/query.js:4498:21)\n at /usr/src/app/websocket/webSocketServer.js:180:14\n at new Promise (<anonymous>)\n at Object.onSubscribeCallback [as onSubscribe] (/usr/src/app/websocket/webSocketServer.js:167:14)\n at PubSub.handleReceivedClientMessage (/usr/src/app/websocket/pubsub.js:358:57)\n at runMicrotasks (<anonymous>)\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","stringValue":"\"N7VJlLZ1\"","value":"N7VJlLZ1","valueType":"string"}
183
+
174
184
  var projectId = urlSub[1];
175
185
  winston.debug('projectId: '+projectId);
176
186
 
177
187
 
178
- return Project.findOne({ _id: projectId, status: 100})
179
- //@DISABLED_CACHE .cache(cacheUtil.defaultTTL, "projects:id:"+projectId)
180
- .exec(function(err, project) {
188
+ let q = Project.findOne({ _id: projectId, status: 100})
189
+
190
+ if (cacheEnabler.project) {
191
+ q.cache(cacheUtil.defaultTTL, "projects:id:"+projectId) //project_cache
192
+ winston.debug('project cache enabled');
193
+ }
194
+
195
+ return q.exec(function(err, project) {
181
196
  if (err) {
182
197
  winston.error('WebSocket - Error getting Project', err);
183
198
  return reject(err);
@@ -590,11 +605,12 @@ class WebSocketServer {
590
605
  winston.debug('messageCreateKey: ' + messageCreateKey);
591
606
 
592
607
  messageEvent.on(messageCreateKey, function (message) {
608
+ setImmediate(async () => {
593
609
  winston.debug('messageEvent websocket server: '+messageCreateKey, message);
594
610
  if (message.request) {
595
611
  pubSubServer.handlePublishMessage ('/'+message.id_project+'/requests/'+message.request.request_id+'/messages', message, undefined, true, "CREATE");
596
612
  }
597
-
613
+ });
598
614
  });
599
615
 
600
616
  // var reconnect = require('./reconnect');
@@ -604,7 +620,8 @@ class WebSocketServer {
604
620
  }
605
621
  winston.debug('requestCreateKey: ' + requestCreateKey);
606
622
  requestEvent.on(requestCreateKey, async function (request) {
607
- // TODO setImmediate(() => {
623
+ setImmediate(async () => {
624
+
608
625
  winston.debug('requestEvent websocket server: '+requestCreateKey, request);
609
626
  // TODO scarta riquesta se agente (req.user._id) non sta ne in participants ne in agents
610
627
 
@@ -643,7 +660,7 @@ class WebSocketServer {
643
660
  pubSubServer.handlePublishMessage ('/'+request.id_project+'/requests', request, undefined, true, "CREATE");
644
661
  pubSubServer.handlePublishMessage ('/'+request.id_project+'/requests/'+request.request_id, request, undefined, true, "CREATE");
645
662
  }
646
-
663
+ });
647
664
  });
648
665
 
649
666
  var requestUpdateKey = 'request.update';
@@ -653,6 +670,8 @@ class WebSocketServer {
653
670
 
654
671
  winston.debug('requestUpdateKey: ' + requestUpdateKey);
655
672
  requestEvent.on(requestUpdateKey, async function(request) {
673
+ setImmediate(async () => {
674
+
656
675
  // TODO setImmediate(() => {
657
676
  winston.debug('requestEvent websocket server: '+requestUpdateKey, request);
658
677
  if (request.preflight===false && request.status > requestConstants.TEMP) {
@@ -694,7 +713,7 @@ class WebSocketServer {
694
713
  pubSubServer.handlePublishMessage ('/'+request.id_project+'/requests', requestJSON, undefined, true, "UPDATE");
695
714
  pubSubServer.handlePublishMessage ('/'+request.id_project+'/requests/'+request.request_id, requestJSON, undefined, true, "UPDATE");
696
715
  }
697
-
716
+ });
698
717
  });
699
718
 
700
719
 
@@ -709,6 +728,8 @@ class WebSocketServer {
709
728
  }
710
729
  winston.debug('projectuserUpdateKey: ' + projectuserUpdateKey);
711
730
  authEvent.on(projectuserUpdateKey,function(data) {
731
+ setImmediate(async () => {
732
+
712
733
  var pu = data.updatedProject_userPopulated;
713
734
  winston.debug('ws pu', pu);
714
735
 
@@ -724,7 +745,7 @@ class WebSocketServer {
724
745
  }
725
746
  winston.debug('userId:'+ userId);
726
747
  pubSubServer.handlePublishMessage ('/'+pu.id_project+'/project_users/users/'+userId, pu, undefined, true, "UPDATE");
727
-
748
+ });
728
749
  });
729
750
 
730
751
 
@@ -735,6 +756,7 @@ class WebSocketServer {
735
756
  }
736
757
  winston.debug('eventEmitKey: ' + eventEmitKey);
737
758
  eventEvent.on(eventEmitKey,function(event) {
759
+ setImmediate(async () => {
738
760
  winston.debug('event', event);
739
761
  if (event.project_user === undefined) {
740
762
  //with "faqbot.answer_not_found" project_user is undefined but it's ok
@@ -743,6 +765,7 @@ class WebSocketServer {
743
765
  }
744
766
  pubSubServer.handlePublishMessage ('/'+event.id_project+'/events/'+event.project_user._id, event, undefined, true, "CREATE");
745
767
  });
768
+ });
746
769
 
747
770
 
748
771
  // https://github.com/websockets/ws/blob/master/examples/express-session-parse/index.js