@tiledesk/tiledesk-server 2.3.6 → 2.3.7-1.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.
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 +62 -34
  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 +2 -2
  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