@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.
- package/README.md +169 -0
- package/dist/client/asset-manifest.json +22 -0
- package/dist/client/bot.png +0 -0
- package/dist/client/bot.svg +1 -0
- package/dist/client/custom.css +4 -0
- package/dist/client/favicon.ico +0 -0
- package/dist/client/index.html +1 -0
- package/dist/client/logo192.png +0 -0
- package/dist/client/logo512.png +0 -0
- package/dist/client/manifest.json +25 -0
- package/dist/client/play-button.png +0 -0
- package/dist/client/precache-manifest.18268e8ddbe40ae5d8e91a4a76774701.js +26 -0
- package/dist/client/robots.txt +3 -0
- package/dist/client/service-worker.js +39 -0
- package/dist/client/static/css/main.9f09e476.chunk.css +2 -0
- package/dist/client/static/css/main.9f09e476.chunk.css.map +1 -0
- package/dist/client/static/js/2.94d39000.chunk.js +3 -0
- package/dist/client/static/js/2.94d39000.chunk.js.LICENSE.txt +103 -0
- package/dist/client/static/js/2.94d39000.chunk.js.map +1 -0
- package/dist/client/static/js/main.1f8d6c7f.chunk.js +2 -0
- package/dist/client/static/js/main.1f8d6c7f.chunk.js.map +1 -0
- package/dist/client/static/js/runtime-main.f63e6028.js +2 -0
- package/dist/client/static/js/runtime-main.f63e6028.js.map +1 -0
- package/dist/client/visitor.png +0 -0
- package/dist/client/visitor.svg +1 -0
- package/dist/createSessionInfo.d.ts +5 -0
- package/dist/createSessionInfo.js +36 -0
- package/dist/createSessionInfo.js.map +1 -0
- package/dist/createSessionInfo.test.d.ts +1 -0
- package/dist/createSessionInfo.test.js +88 -0
- package/dist/createSessionInfo.test.js.map +1 -0
- package/dist/extractIP.d.ts +2 -0
- package/dist/extractIP.js +11 -0
- package/dist/extractIP.js.map +1 -0
- package/dist/extractIP.test.d.ts +1 -0
- package/dist/extractIP.test.js +38 -0
- package/dist/extractIP.test.js.map +1 -0
- package/dist/extractLocale.d.ts +2 -0
- package/dist/extractLocale.js +20 -0
- package/dist/extractLocale.js.map +1 -0
- package/dist/extractLocale.test.d.ts +1 -0
- package/dist/extractLocale.test.js +22 -0
- package/dist/extractLocale.test.js.map +1 -0
- package/dist/getSupportedClientLocale.d.ts +2 -0
- package/dist/getSupportedClientLocale.js +19 -0
- package/dist/getSupportedClientLocale.js.map +1 -0
- package/dist/getSupportedClientLocale.test.d.ts +1 -0
- package/dist/getSupportedClientLocale.test.js +20 -0
- package/dist/getSupportedClientLocale.test.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +105 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +1 -0
- package/dist/index.test.js +16 -0
- package/dist/index.test.js.map +1 -0
- package/dist/loadPreviousConversation.d.ts +3 -0
- package/dist/loadPreviousConversation.js +27 -0
- package/dist/loadPreviousConversation.js.map +1 -0
- package/dist/middleware/index.d.ts +3 -0
- package/dist/middleware/index.js +32 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/requestSessionData.d.ts +10 -0
- package/dist/requestSessionData.js +40 -0
- package/dist/requestSessionData.js.map +1 -0
- package/dist/requestSessionData.test.d.ts +1 -0
- package/dist/requestSessionData.test.js +83 -0
- package/dist/requestSessionData.test.js.map +1 -0
- package/dist/speechToText.d.ts +7 -0
- package/dist/speechToText.js +46 -0
- package/dist/speechToText.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/views/index.d.ts +2 -0
- package/dist/views/index.js +102 -0
- package/dist/views/index.js.map +1 -0
- 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,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,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,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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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":"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"}
|
|
@@ -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,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,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 {};
|