ngx-rs-ant 1.0.4 → 1.0.8
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/data-grid/data-grid.component.d.ts +1 -1
- package/data-grid/unit-info-template/unit-info-template.component.d.ts +4 -4
- package/data-grid/user-info-template/user-info-template.component.d.ts +4 -4
- package/esm2020/data-grid/data-grid.component.mjs +15 -7
- package/esm2020/data-grid/file-cell-template/file-cell-template.component.mjs +3 -3
- package/esm2020/data-grid/unit-info-template/unit-info-template.component.mjs +21 -41
- package/esm2020/data-grid/user-info-template/user-info-template.component.mjs +21 -41
- package/esm2020/public-api.mjs +3 -1
- package/esm2020/websocket/websocket.module.mjs +18 -0
- package/esm2020/websocket/websocket.service.mjs +153 -0
- package/fesm2015/ngx-rs-ant.mjs +228 -92
- package/fesm2015/ngx-rs-ant.mjs.map +1 -1
- package/fesm2020/ngx-rs-ant.mjs +227 -92
- package/fesm2020/ngx-rs-ant.mjs.map +1 -1
- package/package.json +1 -2
- package/public-api.d.ts +2 -0
- package/websocket/websocket.module.d.ts +7 -0
- package/websocket/websocket.service.d.ts +56 -0
|
@@ -2,64 +2,44 @@ import { Component, Input } from '@angular/core';
|
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import * as i1 from "../data-grid.service";
|
|
4
4
|
import * as i2 from "@angular/platform-browser";
|
|
5
|
-
import * as i3 from "
|
|
6
|
-
import * as i4 from "devextreme-angular/
|
|
7
|
-
import * as i5 from "devextreme-angular/ui/
|
|
8
|
-
import * as i6 from "devextreme-angular/ui/tooltip";
|
|
5
|
+
import * as i3 from "devextreme-angular/core";
|
|
6
|
+
import * as i4 from "devextreme-angular/ui/button";
|
|
7
|
+
import * as i5 from "devextreme-angular/ui/tooltip";
|
|
9
8
|
export class UserInfoTemplateComponent {
|
|
10
9
|
constructor(service, domSanitizer) {
|
|
11
10
|
this.service = service;
|
|
12
11
|
this.domSanitizer = domSanitizer;
|
|
13
|
-
this.users = [];
|
|
14
12
|
}
|
|
15
13
|
ngOnInit() {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
this.users.push(response);
|
|
23
|
-
// 重绘表格宽高
|
|
24
|
-
setTimeout(() => {
|
|
25
|
-
this.table.resize();
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
this.service.getUserInfo(value).subscribe(response => {
|
|
32
|
-
this.users.push(response);
|
|
33
|
-
// 重绘表格宽高
|
|
34
|
-
setTimeout(() => {
|
|
35
|
-
this.table.resize();
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
convertContent(userInfo) {
|
|
42
|
-
let content = '<table>';
|
|
43
|
-
for (const item of userInfo) {
|
|
44
|
-
content += `
|
|
14
|
+
this.service.getUserInfo(this.uid).subscribe(response => {
|
|
15
|
+
this.displayName = response.displayName;
|
|
16
|
+
const userInfo = response.userInfo;
|
|
17
|
+
let content = '<table>';
|
|
18
|
+
for (const item of userInfo) {
|
|
19
|
+
content += `
|
|
45
20
|
<tr>
|
|
46
21
|
<td style="text-align: right;">${item.caption}:</td>
|
|
47
22
|
<td style="text-align: left;">${item.value}</td>
|
|
48
23
|
</tr>
|
|
49
24
|
`;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
25
|
+
}
|
|
26
|
+
content += '</table>';
|
|
27
|
+
this.content = this.domSanitizer.bypassSecurityTrustHtml(content);
|
|
28
|
+
// 重绘表格宽高
|
|
29
|
+
setTimeout(() => {
|
|
30
|
+
this.table.resize();
|
|
31
|
+
});
|
|
32
|
+
});
|
|
53
33
|
}
|
|
54
34
|
}
|
|
55
35
|
UserInfoTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: UserInfoTemplateComponent, deps: [{ token: i1.DataGridService }, { token: i2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
56
|
-
UserInfoTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: UserInfoTemplateComponent, selector: "rs-user-info-template", inputs: { table: "table",
|
|
36
|
+
UserInfoTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.7", type: UserInfoTemplateComponent, selector: "rs-user-info-template", inputs: { table: "table", uid: "uid" }, ngImport: i0, template: "<dx-button #textDiv type=\"default\" stylingMode=\"text\">\n {{displayName}}\n <dx-tooltip [target]=\"textDiv.instance.element()\"\n [position]=\"'top'\"\n [showEvent]=\"'click'\">\n <div *dxTemplate=\"let data of 'content'\">\n <div [innerHTML]=\"content\"></div>\n </div>\n </dx-tooltip>\n</dx-button>\n<br/>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i4.DxButtonComponent, selector: "dx-button", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "icon", "rtlEnabled", "stylingMode", "tabIndex", "template", "text", "type", "useSubmitBehavior", "validationGroup", "visible", "width"], outputs: ["onClick", "onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconChange", "rtlEnabledChange", "stylingModeChange", "tabIndexChange", "templateChange", "textChange", "typeChange", "useSubmitBehaviorChange", "validationGroupChange", "visibleChange", "widthChange"] }, { kind: "component", type: i5.DxTooltipComponent, selector: "dx-tooltip", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "elementAttr", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showEvent", "target", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "elementAttrChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showEventChange", "targetChange", "visibleChange", "widthChange", "wrapperAttrChange"] }] });
|
|
57
37
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: UserInfoTemplateComponent, decorators: [{
|
|
58
38
|
type: Component,
|
|
59
|
-
args: [{ selector: 'rs-user-info-template', template: "<
|
|
39
|
+
args: [{ selector: 'rs-user-info-template', template: "<dx-button #textDiv type=\"default\" stylingMode=\"text\">\n {{displayName}}\n <dx-tooltip [target]=\"textDiv.instance.element()\"\n [position]=\"'top'\"\n [showEvent]=\"'click'\">\n <div *dxTemplate=\"let data of 'content'\">\n <div [innerHTML]=\"content\"></div>\n </div>\n </dx-tooltip>\n</dx-button>\n<br/>\n" }]
|
|
60
40
|
}], ctorParameters: function () { return [{ type: i1.DataGridService }, { type: i2.DomSanitizer }]; }, propDecorators: { table: [{
|
|
61
41
|
type: Input
|
|
62
|
-
}],
|
|
42
|
+
}], uid: [{
|
|
63
43
|
type: Input
|
|
64
44
|
}] } });
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1pbmZvLXRlbXBsYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1ycy1hbnQvc3JjL2RhdGEtZ3JpZC91c2VyLWluZm8tdGVtcGxhdGUvdXNlci1pbmZvLXRlbXBsYXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1ycy1hbnQvc3JjL2RhdGEtZ3JpZC91c2VyLWluZm8tdGVtcGxhdGUvdXNlci1pbmZvLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBU3ZELE1BQU0sT0FBTyx5QkFBeUI7SUFRcEMsWUFBb0IsT0FBd0IsRUFBVSxZQUEwQjtRQUE1RCxZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFjO0lBQ2hGLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFDeEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUM7WUFDeEIsS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLEVBQUU7Z0JBQzNCLE9BQU8sSUFBSTs7aURBRThCLElBQUksQ0FBQyxPQUFPO2dEQUNiLElBQUksQ0FBQyxLQUFLOztPQUVuRCxDQUFDO2FBQ0Q7WUFDRCxPQUFPLElBQUksVUFBVSxDQUFBO1lBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRSxTQUFTO1lBQ1QsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztzSEEvQlUseUJBQXlCOzBHQUF6Qix5QkFBeUIscUdDVHRDLGtXQVdBOzJGREZhLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSx1QkFBdUI7aUlBTWpDLEtBQUs7c0JBREosS0FBSztnQkFHTixHQUFHO3NCQURGLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RhdGFHcmlkU2VydmljZX0gZnJvbSBcIi4uL2RhdGEtZ3JpZC5zZXJ2aWNlXCI7XG5pbXBvcnQge0RvbVNhbml0aXplcn0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnMtdXNlci1pbmZvLXRlbXBsYXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItaW5mby10ZW1wbGF0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VzZXItaW5mby10ZW1wbGF0ZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJJbmZvVGVtcGxhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICB0YWJsZTogYW55O1xuICBASW5wdXQoKVxuICB1aWQ6IGFueTtcbiAgZGlzcGxheU5hbWU6IGFueTtcbiAgY29udGVudDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2VydmljZTogRGF0YUdyaWRTZXJ2aWNlLCBwcml2YXRlIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2UuZ2V0VXNlckluZm8odGhpcy51aWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICB0aGlzLmRpc3BsYXlOYW1lID0gcmVzcG9uc2UuZGlzcGxheU5hbWU7XG4gICAgICBjb25zdCB1c2VySW5mbyA9IHJlc3BvbnNlLnVzZXJJbmZvO1xuICAgICAgbGV0IGNvbnRlbnQgPSAnPHRhYmxlPic7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdXNlckluZm8pIHtcbiAgICAgICAgY29udGVudCArPSBgXG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCI+JHtpdGVtLmNhcHRpb25977yaPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0O1wiPiR7aXRlbS52YWx1ZX08L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgIGA7XG4gICAgICB9XG4gICAgICBjb250ZW50ICs9ICc8L3RhYmxlPidcbiAgICAgIHRoaXMuY29udGVudCA9IHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGNvbnRlbnQpO1xuICAgICAgLy8g6YeN57uY6KGo5qC85a696auYXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy50YWJsZS5yZXNpemUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZHgtYnV0dG9uICN0ZXh0RGl2IHR5cGU9XCJkZWZhdWx0XCIgc3R5bGluZ01vZGU9XCJ0ZXh0XCI+XG4gIHt7ZGlzcGxheU5hbWV9fVxuICA8ZHgtdG9vbHRpcCBbdGFyZ2V0XT1cInRleHREaXYuaW5zdGFuY2UuZWxlbWVudCgpXCJcbiAgICAgICAgICAgICAgW3Bvc2l0aW9uXT1cIid0b3AnXCJcbiAgICAgICAgICAgICAgW3Nob3dFdmVudF09XCInY2xpY2snXCI+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxuICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cImNvbnRlbnRcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9keC10b29sdGlwPlxuPC9keC1idXR0b24+XG48YnIvPlxuIl19
|
package/esm2020/public-api.mjs
CHANGED
|
@@ -24,4 +24,6 @@ export * from './modal/modal.component';
|
|
|
24
24
|
export * from './modal/modal.module';
|
|
25
25
|
export * from './modal/modal.service';
|
|
26
26
|
export * from './notify/notify';
|
|
27
|
-
|
|
27
|
+
export * from './websocket/websocket.module';
|
|
28
|
+
export * from './websocket/websocket.service';
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1ycy1hbnQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw0REFBNEQsQ0FBQztBQUMzRSxjQUFjLDBEQUEwRCxDQUFDO0FBQ3pFLGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMsOENBQThDLENBQUM7QUFDN0QsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywyQ0FBMkMsQ0FBQztBQUMxRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYywrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYm94LWNvbnRhaW5lci9ib3gtaXRlbS9pdGVtLWNvbmZpZy9pdGVtLWNvbmZpZy5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9ib3gtY29udGFpbmVyL2JveC1pdGVtL2l0ZW0tc3R5bGUvaXRlbS1zdHlsZS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9ib3gtY29udGFpbmVyL2JveC1jb250YWluZXIuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vYm94LWNvbnRhaW5lci9ib3gtY29udGFpbmVyLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2JveC1jb250YWluZXIvUGx1Z2luTWFuYWdlcic7XG5leHBvcnQgKiBmcm9tICcuL2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YS1ncmlkL2RhdGEtZ3JpZC5mYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YS1ncmlkL2luc3RhbmNlLWxpbmstdGVtcGxhdGUuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YS1ncmlkL21hc3Rlci1kZXRhaWwtdGVtcGxhdGUuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YS1ncmlkL3Jvdy1idXR0b25zLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2RhdGEtZ3JpZC9kYXRhLWdyaWQubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YS1ncmlkL2RhdGEtZ3JpZC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vZHJhd2VyL2RyYXdlci5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9kcmF3ZXIvZHJhd2VyLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2RyYXdlci9kcmF3ZXIuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2R5bmFtaWMtcGFyYW1zL2R5bmFtaWMtcGFyYW1zLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2R5bmFtaWMtcGFyYW1zL2R5bmFtaWMtcGFyYW1zLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vZm9ybS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtL2Zvcm0ubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vZm9ybS9mb3JtLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pY29uLXNlbGVjdG9yL2ljb24tc2VsZWN0b3IuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vaWNvbi1zZWxlY3Rvci9pY29uLXNlbGVjdG9yLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZGFsL21vZGFsLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL21vZGFsL21vZGFsLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZGFsL21vZGFsLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZnkvbm90aWZ5JztcbmV4cG9ydCAqIGZyb20gJy4vd2Vic29ja2V0L3dlYnNvY2tldC5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi93ZWJzb2NrZXQvd2Vic29ja2V0LnNlcnZpY2UnO1xuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class WebsocketModule {
|
|
5
|
+
}
|
|
6
|
+
WebsocketModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: WebsocketModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
7
|
+
WebsocketModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.7", ngImport: i0, type: WebsocketModule, imports: [CommonModule] });
|
|
8
|
+
WebsocketModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: WebsocketModule, imports: [CommonModule] });
|
|
9
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: WebsocketModule, decorators: [{
|
|
10
|
+
type: NgModule,
|
|
11
|
+
args: [{
|
|
12
|
+
declarations: [],
|
|
13
|
+
imports: [
|
|
14
|
+
CommonModule
|
|
15
|
+
]
|
|
16
|
+
}]
|
|
17
|
+
}] });
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1ycy1hbnQvc3JjL3dlYnNvY2tldC93ZWJzb2NrZXQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDOztBQVE3QyxNQUFNLE9BQU8sZUFBZTs7NEdBQWYsZUFBZTs2R0FBZixlQUFlLFlBSHhCLFlBQVk7NkdBR0gsZUFBZSxZQUh4QixZQUFZOzJGQUdILGVBQWU7a0JBTjNCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3FCQUNiO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldE1vZHVsZSB7XG59XG4iXX0=
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { interval, Subject } from "rxjs";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class WebsocketService {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.connectSuccess = false; // websocket 连接成功
|
|
7
|
+
this.period = 60 * 1000 * 10; // 10分钟检查一次
|
|
8
|
+
this.reconnectFlag = false; // 重连
|
|
9
|
+
this.reconnectPeriod = 5 * 1000; // 重连失败,则5秒钟重连一次
|
|
10
|
+
this.serverMessageSubject = new Subject(); // subject对象,用于发送服务器消息
|
|
11
|
+
// 实例化时开始连接服务器
|
|
12
|
+
this.connect();
|
|
13
|
+
// 进入程序就进行心跳检测,避免出现开始就连接中断,后续不重连
|
|
14
|
+
this.heartCheckStart();
|
|
15
|
+
// 将messageSubject存储到window对象上
|
|
16
|
+
window.serverMessageSubject = this.serverMessageSubject;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 创建新连接
|
|
20
|
+
*/
|
|
21
|
+
connect() {
|
|
22
|
+
this.url = 'ws://' + window.location.host + '/ws?token=' + localStorage.getItem('token');
|
|
23
|
+
// 创建websocket对象
|
|
24
|
+
this.createWebSocket();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 创建连接
|
|
28
|
+
*/
|
|
29
|
+
createWebSocket() {
|
|
30
|
+
// 如果没有建立过连接,才建立连接并且添加时间监听
|
|
31
|
+
this.webSocket = new WebSocket(this.url);
|
|
32
|
+
// 建立连接成功
|
|
33
|
+
this.webSocket.onopen = () => this.onOpen();
|
|
34
|
+
// 接收到消息
|
|
35
|
+
this.webSocket.onmessage = (e) => this.onMessage(e);
|
|
36
|
+
// 连接关闭
|
|
37
|
+
this.webSocket.onclose = (e) => this.onClose(e);
|
|
38
|
+
// 异常
|
|
39
|
+
this.webSocket.onerror = (e) => this.onError(e);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 连接打开
|
|
43
|
+
*/
|
|
44
|
+
onOpen() {
|
|
45
|
+
console.log('websocket 已连接');
|
|
46
|
+
// 设置连接成功
|
|
47
|
+
this.connectSuccess = true;
|
|
48
|
+
// 如果是重连中
|
|
49
|
+
if (this.reconnectFlag) {
|
|
50
|
+
// 1.停止重连
|
|
51
|
+
this.stopReconnect();
|
|
52
|
+
// 2.重新开启心跳
|
|
53
|
+
this.heartCheckStart();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 接受到消息
|
|
58
|
+
*/
|
|
59
|
+
onMessage(event) {
|
|
60
|
+
// 将接受到的消息发布出去
|
|
61
|
+
const message = JSON.parse(event.data);
|
|
62
|
+
if (message.type === 'websocket') {
|
|
63
|
+
sessionStorage.setItem('clientId', message.value);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.serverMessageSubject.next(message);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 连接关闭
|
|
71
|
+
*/
|
|
72
|
+
onClose(e) {
|
|
73
|
+
console.log('websocket 连接关闭', e);
|
|
74
|
+
this.connectSuccess = false;
|
|
75
|
+
this.webSocket.close();
|
|
76
|
+
// 关闭时开始重连
|
|
77
|
+
this.reconnect();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 连接异常
|
|
81
|
+
*/
|
|
82
|
+
onError(e) {
|
|
83
|
+
// 出现异常时一定会进onClose,所以只在onClose做一次重连动作
|
|
84
|
+
console.log('websocket 连接异常', e);
|
|
85
|
+
this.connectSuccess = false;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 开始重新连接
|
|
89
|
+
*/
|
|
90
|
+
reconnect() {
|
|
91
|
+
// 如果已重连,则直接return,避免重复连接
|
|
92
|
+
if (this.connectSuccess) {
|
|
93
|
+
this.stopReconnect();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// 如果正在连接中,则直接return,避免产生多个轮训事件
|
|
97
|
+
if (this.reconnectFlag) {
|
|
98
|
+
console.log('正在重连...');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// 开始重连
|
|
102
|
+
this.reconnectFlag = true;
|
|
103
|
+
// 如果没能成功连接,则定时重连
|
|
104
|
+
this.reconnectSubscription = interval(this.reconnectPeriod).subscribe(async (val) => {
|
|
105
|
+
console.log(`重连:${val + 1}次`);
|
|
106
|
+
// 重新连接
|
|
107
|
+
this.connect();
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 停止重连
|
|
112
|
+
*/
|
|
113
|
+
stopReconnect() {
|
|
114
|
+
// 连接标识置为false
|
|
115
|
+
this.reconnectFlag = false;
|
|
116
|
+
// 取消订阅
|
|
117
|
+
if (typeof this.reconnectSubscription !== 'undefined' && this.reconnectSubscription != null) {
|
|
118
|
+
this.reconnectSubscription.unsubscribe();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 开始心跳检测
|
|
123
|
+
*/
|
|
124
|
+
heartCheckStart() {
|
|
125
|
+
this.serverTimeoutSubscription = interval(this.period).subscribe(() => {
|
|
126
|
+
console.log('心跳检查');
|
|
127
|
+
// 保持连接状态,重置下
|
|
128
|
+
if (this.webSocket != null && this.webSocket.readyState === 1) {
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// 停止心跳
|
|
132
|
+
this.heartCheckStop();
|
|
133
|
+
// 开始重连
|
|
134
|
+
this.reconnect();
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 停止心跳检测
|
|
140
|
+
*/
|
|
141
|
+
heartCheckStop() {
|
|
142
|
+
// 取消订阅停止心跳
|
|
143
|
+
if (typeof this.serverTimeoutSubscription !== 'undefined' && this.serverTimeoutSubscription != null) {
|
|
144
|
+
this.serverTimeoutSubscription.unsubscribe();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
WebsocketService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: WebsocketService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
149
|
+
WebsocketService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: WebsocketService });
|
|
150
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: WebsocketService, decorators: [{
|
|
151
|
+
type: Injectable
|
|
152
|
+
}], ctorParameters: function () { return []; } });
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcnMtYW50L3NyYy93ZWJzb2NrZXQvd2Vic29ja2V0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBZSxNQUFNLE1BQU0sQ0FBQzs7QUFHckQsTUFBTSxPQUFPLGdCQUFnQjtJQVczQjtRQVJRLG1CQUFjLEdBQUcsS0FBSyxDQUFDLENBQWlCLGlCQUFpQjtRQUN6RCxXQUFNLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBZ0IsV0FBVztRQUVuRCxrQkFBYSxHQUFHLEtBQUssQ0FBQyxDQUFrQixLQUFLO1FBQzdDLG9CQUFlLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFjLGdCQUFnQjtRQUUxRCx5QkFBb0IsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDLENBQUEsc0JBQXNCO1FBR3JFLGNBQWM7UUFDZCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLDhCQUE4QjtRQUM3QixNQUFjLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNLLE9BQU87UUFDYixJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6RixnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWU7UUFDckIsMEJBQTBCO1FBQzFC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b3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7aW50ZXJ2YWwsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xuICBwcml2YXRlIHVybDogYW55OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6buY6K6k6K+35rGC55qEdXJsXG4gIHByaXZhdGUgd2ViU29ja2V0ITogV2ViU29ja2V0OyAgICAgICAgICAgICAgICAgICAvLyB3ZWJzb2NrZXTlr7nosaFcbiAgcHJpdmF0ZSBjb25uZWN0U3VjY2VzcyA9IGZhbHNlOyAgICAgICAgICAgICAgICAgLy8gd2Vic29ja2V0IOi/nuaOpeaIkOWKn1xuICBwcml2YXRlIHBlcmlvZCA9IDYwICogMTAwMCAqIDEwOyAgICAgICAgICAgICAgICAvLyAxMOWIhumSn+ajgOafpeS4gOasoVxuICBwcml2YXRlIHNlcnZlclRpbWVvdXRTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247ICAgICAgICAvLyDlrprml7bmo4DmtYvov57mjqXlr7nosaFcbiAgcHJpdmF0ZSByZWNvbm5lY3RGbGFnID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgLy8g6YeN6L+eXG4gIHByaXZhdGUgcmVjb25uZWN0UGVyaW9kID0gNSAqIDEwMDA7ICAgICAgICAgICAgICAvLyDph43ov57lpLHotKUs5YiZNeenkumSn+mHjei/nuS4gOasoVxuICBwcml2YXRlIHJlY29ubmVjdFN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjsgICAgICAgICAgICAvLyDph43ov57orqLpmIXlr7nosaFcbiAgcHVibGljIHNlcnZlck1lc3NhZ2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpOy8vIHN1YmplY3Tlr7nosaEs55So5LqO5Y+R6YCB5pyN5Yqh5Zmo5raI5oGvXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8g5a6e5L6L5YyW5pe25byA5aeL6L+e5o6l5pyN5Yqh5ZmoXG4gICAgdGhpcy5jb25uZWN0KCk7XG4gICAgLy8g6L+b5YWl56iL5bqP5bCx6L+b6KGM5b+D6Lez5qOA5rWLLOmBv+WFjeWHuueOsOW8gOWni+Wwsei/nuaOpeS4reaWrSzlkI7nu63kuI3ph43ov55cbiAgICB0aGlzLmhlYXJ0Q2hlY2tTdGFydCgpO1xuICAgIC8vIOWwhm1lc3NhZ2VTdWJqZWN05a2Y5YKo5Yiwd2luZG935a+56LGh5LiKXG4gICAgKHdpbmRvdyBhcyBhbnkpLnNlcnZlck1lc3NhZ2VTdWJqZWN0ID0gdGhpcy5zZXJ2ZXJNZXNzYWdlU3ViamVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rmlrDov57mjqVcbiAgICovXG4gIHByaXZhdGUgY29ubmVjdCgpIHtcbiAgICB0aGlzLnVybCA9ICd3czovLycgKyB3aW5kb3cubG9jYXRpb24uaG9zdCArICcvd3M/dG9rZW49JyArIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2tlbicpO1xuICAgIC8vIOWIm+W7undlYnNvY2tldOWvueixoVxuICAgIHRoaXMuY3JlYXRlV2ViU29ja2V0KCk7XG4gIH1cblxuICAvKipcbiAgICog5Yib5bu66L+e5o6lXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVdlYlNvY2tldCgpIHtcbiAgICAvLyDlpoLmnpzmsqHmnInlu7rnq4vov4fov57mjqXvvIzmiY3lu7rnq4vov57mjqXlubbkuJTmt7vliqDml7bpl7Tnm5HlkKxcbiAgICB0aGlzLndlYlNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy51cmwpO1xuICAgIC8vIOW7uueri+i/nuaOpeaIkOWKn1xuICAgIHRoaXMud2ViU29ja2V0Lm9ub3BlbiA9ICgpID0+IHRoaXMub25PcGVuKCk7XG4gICAgLy8g5o6l5pS25Yiw5raI5oGvXG4gICAgdGhpcy53ZWJTb2NrZXQub25tZXNzYWdlID0gKGUpID0+IHRoaXMub25NZXNzYWdlKGUpO1xuICAgIC8vIOi/nuaOpeWFs+mXrVxuICAgIHRoaXMud2ViU29ja2V0Lm9uY2xvc2UgPSAoZSkgPT4gdGhpcy5vbkNsb3NlKGUpO1xuICAgIC8vIOW8guW4uFxuICAgIHRoaXMud2ViU29ja2V0Lm9uZXJyb3IgPSAoZSkgPT4gdGhpcy5vbkVycm9yKGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOi/nuaOpeaJk+W8gFxuICAgKi9cbiAgcHJpdmF0ZSBvbk9wZW4oKSB7XG4gICAgY29uc29sZS5sb2coJ3dlYnNvY2tldCDlt7Lov57mjqUnKTtcbiAgICAvLyDorr7nva7ov57mjqXmiJDlip9cbiAgICB0aGlzLmNvbm5lY3RTdWNjZXNzID0gdHJ1ZTtcbiAgICAvLyDlpoLmnpzmmK/ph43ov57kuK1cbiAgICBpZiAodGhpcy5yZWNvbm5lY3RGbGFnKSB7XG4gICAgICAvLyAxLuWBnOatoumHjei/nlxuICAgICAgdGhpcy5zdG9wUmVjb25uZWN0KCk7XG4gICAgICAvLyAyLumHjeaWsOW8gOWQr+W/g+i3s1xuICAgICAgdGhpcy5oZWFydENoZWNrU3RhcnQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5o6l5Y+X5Yiw5raI5oGvXG4gICAqL1xuICBwcml2YXRlIG9uTWVzc2FnZShldmVudDogYW55KSB7XG4gICAgLy8g5bCG5o6l5Y+X5Yiw55qE5raI5oGv5Y+R5biD5Ye65Y67XG4gICAgY29uc3QgbWVzc2FnZSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ3dlYnNvY2tldCcpIHtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2NsaWVudElkJywgbWVzc2FnZS52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VydmVyTWVzc2FnZVN1YmplY3QubmV4dChtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6L+e5o6l5YWz6ZetXG4gICAqL1xuICBwcml2YXRlIG9uQ2xvc2UoZTogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ3dlYnNvY2tldCDov57mjqXlhbPpl60nLCBlKTtcbiAgICB0aGlzLmNvbm5lY3RTdWNjZXNzID0gZmFsc2U7XG4gICAgdGhpcy53ZWJTb2NrZXQuY2xvc2UoKTtcbiAgICAvLyDlhbPpl63ml7blvIDlp4vph43ov55cbiAgICB0aGlzLnJlY29ubmVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOi/nuaOpeW8guW4uFxuICAgKi9cbiAgcHJpdmF0ZSBvbkVycm9yKGU6IGFueSkge1xuICAgIC8vIOWHuueOsOW8guW4uOaXtuS4gOWumuS8mui/m29uQ2xvc2Us5omA5Lul5Y+q5Zyob25DbG9zZeWBmuS4gOasoemHjei/nuWKqOS9nFxuICAgIGNvbnNvbGUubG9nKCd3ZWJzb2NrZXQg6L+e5o6l5byC5bi4JywgZSk7XG4gICAgdGhpcy5jb25uZWN0U3VjY2VzcyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIOW8gOWni+mHjeaWsOi/nuaOpVxuICAgKi9cbiAgcHJpdmF0ZSByZWNvbm5lY3QoKSB7XG4gICAgLy8g5aaC5p6c5bey6YeN6L+eLOWImeebtOaOpXJldHVybizpgb/lhY3ph43lpI3ov57mjqVcbiAgICBpZiAodGhpcy5jb25uZWN0U3VjY2Vzcykge1xuICAgICAgdGhpcy5zdG9wUmVjb25uZWN0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOWmguaenOato+WcqOi/nuaOpeS4rSzliJnnm7TmjqVyZXR1cm4s6YG/5YWN5Lqn55Sf5aSa5Liq6L2u6K6t5LqL5Lu2XG4gICAgaWYgKHRoaXMucmVjb25uZWN0RmxhZykge1xuICAgICAgY29uc29sZS5sb2coJ+ato+WcqOmHjei/ni4uLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDlvIDlp4vph43ov55cbiAgICB0aGlzLnJlY29ubmVjdEZsYWcgPSB0cnVlO1xuICAgIC8vIOWmguaenOayoeiDveaIkOWKn+i/nuaOpSzliJnlrprml7bph43ov55cbiAgICB0aGlzLnJlY29ubmVjdFN1YnNjcmlwdGlvbiA9IGludGVydmFsKHRoaXMucmVjb25uZWN0UGVyaW9kKS5zdWJzY3JpYmUoYXN5bmMgKHZhbCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYOmHjei/nu+8miR7dmFsICsgMX3mrKFgKTtcbiAgICAgIC8vIOmHjeaWsOi/nuaOpVxuICAgICAgdGhpcy5jb25uZWN0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5YGc5q2i6YeN6L+eXG4gICAqL1xuICBwcml2YXRlIHN0b3BSZWNvbm5lY3QoKSB7XG4gICAgLy8g6L+e5o6l5qCH6K+G572u5Li6ZmFsc2VcbiAgICB0aGlzLnJlY29ubmVjdEZsYWcgPSBmYWxzZTtcbiAgICAvLyDlj5bmtojorqLpmIVcbiAgICBpZiAodHlwZW9mIHRoaXMucmVjb25uZWN0U3Vic2NyaXB0aW9uICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnJlY29ubmVjdFN1YnNjcmlwdGlvbiAhPSBudWxsKSB7XG4gICAgICB0aGlzLnJlY29ubmVjdFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlvIDlp4vlv4Pot7Pmo4DmtYtcbiAgICovXG4gIHByaXZhdGUgaGVhcnRDaGVja1N0YXJ0KCkge1xuICAgIHRoaXMuc2VydmVyVGltZW91dFN1YnNjcmlwdGlvbiA9IGludGVydmFsKHRoaXMucGVyaW9kKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ+W/g+i3s+ajgOafpScpXG4gICAgICAvLyDkv53mjIHov57mjqXnirbmgIEs6YeN572u5LiLXG4gICAgICBpZiAodGhpcy53ZWJTb2NrZXQgIT0gbnVsbCAmJiB0aGlzLndlYlNvY2tldC5yZWFkeVN0YXRlID09PSAxKSB7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlgZzmraLlv4Pot7NcbiAgICAgICAgdGhpcy5oZWFydENoZWNrU3RvcCgpO1xuICAgICAgICAvLyDlvIDlp4vph43ov55cbiAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlgZzmraLlv4Pot7Pmo4DmtYtcbiAgICovXG4gIHByaXZhdGUgaGVhcnRDaGVja1N0b3AoKSB7XG4gICAgLy8g5Y+W5raI6K6i6ZiF5YGc5q2i5b+D6LezXG4gICAgaWYgKHR5cGVvZiB0aGlzLnNlcnZlclRpbWVvdXRTdWJzY3JpcHRpb24gIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc2VydmVyVGltZW91dFN1YnNjcmlwdGlvbiAhPSBudWxsKSB7XG4gICAgICB0aGlzLnNlcnZlclRpbWVvdXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|