@botfabrik/engine-webclient 4.0.0-alpha.0

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 (77) hide show
  1. package/README.md +169 -0
  2. package/dist/client/asset-manifest.json +22 -0
  3. package/dist/client/bot.png +0 -0
  4. package/dist/client/bot.svg +1 -0
  5. package/dist/client/custom.css +4 -0
  6. package/dist/client/favicon.ico +0 -0
  7. package/dist/client/index.html +1 -0
  8. package/dist/client/logo192.png +0 -0
  9. package/dist/client/logo512.png +0 -0
  10. package/dist/client/manifest.json +25 -0
  11. package/dist/client/play-button.png +0 -0
  12. package/dist/client/precache-manifest.18268e8ddbe40ae5d8e91a4a76774701.js +26 -0
  13. package/dist/client/robots.txt +3 -0
  14. package/dist/client/service-worker.js +39 -0
  15. package/dist/client/static/css/main.9f09e476.chunk.css +2 -0
  16. package/dist/client/static/css/main.9f09e476.chunk.css.map +1 -0
  17. package/dist/client/static/js/2.94d39000.chunk.js +3 -0
  18. package/dist/client/static/js/2.94d39000.chunk.js.LICENSE.txt +103 -0
  19. package/dist/client/static/js/2.94d39000.chunk.js.map +1 -0
  20. package/dist/client/static/js/main.1f8d6c7f.chunk.js +2 -0
  21. package/dist/client/static/js/main.1f8d6c7f.chunk.js.map +1 -0
  22. package/dist/client/static/js/runtime-main.f63e6028.js +2 -0
  23. package/dist/client/static/js/runtime-main.f63e6028.js.map +1 -0
  24. package/dist/client/visitor.png +0 -0
  25. package/dist/client/visitor.svg +1 -0
  26. package/dist/createSessionInfo.d.ts +5 -0
  27. package/dist/createSessionInfo.js +36 -0
  28. package/dist/createSessionInfo.js.map +1 -0
  29. package/dist/createSessionInfo.test.d.ts +1 -0
  30. package/dist/createSessionInfo.test.js +88 -0
  31. package/dist/createSessionInfo.test.js.map +1 -0
  32. package/dist/extractIP.d.ts +2 -0
  33. package/dist/extractIP.js +11 -0
  34. package/dist/extractIP.js.map +1 -0
  35. package/dist/extractIP.test.d.ts +1 -0
  36. package/dist/extractIP.test.js +38 -0
  37. package/dist/extractIP.test.js.map +1 -0
  38. package/dist/extractLocale.d.ts +2 -0
  39. package/dist/extractLocale.js +20 -0
  40. package/dist/extractLocale.js.map +1 -0
  41. package/dist/extractLocale.test.d.ts +1 -0
  42. package/dist/extractLocale.test.js +22 -0
  43. package/dist/extractLocale.test.js.map +1 -0
  44. package/dist/getSupportedClientLocale.d.ts +2 -0
  45. package/dist/getSupportedClientLocale.js +19 -0
  46. package/dist/getSupportedClientLocale.js.map +1 -0
  47. package/dist/getSupportedClientLocale.test.d.ts +1 -0
  48. package/dist/getSupportedClientLocale.test.js +20 -0
  49. package/dist/getSupportedClientLocale.test.js.map +1 -0
  50. package/dist/index.d.ts +14 -0
  51. package/dist/index.js +105 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/index.test.d.ts +1 -0
  54. package/dist/index.test.js +16 -0
  55. package/dist/index.test.js.map +1 -0
  56. package/dist/loadPreviousConversation.d.ts +3 -0
  57. package/dist/loadPreviousConversation.js +27 -0
  58. package/dist/loadPreviousConversation.js.map +1 -0
  59. package/dist/middleware/index.d.ts +3 -0
  60. package/dist/middleware/index.js +32 -0
  61. package/dist/middleware/index.js.map +1 -0
  62. package/dist/requestSessionData.d.ts +10 -0
  63. package/dist/requestSessionData.js +40 -0
  64. package/dist/requestSessionData.js.map +1 -0
  65. package/dist/requestSessionData.test.d.ts +1 -0
  66. package/dist/requestSessionData.test.js +83 -0
  67. package/dist/requestSessionData.test.js.map +1 -0
  68. package/dist/speechToText.d.ts +7 -0
  69. package/dist/speechToText.js +46 -0
  70. package/dist/speechToText.js.map +1 -0
  71. package/dist/types.d.ts +7 -0
  72. package/dist/types.js +3 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/views/index.d.ts +2 -0
  75. package/dist/views/index.js +102 -0
  76. package/dist/views/index.js.map +1 -0
  77. package/package.json +36 -0
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const createSessionInfo_1 = require("./createSessionInfo");
4
+ describe('create session info', () => {
5
+ const querystrings = {
6
+ sessionId: 'session-id',
7
+ userId: 'user-id',
8
+ };
9
+ const headers = {
10
+ host: 'fluance-chatbot.scapp.io',
11
+ 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
12
+ accept: '*/*',
13
+ 'accept-encoding': 'gzip, deflate, br',
14
+ 'accept-language': 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7',
15
+ cookie: {
16
+ 'bf-webclient-userId': 'user-i',
17
+ io: 'QFQ5hLWMe2nNc5cXAAAE',
18
+ },
19
+ referer: 'https://fluance-chatbot.scapp.io/webclient/?companyId=2&myunit=ONCO%201&opale=4&polypoint=9',
20
+ 'x-forwarded-for': '151.248.213.117, 151.248.213.117',
21
+ connection: 'close',
22
+ };
23
+ const socket = {
24
+ request: {
25
+ headers,
26
+ },
27
+ handshake: {
28
+ query: querystrings,
29
+ },
30
+ };
31
+ const defaultSessionInfo = {
32
+ client: { name: 'my-client', type: 'webclient', payload: { headers: '', querystrings: '', ip: '' } },
33
+ user: { id: 'my-user-id', displayName: 'my user', payload: {} },
34
+ contexts: [],
35
+ };
36
+ it('without user payload', async () => {
37
+ const sessionInfo = await createSessionInfo_1.default(socket, 'my-client', defaultSessionInfo, {})();
38
+ // client
39
+ expect(sessionInfo.client.name).toBe('my-client');
40
+ expect(sessionInfo.client.type).toBe('webclient');
41
+ expect(sessionInfo.client.payload.headers).toEqual({ ...headers, cookie: undefined }); // cookies sollen nicht gespeichert werden
42
+ expect(sessionInfo.client.payload.querystrings).toEqual(querystrings);
43
+ expect(sessionInfo.client.payload.ip).toBe('151.248.213.117');
44
+ // user
45
+ expect(sessionInfo.user.id).toBe('user-id');
46
+ expect(sessionInfo.user.displayName).toBe('Webseiten Besucher');
47
+ expect(sessionInfo.user.locale).toBe('de_DE');
48
+ expect(sessionInfo.user.payload).toBeUndefined();
49
+ });
50
+ it('with enhanced user data', async () => {
51
+ const requestUserInfos = async () => {
52
+ const userProfile = {
53
+ username: 'hans.muster',
54
+ domain: 'PRIMARY',
55
+ firstName: 'Hans',
56
+ lastName: 'Muster',
57
+ };
58
+ return {
59
+ id: userProfile.username + '@' + userProfile.domain,
60
+ displayName: userProfile.firstName + ' ' + userProfile.lastName,
61
+ payload: userProfile,
62
+ };
63
+ };
64
+ const props = {
65
+ requestUserInfos,
66
+ };
67
+ const sessionInfo = await createSessionInfo_1.default(socket, 'my-client', defaultSessionInfo, props)();
68
+ expect(sessionInfo.user.id).toBe('hans.muster@PRIMARY');
69
+ expect(sessionInfo.user.displayName).toBe('Hans Muster');
70
+ expect(sessionInfo.user.payload.username).toBe('hans.muster');
71
+ expect(sessionInfo.user.payload.firstName).toBe('Hans');
72
+ expect(sessionInfo.user.payload.lastName).toBe('Muster');
73
+ });
74
+ it('with undefined enhanced user data', async () => {
75
+ const requestUserInfos = async () => {
76
+ return undefined;
77
+ };
78
+ const props = {
79
+ requestUserInfos,
80
+ };
81
+ const sessionInfo = await createSessionInfo_1.default(socket, 'my-client', defaultSessionInfo, props)();
82
+ expect(sessionInfo.user.id).toBe('user-id');
83
+ expect(sessionInfo.user.displayName).toBe('Webseiten Besucher');
84
+ expect(sessionInfo.user.locale).toBe('de_DE');
85
+ expect(sessionInfo.user.payload).toBeUndefined();
86
+ });
87
+ });
88
+ //# sourceMappingURL=createSessionInfo.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSessionInfo.test.js","sourceRoot":"","sources":["../src/createSessionInfo.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ declare const extractIP: (request: any) => string;
2
+ export default extractIP;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const extractIP = (request) => {
4
+ const ip = (request.headers['x-forwarded-for'] ||
5
+ request.connection.remoteAddress ||
6
+ request.socket.remoteAddress ||
7
+ request.connection.socket.remoteAddress).split(',')[0];
8
+ return ip;
9
+ };
10
+ exports.default = extractIP;
11
+ //# sourceMappingURL=extractIP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractIP.js","sourceRoot":"","sources":["../src/extractIP.ts"],"names":[],"mappings":";;AAAA,MAAM,SAAS,GAAG,CAAC,OAAY,EAAU,EAAE;IACvC,MAAM,EAAE,GAAG,CACP,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAClC,OAAO,CAAC,UAAU,CAAC,aAAa;QAChC,OAAO,CAAC,MAAM,CAAC,aAAa;QAC5B,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAC1C,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhB,OAAO,EAAE,CAAC;AACd,CAAC,CAAC;AAEF,kBAAe,SAAS,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const extractIP_1 = require("./extractIP");
4
+ describe('extract IP address from websocket request', () => {
5
+ it('takes IP from x-forwarded-for header', () => {
6
+ const request = {
7
+ headers: { 'x-forwarded-for': '192.168.1.1, 192.168.1.1' },
8
+ connection: { remoteAddress: '192.168.1.2', socket: { remoteAddress: '192.168.1.4' } },
9
+ socket: { remoteAddress: '192.168.1.3' }
10
+ };
11
+ expect(extractIP_1.default(request)).toBe('192.168.1.1');
12
+ });
13
+ it('takes IP from connection remote address', () => {
14
+ const request = {
15
+ headers: {},
16
+ connection: { remoteAddress: '192.168.1.2' },
17
+ socket: { remoteAddress: '192.168.1.3' }
18
+ };
19
+ expect(extractIP_1.default(request)).toBe('192.168.1.2');
20
+ });
21
+ it('takes IP from socket remote address', () => {
22
+ const request = {
23
+ headers: {},
24
+ connection: {},
25
+ socket: { remoteAddress: '192.168.1.3' }
26
+ };
27
+ expect(extractIP_1.default(request)).toBe('192.168.1.3');
28
+ });
29
+ it('takes IP from connection ocket remote address', () => {
30
+ const request = {
31
+ headers: {},
32
+ connection: { socket: { remoteAddress: '192.168.1.4' } },
33
+ socket: {}
34
+ };
35
+ expect(extractIP_1.default(request)).toBe('192.168.1.4');
36
+ });
37
+ });
38
+ //# sourceMappingURL=extractIP.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractIP.test.js","sourceRoot":"","sources":["../src/extractIP.test.ts"],"names":[],"mappings":";;AAAA,2CAAoC;AAEpC,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,OAAO,GAAG;YACZ,OAAO,EAAE,EAAE,iBAAiB,EAAE,0BAA0B,EAAE;YAC1D,UAAU,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE;YACtF,MAAM,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE;SAC3C,CAAC;QACF,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG;YACZ,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE;YAC5C,MAAM,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE;SAC3C,CAAC;QACF,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC3C,MAAM,OAAO,GAAG;YACZ,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE;SAC3C,CAAC;QACF,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACrD,MAAM,OAAO,GAAG;YACZ,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE;YACxD,MAAM,EAAE,EAAE;SACb,CAAC;QACF,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const extractLocale: (querystrings: any, acceptLanguage?: string) => string | undefined;
2
+ export default extractLocale;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const accept_language_parser_1 = require("accept-language-parser");
4
+ const extractLocale = (querystrings, acceptLanguage = '') => {
5
+ let locale = undefined;
6
+ if (querystrings.lang) {
7
+ locale = querystrings.lang;
8
+ }
9
+ else {
10
+ const languages = accept_language_parser_1.parse(acceptLanguage);
11
+ if (languages !== undefined && languages.length > 0) {
12
+ const code = languages[0].code;
13
+ const region = languages[0].region;
14
+ locale = code + (region ? '_' + region : '');
15
+ }
16
+ }
17
+ return locale;
18
+ };
19
+ exports.default = extractLocale;
20
+ //# sourceMappingURL=extractLocale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractLocale.js","sourceRoot":"","sources":["../src/extractLocale.ts"],"names":[],"mappings":";;AAAA,mEAA+C;AAE/C,MAAM,aAAa,GAAG,CAAC,YAAiB,EAAE,cAAc,GAAG,EAAE,EAAsB,EAAE;IACjF,IAAI,MAAM,GAAuB,SAAS,CAAC;IAC3C,IAAI,YAAY,CAAC,IAAI,EAAE;QACnB,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC;KAC9B;SAAM;QACH,MAAM,SAAS,GAAG,8BAAK,CAAC,cAAc,CAAC,CAAC;QACxC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACjD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACnC,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAChD;KACJ;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,kBAAe,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const extractLocale_1 = require("./extractLocale");
4
+ describe('should extract locale from accept-language header', () => {
5
+ it('undefined header value', () => {
6
+ expect(extractLocale_1.default({}, undefined)).toBe(undefined);
7
+ });
8
+ it('lang via query parameer', () => {
9
+ expect(extractLocale_1.default({ lang: 'de' }, '')).toBe('de');
10
+ });
11
+ it('empty header value', () => {
12
+ expect(extractLocale_1.default({}, '')).toBe(undefined);
13
+ });
14
+ it('header value with one value', () => {
15
+ expect(extractLocale_1.default({}, 'de-CH')).toBe('de_CH');
16
+ });
17
+ it('header value with several values', () => {
18
+ const header = 'de-CH,de;q=0.8,en-US;q=0.6,en;q=0.4';
19
+ expect(extractLocale_1.default({}, header)).toBe('de_CH');
20
+ });
21
+ });
22
+ //# sourceMappingURL=extractLocale.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractLocale.test.js","sourceRoot":"","sources":["../src/extractLocale.test.ts"],"names":[],"mappings":";;AAAA,mDAA4C;AAE5C,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC/D,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,uBAAa,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,uBAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,uBAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,uBAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,qCAAqC,CAAC;QACrD,MAAM,CAAC,uBAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const getSupportedClientLocale: (userLocale: string) => string;
2
+ export default getSupportedClientLocale;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const getSupportedClientLocale = (userLocale) => {
4
+ // Prüfe, ob der Webclient für diese Sprache eine Übersetzung hat
5
+ const supportedLocales = ['de', 'en', 'fr', 'it'];
6
+ if (supportedLocales.indexOf(userLocale) > -1) {
7
+ return userLocale;
8
+ }
9
+ else {
10
+ const detectedLocale = supportedLocales.find((definedLocale) => userLocale.indexOf(definedLocale) === 0);
11
+ if (detectedLocale) {
12
+ return detectedLocale.toLowerCase();
13
+ }
14
+ }
15
+ // default locale
16
+ return 'de';
17
+ };
18
+ exports.default = getSupportedClientLocale;
19
+ //# sourceMappingURL=getSupportedClientLocale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSupportedClientLocale.js","sourceRoot":"","sources":["../src/getSupportedClientLocale.ts"],"names":[],"mappings":";;AAAA,MAAM,wBAAwB,GAAG,CAAC,UAAkB,EAAU,EAAE;IAC5D,iEAAiE;IACjE,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE;QAC3C,OAAO,UAAU,CAAC;KACrB;SAAM;QACH,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACzG,IAAI,cAAc,EAAE;YAChB,OAAO,cAAc,CAAC,WAAW,EAAE,CAAC;SACvC;KACJ;IACD,iBAAiB;IACjB,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,kBAAe,wBAAwB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const getSupportedClientLocale_1 = require("./getSupportedClientLocale");
4
+ describe('get client locale', () => {
5
+ it('should return supported client language', () => {
6
+ expect(getSupportedClientLocale_1.default('de')).toBe('de');
7
+ expect(getSupportedClientLocale_1.default('de-ch')).toBe('de');
8
+ expect(getSupportedClientLocale_1.default('en')).toBe('en');
9
+ expect(getSupportedClientLocale_1.default('en-us')).toBe('en');
10
+ expect(getSupportedClientLocale_1.default('fr')).toBe('fr');
11
+ expect(getSupportedClientLocale_1.default('fr-ch')).toBe('fr');
12
+ expect(getSupportedClientLocale_1.default('it')).toBe('it');
13
+ });
14
+ it('should return "de" as default locale', () => {
15
+ expect(getSupportedClientLocale_1.default('ru')).toBe('de');
16
+ expect(getSupportedClientLocale_1.default('ru-de')).toBe('de');
17
+ expect(getSupportedClientLocale_1.default('sp')).toBe('de');
18
+ });
19
+ });
20
+ //# sourceMappingURL=getSupportedClientLocale.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSupportedClientLocale.test.js","sourceRoot":"","sources":["../src/getSupportedClientLocale.test.ts"],"names":[],"mappings":";;AAAA,yEAAkE;AAElE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,kCAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,kCAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,kCAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,kCAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,kCAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,kCAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,kCAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,kCAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,kCAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,kCAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Action, Client, SessionInfoUser } from '@botfabrik/engine-domain';
2
+ import { SpeechToTextProps } from './speechToText';
3
+ import { SessionInfoUserPayload } from './types';
4
+ export interface WebClientProps {
5
+ getStartedAction?: Action;
6
+ requestUserInfos?: (querystrings: any) => Promise<Partial<SessionInfoUser<SessionInfoUserPayload>>>;
7
+ requestSessionRecordQuery?: (querystrings: any) => Promise<object>;
8
+ speech?: SpeechToTextProps;
9
+ expandChatWindowAtStart?: boolean;
10
+ }
11
+ declare const _default: (name: string, props: WebClientProps) => Client;
12
+ export default _default;
13
+ export declare const splitBlob: (actionObject: any) => any;
14
+ export declare const CLIENT_TYPE = "webclient";
package/dist/index.js ADDED
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLIENT_TYPE = exports.splitBlob = void 0;
4
+ const engine_domain_1 = require("@botfabrik/engine-domain");
5
+ const express = require("express");
6
+ const createSessionInfo_1 = require("./createSessionInfo");
7
+ const getSupportedClientLocale_1 = require("./getSupportedClientLocale");
8
+ const loadPreviousConversation_1 = require("./loadPreviousConversation");
9
+ const middleware_1 = require("./middleware");
10
+ const requestSessionData_1 = require("./requestSessionData");
11
+ const speechToText_1 = require("./speechToText");
12
+ const views_1 = require("./views");
13
+ exports.default = (name, props) => async (bot) => {
14
+ bot.webserver.express.enable('trust proxy');
15
+ bot.webserver.express.get('/', (_req, res) => {
16
+ res.redirect(`/${name}/embed`);
17
+ });
18
+ bot.webserver.express.get(`/${name}/embed`, (req, res) => {
19
+ const server = `${req.protocol}://${req.get('host')}/${name}`;
20
+ res.set('Content-Type', 'text/html; charset=utf-8');
21
+ res.write(views_1.default(server, `${server}/embed/bundle.js`));
22
+ res.end();
23
+ });
24
+ bot.webserver.express.use(`/${name}/embed`, express.static(__dirname + '/embed'));
25
+ bot.webserver.express.use(`/${name}`, express.static(__dirname + '/client'));
26
+ console.log(`Webclient will be available on route: /${name}`);
27
+ const nsp = bot.webserver.socket.of('/bf-webclient');
28
+ nsp.on('connection', async (socket) => {
29
+ try {
30
+ const querystrings = socket.handshake.query;
31
+ const sessionsCollection = bot.store.db.collection('sessions');
32
+ const { sessionId, sessionInfo: defaultSessionInfo, isNew } = await requestSessionData_1.default(querystrings, sessionsCollection, name, props);
33
+ // create a channel for each session
34
+ socket.join(sessionId);
35
+ const sessionInfo = await createSessionInfo_1.default(socket, name, defaultSessionInfo, props)();
36
+ const session = await bot.createSession(sessionId, sessionInfo);
37
+ // sending active language to client
38
+ const clientLocale = getSupportedClientLocale_1.default(session.translator.locale);
39
+ nsp.to(sessionId).emit('set-active-language', clientLocale);
40
+ // sending persisted state to client
41
+ const previousConversations = await loadPreviousConversation_1.default(bot.store, sessionId);
42
+ nsp.to(sessionId).emit('restore-client-state', { sessionId, messages: previousConversations });
43
+ // enable speech support
44
+ if (props.speech) {
45
+ nsp.to(sessionId).emit('enable-speech-support');
46
+ }
47
+ // Notify middlewares about a connected or reconnected guest
48
+ await session.dispatch(engine_domain_1.guestConnected(sessionId));
49
+ if (isNew && props.getStartedAction) {
50
+ await session.dispatch(props.getStartedAction);
51
+ }
52
+ if (isNew && props.expandChatWindowAtStart && props.expandChatWindowAtStart === true) {
53
+ nsp.to(session.id).emit('expand-window');
54
+ }
55
+ // forward actions from webclient
56
+ socket.on('action', async (action) => {
57
+ await session.dispatch(JSON.parse(action));
58
+ });
59
+ socket.on('file-from-guest', async (action) => {
60
+ const actionObject = JSON.parse(action);
61
+ await session.dispatch(exports.splitBlob(actionObject));
62
+ });
63
+ socket.on('disconnect', async () => {
64
+ await session.dispatch(engine_domain_1.guestDisconnected(sessionId));
65
+ });
66
+ socket.on('audio-message', async (buffer) => {
67
+ if (props.speech) {
68
+ try {
69
+ const text = await speechToText_1.default(props.speech, session.translator.locale, buffer);
70
+ if (text && text.length) {
71
+ nsp.to(sessionId).emit('speech-transcription', text);
72
+ session.dispatch(engine_domain_1.receiveTextMessageFromGuest(text));
73
+ }
74
+ }
75
+ catch (error) {
76
+ console.error(error);
77
+ }
78
+ }
79
+ });
80
+ }
81
+ catch (error) {
82
+ console.error('Error while connecting webclient with backend.');
83
+ console.error(error);
84
+ const errorMessage = new engine_domain_1.TextMessage('Sorry I can’t talk at the moment. Please try again later.', new engine_domain_1.BotUser());
85
+ socket.emit('action', engine_domain_1.sendMessageToGuest(errorMessage));
86
+ }
87
+ });
88
+ const client = {
89
+ name,
90
+ middleware: middleware_1.default(name, nsp),
91
+ };
92
+ return client;
93
+ };
94
+ exports.splitBlob = (actionObject) => {
95
+ const regex = /data:(.*);base64,(.*)/i;
96
+ const matches = regex.exec(actionObject.file.blob);
97
+ if (matches !== null && matches.length === 3) {
98
+ actionObject.file.filetype = matches[1];
99
+ actionObject.file.base64 = matches[2];
100
+ delete actionObject.file.blob;
101
+ }
102
+ return actionObject;
103
+ };
104
+ exports.CLIENT_TYPE = 'webclient';
105
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,4DAYkC;AAClC,mCAAmC;AACnC,2DAAoD;AACpD,yEAAkE;AAClE,yEAAkE;AAClE,6CAAsC;AACtC,6DAAsD;AACtD,iDAAiE;AAEjE,mCAA4B;AAU5B,kBAAe,CAAC,IAAY,EAAE,KAAqB,EAAU,EAAE,CAAC,KAAK,EAAE,GAAgB,EAA2B,EAAE;IAChH,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAE5C,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACzC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9D,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;QACpD,GAAG,CAAC,KAAK,CAAC,eAAK,CAAC,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,CAAC,CAAC;QACtD,GAAG,CAAC,GAAG,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;IAElF,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC;IAE7E,OAAO,CAAC,GAAG,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IAE9D,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;IACrD,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAClC,IAAI;YACA,MAAM,YAAY,GAAW,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YACpD,MAAM,kBAAkB,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC/D,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG,MAAM,4BAAkB,CAClF,YAAY,EACZ,kBAAkB,EAClB,IAAI,EACJ,KAAK,CACR,CAAC;YAEF,oCAAoC;YACpC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEvB,MAAM,WAAW,GAAG,MAAM,2BAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC;YACvF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAEhE,oCAAoC;YACpC,MAAM,YAAY,GAAG,kCAAwB,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACzE,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;YAE5D,oCAAoC;YACpC,MAAM,qBAAqB,GAAG,MAAM,kCAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACnF,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC,CAAC;YAE/F,wBAAwB;YACxB,IAAI,KAAK,CAAC,MAAM,EAAE;gBACd,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;aACnD;YAED,4DAA4D;YAC5D,MAAM,OAAO,CAAC,QAAQ,CAAC,8BAAc,CAAC,SAAS,CAAC,CAAC,CAAC;YAElD,IAAI,KAAK,IAAI,KAAK,CAAC,gBAAgB,EAAE;gBACjC,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;aAClD;YAED,IAAI,KAAK,IAAI,KAAK,CAAC,uBAAuB,IAAI,KAAK,CAAC,uBAAuB,KAAK,IAAI,EAAE;gBAClF,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;aAC5C;YAED,iCAAiC;YACjC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACjC,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACxC,MAAM,OAAO,CAAC,QAAQ,CAAC,iBAAS,CAAC,YAAY,CAAC,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;gBAC/B,MAAM,OAAO,CAAC,QAAQ,CAAC,iCAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACxC,IAAI,KAAK,CAAC,MAAM,EAAE;oBACd,IAAI;wBACA,MAAM,IAAI,GAAG,MAAM,sBAAY,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBACjF,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;4BACrB,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;4BACrD,OAAO,CAAC,QAAQ,CAAC,2CAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;yBACvD;qBACJ;oBAAC,OAAO,KAAK,EAAE;wBACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;qBACxB;iBACJ;YACL,CAAC,CAAC,CAAC;SACN;QAAC,OAAO,KAAK,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAChE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,YAAY,GAAG,IAAI,2BAAW,CAChC,2DAA2D,EAC3D,IAAI,uBAAO,EAAE,CAChB,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,kCAAkB,CAAC,YAAY,CAAC,CAAC,CAAC;SAC3D;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAmB;QAC3B,IAAI;QACJ,UAAU,EAAE,oBAAU,CAAC,IAAI,EAAE,GAAG,CAAC;KACpC,CAAC;IACF,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEW,QAAA,SAAS,GAAG,CAAC,YAAY,EAAE,EAAE;IACtC,MAAM,KAAK,GAAG,wBAAwB,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QAC1C,YAAY,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxC,YAAY,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;KACjC;IACD,OAAO,YAAY,CAAC;AACxB,CAAC,CAAC;AAEW,QAAA,WAAW,GAAG,WAAW,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("./index");
4
+ describe('split blob', () => {
5
+ it('should split blob in filetype and base64', () => {
6
+ const actionObject = {
7
+ file: {
8
+ blob: 'data:application/pdf;base64,JVBERi0xLjMKJf////8KNiAwIG9iago8PAovVHlwZSAvRXh0R1N0YXRlCi9jYSAwCj4+CmVuZG9iago3IDAgb2JqCjw8C'
9
+ }
10
+ };
11
+ const splited = index_1.splitBlob(actionObject);
12
+ expect(splited.file.filetype).toBe('application/pdf');
13
+ expect(splited.file.base64).toBe('JVBERi0xLjMKJf////8KNiAwIG9iago8PAovVHlwZSAvRXh0R1N0YXRlCi9jYSAwCj4+CmVuZG9iago3IDAgb2JqCjw8C');
14
+ });
15
+ });
16
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":";;AAAA,mCAAoC;AAEpC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,YAAY,GAAG;YACjB,IAAI,EAAE;gBACF,IAAI,EACA,2HAA2H;aAClI;SACJ,CAAC;QACF,MAAM,OAAO,GAAG,iBAAS,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAC5B,+FAA+F,CAClG,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Store } from '@botfabrik/engine-domain';
2
+ declare const loadPreviousConversations: (store: Store, sessionId: string) => Promise<any[]>;
3
+ export default loadPreviousConversations;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const engine_domain_1 = require("@botfabrik/engine-domain");
4
+ const loadPreviousConversations = async (store, sessionId) => {
5
+ const actionLogs = await store.db
6
+ .collection('actionlog')
7
+ .find({
8
+ $and: [
9
+ { _sessionId: sessionId },
10
+ {
11
+ $or: [
12
+ { type: engine_domain_1.ActionTypes.MESSAGE_FROM_GUEST },
13
+ { type: engine_domain_1.ActionTypes.MESSAGE_WITHOUT_ANALYSIS_FROM_GUEST },
14
+ { type: engine_domain_1.ActionTypes.MESSAGE_TO_GUEST },
15
+ ],
16
+ },
17
+ ],
18
+ })
19
+ .sort({ _seq: 1 })
20
+ .limit(200)
21
+ .toArray();
22
+ // id hinzufügen, damit wir nicht zweimal die selbe meldung im state haben
23
+ const messages = actionLogs.map((l) => Object.assign({}, l.message, { _id: l._id }));
24
+ return messages;
25
+ };
26
+ exports.default = loadPreviousConversations;
27
+ //# sourceMappingURL=loadPreviousConversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadPreviousConversation.js","sourceRoot":"","sources":["../src/loadPreviousConversation.ts"],"names":[],"mappings":";;AAAA,4DAA8D;AAE9D,MAAM,yBAAyB,GAAG,KAAK,EAAE,KAAY,EAAE,SAAiB,EAAE,EAAE;IACxE,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,EAAE;SAC5B,UAAU,CAAC,WAAW,CAAC;SACvB,IAAI,CAAC;QACF,IAAI,EAAE;YACF,EAAE,UAAU,EAAE,SAAS,EAAE;YACzB;gBACI,GAAG,EAAE;oBACD,EAAE,IAAI,EAAE,2BAAW,CAAC,kBAAkB,EAAE;oBACxC,EAAE,IAAI,EAAE,2BAAW,CAAC,mCAAmC,EAAE;oBACzD,EAAE,IAAI,EAAE,2BAAW,CAAC,gBAAgB,EAAE;iBACzC;aACJ;SACJ;KACJ,CAAC;SACD,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,OAAO,EAAE,CAAC;IAEf,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACrF,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,kBAAe,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Middleware } from '@botfabrik/engine-domain';
2
+ declare const _default: (clientName: string, nsp: SocketIO.Namespace) => Middleware;
3
+ export default _default;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const botfabrik_utils_1 = require("@botfabrik/botfabrik-utils");
4
+ const engine_domain_1 = require("@botfabrik/engine-domain");
5
+ exports.default = (clientName, nsp) => async () => {
6
+ return async (next, _state, action, session) => {
7
+ const emitMessageToGuestAction = async (action) => {
8
+ nsp.to(session.id).emit('action', { type: engine_domain_1.ActionTypes.TYPING_ON });
9
+ await botfabrik_utils_1.waitForTyping(action.message);
10
+ nsp.to(session.id).emit('action', action);
11
+ nsp.to(session.id).emit('action', { type: engine_domain_1.ActionTypes.TYPING_OFF });
12
+ await botfabrik_utils_1.waitFor(500);
13
+ };
14
+ const emitEventToGuestAction = async (action) => {
15
+ nsp.to(session.id).emit('action', action);
16
+ };
17
+ const sessionInfo = session.getSessionInfo();
18
+ const clientInfo = sessionInfo.client;
19
+ if (clientInfo.type === 'webclient' && clientInfo.name === clientName) {
20
+ switch (action.type) {
21
+ case engine_domain_1.ActionTypes.MESSAGE_TO_GUEST:
22
+ await emitMessageToGuestAction(action);
23
+ break;
24
+ case engine_domain_1.ActionTypes.EVENT_TO_GUEST:
25
+ await emitEventToGuestAction(action);
26
+ break;
27
+ }
28
+ }
29
+ next(action);
30
+ };
31
+ };
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":";;AAAA,gEAAoE;AACpE,4DAQkC;AAGlC,kBAAe,CAAC,UAAkB,EAAE,GAAuB,EAAc,EAAE,CAAC,KAAK,IAE/E,EAAE;IACA,OAAO,KAAK,EACR,IAAkB,EAClB,MAAiD,EACjD,MAAc,EACd,OAAgB,EACH,EAAE;QACf,MAAM,wBAAwB,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;YACrE,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,2BAAW,CAAC,SAAS,EAAE,CAAC,CAAC;YACnE,MAAM,+BAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC1C,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,2BAAW,CAAC,UAAU,EAAE,CAAC,CAAC;YACpE,MAAM,yBAAO,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,MAAM,sBAAsB,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;YACnE,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAoD,CAAC;QAC/F,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC;QACtC,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE;YACnE,QAAQ,MAAM,CAAC,IAAI,EAAE;gBACjB,KAAK,2BAAW,CAAC,gBAAgB;oBAC7B,MAAM,wBAAwB,CAAC,MAAM,CAAC,CAAC;oBACvC,MAAM;gBACV,KAAK,2BAAW,CAAC,cAAc;oBAC3B,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;oBACrC,MAAM;aACb;SACJ;QACD,IAAI,CAAC,MAAM,CAAC,CAAC;IACjB,CAAC,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { SessionInfo } from '@botfabrik/engine-domain';
2
+ import { WebClientProps } from './index';
3
+ import { SessionInfoClientPayload, SessionInfoUserPayload } from './types';
4
+ interface SessionData {
5
+ sessionId: string;
6
+ sessionInfo: SessionInfo<SessionInfoClientPayload, SessionInfoUserPayload>;
7
+ isNew: boolean;
8
+ }
9
+ declare const requestSessionData: (querystrings: any, sessionsCollection: any, name: string, props: WebClientProps) => Promise<SessionData>;
10
+ export default requestSessionData;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const uuid_1 = require("uuid");
4
+ const index_1 = require("./index");
5
+ const requestSessionData = async (querystrings, sessionsCollection, name, props) => {
6
+ let query = { _id: querystrings.sessionId };
7
+ if (props.requestSessionRecordQuery) {
8
+ const customQuery = await props.requestSessionRecordQuery(querystrings);
9
+ const baseQuery = {
10
+ 'sessionInfo.client.type': index_1.CLIENT_TYPE,
11
+ 'sessionInfo.client.name': name,
12
+ };
13
+ query = Object.assign({}, baseQuery, customQuery);
14
+ }
15
+ const sessionRecord = await sessionsCollection.findOne(query, { _id: 1, sessionInfo: 1 });
16
+ let sessionId;
17
+ let sessionInfo;
18
+ let isNew;
19
+ if (sessionRecord) {
20
+ sessionId = sessionRecord._id;
21
+ sessionInfo = sessionRecord.sessionInfo;
22
+ isNew = false;
23
+ }
24
+ else {
25
+ sessionId = uuid_1.v4();
26
+ sessionInfo = {
27
+ client: {},
28
+ user: {},
29
+ contexts: [],
30
+ };
31
+ isNew = true;
32
+ }
33
+ return {
34
+ sessionId,
35
+ sessionInfo,
36
+ isNew,
37
+ };
38
+ };
39
+ exports.default = requestSessionData;
40
+ //# sourceMappingURL=requestSessionData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestSessionData.js","sourceRoot":"","sources":["../src/requestSessionData.ts"],"names":[],"mappings":";;AACA,+BAAkC;AAClC,mCAAsD;AAStD,MAAM,kBAAkB,GAAG,KAAK,EAC5B,YAAiB,EACjB,kBAAkB,EAClB,IAAY,EACZ,KAAqB,EACD,EAAE;IACtB,IAAI,KAAK,GAAW,EAAE,GAAG,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;IAEpD,IAAI,KAAK,CAAC,yBAAyB,EAAE;QACjC,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;QACxE,MAAM,SAAS,GAAG;YACd,yBAAyB,EAAE,mBAAW;YACtC,yBAAyB,EAAE,IAAI;SAClC,CAAC;QACF,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;KACrD;IAED,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IAE1F,IAAI,SAAiB,CAAC;IACtB,IAAI,WAAW,CAAC;IAChB,IAAI,KAAc,CAAC;IACnB,IAAI,aAAa,EAAE;QACf,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC;QAC9B,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;QACxC,KAAK,GAAG,KAAK,CAAC;KACjB;SAAM;QACH,SAAS,GAAG,SAAI,EAAE,CAAC;QACnB,WAAW,GAAG;YACV,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,EAAE;SACf,CAAC;QACF,KAAK,GAAG,IAAI,CAAC;KAChB;IAED,OAAO;QACH,SAAS;QACT,WAAW;QACX,KAAK;KACR,CAAC;AACN,CAAC,CAAC;AAEF,kBAAe,kBAAkB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};