@aakash58/chatbot 1.1.16 → 1.1.17
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/esm2022/aakash58-chatbot.mjs +5 -0
- package/esm2022/lib/app/chat/chat-ui-state.service.mjs +170 -0
- package/esm2022/lib/app/chat/chat.service.mjs +445 -0
- package/esm2022/lib/app/chat/components/chat-button/chat-button.component.mjs +50 -0
- package/esm2022/lib/app/chat/components/chat-footer/chat-footer.component.mjs +12 -0
- package/esm2022/lib/app/chat/components/chat-header/chat-header.component.mjs +66 -0
- package/esm2022/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.mjs +186 -0
- package/esm2022/lib/app/chat/components/chat-window/chat-window.component.mjs +312 -0
- package/esm2022/lib/app/chat/components/message-input/message-input.component.mjs +36 -0
- package/esm2022/lib/app/chat/components/message-list/message-list.component.mjs +115 -0
- package/esm2022/lib/app/chat/model/chat-history.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-request.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-response.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-session.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-stream-message.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-stream-response.model.mjs +2 -0
- package/esm2022/lib/app/chat/services/chat-api.service.mjs +61 -0
- package/esm2022/lib/app/chat/services/chat-audio.service.mjs +50 -0
- package/esm2022/lib/app/chat/services/chat-history.service.mjs +252 -0
- package/esm2022/lib/app/login/login-form.component.mjs +46 -0
- package/esm2022/lib/app/personalization/personalization-dialog.component.mjs +194 -0
- package/esm2022/lib/app/personalization/personalization.service.mjs +149 -0
- package/esm2022/lib/app/personalization/sections/account/account-section.component.mjs +122 -0
- package/esm2022/lib/app/personalization/sections/preferences/color-picker-dialog.component.mjs +86 -0
- package/esm2022/lib/app/personalization/sections/preferences/preferences-section.component.mjs +115 -0
- package/esm2022/lib/app/personalization/sections/profile/profile-section.component.mjs +29 -0
- package/esm2022/lib/app/personalization/sections/settings/setting-section.component.mjs +30 -0
- package/esm2022/lib/app/personalization/sections/terms/terms-section.component.mjs +12 -0
- package/esm2022/lib/constant/doohbot-constant.mjs +28 -0
- package/esm2022/lib/constant/html-entities.mjs +9 -0
- package/esm2022/lib/constant/utf8.mjs +10 -0
- package/esm2022/lib/core/app-const.mjs +61 -0
- package/esm2022/lib/core/auth/account-api.service.mjs +40 -0
- package/esm2022/lib/core/auth/auth.service.mjs +391 -0
- package/esm2022/lib/core/auth/models/auth-result.model.mjs +3 -0
- package/esm2022/lib/core/auth/models/federated-login-request.model.mjs +6 -0
- package/esm2022/lib/core/auth/models/login-request.model.mjs +6 -0
- package/esm2022/lib/core/auth/storage.service.mjs +110 -0
- package/esm2022/lib/core/directives/draggable/draggable-dialog.directive.mjs +112 -0
- package/esm2022/lib/core/directives/fullscreen/fullscreen.directive.mjs +55 -0
- package/esm2022/lib/core/directives/resizable/resizable-dialog.directive.mjs +179 -0
- package/esm2022/lib/core/environments/environment.mjs +15 -0
- package/esm2022/lib/core/environments/environment.prod.mjs +15 -0
- package/esm2022/lib/core/helpers/crypto-helper.service.mjs +52 -0
- package/esm2022/lib/core/http/http-stream.service.mjs +97 -0
- package/esm2022/lib/core/http/http.service.mjs +103 -0
- package/esm2022/lib/core/interceptors/auth.interceptor.mjs +96 -0
- package/esm2022/lib/core/interceptors/license.interceptor.mjs +44 -0
- package/esm2022/lib/core/models/api-config.model.mjs +18 -0
- package/esm2022/lib/core/models/api-request.model.mjs +2 -0
- package/esm2022/lib/core/models/api-response.model.mjs +8 -0
- package/esm2022/lib/core/models/doohbot-config.model.mjs +18 -0
- package/esm2022/lib/core/models/license.model.mjs +2 -0
- package/esm2022/lib/core/models/message.mjs +2 -0
- package/esm2022/lib/core/models/theme-config.model.mjs +2 -0
- package/esm2022/lib/core/services/core-config.service.mjs +52 -0
- package/esm2022/lib/core/services/license.service.mjs +145 -0
- package/esm2022/lib/core/services/markdown.service.mjs +64 -0
- package/esm2022/lib/core/services/theme.service.mjs +248 -0
- package/esm2022/lib/core/types/auth-mode.type.mjs +2 -0
- package/esm2022/lib/core/types/auth-status.type.mjs +5 -0
- package/esm2022/lib/core/types/chat-stream.type.mjs +2 -0
- package/esm2022/lib/core/types/message-role.type.mjs +2 -0
- package/esm2022/lib/core/types/prompt-mode.type.mjs +5 -0
- package/esm2022/lib/core/types/snackbar-error.type.mjs +5 -0
- package/esm2022/lib/core/types/tenant-resolution-strategy.type.mjs +2 -0
- package/esm2022/lib/core/utils/logger.service.mjs +42 -0
- package/esm2022/lib/doohbot-input.mjs +20 -0
- package/esm2022/lib/doohbot.component.mjs +444 -0
- package/esm2022/lib/predefined_messages.mjs +15 -0
- package/esm2022/lib/shared/chips/chips.component.mjs +28 -0
- package/esm2022/lib/shared/dialog/dialog.component.mjs +36 -0
- package/esm2022/lib/shared/dialog/dialog.service.mjs +64 -0
- package/esm2022/lib/shared/dialog/dialog.utils.mjs +85 -0
- package/esm2022/lib/shared/dropdown-menu/dropdown-menu.component.mjs +29 -0
- package/esm2022/lib/shared/input-dialog/input-dialog.component.mjs +38 -0
- package/esm2022/lib/shared/menu-item/menu-item.component.mjs +24 -0
- package/esm2022/lib/shared/pipes/simple-markdown.pipe.mjs +27 -0
- package/esm2022/lib/shared/snackbar/snackbar.component.mjs +43 -0
- package/esm2022/lib/shared/snackbar/snackbar.service.mjs +46 -0
- package/esm2022/lib/shared/snackbar/snackbar.utils.mjs +43 -0
- package/esm2022/public-api.mjs +37 -0
- package/fesm2022/aakash58-chatbot.mjs +1037 -827
- package/fesm2022/aakash58-chatbot.mjs.map +1 -1
- package/index.d.ts +3 -373
- package/lib/app/chat/chat-ui-state.service.d.ts +96 -0
- package/lib/app/chat/chat.service.d.ts +88 -0
- package/lib/app/chat/components/chat-button/chat-button.component.d.ts +16 -0
- package/lib/app/chat/components/chat-footer/chat-footer.component.d.ts +5 -0
- package/lib/app/chat/components/chat-header/chat-header.component.d.ts +24 -0
- package/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.d.ts +49 -0
- package/lib/app/chat/components/chat-window/chat-window.component.d.ts +107 -0
- package/lib/app/chat/components/message-input/message-input.component.d.ts +12 -0
- package/lib/app/chat/components/message-list/message-list.component.d.ts +40 -0
- package/lib/app/chat/model/chat-history.model.d.ts +51 -0
- package/lib/app/chat/model/chat-request.model.d.ts +10 -0
- package/lib/app/chat/model/chat-response.model.d.ts +9 -0
- package/lib/app/chat/model/chat-session.model.d.ts +12 -0
- package/lib/app/chat/model/chat-stream-message.model.d.ts +5 -0
- package/lib/app/chat/model/chat-stream-response.model.d.ts +10 -0
- package/lib/app/chat/services/chat-api.service.d.ts +30 -0
- package/lib/app/chat/services/chat-audio.service.d.ts +19 -0
- package/lib/app/chat/services/chat-history.service.d.ts +53 -0
- package/lib/app/login/login-form.component.d.ts +20 -0
- package/lib/app/personalization/personalization-dialog.component.d.ts +53 -0
- package/lib/app/personalization/personalization.service.d.ts +66 -0
- package/lib/app/personalization/sections/account/account-section.component.d.ts +30 -0
- package/lib/app/personalization/sections/preferences/color-picker-dialog.component.d.ts +17 -0
- package/lib/app/personalization/sections/preferences/preferences-section.component.d.ts +27 -0
- package/lib/app/personalization/sections/profile/profile-section.component.d.ts +17 -0
- package/lib/app/personalization/sections/settings/setting-section.component.d.ts +10 -0
- package/lib/app/personalization/sections/terms/terms-section.component.d.ts +5 -0
- package/lib/constant/doohbot-constant.d.ts +12 -0
- package/lib/constant/html-entities.d.ts +8 -0
- package/lib/constant/utf8.d.ts +9 -0
- package/lib/core/app-const.d.ts +11 -0
- package/lib/core/auth/account-api.service.d.ts +20 -0
- package/lib/core/auth/auth.service.d.ts +90 -0
- package/lib/core/auth/models/auth-result.model.d.ts +4 -0
- package/lib/core/auth/models/federated-login-request.model.d.ts +5 -0
- package/lib/core/auth/models/login-request.model.d.ts +6 -0
- package/lib/core/auth/storage.service.d.ts +21 -0
- package/lib/core/directives/draggable/draggable-dialog.directive.d.ts +23 -0
- package/lib/core/directives/fullscreen/fullscreen.directive.d.ts +14 -0
- package/lib/core/directives/resizable/resizable-dialog.directive.d.ts +30 -0
- package/lib/core/environments/environment.d.ts +7 -0
- package/lib/core/environments/environment.prod.d.ts +7 -0
- package/lib/core/helpers/crypto-helper.service.d.ts +12 -0
- package/lib/core/http/http-stream.service.d.ts +18 -0
- package/lib/core/http/http.service.d.ts +20 -0
- package/lib/core/interceptors/auth.interceptor.d.ts +18 -0
- package/lib/core/interceptors/license.interceptor.d.ts +11 -0
- package/lib/core/models/api-config.model.d.ts +58 -0
- package/lib/core/models/api-request.model.d.ts +77 -0
- package/lib/core/models/api-response.model.d.ts +6 -0
- package/lib/core/models/doohbot-config.model.d.ts +81 -0
- package/lib/core/models/license.model.d.ts +23 -0
- package/lib/core/models/message.d.ts +16 -0
- package/lib/core/models/theme-config.model.d.ts +28 -0
- package/lib/core/services/core-config.service.d.ts +23 -0
- package/lib/core/services/license.service.d.ts +33 -0
- package/lib/core/services/markdown.service.d.ts +8 -0
- package/lib/core/services/theme.service.d.ts +40 -0
- package/lib/core/types/auth-mode.type.d.ts +4 -0
- package/lib/core/types/auth-status.type.d.ts +4 -0
- package/lib/core/types/chat-stream.type.d.ts +4 -0
- package/lib/core/types/message-role.type.d.ts +4 -0
- package/lib/core/types/prompt-mode.type.d.ts +4 -0
- package/lib/core/types/snackbar-error.type.d.ts +4 -0
- package/lib/core/types/tenant-resolution-strategy.type.d.ts +4 -0
- package/lib/core/utils/logger.service.d.ts +11 -0
- package/lib/doohbot-input.d.ts +19 -0
- package/lib/doohbot.component.d.ts +108 -0
- package/lib/predefined_messages.d.ts +2 -0
- package/lib/shared/chips/chips.component.d.ts +10 -0
- package/lib/shared/dialog/dialog.component.d.ts +19 -0
- package/lib/shared/dialog/dialog.service.d.ts +29 -0
- package/lib/shared/dialog/dialog.utils.d.ts +41 -0
- package/lib/shared/dropdown-menu/dropdown-menu.component.d.ts +11 -0
- package/lib/shared/input-dialog/input-dialog.component.d.ts +20 -0
- package/lib/shared/menu-item/menu-item.component.d.ts +9 -0
- package/lib/shared/pipes/simple-markdown.pipe.d.ts +10 -0
- package/lib/shared/snackbar/snackbar.component.d.ts +14 -0
- package/lib/shared/snackbar/snackbar.service.d.ts +19 -0
- package/lib/shared/snackbar/snackbar.utils.d.ts +33 -0
- package/package.json +4 -2
- package/public-api.d.ts +11 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Directive, HostListener, Input, } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class DraggableDialogDirective {
|
|
4
|
+
constructor(el, renderer) {
|
|
5
|
+
this.el = el;
|
|
6
|
+
this.renderer = renderer;
|
|
7
|
+
this.isDragging = false;
|
|
8
|
+
this.startX = 0;
|
|
9
|
+
this.startY = 0;
|
|
10
|
+
this.offsetX = 0;
|
|
11
|
+
this.offsetY = 0;
|
|
12
|
+
this.enableDrag = false;
|
|
13
|
+
}
|
|
14
|
+
ngOnInit() {
|
|
15
|
+
this.updateDragState();
|
|
16
|
+
}
|
|
17
|
+
ngOnChanges(changes) {
|
|
18
|
+
if (changes['enableDrag']) {
|
|
19
|
+
this.updateDragState();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
updateDragState() {
|
|
23
|
+
if (this.enableDrag) {
|
|
24
|
+
if (this.dragHandleSelector) {
|
|
25
|
+
this.dragHandle = this.el.nativeElement.querySelector(this.dragHandleSelector);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
this.dragHandle = this.el.nativeElement; // fallback
|
|
29
|
+
}
|
|
30
|
+
if (this.dragHandle) {
|
|
31
|
+
this.renderer.setStyle(this.dragHandle, 'cursor', 'move');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
if (this.dragHandle) {
|
|
36
|
+
this.renderer.setStyle(this.dragHandle, 'cursor', 'default');
|
|
37
|
+
}
|
|
38
|
+
// We don't need to unset dragHandle, just ensure the cursor is reset and the mousedown check respects the flag?
|
|
39
|
+
// Actually, the mousedown listener is always active. We should check enableDrag inside mousedown.
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
onMouseDown(event) {
|
|
43
|
+
if (!this.enableDrag)
|
|
44
|
+
return;
|
|
45
|
+
if (event.defaultPrevented)
|
|
46
|
+
return; // Respect other handlers (like resize)
|
|
47
|
+
if (!this.dragHandle)
|
|
48
|
+
return;
|
|
49
|
+
const target = event.target;
|
|
50
|
+
// Strict check if handle is explicitly provided via selector, ensuring we only drag when clicking that specific handle
|
|
51
|
+
if (this.dragHandleSelector &&
|
|
52
|
+
target !== this.dragHandle &&
|
|
53
|
+
!this.dragHandle.contains(target)) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// If using the host element as the handle (no selector), allow dragging from children
|
|
57
|
+
// BUT exclude specific interactive elements to ensure usability
|
|
58
|
+
if (!this.dragHandleSelector) {
|
|
59
|
+
// Check if target is a resize handle (has class or data-dir)
|
|
60
|
+
if (target.hasAttribute('data-dir') || target.classList.contains('doohbot-resize-handle'))
|
|
61
|
+
return;
|
|
62
|
+
if (!this.dragHandle.contains(target))
|
|
63
|
+
return;
|
|
64
|
+
// Prevent dragging when interacting with controls
|
|
65
|
+
const tagName = target.tagName;
|
|
66
|
+
if (['BUTTON', 'INPUT', 'TEXTAREA', 'A', 'SELECT', 'MAT-ICON'].includes(tagName))
|
|
67
|
+
return;
|
|
68
|
+
// Optional: explicit opt-out class
|
|
69
|
+
if (target.classList.contains('no-drag'))
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this.isDragging = true;
|
|
73
|
+
this.startX = event.clientX - this.offsetX;
|
|
74
|
+
this.startY = event.clientY - this.offsetY;
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
event.stopImmediatePropagation();
|
|
77
|
+
}
|
|
78
|
+
onMouseMove(event) {
|
|
79
|
+
if (!this.isDragging)
|
|
80
|
+
return;
|
|
81
|
+
this.offsetX = event.clientX - this.startX;
|
|
82
|
+
this.offsetY = event.clientY - this.startY;
|
|
83
|
+
this.renderer.setStyle(this.el.nativeElement, 'transform', `translate(${this.offsetX}px, ${this.offsetY}px)`);
|
|
84
|
+
}
|
|
85
|
+
onMouseUp() {
|
|
86
|
+
this.isDragging = false;
|
|
87
|
+
}
|
|
88
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DraggableDialogDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
89
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: DraggableDialogDirective, isStandalone: true, selector: "[draggableDialog]", inputs: { dragHandleSelector: ["dragHandle", "dragHandleSelector"], enableDrag: "enableDrag" }, host: { listeners: { "mousedown": "onMouseDown($event)", "document:mousemove": "onMouseMove($event)", "document:mouseup": "onMouseUp()" } }, usesOnChanges: true, ngImport: i0 }); }
|
|
90
|
+
}
|
|
91
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DraggableDialogDirective, decorators: [{
|
|
92
|
+
type: Directive,
|
|
93
|
+
args: [{
|
|
94
|
+
selector: '[draggableDialog]',
|
|
95
|
+
standalone: true,
|
|
96
|
+
}]
|
|
97
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { dragHandleSelector: [{
|
|
98
|
+
type: Input,
|
|
99
|
+
args: ['dragHandle']
|
|
100
|
+
}], enableDrag: [{
|
|
101
|
+
type: Input
|
|
102
|
+
}], onMouseDown: [{
|
|
103
|
+
type: HostListener,
|
|
104
|
+
args: ['mousedown', ['$event']]
|
|
105
|
+
}], onMouseMove: [{
|
|
106
|
+
type: HostListener,
|
|
107
|
+
args: ['document:mousemove', ['$event']]
|
|
108
|
+
}], onMouseUp: [{
|
|
109
|
+
type: HostListener,
|
|
110
|
+
args: ['document:mouseup', []]
|
|
111
|
+
}] } });
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLWRpYWxvZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvY29yZS9kaXJlY3RpdmVzL2RyYWdnYWJsZS9kcmFnZ2FibGUtZGlhbG9nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEdBS04sTUFBTSxlQUFlLENBQUM7O0FBTXZCLE1BQU0sT0FBTyx3QkFBd0I7SUFZbkMsWUFDVSxFQUFjLEVBQ2QsUUFBbUI7UUFEbkIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFickIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNYLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFDWixZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBR1gsZUFBVSxHQUFHLEtBQUssQ0FBQztJQU96QixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDaEY7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENB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QXdCO21HQUF4Qix3QkFBd0I7OzRGQUF4Qix3QkFBd0I7a0JBSnBDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsVUFBVSxFQUFFLElBQUk7aUJBQ2pCO3VHQVFzQixrQkFBa0I7c0JBQXRDLEtBQUs7dUJBQUMsWUFBWTtnQkFDVixVQUFVO3NCQUFsQixLQUFLO2dCQXVDTixXQUFXO3NCQURWLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQTRDckMsV0FBVztzQkFEVixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWU5QyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkcmFnZ2FibGVEaWFsb2ddJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJhZ2dhYmxlRGlhbG9nRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3RhcnRYID0gMDtcclxuICBwcml2YXRlIHN0YXJ0WSA9IDA7XHJcbiAgcHJpdmF0ZSBvZmZzZXRYID0gMDtcclxuICBwcml2YXRlIG9mZnNldFkgPSAwO1xyXG5cclxuICBASW5wdXQoJ2RyYWdIYW5kbGUnKSBkcmFnSGFuZGxlU2VsZWN0b3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBlbmFibGVEcmFnID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgZHJhZ0hhbmRsZTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy51cGRhdGVEcmFnU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzWydlbmFibGVEcmFnJ10pIHtcclxuICAgICAgdGhpcy51cGRhdGVEcmFnU3RhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRHJhZ1N0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuZW5hYmxlRHJhZykge1xyXG4gICAgICBpZiAodGhpcy5kcmFnSGFuZGxlU2VsZWN0b3IpIHtcclxuICAgICAgICB0aGlzLmRyYWdIYW5kbGUgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmRyYWdIYW5kbGVTZWxlY3Rvcik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kcmFnSGFuZGxlID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50OyAvLyBmYWxsYmFja1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmRyYWdIYW5kbGUpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJhZ0hhbmRsZSwgJ2N1cnNvcicsICdtb3ZlJyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmRyYWdIYW5kbGUpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJhZ0hhbmRsZSwgJ2N1cnNvcicsICdkZWZhdWx0Jyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byB1bnNldCBkcmFnSGFuZGxlLCBqdXN0IGVuc3VyZSB0aGUgY3Vyc29yIGlzIHJlc2V0IGFuZCB0aGUgbW91c2Vkb3duIGNoZWNrIHJlc3BlY3RzIHRoZSBmbGFnP1xyXG4gICAgICAvLyBBY3R1YWxseSwgdGhlIG1vdXNlZG93biBsaXN0ZW5lciBpcyBhbHdheXMgYWN0aXZlLiBXZSBzaG91bGQgY2hlY2sgZW5hYmxlRHJhZyBpbnNpZGUgbW91c2Vkb3duLlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcclxuICBvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmVuYWJsZURyYWcpIHJldHVybjtcclxuICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47IC8vIFJlc3BlY3Qgb3RoZXIgaGFuZGxlcnMgKGxpa2UgcmVzaXplKVxyXG5cclxuICAgIGlmICghdGhpcy5kcmFnSGFuZGxlKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIC8vIFN0cmljdCBjaGVjayBpZiBoYW5kbGUgaXMgZXhwbGljaXRseSBwcm92aWRlZCB2aWEgc2VsZWN0b3IsIGVuc3VyaW5nIHdlIG9ubHkgZHJhZyB3aGVuIGNsaWNraW5nIHRoYXQgc3BlY2lmaWMgaGFuZGxlXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZHJhZ0hhbmRsZVNlbGVjdG9yICYmXHJcbiAgICAgIHRhcmdldCAhPT0gdGhpcy5kcmFnSGFuZGxlICYmXHJcbiAgICAgICF0aGlzLmRyYWdIYW5kbGUuY29udGFpbnModGFyZ2V0KVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB1c2luZyB0aGUgaG9zdCBlbGVtZW50IGFzIHRoZSBoYW5kbGUgKG5vIHNlbGVjdG9yKSwgYWxsb3cgZHJhZ2dpbmcgZnJvbSBjaGlsZHJlblxyXG4gICAgLy8gQlVUIGV4Y2x1ZGUgc3BlY2lmaWMgaW50ZXJhY3RpdmUgZWxlbWVudHMgdG8gZW5zdXJlIHVzYWJpbGl0eVxyXG4gICAgaWYgKCF0aGlzLmRyYWdIYW5kbGVTZWxlY3Rvcikge1xyXG4gICAgICAvLyBDaGVjayBpZiB0YXJnZXQgaXMgYSByZXNpemUgaGFuZGxlIChoYXMgY2xhc3Mgb3IgZGF0YS1kaXIpXHJcbiAgICAgIGlmICh0YXJnZXQuaGFzQXR0cmlidXRlKCdkYXRhLWRpcicpIHx8IHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rvb2hib3QtcmVzaXplLWhhbmRsZScpKVxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgIGlmICghdGhpcy5kcmFnSGFuZGxlLmNvbnRhaW5zKHRhcmdldCkpIHJldHVybjtcclxuXHJcbiAgICAgIC8vIFByZXZlbnQgZHJhZ2dpbmcgd2hlbiBpbnRlcmFjdGluZyB3aXRoIGNvbnRyb2xzXHJcbiAgICAgIGNvbnN0IHRhZ05hbWUgPSB0YXJnZXQudGFnTmFtZTtcclxuICAgICAgaWYgKFsnQlVUVE9OJywgJ0lOUFVUJywgJ1RFWFRBUkVBJywgJ0EnLCAnU0VMRUNUJywgJ01BVC1JQ09OJ10uaW5jbHVkZXModGFnTmFtZSkpIHJldHVybjtcclxuXHJcbiAgICAgIC8vIE9wdGlvbmFsOiBleHBsaWNpdCBvcHQtb3V0IGNsYXNzXHJcbiAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCduby1kcmFnJykpIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYIC0gdGhpcy5vZmZzZXRYO1xyXG4gICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5vZmZzZXRZO1xyXG5cclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5vZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhcnRYO1xyXG4gICAgdGhpcy5vZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXHJcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudCxcclxuICAgICAgJ3RyYW5zZm9ybScsXHJcbiAgICAgIGB0cmFuc2xhdGUoJHt0aGlzLm9mZnNldFh9cHgsICR7dGhpcy5vZmZzZXRZfXB4KWAsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFtdKVxyXG4gIG9uTW91c2VVcCgpIHtcclxuICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Directive, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class FullscreenDirective {
|
|
4
|
+
constructor(el, renderer) {
|
|
5
|
+
this.el = el;
|
|
6
|
+
this.renderer = renderer;
|
|
7
|
+
this.isFullScreen = false;
|
|
8
|
+
this.preFullscreenState = null;
|
|
9
|
+
this.fullscreenTarget = '.chat-window';
|
|
10
|
+
}
|
|
11
|
+
toggle() {
|
|
12
|
+
const targetEl = this.el.nativeElement.querySelector(this.fullscreenTarget);
|
|
13
|
+
if (!targetEl)
|
|
14
|
+
return;
|
|
15
|
+
if (!this.isFullScreen) {
|
|
16
|
+
this.preFullscreenState = {
|
|
17
|
+
width: targetEl.style.width,
|
|
18
|
+
height: targetEl.style.height,
|
|
19
|
+
left: targetEl.style.left,
|
|
20
|
+
top: targetEl.style.top,
|
|
21
|
+
};
|
|
22
|
+
targetEl.style.width = '';
|
|
23
|
+
targetEl.style.height = '';
|
|
24
|
+
targetEl.style.left = '';
|
|
25
|
+
targetEl.style.top = '';
|
|
26
|
+
targetEl.style.transform = '';
|
|
27
|
+
this.isFullScreen = true;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
this.isFullScreen = false;
|
|
31
|
+
if (this.preFullscreenState) {
|
|
32
|
+
targetEl.style.width = this.preFullscreenState.width;
|
|
33
|
+
targetEl.style.height = this.preFullscreenState.height;
|
|
34
|
+
targetEl.style.left = this.preFullscreenState.left;
|
|
35
|
+
targetEl.style.top = this.preFullscreenState.top;
|
|
36
|
+
targetEl.style.transform = ''; // Clear transform to allow CSS transitions/classes
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
getFullscreenState() {
|
|
41
|
+
return this.isFullScreen;
|
|
42
|
+
}
|
|
43
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FullscreenDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
44
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: FullscreenDirective, isStandalone: true, selector: "[appFullscreen]", inputs: { fullscreenTarget: "fullscreenTarget" }, ngImport: i0 }); }
|
|
45
|
+
}
|
|
46
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FullscreenDirective, decorators: [{
|
|
47
|
+
type: Directive,
|
|
48
|
+
args: [{
|
|
49
|
+
selector: '[appFullscreen]',
|
|
50
|
+
standalone: true,
|
|
51
|
+
}]
|
|
52
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { fullscreenTarget: [{
|
|
53
|
+
type: Input
|
|
54
|
+
}] } });
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbHNjcmVlbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvY29yZS9kaXJlY3RpdmVzL2Z1bGxzY3JlZW4vZnVsbHNjcmVlbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7O0FBTXhFLE1BQU0sT0FBTyxtQkFBbUI7SUFXOUIsWUFDVSxFQUFjLEVBQ2QsUUFBbUI7UUFEbkIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFackIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsdUJBQWtCLEdBS2YsSUFBSSxDQUFDO1FBRVAscUJBQWdCLEdBQVcsY0FBYyxDQUFDO0lBSy9DLENBQUM7SUFFRSxNQUFNO1FBQ1gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUV0QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsa0JBQWtCLEdBQUc7Z0JBQ3hCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUs7Z0JBQzNCLE1BQU0sRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQzdCLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUk7Z0JBQ3pCLEdBQUcsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUc7YUFDeEIsQ0FBQztZQUVGLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUMxQixRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDM0IsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUN4QixRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFFOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBRTFCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUMzQixRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDO2dCQUNyRCxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO2dCQUN2RCxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2dCQUNuRCxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDO2dCQUNqRCxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxtREFBbUQ7YUFDbkY7U0FDRjtJQUNILENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7K0dBbERVLG1CQUFtQjttR0FBbkIsbUJBQW1COzs0RkFBbkIsbUJBQW1CO2tCQUovQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjt1R0FVVSxnQkFBZ0I7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2FwcEZ1bGxzY3JlZW5dJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRnVsbHNjcmVlbkRpcmVjdGl2ZSB7XHJcbiAgcHJpdmF0ZSBpc0Z1bGxTY3JlZW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHByZUZ1bGxzY3JlZW5TdGF0ZToge1xyXG4gICAgd2lkdGg6IHN0cmluZztcclxuICAgIGhlaWdodDogc3RyaW5nO1xyXG4gICAgbGVmdDogc3RyaW5nO1xyXG4gICAgdG9wOiBzdHJpbmc7XHJcbiAgfSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSBmdWxsc2NyZWVuVGFyZ2V0OiBzdHJpbmcgPSAnLmNoYXQtd2luZG93JztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICkgeyB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCB0YXJnZXRFbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZnVsbHNjcmVlblRhcmdldCk7XHJcbiAgICBpZiAoIXRhcmdldEVsKSByZXR1cm47XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICB0aGlzLnByZUZ1bGxzY3JlZW5TdGF0ZSA9IHtcclxuICAgICAgICB3aWR0aDogdGFyZ2V0RWwuc3R5bGUud2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiB0YXJnZXRFbC5zdHlsZS5oZWlnaHQsXHJcbiAgICAgICAgbGVmdDogdGFyZ2V0RWwuc3R5bGUubGVmdCxcclxuICAgICAgICB0b3A6IHRhcmdldEVsLnN0eWxlLnRvcCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRhcmdldEVsLnN0eWxlLndpZHRoID0gJyc7XHJcbiAgICAgIHRhcmdldEVsLnN0eWxlLmhlaWdodCA9ICcnO1xyXG4gICAgICB0YXJnZXRFbC5zdHlsZS5sZWZ0ID0gJyc7XHJcbiAgICAgIHRhcmdldEVsLnN0eWxlLnRvcCA9ICcnO1xyXG4gICAgICB0YXJnZXRFbC5zdHlsZS50cmFuc2Zvcm0gPSAnJztcclxuXHJcbiAgICAgIHRoaXMuaXNGdWxsU2NyZWVuID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNGdWxsU2NyZWVuID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5wcmVGdWxsc2NyZWVuU3RhdGUpIHtcclxuICAgICAgICB0YXJnZXRFbC5zdHlsZS53aWR0aCA9IHRoaXMucHJlRnVsbHNjcmVlblN0YXRlLndpZHRoO1xyXG4gICAgICAgIHRhcmdldEVsLnN0eWxlLmhlaWdodCA9IHRoaXMucHJlRnVsbHNjcmVlblN0YXRlLmhlaWdodDtcclxuICAgICAgICB0YXJnZXRFbC5zdHlsZS5sZWZ0ID0gdGhpcy5wcmVGdWxsc2NyZWVuU3RhdGUubGVmdDtcclxuICAgICAgICB0YXJnZXRFbC5zdHlsZS50b3AgPSB0aGlzLnByZUZ1bGxzY3JlZW5TdGF0ZS50b3A7XHJcbiAgICAgICAgdGFyZ2V0RWwuc3R5bGUudHJhbnNmb3JtID0gJyc7IC8vIENsZWFyIHRyYW5zZm9ybSB0byBhbGxvdyBDU1MgdHJhbnNpdGlvbnMvY2xhc3Nlc1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RnVsbHNjcmVlblN0YXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNGdWxsU2NyZWVuO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// resizable-dialog.directive.ts
|
|
2
|
+
import { Directive, HostListener, Input, } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class ResizableDialogDirective {
|
|
5
|
+
constructor(el, renderer) {
|
|
6
|
+
this.el = el;
|
|
7
|
+
this.renderer = renderer;
|
|
8
|
+
this.resizeHandles = [];
|
|
9
|
+
this.activeHandle = null;
|
|
10
|
+
this.startX = 0;
|
|
11
|
+
this.startY = 0;
|
|
12
|
+
this.startWidth = 0;
|
|
13
|
+
this.startHeight = 0;
|
|
14
|
+
this.startLeft = 0;
|
|
15
|
+
this.startTop = 0;
|
|
16
|
+
this.enableResize = false;
|
|
17
|
+
// Define resize directions
|
|
18
|
+
this.directions = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];
|
|
19
|
+
}
|
|
20
|
+
ngOnInit() {
|
|
21
|
+
this.updateResizeState();
|
|
22
|
+
}
|
|
23
|
+
ngOnChanges(changes) {
|
|
24
|
+
if (changes['enableResize']) {
|
|
25
|
+
this.updateResizeState();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
updateResizeState() {
|
|
29
|
+
if (this.enableResize) {
|
|
30
|
+
if (this.resizeHandles.length === 0) {
|
|
31
|
+
this.setStyle();
|
|
32
|
+
this.createResizeHandles();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this.removeResizeHandles();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
ngOnDestroy() {
|
|
40
|
+
this.removeResizeHandles();
|
|
41
|
+
}
|
|
42
|
+
setStyle() {
|
|
43
|
+
const element = this.el.nativeElement;
|
|
44
|
+
this.renderer.setStyle(element, 'position', 'absolute');
|
|
45
|
+
this.renderer.setStyle(element, 'overflow', 'hidden');
|
|
46
|
+
this.renderer.setStyle(element, 'boxSizing', 'border-box');
|
|
47
|
+
}
|
|
48
|
+
createResizeHandles() {
|
|
49
|
+
this.directions.forEach((dir) => {
|
|
50
|
+
const handle = this.renderer.createElement('div');
|
|
51
|
+
this.renderer.setAttribute(handle, 'data-dir', dir);
|
|
52
|
+
this.renderer.addClass(handle, 'doohbot-resize-handle');
|
|
53
|
+
this.renderer.setStyle(handle, 'position', 'absolute');
|
|
54
|
+
this.renderer.setStyle(handle, 'background', 'transparent');
|
|
55
|
+
this.renderer.setStyle(handle, 'zIndex', '2000'); // High z-index to sit above content
|
|
56
|
+
this.renderer.setStyle(handle, 'userSelect', 'none');
|
|
57
|
+
// Set size and position based on direction
|
|
58
|
+
if (dir.includes('e') || dir.includes('w')) {
|
|
59
|
+
this.renderer.setStyle(handle, 'width', '15px'); // Slightly larger hit area
|
|
60
|
+
this.renderer.setStyle(handle, 'cursor', dir.includes('e') ? 'e-resize' : 'w-resize');
|
|
61
|
+
this.renderer.setStyle(handle, 'top', '0');
|
|
62
|
+
this.renderer.setStyle(handle, 'bottom', '0');
|
|
63
|
+
this.renderer.setStyle(handle, 'right', dir.includes('e') ? '-5px' : null); // Extend slightly out
|
|
64
|
+
this.renderer.setStyle(handle, 'left', dir.includes('w') ? '-5px' : null);
|
|
65
|
+
}
|
|
66
|
+
if (dir.includes('n') || dir.includes('s')) {
|
|
67
|
+
this.renderer.setStyle(handle, 'height', '15px');
|
|
68
|
+
this.renderer.setStyle(handle, 'cursor', dir.includes('s') ? 's-resize' : 'n-resize');
|
|
69
|
+
this.renderer.setStyle(handle, 'left', '0');
|
|
70
|
+
this.renderer.setStyle(handle, 'right', '0');
|
|
71
|
+
this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '-5px' : null);
|
|
72
|
+
this.renderer.setStyle(handle, 'top', dir.includes('n') ? '-5px' : null);
|
|
73
|
+
}
|
|
74
|
+
if (dir === 'ne' || dir === 'nw' || dir === 'se' || dir === 'sw') {
|
|
75
|
+
this.renderer.setStyle(handle, 'width', '20px');
|
|
76
|
+
this.renderer.setStyle(handle, 'height', '20px');
|
|
77
|
+
this.renderer.setStyle(handle, 'borderRadius', '50%');
|
|
78
|
+
this.renderer.setStyle(handle, 'cursor', `${dir}-resize`);
|
|
79
|
+
this.renderer.setStyle(handle, 'top', dir.includes('n') ? '-10px' : null);
|
|
80
|
+
this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '-10px' : null);
|
|
81
|
+
this.renderer.setStyle(handle, 'left', dir.includes('w') ? '-10px' : null);
|
|
82
|
+
this.renderer.setStyle(handle, 'right', dir.includes('e') ? '-10px' : null);
|
|
83
|
+
}
|
|
84
|
+
this.renderer.appendChild(this.el.nativeElement, handle);
|
|
85
|
+
this.resizeHandles.push(handle);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
removeResizeHandles() {
|
|
89
|
+
this.resizeHandles.forEach((handle) => {
|
|
90
|
+
this.renderer.removeChild(this.el.nativeElement, handle);
|
|
91
|
+
});
|
|
92
|
+
this.resizeHandles = [];
|
|
93
|
+
}
|
|
94
|
+
onMouseDown(event) {
|
|
95
|
+
if (!this.enableResize)
|
|
96
|
+
return;
|
|
97
|
+
if (event.defaultPrevented)
|
|
98
|
+
return; // Respect other handlers
|
|
99
|
+
const target = event.target;
|
|
100
|
+
const dir = target.getAttribute('data-dir');
|
|
101
|
+
if (!dir)
|
|
102
|
+
return;
|
|
103
|
+
event.preventDefault();
|
|
104
|
+
event.stopImmediatePropagation();
|
|
105
|
+
this.activeHandle = dir;
|
|
106
|
+
const rect = this.el.nativeElement.getBoundingClientRect();
|
|
107
|
+
this.startX = event.clientX;
|
|
108
|
+
this.startY = event.clientY;
|
|
109
|
+
this.startWidth = parseFloat(this.getComputedStyleValue('width'));
|
|
110
|
+
this.startHeight = parseFloat(this.getComputedStyleValue('height'));
|
|
111
|
+
this.startLeft = parseFloat(this.getComputedStyleValue('left'));
|
|
112
|
+
this.startTop = parseFloat(this.getComputedStyleValue('top'));
|
|
113
|
+
// Prevent text selection during resize
|
|
114
|
+
document.body.classList.add('no-select');
|
|
115
|
+
}
|
|
116
|
+
onMouseMove(event) {
|
|
117
|
+
if (!this.activeHandle)
|
|
118
|
+
return;
|
|
119
|
+
const dx = event.clientX - this.startX;
|
|
120
|
+
const dy = event.clientY - this.startY;
|
|
121
|
+
let newWidth = this.startWidth;
|
|
122
|
+
let newHeight = this.startHeight;
|
|
123
|
+
let newLeft = this.startLeft;
|
|
124
|
+
let newTop = this.startTop;
|
|
125
|
+
const minWidth = 150;
|
|
126
|
+
const minHeight = 100;
|
|
127
|
+
// Horizontal resize
|
|
128
|
+
if (this.activeHandle.includes('e')) {
|
|
129
|
+
newWidth = Math.max(this.startWidth + dx, minWidth);
|
|
130
|
+
}
|
|
131
|
+
if (this.activeHandle.includes('w')) {
|
|
132
|
+
newWidth = Math.max(this.startWidth - dx, minWidth);
|
|
133
|
+
newLeft = this.startLeft + (this.startWidth - newWidth);
|
|
134
|
+
}
|
|
135
|
+
// Vertical resize
|
|
136
|
+
if (this.activeHandle.includes('s')) {
|
|
137
|
+
newHeight = Math.max(this.startHeight + dy, minHeight);
|
|
138
|
+
}
|
|
139
|
+
if (this.activeHandle.includes('n')) {
|
|
140
|
+
newHeight = Math.max(this.startHeight - dy, minHeight);
|
|
141
|
+
newTop = this.startTop + (this.startHeight - newHeight);
|
|
142
|
+
}
|
|
143
|
+
// Apply changes
|
|
144
|
+
this.renderer.setStyle(this.el.nativeElement, 'width', `${newWidth}px`);
|
|
145
|
+
this.renderer.setStyle(this.el.nativeElement, 'height', `${newHeight}px`);
|
|
146
|
+
this.renderer.setStyle(this.el.nativeElement, 'left', `${newLeft}px`);
|
|
147
|
+
this.renderer.setStyle(this.el.nativeElement, 'top', `${newTop}px`);
|
|
148
|
+
}
|
|
149
|
+
onMouseUp() {
|
|
150
|
+
if (this.activeHandle) {
|
|
151
|
+
this.activeHandle = null;
|
|
152
|
+
document.body.classList.remove('no-select');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
getComputedStyleValue(property) {
|
|
156
|
+
return getComputedStyle(this.el.nativeElement).getPropertyValue(property) || '0';
|
|
157
|
+
}
|
|
158
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ResizableDialogDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
159
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: ResizableDialogDirective, isStandalone: true, selector: "[resizableDialog]", inputs: { enableResize: "enableResize" }, host: { listeners: { "mousedown": "onMouseDown($event)", "document:mousemove": "onMouseMove($event)", "document:mouseup": "onMouseUp()" } }, usesOnChanges: true, ngImport: i0 }); }
|
|
160
|
+
}
|
|
161
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ResizableDialogDirective, decorators: [{
|
|
162
|
+
type: Directive,
|
|
163
|
+
args: [{
|
|
164
|
+
selector: '[resizableDialog]',
|
|
165
|
+
standalone: true,
|
|
166
|
+
}]
|
|
167
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { enableResize: [{
|
|
168
|
+
type: Input
|
|
169
|
+
}], onMouseDown: [{
|
|
170
|
+
type: HostListener,
|
|
171
|
+
args: ['mousedown', ['$event']]
|
|
172
|
+
}], onMouseMove: [{
|
|
173
|
+
type: HostListener,
|
|
174
|
+
args: ['document:mousemove', ['$event']]
|
|
175
|
+
}], onMouseUp: [{
|
|
176
|
+
type: HostListener,
|
|
177
|
+
args: ['document:mouseup']
|
|
178
|
+
}] } });
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLWRpYWxvZy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvY29yZS9kaXJlY3RpdmVzL3Jlc2l6YWJsZS9yZXNpemFibGUtZGlhbG9nLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUNMLFNBQVMsRUFLVCxZQUFZLEVBQ1osS0FBSyxHQUdOLE1BQU0sZUFBZSxDQUFDOztBQU12QixNQUFNLE9BQU8sd0JBQXdCO0lBZW5DLFlBQ1UsRUFBMkIsRUFDM0IsUUFBbUI7UUFEbkIsT0FBRSxHQUFGLEVBQUUsQ0FBeUI7UUFDM0IsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQWhCckIsa0JBQWEsR0FBa0IsRUFBRSxDQUFDO1FBQ2xDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNYLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUVaLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTlCLDJCQUEyQjtRQUNuQixlQUFVLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFLL0QsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQzFC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LEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDM0U7WUFDRCxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxRTtZQUNELElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtnQkFDaEUsSUFB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LENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFHRCxTQUFTO1FBQ1AsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxRQUFnQjtRQUM1QyxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ25GLENBQUM7K0dBbExVLHdCQUF3QjttR0FBeEIsd0JBQXdCOzs0RkFBeEIsd0JBQXdCO2tCQUpwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjt1R0FXVSxZQUFZO3NCQUFwQixLQUFLO2dCQTZGTixXQUFXO3NCQURWLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQTJCckMsV0FBVztzQkFEVixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXlDOUMsU0FBUztzQkFEUixZQUFZO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHJlc2l6YWJsZS1kaWFsb2cuZGlyZWN0aXZlLnRzXHJcbmltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIE9uSW5pdCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbcmVzaXphYmxlRGlhbG9nXScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJlc2l6YWJsZURpYWxvZ0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIHByaXZhdGUgcmVzaXplSGFuZGxlczogSFRNTEVsZW1lbnRbXSA9IFtdO1xyXG4gIHByaXZhdGUgYWN0aXZlSGFuZGxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHN0YXJ0WCA9IDA7XHJcbiAgcHJpdmF0ZSBzdGFydFkgPSAwO1xyXG4gIHByaXZhdGUgc3RhcnRXaWR0aCA9IDA7XHJcbiAgcHJpdmF0ZSBzdGFydEhlaWdodCA9IDA7XHJcbiAgcHJpdmF0ZSBzdGFydExlZnQgPSAwO1xyXG4gIHByaXZhdGUgc3RhcnRUb3AgPSAwO1xyXG5cclxuICBASW5wdXQoKSBlbmFibGVSZXNpemUgPSBmYWxzZTtcclxuXHJcbiAgLy8gRGVmaW5lIHJlc2l6ZSBkaXJlY3Rpb25zXHJcbiAgcHJpdmF0ZSBkaXJlY3Rpb25zID0gWyduJywgJ3MnLCAnZScsICd3JywgJ25lJywgJ253JywgJ3NlJywgJ3N3J107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMudXBkYXRlUmVzaXplU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzWydlbmFibGVSZXNpemUnXSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZVJlc2l6ZVN0YXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVJlc2l6ZVN0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuZW5hYmxlUmVzaXplKSB7XHJcbiAgICAgIGlmICh0aGlzLnJlc2l6ZUhhbmRsZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdHlsZSgpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlUmVzaXplSGFuZGxlcygpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbW92ZVJlc2l6ZUhhbmRsZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5yZW1vdmVSZXNpemVIYW5kbGVzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFN0eWxlKCkge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQsICdvdmVyZmxvdycsICdoaWRkZW4nKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgJ2JveFNpemluZycsICdib3JkZXItYm94Jyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVJlc2l6ZUhhbmRsZXMoKSB7XHJcbiAgICB0aGlzLmRpcmVjdGlvbnMuZm9yRWFjaCgoZGlyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGhhbmRsZSwgJ2RhdGEtZGlyJywgZGlyKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhoYW5kbGUsICdkb29oYm90LXJlc2l6ZS1oYW5kbGUnKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoYW5kbGUsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhhbmRsZSwgJ2JhY2tncm91bmQnLCAndHJhbnNwYXJlbnQnKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoYW5kbGUsICd6SW5kZXgnLCAnMjAwMCcpOyAvLyBIaWdoIHotaW5kZXggdG8gc2l0IGFib3ZlIGNvbnRlbnRcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoYW5kbGUsICd1c2VyU2VsZWN0JywgJ25vbmUnKTtcclxuXHJcbiAgICAgIC8vIFNldCBzaXplIGFuZCBwb3NpdGlvbiBiYXNlZCBvbiBkaXJlY3Rpb25cclxuICAgICAgaWYgKGRpci5pbmNsdWRlcygnZScpIHx8IGRpci5pbmNsdWRlcygndycpKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoYW5kbGUsICd3aWR0aCcsICcxNXB4Jyk7IC8vIFNsaWdodGx5IGxhcmdlciBoaXQgYXJlYVxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGFuZGxlLCAnY3Vyc29yJywgZGlyLmluY2x1ZGVzKCdlJykgPyAnZS1yZXNpemUnIDogJ3ctcmVzaXplJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoYW5kbGUsICd0b3AnLCAnMCcpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGFuZGxlLCAnYm90dG9tJywgJzAnKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhhbmRsZSwgJ3JpZ2h0JywgZGlyLmluY2x1ZGVzKCdlJykgPyAnLTVweCcgOiBudWxsKTsgLy8gRXh0ZW5kIHNsaWdodGx5IG91dFxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGFuZGxlLCAnbGVmdCcsIGRpci5pbmNsdWRlcygndycpID8gJy01cHgnIDogbnVsbCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRpci5pbmNsdWRlcygnbicpIHx8IGRpci5pbmNsdWRlcygncycpKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoYW5kbGUsICdoZWlnaHQnLCAnMTVweCcpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGFuZGxlLCAnY3Vyc29yJywgZGlyLmluY2x1ZGVzKCdzJykgPyAncy1yZXNpemUnIDogJ24tcmVzaXplJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoYW5kbGUsICdsZWZ0JywgJzAnKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhhbmRsZSwgJ3JpZ2h0JywgJzAnKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhhbmRsZSwgJ2JvdHRvbScsIGRpci5pbmNsdWRlcygncycpID8gJy01cHgnIDogbnVsbCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoYW5kbGUsICd0b3AnLCBkaXIuaW5jbHVkZXMoJ24nKSA/ICctNXB4JyA6IG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChkaXIgPT09ICduZScgfHwgZGlyID09PSAnbncnIHx8IGRpciA9PT0gJ3NlJyB8fCBkaXIgPT09ICdzdycpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhhbmRsZSwgJ3dpZHRoJywgJzIwcHgnKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhhbmRsZSwgJ2hlaWdodCcsICcyMHB4Jyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoYW5kbGUsICdib3JkZXJSYWRpdXMnLCAnNTAlJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoYW5kbGUsICdjdXJzb3InLCBgJHtkaXJ9LXJlc2l6ZWApO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGFuZGxlLCAndG9wJywgZGlyLmluY2x1ZGVzKCduJykgPyAnLTEwcHgnIDogbnVsbCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoYW5kbGUsICdib3R0b20nLCBkaXIuaW5jbHVkZXMoJ3MnKSA/ICctMTBweCcgOiBudWxsKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhhbmRsZSwgJ2xlZnQnLCBkaXIuaW5jbHVkZXMoJ3cnKSA/ICctMTBweCcgOiBudWxsKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhhbmRsZSwgJ3JpZ2h0JywgZGlyLmluY2x1ZGVzKCdlJykgPyAnLTEwcHgnIDogbnVsbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCBoYW5kbGUpO1xyXG4gICAgICB0aGlzLnJlc2l6ZUhhbmRsZXMucHVzaChoYW5kbGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZVJlc2l6ZUhhbmRsZXMoKSB7XHJcbiAgICB0aGlzLnJlc2l6ZUhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlKSA9PiB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCBoYW5kbGUpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlc2l6ZUhhbmRsZXMgPSBbXTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5lbmFibGVSZXNpemUpIHJldHVybjtcclxuICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47IC8vIFJlc3BlY3Qgb3RoZXIgaGFuZGxlcnNcclxuXHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWRpcicpO1xyXG4gICAgaWYgKCFkaXIpIHJldHVybjtcclxuXHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5hY3RpdmVIYW5kbGUgPSBkaXI7XHJcbiAgICBjb25zdCByZWN0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcclxuICAgIHRoaXMuc3RhcnRZID0gZXZlbnQuY2xpZW50WTtcclxuICAgIHRoaXMuc3RhcnRXaWR0aCA9IHBhcnNlRmxvYXQodGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoJ3dpZHRoJykpO1xyXG4gICAgdGhpcy5zdGFydEhlaWdodCA9IHBhcnNlRmxvYXQodGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoJ2hlaWdodCcpKTtcclxuICAgIHRoaXMuc3RhcnRMZWZ0ID0gcGFyc2VGbG9hdCh0aGlzLmdldENvbXB1dGVkU3R5bGVWYWx1ZSgnbGVmdCcpKTtcclxuICAgIHRoaXMuc3RhcnRUb3AgPSBwYXJzZUZsb2F0KHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCd0b3AnKSk7XHJcblxyXG4gICAgLy8gUHJldmVudCB0ZXh0IHNlbGVjdGlvbiBkdXJpbmcgcmVzaXplXHJcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ25vLXNlbGVjdCcpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcclxuICBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmFjdGl2ZUhhbmRsZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGR4ID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhcnRYO1xyXG4gICAgY29uc3QgZHkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XHJcblxyXG4gICAgbGV0IG5ld1dpZHRoID0gdGhpcy5zdGFydFdpZHRoO1xyXG4gICAgbGV0IG5ld0hlaWdodCA9IHRoaXMuc3RhcnRIZWlnaHQ7XHJcbiAgICBsZXQgbmV3TGVmdCA9IHRoaXMuc3RhcnRMZWZ0O1xyXG4gICAgbGV0IG5ld1RvcCA9IHRoaXMuc3RhcnRUb3A7XHJcblxyXG4gICAgY29uc3QgbWluV2lkdGggPSAxNTA7XHJcbiAgICBjb25zdCBtaW5IZWlnaHQgPSAxMDA7XHJcblxyXG4gICAgLy8gSG9yaXpvbnRhbCByZXNpemVcclxuICAgIGlmICh0aGlzLmFjdGl2ZUhhbmRsZS5pbmNsdWRlcygnZScpKSB7XHJcbiAgICAgIG5ld1dpZHRoID0gTWF0aC5tYXgodGhpcy5zdGFydFdpZHRoICsgZHgsIG1pbldpZHRoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFjdGl2ZUhhbmRsZS5pbmNsdWRlcygndycpKSB7XHJcbiAgICAgIG5ld1dpZHRoID0gTWF0aC5tYXgodGhpcy5zdGFydFdpZHRoIC0gZHgsIG1pbldpZHRoKTtcclxuICAgICAgbmV3TGVmdCA9IHRoaXMuc3RhcnRMZWZ0ICsgKHRoaXMuc3RhcnRXaWR0aCAtIG5ld1dpZHRoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBWZXJ0aWNhbCByZXNpemVcclxuICAgIGlmICh0aGlzLmFjdGl2ZUhhbmRsZS5pbmNsdWRlcygncycpKSB7XHJcbiAgICAgIG5ld0hlaWdodCA9IE1hdGgubWF4KHRoaXMuc3RhcnRIZWlnaHQgKyBkeSwgbWluSGVpZ2h0KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFjdGl2ZUhhbmRsZS5pbmNsdWRlcygnbicpKSB7XHJcbiAgICAgIG5ld0hlaWdodCA9IE1hdGgubWF4KHRoaXMuc3RhcnRIZWlnaHQgLSBkeSwgbWluSGVpZ2h0KTtcclxuICAgICAgbmV3VG9wID0gdGhpcy5zdGFydFRvcCArICh0aGlzLnN0YXJ0SGVpZ2h0IC0gbmV3SGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBjaGFuZ2VzXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3dpZHRoJywgYCR7bmV3V2lkdGh9cHhgKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnaGVpZ2h0JywgYCR7bmV3SGVpZ2h0fXB4YCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2xlZnQnLCBgJHtuZXdMZWZ0fXB4YCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3RvcCcsIGAke25ld1RvcH1weGApO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcpXHJcbiAgb25Nb3VzZVVwKCkge1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlSGFuZGxlKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlSGFuZGxlID0gbnVsbDtcclxuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCduby1zZWxlY3QnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKHByb3BlcnR5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSB8fCAnMCc7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// export const environment = {
|
|
2
|
+
// staging: false,
|
|
3
|
+
// development: false,
|
|
4
|
+
// production: true,
|
|
5
|
+
// chatApiUrl: 'https://api.production.com',
|
|
6
|
+
// apiKey: '',
|
|
7
|
+
// };
|
|
8
|
+
export const environment = {
|
|
9
|
+
config: 'const/app-const.json',
|
|
10
|
+
production: false,
|
|
11
|
+
apiBaseUrl: '',
|
|
12
|
+
loginEndpoint: '',
|
|
13
|
+
apiSegment: 'api/v1/',
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvY29yZS9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLG9CQUFvQjtBQUNwQix3QkFBd0I7QUFDeEIsc0JBQXNCO0FBQ3RCLDhDQUE4QztBQUM5QyxnQkFBZ0I7QUFDaEIsS0FBSztBQUNMLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRztJQUN6QixNQUFNLEVBQUUsc0JBQXNCO0lBQzlCLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFVBQVUsRUFBRSxFQUFFO0lBQ2QsYUFBYSxFQUFFLEVBQUU7SUFDakIsVUFBVSxFQUFFLFNBQVM7Q0FDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4cG9ydCBjb25zdCBlbnZpcm9ubWVudCA9IHtcclxuLy8gICBzdGFnaW5nOiBmYWxzZSxcclxuLy8gICBkZXZlbG9wbWVudDogZmFsc2UsXHJcbi8vICAgcHJvZHVjdGlvbjogdHJ1ZSxcclxuLy8gICBjaGF0QXBpVXJsOiAnaHR0cHM6Ly9hcGkucHJvZHVjdGlvbi5jb20nLFxyXG4vLyAgIGFwaUtleTogJycsXHJcbi8vIH07XHJcbmV4cG9ydCBjb25zdCBlbnZpcm9ubWVudCA9IHtcclxuICBjb25maWc6ICdjb25zdC9hcHAtY29uc3QuanNvbicsXHJcbiAgcHJvZHVjdGlvbjogZmFsc2UsXHJcbiAgYXBpQmFzZVVybDogJycsXHJcbiAgbG9naW5FbmRwb2ludDogJycsXHJcbiAgYXBpU2VnbWVudDogJ2FwaS92MS8nLFxyXG59O1xyXG4iXX0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// export const environment = {
|
|
2
|
+
// staging: false,
|
|
3
|
+
// development: false,
|
|
4
|
+
// production: true,
|
|
5
|
+
// chatApiUrl: 'https://api.production.com',
|
|
6
|
+
// apiKey: '',
|
|
7
|
+
// };
|
|
8
|
+
export const environment = {
|
|
9
|
+
config: 'const/app-const.prod.json',
|
|
10
|
+
production: true,
|
|
11
|
+
apiBaseUrl: '',
|
|
12
|
+
loginEndpoint: '',
|
|
13
|
+
apiSegment: 'api/v1/',
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQucHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rvb2hib3Qvc3JjL2xpYi9jb3JlL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5wcm9kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixvQkFBb0I7QUFDcEIsd0JBQXdCO0FBQ3hCLHNCQUFzQjtBQUN0Qiw4Q0FBOEM7QUFDOUMsZ0JBQWdCO0FBQ2hCLEtBQUs7QUFDTCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUc7SUFDekIsTUFBTSxFQUFFLDJCQUEyQjtJQUNuQyxVQUFVLEVBQUUsSUFBSTtJQUNoQixVQUFVLEVBQUUsRUFBRTtJQUNkLGFBQWEsRUFBRSxFQUFFO0lBQ2pCLFVBQVUsRUFBRSxTQUFTO0NBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBleHBvcnQgY29uc3QgZW52aXJvbm1lbnQgPSB7XHJcbi8vICAgc3RhZ2luZzogZmFsc2UsXHJcbi8vICAgZGV2ZWxvcG1lbnQ6IGZhbHNlLFxyXG4vLyAgIHByb2R1Y3Rpb246IHRydWUsXHJcbi8vICAgY2hhdEFwaVVybDogJ2h0dHBzOi8vYXBpLnByb2R1Y3Rpb24uY29tJyxcclxuLy8gICBhcGlLZXk6ICcnLFxyXG4vLyB9O1xyXG5leHBvcnQgY29uc3QgZW52aXJvbm1lbnQgPSB7XHJcbiAgY29uZmlnOiAnY29uc3QvYXBwLWNvbnN0LnByb2QuanNvbicsXHJcbiAgcHJvZHVjdGlvbjogdHJ1ZSxcclxuICBhcGlCYXNlVXJsOiAnJyxcclxuICBsb2dpbkVuZHBvaW50OiAnJyxcclxuICBhcGlTZWdtZW50OiAnYXBpL3YxLycsXHJcbn07XHJcbiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class CryptoHelperService {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.encoder = new TextEncoder();
|
|
6
|
+
this.decoder = new TextDecoder();
|
|
7
|
+
this.secretKey = ''; // Will be set by AuthService
|
|
8
|
+
}
|
|
9
|
+
setSecretKey(key) {
|
|
10
|
+
this.secretKey = key;
|
|
11
|
+
}
|
|
12
|
+
async getKey() {
|
|
13
|
+
const salt = this.encoder.encode('fixed_salt'); // Keep constant
|
|
14
|
+
const baseKey = await crypto.subtle.importKey('raw', this.encoder.encode(this.secretKey), 'PBKDF2', false, ['deriveKey']);
|
|
15
|
+
return crypto.subtle.deriveKey({
|
|
16
|
+
name: 'PBKDF2',
|
|
17
|
+
salt,
|
|
18
|
+
iterations: 100000,
|
|
19
|
+
hash: 'SHA-256',
|
|
20
|
+
}, baseKey, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt']);
|
|
21
|
+
}
|
|
22
|
+
async encrypt(value) {
|
|
23
|
+
if (!value)
|
|
24
|
+
return null;
|
|
25
|
+
const key = await this.getKey();
|
|
26
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
27
|
+
const encrypted = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, this.encoder.encode(value));
|
|
28
|
+
const merged = new Uint8Array(iv.length + encrypted.byteLength);
|
|
29
|
+
merged.set(iv, 0);
|
|
30
|
+
merged.set(new Uint8Array(encrypted), iv.length);
|
|
31
|
+
return btoa(String.fromCharCode(...merged));
|
|
32
|
+
}
|
|
33
|
+
async decrypt(value) {
|
|
34
|
+
if (!value)
|
|
35
|
+
return null;
|
|
36
|
+
const raw = Uint8Array.from(atob(value), (c) => c.charCodeAt(0));
|
|
37
|
+
const iv = raw.slice(0, 12);
|
|
38
|
+
const data = raw.slice(12);
|
|
39
|
+
const key = await this.getKey();
|
|
40
|
+
const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, data);
|
|
41
|
+
return this.decoder.decode(decrypted);
|
|
42
|
+
}
|
|
43
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CryptoHelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
44
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CryptoHelperService, providedIn: 'root' }); }
|
|
45
|
+
}
|
|
46
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CryptoHelperService, decorators: [{
|
|
47
|
+
type: Injectable,
|
|
48
|
+
args: [{
|
|
49
|
+
providedIn: 'root',
|
|
50
|
+
}]
|
|
51
|
+
}] });
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J5cHRvLWhlbHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9vaGJvdC9zcmMvbGliL2NvcmUvaGVscGVycy9jcnlwdG8taGVscGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLG1CQUFtQjtJQUhoQztRQUlVLFlBQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzVCLFlBQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzVCLGNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyw2QkFBNkI7S0ErRHREO0lBN0RDLFlBQVksQ0FBQyxHQUFXO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxLQUFLLENBQUMsTUFBTTtRQUNsQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtRQUNoRSxNQUFNLE9BQU8sR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUMzQyxLQUFLLEVBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUNuQyxRQUFRLEVBQ1IsS0FBSyxFQUNMLENBQUMsV0FBVyxDQUFDLENBQ2QsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQzVCO1lBQ0UsSUFBSSxFQUFFLFFBQVE7WUFDZCxJQUFJO1lBQ0osVUFBVSxFQUFFLE1BQU07WUFDbEIsSUFBSSxFQUFFLFNBQVM7U0FDaEIsRUFDRCxPQUFPLEVBQ1AsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFDaEMsS0FBSyxFQUNMLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUN2QixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBYTtRQUN6QixJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXhCLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV0RCxNQUFNLFNBQVMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUMzQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQ3ZCLEdBQUcsRUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDM0IsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWpELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQWE7UUFDekIsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV4QixNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFM0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFaEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWxGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEMsQ0FBQzsrR0FqRVUsbUJBQW1CO21IQUFuQixtQkFBbUIsY0FGbEIsTUFBTTs7NEZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDcnlwdG9IZWxwZXJTZXJ2aWNlIHtcclxuICBwcml2YXRlIGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcclxuICBwcml2YXRlIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcclxuICBwcml2YXRlIHNlY3JldEtleSA9ICcnOyAvLyBXaWxsIGJlIHNldCBieSBBdXRoU2VydmljZVxyXG5cclxuICBzZXRTZWNyZXRLZXkoa2V5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VjcmV0S2V5ID0ga2V5O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRLZXkoKSB7XHJcbiAgICBjb25zdCBzYWx0ID0gdGhpcy5lbmNvZGVyLmVuY29kZSgnZml4ZWRfc2FsdCcpOyAvLyBLZWVwIGNvbnN0YW50XHJcbiAgICBjb25zdCBiYXNlS2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXHJcbiAgICAgICdyYXcnLFxyXG4gICAgICB0aGlzLmVuY29kZXIuZW5jb2RlKHRoaXMuc2VjcmV0S2V5KSxcclxuICAgICAgJ1BCS0RGMicsXHJcbiAgICAgIGZhbHNlLFxyXG4gICAgICBbJ2Rlcml2ZUtleSddLFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnUEJLREYyJyxcclxuICAgICAgICBzYWx0LFxyXG4gICAgICAgIGl0ZXJhdGlvbnM6IDEwMDAwMCxcclxuICAgICAgICBoYXNoOiAnU0hBLTI1NicsXHJcbiAgICAgIH0sXHJcbiAgICAgIGJhc2VLZXksXHJcbiAgICAgIHsgbmFtZTogJ0FFUy1HQ00nLCBsZW5ndGg6IDI1NiB9LFxyXG4gICAgICBmYWxzZSxcclxuICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBlbmNyeXB0KHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZ2V0S2V5KCk7XHJcbiAgICBjb25zdCBpdiA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTIpKTtcclxuXHJcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXHJcbiAgICAgIHsgbmFtZTogJ0FFUy1HQ00nLCBpdiB9LFxyXG4gICAgICBrZXksXHJcbiAgICAgIHRoaXMuZW5jb2Rlci5lbmNvZGUodmFsdWUpLFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBtZXJnZWQgPSBuZXcgVWludDhBcnJheShpdi5sZW5ndGggKyBlbmNyeXB0ZWQuYnl0ZUxlbmd0aCk7XHJcbiAgICBtZXJnZWQuc2V0KGl2LCAwKTtcclxuICAgIG1lcmdlZC5zZXQobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSwgaXYubGVuZ3RoKTtcclxuXHJcbiAgICByZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLm1lcmdlZCkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZGVjcnlwdCh2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XHJcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCByYXcgPSBVaW50OEFycmF5LmZyb20oYXRvYih2YWx1ZSksIChjKSA9PiBjLmNoYXJDb2RlQXQoMCkpO1xyXG5cclxuICAgIGNvbnN0IGl2ID0gcmF3LnNsaWNlKDAsIDEyKTtcclxuICAgIGNvbnN0IGRhdGEgPSByYXcuc2xpY2UoMTIpO1xyXG5cclxuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZ2V0S2V5KCk7XHJcblxyXG4gICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHsgbmFtZTogJ0FFUy1HQ00nLCBpdiB9LCBrZXksIGRhdGEpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmRlY29kZXIuZGVjb2RlKGRlY3J5cHRlZCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { HttpEventType, HttpHeaders } from '@angular/common/http';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
import logger from '../utils/logger.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../auth/storage.service";
|
|
7
|
+
import * as i2 from "@angular/common/http";
|
|
8
|
+
export class HttpStreamService {
|
|
9
|
+
constructor(ngZone, tokenStorage, http) {
|
|
10
|
+
this.ngZone = ngZone;
|
|
11
|
+
this.tokenStorage = tokenStorage;
|
|
12
|
+
this.http = http;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Creates a POST-based HTTP streaming connection using fetch()
|
|
16
|
+
*/
|
|
17
|
+
createHttpStream(url, body, headers) {
|
|
18
|
+
return new Observable((observer) => {
|
|
19
|
+
// Note: Authorization header is added automatically by AuthInterceptor
|
|
20
|
+
let requestHeaders = new HttpHeaders({
|
|
21
|
+
'content-type': 'application/json',
|
|
22
|
+
accept: 'text/event-stream',
|
|
23
|
+
'cache-control': 'no-cache',
|
|
24
|
+
});
|
|
25
|
+
if (headers) {
|
|
26
|
+
Object.keys(headers).forEach((key) => {
|
|
27
|
+
requestHeaders = requestHeaders.set(key, headers[key]);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const req = this.http.request('POST', url, {
|
|
31
|
+
body,
|
|
32
|
+
headers: requestHeaders,
|
|
33
|
+
reportProgress: true,
|
|
34
|
+
observe: 'events',
|
|
35
|
+
responseType: 'text',
|
|
36
|
+
});
|
|
37
|
+
let lastLoaded = 0;
|
|
38
|
+
const sub = req.subscribe({
|
|
39
|
+
next: (event) => {
|
|
40
|
+
if (event.type === HttpEventType.DownloadProgress) {
|
|
41
|
+
// Process the new chunk of data
|
|
42
|
+
const fullText = event.partialText;
|
|
43
|
+
if (!fullText)
|
|
44
|
+
return;
|
|
45
|
+
const newText = fullText.slice(lastLoaded);
|
|
46
|
+
lastLoaded = fullText.length;
|
|
47
|
+
const lines = newText.split('\n');
|
|
48
|
+
for (const line of lines) {
|
|
49
|
+
if (line.trim() === '')
|
|
50
|
+
continue;
|
|
51
|
+
if (line.startsWith('data: ')) {
|
|
52
|
+
const dataStr = line.substring(6).trim();
|
|
53
|
+
if (dataStr === '[DONE]') {
|
|
54
|
+
this.ngZone.run(() => observer.complete());
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const parsed = JSON.parse(dataStr);
|
|
59
|
+
this.ngZone.run(() => observer.next({
|
|
60
|
+
content: parsed.content ?? parsed.message ?? '',
|
|
61
|
+
type: parsed.type ?? 'chunk',
|
|
62
|
+
id: parsed.response_id ?? '',
|
|
63
|
+
created_at: parsed.created_at ?? '',
|
|
64
|
+
sources: parsed.sources ?? [],
|
|
65
|
+
error: parsed.error,
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
logger.warn('Failed to parse SSE data:', dataStr, e);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (event.type === HttpEventType.Response) {
|
|
75
|
+
this.ngZone.run(() => observer.complete());
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
error: (err) => {
|
|
79
|
+
this.ngZone.run(() => observer.error(err));
|
|
80
|
+
},
|
|
81
|
+
complete: () => {
|
|
82
|
+
this.ngZone.run(() => observer.complete());
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
return () => sub.unsubscribe();
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HttpStreamService, deps: [{ token: i0.NgZone }, { token: i1.StorageService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
89
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HttpStreamService, providedIn: 'root' }); }
|
|
90
|
+
}
|
|
91
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HttpStreamService, decorators: [{
|
|
92
|
+
type: Injectable,
|
|
93
|
+
args: [{
|
|
94
|
+
providedIn: 'root',
|
|
95
|
+
}]
|
|
96
|
+
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.StorageService }, { type: i2.HttpClient }] });
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1zdHJlYW0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rvb2hib3Qvc3JjL2xpYi9jb3JlL2h0dHAvaHR0cC1zdHJlYW0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdsQyxPQUFPLE1BQU0sTUFBTSx5QkFBeUIsQ0FBQzs7OztBQUs3QyxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLFlBQ1UsTUFBYyxFQUNkLFlBQTRCLEVBQzVCLElBQWdCO1FBRmhCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxpQkFBWSxHQUFaLFlBQVksQ0FBZ0I7UUFDNUIsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUN2QixDQUFDO0lBRUo7O09BRUc7SUFDSCxnQkFBZ0IsQ0FDZCxHQUFXLEVBQ1gsSUFBUyxFQUNULE9BQWdDO1FBRWhDLE9BQU8sSUFBSSxVQUFVLENBQXFCLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDckQsdUVBQXVFO1lBQ3ZFLElBQUksY0FBYyxHQUFHLElBQUksV0FBVyxDQUFDO2dCQUNuQyxjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxNQUFNLEVBQUUsbUJBQW1CO2dCQUMzQixlQUFlLEVBQUUsVUFBVTthQUM1QixDQUFDLENBQUM7WUFFSCxJQUFJLE9BQU8sRUFBRTtnQkFDWCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNuQyxjQUFjLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7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QUcsRUFBRTtvQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDN0MsQ0FBQzthQUNGLENBQUMsQ0FBQztZQUVILE9BQU8sR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0E3RlUsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGaEIsTUFBTTs7NEZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXZlbnRUeXBlLCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL2F1dGgvc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2hhdFN0cmVhbVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBwL2NoYXQvbW9kZWwvY2hhdC1zdHJlYW0tcmVzcG9uc2UubW9kZWwnO1xyXG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL3V0aWxzL2xvZ2dlci5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIdHRwU3RyZWFtU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSB0b2tlblN0b3JhZ2U6IFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIFBPU1QtYmFzZWQgSFRUUCBzdHJlYW1pbmcgY29ubmVjdGlvbiB1c2luZyBmZXRjaCgpXHJcbiAgICovXHJcbiAgY3JlYXRlSHR0cFN0cmVhbShcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgYm9keTogYW55LFxyXG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXHJcbiAgKTogT2JzZXJ2YWJsZTxDaGF0U3RyZWFtUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxDaGF0U3RyZWFtUmVzcG9uc2U+KChvYnNlcnZlcikgPT4ge1xyXG4gICAgICAvLyBOb3RlOiBBdXRob3JpemF0aW9uIGhlYWRlciBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IEF1dGhJbnRlcmNlcHRvclxyXG4gICAgICBsZXQgcmVxdWVzdEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgYWNjZXB0OiAndGV4dC9ldmVudC1zdHJlYW0nLFxyXG4gICAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoaGVhZGVycykge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGhlYWRlcnMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgcmVxdWVzdEhlYWRlcnMgPSByZXF1ZXN0SGVhZGVycy5zZXQoa2V5LCBoZWFkZXJzW2tleV0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCByZXEgPSB0aGlzLmh0dHAucmVxdWVzdCgnUE9TVCcsIHVybCwge1xyXG4gICAgICAgIGJvZHksXHJcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXHJcbiAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHRydWUsXHJcbiAgICAgICAgb2JzZXJ2ZTogJ2V2ZW50cycsXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbGV0IGxhc3RMb2FkZWQgPSAwO1xyXG5cclxuICAgICAgY29uc3Qgc3ViID0gcmVxLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5Eb3dubG9hZFByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIG5ldyBjaHVuayBvZiBkYXRhXHJcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxUZXh0ID0gKGV2ZW50IGFzIGFueSkucGFydGlhbFRleHQ7XHJcbiAgICAgICAgICAgIGlmICghZnVsbFRleHQpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBmdWxsVGV4dC5zbGljZShsYXN0TG9hZGVkKTtcclxuICAgICAgICAgICAgbGFzdExvYWRlZCA9IGZ1bGxUZXh0Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gbmV3VGV4dC5zcGxpdCgnXFxuJyk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcclxuICAgICAgICAgICAgICBpZiAobGluZS50cmltKCkgPT09ICcnKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnZGF0YTogJykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTdHIgPSBsaW5lLnN1YnN0cmluZyg2KS50cmltKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGFTdHIgPT09ICdbRE9ORV0nKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiBvYnNlcnZlci5jb21wbGV0ZSgpKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YVN0cik7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudDogcGFyc2VkLmNvbnRlbnQgPz8gcGFyc2VkLm1lc3NhZ2UgPz8gJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBwYXJzZWQudHlwZSA/PyAnY2h1bmsnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcnNlZC5yZXNwb25zZV9pZCA/PyAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRfYXQ6IHBhcnNlZC5jcmVhdGVkX2F0ID8/ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgc291cmNlczogcGFyc2VkLnNvdXJjZXMgPz8gW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogcGFyc2VkLmVycm9yLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHBhcnNlIFNTRSBkYXRhOicsIGRhdGFTdHIsIGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiBvYnNlcnZlci5jb21wbGV0ZSgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gb2JzZXJ2ZXIuZXJyb3IoZXJyKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IG9ic2VydmVyLmNvbXBsZXRlKCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuICgpID0+IHN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|