@sinequa/assistant 3.1.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/chat/chat-message/chat-message.component.d.ts +157 -0
- package/chat/chat-reference/chat-reference.component.d.ts +118 -0
- package/chat/chat-settings-v3/chat-settings-v3.component.d.ts +41 -0
- package/chat/chat.component.d.ts +1112 -0
- package/chat/chat.service.d.ts +1046 -0
- package/chat/format-icon/format-icon.component.d.ts +10 -0
- package/chat/format-icon/icons.d.ts +5 -0
- package/chat/index.d.ts +5 -0
- package/chat/initials-avatar/initials-avatar.component.d.ts +35 -0
- package/chat/instance-manager.service.d.ts +28 -0
- package/chat/messages/de.d.ts +4 -0
- package/chat/messages/en.d.ts +4 -0
- package/chat/messages/fr.d.ts +4 -0
- package/chat/messages/index.d.ts +4 -0
- package/chat/public-api.d.ts +11 -0
- package/chat/rest-chat.service.d.ts +28 -0
- package/chat/saved-chats/saved-chats.component.d.ts +37 -0
- package/chat/styles/assistant.scss +61 -0
- package/chat/styles/references.scss +23 -0
- package/chat/types.d.ts +1241 -0
- package/chat/websocket-chat.service.d.ts +97 -0
- package/esm2020/chat/chat-message/chat-message.component.mjs +181 -0
- package/esm2020/chat/chat-reference/chat-reference.component.mjs +40 -0
- package/esm2020/chat/chat-settings-v3/chat-settings-v3.component.mjs +103 -0
- package/esm2020/chat/chat.component.mjs +369 -0
- package/esm2020/chat/chat.service.mjs +185 -0
- package/esm2020/chat/format-icon/format-icon.component.mjs +23 -0
- package/esm2020/chat/format-icon/icons.mjs +138 -0
- package/esm2020/chat/initials-avatar/initials-avatar.component.mjs +60 -0
- package/esm2020/chat/instance-manager.service.mjs +46 -0
- package/esm2020/chat/messages/de.mjs +4 -0
- package/esm2020/chat/messages/en.mjs +4 -0
- package/esm2020/chat/messages/fr.mjs +4 -0
- package/esm2020/chat/messages/index.mjs +9 -0
- package/esm2020/chat/public-api.mjs +12 -0
- package/esm2020/chat/rest-chat.service.mjs +164 -0
- package/esm2020/chat/saved-chats/saved-chats.component.mjs +132 -0
- package/esm2020/chat/sinequa-assistant-chat.mjs +5 -0
- package/esm2020/chat/types.mjs +85 -0
- package/esm2020/chat/websocket-chat.service.mjs +430 -0
- package/esm2020/public-api.mjs +3 -0
- package/esm2020/sinequa-assistant.mjs +5 -0
- package/fesm2015/sinequa-assistant-chat.mjs +1925 -0
- package/fesm2015/sinequa-assistant-chat.mjs.map +1 -0
- package/fesm2015/sinequa-assistant.mjs +9 -0
- package/fesm2015/sinequa-assistant.mjs.map +1 -0
- package/fesm2020/sinequa-assistant-chat.mjs +1911 -0
- package/fesm2020/sinequa-assistant-chat.mjs.map +1 -0
- package/fesm2020/sinequa-assistant.mjs +9 -0
- package/fesm2020/sinequa-assistant.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +46 -0
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { Injectable, inject } from "@angular/core";
|
|
2
|
+
import { AuthenticationService } from "@sinequa/core/login";
|
|
3
|
+
import { SignalRWebService } from "@sinequa/core/web-services";
|
|
4
|
+
import { HttpTransportType, LogLevel } from "@microsoft/signalr";
|
|
5
|
+
import { ChatService } from "./chat.service";
|
|
6
|
+
import { merge, fromEvent, Subject, catchError, filter, forkJoin, map, shareReplay, switchMap, tap, throwError, takeUntil } from "rxjs";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class WebSocketChatService extends ChatService {
|
|
9
|
+
constructor() {
|
|
10
|
+
super();
|
|
11
|
+
this.connectionBuilt$ = new Subject(); // Emit when the connection is built
|
|
12
|
+
this.connectionStarted$ = new Subject(); // Emit when the connection is started
|
|
13
|
+
this.messageHandlers = new Map();
|
|
14
|
+
this.actionMap = new Map();
|
|
15
|
+
this.content = "";
|
|
16
|
+
this.attachments = [];
|
|
17
|
+
this.signalRService = inject(SignalRWebService);
|
|
18
|
+
this.authenticationService = inject(AuthenticationService);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Initialize the chat process after the login is complete.
|
|
22
|
+
* It includes building and starting a connection, executing parallel requests for models and functions, and handling errors during the process.
|
|
23
|
+
*
|
|
24
|
+
* @returns An Observable<boolean> indicating the success of the initialization process.
|
|
25
|
+
*/
|
|
26
|
+
init() {
|
|
27
|
+
return this.loginService.events.pipe(filter((e) => e.type === 'login-complete'), tap(() => this.getRequestsUrl()),
|
|
28
|
+
// Build the connection and handle the completion with the connectionBuilt$ subject
|
|
29
|
+
switchMap(() => this.buildConnection()), tap(() => {
|
|
30
|
+
this.initMessageHandlers();
|
|
31
|
+
this.connectionBuilt$.next();
|
|
32
|
+
}),
|
|
33
|
+
// Start the connection and handle the completion with the connectionStarted$ subject
|
|
34
|
+
switchMap(() => this.startConnection()),
|
|
35
|
+
// Execute parallel requests for models and functions
|
|
36
|
+
switchMap(() => {
|
|
37
|
+
this.connectionStarted$.next();
|
|
38
|
+
return forkJoin([
|
|
39
|
+
this.listModels(),
|
|
40
|
+
this.listFunctions()
|
|
41
|
+
]);
|
|
42
|
+
}),
|
|
43
|
+
// Map the results of parallel requests to a boolean indicating success
|
|
44
|
+
map(([models, functions]) => {
|
|
45
|
+
this.initProcess$.next(true);
|
|
46
|
+
return !!models && !!functions;
|
|
47
|
+
}),
|
|
48
|
+
// Any errors during the process are caught, logged, and re-thrown to propagate the error further
|
|
49
|
+
catchError((error) => {
|
|
50
|
+
console.error('Error occurred:', error);
|
|
51
|
+
return throwError(() => error);
|
|
52
|
+
}),
|
|
53
|
+
// Cache and replay the emitted value for subsequent subscribers
|
|
54
|
+
shareReplay(1));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Define the assistant endpoint to use for the websocket requests
|
|
58
|
+
* It can be overridden by the app config
|
|
59
|
+
*/
|
|
60
|
+
getRequestsUrl() {
|
|
61
|
+
if (this.chatConfig$.value.globalSettings.websocketEndpoint) {
|
|
62
|
+
this.REQUEST_URL = this.chatConfig$.value.globalSettings.websocketEndpoint;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw new Error(`The property 'websocketEndpoint' must be provided when attempting to use 'WebSocket' in assistant instance`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
listModels() {
|
|
69
|
+
const modelsSubject = new Subject();
|
|
70
|
+
this.connection.on('ListModels', (res) => {
|
|
71
|
+
this.models = res.models?.filter(model => !!model.enable);
|
|
72
|
+
modelsSubject.next(this.models);
|
|
73
|
+
modelsSubject.complete();
|
|
74
|
+
});
|
|
75
|
+
// Send the request to get the list of models
|
|
76
|
+
this.connection.invoke('ListModels', { debug: this.chatConfig$.value.debug })
|
|
77
|
+
.catch(error => {
|
|
78
|
+
console.error('Error invoking ListModels:', error);
|
|
79
|
+
modelsSubject.complete();
|
|
80
|
+
return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection
|
|
81
|
+
});
|
|
82
|
+
return modelsSubject.asObservable();
|
|
83
|
+
}
|
|
84
|
+
listFunctions() {
|
|
85
|
+
const functionsSubject = new Subject();
|
|
86
|
+
this.connection.on('ListFunctions', (res) => {
|
|
87
|
+
this.functions = res.functions;
|
|
88
|
+
functionsSubject.next(this.functions);
|
|
89
|
+
functionsSubject.complete();
|
|
90
|
+
});
|
|
91
|
+
// Send the request to get the list of functions
|
|
92
|
+
this.connection.invoke('ListFunctions', { debug: this.chatConfig$.value.debug })
|
|
93
|
+
.catch(error => {
|
|
94
|
+
console.error('Error invoking ListFunctions:', error);
|
|
95
|
+
functionsSubject.complete();
|
|
96
|
+
return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection
|
|
97
|
+
});
|
|
98
|
+
return functionsSubject.asObservable();
|
|
99
|
+
}
|
|
100
|
+
fetch(messages, query = this.searchService.query) {
|
|
101
|
+
// Start streaming by invoking the Chat method
|
|
102
|
+
this.streaming$.next(true);
|
|
103
|
+
// Prepare the payload to send to the Chat method
|
|
104
|
+
const data = {
|
|
105
|
+
history: messages,
|
|
106
|
+
functions: this.chatConfig$.value.functions,
|
|
107
|
+
debug: this.chatConfig$.value.debug,
|
|
108
|
+
serviceSettings: this.chatConfig$.value.serviceSettings,
|
|
109
|
+
contextSettings: {
|
|
110
|
+
...this.chatConfig$.value.contextSettings,
|
|
111
|
+
app: this.appService.appName,
|
|
112
|
+
query
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
if (this.chatConfig$.value.saveChats) {
|
|
116
|
+
data.instanceId = this.chatInstanceId;
|
|
117
|
+
data.savedChatId = this.savedChatId;
|
|
118
|
+
}
|
|
119
|
+
let response = { role: "assistant", content: "", additionalProperties: { display: true } }; // here display: true is needed in order to be able to show the progress
|
|
120
|
+
// Create a Subject to signal completion
|
|
121
|
+
const completion$ = new Subject();
|
|
122
|
+
// Create observables for each non-global handler in the messageHandlers map (default and eventual custom ones) once it is triggered by the hub connection
|
|
123
|
+
const observables = Array
|
|
124
|
+
.from(this.messageHandlers.entries())
|
|
125
|
+
.filter(([eventName, eventHandler]) => !eventHandler.isGlobalHandler)
|
|
126
|
+
.map(([eventName, eventHandler]) => {
|
|
127
|
+
return fromEvent(this.connection, eventName).pipe(map((event) => eventHandler.handler(event)) // Execute the corresponding handler
|
|
128
|
+
);
|
|
129
|
+
});
|
|
130
|
+
// Then merge them into a single observable in order to simulate the streaming behavior
|
|
131
|
+
const combined$ = merge(...observables).pipe(takeUntil(completion$) // Complete the observable when completion$ emits
|
|
132
|
+
);
|
|
133
|
+
// Invoke the Chat method
|
|
134
|
+
this.connection.invoke('Chat', data)
|
|
135
|
+
.then(() => this.notifyAudit(this.chatHistory, this.chatConfig$.value.serviceSettings.service_id)) // When the server indicates it has successfully finished invoking the method, notify the audit service with the recent chat history
|
|
136
|
+
.catch(error => {
|
|
137
|
+
console.error('Error invoking Chat:', error);
|
|
138
|
+
return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection
|
|
139
|
+
})
|
|
140
|
+
.finally(() => {
|
|
141
|
+
this.streaming$.next(false); // Complete streaming regardless of success or error
|
|
142
|
+
this.actionMap.clear(); // Clear the actionMap
|
|
143
|
+
this.content = ""; // Clear the content
|
|
144
|
+
this.attachments = []; // Clear the attachments
|
|
145
|
+
this.executionTime = ""; // Clear the executionTime
|
|
146
|
+
completion$.next(); // Emit a signal to complete the observables
|
|
147
|
+
completion$.complete(); // Complete the subject
|
|
148
|
+
});
|
|
149
|
+
// Return the merged observables
|
|
150
|
+
return combined$.pipe(map(() => {
|
|
151
|
+
// Define $progress from the actionMap
|
|
152
|
+
const actions = Array.from(this.actionMap.values());
|
|
153
|
+
const $progress = actions.length > 0
|
|
154
|
+
? actions.map((a) => ({
|
|
155
|
+
title: a.displayName ?? "",
|
|
156
|
+
content: a.displayValue ?? "",
|
|
157
|
+
done: a.executionTime !== undefined,
|
|
158
|
+
time: a.executionTime,
|
|
159
|
+
}))
|
|
160
|
+
: undefined;
|
|
161
|
+
// Define the attachment used in the context of the response message
|
|
162
|
+
const $attachment = this.attachments;
|
|
163
|
+
// As soon as the first content or $progress is defined, the assistant is considered as streaming
|
|
164
|
+
if (!!this.content || $progress || $attachment.length > 0) {
|
|
165
|
+
response = { ...response, content: this.content, additionalProperties: { ...response.additionalProperties, $progress, $attachment } };
|
|
166
|
+
}
|
|
167
|
+
// Return the result
|
|
168
|
+
return { history: [...messages, response], executionTime: this.executionTime };
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
listSavedChat() {
|
|
172
|
+
const data = {
|
|
173
|
+
instanceId: this.chatInstanceId,
|
|
174
|
+
debug: this.chatConfig$.value.debug
|
|
175
|
+
};
|
|
176
|
+
this.connection.on('SavedChatList', (res) => {
|
|
177
|
+
this.savedChats$.next(res.savedChats); // emits the result to the savedChats$ subject
|
|
178
|
+
});
|
|
179
|
+
// Invoke the method SavedChatList
|
|
180
|
+
this.connection.invoke('SavedChatList', data)
|
|
181
|
+
.catch(error => {
|
|
182
|
+
console.error('Error invoking SavedChatList:', error);
|
|
183
|
+
return Promise.resolve();
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
getSavedChat(id) {
|
|
187
|
+
const savedChatSubject = new Subject();
|
|
188
|
+
const data = {
|
|
189
|
+
instanceId: this.chatInstanceId,
|
|
190
|
+
savedChatId: id,
|
|
191
|
+
debug: this.chatConfig$.value.debug
|
|
192
|
+
};
|
|
193
|
+
this.connection.on('SavedChatGet', (res) => {
|
|
194
|
+
savedChatSubject.next(res.savedChat);
|
|
195
|
+
savedChatSubject.complete();
|
|
196
|
+
});
|
|
197
|
+
// Invoke the method SavedChatGet
|
|
198
|
+
this.connection.invoke('SavedChatGet', data)
|
|
199
|
+
.catch(error => {
|
|
200
|
+
console.error('Error invoking SavedChatGet:', error);
|
|
201
|
+
savedChatSubject.complete();
|
|
202
|
+
return Promise.resolve();
|
|
203
|
+
});
|
|
204
|
+
return savedChatSubject.asObservable();
|
|
205
|
+
}
|
|
206
|
+
deleteSavedChat(ids) {
|
|
207
|
+
const deleteSavedChatSubject = new Subject();
|
|
208
|
+
const data = {
|
|
209
|
+
instanceId: this.chatInstanceId,
|
|
210
|
+
SavedChatIds: ids,
|
|
211
|
+
debug: this.chatConfig$.value.debug
|
|
212
|
+
};
|
|
213
|
+
this.connection.on('SavedChatDelete', (res) => {
|
|
214
|
+
deleteSavedChatSubject.next(res.deleteCount);
|
|
215
|
+
deleteSavedChatSubject.complete();
|
|
216
|
+
});
|
|
217
|
+
// Invoke the method SavedChatDelete
|
|
218
|
+
this.connection.invoke('SavedChatDelete', data)
|
|
219
|
+
.catch(error => {
|
|
220
|
+
console.error('Error invoking SavedChatDelete:', error);
|
|
221
|
+
deleteSavedChatSubject.complete();
|
|
222
|
+
return Promise.resolve();
|
|
223
|
+
});
|
|
224
|
+
return deleteSavedChatSubject.asObservable();
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Initialize out-of-the-box handlers
|
|
228
|
+
* It is a placeholder for non-streaming scenarios, where you invoke a specific hub method, and the server responds with a single message or a result
|
|
229
|
+
*/
|
|
230
|
+
initMessageHandlers() {
|
|
231
|
+
this.addMessageHandler("Debug", { handler: (debug) => console.log(debug),
|
|
232
|
+
isGlobalHandler: true });
|
|
233
|
+
this.addMessageHandler("ActionStart", { handler: (action) => this.actionMap.set(action.guid, action),
|
|
234
|
+
isGlobalHandler: false });
|
|
235
|
+
this.addMessageHandler("ActionResult", {
|
|
236
|
+
handler: (action) => this.actionMap.set(action.guid, { ...this.actionMap.get(action.guid), ...action }),
|
|
237
|
+
isGlobalHandler: false
|
|
238
|
+
});
|
|
239
|
+
this.addMessageHandler("ActionStop", {
|
|
240
|
+
handler: (action) => this.actionMap.set(action.guid, { ...this.actionMap.get(action.guid), ...action }),
|
|
241
|
+
isGlobalHandler: false
|
|
242
|
+
});
|
|
243
|
+
this.addMessageHandler("ContextMessage", {
|
|
244
|
+
handler: (message) => this.attachments.push(message.metadata),
|
|
245
|
+
isGlobalHandler: false
|
|
246
|
+
});
|
|
247
|
+
this.addMessageHandler("Message", {
|
|
248
|
+
handler: (message) => this.content += message ?? "",
|
|
249
|
+
isGlobalHandler: false
|
|
250
|
+
});
|
|
251
|
+
this.addMessageHandler("History", {
|
|
252
|
+
handler: (history) => {
|
|
253
|
+
this.chatHistory = history.history;
|
|
254
|
+
this.executionTime = history.executionTime;
|
|
255
|
+
},
|
|
256
|
+
isGlobalHandler: false
|
|
257
|
+
});
|
|
258
|
+
this.addMessageHandler("Error", {
|
|
259
|
+
handler: (error) => {
|
|
260
|
+
console.error(error);
|
|
261
|
+
this.notificationsService.error(error);
|
|
262
|
+
},
|
|
263
|
+
isGlobalHandler: true
|
|
264
|
+
});
|
|
265
|
+
this.addMessageHandler("Quota", {
|
|
266
|
+
handler: (message) => {
|
|
267
|
+
if (message.quota.maxQuotaReached) {
|
|
268
|
+
const msg = `Sorry, you have exceeded the allowed quota. Please retry starting from ${this.formatDateTime(message.quota.nextResetUTC)}.`;
|
|
269
|
+
console.error(msg);
|
|
270
|
+
this.notificationsService.error(msg);
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
isGlobalHandler: true
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Override and register the entire messageHandlers map by merging the provided map with the default one
|
|
278
|
+
* @param messageHandlers
|
|
279
|
+
*/
|
|
280
|
+
overrideMessageHandlers(messageHandlers) {
|
|
281
|
+
// Clear the already registered global chat handlers before merging the new ones
|
|
282
|
+
this.messageHandlers.forEach((eventHandler, eventName) => {
|
|
283
|
+
if (eventHandler.isGlobalHandler) {
|
|
284
|
+
this.unsubscribeMessageHandler(eventName);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
// Merge the new event handlers with the existing ones
|
|
288
|
+
this.messageHandlers = new Map([...this.messageHandlers, ...messageHandlers]);
|
|
289
|
+
// Register the global chat handlers among the merged map
|
|
290
|
+
this.messageHandlers.forEach((eventHandler, eventName) => {
|
|
291
|
+
if (eventHandler.isGlobalHandler) {
|
|
292
|
+
this.registerMessageHandler(eventName, eventHandler);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Add a listener for a specific event.
|
|
298
|
+
* If a listener for this same event already exists, it will be overridden.
|
|
299
|
+
* If the listener has "isChatGlobalHandler" set to true, it will be registered to the hub connection.
|
|
300
|
+
* @param eventName Name of the event to register a listener for
|
|
301
|
+
* @param eventHandler The handler to be called when the event is received
|
|
302
|
+
*/
|
|
303
|
+
addMessageHandler(eventName, eventHandler) {
|
|
304
|
+
this.messageHandlers.set(eventName, eventHandler);
|
|
305
|
+
if (eventHandler.isGlobalHandler) {
|
|
306
|
+
this.registerMessageHandler(eventName, eventHandler);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Dynamically register a listener for a specific event.
|
|
311
|
+
* If a listener for this event already exists, it will be overridden.
|
|
312
|
+
* @param eventName Name of the event to register a listener for
|
|
313
|
+
* @param eventHandler The handler to be called when the event is received
|
|
314
|
+
*/
|
|
315
|
+
registerMessageHandler(eventName, eventHandler) {
|
|
316
|
+
if (!this.connection) {
|
|
317
|
+
console.log("No connection found to register the listener" + eventName);
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
this.connection.on(eventName, (data) => {
|
|
321
|
+
eventHandler.handler(data);
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Remove a listener for a specific event from the messageHandlers map and unsubscribe from receiving messages for this event from the SignalR hub.
|
|
326
|
+
* @param eventName Name of the event to remove the listener for
|
|
327
|
+
*/
|
|
328
|
+
removeMessageHandler(eventName) {
|
|
329
|
+
this.messageHandlers.delete(eventName);
|
|
330
|
+
this.unsubscribeMessageHandler(eventName);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Unsubscribe from receiving messages for a specific event from the SignalR hub.
|
|
334
|
+
* ALL its related listeners will be removed from hub connection
|
|
335
|
+
* This is needed to prevent accumulating old listeners when overriding the entire messageHandlers map
|
|
336
|
+
* @param eventName Name of the event
|
|
337
|
+
*/
|
|
338
|
+
unsubscribeMessageHandler(eventName) {
|
|
339
|
+
this.connection.off(eventName);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Build a connection to the signalR websocket and register default listeners to the methods defined in the server hub class
|
|
343
|
+
* @param options The options for the connection. It overrides the default options
|
|
344
|
+
* @param logLevel Define the log level displayed in the console
|
|
345
|
+
* @returns Promise that resolves when the connection is built
|
|
346
|
+
*/
|
|
347
|
+
buildConnection(options) {
|
|
348
|
+
return new Promise((resolve, reject) => {
|
|
349
|
+
if (!this.REQUEST_URL) {
|
|
350
|
+
reject(new Error("No endpoint provided to connect the websocket to"));
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
const logLevel = this.getLogLevel();
|
|
354
|
+
this.connection = this.signalRService.buildConnection(this.REQUEST_URL, { ...this.defaultOptions, ...options }, logLevel);
|
|
355
|
+
resolve();
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Start the connection
|
|
360
|
+
* @returns Promise that resolves when the connection is started
|
|
361
|
+
*/
|
|
362
|
+
startConnection() {
|
|
363
|
+
return this.signalRService.startConnection(this.connection);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Stop the connection
|
|
367
|
+
* @returns Promise that resolves when the connection is stopped
|
|
368
|
+
*/
|
|
369
|
+
stopConnection() {
|
|
370
|
+
return this.signalRService.stopConnection(this.connection);
|
|
371
|
+
}
|
|
372
|
+
getTransports() {
|
|
373
|
+
switch (this.chatConfig$.value?.globalSettings.signalRTransport) {
|
|
374
|
+
case "WebSockets":
|
|
375
|
+
return HttpTransportType.WebSockets;
|
|
376
|
+
case "ServerSentEvents":
|
|
377
|
+
return HttpTransportType.ServerSentEvents;
|
|
378
|
+
case "LongPolling":
|
|
379
|
+
return HttpTransportType.LongPolling;
|
|
380
|
+
default:
|
|
381
|
+
return HttpTransportType.None;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
getLogLevel() {
|
|
385
|
+
switch (this.chatConfig$.value?.globalSettings.signalRLogLevel) {
|
|
386
|
+
case "Critical":
|
|
387
|
+
return LogLevel.Critical; // Log level for diagnostic messages that indicate a failure that will terminate the entire application.
|
|
388
|
+
case "Debug":
|
|
389
|
+
return LogLevel.Debug; // Log level for low severity diagnostic messages.
|
|
390
|
+
case "Error":
|
|
391
|
+
return LogLevel.Error; // Log level for diagnostic messages that indicate a failure in the current operation.
|
|
392
|
+
case "Information":
|
|
393
|
+
return LogLevel.Information; // Log level for informational diagnostic messages.
|
|
394
|
+
case "None":
|
|
395
|
+
return LogLevel.None; // The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted.
|
|
396
|
+
case "Trace":
|
|
397
|
+
return LogLevel.Trace; // Log level for very low severity diagnostic messages.
|
|
398
|
+
case "Warning":
|
|
399
|
+
return LogLevel.Warning; // Log level for diagnostic messages that indicate a non-fatal problem.
|
|
400
|
+
default:
|
|
401
|
+
return LogLevel.None; // The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted.
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
get defaultOptions() {
|
|
405
|
+
let headers = {
|
|
406
|
+
"sinequa-force-camel-case": "true",
|
|
407
|
+
"x-language": this.intlService.currentLocale.name,
|
|
408
|
+
"ui-language": this.intlService.currentLocale.name,
|
|
409
|
+
};
|
|
410
|
+
if (this.authenticationService.processedCredentials) {
|
|
411
|
+
headers = { ...headers, "sinequa-csrf-token": this.authenticationService.processedCredentials.data.csrfToken };
|
|
412
|
+
}
|
|
413
|
+
;
|
|
414
|
+
// For the first GET request sent by signalR to start a WebSocket protocol,
|
|
415
|
+
// as far as we know, signalR only lets us tweak the request with this access token factory
|
|
416
|
+
// so we pass along the Sinequa CSRF token to pass the CSRF check..
|
|
417
|
+
return {
|
|
418
|
+
transport: this.getTransports(),
|
|
419
|
+
withCredentials: true,
|
|
420
|
+
headers,
|
|
421
|
+
accessTokenFactory: () => this.authenticationService.processedCredentials?.data?.csrfToken || ""
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
WebSocketChatService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WebSocketChatService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
426
|
+
WebSocketChatService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WebSocketChatService });
|
|
427
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WebSocketChatService, decorators: [{
|
|
428
|
+
type: Injectable
|
|
429
|
+
}], ctorParameters: function () { return []; } });
|
|
430
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L3dlYnNvY2tldC1jaGF0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFxQixpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxpQkFBaUIsRUFBaUIsUUFBUSxFQUFrQixNQUFNLG9CQUFvQixDQUFDO0FBRWhHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBR3BKLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxXQUFXO0lBZ0JuRDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBZEgscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQyxDQUFDLG9DQUFvQztRQUM1RSx1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDLENBQUMsc0NBQXNDO1FBRS9FLG9CQUFlLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFOUQsY0FBUyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBQzdDLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFFYixnQkFBVyxHQUE0QixFQUFFLENBQUM7UUFFM0MsbUJBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzQywwQkFBcUIs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Q0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxJQUFJLEVBQUU7U0FDakcsQ0FBQTtJQUNILENBQUM7O2lIQTFmVSxvQkFBb0I7cUhBQXBCLG9CQUFvQjsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2xvZ2luXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uT3B0aW9ucywgU2lnbmFsUldlYlNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS93ZWItc2VydmljZXNcIjtcbmltcG9ydCB7IEh0dHBUcmFuc3BvcnRUeXBlLCBIdWJDb25uZWN0aW9uLCBMb2dMZXZlbCwgTWVzc2FnZUhlYWRlcnMgfSBmcm9tIFwiQG1pY3Jvc29mdC9zaWduYWxyXCI7XG5pbXBvcnQgeyBBY3Rpb25NZXNzYWdlLCBBY3Rpb25SZXN1bHRFdmVudCwgQWN0aW9uU3RhcnRFdmVudCwgQWN0aW9uU3RvcEV2ZW50LCBNZXNzYWdlRXZlbnQsIENoYXRNZXNzYWdlLCBDaGF0UGF5bG9hZCwgQ2hhdFJlc3BvbnNlLCBHbGxtRnVuY3Rpb24sIEdsbG1Nb2RlbERlc2NyaXB0aW9uLCBNZXNzYWdlSGFuZGxlciwgSGlzdG9yeUV2ZW50LCBFcnJvckV2ZW50LCBRdW90YUV2ZW50LCBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIENvbnRleHRNZXNzYWdlRXZlbnQsIFNhdmVkQ2hhdEhpc3RvcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tIFwiLi9jaGF0LnNlcnZpY2VcIjtcbmltcG9ydCB7IG1lcmdlLCBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YmplY3QsIGNhdGNoRXJyb3IsIGZpbHRlciwgZm9ya0pvaW4sIG1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFwLCB0aHJvd0Vycm9yLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0Q2hhdFNlcnZpY2UgZXh0ZW5kcyBDaGF0U2VydmljZSB7XG5cbiAgcHVibGljIGNvbm5lY3Rpb246IEh1YkNvbm5lY3Rpb24gfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBjb25uZWN0aW9uQnVpbHQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGJ1aWx0XG4gIHB1YmxpYyBjb25uZWN0aW9uU3RhcnRlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgc3RhcnRlZFxuXG4gIHByaXZhdGUgbWVzc2FnZUhhbmRsZXJzOiBNYXA8c3RyaW5nLCBNZXNzYWdlSGFuZGxlcjxhbnk+PiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIGFjdGlvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBBY3Rpb25NZXNzYWdlPigpO1xuICBwcml2YXRlIGNvbnRlbnQgPSBcIlwiO1xuICBwcml2YXRlIGV4ZWN1dGlvblRpbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBhdHRhY2htZW50czogQ2hhdENvbnRleHRBdHRhY2htZW50W10gPSBbXTtcblxuICBwdWJsaWMgc2lnbmFsUlNlcnZpY2UgPSBpbmplY3QoU2lnbmFsUldlYlNlcnZpY2UpO1xuICBwdWJsaWMgYXV0aGVudGljYXRpb25TZXJ2aWNlID0gaW5qZWN0KEF1dGhlbnRpY2F0aW9uU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjaGF0IHByb2Nlc3MgYWZ0ZXIgdGhlIGxvZ2luIGlzIGNvbXBsZXRlLlxuICAgKiBJdCBpbmNsdWRlcyBidWlsZGluZyBhbmQgc3RhcnRpbmcgYSBjb25uZWN0aW9uLCBleGVjdXRpbmcgcGFyYWxsZWwgcmVxdWVzdHMgZm9yIG1vZGVscyBhbmQgZnVuY3Rpb25zLCBhbmQgaGFuZGxpbmcgZXJyb3JzIGR1cmluZyB0aGUgcHJvY2Vzcy5cbiAgICpcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZTxib29sZWFuPiBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgaW5pdCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5sb2dpblNlcnZpY2UuZXZlbnRzLnBpcGUoXG4gICAgICBmaWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gJ2xvZ2luLWNvbXBsZXRlJyksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5nZXRSZXF1ZXN0c1VybCgpKSxcbiAgICAgIC8vIEJ1aWxkIHRoZSBjb25uZWN0aW9uIGFuZCBoYW5kbGUgdGhlIGNvbXBsZXRpb24gd2l0aCB0aGUgY29ubmVjdGlvbkJ1aWx0JCBzdWJqZWN0XG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5idWlsZENvbm5lY3Rpb24oKSksXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXRNZXNzYWdlSGFuZGxlcnMoKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uQnVpbHQkLm5leHQoKTtcbiAgICAgIH0pLFxuICAgICAgLy8gU3RhcnQgdGhlIGNvbm5lY3Rpb24gYW5kIGhhbmRsZSB0aGUgY29tcGxldGlvbiB3aXRoIHRoZSBjb25uZWN0aW9uU3RhcnRlZCQgc3ViamVjdFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuc3RhcnRDb25uZWN0aW9uKCkpLFxuICAgICAgLy8gRXhlY3V0ZSBwYXJhbGxlbCByZXF1ZXN0cyBmb3IgbW9kZWxzIGFuZCBmdW5jdGlvbnNcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXJ0ZWQkLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKFtcbiAgICAgICAgICB0aGlzLmxpc3RNb2RlbHMoKSxcbiAgICAgICAgICB0aGlzLmxpc3RGdW5jdGlvbnMoKVxuICAgICAgICBdKVxuICAgICAgfSksXG4gICAgICAvLyBNYXAgdGhlIHJlc3VsdHMgb2YgcGFyYWxsZWwgcmVxdWVzdHMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzc1xuICAgICAgbWFwKChbbW9kZWxzLCBmdW5jdGlvbnNdKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdFByb2Nlc3MkLm5leHQodHJ1ZSk7XG4gICAgICAgIHJldHVybiAhIW1vZGVscyAmJiAhIWZ1bmN0aW9uc1xuICAgICAgfSksXG4gICAgICAvLyBBbnkgZXJyb3JzIGR1cmluZyB0aGUgcHJvY2VzcyBhcmUgY2F1Z2h0LCBsb2dnZWQsIGFuZCByZS10aHJvd24gdG8gcHJvcGFnYXRlIHRoZSBlcnJvciBmdXJ0aGVyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZDonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pLFxuICAgICAgLy8gQ2FjaGUgYW5kIHJlcGxheSB0aGUgZW1pdHRlZCB2YWx1ZSBmb3Igc3Vic2VxdWVudCBzdWJzY3JpYmVyc1xuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgYXNzaXN0YW50IGVuZHBvaW50IHRvIHVzZSBmb3IgdGhlIHdlYnNvY2tldCByZXF1ZXN0c1xuICAgKiBJdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwIGNvbmZpZ1xuICAgKi9cbiAgZ2V0UmVxdWVzdHNVcmwoKSB7XG4gICAgaWYgKHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmdsb2JhbFNldHRpbmdzLndlYnNvY2tldEVuZHBvaW50KSB7XG4gICAgICB0aGlzLlJFUVVFU1RfVVJMID0gdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZ2xvYmFsU2V0dGluZ3Mud2Vic29ja2V0RW5kcG9pbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5ICd3ZWJzb2NrZXRFbmRwb2ludCcgbXVzdCBiZSBwcm92aWRlZCB3aGVuIGF0dGVtcHRpbmcgdG8gdXNlICdXZWJTb2NrZXQnIGluIGFzc2lzdGFudCBpbnN0YW5jZWApO1xuICAgIH1cbiAgfVxuXG4gIGxpc3RNb2RlbHMoKTogT2JzZXJ2YWJsZTxHbGxtTW9kZWxEZXNjcmlwdGlvbltdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbW9kZWxzU3ViamVjdCA9IG5ldyBTdWJqZWN0PEdsbG1Nb2RlbERlc2NyaXB0aW9uW10gfCB1bmRlZmluZWQ+KCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdMaXN0TW9kZWxzJywgKHJlcykgPT4ge1xuICAgICAgdGhpcy5tb2RlbHMgPSByZXMubW9kZWxzPy5maWx0ZXIobW9kZWwgPT4gISFtb2RlbC5lbmFibGUpO1xuICAgICAgbW9kZWxzU3ViamVjdC5uZXh0KHRoaXMubW9kZWxzKTtcbiAgICAgIG1vZGVsc1N1YmplY3QuY29tcGxldGUoKVxuICAgIH0pO1xuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdCB0byBnZXQgdGhlIGxpc3Qgb2YgbW9kZWxzXG4gICAgdGhpcy5jb25uZWN0aW9uIS5pbnZva2UoJ0xpc3RNb2RlbHMnLCB7IGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWJ1ZyB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgTGlzdE1vZGVsczonLCBlcnJvcik7XG4gICAgICAgIG1vZGVsc1N1YmplY3QuY29tcGxldGUoKVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFJldHVybiBhIHJlc29sdmVkIHByb21pc2UgdG8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25cbiAgICAgIH0pXG5cbiAgICByZXR1cm4gbW9kZWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGxpc3RGdW5jdGlvbnMoKTogT2JzZXJ2YWJsZTxHbGxtRnVuY3Rpb25bXSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGZ1bmN0aW9uc1N1YmplY3QgPSBuZXcgU3ViamVjdDxHbGxtRnVuY3Rpb25bXSB8IHVuZGVmaW5lZD4oKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiEub24oJ0xpc3RGdW5jdGlvbnMnLCAocmVzKSA9PiB7XG4gICAgICB0aGlzLmZ1bmN0aW9ucyA9IHJlcy5mdW5jdGlvbnM7XG4gICAgICBmdW5jdGlvbnNTdWJqZWN0Lm5leHQodGhpcy5mdW5jdGlvbnMpO1xuICAgICAgZnVuY3Rpb25zU3ViamVjdC5jb21wbGV0ZSgpXG4gICAgfSk7XG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0IHRvIGdldCB0aGUgbGlzdCBvZiBmdW5jdGlvbnNcbiAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnTGlzdEZ1bmN0aW9ucycsIHsgZGVidWc6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlYnVnIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBMaXN0RnVuY3Rpb25zOicsIGVycm9yKTtcbiAgICAgICAgZnVuY3Rpb25zU3ViamVjdC5jb21wbGV0ZSgpXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gUmV0dXJuIGEgcmVzb2x2ZWQgcHJvbWlzZSB0byBoYW5kbGUgdGhlIGVycm9yIGFuZCBwcmV2ZW50IHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvblxuICAgICAgfSlcblxuICAgIHJldHVybiBmdW5jdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZmV0Y2gobWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIHF1ZXJ5ID0gdGhpcy5zZWFyY2hTZXJ2aWNlLnF1ZXJ5KTogT2JzZXJ2YWJsZTxDaGF0UmVzcG9uc2U+IHtcbiAgICAvLyBTdGFydCBzdHJlYW1pbmcgYnkgaW52b2tpbmcgdGhlIENoYXQgbWV0aG9kXG4gICAgdGhpcy5zdHJlYW1pbmckLm5leHQodHJ1ZSk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIENoYXQgbWV0aG9kXG4gICAgY29uc3QgZGF0YTogQ2hhdFBheWxvYWQgPSB7XG4gICAgICBoaXN0b3J5OiBtZXNzYWdlcyxcbiAgICAgIGZ1bmN0aW9uczogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZnVuY3Rpb25zLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlYnVnLFxuICAgICAgc2VydmljZVNldHRpbmdzOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5zZXJ2aWNlU2V0dGluZ3MsXG4gICAgICBjb250ZXh0U2V0dGluZ3M6IHtcbiAgICAgICAgLi4udGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuY29udGV4dFNldHRpbmdzLFxuICAgICAgICBhcHA6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lLFxuICAgICAgICBxdWVyeVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuc2F2ZUNoYXRzKSB7XG4gICAgICBkYXRhLmluc3RhbmNlSWQgPSB0aGlzLmNoYXRJbnN0YW5jZUlkO1xuICAgICAgZGF0YS5zYXZlZENoYXRJZCA9IHRoaXMuc2F2ZWRDaGF0SWQ7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlOiBDaGF0TWVzc2FnZSA9IHtyb2xlOiBcImFzc2lzdGFudFwiLCBjb250ZW50OiBcIlwiLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRydWV9fTsgLy8gaGVyZSBkaXNwbGF5OiB0cnVlIGlzIG5lZWRlZCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHNob3cgdGhlIHByb2dyZXNzXG5cbiAgICAvLyBDcmVhdGUgYSBTdWJqZWN0IHRvIHNpZ25hbCBjb21wbGV0aW9uXG4gICAgY29uc3QgY29tcGxldGlvbiQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLy8gQ3JlYXRlIG9ic2VydmFibGVzIGZvciBlYWNoIG5vbi1nbG9iYWwgaGFuZGxlciBpbiB0aGUgbWVzc2FnZUhhbmRsZXJzIG1hcCAoZGVmYXVsdCBhbmQgZXZlbnR1YWwgY3VzdG9tIG9uZXMpIG9uY2UgaXQgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBodWIgY29ubmVjdGlvblxuICAgIGNvbnN0IG9ic2VydmFibGVzID0gQXJyYXlcbiAgICAgIC5mcm9tKHRoaXMubWVzc2FnZUhhbmRsZXJzLmVudHJpZXMoKSlcbiAgICAgIC5maWx0ZXIoKFtldmVudE5hbWUsIGV2ZW50SGFuZGxlcl0pID0+ICFldmVudEhhbmRsZXIuaXNHbG9iYWxIYW5kbGVyKVxuICAgICAgLm1hcCgoW2V2ZW50TmFtZSwgZXZlbnRIYW5kbGVyXSkgPT4ge1xuICAgICAgICByZXR1cm4gZnJvbUV2ZW50PGFueT4odGhpcy5jb25uZWN0aW9uISwgZXZlbnROYW1lKS5waXBlKFxuICAgICAgICAgIG1hcCgoZXZlbnQpID0+IGV2ZW50SGFuZGxlci5oYW5kbGVyKGV2ZW50KSkgLy8gRXhlY3V0ZSB0aGUgY29ycmVzcG9uZGluZyBoYW5kbGVyXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgIC8vIFRoZW4gbWVyZ2UgdGhlbSBpbnRvIGEgc2luZ2xlIG9ic2VydmFibGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIHN0cmVhbWluZyBiZWhhdmlvclxuICAgIGNvbnN0IGNvbWJpbmVkJCA9IG1lcmdlKC4uLm9ic2VydmFibGVzKS5waXBlKFxuICAgICAgdGFrZVVudGlsKGNvbXBsZXRpb24kKSAvLyBDb21wbGV0ZSB0aGUgb2JzZXJ2YWJsZSB3aGVuIGNvbXBsZXRpb24kIGVtaXRzXG4gICAgKTtcblxuICAgIC8vIEludm9rZSB0aGUgQ2hhdCBtZXRob2RcbiAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnQ2hhdCcsIGRhdGEpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLm5vdGlmeUF1ZGl0KHRoaXMuY2hhdEhpc3RvcnkhLCB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5zZXJ2aWNlU2V0dGluZ3Muc2VydmljZV9pZCkpIC8vIFdoZW4gdGhlIHNlcnZlciBpbmRpY2F0ZXMgaXQgaGFzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCBpbnZva2luZyB0aGUgbWV0aG9kLCBub3RpZnkgdGhlIGF1ZGl0IHNlcnZpY2Ugd2l0aCB0aGUgcmVjZW50IGNoYXQgaGlzdG9yeVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgQ2hhdDonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gUmV0dXJuIGEgcmVzb2x2ZWQgcHJvbWlzZSB0byBoYW5kbGUgdGhlIGVycm9yIGFuZCBwcmV2ZW50IHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvblxuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5zdHJlYW1pbmckLm5leHQoZmFsc2UpOyAvLyBDb21wbGV0ZSBzdHJlYW1pbmcgcmVnYXJkbGVzcyBvZiBzdWNjZXNzIG9yIGVycm9yXG4gICAgICAgIHRoaXMuYWN0aW9uTWFwLmNsZWFyKCk7IC8vIENsZWFyIHRoZSBhY3Rpb25NYXBcbiAgICAgICAgdGhpcy5jb250ZW50ID0gXCJcIjsgLy8gQ2xlYXIgdGhlIGNvbnRlbnRcbiAgICAgICAgdGhpcy5hdHRhY2htZW50cyA9IFtdOyAvLyBDbGVhciB0aGUgYXR0YWNobWVudHNcbiAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lID0gXCJcIjsgLy8gQ2xlYXIgdGhlIGV4ZWN1dGlvblRpbWVcbiAgICAgICAgY29tcGxldGlvbiQubmV4dCgpOyAvLyBFbWl0IGEgc2lnbmFsIHRvIGNvbXBsZXRlIHRoZSBvYnNlcnZhYmxlc1xuICAgICAgICBjb21wbGV0aW9uJC5jb21wbGV0ZSgpOyAvLyBDb21wbGV0ZSB0aGUgc3ViamVjdFxuICAgICAgfSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIG1lcmdlZCBvYnNlcnZhYmxlc1xuICAgIHJldHVybiBjb21iaW5lZCQucGlwZShcbiAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgIC8vIERlZmluZSAkcHJvZ3Jlc3MgZnJvbSB0aGUgYWN0aW9uTWFwXG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMuYWN0aW9uTWFwLnZhbHVlcygpKTtcbiAgICAgICAgY29uc3QgJHByb2dyZXNzID0gYWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gYWN0aW9ucy5tYXAoKGEpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBhLmRpc3BsYXlOYW1lID8/IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGEuZGlzcGxheVZhbHVlID8/IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGEuZXhlY3V0aW9uVGltZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiBhLmV4ZWN1dGlvblRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gRGVmaW5lIHRoZSBhdHRhY2htZW50IHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlc3BvbnNlIG1lc3NhZ2VcbiAgICAgICAgY29uc3QgJGF0dGFjaG1lbnQgPSB0aGlzLmF0dGFjaG1lbnRzO1xuXG4gICAgICAgIC8vIEFzIHNvb24gYXMgdGhlIGZpcnN0IGNvbnRlbnQgb3IgJHByb2dyZXNzIGlzIGRlZmluZWQsIHRoZSBhc3Npc3RhbnQgaXMgY29uc2lkZXJlZCBhcyBzdHJlYW1pbmdcbiAgICAgICAgaWYoISF0aGlzLmNvbnRlbnQgfHwgJHByb2dyZXNzIHx8ICRhdHRhY2htZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXNwb25zZSA9IHsuLi5yZXNwb25zZSwgY29udGVudDogdGhpcy5jb250ZW50LCBhZGRpdGlvbmFsUHJvcGVydGllczogey4uLnJlc3BvbnNlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLCAkcHJvZ3Jlc3MsICRhdHRhY2htZW50fSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSByZXN1bHRcbiAgICAgICAgcmV0dXJuIHsgaGlzdG9yeTogWy4uLm1lc3NhZ2VzLCByZXNwb25zZV0sIGV4ZWN1dGlvblRpbWU6IHRoaXMuZXhlY3V0aW9uVGltZSB9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbGlzdFNhdmVkQ2hhdCgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaW5zdGFuY2VJZDogdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWJ1Z1xuICAgIH07XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdTYXZlZENoYXRMaXN0JywgKHJlcykgPT4ge1xuICAgICAgdGhpcy5zYXZlZENoYXRzJC5uZXh0KHJlcy5zYXZlZENoYXRzKTsgLy8gZW1pdHMgdGhlIHJlc3VsdCB0byB0aGUgc2F2ZWRDaGF0cyQgc3ViamVjdFxuICAgIH0pO1xuXG4gICAgLy8gSW52b2tlIHRoZSBtZXRob2QgU2F2ZWRDaGF0TGlzdFxuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdTYXZlZENoYXRMaXN0JywgZGF0YSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGludm9raW5nIFNhdmVkQ2hhdExpc3Q6JywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldFNhdmVkQ2hhdChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTYXZlZENoYXRIaXN0b3J5IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc2F2ZWRDaGF0U3ViamVjdCA9IG5ldyBTdWJqZWN0PFNhdmVkQ2hhdEhpc3RvcnkgfCB1bmRlZmluZWQ+KCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaW5zdGFuY2VJZDogdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgIHNhdmVkQ2hhdElkOiBpZCxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWJ1Z1xuICAgIH07XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdTYXZlZENoYXRHZXQnLCAocmVzKSA9PiB7XG4gICAgICBzYXZlZENoYXRTdWJqZWN0Lm5leHQocmVzLnNhdmVkQ2hhdCk7XG4gICAgICBzYXZlZENoYXRTdWJqZWN0LmNvbXBsZXRlKClcbiAgICB9KTtcblxuICAgIC8vIEludm9rZSB0aGUgbWV0aG9kIFNhdmVkQ2hhdEdldFxuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdTYXZlZENoYXRHZXQnLCBkYXRhKVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgU2F2ZWRDaGF0R2V0OicsIGVycm9yKTtcbiAgICAgICAgc2F2ZWRDaGF0U3ViamVjdC5jb21wbGV0ZSgpXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0pXG5cbiAgICByZXR1cm4gc2F2ZWRDaGF0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGRlbGV0ZVNhdmVkQ2hhdChpZHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBjb25zdCBkZWxldGVTYXZlZENoYXRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBTYXZlZENoYXRJZHM6IGlkcyxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWJ1Z1xuICAgIH07XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdTYXZlZENoYXREZWxldGUnLCAocmVzKSA9PiB7XG4gICAgICBkZWxldGVTYXZlZENoYXRTdWJqZWN0Lm5leHQocmVzLmRlbGV0ZUNvdW50KTtcbiAgICAgIGRlbGV0ZVNhdmVkQ2hhdFN1YmplY3QuY29tcGxldGUoKTtcbiAgICB9KTtcblxuICAgIC8vIEludm9rZSB0aGUgbWV0aG9kIFNhdmVkQ2hhdERlbGV0ZVxuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdTYXZlZENoYXREZWxldGUnLCBkYXRhKVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgU2F2ZWRDaGF0RGVsZXRlOicsIGVycm9yKTtcbiAgICAgICAgZGVsZXRlU2F2ZWRDaGF0U3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9KVxuXG4gICAgcmV0dXJuIGRlbGV0ZVNhdmVkQ2hhdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBvdXQtb2YtdGhlLWJveCBoYW5kbGVyc1xuICAgKiBJdCBpcyBhIHBsYWNlaG9sZGVyIGZvciBub24tc3RyZWFtaW5nIHNjZW5hcmlvcywgd2hlcmUgeW91IGludm9rZSBhIHNwZWNpZmljIGh1YiBtZXRob2QsIGFuZCB0aGUgc2VydmVyIHJlc3BvbmRzIHdpdGggYSBzaW5nbGUgbWVzc2FnZSBvciBhIHJlc3VsdFxuICAgKi9cbiAgaW5pdE1lc3NhZ2VIYW5kbGVycygpIHtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJEZWJ1Z1wiLFxuICAgICAgeyBoYW5kbGVyOiAoZGVidWc6IGFueSkgPT4gY29uc29sZS5sb2coZGVidWcpLFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IHRydWVcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXG4gICAgICBcIkFjdGlvblN0YXJ0XCIsXG4gICAgICB7IGhhbmRsZXI6IChhY3Rpb246IEFjdGlvblN0YXJ0RXZlbnQpID0+IHRoaXMuYWN0aW9uTWFwLnNldChhY3Rpb24uZ3VpZCwgYWN0aW9uKSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiQWN0aW9uUmVzdWx0XCIsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IChhY3Rpb246IEFjdGlvblJlc3VsdEV2ZW50KSA9PiB0aGlzLmFjdGlvbk1hcC5zZXQoYWN0aW9uLmd1aWQsIHsgLi4udGhpcy5hY3Rpb25NYXAuZ2V0KGFjdGlvbi5ndWlkKSwgLi4uYWN0aW9uIH0pLFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJBY3Rpb25TdG9wXCIsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IChhY3Rpb246IEFjdGlvblN0b3BFdmVudCkgPT4gdGhpcy5hY3Rpb25NYXAuc2V0KGFjdGlvbi5ndWlkLCB7IC4uLnRoaXMuYWN0aW9uTWFwLmdldChhY3Rpb24uZ3VpZCksIC4uLmFjdGlvbiB9KSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiQ29udGV4dE1lc3NhZ2VcIixcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IENvbnRleHRNZXNzYWdlRXZlbnQpID0+IHRoaXMuYXR0YWNobWVudHMucHVzaChtZXNzYWdlLm1ldGFkYXRhKSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiTWVzc2FnZVwiLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogTWVzc2FnZUV2ZW50KSA9PiB0aGlzLmNvbnRlbnQgKz0gbWVzc2FnZSA/PyBcIlwiLFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJIaXN0b3J5XCIsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IChoaXN0b3J5OiBIaXN0b3J5RXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLmNoYXRIaXN0b3J5ID0gaGlzdG9yeS5oaXN0b3J5XG4gICAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lID0gaGlzdG9yeS5leGVjdXRpb25UaW1lO1xuICAgICAgICB9LFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJFcnJvclwiLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAoZXJyb3I6IEVycm9yRXZlbnQpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiB0cnVlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJRdW90YVwiLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUXVvdGFFdmVudCkgPT4ge1xuICAgICAgICAgIGlmKG1lc3NhZ2UucXVvdGEubWF4UXVvdGFSZWFjaGVkKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgU29ycnksIHlvdSBoYXZlIGV4Y2VlZGVkIHRoZSBhbGxvd2VkIHF1b3RhLiBQbGVhc2UgcmV0cnkgc3RhcnRpbmcgZnJvbSAke3RoaXMuZm9ybWF0RGF0ZVRpbWUobWVzc2FnZS5xdW90YS5uZXh0UmVzZXRVVEMpfS5gO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcihtc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiB0cnVlXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBhbmQgcmVnaXN0ZXIgdGhlIGVudGlyZSBtZXNzYWdlSGFuZGxlcnMgbWFwIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIG1hcCB3aXRoIHRoZSBkZWZhdWx0IG9uZVxuICAgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJzXG4gICAqL1xuICBvdmVycmlkZU1lc3NhZ2VIYW5kbGVyczxUPihtZXNzYWdlSGFuZGxlcnM6IE1hcDxzdHJpbmcsIE1lc3NhZ2VIYW5kbGVyPFQ+Pikge1xuICAgIC8vIENsZWFyIHRoZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZ2xvYmFsIGNoYXQgaGFuZGxlcnMgYmVmb3JlIG1lcmdpbmcgdGhlIG5ldyBvbmVzXG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlcnMuZm9yRWFjaCgoZXZlbnRIYW5kbGVyLCBldmVudE5hbWUpID0+IHtcbiAgICAgIGlmKGV2ZW50SGFuZGxlci5pc0dsb2JhbEhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZU1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBNZXJnZSB0aGUgbmV3IGV2ZW50IGhhbmRsZXJzIHdpdGggdGhlIGV4aXN0aW5nIG9uZXNcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IG5ldyBNYXAoWy4uLnRoaXMubWVzc2FnZUhhbmRsZXJzLCAuLi5tZXNzYWdlSGFuZGxlcnNdKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBnbG9iYWwgY2hhdCBoYW5kbGVycyBhbW9uZyB0aGUgbWVyZ2VkIG1hcFxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzLmZvckVhY2goKGV2ZW50SGFuZGxlciwgZXZlbnROYW1lKSA9PiB7XG4gICAgICBpZihldmVudEhhbmRsZXIuaXNHbG9iYWxIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgc3BlY2lmaWMgZXZlbnQuXG4gICAqIElmIGEgbGlzdGVuZXIgZm9yIHRoaXMgc2FtZSBldmVudCBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBvdmVycmlkZGVuLlxuICAgKiBJZiB0aGUgbGlzdGVuZXIgaGFzIFwiaXNDaGF0R2xvYmFsSGFuZGxlclwiIHNldCB0byB0cnVlLCBpdCB3aWxsIGJlIHJlZ2lzdGVyZWQgdG8gdGhlIGh1YiBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIE5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSBldmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHJlY2VpdmVkXG4gICAqL1xuICBhZGRNZXNzYWdlSGFuZGxlcjxUPihldmVudE5hbWU6IHN0cmluZywgZXZlbnRIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPikge1xuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzLnNldChldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgaWYoZXZlbnRIYW5kbGVyLmlzR2xvYmFsSGFuZGxlcikge1xuICAgICAgdGhpcy5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHluYW1pY2FsbHkgcmVnaXN0ZXIgYSBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBldmVudC5cbiAgICogSWYgYSBsaXN0ZW5lciBmb3IgdGhpcyBldmVudCBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBvdmVycmlkZGVuLlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIE5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSBldmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHJlY2VpdmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJNZXNzYWdlSGFuZGxlcjxUPihldmVudE5hbWU6IHN0cmluZywgZXZlbnRIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPikge1xuICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIk5vIGNvbm5lY3Rpb24gZm91bmQgdG8gcmVnaXN0ZXIgdGhlIGxpc3RlbmVyXCIgKyBldmVudE5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbi5vbihldmVudE5hbWUsIChkYXRhOiBUKSA9PiB7XG4gICAgICBldmVudEhhbmRsZXIuaGFuZGxlcihkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBldmVudCBmcm9tIHRoZSBtZXNzYWdlSGFuZGxlcnMgbWFwIGFuZCB1bnN1YnNjcmliZSBmcm9tIHJlY2VpdmluZyBtZXNzYWdlcyBmb3IgdGhpcyBldmVudCBmcm9tIHRoZSBTaWduYWxSIGh1Yi5cbiAgICogQHBhcmFtIGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZvclxuICAgKi9cbiAgcmVtb3ZlTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHJlY2VpdmluZyBtZXNzYWdlcyBmb3IgYSBzcGVjaWZpYyBldmVudCBmcm9tIHRoZSBTaWduYWxSIGh1Yi5cbiAgICogQUxMIGl0cyByZWxhdGVkIGxpc3RlbmVycyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBodWIgY29ubmVjdGlvblxuICAgKiBUaGlzIGlzIG5lZWRlZCB0byBwcmV2ZW50IGFjY3VtdWxhdGluZyBvbGQgbGlzdGVuZXJzIHdoZW4gb3ZlcnJpZGluZyB0aGUgZW50aXJlIG1lc3NhZ2VIYW5kbGVycyBtYXBcbiAgICogQHBhcmFtIGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIHVuc3Vic2NyaWJlTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9mZihldmVudE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29ubmVjdGlvbiB0byB0aGUgc2lnbmFsUiB3ZWJzb2NrZXQgYW5kIHJlZ2lzdGVyIGRlZmF1bHQgbGlzdGVuZXJzIHRvIHRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlcnZlciBodWIgY2xhc3NcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uLiBJdCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICAgKiBAcGFyYW0gbG9nTGV2ZWwgRGVmaW5lIHRoZSBsb2cgbGV2ZWwgZGlzcGxheWVkIGluIHRoZSBjb25zb2xlXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGJ1aWx0XG4gICAqL1xuICBidWlsZENvbm5lY3Rpb24ob3B0aW9ucz86IENvbm5lY3Rpb25PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5SRVFVRVNUX1VSTCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJObyBlbmRwb2ludCBwcm92aWRlZCB0byBjb25uZWN0IHRoZSB3ZWJzb2NrZXQgdG9cIikpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvZ0xldmVsID0gdGhpcy5nZXRMb2dMZXZlbCgpO1xuICAgICAgdGhpcy5jb25uZWN0aW9uID0gdGhpcy5zaWduYWxSU2VydmljZS5idWlsZENvbm5lY3Rpb24odGhpcy5SRVFVRVNUX1VSTCwgey4uLnRoaXMuZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnN9LCBsb2dMZXZlbCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIGNvbm5lY3Rpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgc3RhcnRlZFxuICAgKi9cbiAgc3RhcnRDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbFJTZXJ2aWNlLnN0YXJ0Q29ubmVjdGlvbih0aGlzLmNvbm5lY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIGNvbm5lY3Rpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgc3RvcHBlZFxuICAgKi9cbiAgc3RvcENvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUlNlcnZpY2Uuc3RvcENvbm5lY3Rpb24odGhpcy5jb25uZWN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJhbnNwb3J0cygpOiBIdHRwVHJhbnNwb3J0VHlwZSB7XG4gICAgc3dpdGNoICh0aGlzLmNoYXRDb25maWckLnZhbHVlPy5nbG9iYWxTZXR0aW5ncy5zaWduYWxSVHJhbnNwb3J0KSB7XG4gICAgICBjYXNlIFwiV2ViU29ja2V0c1wiOlxuICAgICAgICByZXR1cm4gSHR0cFRyYW5zcG9ydFR5cGUuV2ViU29ja2V0cztcbiAgICAgIGNhc2UgXCJTZXJ2ZXJTZW50RXZlbnRzXCI6XG4gICAgICAgIHJldHVybiBIdHRwVHJhbnNwb3J0VHlwZS5TZXJ2ZXJTZW50RXZlbnRzO1xuICAgICAgY2FzZSBcIkxvbmdQb2xsaW5nXCI6XG4gICAgICAgIHJldHVybiBIdHRwVHJhbnNwb3J0VHlwZS5Mb25nUG9sbGluZztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBIdHRwVHJhbnNwb3J0VHlwZS5Ob25lO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9nTGV2ZWwoKTogTG9nTGV2ZWwge1xuICAgIHN3aXRjaCAodGhpcy5jaGF0Q29uZmlnJC52YWx1ZT8uZ2xvYmFsU2V0dGluZ3Muc2lnbmFsUkxvZ0xldmVsKSB7XG4gICAgICBjYXNlIFwiQ3JpdGljYWxcIjpcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLkNyaXRpY2FsOyAvLyBMb2cgbGV2ZWwgZm9yIGRpYWdub3N0aWMgbWVzc2FnZXMgdGhhdCBpbmRpY2F0ZSBhIGZhaWx1cmUgdGhhdCB3aWxsIHRlcm1pbmF0ZSB0aGUgZW50aXJlIGFwcGxpY2F0aW9uLlxuICAgICAgY2FzZSBcIkRlYnVnXCI6XG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5EZWJ1ZzsgLy8gTG9nIGxldmVsIGZvciBsb3cgc2V2ZXJpdHkgZGlhZ25vc3RpYyBtZXNzYWdlcy5cbiAgICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuRXJyb3I7IC8vIExvZyBsZXZlbCBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGF0IGluZGljYXRlIGEgZmFpbHVyZSBpbiB0aGUgY3VycmVudCBvcGVyYXRpb24uXG4gICAgICBjYXNlIFwiSW5mb3JtYXRpb25cIjpcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLkluZm9ybWF0aW9uOyAvLyBMb2cgbGV2ZWwgZm9yIGluZm9ybWF0aW9uYWwgZGlhZ25vc3RpYyBtZXNzYWdlcy5cbiAgICAgIGNhc2UgXCJOb25lXCI6XG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5Ob25lOyAvLyBUaGUgaGlnaGVzdCBwb3NzaWJsZSBsb2cgbGV2ZWwuIFVzZWQgd2hlbiBjb25maWd1cmluZyBsb2dnaW5nIHRvIGluZGljYXRlIHRoYXQgbm8gbG9nIG1lc3NhZ2VzIHNob3VsZCBiZSBlbWl0dGVkLlxuICAgICAgY2FzZSBcIlRyYWNlXCI6XG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5UcmFjZTsgLy8gTG9nIGxldmVsIGZvciB2ZXJ5IGxvdyBzZXZlcml0eSBkaWFnbm9zdGljIG1lc3NhZ2VzLlxuICAgICAgY2FzZSBcIldhcm5pbmdcIjpcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLldhcm5pbmc7IC8vIExvZyBsZXZlbCBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGF0IGluZGljYXRlIGEgbm9uLWZhdGFsIHByb2JsZW0uXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuTm9uZTsgLy8gVGhlIGhpZ2hlc3QgcG9zc2libGUgbG9nIGxldmVsLiBVc2VkIHdoZW4gY29uZmlndXJpbmcgbG9nZ2luZyB0byBpbmRpY2F0ZSB0aGF0IG5vIGxvZyBtZXNzYWdlcyBzaG91bGQgYmUgZW1pdHRlZC5cbiAgICB9XG4gIH1cblxuICBnZXQgZGVmYXVsdE9wdGlvbnMoKTogQ29ubmVjdGlvbk9wdGlvbnMge1xuICAgIGxldCBoZWFkZXJzOiBNZXNzYWdlSGVhZGVycyA9IHtcbiAgICAgIFwic2luZXF1YS1mb3JjZS1jYW1lbC1jYXNlXCI6IFwidHJ1ZVwiLFxuICAgICAgXCJ4LWxhbmd1YWdlXCI6IHRoaXMuaW50bFNlcnZpY2UuY3VycmVudExvY2FsZS5uYW1lLFxuICAgICAgXCJ1aS1sYW5ndWFnZVwiOiB0aGlzLmludGxTZXJ2aWNlLmN1cnJlbnRMb2NhbGUubmFtZSxcbiAgICB9O1xuICAgIGlmICh0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZXNzZWRDcmVkZW50aWFscykge1xuICAgICAgaGVhZGVycyA9IHsuLi5oZWFkZXJzLCBcInNpbmVxdWEtY3NyZi10b2tlblwiOiB0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZXNzZWRDcmVkZW50aWFscy5kYXRhLmNzcmZUb2tlbn07XG4gICAgfTtcbiAgICAvLyBGb3IgdGhlIGZpcnN0IEdFVCByZXF1ZXN0IHNlbnQgYnkgc2lnbmFsUiB0byBzdGFydCBhIFdlYlNvY2tldCBwcm90b2NvbCxcbiAgICAvLyBhcyBmYXIgYXMgd2Uga25vdywgc2lnbmFsUiBvbmx5IGxldHMgdXMgdHdlYWsgdGhlIHJlcXVlc3Qgd2l0aCB0aGlzIGFjY2VzcyB0b2tlbiBmYWN0b3J5XG4gICAgLy8gc28gd2UgcGFzcyBhbG9uZyB0aGUgU2luZXF1YSBDU1JGIHRva2VuIHRvIHBhc3MgdGhlIENTUkYgY2hlY2suLlxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc3BvcnQ6IHRoaXMuZ2V0VHJhbnNwb3J0cygpLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGFjY2Vzc1Rva2VuRmFjdG9yeTogKCkgPT4gdGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UucHJvY2Vzc2VkQ3JlZGVudGlhbHM/LmRhdGE/LmNzcmZUb2tlbiB8fCBcIlwiXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// We'd like to not have a primary entry point but ng-packagr requires one currently
|
|
2
|
+
export const sinequaAssistantModule = undefined;
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9GQUFvRjtBQUNwRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXZSdkIGxpa2UgdG8gbm90IGhhdmUgYSBwcmltYXJ5IGVudHJ5IHBvaW50IGJ1dCBuZy1wYWNrYWdyIHJlcXVpcmVzIG9uZSBjdXJyZW50bHlcbmV4cG9ydCBjb25zdCBzaW5lcXVhQXNzaXN0YW50TW9kdWxlID0gdW5kZWZpbmVkO1xuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZXF1YS1hc3Npc3RhbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvc2luZXF1YS1hc3Npc3RhbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|