http-request-manager 18.3.3 → 18.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +478 -255
- package/esm2022/lib/http-request-manager.module.mjs +20 -47
- package/esm2022/lib/http-request-services-demo/database-data-demo/database-data-demo.component.mjs +113 -32
- package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +11 -8
- package/esm2022/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.mjs +3 -6
- package/esm2022/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.mjs +13 -0
- package/esm2022/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.mjs +13 -0
- package/esm2022/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.mjs +128 -0
- package/esm2022/lib/http-request-services-demo/request-manager-ws-demo/services/state-request.service.mjs +74 -0
- package/esm2022/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.mjs +4 -1
- package/esm2022/lib/models/database-storage.model.mjs +1 -1
- package/esm2022/lib/services/database-manager-service/database.manager.service.mjs +171 -0
- package/esm2022/lib/services/database-manager-service/db.storage.service.mjs +183 -0
- package/esm2022/lib/services/database-manager-service/index.mjs +4 -0
- package/esm2022/lib/services/database-manager-service/models/table-schema.mjs +19 -0
- package/esm2022/lib/services/index.mjs +1 -2
- package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +7 -1
- package/esm2022/lib/services/local-storage-manager-service/models/storage-option.model.mjs +4 -3
- package/esm2022/lib/services/request-manager-services/request.service.mjs +2 -2
- package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +272 -84
- package/esm2022/lib/services/request-manager-state-service/models/ws-options.model.mjs +6 -3
- package/esm2022/lib/services/request-manager-state-service/models/ws-user.model.mjs +10 -0
- package/esm2022/lib/services/store-state-manager-service/store-state-manager.service.mjs +4 -4
- package/esm2022/lib/services/utils/utils.service.mjs +14 -14
- package/esm2022/lib/services/ws-manager-service/index.mjs +2 -2
- package/esm2022/lib/services/ws-manager-service/models/channel-notification.model.mjs +5 -3
- package/esm2022/lib/services/ws-manager-service/models/communication-type.enum.mjs +7 -0
- package/esm2022/lib/services/ws-manager-service/models/index.mjs +2 -3
- package/esm2022/lib/services/ws-manager-service/models/user-message.model.mjs +1 -1
- package/esm2022/lib/services/ws-manager-service/services/websocket.service.mjs +178 -0
- package/fesm2022/http-request-manager.mjs +2600 -2024
- package/fesm2022/http-request-manager.mjs.map +1 -1
- package/http-request-manager-18.4.0.tgz +0 -0
- package/lib/http-request-manager.module.d.ts +25 -22
- package/lib/http-request-services-demo/database-data-demo/database-data-demo.component.d.ts +39 -12
- package/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.d.ts +0 -1
- package/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.d.ts +16 -0
- package/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.d.ts +14 -0
- package/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.d.ts +39 -0
- package/lib/http-request-services-demo/request-manager-ws-demo/services/state-request.service.d.ts +14 -0
- package/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.d.ts +1 -0
- package/lib/services/{database-manager-services → database-manager-service}/database.manager.service.d.ts +9 -7
- package/lib/services/{database-manager-services → database-manager-service}/db.storage.service.d.ts +14 -14
- package/lib/services/index.d.ts +0 -1
- package/lib/services/local-storage-manager-service/models/storage-option.model.d.ts +3 -1
- package/lib/services/request-manager-services/request.service.d.ts +1 -1
- package/lib/services/request-manager-state-service/http-manager-state.store.d.ts +34 -19
- package/lib/services/request-manager-state-service/models/ws-options.model.d.ts +9 -1
- package/lib/services/request-manager-state-service/models/ws-user.model.d.ts +10 -0
- package/lib/services/store-state-manager-service/store-state-manager.service.d.ts +3 -2
- package/lib/services/ws-manager-service/index.d.ts +1 -1
- package/lib/services/ws-manager-service/models/channel-notification.model.d.ts +4 -1
- package/lib/services/ws-manager-service/models/communication-type.enum.d.ts +5 -0
- package/lib/services/ws-manager-service/models/index.d.ts +1 -2
- package/lib/services/ws-manager-service/models/user-message.model.d.ts +5 -6
- package/lib/services/ws-manager-service/{websocket.service.d.ts → services/websocket.service.d.ts} +5 -2
- package/package.json +1 -1
- package/esm2022/lib/services/database-manager-services/database.manager.service.mjs +0 -119
- package/esm2022/lib/services/database-manager-services/db.storage.service.mjs +0 -143
- package/esm2022/lib/services/database-manager-services/index.mjs +0 -4
- package/esm2022/lib/services/database-manager-services/models/table-schema.mjs +0 -20
- package/esm2022/lib/services/ws-manager-service/models/user-info.model.mjs +0 -11
- package/esm2022/lib/services/ws-manager-service/models/user-name-info.model.mjs +0 -12
- package/esm2022/lib/services/ws-manager-service/websocket.service.mjs +0 -133
- package/http-request-manager-18.3.3.tgz +0 -0
- package/lib/services/ws-manager-service/models/user-info.model.d.ts +0 -11
- package/lib/services/ws-manager-service/models/user-name-info.model.d.ts +0 -14
- /package/lib/services/{database-manager-services → database-manager-service}/index.d.ts +0 -0
- /package/lib/services/{database-manager-services → database-manager-service}/models/table-schema.d.ts +0 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { FormBuilder, Validators } from '@angular/forms';
|
|
3
|
+
import { combineLatest, map, EMPTY } from 'rxjs';
|
|
4
|
+
import { HTTPManagerService, RandomNumber, ChannelMessage, CommunicationType } from '../../services';
|
|
5
|
+
import { StateRequestService } from './services/state-request.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common";
|
|
8
|
+
import * as i2 from "@angular/forms";
|
|
9
|
+
import * as i3 from "@angular/material/button";
|
|
10
|
+
import * as i4 from "@angular/material/tabs";
|
|
11
|
+
import * as i5 from "@angular/material/form-field";
|
|
12
|
+
import * as i6 from "@angular/material/select";
|
|
13
|
+
import * as i7 from "@angular/material/core";
|
|
14
|
+
import * as i8 from "@angular/material/chips";
|
|
15
|
+
import * as i9 from "@angular/material/input";
|
|
16
|
+
import * as i10 from "@angular/material/toolbar";
|
|
17
|
+
export class RequestManagerWsDemoComponent {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.httpManagerService = inject(HTTPManagerService);
|
|
20
|
+
this.stateRequestService = inject(StateRequestService);
|
|
21
|
+
this.fb = inject(FormBuilder);
|
|
22
|
+
this.user$ = this.stateRequestService.user$;
|
|
23
|
+
this.users$ = this.stateRequestService.userList$;
|
|
24
|
+
this.attempts$ = this.stateRequestService.attempts$;
|
|
25
|
+
this.nextRetry$ = this.stateRequestService.nextRetry$;
|
|
26
|
+
this.connectionStatus$ = this.stateRequestService.status$;
|
|
27
|
+
this.messages = this.fb.group({
|
|
28
|
+
toUser: this.fb.control(null, Validators.required),
|
|
29
|
+
content: this.fb.control(null, Validators.required),
|
|
30
|
+
});
|
|
31
|
+
this.data$ = this.stateRequestService.data$;
|
|
32
|
+
this.fromMe = (user, fromUser) => {
|
|
33
|
+
return user === fromUser;
|
|
34
|
+
};
|
|
35
|
+
this.communicationMessages$ = this.stateRequestService.communicationMessages$;
|
|
36
|
+
this.latestCommunicationMessages$ = this.stateRequestService.latestCommunicationMessages$;
|
|
37
|
+
this.chat$ = combineLatest([this.user$, this.communicationMessages$]).pipe(map(([user, messages]) => ({ user, messages })), map(obj => {
|
|
38
|
+
if (!obj.user)
|
|
39
|
+
return EMPTY;
|
|
40
|
+
// const mainUser = UserName.adapt({
|
|
41
|
+
// id: obj.user.username,
|
|
42
|
+
// first: obj.user?.name?.first,
|
|
43
|
+
// last: obj.user?.name?.last,
|
|
44
|
+
// })
|
|
45
|
+
const mainUser = '';
|
|
46
|
+
const messages = obj.messages.map((item) => {
|
|
47
|
+
if (item.toUser === 'allChannels') {
|
|
48
|
+
// item.toUser = UserName.adapt({
|
|
49
|
+
// id: '',
|
|
50
|
+
// first: 'All Users',
|
|
51
|
+
// last: '',
|
|
52
|
+
// })
|
|
53
|
+
}
|
|
54
|
+
// return Message.adapt({
|
|
55
|
+
// fromUser: {
|
|
56
|
+
// id: item.fromUser.username,
|
|
57
|
+
// first: item.fromUser?.name?.first,
|
|
58
|
+
// last: item.fromUser?.name?.last,
|
|
59
|
+
// },
|
|
60
|
+
// toUser: {
|
|
61
|
+
// id: item.toUser.username,
|
|
62
|
+
// first: item.toUser?.name?.first,
|
|
63
|
+
// last: item.toUser?.name?.last,
|
|
64
|
+
// },
|
|
65
|
+
// content: item.content,
|
|
66
|
+
// date: item.issued,
|
|
67
|
+
// })
|
|
68
|
+
});
|
|
69
|
+
return { user: mainUser, messages };
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
get toUser() {
|
|
73
|
+
return this.messages.get('toUser');
|
|
74
|
+
}
|
|
75
|
+
get content() {
|
|
76
|
+
return this.messages.get('content');
|
|
77
|
+
}
|
|
78
|
+
get isValid() {
|
|
79
|
+
return this.toUser.valid;
|
|
80
|
+
}
|
|
81
|
+
ngOnInit() {
|
|
82
|
+
this.stateRequestService.getData();
|
|
83
|
+
}
|
|
84
|
+
onGetData() {
|
|
85
|
+
this.stateRequestService.getData();
|
|
86
|
+
}
|
|
87
|
+
onAddData() {
|
|
88
|
+
this.stateRequestService.addData();
|
|
89
|
+
}
|
|
90
|
+
onUpdateData(data) {
|
|
91
|
+
const num = RandomNumber(1000, 9999);
|
|
92
|
+
const newData = {
|
|
93
|
+
"spiffe": `wavecoders.com/developer/${num}`,
|
|
94
|
+
"id": 63,
|
|
95
|
+
"last_name": "boni",
|
|
96
|
+
"email": "mikeboni@hotmail.com",
|
|
97
|
+
"first_name": "mike"
|
|
98
|
+
};
|
|
99
|
+
this.stateRequestService.updateData(newData);
|
|
100
|
+
}
|
|
101
|
+
onSendMessage() {
|
|
102
|
+
this.messages.markAllAsTouched();
|
|
103
|
+
if (this.messages.invalid)
|
|
104
|
+
return;
|
|
105
|
+
const message = ChannelMessage.adapt(this.messages.value);
|
|
106
|
+
this.stateRequestService.sendMessage(message);
|
|
107
|
+
this.content.reset();
|
|
108
|
+
}
|
|
109
|
+
onSendAlert() {
|
|
110
|
+
this.messages.markAllAsTouched();
|
|
111
|
+
if (this.messages.invalid)
|
|
112
|
+
return;
|
|
113
|
+
const message = ChannelMessage.adapt({ ...this.messages.value, type: CommunicationType.ALERT });
|
|
114
|
+
this.stateRequestService.sendMessage(message);
|
|
115
|
+
this.content.reset();
|
|
116
|
+
}
|
|
117
|
+
onRemoveData(data) {
|
|
118
|
+
const lastRec = data[data.length - 1];
|
|
119
|
+
this.stateRequestService.deleteData(lastRec);
|
|
120
|
+
}
|
|
121
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestManagerWsDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
122
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: RequestManagerWsDemoComponent, selector: "app-request-manager-ws-demo", ngImport: i0, template: "<div style=\"margin: 2rem;\">\n\n <h2 style=\"display: flex;\">\n <span style=\"flex:1\">HTTP Request State Manager - Websockets</span>\n <span *ngIf=\"(connectionStatus$ | async) as connected; else NOT_CONNECTED\">\n WS -\n <span style=\"color: green;\">Connected</span>\n </span>\n <ng-template #NOT_CONNECTED>\n <span style=\"color: red;\">Disconnected {{ attempts$ | async }} - {{ nextRetry$ |async }}</span>\n </ng-template>\n </h2>\n\n <div>\n\n <div *ngIf=\"(user$ | async) as userInfo\">\n <mat-toolbar>\n <div style=\"display: flex; flex:1\">\n <div style=\"flex:1\">{{ userInfo.name }}</div>\n <div>({{ userInfo.username }})</div>\n </div>\n </mat-toolbar>\n </div>\n\n <mat-tab-group animationDuration=\"0ms\">\n\n <mat-tab label=\"WS - Data Control\">\n\n <div *ngIf=\"(data$ | async) as data\" style=\"margin: 1rem; display: flex; gap: 1rem; flex-direction: column;\">\n\n <div *ngIf=\"(users$ |async) as users\">\n <mat-chip-set>\n <mat-chip *ngFor=\"let user of users\">\n {{ user.name }}\n </mat-chip>\n </mat-chip-set>\n </div>\n\n <div style=\"display: flex; gap: 1rem; margin-bottom: 1rem;\">\n <button mat-stroked-button (click)=\"onGetData()\">Get Data</button>\n <button mat-stroked-button color=\"accent\" (click)=\"onUpdateData(data)\">Update Data</button>\n <button mat-stroked-button color=\"warn\" (click)=\"onRemoveData(data)\">Remove Data</button>\n <button mat-stroked-button color=\"primary\" (click)=\"onAddData()\">Add Data</button>\n </div>\n\n <div style=\"display: flex; gap: 1rem; flex-direction: column;\">\n <div>{{ data | json }}</div>\n <h2>{{ data.length }}</h2>\n </div>\n\n </div>\n\n </mat-tab>\n\n <mat-tab label=\"WS - Messaging\">\n\n <div *ngIf=\"(data$ | async) as data\" style=\"margin: 1rem; display: flex; gap: 1rem; flex-direction: column;\">\n\n <div *ngIf=\"(user$ | async) as userInfo\">\n\n <div *ngIf=\"(users$ | async) as users\">\n\n <div style=\"display: flex; gap: 1rem\">\n\n <div style=\"flex:1\" [formGroup]=\"messages\">\n <div style=\"display:flex\">\n <mat-form-field style=\"flex:1\" appearance=\"outline\">\n <mat-label>Users</mat-label>\n <mat-select formControlName=\"toUser\">\n <mat-option value=\"allChannels\" #selectedUser>\n All Users\n </mat-option>\n <mat-option *ngFor=\"let user of users\" [value]=\"user\">\n {{ user.username }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display:flex\">\n <mat-form-field style=\"flex:1\" appearance=\"outline\">\n <mat-label>Send a Message</mat-label>\n <textarea\n matInput placeholder=\"Ex. It makes me feel...\"\n formControlName=\"content\"\n (keydown.enter)=\"onSendMessage(); $event.preventDefault()\"\n [disabled]=\"!isValid\"\n ></textarea>\n </mat-form-field>\n </div>\n <div style=\"display:flex; gap: .5rem;\">\n <div style=\"flex:1\"></div>\n <button mat-stroked-button (click)=\"onSendMessage()\" color=\"warn\">\n Send Alert\n </button>\n <button mat-stroked-button (click)=\"onSendAlert()\">\n Send Message\n </button>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"(chat$ | async) as chat\" style=\"border: thin gray solid; padding: 1rem; margin-top: 1rem;\">\n <!-- <app-messenger-chat\n [user]=\"chat.user\"\n [messages]=\"chat.messages\"\n ></app-messenger-chat> -->\n </div>\n\n </div>\n\n </div>\n\n </div>\n\n </mat-tab>\n\n <mat-tab label=\"WS - Custom Channel Messaging\" [disabled]=\"true\">\n WS - Custom Channel Messaging\n </mat-tab>\n\n </mat-tab-group>\n </div>\n\n</div>\n\n\n<div style=\"margin: 1rem;\">\n <h3>\n user: {{ user$ | async | json}}\n </h3>\n\n <h3>\n users: {{ users$ | async | json}}\n </h3>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i8.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i8.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] }); }
|
|
123
|
+
}
|
|
124
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestManagerWsDemoComponent, decorators: [{
|
|
125
|
+
type: Component,
|
|
126
|
+
args: [{ selector: 'app-request-manager-ws-demo', template: "<div style=\"margin: 2rem;\">\n\n <h2 style=\"display: flex;\">\n <span style=\"flex:1\">HTTP Request State Manager - Websockets</span>\n <span *ngIf=\"(connectionStatus$ | async) as connected; else NOT_CONNECTED\">\n WS -\n <span style=\"color: green;\">Connected</span>\n </span>\n <ng-template #NOT_CONNECTED>\n <span style=\"color: red;\">Disconnected {{ attempts$ | async }} - {{ nextRetry$ |async }}</span>\n </ng-template>\n </h2>\n\n <div>\n\n <div *ngIf=\"(user$ | async) as userInfo\">\n <mat-toolbar>\n <div style=\"display: flex; flex:1\">\n <div style=\"flex:1\">{{ userInfo.name }}</div>\n <div>({{ userInfo.username }})</div>\n </div>\n </mat-toolbar>\n </div>\n\n <mat-tab-group animationDuration=\"0ms\">\n\n <mat-tab label=\"WS - Data Control\">\n\n <div *ngIf=\"(data$ | async) as data\" style=\"margin: 1rem; display: flex; gap: 1rem; flex-direction: column;\">\n\n <div *ngIf=\"(users$ |async) as users\">\n <mat-chip-set>\n <mat-chip *ngFor=\"let user of users\">\n {{ user.name }}\n </mat-chip>\n </mat-chip-set>\n </div>\n\n <div style=\"display: flex; gap: 1rem; margin-bottom: 1rem;\">\n <button mat-stroked-button (click)=\"onGetData()\">Get Data</button>\n <button mat-stroked-button color=\"accent\" (click)=\"onUpdateData(data)\">Update Data</button>\n <button mat-stroked-button color=\"warn\" (click)=\"onRemoveData(data)\">Remove Data</button>\n <button mat-stroked-button color=\"primary\" (click)=\"onAddData()\">Add Data</button>\n </div>\n\n <div style=\"display: flex; gap: 1rem; flex-direction: column;\">\n <div>{{ data | json }}</div>\n <h2>{{ data.length }}</h2>\n </div>\n\n </div>\n\n </mat-tab>\n\n <mat-tab label=\"WS - Messaging\">\n\n <div *ngIf=\"(data$ | async) as data\" style=\"margin: 1rem; display: flex; gap: 1rem; flex-direction: column;\">\n\n <div *ngIf=\"(user$ | async) as userInfo\">\n\n <div *ngIf=\"(users$ | async) as users\">\n\n <div style=\"display: flex; gap: 1rem\">\n\n <div style=\"flex:1\" [formGroup]=\"messages\">\n <div style=\"display:flex\">\n <mat-form-field style=\"flex:1\" appearance=\"outline\">\n <mat-label>Users</mat-label>\n <mat-select formControlName=\"toUser\">\n <mat-option value=\"allChannels\" #selectedUser>\n All Users\n </mat-option>\n <mat-option *ngFor=\"let user of users\" [value]=\"user\">\n {{ user.username }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display:flex\">\n <mat-form-field style=\"flex:1\" appearance=\"outline\">\n <mat-label>Send a Message</mat-label>\n <textarea\n matInput placeholder=\"Ex. It makes me feel...\"\n formControlName=\"content\"\n (keydown.enter)=\"onSendMessage(); $event.preventDefault()\"\n [disabled]=\"!isValid\"\n ></textarea>\n </mat-form-field>\n </div>\n <div style=\"display:flex; gap: .5rem;\">\n <div style=\"flex:1\"></div>\n <button mat-stroked-button (click)=\"onSendMessage()\" color=\"warn\">\n Send Alert\n </button>\n <button mat-stroked-button (click)=\"onSendAlert()\">\n Send Message\n </button>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"(chat$ | async) as chat\" style=\"border: thin gray solid; padding: 1rem; margin-top: 1rem;\">\n <!-- <app-messenger-chat\n [user]=\"chat.user\"\n [messages]=\"chat.messages\"\n ></app-messenger-chat> -->\n </div>\n\n </div>\n\n </div>\n\n </div>\n\n </mat-tab>\n\n <mat-tab label=\"WS - Custom Channel Messaging\" [disabled]=\"true\">\n WS - Custom Channel Messaging\n </mat-tab>\n\n </mat-tab-group>\n </div>\n\n</div>\n\n\n<div style=\"margin: 1rem;\">\n <h3>\n user: {{ user$ | async | json}}\n </h3>\n\n <h3>\n users: {{ users$ | async | json}}\n </h3>\n</div>\n" }]
|
|
127
|
+
}] });
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1tYW5hZ2VyLXdzLWRlbW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9odHRwLXJlcXVlc3Qtc2VydmljZXMtZGVtby9yZXF1ZXN0LW1hbmFnZXItd3MtZGVtby9yZXF1ZXN0LW1hbmFnZXItd3MtZGVtby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci13cy1kZW1vL3JlcXVlc3QtbWFuYWdlci13cy1kZW1vLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxFQUFjLGFBQWEsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFPLE1BQU0sTUFBTSxDQUFDO0FBRWxFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7OztBQU92RSxNQUFNLE9BQU8sNkJBQTZCO0lBTDFDO1FBT0UsdUJBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDL0Msd0JBQW1CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUE7UUFFakQsT0FBRSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUV4QixVQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtB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SyxFQUFFLENBQUMsQ0FBQTtRQUMvRixJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDdEIsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFTO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDOUMsQ0FBQzsrR0FySVUsNkJBQTZCO21HQUE3Qiw2QkFBNkIsbUVDWjFDLHVzSkF1SUE7OzRGRDNIYSw2QkFBNkI7a0JBTHpDLFNBQVM7K0JBQ0UsNkJBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCwgbWFwLCBFTVBUWSwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEhUVFBNYW5hZ2VyU2VydmljZSwgUmFuZG9tTnVtYmVyLCBDaGFubmVsTWVzc2FnZSwgQ29tbXVuaWNhdGlvblR5cGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBTdGF0ZVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9zdGF0ZS1yZXF1ZXN0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVxdWVzdC1tYW5hZ2VyLXdzLWRlbW8nLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVxdWVzdC1tYW5hZ2VyLXdzLWRlbW8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXF1ZXN0LW1hbmFnZXItd3MtZGVtby5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUmVxdWVzdE1hbmFnZXJXc0RlbW9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGh0dHBNYW5hZ2VyU2VydmljZSA9IGluamVjdChIVFRQTWFuYWdlclNlcnZpY2UpXG4gIHN0YXRlUmVxdWVzdFNlcnZpY2UgPSBpbmplY3QoU3RhdGVSZXF1ZXN0U2VydmljZSlcblxuICBmYiA9IGluamVjdChGb3JtQnVpbGRlcilcblxuICB1c2VyJCA9IHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZS51c2VyJFxuICB1c2VycyQgPSB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2UudXNlckxpc3QkXG5cbiAgYXR0ZW1wdHMkID0gdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlLmF0dGVtcHRzJFxuICBuZXh0UmV0cnkkID0gdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlLm5leHRSZXRyeSRcblxuICBjb25uZWN0aW9uU3RhdHVzJCA9IHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZS5zdGF0dXMkXG5cbiAgbWVzc2FnZXMgPSB0aGlzLmZiLmdyb3VwPGFueT4oe1xuICAgIHRvVXNlcjogdGhpcy5mYi5jb250cm9sPHN0cmluZ3xudWxsPihudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBjb250ZW50OiB0aGlzLmZiLmNvbnRyb2w8c3RyaW5nfG51bGw+KG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICB9KVxuXG4gIGdldCB0b1VzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZXMuZ2V0KCd0b1VzZXInKSBhcyBGb3JtQ29udHJvbFxuICB9XG5cbiAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZXMuZ2V0KCdjb250ZW50JykgYXMgRm9ybUNvbnRyb2xcbiAgfVxuXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLnRvVXNlci52YWxpZFxuICB9XG5cbiAgZGF0YSQgPSB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2UuZGF0YSQ7XG5cbiAgZnJvbU1lID0gKHVzZXI6IHN0cmluZywgZnJvbVVzZXI6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiB1c2VyID09PSBmcm9tVXNlclxuICB9XG5cbiAgY29tbXVuaWNhdGlvbk1lc3NhZ2VzJCA9IHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZS5jb21tdW5pY2F0aW9uTWVzc2FnZXMkXG4gIGxhdGVzdENvbW11bmljYXRpb25NZXNzYWdlcyQgPSB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2UubGF0ZXN0Q29tbXVuaWNhdGlvbk1lc3NhZ2VzJFxuXG4gIGNoYXQkOiBPYnNlcnZhYmxlPHsgdXNlcjogYW55LCBtZXNzYWdlczogYW55W119fGFueT4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnVzZXIkLCB0aGlzLmNvbW11bmljYXRpb25NZXNzYWdlcyRdKS5waXBlKFxuICAgIG1hcCgoW3VzZXIsIG1lc3NhZ2VzXTogYW55KSA9PiAoeyB1c2VyLCBtZXNzYWdlcyB9KSksXG4gICAgbWFwKG9iaiA9PiB7XG5cbiAgICAgIGlmKCFvYmoudXNlcikgcmV0dXJuIEVNUFRZXG5cbiAgICAgIC8vIGNvbnN0IG1haW5Vc2VyID0gVXNlck5hbWUuYWRhcHQoe1xuICAgICAgLy8gICAgIGlkOiBvYmoudXNlci51c2VybmFtZSxcbiAgICAgIC8vICAgICBmaXJzdDogb2JqLnVzZXI/Lm5hbWU/LmZpcnN0LFxuICAgICAgLy8gICAgIGxhc3Q6IG9iai51c2VyPy5uYW1lPy5sYXN0LFxuICAgICAgLy8gfSlcblxuICAgICAgY29uc3QgbWFpblVzZXIgPSAnJ1xuXG4gICAgICBjb25zdCBtZXNzYWdlcyA9IG9iai5tZXNzYWdlcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xuXG4gICAgICAgIGlmKGl0ZW0udG9Vc2VyID09PSAnYWxsQ2hhbm5lbHMnKSB7XG4gICAgICAgICAgLy8gaXRlbS50b1VzZXIgPSBVc2VyTmFtZS5hZGFwdCh7XG4gICAgICAgICAgLy8gICAgIGlkOiAnJyxcbiAgICAgICAgICAvLyAgICAgZmlyc3Q6ICdBbGwgVXNlcnMnLFxuICAgICAgICAgIC8vICAgICBsYXN0OiAnJyxcbiAgICAgICAgICAvLyB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV0dXJuIE1lc3NhZ2UuYWRhcHQoe1xuICAgICAgICAvLyAgICAgZnJvbVVzZXI6IHtcbiAgICAgICAgLy8gICAgICAgaWQ6IGl0ZW0uZnJvbVVzZXIudXNlcm5hbWUsXG4gICAgICAgIC8vICAgICAgIGZpcnN0OiBpdGVtLmZyb21Vc2VyPy5uYW1lPy5maXJzdCxcbiAgICAgICAgLy8gICAgICAgbGFzdDogaXRlbS5mcm9tVXNlcj8ubmFtZT8ubGFzdCxcbiAgICAgICAgLy8gICAgIH0sXG4gICAgICAgIC8vICAgICB0b1VzZXI6IHtcbiAgICAgICAgLy8gICAgICAgaWQ6IGl0ZW0udG9Vc2VyLnVzZXJuYW1lLFxuICAgICAgICAvLyAgICAgICBmaXJzdDogaXRlbS50b1VzZXI/Lm5hbWU/LmZpcnN0LFxuICAgICAgICAvLyAgICAgICBsYXN0OiBpdGVtLnRvVXNlcj8ubmFtZT8ubGFzdCxcbiAgICAgICAgLy8gICAgIH0sXG4gICAgICAgIC8vICAgICBjb250ZW50OiBpdGVtLmNvbnRlbnQsXG4gICAgICAgIC8vICAgICBkYXRlOiBpdGVtLmlzc3VlZCxcbiAgICAgICAgLy8gfSlcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7IHVzZXI6IG1haW5Vc2VyLCBtZXNzYWdlcyB9XG5cbiAgICB9KVxuICApO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZS5nZXREYXRhKClcbiAgfVxuXG4gIG9uR2V0RGF0YSgpIHtcbiAgICB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2UuZ2V0RGF0YSgpXG4gIH1cblxuICBvbkFkZERhdGEoKSB7XG4gICAgdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlLmFkZERhdGEoKVxuICB9XG5cbiAgb25VcGRhdGVEYXRhKGRhdGE6IGFueVtdKSB7XG5cbiAgICBjb25zdCBudW0gPSBSYW5kb21OdW1iZXIoMTAwMCwgOTk5OSlcblxuICAgIGNvbnN0IG5ld0RhdGEgPSB7XG4gICAgICBcInNwaWZmZVwiOiBgd2F2ZWNvZGVycy5jb20vZGV2ZWxvcGVyLyR7bnVtfWAsXG4gICAgICBcImlkXCI6IDYzLFxuICAgICAgXCJsYXN0X25hbWVcIjogXCJib25pXCIsXG4gICAgICBcImVtYWlsXCI6IFwibWlrZWJvbmlAaG90bWFpbC5jb21cIixcbiAgICAgIFwiZmlyc3RfbmFtZVwiOiBcIm1pa2VcIlxuICAgIH1cblxuICAgIHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZS51cGRhdGVEYXRhKG5ld0RhdGEpXG5cbiAgfVxuXG4gIG9uU2VuZE1lc3NhZ2UoKSB7XG4gICAgdGhpcy5tZXNzYWdlcy5tYXJrQWxsQXNUb3VjaGVkKClcbiAgICBpZiAodGhpcy5tZXNzYWdlcy5pbnZhbGlkKSByZXR1cm5cbiAgICBjb25zdCBtZXNzYWdlID0gQ2hhbm5lbE1lc3NhZ2UuYWRhcHQodGhpcy5tZXNzYWdlcy52YWx1ZSlcbiAgICB0aGlzLnN0YXRlUmVxdWVzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UobWVzc2FnZSlcbiAgICB0aGlzLmNvbnRlbnQucmVzZXQoKVxuICB9XG5cbiAgb25TZW5kQWxlcnQoKSB7XG4gICAgdGhpcy5tZXNzYWdlcy5tYXJrQWxsQXNUb3VjaGVkKClcbiAgICBpZiAodGhpcy5tZXNzYWdlcy5pbnZhbGlkKSByZXR1cm5cbiAgICBjb25zdCBtZXNzYWdlID0gQ2hhbm5lbE1lc3NhZ2UuYWRhcHQoeyAuLi50aGlzLm1lc3NhZ2VzLnZhbHVlLCB0eXBlOiBDb21tdW5pY2F0aW9uVHlwZS5BTEVSVCB9KVxuICAgIHRoaXMuc3RhdGVSZXF1ZXN0U2VydmljZS5zZW5kTWVzc2FnZShtZXNzYWdlKVxuICAgIHRoaXMuY29udGVudC5yZXNldCgpXG4gIH1cblxuICBvblJlbW92ZURhdGEoZGF0YTogYW55KSB7XG4gICAgY29uc3QgbGFzdFJlYyA9IGRhdGFbZGF0YS5sZW5ndGggLTFdXG4gICAgdGhpcy5zdGF0ZVJlcXVlc3RTZXJ2aWNlLmRlbGV0ZURhdGEobGFzdFJlYylcbiAgfVxuXG59XG4iLCI8ZGl2IHN0eWxlPVwibWFyZ2luOiAycmVtO1wiPlxuXG4gIDxoMiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgPHNwYW4gc3R5bGU9XCJmbGV4OjFcIj5IVFRQIFJlcXVlc3QgU3RhdGUgTWFuYWdlciAtIFdlYnNvY2tldHM8L3NwYW4+XG4gICAgPHNwYW4gKm5nSWY9XCIoY29ubmVjdGlvblN0YXR1cyQgfCBhc3luYykgYXMgY29ubmVjdGVkOyBlbHNlIE5PVF9DT05ORUNURURcIj5cbiAgICAgIFdTIC1cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IGdyZWVuO1wiPkNvbm5lY3RlZDwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gICAgPG5nLXRlbXBsYXRlICNOT1RfQ09OTkVDVEVEPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogcmVkO1wiPkRpc2Nvbm5lY3RlZCB7eyBhdHRlbXB0cyQgfCBhc3luYyB9fSAtIHt7IG5leHRSZXRyeSQgfGFzeW5jIH19PC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvaDI+XG5cbiAgPGRpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIodXNlciQgfCBhc3luYykgYXMgdXNlckluZm9cIj5cbiAgICAgIDxtYXQtdG9vbGJhcj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXg6MVwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjFcIj57eyB1c2VySW5mby5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgPGRpdj4oe3sgdXNlckluZm8udXNlcm5hbWUgfX0pPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYXQtdG9vbGJhcj5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtdGFiLWdyb3VwIGFuaW1hdGlvbkR1cmF0aW9uPVwiMG1zXCI+XG5cbiAgICAgIDxtYXQtdGFiIGxhYmVsPVwiV1MgLSBEYXRhIENvbnRyb2xcIj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiKGRhdGEkIHwgYXN5bmMpIGFzIGRhdGFcIiBzdHlsZT1cIm1hcmdpbjogMXJlbTsgZGlzcGxheTogZmxleDsgZ2FwOiAxcmVtOyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiPlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIih1c2VycyQgfGFzeW5jKSBhcyB1c2Vyc1wiPlxuICAgICAgICAgICAgPG1hdC1jaGlwLXNldD5cbiAgICAgICAgICAgICAgPG1hdC1jaGlwICpuZ0Zvcj1cImxldCB1c2VyIG9mIHVzZXJzXCI+XG4gICAgICAgICAgICAgICAge3sgdXNlci5uYW1lIH19XG4gICAgICAgICAgICAgIDwvbWF0LWNoaXA+XG4gICAgICAgICAgICA8L21hdC1jaGlwLXNldD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDFyZW07IG1hcmdpbi1ib3R0b206IDFyZW07XCI+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwib25HZXREYXRhKClcIj5HZXQgRGF0YTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJhY2NlbnRcIiAoY2xpY2spPVwib25VcGRhdGVEYXRhKGRhdGEpXCI+VXBkYXRlIERhdGE8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwid2FyblwiIChjbGljayk9XCJvblJlbW92ZURhdGEoZGF0YSlcIj5SZW1vdmUgRGF0YTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cIm9uQWRkRGF0YSgpXCI+QWRkIERhdGE8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDFyZW07IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCI+XG4gICAgICAgICAgICA8ZGl2Pnt7IGRhdGEgfCBqc29uIH19PC9kaXY+XG4gICAgICAgICAgICA8aDI+e3sgZGF0YS5sZW5ndGggfX08L2gyPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L21hdC10YWI+XG5cbiAgICAgIDxtYXQtdGFiIGxhYmVsPVwiV1MgLSBNZXNzYWdpbmdcIj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiKGRhdGEkIHwgYXN5bmMpIGFzIGRhdGFcIiBzdHlsZT1cIm1hcmdpbjogMXJlbTsgZGlzcGxheTogZmxleDsgZ2FwOiAxcmVtOyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiPlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIih1c2VyJCB8IGFzeW5jKSBhcyB1c2VySW5mb1wiPlxuXG4gICAgICAgICAgICA8ZGl2ICAqbmdJZj1cIih1c2VycyQgfCBhc3luYykgYXMgdXNlcnNcIj5cblxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxcmVtXCI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxXCIgW2Zvcm1Hcm91cF09XCJtZXNzYWdlc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJmbGV4OjFcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+VXNlcnM8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ0b1VzZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiYWxsQ2hhbm5lbHNcIiAjc2VsZWN0ZWRVc2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgVXNlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB1c2VyIG9mIHVzZXJzXCIgW3ZhbHVlXT1cInVzZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdXNlci51c2VybmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJmbGV4OjFcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+U2VuZCBhIE1lc3NhZ2U8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiRXguIEl0IG1ha2VzIG1lIGZlZWwuLi5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvblNlbmRNZXNzYWdlKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNWYWxpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7IGdhcDogLjVyZW07XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OjFcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cIm9uU2VuZE1lc3NhZ2UoKVwiIGNvbG9yPVwid2FyblwiPlxuICAgICAgICAgICAgICAgICAgICAgIFNlbmQgQWxlcnRcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJvblNlbmRBbGVydCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgU2VuZCBNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoY2hhdCQgfCBhc3luYykgYXMgY2hhdFwiIHN0eWxlPVwiYm9yZGVyOiB0aGluIGdyYXkgc29saWQ7IHBhZGRpbmc6IDFyZW07IG1hcmdpbi10b3A6IDFyZW07XCI+XG4gICAgICAgICAgICAgICAgPCEtLSA8YXBwLW1lc3Nlbmdlci1jaGF0XG4gICAgICAgICAgICAgICAgICBbdXNlcl09XCJjaGF0LnVzZXJcIlxuICAgICAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImNoYXQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICAgID48L2FwcC1tZXNzZW5nZXItY2hhdD4gLS0+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L21hdC10YWI+XG5cbiAgICAgIDxtYXQtdGFiIGxhYmVsPVwiV1MgLSBDdXN0b20gQ2hhbm5lbCBNZXNzYWdpbmdcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiPlxuICAgICAgICBXUyAtIEN1c3RvbSBDaGFubmVsIE1lc3NhZ2luZ1xuICAgICAgPC9tYXQtdGFiPlxuXG4gICAgPC9tYXQtdGFiLWdyb3VwPlxuICA8L2Rpdj5cblxuPC9kaXY+XG5cblxuPGRpdiBzdHlsZT1cIm1hcmdpbjogMXJlbTtcIj5cbiAgPGgzPlxuICAgIHVzZXI6IHt7IHVzZXIkIHwgYXN5bmMgfCBqc29ufX1cbiAgPC9oMz5cblxuICA8aDM+XG4gICAgdXNlcnM6IHt7IHVzZXJzJCB8IGFzeW5jIHwganNvbn19XG4gIDwvaDM+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { UserData } from '../models/user-data.model';
|
|
3
|
+
import { DatabaseStorage, DataType, RetryOptions } from '../../../models';
|
|
4
|
+
import { HTTPManagerStateService, ApiRequest, RequestOptions, RandomNumber } from '../../../services';
|
|
5
|
+
import { OIDCClient } from '../models/oidc-client.model';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class StateRequestService extends HTTPManagerStateService {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(ApiRequest.adapt({
|
|
10
|
+
server: 'https://oidc.example.com',
|
|
11
|
+
retry: RetryOptions.adapt({
|
|
12
|
+
times: 3,
|
|
13
|
+
delay: 1,
|
|
14
|
+
}),
|
|
15
|
+
adapter: OIDCClient.adapt,
|
|
16
|
+
ws: {
|
|
17
|
+
id: 'WS-MY_DATA',
|
|
18
|
+
wsChannels: ['allChannels'],
|
|
19
|
+
wsServer: 'ws://localhost:8080',
|
|
20
|
+
jwtToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3d3dy53YXZlY29kZXJzLmNhIiwiaWF0IjoxNzYzOTgzNjU1LCJleHAiOjE3NjQwMTI0NTUsImF1ZCI6Imh0dHBzOi8vd3d3LndhdmVjb2RlcnMuY2EiLCJzdWIiOiJNWEIwOE05IiwiZ2l2ZW5uYW1lIjoiTWlrZSIsInN1cm5hbWUiOiJCb25pZmFjaW8iLCJlbWFpbCI6IndhdmVjb2RlcnNAZ21haWwuY29tIiwicm9sZXMiOlsiTWFuYWdlciIsIkFkbWluaXN0cmF0b3IiXX0.0bCoiGEc0xcOqIGcQh1LbeLBAoedoxfwB6DHQ86Lysc',
|
|
21
|
+
access: ['read,write,delete,update'],
|
|
22
|
+
userAdapter: {
|
|
23
|
+
id: 'username', // matches adapter in UserData
|
|
24
|
+
adapter: UserData.adapt,
|
|
25
|
+
},
|
|
26
|
+
retry: RetryOptions.adapt({
|
|
27
|
+
times: 3,
|
|
28
|
+
delay: 10,
|
|
29
|
+
}),
|
|
30
|
+
}
|
|
31
|
+
}), DataType.ARRAY, DatabaseStorage.adapt({
|
|
32
|
+
table: 'ws_demo_data',
|
|
33
|
+
expiresIn: '5mn',
|
|
34
|
+
}));
|
|
35
|
+
this.attempts$ = this.wsRetryAttempts$;
|
|
36
|
+
this.nextRetry$ = this.wsNextRetry$;
|
|
37
|
+
}
|
|
38
|
+
getData() {
|
|
39
|
+
this.fetchRecords(RequestOptions.adapt({ path: ['ai', 'tests'] }));
|
|
40
|
+
}
|
|
41
|
+
addData() {
|
|
42
|
+
const num = RandomNumber(1000, 9999);
|
|
43
|
+
const newData = {
|
|
44
|
+
"spiffe": `sample.com/developer/${num}`,
|
|
45
|
+
"last_name": "boni",
|
|
46
|
+
"email": "mikeboni@hotmail.com",
|
|
47
|
+
"first_name": "mike"
|
|
48
|
+
};
|
|
49
|
+
this.createRecord(newData, RequestOptions.adapt({ path: ['ai', 'tests'] }));
|
|
50
|
+
}
|
|
51
|
+
sendMessage(data) {
|
|
52
|
+
console.log('sendMessage', data);
|
|
53
|
+
this.wsMessaging(data);
|
|
54
|
+
}
|
|
55
|
+
updateData(data) {
|
|
56
|
+
const sampleOptions = RequestOptions.adapt({ path: ['ai', 'tests', data.id] });
|
|
57
|
+
console.log('updateData', sampleOptions);
|
|
58
|
+
this.updateRecord(data, sampleOptions);
|
|
59
|
+
}
|
|
60
|
+
deleteData(data) {
|
|
61
|
+
const sampleOptions = RequestOptions.adapt({ path: ['ai', 'tests', data.id] });
|
|
62
|
+
console.log('deleteData', sampleOptions);
|
|
63
|
+
this.deleteRecord(sampleOptions);
|
|
64
|
+
}
|
|
65
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StateRequestService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
66
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StateRequestService, providedIn: 'root' }); }
|
|
67
|
+
}
|
|
68
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StateRequestService, decorators: [{
|
|
69
|
+
type: Injectable,
|
|
70
|
+
args: [{
|
|
71
|
+
providedIn: 'root'
|
|
72
|
+
}]
|
|
73
|
+
}], ctorParameters: () => [] });
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtcmVxdWVzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9odHRwLXJlcXVlc3Qtc2VydmljZXMtZGVtby9yZXF1ZXN0LW1hbmFnZXItd3MtZGVtby9zZXJ2aWNlcy9zdGF0ZS1yZXF1ZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFMUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFrQixNQUFNLG1CQUFtQixDQUFDO0FBQ3RILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFLekQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLHVCQUE0QjtJQUtuRTtRQUNFLEtBQUssQ0FDRCxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQ2YsTUFBTSxFQUFFLDBCQUEwQjtZQUNsQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQztnQkFDeEIsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsS0FBSyxFQUFFLENBQUM7YUFDVCxDQUFDO1lBQ0YsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1lBQ3pCLEVBQUUsRUFBRTtnQkFDRixFQUFFLEVBQUUsWUFBWTtnQkFDaEIsVUFBVSxFQUFFLENBQUMsYUFBYSxDQUFDO2dCQUMzQixRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixRQUFRLEVBQUUsa1lBQWtZO2dCQUM1WSxNQUFNLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztnQkFDcEMsV0FBVyxFQUFFO29CQUNYLEVBQUUsRUFBRSxVQUFVLEVBQUUsOEJBQThCO29CQUM5QyxPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUs7aUJBQ3hCO2dCQUNELEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDO29CQUN4QixLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsRUFBRTtpQkFDVixDQUFDO2FBQ0g7U0FDRixDQUFDLEVBQ0YsUUFBUSxDQUFDLEtBQUssRUFDZCxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQ3BCLEtBQUssRUFBRSxjQUFjO1lBQ3JCLFNBQVMsRUFBRSxLQUFLO1NBQ2pCLENBQUMsQ0FDSCxDQUFBO1FBakNMLGNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUE7UUFDakMsZUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7SUFpQzVCLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ25FLENBQUM7SUFFRCxPQUFPO1FBRUwsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUVwQyxNQUFNLE9BQU8sR0FBTztZQUNoQixRQUFRLEVBQUUsd0JBQXdCLEdBQUcsRUFBRTtZQUN2QyxXQUFXLEVBQUUsTUFBTTtZQUNuQixPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLFlBQVksRUFBRSxNQUFNO1NBQ3ZCLENBQUE7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBRTVFLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBb0I7UUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVM7UUFDbEIsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM5RSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUN4QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUV4QyxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVM7UUFDbEIsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM5RSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUN4QyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7K0dBekVRLG1CQUFtQjttSEFBbkIsbUJBQW1CLGNBRmxCLE1BQU07OzRGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFVzZXJEYXRhIH0gZnJvbSAnLi4vbW9kZWxzL3VzZXItZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhYmFzZVN0b3JhZ2UsIERhdGFUeXBlLCBSZXRyeU9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuXG5pbXBvcnQgeyBIVFRQTWFuYWdlclN0YXRlU2VydmljZSwgQXBpUmVxdWVzdCwgUmVxdWVzdE9wdGlvbnMsIFJhbmRvbU51bWJlciwgQ2hhbm5lbE1lc3NhZ2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBPSURDQ2xpZW50IH0gZnJvbSAnLi4vbW9kZWxzL29pZGMtY2xpZW50Lm1vZGVsJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU3RhdGVSZXF1ZXN0U2VydmljZSBleHRlbmRzIEhUVFBNYW5hZ2VyU3RhdGVTZXJ2aWNlPGFueT4ge1xuXG4gIGF0dGVtcHRzJCA9IHRoaXMud3NSZXRyeUF0dGVtcHRzJFxuICBuZXh0UmV0cnkkID0gdGhpcy53c05leHRSZXRyeSRcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgICAgQXBpUmVxdWVzdC5hZGFwdCh7XG4gICAgICAgICAgc2VydmVyOiAnaHR0cHM6Ly9vaWRjLmV4YW1wbGUuY29tJyxcbiAgICAgICAgICByZXRyeTogUmV0cnlPcHRpb25zLmFkYXB0KHtcbiAgICAgICAgICAgIHRpbWVzOiAzLFxuICAgICAgICAgICAgZGVsYXk6IDEsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgYWRhcHRlcjogT0lEQ0NsaWVudC5hZGFwdCxcbiAgICAgICAgICB3czoge1xuICAgICAgICAgICAgaWQ6ICdXUy1NWV9EQVRBJyxcbiAgICAgICAgICAgIHdzQ2hhbm5lbHM6IFsnYWxsQ2hhbm5lbHMnXSxcbiAgICAgICAgICAgIHdzU2VydmVyOiAnd3M6Ly9sb2NhbGhvc3Q6ODA4MCcsXG4gICAgICAgICAgICBqd3RUb2tlbjogJ2V5SmhiR2NpT2lKSVV6STFOaUlzSW5SNWNDSTZJa3BYVkNKOS5leUpwYzNNaU9pSm9kSFJ3Y3pvdkwzZDNkeTUzWVhabFkyOWtaWEp6TG1OaElpd2lhV0YwSWpveE56WXpPVGd6TmpVMUxDSmxlSEFpT2pFM05qUXdNVEkwTlRVc0ltRjFaQ0k2SW1oMGRIQnpPaTh2ZDNkM0xuZGhkbVZqYjJSbGNuTXVZMkVpTENKemRXSWlPaUpOV0VJd09FMDVJaXdpWjJsMlpXNXVZVzFsSWpvaVRXbHJaU0lzSW5OMWNtNWhiV1VpT2lKQ2IyNXBabUZqYVc4aUxDSmxiV0ZwYkNJNkluZGhkbVZqYjJSbGNuTkFaMjFoYVd3dVkyOXRJaXdpY205c1pYTWlPbHNpVFdGdVlXZGxjaUlzSWtGa2JXbHVhWE4wY21GMGIzSWlYWDAuMGJDb2lHRWMweGNPcUlHY1FoMUxiZUxCQW9lZG94ZndCNkRIUTg2THlzYycsXG4gICAgICAgICAgICBhY2Nlc3M6IFsncmVhZCx3cml0ZSxkZWxldGUsdXBkYXRlJ10sXG4gICAgICAgICAgICB1c2VyQWRhcHRlcjoge1xuICAgICAgICAgICAgICBpZDogJ3VzZXJuYW1lJywgLy8gbWF0Y2hlcyBhZGFwdGVyIGluIFVzZXJEYXRhXG4gICAgICAgICAgICAgIGFkYXB0ZXI6IFVzZXJEYXRhLmFkYXB0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJldHJ5OiBSZXRyeU9wdGlvbnMuYWRhcHQoe1xuICAgICAgICAgICAgICB0aW1lczogMyxcbiAgICAgICAgICAgICAgZGVsYXk6IDEwLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgRGF0YVR5cGUuQVJSQVksXG4gICAgICAgIERhdGFiYXNlU3RvcmFnZS5hZGFwdCh7XG4gICAgICAgICAgdGFibGU6ICd3c19kZW1vX2RhdGEnLFxuICAgICAgICAgIGV4cGlyZXNJbjogJzVtbicsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuXG4gICAgZ2V0RGF0YSgpIHtcbiAgICAgIHRoaXMuZmV0Y2hSZWNvcmRzKFJlcXVlc3RPcHRpb25zLmFkYXB0KHsgcGF0aDogWydhaScsJ3Rlc3RzJ10gfSkpXG4gICAgfVxuXG4gICAgYWRkRGF0YSgpIHtcblxuICAgICAgY29uc3QgbnVtID0gUmFuZG9tTnVtYmVyKDEwMDAsIDk5OTkpXG5cbiAgICAgIGNvbnN0IG5ld0RhdGEgPSAgICAge1xuICAgICAgICAgIFwic3BpZmZlXCI6IGBzYW1wbGUuY29tL2RldmVsb3Blci8ke251bX1gLFxuICAgICAgICAgIFwibGFzdF9uYW1lXCI6IFwiYm9uaVwiLFxuICAgICAgICAgIFwiZW1haWxcIjogXCJtaWtlYm9uaUBob3RtYWlsLmNvbVwiLFxuICAgICAgICAgIFwiZmlyc3RfbmFtZVwiOiBcIm1pa2VcIlxuICAgICAgfVxuXG4gICAgICB0aGlzLmNyZWF0ZVJlY29yZChuZXdEYXRhLCBSZXF1ZXN0T3B0aW9ucy5hZGFwdCh7IHBhdGg6IFsnYWknLCd0ZXN0cyddIH0pKVxuXG4gICAgfVxuXG4gICAgc2VuZE1lc3NhZ2UoZGF0YTogQ2hhbm5lbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdzZW5kTWVzc2FnZScsIGRhdGEpXG4gICAgICB0aGlzLndzTWVzc2FnaW5nKGRhdGEpXG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YShkYXRhOiBhbnkpIHtcbiAgICAgIGNvbnN0IHNhbXBsZU9wdGlvbnMgPSBSZXF1ZXN0T3B0aW9ucy5hZGFwdCh7IHBhdGg6IFsnYWknLCAndGVzdHMnLCBkYXRhLmlkXSB9KVxuICAgICAgY29uc29sZS5sb2coJ3VwZGF0ZURhdGEnLCBzYW1wbGVPcHRpb25zKVxuICAgICAgdGhpcy51cGRhdGVSZWNvcmQoZGF0YSwgc2FtcGxlT3B0aW9ucylcblxuICAgIH1cblxuICAgIGRlbGV0ZURhdGEoZGF0YTogYW55KSB7XG4gICAgICBjb25zdCBzYW1wbGVPcHRpb25zID0gUmVxdWVzdE9wdGlvbnMuYWRhcHQoeyBwYXRoOiBbJ2FpJywgJ3Rlc3RzJywgZGF0YS5pZF0gfSlcbiAgICAgIGNvbnNvbGUubG9nKCdkZWxldGVEYXRhJywgc2FtcGxlT3B0aW9ucylcbiAgICAgIHRoaXMuZGVsZXRlUmVjb3JkKHNhbXBsZU9wdGlvbnMpXG4gICAgfVxuXG59XG4iXX0=
|
|
@@ -21,6 +21,9 @@ export class SettingsStateService extends StoreStateManagerService {
|
|
|
21
21
|
updateEnum_2(value) {
|
|
22
22
|
this.updateData(value);
|
|
23
23
|
}
|
|
24
|
+
getEnum(key) {
|
|
25
|
+
return this.data$.pipe(map(item => item[key]));
|
|
26
|
+
}
|
|
24
27
|
getEnum_1() {
|
|
25
28
|
return this.data$.pipe(map(item => item?.enum_1));
|
|
26
29
|
}
|
|
@@ -33,4 +36,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
33
36
|
providedIn: 'root'
|
|
34
37
|
}]
|
|
35
38
|
}], ctorParameters: () => [] });
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3Mtc3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvaHR0cC1yZXF1ZXN0LXNlcnZpY2VzLWRlbW8vc3RvcmUtc3RhdGUtbWFuYWdlci1kZW1vL3NlcnZpY2VzL3NldHRpbmdzLXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNCLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDOUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDOztBQU1wRCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsd0JBQXdCO0lBRWhFO1FBRUUsS0FBSyxDQUNILG1CQUFtQixDQUFDLEtBQUssQ0FBQztZQUMxQixLQUFLLEVBQUUsYUFBYTtZQUNwQixPQUFPLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQztnQkFDNUIsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPO2dCQUM1QixTQUFTLEVBQUUsS0FBSzthQUNqQixDQUFDO1lBQ0YsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1NBQ3RCLENBQ0YsQ0FBQyxDQUFBO0lBRUYsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFVO1FBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFVO1FBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFXO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQ3BCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUN2QixDQUFBO0lBQ0gsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNwQixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQzFCLENBQUE7SUFDSCxDQUFDOytHQW5DVSxvQkFBb0I7bUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU2V0dGluZ09wdGlvbnMsIFN0b3JhZ2VUeXBlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgU3RvcmVTdGF0ZU1hbmFnZXJTZXJ2aWNlLCBTdGF0ZVN0b3JhZ2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RvcmUtc3RhdGUtbWFuYWdlci1zZXJ2aWNlJztcbmltcG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi4vbW9kZWxzL3NldHRpbmdzLm1vZGVsJztcblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1N0YXRlU2VydmljZSBleHRlbmRzIFN0b3JlU3RhdGVNYW5hZ2VyU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBzdXBlcihcbiAgICAgIFN0YXRlU3RvcmFnZU9wdGlvbnMuYWRhcHQoe1xuICAgICAgc3RvcmU6ICdzYW1wbGVTdG9yZScsXG4gICAgICBvcHRpb25zOiBTZXR0aW5nT3B0aW9ucy5hZGFwdCh7XG4gICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VUeXBlLlNFU1NJT04sXG4gICAgICAgIGVuY3J5cHRlZDogZmFsc2VcbiAgICAgIH0pLFxuICAgICAgbW9kZWw6IFNldHRpbmdzLmFkYXB0LFxuICAgIH1cbiAgKSlcblxuICB9XG5cbiAgdXBkYXRlRW51bV8xKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnVwZGF0ZURhdGEodmFsdWUpXG4gIH1cblxuICB1cGRhdGVFbnVtXzIodmFsdWU6IGFueSkge1xuICAgIHRoaXMudXBkYXRlRGF0YSh2YWx1ZSlcbiAgfVxuXG4gIGdldEVudW0oa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhJC5waXBlKFxuICAgICAgbWFwKGl0ZW0gPT4gaXRlbVtrZXldKVxuICAgIClcbiAgfVxuXG4gIGdldEVudW1fMSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhJC5waXBlKFxuICAgICAgbWFwKGl0ZW0gPT4gaXRlbT8uZW51bV8xKVxuICAgIClcbiAgfVxuXG59XG4iXX0=
|
|
@@ -7,4 +7,4 @@ export class DatabaseStorage {
|
|
|
7
7
|
return new DatabaseStorage(item?.table, item?.expiresIn);
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2Utc3RvcmFnZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvbW9kZWxzL2RhdGFiYXNlLXN0b3JhZ2UubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxPQUFPLGVBQWU7SUFFMUIsWUFDUyxRQUFRLEVBQUUsRUFDVixTQUFhO1FBRGIsVUFBSyxHQUFMLEtBQUssQ0FBSztRQUNWLGNBQVMsR0FBVCxTQUFTLENBQUk7SUFDbkIsQ0FBQztJQUVKLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBVTtRQUVyQixPQUFPLElBQUksZUFBZSxDQUN4QixJQUFJLEVBQUUsS0FBSyxFQUNYLElBQUksRUFBRSxTQUFTLENBQ2hCLENBQUE7SUFFSCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlU3RvcmFnZUludGVyZmFjZSB7XG4gIHRhYmxlOiBzdHJpbmdcbiAgZXhwaXJlc0luOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIERhdGFiYXNlU3RvcmFnZSBpbXBsZW1lbnRzIERhdGFiYXNlU3RvcmFnZUludGVyZmFjZSB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRhYmxlID0gJycsXG4gICAgcHVibGljIGV4cGlyZXNJbjogJycsXG4gICkge31cblxuICBzdGF0aWMgYWRhcHQoaXRlbT86IGFueSk6IERhdGFiYXNlU3RvcmFnZSB7XG5cbiAgICByZXR1cm4gbmV3IERhdGFiYXNlU3RvcmFnZShcbiAgICAgIGl0ZW0/LnRhYmxlLFxuICAgICAgaXRlbT8uZXhwaXJlc0luLFxuICAgIClcblxuICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { DbService } from './db.storage.service';
|
|
3
|
+
import { EMPTY, from } from 'rxjs';
|
|
4
|
+
import { map, switchMap } from 'rxjs/operators';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class DatabaseManagerService extends DbService {
|
|
7
|
+
constructor() {
|
|
8
|
+
super();
|
|
9
|
+
}
|
|
10
|
+
getDatabaseTables() {
|
|
11
|
+
return from(this.DBOpened()).pipe(map(() => this.tables.map((item) => item.name)));
|
|
12
|
+
}
|
|
13
|
+
databaseExists() {
|
|
14
|
+
return from(this.hasDatabase());
|
|
15
|
+
}
|
|
16
|
+
hasDatabaseTable(table) {
|
|
17
|
+
const tableName = this.cleanTableName(table);
|
|
18
|
+
return from(this.DBOpened()).pipe(map(() => {
|
|
19
|
+
return this.tableExists(tableName);
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
getDatabaseTable(table) {
|
|
23
|
+
const tableName = this.cleanTableName(table);
|
|
24
|
+
return from(this.DBOpened()).pipe(map(() => {
|
|
25
|
+
const found = this.getTable(tableName);
|
|
26
|
+
if (!found) {
|
|
27
|
+
console.warn('No Such Table:', tableName);
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return found;
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
getDatabaseTableSchema(table) {
|
|
34
|
+
const tableName = this.cleanTableName(table);
|
|
35
|
+
return this.getDatabaseTable(tableName).pipe(map((dbTable) => {
|
|
36
|
+
if (!dbTable)
|
|
37
|
+
return [];
|
|
38
|
+
const cols = dbTable.schema.indexes.map((col) => col.name);
|
|
39
|
+
const pri = dbTable.schema.primKey.name;
|
|
40
|
+
return [pri, ...cols];
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
createDatabaseTable(tableDef) {
|
|
44
|
+
return from(this.createTable(tableDef.table, tableDef.schema)).pipe(switchMap(() => this.DBOpened()));
|
|
45
|
+
}
|
|
46
|
+
updateDatabaseTableSchema(tableDef) {
|
|
47
|
+
return from(this.createTable(tableDef.table, tableDef.schema)).pipe(switchMap(() => this.getDatabaseTable(tableDef.table)));
|
|
48
|
+
}
|
|
49
|
+
// CRUD
|
|
50
|
+
findTableRecords(table, column, value) {
|
|
51
|
+
const tableName = this.cleanTableName(table);
|
|
52
|
+
return this.getDatabaseTable(tableName).pipe(switchMap((tableData) => {
|
|
53
|
+
if (!tableData) {
|
|
54
|
+
console.warn(`findTableRecords: Table '${tableName}' not found`);
|
|
55
|
+
return from([]);
|
|
56
|
+
}
|
|
57
|
+
return from(tableData.where(column).equals(value).toArray());
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
findTableRecord(table, column, value) {
|
|
61
|
+
const tableName = this.cleanTableName(table);
|
|
62
|
+
return this.findTableRecords(tableName, column, value).pipe(map((records) => records && records.length > 0 ? records[0] : null));
|
|
63
|
+
}
|
|
64
|
+
getTableRecords(table) {
|
|
65
|
+
const tableName = this.cleanTableName(table);
|
|
66
|
+
return this.getDatabaseTable(tableName).pipe(switchMap((tableData) => {
|
|
67
|
+
if (!tableData) {
|
|
68
|
+
console.warn(`getTableRecords: Table '${tableName}' not found`);
|
|
69
|
+
return from([]);
|
|
70
|
+
}
|
|
71
|
+
return from(tableData.toArray());
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
getTableRecord(table, id) {
|
|
75
|
+
const tableName = this.cleanTableName(table);
|
|
76
|
+
return this.getDatabaseTable(tableName).pipe(switchMap((tableData) => {
|
|
77
|
+
if (!tableData) {
|
|
78
|
+
console.warn(`getTableRecord: Table '${tableName}' not found`);
|
|
79
|
+
return from([null]);
|
|
80
|
+
}
|
|
81
|
+
return from(tableData.get(id)).pipe(map((record) => record || null));
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
createTableRecord(table, record) {
|
|
85
|
+
const tableName = this.cleanTableName(table);
|
|
86
|
+
return this.createTableRecords(tableName, [record])
|
|
87
|
+
.pipe(map((item) => item ? item[0] : null));
|
|
88
|
+
}
|
|
89
|
+
createTableRecords(table, records) {
|
|
90
|
+
const tableName = this.cleanTableName(table);
|
|
91
|
+
return from(this.DBOpened()).pipe(switchMap(() => {
|
|
92
|
+
if (!this.tables.some(t => t.name === tableName)) {
|
|
93
|
+
console.error(`createTableRecords: Table '${tableName}' does not exist in DB version ${this.verno}. Available:`, this.tables.map(t => t.name));
|
|
94
|
+
return EMPTY;
|
|
95
|
+
}
|
|
96
|
+
const tableInstance = this.table(tableName);
|
|
97
|
+
// Extract schema fields directly from the table instance
|
|
98
|
+
const schema = tableInstance.schema;
|
|
99
|
+
const validFields = [
|
|
100
|
+
schema.primKey.name,
|
|
101
|
+
...schema.indexes.map(idx => idx.name)
|
|
102
|
+
];
|
|
103
|
+
const insertRecords = records.map((record) => {
|
|
104
|
+
const objectFromSchema = {};
|
|
105
|
+
validFields.forEach((field) => {
|
|
106
|
+
if (field) {
|
|
107
|
+
objectFromSchema[field] = record[field] ?? null;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
return objectFromSchema;
|
|
111
|
+
});
|
|
112
|
+
console.log(`createTableRecords: Bulk putting ${insertRecords.length} records into ${tableName}`);
|
|
113
|
+
return from(tableInstance.bulkPut(insertRecords)).pipe(map(() => insertRecords));
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
updateTableRecord(table, record) {
|
|
117
|
+
const tableName = this.cleanTableName(table);
|
|
118
|
+
return this.updateTableRecords(tableName, [record])
|
|
119
|
+
.pipe(map(item => item.length > 0 ? item[0] : null));
|
|
120
|
+
}
|
|
121
|
+
updateTableRecords(table, records) {
|
|
122
|
+
const tableName = this.cleanTableName(table);
|
|
123
|
+
return this.getDatabaseTable(tableName).pipe(switchMap((tableData) => {
|
|
124
|
+
return this.getDatabaseTableSchema(tableName).pipe(switchMap((schema) => {
|
|
125
|
+
const insertRecords = records.map((record) => {
|
|
126
|
+
const objectFromSchema = {};
|
|
127
|
+
schema.forEach((field) => {
|
|
128
|
+
const data = record[field] ?? null;
|
|
129
|
+
objectFromSchema[field] = data;
|
|
130
|
+
});
|
|
131
|
+
return objectFromSchema;
|
|
132
|
+
});
|
|
133
|
+
return from(tableData.bulkPut(insertRecords)).pipe(map(() => insertRecords));
|
|
134
|
+
}));
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
deleteTableRecord(table, id) {
|
|
138
|
+
const tableName = this.cleanTableName(table);
|
|
139
|
+
return this.deleteTableRecords(tableName, [id])
|
|
140
|
+
.pipe(map(item => item.length > 0 ? item[0] : null));
|
|
141
|
+
}
|
|
142
|
+
deleteTableRecords(table, ids) {
|
|
143
|
+
const tableName = this.cleanTableName(table);
|
|
144
|
+
return this.getDatabaseTable(tableName).pipe(switchMap((tableData) => {
|
|
145
|
+
return this.getDatabaseTableSchema(tableName).pipe(switchMap((schema) => {
|
|
146
|
+
console.log(`deleteTableRecords: Starting delete of ${ids.length} records from ${table}. IDs:`, ids);
|
|
147
|
+
return from(tableData.bulkDelete(ids)).pipe(map(() => ids));
|
|
148
|
+
}));
|
|
149
|
+
}));
|
|
150
|
+
}
|
|
151
|
+
clearTable(table) {
|
|
152
|
+
const tableName = this.cleanTableName(table);
|
|
153
|
+
return this.getDatabaseTable(tableName).pipe(switchMap((tableData) => {
|
|
154
|
+
if (!tableData) {
|
|
155
|
+
console.warn(`clearTable: Table '${tableName}' not found`);
|
|
156
|
+
return from([]);
|
|
157
|
+
}
|
|
158
|
+
console.log(`clearTable: Clearing all records from ${tableName}`);
|
|
159
|
+
return from(tableData.clear());
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatabaseManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
163
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatabaseManagerService, providedIn: 'root' }); }
|
|
164
|
+
}
|
|
165
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatabaseManagerService, decorators: [{
|
|
166
|
+
type: Injectable,
|
|
167
|
+
args: [{
|
|
168
|
+
providedIn: 'root'
|
|
169
|
+
}]
|
|
170
|
+
}], ctorParameters: () => [] });
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UubWFuYWdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy9kYXRhYmFzZS1tYW5hZ2VyLXNlcnZpY2UvZGF0YWJhc2UubWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBS2hELE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxTQUFTO0lBRW5EO1FBQ0UsS0FBSyxFQUFFLENBQUE7SUFDVCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUMvQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNyRCxDQUFBO0lBQ0gsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYTtRQUM1QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDL0IsR0FBRyxDQUFDLEdB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UyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDdkMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUNqQixDQUFDO1lBRUosQ0FBQyxDQUFDLENBRUgsQ0FBQTtRQUVILENBQUMsQ0FBQyxDQUVILENBQUE7SUFFSCxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWE7UUFDdEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQzFDLFNBQVMsQ0FBQyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixTQUFTLGFBQWEsQ0FBQyxDQUFDO2dCQUMzRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQixDQUFDO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNsRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzsrR0F6UFUsc0JBQXNCO21IQUF0QixzQkFBc0IsY0FGckIsTUFBTTs7NEZBRVAsc0JBQXNCO2tCQUhsQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERiU2VydmljZSB9IGZyb20gJy4vZGIuc3RvcmFnZS5zZXJ2aWNlJztcblxuaW1wb3J0IHsgVGFibGVTY2hlbWFEZWYgfSBmcm9tICcuL21vZGVscy90YWJsZS1zY2hlbWEnO1xuaW1wb3J0IHsgRU1QVFksIGZyb20sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEYXRhYmFzZU1hbmFnZXJTZXJ2aWNlIGV4dGVuZHMgRGJTZXJ2aWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpXG4gIH1cblxuICBnZXREYXRhYmFzZVRhYmxlcygpIHtcbiAgICByZXR1cm4gZnJvbSh0aGlzLkRCT3BlbmVkKCkpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4gdGhpcy50YWJsZXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0ubmFtZSkpXG4gICAgKVxuICB9XG5cbiAgZGF0YWJhc2VFeGlzdHMoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGZyb20odGhpcy5oYXNEYXRhYmFzZSgpKTtcbiAgfVxuXG4gIGhhc0RhdGFiYXNlVGFibGUodGFibGU6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRoaXMuY2xlYW5UYWJsZU5hbWUodGFibGUpO1xuICAgIHJldHVybiBmcm9tKHRoaXMuREJPcGVuZWQoKSkucGlwZShcbiAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlRXhpc3RzKHRhYmxlTmFtZSlcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgZ2V0RGF0YWJhc2VUYWJsZSh0YWJsZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSB0aGlzLmNsZWFuVGFibGVOYW1lKHRhYmxlKTtcbiAgICByZXR1cm4gZnJvbSh0aGlzLkRCT3BlbmVkKCkpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5nZXRUYWJsZSh0YWJsZU5hbWUpO1xuICAgICAgICAgIGlmKCFmb3VuZCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdObyBTdWNoIFRhYmxlOicsIHRhYmxlTmFtZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIGdldERhdGFiYXNlVGFibGVTY2hlbWEodGFibGU6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSB0aGlzLmNsZWFuVGFibGVOYW1lKHRhYmxlKTtcbiAgICByZXR1cm4gdGhpcy5nZXREYXRhYmFzZVRhYmxlKHRhYmxlTmFtZSkucGlwZShcbiAgICAgIG1hcCgoZGJUYWJsZTogYW55KSA9PiB7XG4gICAgICAgIGlmKCFkYlRhYmxlKSByZXR1cm4gW11cbiAgICAgICAgY29uc3QgY29scyA9IGRiVGFibGUuc2NoZW1hLmluZGV4ZXMubWFwKChjb2w6IGFueSkgPT4gY29sLm5hbWUpXG4gICAgICAgIGNvbnN0IHByaSA9IGRiVGFibGUuc2NoZW1hLnByaW1LZXkubmFtZVxuICAgICAgICByZXR1cm4gW3ByaSwgLi4uY29sc11cbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgY3JlYXRlRGF0YWJhc2VUYWJsZSh0YWJsZURlZjogVGFibGVTY2hlbWFEZWYpIHtcbiAgICByZXR1cm4gZnJvbSh0aGlzLmNyZWF0ZVRhYmxlKHRhYmxlRGVmLnRhYmxlLCB0YWJsZURlZi5zY2hlbWEpKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuREJPcGVuZWQoKSlcbiAgICApXG4gIH1cblxuICB1cGRhdGVEYXRhYmFzZVRhYmxlU2NoZW1hKHRhYmxlRGVmOiBUYWJsZVNjaGVtYURlZikge1xuICAgIHJldHVybiBmcm9tKHRoaXMuY3JlYXRlVGFibGUodGFibGVEZWYudGFibGUsIHRhYmxlRGVmLnNjaGVtYSkpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5nZXREYXRhYmFzZVRhYmxlKHRhYmxlRGVmLnRhYmxlKSlcbiAgICApXG4gIH1cblxuICAvLyBDUlVEXG4gIGZpbmRUYWJsZVJlY29yZHModGFibGU6IHN0cmluZywgY29sdW1uOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSB0aGlzLmNsZWFuVGFibGVOYW1lKHRhYmxlKTtcbiAgICByZXR1cm4gdGhpcy5nZXREYXRhYmFzZVRhYmxlKHRhYmxlTmFtZSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgodGFibGVEYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCF0YWJsZURhdGEpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYGZpbmRUYWJsZVJlY29yZHM6IFRhYmxlICcke3RhYmxlTmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgICAgIHJldHVybiBmcm9tKFtdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJvbSh0YWJsZURhdGEud2hlcmUoY29sdW1uKS5lcXVhbHModmFsdWUpLnRvQXJyYXkoKSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBmaW5kVGFibGVSZWNvcmQodGFibGU6IHN0cmluZywgY29sdW1uOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSB0aGlzLmNsZWFuVGFibGVOYW1lKHRhYmxlKTtcbiAgICByZXR1cm4gdGhpcy5maW5kVGFibGVSZWNvcmRzKHRhYmxlTmFtZSwgY29sdW1uLCB2YWx1ZSkucGlwZShcbiAgICAgIG1hcCgocmVjb3JkczogYW55KSA9PiByZWNvcmRzICYmIHJlY29yZHMubGVuZ3RoID4gMCA/IHJlY29yZHNbMF0gOiBudWxsKVxuICAgICk7XG4gIH1cblxuICBnZXRUYWJsZVJlY29yZHModGFibGU6IHN0cmluZykge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRoaXMuY2xlYW5UYWJsZU5hbWUodGFibGUpO1xuICAgIHJldHVybiB0aGlzLmdldERhdGFiYXNlVGFibGUodGFibGVOYW1lKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCh0YWJsZURhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIXRhYmxlRGF0YSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgZ2V0VGFibGVSZWNvcmRzOiBUYWJsZSAnJHt0YWJsZU5hbWV9JyBub3QgZm91bmRgKTtcbiAgICAgICAgICByZXR1cm4gZnJvbShbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyb20odGFibGVEYXRhLnRvQXJyYXkoKSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRUYWJsZVJlY29yZCh0YWJsZTogc3RyaW5nLCBpZDogbnVtYmVyKSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gdGhpcy5jbGVhblRhYmxlTmFtZSh0YWJsZSk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2VUYWJsZSh0YWJsZU5hbWUpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHRhYmxlRGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmICghdGFibGVEYXRhKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBnZXRUYWJsZVJlY29yZDogVGFibGUgJyR7dGFibGVOYW1lfScgbm90IGZvdW5kYCk7XG4gICAgICAgICAgcmV0dXJuIGZyb20oW251bGxdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJvbSh0YWJsZURhdGEuZ2V0KGlkKSkucGlwZShcbiAgICAgICAgICBtYXAoKHJlY29yZDogYW55KSA9PiByZWNvcmQgfHwgbnVsbClcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGNyZWF0ZVRhYmxlUmVjb3JkKHRhYmxlOiBzdHJpbmcsIHJlY29yZDogYW55KSB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gdGhpcy5jbGVhblRhYmxlTmFtZSh0YWJsZSk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFibGVSZWNvcmRzKHRhYmxlTmFtZSwgW3JlY29yZF0pXG4gICAgLnBpcGUoXG4gICAgICBtYXAoKGl0ZW06IGFueSkgPT4gaXRlbSA/IGl0ZW1bMF0gOiBudWxsKSlcbiAgfVxuXG4gIGNyZWF0ZVRhYmxlUmVjb3Jkcyh0YWJsZTogc3RyaW5nLCByZWNvcmRzOiBhbnlbXSkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRoaXMuY2xlYW5UYWJsZU5hbWUodGFibGUpO1xuICAgIHJldHVybiBmcm9tKHRoaXMuREJPcGVuZWQoKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy50YWJsZXMuc29tZSh0ID0+IHQubmFtZSA9PT0gdGFibGVOYW1lKSkge1xuICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNyZWF0ZVRhYmxlUmVjb3JkczogVGFibGUgJyR7dGFibGVOYW1lfScgZG9lcyBub3QgZXhpc3QgaW4gREIgdmVyc2lvbiAke3RoaXMudmVybm99LiBBdmFpbGFibGU6YCwgdGhpcy50YWJsZXMubWFwKHQgPT4gdC5uYW1lKSk7XG4gICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFibGVJbnN0YW5jZSA9IHRoaXMudGFibGUodGFibGVOYW1lKTtcblxuICAgICAgICAvLyBFeHRyYWN0IHNjaGVtYSBmaWVsZHMgZGlyZWN0bHkgZnJvbSB0aGUgdGFibGUgaW5zdGFuY2VcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGFibGVJbnN0YW5jZS5zY2hlbWE7XG4gICAgICAgIGNvbnN0IHZhbGlkRmllbGRzID0gW1xuICAgICAgICAgICAgc2NoZW1hLnByaW1LZXkubmFtZSxcbiAgICAgICAgICAgIC4uLnNjaGVtYS5pbmRleGVzLm1hcChpZHggPT4gaWR4Lm5hbWUpXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgaW5zZXJ0UmVjb3JkcyA9IHJlY29yZHMubWFwKChyZWNvcmQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0RnJvbVNjaGVtYTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgICAgICAgICAgdmFsaWRGaWVsZHMuZm9yRWFjaCgoZmllbGQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICBvYmplY3RGcm9tU2NoZW1hW2ZpZWxkXSA9IChyZWNvcmQgYXMgYW55KVtmaWVsZF0gPz8gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBvYmplY3RGcm9tU2NoZW1hO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zb2xlLmxvZyhgY3JlYXRlVGFibGVSZWNvcmRzOiBCdWxrIHB1dHRpbmcgJHtpbnNlcnRSZWNvcmRzLmxlbmd0aH0gcmVjb3JkcyBpbnRvICR7dGFibGVOYW1lfWApO1xuXG4gICAgICAgIHJldHVybiBmcm9tKHRhYmxlSW5zdGFuY2UuYnVsa1B1dChpbnNlcnRSZWNvcmRzKSkucGlwZShcbiAgICAgICAgICAgIG1hcCgoKSA9PiBpbnNlcnRSZWNvcmRzKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlVGFibGVSZWNvcmQodGFibGU6IHN0cmluZywgcmVjb3JkOiBhbnkpIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSB0aGlzLmNsZWFuVGFibGVOYW1lKHRhYmxlKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVUYWJsZVJlY29yZHModGFibGVOYW1lLCBbcmVjb3JkXSlcbiAgICAucGlwZShcbiAgICAgIG1hcChpdGVtID0+IGl0ZW0ubGVuZ3RoID4gMCA/IGl0ZW1bMF0gOiBudWxsKVxuICAgIClcbiAgfVxuXG4gIHVwZGF0ZVRhYmxlUmVjb3Jkcyh0YWJsZTogc3RyaW5nLCByZWNvcmRzOiBhbnlbXSkge1xuXG4gICAgY29uc3QgdGFibGVOYW1lID0gdGhpcy5jbGVhblRhYmxlTmFtZSh0YWJsZSk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXREYXRhYmFzZVRhYmxlKHRhYmxlTmFtZSkucGlwZShcblxuICAgICAgc3dpdGNoTWFwKCh0YWJsZURhdGE6IGFueSkgPT4ge1xuXG4gICAgICAgIHJldHVybiB0aGlzLmdldERhdGFiYXNlVGFibGVTY2hlbWEodGFibGVOYW1lKS5waXBlKFxuXG4gICAgICAgICAgc3dpdGNoTWFwKChzY2hlbWE6IHN0cmluZ1tdKSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGluc2VydFJlY29yZHMgPSByZWNvcmRzLm1hcCgocmVjb3JkOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgICBjb25zdCBvYmplY3RGcm9tU2NoZW1hOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge31cblxuICAgICAgICAgICAgICBzY2hlbWEuZm9yRWFjaCgoZmllbGQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAocmVjb3JkIGFzIGFueSlbZmllbGRdID8/IG51bGxcbiAgICAgICAgICAgICAgICBvYmplY3RGcm9tU2NoZW1hW2ZpZWxkXSA9IGRhdGFcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0RnJvbVNjaGVtYVxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICByZXR1cm4gZnJvbSh0YWJsZURhdGEuYnVsa1B1dChpbnNlcnRSZWNvcmRzKSkucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gaW5zZXJ0UmVjb3JkcylcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICB9KVxuXG4gICAgICAgIClcblxuICAgICAgfSlcblxuICAgIClcblxuICB9XG5cbiAgZGVsZXRlVGFibGVSZWNvcmQ8VD4odGFibGU6IHN0cmluZywgaWQ6IG51bWJlcikge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRoaXMuY2xlYW5UYWJsZU5hbWUodGFibGUpO1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZVRhYmxlUmVjb3Jkcyh0YWJsZU5hbWUsIFtpZF0pXG4gICAgLnBpcGUoXG4gICAgICBtYXAoaXRlbSA9PiBpdGVtLmxlbmd0aCA+IDAgPyBpdGVtWzBdIDogbnVsbClcbiAgICApXG4gIH1cblxuICBkZWxldGVUYWJsZVJlY29yZHModGFibGU6IHN0cmluZywgaWRzOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRoaXMuY2xlYW5UYWJsZU5hbWUodGFibGUpO1xuICAgIHJldHVybiB0aGlzLmdldERhdGFiYXNlVGFibGUodGFibGVOYW1lKS5waXBlKFxuXG4gICAgICBzd2l0Y2hNYXAoKHRhYmxlRGF0YTogYW55KSA9PiB7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2VUYWJsZVNjaGVtYSh0YWJsZU5hbWUpLnBpcGUoXG5cbiAgICAgICAgICBzd2l0Y2hNYXAoKHNjaGVtYTogc3RyaW5nW10pID0+IHtcblxuICAgICAgICAgICAgY29uc29sZS5sb2coYGRlbGV0ZVRhYmxlUmVjb3JkczogU3RhcnRpbmcgZGVsZXRlIG9mICR7aWRzLmxlbmd0aH0gcmVjb3JkcyBmcm9tICR7dGFibGV9LiBJRHM6YCwgaWRzKTtcblxuICAgICAgICAgICAgcmV0dXJuIGZyb20odGFibGVEYXRhLmJ1bGtEZWxldGUoaWRzKSkucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gaWRzKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIH0pXG5cbiAgICAgICAgKVxuXG4gICAgICB9KVxuXG4gICAgKVxuXG4gIH1cblxuICBjbGVhclRhYmxlKHRhYmxlOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSB0aGlzLmNsZWFuVGFibGVOYW1lKHRhYmxlKTtcbiAgICByZXR1cm4gdGhpcy5nZXREYXRhYmFzZVRhYmxlKHRhYmxlTmFtZSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgodGFibGVEYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCF0YWJsZURhdGEpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYGNsZWFyVGFibGU6IFRhYmxlICcke3RhYmxlTmFtZX0nIG5vdCBmb3VuZGApO1xuICAgICAgICAgIHJldHVybiBmcm9tKFtdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgY2xlYXJUYWJsZTogQ2xlYXJpbmcgYWxsIHJlY29yZHMgZnJvbSAke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgcmV0dXJuIGZyb20odGFibGVEYXRhLmNsZWFyKCkpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbn1cbiJdfQ==
|