@botonic/webchat-core 2.37.0 → 2.38.1
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/CHANGELOG.md +16 -0
- package/package.json +4 -3
- package/src/index.d.ts +6 -1
- package/src/index.js +5 -1
- package/src/index.js.map +1 -1
- package/src/lib/analytics/create-webchat-analytics-botonic-context.d.ts +14 -0
- package/src/lib/analytics/create-webchat-analytics-botonic-context.js +114 -0
- package/src/lib/analytics/create-webchat-analytics-botonic-context.js.map +1 -0
- package/src/lib/analytics/dispatch-hubtype-analytics-track-event.d.ts +8 -0
- package/src/lib/analytics/dispatch-hubtype-analytics-track-event.js +60 -0
- package/src/lib/analytics/dispatch-hubtype-analytics-track-event.js.map +1 -0
- package/src/lib/analytics/hubtype-analytics-track-event-message.d.ts +9 -0
- package/src/lib/analytics/hubtype-analytics-track-event-message.js +24 -0
- package/src/lib/analytics/hubtype-analytics-track-event-message.js.map +1 -0
- package/src/lib/analytics/index.d.ts +4 -0
- package/src/lib/analytics/index.js +5 -0
- package/src/lib/analytics/index.js.map +1 -0
- package/src/lib/analytics/webchat-analytics-request.d.ts +17 -0
- package/src/lib/analytics/webchat-analytics-request.js +25 -0
- package/src/lib/analytics/webchat-analytics-request.js.map +1 -0
- package/src/lib/controllers/index.d.ts +1 -0
- package/src/lib/controllers/index.js +1 -0
- package/src/lib/controllers/index.js.map +1 -1
- package/src/lib/controllers/public.d.ts +12 -9
- package/src/lib/controllers/public.js +3 -2
- package/src/lib/controllers/public.js.map +1 -1
- package/src/lib/controllers/register-on-open.d.ts +6 -0
- package/src/lib/controllers/register-on-open.js +15 -0
- package/src/lib/controllers/register-on-open.js.map +1 -0
- package/src/lib/controllers/webchat.d.ts +21 -9
- package/src/lib/controllers/webchat.js +135 -32
- package/src/lib/controllers/webchat.js.map +1 -1
- package/src/lib/domain/index.d.ts +11 -0
- package/src/lib/infra/client/webchat-client-state.d.ts +13 -0
- package/src/lib/infra/client/webchat-client-state.js +29 -0
- package/src/lib/infra/client/webchat-client-state.js.map +1 -0
- package/src/lib/infra/clients/hubtype-api.d.ts +2 -1
- package/src/lib/infra/clients/hubtype-api.js +10 -1
- package/src/lib/infra/clients/hubtype-api.js.map +1 -1
- package/src/lib/infra/repositories/storage/base-storage.d.ts +13 -2
- package/src/lib/infra/repositories/storage/base-storage.js +117 -6
- package/src/lib/infra/repositories/storage/base-storage.js.map +1 -1
- package/src/lib/infra/repositories/storage/browser-storage.js +2 -5
- package/src/lib/infra/repositories/storage/browser-storage.js.map +1 -1
- package/src/lib/infra/repositories/storage/client-state-constants.d.ts +4 -0
- package/src/lib/infra/repositories/storage/client-state-constants.js +5 -0
- package/src/lib/infra/repositories/storage/client-state-constants.js.map +1 -0
- package/src/lib/infra/repositories/storage/factory.js +8 -6
- package/src/lib/infra/repositories/storage/factory.js.map +1 -1
- package/src/lib/infra/repositories/storage/in-memory.js +7 -1
- package/src/lib/infra/repositories/storage/in-memory.js.map +1 -1
- package/src/lib/infra/repositories/storage/index.d.ts +2 -1
- package/src/lib/infra/repositories/storage/index.js +1 -0
- package/src/lib/infra/repositories/storage/index.js.map +1 -1
- package/src/lib/infra/repositories/storage/parse-conversation-data.d.ts +2 -0
- package/src/lib/infra/repositories/storage/parse-conversation-data.js +19 -0
- package/src/lib/infra/repositories/storage/parse-conversation-data.js.map +1 -0
- package/src/lib/infra/repositories/storage/resolve-webchat-session-user.d.ts +9 -0
- package/src/lib/infra/repositories/storage/resolve-webchat-session-user.js +41 -0
- package/src/lib/infra/repositories/storage/resolve-webchat-session-user.js.map +1 -0
- package/src/lib/infra/repositories/storage/storage-test-helpers.d.ts +2 -0
- package/src/lib/infra/repositories/storage/storage-test-helpers.js +10 -0
- package/src/lib/infra/repositories/storage/storage-test-helpers.js.map +1 -0
- package/src/lib/infra/repositories/storage/types.d.ts +11 -0
- package/src/lib/machines/embed-trigger.d.ts +17 -0
- package/src/lib/machines/embed-trigger.js +29 -0
- package/src/lib/machines/embed-trigger.js.map +1 -0
- package/src/lib/machines/webchat.d.ts +41 -8
- package/src/lib/machines/webchat.js +73 -23
- package/src/lib/machines/webchat.js.map +1 -1
- package/src/lib/messages/webchat-message.d.ts +4 -1
- package/src/lib/messages/webchat-message.js +3 -0
- package/src/lib/messages/webchat-message.js.map +1 -1
- package/src/lib/services/webchat-service.d.ts +3 -0
- package/src/lib/services/webchat-service.js +77 -5
- package/src/lib/services/webchat-service.js.map +1 -1
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { __awaiter } from "tslib";
|
|
2
|
-
|
|
2
|
+
import { APP_CLIENT_STATE_PLACEHOLDER_USER_ID, DEFAULT_KEY_PREFIX, } from './client-state-constants';
|
|
3
3
|
export class BaseStorageRepository {
|
|
4
|
-
constructor(
|
|
5
|
-
|
|
4
|
+
constructor(options = DEFAULT_KEY_PREFIX) {
|
|
5
|
+
var _a;
|
|
6
|
+
this.keyPrefix =
|
|
7
|
+
typeof options === 'string'
|
|
8
|
+
? options
|
|
9
|
+
: ((_a = options.keyPrefix) !== null && _a !== void 0 ? _a : DEFAULT_KEY_PREFIX);
|
|
6
10
|
}
|
|
7
11
|
getConversationKey(appId, userId) {
|
|
8
12
|
return `${this.keyPrefix}:${appId}:${userId}`;
|
|
@@ -10,6 +14,16 @@ export class BaseStorageRepository {
|
|
|
10
14
|
getAppStoragePrefix(appId) {
|
|
11
15
|
return `${this.keyPrefix}:${appId}:`;
|
|
12
16
|
}
|
|
17
|
+
createStoredAnonymousUser(userId, lastActiveAt) {
|
|
18
|
+
return {
|
|
19
|
+
id: userId,
|
|
20
|
+
name: 'Anonymous User',
|
|
21
|
+
locale: '',
|
|
22
|
+
country: '',
|
|
23
|
+
system_locale: '',
|
|
24
|
+
lastActiveAt,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
13
27
|
getConversationData(appId, userId) {
|
|
14
28
|
const key = this.getConversationKey(appId, userId);
|
|
15
29
|
const data = this.getData(key);
|
|
@@ -19,6 +33,65 @@ export class BaseStorageRepository {
|
|
|
19
33
|
const key = this.getConversationKey(appId, userId);
|
|
20
34
|
this.setData(key, data);
|
|
21
35
|
}
|
|
36
|
+
getCustomState(data) {
|
|
37
|
+
var _a;
|
|
38
|
+
return (_a = data.custom) !== null && _a !== void 0 ? _a : {};
|
|
39
|
+
}
|
|
40
|
+
withCustomState(data, customState) {
|
|
41
|
+
return Object.assign(Object.assign({}, data), { custom: customState });
|
|
42
|
+
}
|
|
43
|
+
resolveClientStateUserId(appId) {
|
|
44
|
+
var _a;
|
|
45
|
+
const prefix = this.getAppStoragePrefix(appId);
|
|
46
|
+
const keys = this.getKeysWithPrefix(prefix);
|
|
47
|
+
let mostRecentUserId = null;
|
|
48
|
+
let mostRecentTimestamp = null;
|
|
49
|
+
for (const key of keys) {
|
|
50
|
+
const suffix = key.slice(prefix.length);
|
|
51
|
+
if (!suffix || suffix === APP_CLIENT_STATE_PLACEHOLDER_USER_ID) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const data = this.getData(key);
|
|
55
|
+
if ((_a = data === null || data === void 0 ? void 0 : data.user) === null || _a === void 0 ? void 0 : _a.lastActiveAt) {
|
|
56
|
+
if (!mostRecentTimestamp ||
|
|
57
|
+
new Date(data.user.lastActiveAt) > new Date(mostRecentTimestamp)) {
|
|
58
|
+
mostRecentUserId = data.user.id;
|
|
59
|
+
mostRecentTimestamp = data.user.lastActiveAt;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return mostRecentUserId !== null && mostRecentUserId !== void 0 ? mostRecentUserId : APP_CLIENT_STATE_PLACEHOLDER_USER_ID;
|
|
64
|
+
}
|
|
65
|
+
findAppClientState(appId) {
|
|
66
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
+
const userId = this.resolveClientStateUserId(appId);
|
|
68
|
+
const data = this.getConversationData(appId, userId);
|
|
69
|
+
return Object.assign({}, this.getCustomState(data));
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
saveAppClientState(appId, state) {
|
|
73
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
74
|
+
const userId = this.resolveClientStateUserId(appId);
|
|
75
|
+
const data = this.getConversationData(appId, userId);
|
|
76
|
+
this.saveConversationData(appId, userId, this.withCustomState(data, state));
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
reconcilePlaceholderConversation(appId) {
|
|
80
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
+
const placeholderKey = this.getConversationKey(appId, APP_CLIENT_STATE_PLACEHOLDER_USER_ID);
|
|
82
|
+
if (this.getData(placeholderKey) == null) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const lastUser = yield this.findLastUserSession(appId);
|
|
86
|
+
if (lastUser) {
|
|
87
|
+
let data = this.getConversationData(appId, lastUser.id);
|
|
88
|
+
data = this.mergePlaceholderCustomIntoUser(appId, lastUser.id, data);
|
|
89
|
+
this.saveConversationData(appId, lastUser.id, data);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
yield this.clearConversation(appId, APP_CLIENT_STATE_PLACEHOLDER_USER_ID);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
22
95
|
saveMessage(appId, userId, message) {
|
|
23
96
|
return __awaiter(this, void 0, void 0, function* () {
|
|
24
97
|
const data = this.getConversationData(appId, userId);
|
|
@@ -37,6 +110,9 @@ export class BaseStorageRepository {
|
|
|
37
110
|
return __awaiter(this, void 0, void 0, function* () {
|
|
38
111
|
const data = this.getConversationData(appId, userId);
|
|
39
112
|
data.messages = messages;
|
|
113
|
+
const now = new Date().toISOString();
|
|
114
|
+
data.user = data.user
|
|
115
|
+
? Object.assign(Object.assign({}, data.user), { lastActiveAt: now }) : this.createStoredAnonymousUser(userId, now);
|
|
40
116
|
this.saveConversationData(appId, userId, data);
|
|
41
117
|
});
|
|
42
118
|
}
|
|
@@ -46,9 +122,20 @@ export class BaseStorageRepository {
|
|
|
46
122
|
return data.messages;
|
|
47
123
|
});
|
|
48
124
|
}
|
|
125
|
+
mergePlaceholderCustomIntoUser(appId, userId, data) {
|
|
126
|
+
const placeholder = this.getConversationData(appId, APP_CLIENT_STATE_PLACEHOLDER_USER_ID);
|
|
127
|
+
const placeholderState = this.getCustomState(placeholder);
|
|
128
|
+
if (Object.keys(placeholderState).length === 0) {
|
|
129
|
+
return data;
|
|
130
|
+
}
|
|
131
|
+
const mergedState = Object.assign(Object.assign({}, placeholderState), this.getCustomState(data));
|
|
132
|
+
this.clearConversation(appId, APP_CLIENT_STATE_PLACEHOLDER_USER_ID);
|
|
133
|
+
return this.withCustomState(data, mergedState);
|
|
134
|
+
}
|
|
49
135
|
saveUser(appId, user) {
|
|
50
136
|
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
-
|
|
137
|
+
let data = this.getConversationData(appId, user.id);
|
|
138
|
+
data = this.mergePlaceholderCustomIntoUser(appId, user.id, data);
|
|
52
139
|
const webchatUser = Object.assign(Object.assign({}, user), { lastActiveAt: new Date().toISOString() });
|
|
53
140
|
data.user = webchatUser;
|
|
54
141
|
this.saveConversationData(appId, user.id, data);
|
|
@@ -67,12 +154,16 @@ export class BaseStorageRepository {
|
|
|
67
154
|
}
|
|
68
155
|
findLastUserSession(appId) {
|
|
69
156
|
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
-
var _a;
|
|
157
|
+
var _a, _b;
|
|
71
158
|
const prefix = this.getAppStoragePrefix(appId);
|
|
72
159
|
const keys = this.getKeysWithPrefix(prefix);
|
|
73
160
|
let mostRecentUser = null;
|
|
74
161
|
let mostRecentTimestamp = null;
|
|
75
162
|
for (const key of keys) {
|
|
163
|
+
const suffix = key.slice(prefix.length);
|
|
164
|
+
if (!suffix || suffix === APP_CLIENT_STATE_PLACEHOLDER_USER_ID) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
76
167
|
const data = this.getData(key);
|
|
77
168
|
if ((_a = data === null || data === void 0 ? void 0 : data.user) === null || _a === void 0 ? void 0 : _a.lastActiveAt) {
|
|
78
169
|
if (!mostRecentTimestamp ||
|
|
@@ -82,7 +173,27 @@ export class BaseStorageRepository {
|
|
|
82
173
|
}
|
|
83
174
|
}
|
|
84
175
|
}
|
|
85
|
-
|
|
176
|
+
if (mostRecentUser) {
|
|
177
|
+
return mostRecentUser;
|
|
178
|
+
}
|
|
179
|
+
let fallbackUser = null;
|
|
180
|
+
let fallbackMessageCount = -1;
|
|
181
|
+
for (const key of keys) {
|
|
182
|
+
const suffix = key.slice(prefix.length);
|
|
183
|
+
if (!suffix || suffix === APP_CLIENT_STATE_PLACEHOLDER_USER_ID) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const data = this.getData(key);
|
|
187
|
+
if (!data || data.messages.length === 0) {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (data.messages.length > fallbackMessageCount) {
|
|
191
|
+
fallbackMessageCount = data.messages.length;
|
|
192
|
+
fallbackUser =
|
|
193
|
+
(_b = data.user) !== null && _b !== void 0 ? _b : this.createStoredAnonymousUser(suffix, new Date().toISOString());
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return fallbackUser;
|
|
86
197
|
});
|
|
87
198
|
}
|
|
88
199
|
clearConversation(appId, userId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-storage.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/base-storage.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"base-storage.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/base-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import { BaseStorageRepository } from './base-storage';
|
|
2
|
+
import { parseConversationData } from './parse-conversation-data';
|
|
2
3
|
export class BrowserStorageRepository extends BaseStorageRepository {
|
|
3
4
|
getData(key) {
|
|
4
5
|
const stored = this.storage.getItem(key);
|
|
5
6
|
if (stored) {
|
|
6
7
|
try {
|
|
7
|
-
|
|
8
|
-
return {
|
|
9
|
-
messages: Array.isArray(parsed.messages) ? parsed.messages : [],
|
|
10
|
-
user: parsed.user || null,
|
|
11
|
-
};
|
|
8
|
+
return parseConversationData(JSON.parse(stored));
|
|
12
9
|
}
|
|
13
10
|
catch (error) {
|
|
14
11
|
console.error('Failed to parse conversation data:', error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-storage.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/browser-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"browser-storage.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/browser-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAGjE,MAAM,OAAgB,wBAAyB,SAAQ,qBAAqB;IAGhE,OAAO,CAAC,GAAW;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAExC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,OAAO,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;YAClD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAES,OAAO,CAAC,GAAW,EAAE,IAAsB;QACnD,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK;gBACtB,CAAC,KAAK,CAAC,IAAI,KAAK,oBAAoB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;YAC1E,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;YAC1E,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAES,UAAU,CAAC,GAAW;QAC9B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;IAC9B,CAAC;IAES,iBAAiB,CAAC,MAAc;QACxC,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAC/B,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAChB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Framework default storage key prefix (`{prefix}:{appId}:{userId}`). */
|
|
2
|
+
export declare const DEFAULT_KEY_PREFIX = "botonic-webchat";
|
|
3
|
+
/** Conversation user id used before a Hubtype user exists (empty — filled when a real session starts). */
|
|
4
|
+
export declare const APP_CLIENT_STATE_PLACEHOLDER_USER_ID = "";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Framework default storage key prefix (`{prefix}:{appId}:{userId}`). */
|
|
2
|
+
export const DEFAULT_KEY_PREFIX = 'botonic-webchat';
|
|
3
|
+
/** Conversation user id used before a Hubtype user exists (empty — filled when a real session starts). */
|
|
4
|
+
export const APP_CLIENT_STATE_PLACEHOLDER_USER_ID = '';
|
|
5
|
+
//# sourceMappingURL=client-state-constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-state-constants.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/client-state-constants.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,CAAA;AAEnD,0GAA0G;AAC1G,MAAM,CAAC,MAAM,oCAAoC,GAAG,EAAE,CAAA"}
|
|
@@ -1,20 +1,22 @@
|
|
|
1
|
+
import { DEFAULT_KEY_PREFIX } from './client-state-constants';
|
|
1
2
|
import { InMemoryRepository } from './in-memory';
|
|
2
3
|
import { LocalStorageRepository } from './local-storage';
|
|
3
4
|
import { SessionStorageRepository } from './session-storage';
|
|
4
5
|
export function createStorageRepository(config) {
|
|
5
|
-
const { type = 'localStorage', keyPrefix =
|
|
6
|
+
const { type = 'localStorage', keyPrefix = DEFAULT_KEY_PREFIX } = config || {};
|
|
7
|
+
const repositoryOptions = { keyPrefix };
|
|
6
8
|
if (type === 'inMemory') {
|
|
7
|
-
return new InMemoryRepository();
|
|
9
|
+
return new InMemoryRepository(repositoryOptions);
|
|
8
10
|
}
|
|
9
11
|
if (typeof window === 'undefined') {
|
|
10
|
-
return new InMemoryRepository();
|
|
12
|
+
return new InMemoryRepository(repositoryOptions);
|
|
11
13
|
}
|
|
12
14
|
if (type === 'sessionStorage' && window.sessionStorage) {
|
|
13
|
-
return new SessionStorageRepository(
|
|
15
|
+
return new SessionStorageRepository(repositoryOptions);
|
|
14
16
|
}
|
|
15
17
|
if (type === 'localStorage' && window.localStorage) {
|
|
16
|
-
return new LocalStorageRepository(
|
|
18
|
+
return new LocalStorageRepository(repositoryOptions);
|
|
17
19
|
}
|
|
18
|
-
return new InMemoryRepository();
|
|
20
|
+
return new InMemoryRepository(repositoryOptions);
|
|
19
21
|
}
|
|
20
22
|
//# sourceMappingURL=factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAG5D,MAAM,UAAU,uBAAuB,CACrC,MAAsB;IAEtB,MAAM,EAAE,IAAI,GAAG,cAAc,EAAE,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAG5D,MAAM,UAAU,uBAAuB,CACrC,MAAsB;IAEtB,MAAM,EAAE,IAAI,GAAG,cAAc,EAAE,SAAS,GAAG,kBAAkB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAC9E,MAAM,iBAAiB,GAAG,EAAE,SAAS,EAAE,CAAA;IAEvC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,IAAI,kBAAkB,CAAC,iBAAiB,CAAC,CAAA;IAClD,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,IAAI,kBAAkB,CAAC,iBAAiB,CAAC,CAAA;IAClD,CAAC;IAED,IAAI,IAAI,KAAK,gBAAgB,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QACvD,OAAO,IAAI,wBAAwB,CAAC,iBAAiB,CAAC,CAAA;IACxD,CAAC;IAED,IAAI,IAAI,KAAK,cAAc,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACnD,OAAO,IAAI,sBAAsB,CAAC,iBAAiB,CAAC,CAAA;IACtD,CAAC;IAED,OAAO,IAAI,kBAAkB,CAAC,iBAAiB,CAAC,CAAA;AAClD,CAAC"}
|
|
@@ -15,7 +15,13 @@ export class InMemoryRepository extends BaseStorageRepository {
|
|
|
15
15
|
this.storage.delete(key);
|
|
16
16
|
}
|
|
17
17
|
getKeysWithPrefix(prefix) {
|
|
18
|
-
|
|
18
|
+
const keys = [];
|
|
19
|
+
for (const key of this.storage.keys()) {
|
|
20
|
+
if (key.startsWith(prefix)) {
|
|
21
|
+
keys.push(key);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return keys;
|
|
19
25
|
}
|
|
20
26
|
}
|
|
21
27
|
//# sourceMappingURL=in-memory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/in-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAGtD,MAAM,OAAO,kBAAmB,SAAQ,qBAAqB;IAA7D;;QACU,YAAO,GAAG,IAAI,GAAG,EAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"in-memory.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/in-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAGtD,MAAM,OAAO,kBAAmB,SAAQ,qBAAqB;IAA7D;;QACU,YAAO,GAAG,IAAI,GAAG,EAA4B,CAAA;IAuBvD,CAAC;IArBW,OAAO,CAAC,GAAW;;QAC3B,OAAO,MAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,mCAAI,IAAI,CAAA;IACtC,CAAC;IAES,OAAO,CAAC,GAAW,EAAE,IAAsB;QACnD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAC7B,CAAC;IAES,UAAU,CAAC,GAAW;QAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;IAES,iBAAiB,CAAC,MAAc;QACxC,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACtC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAChB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
|
|
@@ -3,5 +3,6 @@ export { BrowserStorageRepository } from './browser-storage';
|
|
|
3
3
|
export { createStorageRepository } from './factory';
|
|
4
4
|
export { InMemoryRepository } from './in-memory';
|
|
5
5
|
export { LocalStorageRepository } from './local-storage';
|
|
6
|
+
export { resetWebchatSessionInitLocksForTests, resolveWebchatSessionUser, } from './resolve-webchat-session-user';
|
|
6
7
|
export { SessionStorageRepository } from './session-storage';
|
|
7
|
-
export type { ConversationData, StorageConfig, StorageRepository, StorageType, StoredMessage, WebchatHubtypeUser, } from './types';
|
|
8
|
+
export type { AppClientState, ConversationData, StorageConfig, StorageRepository, StorageType, StoredMessage, WebchatHubtypeUser, } from './types';
|
|
@@ -3,5 +3,6 @@ export { BrowserStorageRepository } from './browser-storage';
|
|
|
3
3
|
export { createStorageRepository } from './factory';
|
|
4
4
|
export { InMemoryRepository } from './in-memory';
|
|
5
5
|
export { LocalStorageRepository } from './local-storage';
|
|
6
|
+
export { resetWebchatSessionInitLocksForTests, resolveWebchatSessionUser, } from './resolve-webchat-session-user';
|
|
6
7
|
export { SessionStorageRepository } from './session-storage';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EACL,oCAAoC,EACpC,yBAAyB,GAC1B,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function parseConversationData(parsed) {
|
|
2
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
3
|
+
return { messages: [], user: null };
|
|
4
|
+
}
|
|
5
|
+
const record = parsed;
|
|
6
|
+
const customRaw = record.custom;
|
|
7
|
+
let custom;
|
|
8
|
+
if (customRaw && typeof customRaw === 'object') {
|
|
9
|
+
custom = customRaw;
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
messages: Array.isArray(record.messages)
|
|
13
|
+
? record.messages
|
|
14
|
+
: [],
|
|
15
|
+
user: record.user || null,
|
|
16
|
+
custom,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=parse-conversation-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-conversation-data.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/parse-conversation-data.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACnD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACrC,CAAC;IACD,MAAM,MAAM,GAAG,MAAiC,CAAA;IAChD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAA;IAC/B,IAAI,MAAkC,CAAA;IACtC,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC/C,MAAM,GAAG,SAA2B,CAAA;IACtC,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;YACtC,CAAC,CAAE,MAAM,CAAC,QAAyC;YACnD,CAAC,CAAC,EAAE;QACN,IAAI,EAAG,MAAM,CAAC,IAAiC,IAAI,IAAI;QACvD,MAAM;KACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HubtypeUser } from '@botonic/shared';
|
|
2
|
+
import type { StorageRepository } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Returns the persisted session user for an app, or creates and saves one exactly once
|
|
5
|
+
* even when multiple webchat inits run in parallel (e.g. React Strict Mode remount).
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveWebchatSessionUser(storage: StorageRepository, appId: string, createAnonymous: () => HubtypeUser): Promise<HubtypeUser>;
|
|
8
|
+
/** @internal */
|
|
9
|
+
export declare function resetWebchatSessionInitLocksForTests(): void;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
const pendingSessionByAppId = new Map();
|
|
3
|
+
/**
|
|
4
|
+
* Returns the persisted session user for an app, or creates and saves one exactly once
|
|
5
|
+
* even when multiple webchat inits run in parallel (e.g. React Strict Mode remount).
|
|
6
|
+
*/
|
|
7
|
+
export function resolveWebchatSessionUser(storage, appId, createAnonymous) {
|
|
8
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
9
|
+
const existing = yield storage.findLastUserSession(appId);
|
|
10
|
+
if (existing) {
|
|
11
|
+
return existing;
|
|
12
|
+
}
|
|
13
|
+
const inFlight = pendingSessionByAppId.get(appId);
|
|
14
|
+
if (inFlight) {
|
|
15
|
+
return inFlight;
|
|
16
|
+
}
|
|
17
|
+
const promise = (() => __awaiter(this, void 0, void 0, function* () {
|
|
18
|
+
const again = yield storage.findLastUserSession(appId);
|
|
19
|
+
if (again) {
|
|
20
|
+
return again;
|
|
21
|
+
}
|
|
22
|
+
const user = createAnonymous();
|
|
23
|
+
yield storage.saveUser(appId, user);
|
|
24
|
+
return user;
|
|
25
|
+
}))();
|
|
26
|
+
pendingSessionByAppId.set(appId, promise);
|
|
27
|
+
try {
|
|
28
|
+
return yield promise;
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
if (pendingSessionByAppId.get(appId) === promise) {
|
|
32
|
+
pendingSessionByAppId.delete(appId);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/** @internal */
|
|
38
|
+
export function resetWebchatSessionInitLocksForTests() {
|
|
39
|
+
pendingSessionByAppId.clear();
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=resolve-webchat-session-user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-webchat-session-user.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/resolve-webchat-session-user.ts"],"names":[],"mappings":";AAIA,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAgC,CAAA;AAErE;;;GAGG;AACH,MAAM,UAAgB,yBAAyB,CAC7C,OAA0B,EAC1B,KAAa,EACb,eAAkC;;QAElC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;QACzD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACjD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,GAAS,EAAE;YAC1B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;YACtD,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAA;YACd,CAAC;YACD,MAAM,IAAI,GAAG,eAAe,EAAE,CAAA;YAC9B,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACnC,OAAO,IAAI,CAAA;QACb,CAAC,CAAA,CAAC,EAAE,CAAA;QAEJ,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAEzC,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAA;QACtB,CAAC;gBAAS,CAAC;YACT,IAAI,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC;gBACjD,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACrC,CAAC;QACH,CAAC;IACH,CAAC;CAAA;AAED,gBAAgB;AAChB,MAAM,UAAU,oCAAoC;IAClD,qBAAqB,CAAC,KAAK,EAAE,CAAA;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-test-helpers.js","sourceRoot":"","sources":["../../../../../../../../../libs/botonic/webchat-core/src/lib/infra/repositories/storage/storage-test-helpers.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,OAAO;QACL,EAAE;QACF,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,OAAO;KACvB,CAAA;AACH,CAAC"}
|
|
@@ -9,9 +9,12 @@ export interface WebchatHubtypeUser extends HubtypeUser {
|
|
|
9
9
|
botId?: string;
|
|
10
10
|
chatId?: string;
|
|
11
11
|
}
|
|
12
|
+
/** Flat attribute bag on `ConversationData.custom` (app-specific attrs via `WebchatClientState`). */
|
|
13
|
+
export type AppClientState = Record<string, unknown>;
|
|
12
14
|
export interface ConversationData {
|
|
13
15
|
messages: StoredMessage[];
|
|
14
16
|
user: WebchatHubtypeUser | null;
|
|
17
|
+
custom?: AppClientState;
|
|
15
18
|
}
|
|
16
19
|
export interface StorageRepository {
|
|
17
20
|
saveMessage(appId: string, userId: string, message: StoredMessage): Promise<void>;
|
|
@@ -23,9 +26,17 @@ export interface StorageRepository {
|
|
|
23
26
|
findLastUserSession(appId: string): Promise<HubtypeUser | null>;
|
|
24
27
|
clearConversation(appId: string, userId: string): Promise<void>;
|
|
25
28
|
clearAppData(appId: string): Promise<void>;
|
|
29
|
+
findAppClientState(appId: string): Promise<AppClientState>;
|
|
30
|
+
saveAppClientState(appId: string, state: AppClientState): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Merges placeholder-key client state into the active user conversation and
|
|
33
|
+
* deletes the orphan `prefix:appId:` row (e.g. after pre-user `saveAppClientState`).
|
|
34
|
+
*/
|
|
35
|
+
reconcilePlaceholderConversation(appId: string): Promise<void>;
|
|
26
36
|
}
|
|
27
37
|
export type StorageType = 'localStorage' | 'sessionStorage' | 'inMemory';
|
|
28
38
|
export interface StorageConfig {
|
|
29
39
|
type?: StorageType;
|
|
40
|
+
/** Storage key prefix (default `botonic-webchat`; apps may set e.g. `botonicLocalState`). */
|
|
30
41
|
keyPrefix?: string;
|
|
31
42
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface EmbedTriggerContext {
|
|
2
|
+
firstHoverExpandShown: boolean;
|
|
3
|
+
}
|
|
4
|
+
export type EmbedTriggerInput = Record<string, never>;
|
|
5
|
+
export type EmbedTriggerEvent = {
|
|
6
|
+
type: 'MARK_FIRST_HOVER_EXPAND_SHOWN';
|
|
7
|
+
};
|
|
8
|
+
/** In-memory first-visit hover expand flag (not written to `WebchatClientState`). */
|
|
9
|
+
export declare const embedTriggerMachine: import("xstate").StateMachine<EmbedTriggerContext, EmbedTriggerEvent, {}, never, never, never, never, "ready", string, EmbedTriggerInput, import("xstate").NonReducibleUnknown, import("xstate").EventObject, import("xstate").MetaObject, {
|
|
10
|
+
id: "embedTrigger";
|
|
11
|
+
states: {
|
|
12
|
+
readonly ready: {};
|
|
13
|
+
};
|
|
14
|
+
}>;
|
|
15
|
+
export declare function isEmbedTriggerHydrated(state: {
|
|
16
|
+
matches: (value: string) => boolean;
|
|
17
|
+
}): boolean;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { assign, setup } from 'xstate';
|
|
2
|
+
/** In-memory first-visit hover expand flag (not written to `WebchatClientState`). */
|
|
3
|
+
export const embedTriggerMachine = setup({
|
|
4
|
+
types: {
|
|
5
|
+
context: {},
|
|
6
|
+
input: {},
|
|
7
|
+
events: {},
|
|
8
|
+
},
|
|
9
|
+
}).createMachine({
|
|
10
|
+
id: 'embedTrigger',
|
|
11
|
+
initial: 'ready',
|
|
12
|
+
context: {
|
|
13
|
+
firstHoverExpandShown: false,
|
|
14
|
+
},
|
|
15
|
+
states: {
|
|
16
|
+
ready: {
|
|
17
|
+
on: {
|
|
18
|
+
MARK_FIRST_HOVER_EXPAND_SHOWN: {
|
|
19
|
+
guard: ({ context }) => !context.firstHoverExpandShown,
|
|
20
|
+
actions: assign({ firstHoverExpandShown: true }),
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
export function isEmbedTriggerHydrated(state) {
|
|
27
|
+
return state.matches('ready');
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=embed-trigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embed-trigger.js","sourceRoot":"","sources":["../../../../../../../libs/botonic/webchat-core/src/lib/machines/embed-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAUtC,qFAAqF;AACrF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;IACvC,KAAK,EAAE;QACL,OAAO,EAAE,EAAyB;QAClC,KAAK,EAAE,EAAuB;QAC9B,MAAM,EAAE,EAAuB;KAChC;CACF,CAAC,CAAC,aAAa,CAAC;IACf,EAAE,EAAE,cAAc;IAClB,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE;QACP,qBAAqB,EAAE,KAAK;KAC7B;IACD,MAAM,EAAE;QACN,KAAK,EAAE;YACL,EAAE,EAAE;gBACF,6BAA6B,EAAE;oBAC7B,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB;oBACtD,OAAO,EAAE,MAAM,CAAC,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC;iBACjD;aACF;SACF;KACF;CACF,CAAC,CAAA;AAEF,MAAM,UAAU,sBAAsB,CAAC,KAEtC;IACC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AAC/B,CAAC"}
|