@techextensor/tab-core-utility 2.2.199 → 2.2.200

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.
@@ -55,13 +55,29 @@ export class SignalRService {
55
55
  });
56
56
  }
57
57
  /**
58
- * Establish a connection to the SignalR hub
58
+ * Establish a connection to the SignalR hub.
59
+ *
60
+ * Awaitable — the returned promise resolves when the first connection attempt
61
+ * settles (success or failure). Idempotent: repeated calls are de-duplicated;
62
+ * if already CONNECTED, resolves immediately.
59
63
  *
60
- * This method is idempotent - if the connection is already established, it will not be re-established.
61
64
  * Hub URL is read from Common.signalRHubUrl (set during app initialization via Common.init())
62
65
  */
63
- connect() {
64
- this.infrastructure.connect();
66
+ async connect() {
67
+ await this.infrastructure.connect();
68
+ }
69
+ /**
70
+ * Tear down the connection (call from auth signOut or cross-tab logout).
71
+ *
72
+ * - Stops the hub and clears tracked groups
73
+ * - Drops all component registrations (stale once the socket dies)
74
+ * - Errors any in-flight waitForOperation() observers so the UI doesn't
75
+ * strand until the 120s timeout
76
+ */
77
+ async disconnect() {
78
+ await this.infrastructure.disconnect();
79
+ this.componentRegistry.clear();
80
+ this.operationTracker.cancelAll('disconnected');
65
81
  }
66
82
  /**
67
83
  * Register component for real-time notifications
@@ -204,4 +220,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
204
220
  providedIn: 'root',
205
221
  }]
206
222
  }], ctorParameters: () => [] });
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvY29yZS9zZXJ2aWNlL3NpZ25hbHIvc2lnbmFsci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBSUwsZ0JBQWdCLEdBQ2pCLE1BQU0sMkNBQTJDLENBQUM7O0FBRW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUFpQnpCO1FBaEJRLG1CQUFjLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MscUJBQWdCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFM0QseURBQXlEO1FBQ2pELHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUE2QyxDQUFDO1FBRWpGOztXQUVHO1FBQ00sb0JBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQztRQUUvRDs7V0FFRztRQUNNLGdCQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUczRiw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDNUQsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUV2RCx3RUFBd0U7WUFDeEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFFBQVEsQ0FBQyxXQUFtQixFQUFFLFdBQW1CLEVBQUUsUUFBOEI7UUFDL0UscURBQXFEO1FBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBRSxDQUFDO1FBRTVELHlEQUF5RDtRQUN6RCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELDRCQUE0QjtRQUM1QixVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxVQUFVLENBQUMsV0FBbUIsRUFBRSxXQUFtQjtRQUNqRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixPQUFPO1FBQ1QsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRS9CLHlEQUF5RDtRQUN6RCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxnQkFBZ0IsQ0FBQyxhQUFxQixFQUFFLE9BQWdCO1FBQ3RELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxpQkFBaUIsQ0FBQyxTQUEyQjtRQUMzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCLENBQUMsYUFBcUI7UUFDdEMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7O09BR0c7SUFDSyxnQkFBZ0IsQ0FBQyxZQUE4QjtRQUNyRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV4RSxJQUFJLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekMsb0VBQW9FO1lBQ3BFLE9BQU87UUFDVCxDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDO2dCQUNILFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxXQUFXLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMxRixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQixDQUFDLFdBQW1CO1FBQ25DLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7T0FFRztJQUNILHNCQUFzQjtRQUNwQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDNUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLE1BQU0sS0FBSyxHQUFzRCxFQUFFLENBQUM7UUFFcEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsRUFBRTtZQUN6RCxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUNULFdBQVc7Z0JBQ1gsY0FBYyxFQUFFLFVBQVUsQ0FBQyxJQUFJO2FBQ2hDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCx5QkFBeUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQy9DLENBQUM7K0dBNUxVLGNBQWM7bUhBQWQsY0FBYyxjQUZiLE1BQU07OzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0LCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNpZ25hbFJJbmZyYXN0cnVjdHVyZSB9IGZyb20gJy4vc2lnbmFsci1pbmZyYXN0cnVjdHVyZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3BlcmF0aW9uVHJhY2tlclNlcnZpY2UgfSBmcm9tICcuL29wZXJhdGlvbi10cmFja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIENydWROb3RpZmljYXRpb24sXHJcbiAgTm90aWZpY2F0aW9uQ2FsbGJhY2ssXHJcbiAgUGVuZGluZ09wZXJhdGlvbixcclxuICBDT05ORUNUSU9OX1NUQVRFLFxyXG59IGZyb20gJy4uLy4uLy4uL2FwcC9pbnRlcmZhY2VzL3NpZ25hbHIuaW50ZXJmYWNlJztcclxuXHJcbi8qKlxyXG4gKiBTaWduYWxSIFNlcnZpY2VcclxuICogUHVibGljIEFQSSBmb3I6XHJcbiAqIDEuIENvbXBvbmVudHMgdG8gcmVnaXN0ZXIgZm9yIHJlYWwtdGltZSBDUlVEIG5vdGlmaWNhdGlvbnNcclxuICogMi4gU2VydmljZXMgKFRhYkZvcm1pb1NlcnZpY2UpIHRvIHRyYWNrIGFzeW5jIG9wZXJhdGlvbnNcclxuICpcclxuICogVXNhZ2UgaW4gY29tcG9uZW50czpcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBuZ09uSW5pdCgpIHtcclxuICogICB0aGlzLnNpZ25hbFJTZXJ2aWNlLnJlZ2lzdGVyKFxyXG4gKiAgICAgdGhpcy5jb21wb25lbnRJZCxcclxuICogICAgIHRoaXMuYXBwT2JqZWN0SWQsXHJcbiAqICAgICAobm90aWZpY2F0aW9uKSA9PiB0aGlzLmhhbmRsZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pXHJcbiAqICAgKTtcclxuICogfVxyXG4gKlxyXG4gKiBuZ09uRGVzdHJveSgpIHtcclxuICogICB0aGlzLnNpZ25hbFJTZXJ2aWNlLnVucmVnaXN0ZXIodGhpcy5jb21wb25lbnRJZCwgdGhpcy5hcHBPYmplY3RJZCk7XHJcbiAqIH1cclxuICogYGBgXHJcbiAqXHJcbiAqIFVzYWdlIGluIHNlcnZpY2VzIChUYWJGb3JtaW9TZXJ2aWNlKTpcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBjb3JyZWxhdGlvbklkID0gcmVzcG9uc2UuY29ycmVsYXRpb25JZDtcclxuICogdGhpcy5zaWduYWxSU2VydmljZS53YWl0Rm9yT3BlcmF0aW9uKGNvcnJlbGF0aW9uSWQpLnN1YnNjcmliZShub3RpZmljYXRpb24gPT4ge1xyXG4gKiAgIC8vIEhhbmRsZSBjb21wbGV0ZWQgb3BlcmF0aW9uXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICovXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaWduYWxSU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBpbmZyYXN0cnVjdHVyZSA9IGluamVjdChTaWduYWxSSW5mcmFzdHJ1Y3R1cmUpO1xyXG4gIHByaXZhdGUgb3BlcmF0aW9uVHJhY2tlciA9IGluamVjdChPcGVyYXRpb25UcmFja2VyU2VydmljZSk7XHJcblxyXG4gIC8vIFJlZ2lzdHJ5OiBNYXA8YXBwT2JqZWN0SWQsIE1hcDxjb21wb25lbnRJZCwgY2FsbGJhY2s+PlxyXG4gIHByaXZhdGUgY29tcG9uZW50UmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgTm90aWZpY2F0aW9uQ2FsbGJhY2s+PigpO1xyXG5cclxuICAvKipcclxuICAgKiBHZXQgY29ubmVjdGlvbiBzdGF0ZSAoZm9yIFVJIGluZGljYXRvcnMpXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgY29ubmVjdGlvblN0YXRlID0gdGhpcy5pbmZyYXN0cnVjdHVyZS5jb25uZWN0aW9uU3RhdGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGN1cnJlbnRseSBjb25uZWN0ZWRcclxuICAgKi9cclxuICByZWFkb25seSBpc0Nvbm5lY3RlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29ubmVjdGlvblN0YXRlKCkgPT09IENPTk5FQ1RJT05fU1RBVEUuQ09OTkVDVEVEKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAvLyBMaXN0ZW4gdG8gbm90aWZpY2F0aW9ucyBmcm9tIGluZnJhc3RydWN0dXJlIGFuZCByb3V0ZSB0aGVtXHJcbiAgICB0aGlzLmluZnJhc3RydWN0dXJlLm5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZSgobm90aWZpY2F0aW9uKSA9PiB7XHJcbiAgICAgIC8vIDEuIENoZWNrIGlmIHRoaXMgaXMgYSB0cmFja2VkIGFzeW5jIG9wZXJhdGlvbiAocHJvY2Vzc1JlcXVlc3QpXHJcbiAgICAgIHRoaXMub3BlcmF0aW9uVHJhY2tlci5oYW5kbGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcclxuXHJcbiAgICAgIC8vIDIuIEFsc28gbm90aWZ5IGNvbXBvbmVudHMgc3Vic2NyaWJlZCB0byB0aGlzIGFwcE9iamVjdElkIChHcmlkLCBldGMuKVxyXG4gICAgICB0aGlzLm5vdGlmeUNvbXBvbmVudHMobm90aWZpY2F0aW9uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUgU2lnbmFsUiBodWJcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQgLSBpZiB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGVzdGFibGlzaGVkLCBpdCB3aWxsIG5vdCBiZSByZS1lc3RhYmxpc2hlZC5cclxuICAgKiBIdWIgVVJMIGlzIHJlYWQgZnJvbSBDb21tb24uc2lnbmFsUkh1YlVybCAoc2V0IGR1cmluZyBhcHAgaW5pdGlhbGl6YXRpb24gdmlhIENvbW1vbi5pbml0KCkpXHJcbiAgICovXHJcbiAgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5mcmFzdHJ1Y3R1cmUuY29ubmVjdCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgY29tcG9uZW50IGZvciByZWFsLXRpbWUgbm90aWZpY2F0aW9uc1xyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvbXBvbmVudElkIC0gVW5pcXVlIGNvbXBvbmVudCBpZGVudGlmaWVyIChnZW5lcmF0ZWQgYnkgY29tcG9uZW50KVxyXG4gICAqIEBwYXJhbSBhcHBPYmplY3RJZCAtIEFwcE9iamVjdCBJRCB0byBzdWJzY3JpYmUgdG9cclxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gbm90aWZpY2F0aW9uIHJlY2VpdmVkXHJcbiAgICovXHJcbiAgcmVnaXN0ZXIoY29tcG9uZW50SWQ6IHN0cmluZywgYXBwT2JqZWN0SWQ6IHN0cmluZywgY2FsbGJhY2s6IE5vdGlmaWNhdGlvbkNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAvLyBJbml0aWFsaXplIG1hcCBmb3IgdGhpcyBBcHBPYmplY3QgaWYgZG9lc24ndCBleGlzdFxyXG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmhhcyhhcHBPYmplY3RJZCkpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRSZWdpc3RyeS5zZXQoYXBwT2JqZWN0SWQsIG5ldyBNYXAoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZ2V0KGFwcE9iamVjdElkKSE7XHJcblxyXG4gICAgLy8gRmlyc3QgY29tcG9uZW50IGZvciB0aGlzIEFwcE9iamVjdD8gSm9pbiBTaWduYWxSIGdyb3VwXHJcbiAgICBpZiAoY29tcG9uZW50cy5zaXplID09PSAwKSB7XHJcbiAgICAgIHRoaXMuaW5mcmFzdHJ1Y3R1cmUuam9pbkdyb3VwKGFwcE9iamVjdElkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgY29tcG9uZW50IHRvIHJlZ2lzdHJ5XHJcbiAgICBjb21wb25lbnRzLnNldChjb21wb25lbnRJZCwgY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVW5yZWdpc3RlciBjb21wb25lbnQgKGNsZWFudXAgb24gY29tcG9uZW50IGRlc3Ryb3kpXHJcbiAgICpcclxuICAgKiBAcGFyYW0gY29tcG9uZW50SWQgLSBDb21wb25lbnQgaWRlbnRpZmllciB0byByZW1vdmVcclxuICAgKiBAcGFyYW0gYXBwT2JqZWN0SWQgLSBBcHBPYmplY3QgSUQgdG8gdW5zdWJzY3JpYmUgZnJvbVxyXG4gICAqL1xyXG4gIHVucmVnaXN0ZXIoY29tcG9uZW50SWQ6IHN0cmluZywgYXBwT2JqZWN0SWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZ2V0KGFwcE9iamVjdElkKTtcclxuICAgIGlmICghY29tcG9uZW50cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlIGNvbXBvbmVudCBmcm9tIHJlZ2lzdHJ5XHJcbiAgICBjb21wb25lbnRzLmRlbGV0ZShjb21wb25lbnRJZCk7XHJcblxyXG4gICAgLy8gTGFzdCBjb21wb25lbnQgZm9yIHRoaXMgQXBwT2JqZWN0PyBMZWF2ZSBTaWduYWxSIGdyb3VwXHJcbiAgICBpZiAoY29tcG9uZW50cy5zaXplID09PSAwKSB7XHJcbiAgICAgIHRoaXMuaW5mcmFzdHJ1Y3R1cmUubGVhdmVHcm91cChhcHBPYmplY3RJZCk7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZGVsZXRlKGFwcE9iamVjdElkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdhaXQgZm9yIHNwZWNpZmljIGFzeW5jIG9wZXJhdGlvbiB0byBjb21wbGV0ZVxyXG4gICAqIFVzZWQgYnkgVGFiRm9ybWlvU2VydmljZSBmb3IgYXN5bmMgcHJvY2Vzc1JlcXVlc3Qgb3BlcmF0aW9uc1xyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvcnJlbGF0aW9uSWQgLSBDb3JyZWxhdGlvbiBJRCBmcm9tIGJhY2tlbmQgcmVzcG9uc2VcclxuICAgKiBAcGFyYW0gdGltZW91dCAtIE9wdGlvbmFsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXHJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gb3BlcmF0aW9uIGNvbXBsZXRlc1xyXG4gICAqL1xyXG4gIHdhaXRGb3JPcGVyYXRpb24oY29ycmVsYXRpb25JZDogc3RyaW5nLCB0aW1lb3V0PzogbnVtYmVyKTogT2JzZXJ2YWJsZTxDcnVkTm90aWZpY2F0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25UcmFja2VyLndhaXRGb3JPcGVyYXRpb24oY29ycmVsYXRpb25JZCwgdGltZW91dCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBhc3luYyBvcGVyYXRpb24gZm9yIHRyYWNraW5nXHJcbiAgICogT3B0aW9uYWwgLSB3YWl0Rm9yT3BlcmF0aW9uIGhhbmRsZXMgcmVnaXN0cmF0aW9uIGF1dG9tYXRpY2FsbHlcclxuICAgKlxyXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBQZW5kaW5nIG9wZXJhdGlvbiBkZXRhaWxzXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPcGVyYXRpb24ob3BlcmF0aW9uOiBQZW5kaW5nT3BlcmF0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLm9wZXJhdGlvblRyYWNrZXIucmVnaXN0ZXJPcGVyYXRpb24ob3BlcmF0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIG9wZXJhdGlvbiBpcyBwZW5kaW5nXHJcbiAgICovXHJcbiAgaXNPcGVyYXRpb25QZW5kaW5nKGNvcnJlbGF0aW9uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uVHJhY2tlci5pc1BlbmRpbmcoY29ycmVsYXRpb25JZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOb3RpZnkgYWxsIHJlZ2lzdGVyZWQgY29tcG9uZW50cyBmb3IgYW4gQXBwT2JqZWN0XHJcbiAgICogQ2FsbGVkIHdoZW4gbm90aWZpY2F0aW9uIHJlY2VpdmVkIGZyb20gU2lnbmFsUiBodWJcclxuICAgKi9cclxuICBwcml2YXRlIG5vdGlmeUNvbXBvbmVudHMobm90aWZpY2F0aW9uOiBDcnVkTm90aWZpY2F0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRSZWdpc3RyeS5nZXQobm90aWZpY2F0aW9uLmFwcE9iamVjdElkKTtcclxuXHJcbiAgICBpZiAoIWNvbXBvbmVudHMgfHwgY29tcG9uZW50cy5zaXplID09PSAwKSB7XHJcbiAgICAgIC8vIE5vIGNvbXBvbmVudHMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBBcHBPYmplY3QgLSBpZ25vcmUgbm90aWZpY2F0aW9uXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxsIGVhY2ggY29tcG9uZW50J3MgY2FsbGJhY2tcclxuICAgIGNvbXBvbmVudHMuZm9yRWFjaCgoY2FsbGJhY2ssIGNvbXBvbmVudElkKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY2FsbGJhY2sobm90aWZpY2F0aW9uKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBbU2lnbmFsUiBTZXJ2aWNlXSBDYWxsYmFjayBmYWlsZWQgZm9yIGNvbXBvbmVudCAke2NvbXBvbmVudElkfTpgLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFjdGl2ZSBBcHBPYmplY3QgZ3JvdXBzIChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldEFjdGl2ZUdyb3VwcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmtleXMoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY29tcG9uZW50IGNvdW50IGZvciBhbiBBcHBPYmplY3QgKGZvciBkZWJ1Z2dpbmcpXHJcbiAgICovXHJcbiAgZ2V0Q29tcG9uZW50Q291bnQoYXBwT2JqZWN0SWQ6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRSZWdpc3RyeS5nZXQoYXBwT2JqZWN0SWQpPy5zaXplIHx8IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdG90YWwgcmVnaXN0ZXJlZCBjb21wb25lbnRzIGFjcm9zcyBhbGwgQXBwT2JqZWN0cyAoZm9yIGRlYnVnZ2luZylcclxuICAgKi9cclxuICBnZXRUb3RhbENvbXBvbmVudENvdW50KCk6IG51bWJlciB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgdGhpcy5jb21wb25lbnRSZWdpc3RyeS5mb3JFYWNoKChjb21wb25lbnRzKSA9PiB7XHJcbiAgICAgIHRvdGFsICs9IGNvbXBvbmVudHMuc2l6ZTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRvdGFsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHJlZ2lzdHJ5IHN0YXRlIChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldFJlZ2lzdHJ5U3RhdGUoKTogeyBhcHBPYmplY3RJZDogc3RyaW5nOyBjb21wb25lbnRDb3VudDogbnVtYmVyIH1bXSB7XHJcbiAgICBjb25zdCBzdGF0ZTogeyBhcHBPYmplY3RJZDogc3RyaW5nOyBjb21wb25lbnRDb3VudDogbnVtYmVyIH1bXSA9IFtdO1xyXG5cclxuICAgIHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZm9yRWFjaCgoY29tcG9uZW50cywgYXBwT2JqZWN0SWQpID0+IHtcclxuICAgICAgc3RhdGUucHVzaCh7XHJcbiAgICAgICAgYXBwT2JqZWN0SWQsXHJcbiAgICAgICAgY29tcG9uZW50Q291bnQ6IGNvbXBvbmVudHMuc2l6ZSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gc3RhdGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgcGVuZGluZyBvcGVyYXRpb25zIGNvdW50IChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldFBlbmRpbmdPcGVyYXRpb25zQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvblRyYWNrZXIuZ2V0UGVuZGluZ0NvdW50KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIHBlbmRpbmcgb3BlcmF0aW9ucyAoZm9yIGRlYnVnZ2luZylcclxuICAgKi9cclxuICBnZXRQZW5kaW5nT3BlcmF0aW9ucygpOiBQZW5kaW5nT3BlcmF0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uVHJhY2tlci5nZXRBbGxQZW5kaW5nKCk7XHJcbiAgfVxyXG59Il19
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvY29yZS9zZXJ2aWNlL3NpZ25hbHIvc2lnbmFsci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBSUwsZ0JBQWdCLEdBQ2pCLE1BQU0sMkNBQTJDLENBQUM7O0FBRW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUFpQnpCO1FBaEJRLG1CQUFjLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MscUJBQWdCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFM0QseURBQXlEO1FBQ2pELHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUE2QyxDQUFDO1FBRWpGOztXQUVHO1FBQ00sb0JBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQztRQUUvRDs7V0FFRztRQUNNLGdCQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUczRiw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDNUQsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FB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QUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILHlCQUF5QjtRQUN2QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDL0MsQ0FBQzsrR0E3TVUsY0FBYzttSEFBZCxjQUFjLGNBRmIsTUFBTTs7NEZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QsIGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2lnbmFsUkluZnJhc3RydWN0dXJlIH0gZnJvbSAnLi9zaWduYWxyLWluZnJhc3RydWN0dXJlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPcGVyYXRpb25UcmFja2VyU2VydmljZSB9IGZyb20gJy4vb3BlcmF0aW9uLXRyYWNrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQ3J1ZE5vdGlmaWNhdGlvbixcclxuICBOb3RpZmljYXRpb25DYWxsYmFjayxcclxuICBQZW5kaW5nT3BlcmF0aW9uLFxyXG4gIENPTk5FQ1RJT05fU1RBVEUsXHJcbn0gZnJvbSAnLi4vLi4vLi4vYXBwL2ludGVyZmFjZXMvc2lnbmFsci5pbnRlcmZhY2UnO1xyXG5cclxuLyoqXHJcbiAqIFNpZ25hbFIgU2VydmljZVxyXG4gKiBQdWJsaWMgQVBJIGZvcjpcclxuICogMS4gQ29tcG9uZW50cyB0byByZWdpc3RlciBmb3IgcmVhbC10aW1lIENSVUQgbm90aWZpY2F0aW9uc1xyXG4gKiAyLiBTZXJ2aWNlcyAoVGFiRm9ybWlvU2VydmljZSkgdG8gdHJhY2sgYXN5bmMgb3BlcmF0aW9uc1xyXG4gKlxyXG4gKiBVc2FnZSBpbiBjb21wb25lbnRzOlxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIG5nT25Jbml0KCkge1xyXG4gKiAgIHRoaXMuc2lnbmFsUlNlcnZpY2UucmVnaXN0ZXIoXHJcbiAqICAgICB0aGlzLmNvbXBvbmVudElkLFxyXG4gKiAgICAgdGhpcy5hcHBPYmplY3RJZCxcclxuICogICAgIChub3RpZmljYXRpb24pID0+IHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbilcclxuICogICApO1xyXG4gKiB9XHJcbiAqXHJcbiAqIG5nT25EZXN0cm95KCkge1xyXG4gKiAgIHRoaXMuc2lnbmFsUlNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmNvbXBvbmVudElkLCB0aGlzLmFwcE9iamVjdElkKTtcclxuICogfVxyXG4gKiBgYGBcclxuICpcclxuICogVXNhZ2UgaW4gc2VydmljZXMgKFRhYkZvcm1pb1NlcnZpY2UpOlxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByZXNwb25zZS5jb3JyZWxhdGlvbklkO1xyXG4gKiB0aGlzLnNpZ25hbFJTZXJ2aWNlLndhaXRGb3JPcGVyYXRpb24oY29ycmVsYXRpb25JZCkuc3Vic2NyaWJlKG5vdGlmaWNhdGlvbiA9PiB7XHJcbiAqICAgLy8gSGFuZGxlIGNvbXBsZXRlZCBvcGVyYXRpb25cclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNpZ25hbFJTZXJ2aWNlIHtcclxuICBwcml2YXRlIGluZnJhc3RydWN0dXJlID0gaW5qZWN0KFNpZ25hbFJJbmZyYXN0cnVjdHVyZSk7XHJcbiAgcHJpdmF0ZSBvcGVyYXRpb25UcmFja2VyID0gaW5qZWN0KE9wZXJhdGlvblRyYWNrZXJTZXJ2aWNlKTtcclxuXHJcbiAgLy8gUmVnaXN0cnk6IE1hcDxhcHBPYmplY3RJZCwgTWFwPGNvbXBvbmVudElkLCBjYWxsYmFjaz4+XHJcbiAgcHJpdmF0ZSBjb21wb25lbnRSZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBOb3RpZmljYXRpb25DYWxsYmFjaz4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjb25uZWN0aW9uIHN0YXRlIChmb3IgVUkgaW5kaWNhdG9ycylcclxuICAgKi9cclxuICByZWFkb25seSBjb25uZWN0aW9uU3RhdGUgPSB0aGlzLmluZnJhc3RydWN0dXJlLmNvbm5lY3Rpb25TdGF0ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgY3VycmVudGx5IGNvbm5lY3RlZFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGlzQ29ubmVjdGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb25uZWN0aW9uU3RhdGUoKSA9PT0gQ09OTkVDVElPTl9TVEFURS5DT05ORUNURUQpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIC8vIExpc3RlbiB0byBub3RpZmljYXRpb25zIGZyb20gaW5mcmFzdHJ1Y3R1cmUgYW5kIHJvdXRlIHRoZW1cclxuICAgIHRoaXMuaW5mcmFzdHJ1Y3R1cmUubm90aWZpY2F0aW9ucyQuc3Vic2NyaWJlKChub3RpZmljYXRpb24pID0+IHtcclxuICAgICAgLy8gMS4gQ2hlY2sgaWYgdGhpcyBpcyBhIHRyYWNrZWQgYXN5bmMgb3BlcmF0aW9uIChwcm9jZXNzUmVxdWVzdClcclxuICAgICAgdGhpcy5vcGVyYXRpb25UcmFja2VyLmhhbmRsZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xyXG5cclxuICAgICAgLy8gMi4gQWxzbyBub3RpZnkgY29tcG9uZW50cyBzdWJzY3JpYmVkIHRvIHRoaXMgYXBwT2JqZWN0SWQgKEdyaWQsIGV0Yy4pXHJcbiAgICAgIHRoaXMubm90aWZ5Q29tcG9uZW50cyhub3RpZmljYXRpb24pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIHRoZSBTaWduYWxSIGh1Yi5cclxuICAgKlxyXG4gICAqIEF3YWl0YWJsZSDigJQgdGhlIHJldHVybmVkIHByb21pc2UgcmVzb2x2ZXMgd2hlbiB0aGUgZmlyc3QgY29ubmVjdGlvbiBhdHRlbXB0XHJcbiAgICogc2V0dGxlcyAoc3VjY2VzcyBvciBmYWlsdXJlKS4gSWRlbXBvdGVudDogcmVwZWF0ZWQgY2FsbHMgYXJlIGRlLWR1cGxpY2F0ZWQ7XHJcbiAgICogaWYgYWxyZWFkeSBDT05ORUNURUQsIHJlc29sdmVzIGltbWVkaWF0ZWx5LlxyXG4gICAqXHJcbiAgICogSHViIFVSTCBpcyByZWFkIGZyb20gQ29tbW9uLnNpZ25hbFJIdWJVcmwgKHNldCBkdXJpbmcgYXBwIGluaXRpYWxpemF0aW9uIHZpYSBDb21tb24uaW5pdCgpKVxyXG4gICAqL1xyXG4gIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmluZnJhc3RydWN0dXJlLmNvbm5lY3QoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRlYXIgZG93biB0aGUgY29ubmVjdGlvbiAoY2FsbCBmcm9tIGF1dGggc2lnbk91dCBvciBjcm9zcy10YWIgbG9nb3V0KS5cclxuICAgKlxyXG4gICAqIC0gU3RvcHMgdGhlIGh1YiBhbmQgY2xlYXJzIHRyYWNrZWQgZ3JvdXBzXHJcbiAgICogLSBEcm9wcyBhbGwgY29tcG9uZW50IHJlZ2lzdHJhdGlvbnMgKHN0YWxlIG9uY2UgdGhlIHNvY2tldCBkaWVzKVxyXG4gICAqIC0gRXJyb3JzIGFueSBpbi1mbGlnaHQgd2FpdEZvck9wZXJhdGlvbigpIG9ic2VydmVycyBzbyB0aGUgVUkgZG9lc24ndFxyXG4gICAqICAgc3RyYW5kIHVudGlsIHRoZSAxMjBzIHRpbWVvdXRcclxuICAgKi9cclxuICBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5pbmZyYXN0cnVjdHVyZS5kaXNjb25uZWN0KCk7XHJcbiAgICB0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmNsZWFyKCk7XHJcbiAgICB0aGlzLm9wZXJhdGlvblRyYWNrZXIuY2FuY2VsQWxsKCdkaXNjb25uZWN0ZWQnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIGNvbXBvbmVudCBmb3IgcmVhbC10aW1lIG5vdGlmaWNhdGlvbnNcclxuICAgKlxyXG4gICAqIEBwYXJhbSBjb21wb25lbnRJZCAtIFVuaXF1ZSBjb21wb25lbnQgaWRlbnRpZmllciAoZ2VuZXJhdGVkIGJ5IGNvbXBvbmVudClcclxuICAgKiBAcGFyYW0gYXBwT2JqZWN0SWQgLSBBcHBPYmplY3QgSUQgdG8gc3Vic2NyaWJlIHRvXHJcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIG5vdGlmaWNhdGlvbiByZWNlaXZlZFxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyKGNvbXBvbmVudElkOiBzdHJpbmcsIGFwcE9iamVjdElkOiBzdHJpbmcsIGNhbGxiYWNrOiBOb3RpZmljYXRpb25DYWxsYmFjayk6IHZvaWQge1xyXG4gICAgLy8gSW5pdGlhbGl6ZSBtYXAgZm9yIHRoaXMgQXBwT2JqZWN0IGlmIGRvZXNuJ3QgZXhpc3RcclxuICAgIGlmICghdGhpcy5jb21wb25lbnRSZWdpc3RyeS5oYXMoYXBwT2JqZWN0SWQpKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50UmVnaXN0cnkuc2V0KGFwcE9iamVjdElkLCBuZXcgTWFwKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmdldChhcHBPYmplY3RJZCkhO1xyXG5cclxuICAgIC8vIEZpcnN0IGNvbXBvbmVudCBmb3IgdGhpcyBBcHBPYmplY3Q/IEpvaW4gU2lnbmFsUiBncm91cFxyXG4gICAgaWYgKGNvbXBvbmVudHMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICB0aGlzLmluZnJhc3RydWN0dXJlLmpvaW5Hcm91cChhcHBPYmplY3RJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIGNvbXBvbmVudCB0byByZWdpc3RyeVxyXG4gICAgY29tcG9uZW50cy5zZXQoY29tcG9uZW50SWQsIGNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVucmVnaXN0ZXIgY29tcG9uZW50IChjbGVhbnVwIG9uIGNvbXBvbmVudCBkZXN0cm95KVxyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvbXBvbmVudElkIC0gQ29tcG9uZW50IGlkZW50aWZpZXIgdG8gcmVtb3ZlXHJcbiAgICogQHBhcmFtIGFwcE9iamVjdElkIC0gQXBwT2JqZWN0IElEIHRvIHVuc3Vic2NyaWJlIGZyb21cclxuICAgKi9cclxuICB1bnJlZ2lzdGVyKGNvbXBvbmVudElkOiBzdHJpbmcsIGFwcE9iamVjdElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmdldChhcHBPYmplY3RJZCk7XHJcbiAgICBpZiAoIWNvbXBvbmVudHMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbW92ZSBjb21wb25lbnQgZnJvbSByZWdpc3RyeVxyXG4gICAgY29tcG9uZW50cy5kZWxldGUoY29tcG9uZW50SWQpO1xyXG5cclxuICAgIC8vIExhc3QgY29tcG9uZW50IGZvciB0aGlzIEFwcE9iamVjdD8gTGVhdmUgU2lnbmFsUiBncm91cFxyXG4gICAgaWYgKGNvbXBvbmVudHMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICB0aGlzLmluZnJhc3RydWN0dXJlLmxlYXZlR3JvdXAoYXBwT2JqZWN0SWQpO1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmRlbGV0ZShhcHBPYmplY3RJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXYWl0IGZvciBzcGVjaWZpYyBhc3luYyBvcGVyYXRpb24gdG8gY29tcGxldGVcclxuICAgKiBVc2VkIGJ5IFRhYkZvcm1pb1NlcnZpY2UgZm9yIGFzeW5jIHByb2Nlc3NSZXF1ZXN0IG9wZXJhdGlvbnNcclxuICAgKlxyXG4gICAqIEBwYXJhbSBjb3JyZWxhdGlvbklkIC0gQ29ycmVsYXRpb24gSUQgZnJvbSBiYWNrZW5kIHJlc3BvbnNlXHJcbiAgICogQHBhcmFtIHRpbWVvdXQgLSBPcHRpb25hbCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgdGhhdCBlbWl0cyB3aGVuIG9wZXJhdGlvbiBjb21wbGV0ZXNcclxuICAgKi9cclxuICB3YWl0Rm9yT3BlcmF0aW9uKGNvcnJlbGF0aW9uSWQ6IHN0cmluZywgdGltZW91dD86IG51bWJlcik6IE9ic2VydmFibGU8Q3J1ZE5vdGlmaWNhdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uVHJhY2tlci53YWl0Rm9yT3BlcmF0aW9uKGNvcnJlbGF0aW9uSWQsIHRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgYXN5bmMgb3BlcmF0aW9uIGZvciB0cmFja2luZ1xyXG4gICAqIE9wdGlvbmFsIC0gd2FpdEZvck9wZXJhdGlvbiBoYW5kbGVzIHJlZ2lzdHJhdGlvbiBhdXRvbWF0aWNhbGx5XHJcbiAgICpcclxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gUGVuZGluZyBvcGVyYXRpb24gZGV0YWlsc1xyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT3BlcmF0aW9uKG9wZXJhdGlvbjogUGVuZGluZ09wZXJhdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVyYXRpb25UcmFja2VyLnJlZ2lzdGVyT3BlcmF0aW9uKG9wZXJhdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBvcGVyYXRpb24gaXMgcGVuZGluZ1xyXG4gICAqL1xyXG4gIGlzT3BlcmF0aW9uUGVuZGluZyhjb3JyZWxhdGlvbklkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvblRyYWNrZXIuaXNQZW5kaW5nKGNvcnJlbGF0aW9uSWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTm90aWZ5IGFsbCByZWdpc3RlcmVkIGNvbXBvbmVudHMgZm9yIGFuIEFwcE9iamVjdFxyXG4gICAqIENhbGxlZCB3aGVuIG5vdGlmaWNhdGlvbiByZWNlaXZlZCBmcm9tIFNpZ25hbFIgaHViXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBub3RpZnlDb21wb25lbnRzKG5vdGlmaWNhdGlvbjogQ3J1ZE5vdGlmaWNhdGlvbik6IHZvaWQge1xyXG4gICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZ2V0KG5vdGlmaWNhdGlvbi5hcHBPYmplY3RJZCk7XHJcblxyXG4gICAgaWYgKCFjb21wb25lbnRzIHx8IGNvbXBvbmVudHMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICAvLyBObyBjb21wb25lbnRzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgQXBwT2JqZWN0IC0gaWdub3JlIG5vdGlmaWNhdGlvblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FsbCBlYWNoIGNvbXBvbmVudCdzIGNhbGxiYWNrXHJcbiAgICBjb21wb25lbnRzLmZvckVhY2goKGNhbGxiYWNrLCBjb21wb25lbnRJZCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNhbGxiYWNrKG5vdGlmaWNhdGlvbik7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NpZ25hbFIgU2VydmljZV0gQ2FsbGJhY2sgZmFpbGVkIGZvciBjb21wb25lbnQgJHtjb21wb25lbnRJZH06YCwgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhY3RpdmUgQXBwT2JqZWN0IGdyb3VwcyAoZm9yIGRlYnVnZ2luZylcclxuICAgKi9cclxuICBnZXRBY3RpdmVHcm91cHMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jb21wb25lbnRSZWdpc3RyeS5rZXlzKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGNvbXBvbmVudCBjb3VudCBmb3IgYW4gQXBwT2JqZWN0IChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldENvbXBvbmVudENvdW50KGFwcE9iamVjdElkOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZ2V0KGFwcE9iamVjdElkKT8uc2l6ZSB8fCAwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRvdGFsIHJlZ2lzdGVyZWQgY29tcG9uZW50cyBhY3Jvc3MgYWxsIEFwcE9iamVjdHMgKGZvciBkZWJ1Z2dpbmcpXHJcbiAgICovXHJcbiAgZ2V0VG90YWxDb21wb25lbnRDb3VudCgpOiBudW1iZXIge1xyXG4gICAgbGV0IHRvdGFsID0gMDtcclxuICAgIHRoaXMuY29tcG9uZW50UmVnaXN0cnkuZm9yRWFjaCgoY29tcG9uZW50cykgPT4ge1xyXG4gICAgICB0b3RhbCArPSBjb21wb25lbnRzLnNpemU7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0b3RhbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCByZWdpc3RyeSBzdGF0ZSAoZm9yIGRlYnVnZ2luZylcclxuICAgKi9cclxuICBnZXRSZWdpc3RyeVN0YXRlKCk6IHsgYXBwT2JqZWN0SWQ6IHN0cmluZzsgY29tcG9uZW50Q291bnQ6IG51bWJlciB9W10ge1xyXG4gICAgY29uc3Qgc3RhdGU6IHsgYXBwT2JqZWN0SWQ6IHN0cmluZzsgY29tcG9uZW50Q291bnQ6IG51bWJlciB9W10gPSBbXTtcclxuXHJcbiAgICB0aGlzLmNvbXBvbmVudFJlZ2lzdHJ5LmZvckVhY2goKGNvbXBvbmVudHMsIGFwcE9iamVjdElkKSA9PiB7XHJcbiAgICAgIHN0YXRlLnB1c2goe1xyXG4gICAgICAgIGFwcE9iamVjdElkLFxyXG4gICAgICAgIGNvbXBvbmVudENvdW50OiBjb21wb25lbnRzLnNpemUsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHN0YXRlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHBlbmRpbmcgb3BlcmF0aW9ucyBjb3VudCAoZm9yIGRlYnVnZ2luZylcclxuICAgKi9cclxuICBnZXRQZW5kaW5nT3BlcmF0aW9uc0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25UcmFja2VyLmdldFBlbmRpbmdDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgKGZvciBkZWJ1Z2dpbmcpXHJcbiAgICovXHJcbiAgZ2V0UGVuZGluZ09wZXJhdGlvbnMoKTogUGVuZGluZ09wZXJhdGlvbltdIHtcclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvblRyYWNrZXIuZ2V0QWxsUGVuZGluZygpO1xyXG4gIH1cclxufSJdfQ==
package/index.d.ts CHANGED
@@ -37,6 +37,7 @@ export * from './lib/tab-core-utility/app/interfaces/orgInfo.interface';
37
37
  export * from './lib/tab-core-utility/app/interfaces/schema.interface';
38
38
  export * from './lib/tab-core-utility/app/interfaces/grid.interface';
39
39
  export * from './lib/tab-core-utility/app/interfaces/signalr.interface';
40
+ export * from './lib/tab-core-utility/app/interfaces/notification.interface';
40
41
  export * from './lib/tab-core-utility/app/interfaces/release.interface';
41
42
  export * from './lib/tab-core-utility/app/models/api-query.class';
42
43
  export * from './lib/tab-core-utility/app/models/app-field.model';
@@ -71,6 +72,8 @@ export * from './lib/tab-core-utility/core/service/encryption.service';
71
72
  export * from './lib/tab-core-utility/core/service/signalr/signalr.service';
72
73
  export * from './lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service';
73
74
  export * from './lib/tab-core-utility/core/service/signalr/operation-tracker.service';
75
+ export * from './lib/tab-core-utility/core/service/notification/notification-inbox.service';
76
+ export * from './lib/tab-core-utility/core/service/notification/notification-websocket.service';
74
77
  export * from './lib/tab-core-utility/core/pipe/translate.pipe';
75
78
  export * from './lib/tab-core-utility/core/provider/translation.provider';
76
79
  export * from './lib/tab-core-utility/core/provider/notification.provider';
@@ -11,6 +11,8 @@ export declare class Common {
11
11
  static apiServiceUrls: APIServiceUrls;
12
12
  /** SignalR hub URL for real-time notifications */
13
13
  static signalRHubUrl: string;
14
+ /** Notification WebSocket URL for in-app inbox */
15
+ static notificationWebSocketUrl: string;
14
16
  /**
15
17
  * Schema source of truth.
16
18
  * Reading is cheap (returns the backing field).
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Notification types & WebSocket protocol constants.
3
+ * Driven by the TAF Notification Service API doc.
4
+ */
5
+ /**
6
+ * Notification status lifecycle (per BE confirmation):
7
+ *
8
+ * Pending — record just created (not yet visible in inbox)
9
+ * Delivered — successfully sent over WebSocket (visible, shown as unread)
10
+ * Read — after mark_notification_read / mark_all_notification_read
11
+ * Done — after clear_notification / clear_all_notifications (soft delete, filtered out)
12
+ * Failed — WebSocket send failed (filtered out)
13
+ *
14
+ * Inbox `get_notifications_response` only returns `Delivered` + `Read`.
15
+ * `isRead` is derived as `status === 'Read'`.
16
+ */
17
+ export type NotificationStatus = 'Pending' | 'Delivered' | 'Read' | 'Done' | 'Failed';
18
+ export type NotificationPriority = 'Low' | 'Normal' | 'High' | 'Urgent';
19
+ export type WsConnectionState = 'Disconnected' | 'Connecting' | 'Connected' | 'Reconnecting' | 'Failed' | 'Closed';
20
+ export declare const WS_CONNECTION_STATE: {
21
+ readonly DISCONNECTED: "Disconnected";
22
+ readonly CONNECTING: "Connecting";
23
+ readonly CONNECTED: "Connected";
24
+ readonly RECONNECTING: "Reconnecting";
25
+ readonly FAILED: "Failed";
26
+ readonly CLOSED: "Closed";
27
+ };
28
+ export type NotificationActionType = 'Navigate' | 'Dismiss';
29
+ /**
30
+ * WebSocket message types (per BE doc).
31
+ * Outbound: client → server.
32
+ * Inbound: server → client (responses + push events).
33
+ */
34
+ export declare const WS_MESSAGE_TYPE: {
35
+ readonly PING: "ping";
36
+ readonly HEARTBEAT: "heartbeat";
37
+ readonly GET_NOTIFICATIONS: "get_notifications";
38
+ readonly GET_UNREAD_COUNT: "get_unread_count";
39
+ readonly MARK_NOTIFICATION_READ: "mark_notification_read";
40
+ readonly MARK_ALL_NOTIFICATION_READ: "mark_all_notification_read";
41
+ readonly CLEAR_NOTIFICATION: "clear_notification";
42
+ readonly CLEAR_ALL_NOTIFICATIONS: "clear_all_notifications";
43
+ readonly CONNECTION_ESTABLISHED: "connection_established";
44
+ readonly PONG: "pong";
45
+ readonly HEARTBEAT_ACK: "heartbeat_ack";
46
+ readonly GET_NOTIFICATIONS_RESPONSE: "get_notifications_response";
47
+ readonly GET_UNREAD_COUNT_RESPONSE: "get_unread_count_response";
48
+ readonly MARK_NOTIFICATION_READ_RESPONSE: "mark_notification_read_response";
49
+ readonly MARK_ALL_NOTIFICATION_READ_RESPONSE: "mark_all_notification_read_response";
50
+ readonly CLEAR_NOTIFICATION_RESPONSE: "clear_notification_response";
51
+ readonly CLEAR_ALL_NOTIFICATIONS_RESPONSE: "clear_all_notifications_response";
52
+ readonly NOTIFICATION_MARKED_READ: "notification_marked_read";
53
+ readonly NOTIFICATION_CLEARED: "notification_cleared";
54
+ readonly ALL_NOTIFICATIONS_CLEARED: "all_notifications_cleared";
55
+ readonly NOTIFICATION: "notification";
56
+ readonly ERROR: "error";
57
+ };
58
+ export type WsMessageType = typeof WS_MESSAGE_TYPE[keyof typeof WS_MESSAGE_TYPE];
59
+ export declare const NOTIFICATION_WS_CONFIG: {
60
+ readonly DEFAULT_PAGE_SIZE: 20;
61
+ readonly RECONNECT_DELAYS_MS: readonly [2000, 5000, 10000];
62
+ readonly RECONNECT_MAX_DELAY_MS: 10000;
63
+ };
64
+ /**
65
+ * One item in `get_notifications_response.notifications[]` per BE doc.
66
+ */
67
+ export interface NotificationItem {
68
+ id: string;
69
+ status: NotificationStatus;
70
+ data: string;
71
+ priority: NotificationPriority;
72
+ workspaceKey: string;
73
+ provider: string;
74
+ createdAt: string;
75
+ updatedAt: string;
76
+ expiresAt: string | null;
77
+ errorMessage: string | null;
78
+ }
79
+ /**
80
+ * Live-push payload — fields flat at top level (NOT inside `data`).
81
+ */
82
+ export interface NotificationPushPayload {
83
+ id: string;
84
+ title: string;
85
+ body: string;
86
+ category: string;
87
+ priority: NotificationPriority;
88
+ workspaceKey: string;
89
+ createdAt: string;
90
+ }
91
+ /**
92
+ * Action object inside the `data` JSON of an inbox notification.
93
+ */
94
+ export interface NotificationAction {
95
+ label: string;
96
+ url: string;
97
+ type: NotificationActionType;
98
+ }
99
+ /**
100
+ * Parsed contents of an inbox notification's `data` JSON string.
101
+ */
102
+ export interface ParsedNotificationPayload {
103
+ title?: string;
104
+ body?: string;
105
+ category?: string;
106
+ priority?: NotificationPriority;
107
+ actions?: NotificationAction[];
108
+ [key: string]: unknown;
109
+ }
110
+ /**
111
+ * Canonical UI shape after normalization.
112
+ * Both inbox items and live pushes are normalized into this.
113
+ */
114
+ export interface UiNotification {
115
+ id: string;
116
+ createdAt: string;
117
+ status: NotificationStatus;
118
+ priority: NotificationPriority;
119
+ parsedPayload: ParsedNotificationPayload;
120
+ isRead: boolean;
121
+ }
122
+ /**
123
+ * Auth identifiers required to open the WebSocket and address messages.
124
+ * The app supplies these at connect time — the core service does not read storage.
125
+ */
126
+ export interface NotificationConnectParams {
127
+ /** End user — required for the URL. */
128
+ userId: string;
129
+ /** Application — used in URL + workspaceKey. */
130
+ appId: string;
131
+ /** Tenant — used in URL + workspaceKey. */
132
+ tenantId: string;
133
+ /** Environment — used in workspaceKey only. */
134
+ environmentId: string;
135
+ }
136
+ /**
137
+ * Composed once at the app boundary, passed down to the inbox service.
138
+ * Used as the URL query for the WebSocket and in every outbound message body.
139
+ */
140
+ export interface NotificationInboxConnectParams {
141
+ userId: string;
142
+ appId: string;
143
+ tenantId: string;
144
+ /** `tenantId.appId.environmentId` — pre-composed by the SDK facade. */
145
+ workspaceKey: string;
146
+ }
147
+ /**
148
+ * URL-only params for the low-level transport.
149
+ */
150
+ export interface NotificationWebSocketConnectParams {
151
+ userId: string;
152
+ appId: string;
153
+ tenantId: string;
154
+ }
@@ -0,0 +1,80 @@
1
+ import { Observable } from 'rxjs';
2
+ import { NotificationInboxConnectParams, UiNotification } from '../../../app/interfaces/notification.interface';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Public notification inbox service.
6
+ *
7
+ * Pure — no storage / auth coupling. The caller (SDK facade) supplies all auth
8
+ * identifiers via `connect(params)`, and they're held for the lifetime of the
9
+ * connection (cleared on disconnect).
10
+ *
11
+ * Subscribes to the WebSocket transport, routes incoming messages by type into
12
+ * dedicated streams, and exposes high-level actions for the UI.
13
+ *
14
+ * Components/extensions consume this via the SDK facade (`TabSdk.notification.*`),
15
+ * not directly.
16
+ *
17
+ * Named `NotificationInboxService` to avoid collision with the existing toastr
18
+ * `NotificationService` in `core/service/notification.service.ts`.
19
+ */
20
+ export declare class NotificationInboxService {
21
+ private readonly ws;
22
+ private workspaceKey;
23
+ private readonly latestNotifications$;
24
+ private readonly unreadCount$;
25
+ private readonly markAsReadEvent$;
26
+ private readonly clearEvent$;
27
+ private readonly loading$;
28
+ private readonly totalPages$;
29
+ constructor();
30
+ /**
31
+ * Connect to the notification WebSocket. Awaitable, idempotent.
32
+ *
33
+ * If a connection is already active for a *different* workspace (tenant/app/env
34
+ * switch without signOut), we tear it down first so the new connection uses
35
+ * the correct URL and workspaceKey. The underlying `ws.connect` is idempotent
36
+ * by connection state, so it would otherwise keep the stale URL.
37
+ *
38
+ * Once connected, an unread-count fetch is fired automatically so the badge populates.
39
+ */
40
+ connect(params: NotificationInboxConnectParams): Promise<void>;
41
+ /**
42
+ * Tear down the connection. Resets all stream state so the UI clears.
43
+ */
44
+ disconnect(): Promise<void>;
45
+ /**
46
+ * Fetch a page of notifications. Server replies via GET_NOTIFICATIONS_RESPONSE.
47
+ */
48
+ loadMore(pageNumber: number, pageSize?: number): void;
49
+ /**
50
+ * Request unread count. Result arrives on `unreadCount$`.
51
+ */
52
+ requestUnreadCount(): void;
53
+ markAsRead(notificationId: string): void;
54
+ markAllAsRead(): void;
55
+ clearOne(notificationId: string): void;
56
+ clearAll(): void;
57
+ getLatestNotifications(): Observable<UiNotification | UiNotification[]>;
58
+ getUnreadCount(): Observable<number>;
59
+ getMarkAsReadEvents(): Observable<string | null>;
60
+ getClearEvents(): Observable<string[] | null>;
61
+ getLoadingState(): Observable<boolean>;
62
+ getTotalPages(): Observable<number>;
63
+ private handleMessage;
64
+ /**
65
+ * Parse an inbox notification's `data` JSON into a UI-shaped object.
66
+ *
67
+ * Read state is surfaced via `status === 'Read'` (confirmed by BE).
68
+ * Inbox response only contains `Delivered` (unread) + `Read` items;
69
+ * `Pending` / `Done` / `Failed` are filtered out server-side.
70
+ */
71
+ private parseInboxNotification;
72
+ /**
73
+ * Wrap a server-pushed live notification into the same UI shape as inbox items.
74
+ * The push event has fields flat at the top level (NOT inside `data`) — synthesize
75
+ * `parsedPayload` from those fields so the component sees a uniform shape.
76
+ */
77
+ private transformPushNotification;
78
+ static ɵfac: i0.ɵɵFactoryDeclaration<NotificationInboxService, never>;
79
+ static ɵprov: i0.ɵɵInjectableDeclaration<NotificationInboxService>;
80
+ }
@@ -0,0 +1,56 @@
1
+ import { Subject } from 'rxjs';
2
+ import { NotificationWebSocketConnectParams, WsConnectionState } from '../../../app/interfaces/notification.interface';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Low-level Notification WebSocket transport.
6
+ *
7
+ * Pure — no storage / auth coupling. The caller (SDK facade or app layer)
8
+ * supplies all auth identifiers via `connect(params)`.
9
+ *
10
+ * Mirrors the SignalR infrastructure pattern:
11
+ * - connect() is idempotent, dedupes concurrent calls, tears down stale sockets
12
+ * - disconnect() flips an explicit-disconnected flag so retries don't revive
13
+ * - state exposed as Angular signal
14
+ * - inbound messages forwarded on `messages$` for higher-level service to route
15
+ *
16
+ * Internal use — consumers should use `NotificationInboxService` instead.
17
+ */
18
+ export declare class NotificationWebSocketService {
19
+ private socket;
20
+ private socketSub;
21
+ private connectingPromise;
22
+ private explicitlyDisconnected;
23
+ private lastParams;
24
+ private reconnectAttempt;
25
+ private reconnectTimer;
26
+ readonly connectionState: import("@angular/core").WritableSignal<WsConnectionState>;
27
+ readonly messages$: Subject<any>;
28
+ /**
29
+ * Establish the WebSocket connection.
30
+ *
31
+ * Idempotent — if already OPEN, resolves immediately.
32
+ * In-flight calls are de-duplicated.
33
+ * Any stale (non-OPEN) socket is torn down before rebuild.
34
+ */
35
+ connect(params: NotificationWebSocketConnectParams): Promise<void>;
36
+ private doConnect;
37
+ /**
38
+ * Send a message over the socket. Silently no-ops if not connected.
39
+ */
40
+ send(message: Record<string, any>): void;
41
+ /**
42
+ * Tear down the socket.
43
+ *
44
+ * Sets explicitlyDisconnected so any pending retry timers become no-ops,
45
+ * then closes the socket and clears state.
46
+ */
47
+ disconnect(): Promise<void>;
48
+ private handleIncoming;
49
+ private scheduleReconnect;
50
+ /**
51
+ * Snapshot of current connection state — for debugging.
52
+ */
53
+ isConnected(): boolean;
54
+ static ɵfac: i0.ɵɵFactoryDeclaration<NotificationWebSocketService, never>;
55
+ static ɵprov: i0.ɵɵInjectableDeclaration<NotificationWebSocketService>;
56
+ }
@@ -9,13 +9,15 @@ import * as i0 from "@angular/core";
9
9
  export declare class OperationTrackerService {
10
10
  private pendingOperations;
11
11
  private operationCompleted$;
12
+ private cancellation$;
12
13
  /**
13
14
  * Register an async operation for tracking
14
15
  */
15
16
  registerOperation(operation: PendingOperation): void;
16
17
  /**
17
18
  * Wait for operation to complete via SignalR notification
18
- * Returns Observable that emits when notification with matching correlationId is received
19
+ * Returns Observable that emits when notification with matching correlationId is received,
20
+ * or errors if cancelAll() is invoked (e.g. on disconnect / signOut).
19
21
  */
20
22
  waitForOperation(correlationId: string, timeoutMs?: number): Observable<CrudNotification>;
21
23
  /**
@@ -23,6 +25,12 @@ export declare class OperationTrackerService {
23
25
  * Called by SignalRService when notification is received
24
26
  */
25
27
  handleNotification(notification: CrudNotification): void;
28
+ /**
29
+ * Cancel all pending operations — errors all open waitForOperation() observers.
30
+ * Called by SignalRService.disconnect() so in-flight CRUD UIs resolve fast
31
+ * instead of stranding until the 120s timeout.
32
+ */
33
+ cancelAll(reason: string): void;
26
34
  /**
27
35
  * Check if operation is pending
28
36
  */
@@ -10,6 +10,8 @@ import * as i0 from "@angular/core";
10
10
  */
11
11
  export declare class SignalRInfrastructure {
12
12
  private hubConnection;
13
+ private connectingPromise;
14
+ private explicitlyDisconnected;
13
15
  readonly sessionStorageService: SessionStorageService;
14
16
  readonly localStorageService: LocalStorageService;
15
17
  readonly connectionState: import("@angular/core").WritableSignal<ConnectionState>;
@@ -28,8 +30,14 @@ export declare class SignalRInfrastructure {
28
30
  get token(): string | null;
29
31
  /**
30
32
  * Connect to SignalR hub
33
+ *
34
+ * Idempotent and safe to call from multiple sites:
35
+ * - already CONNECTED → returns immediately
36
+ * - already CONNECTING → returns the in-flight promise
37
+ * - any non-Connected leftover hubConnection → torn down before rebuild
31
38
  */
32
39
  connect(): Promise<void>;
40
+ private doConnect;
33
41
  /**
34
42
  * Register SignalR event handlers for CRUD notifications
35
43
  */
@@ -62,6 +70,9 @@ export declare class SignalRInfrastructure {
62
70
  isConnected(): boolean;
63
71
  /**
64
72
  * Disconnect from SignalR hub (cleanup)
73
+ *
74
+ * Sets explicitlyDisconnected so any pending retry timers from connect()/onclose
75
+ * become no-ops, then stops the hub and clears tracked groups.
65
76
  */
66
77
  disconnect(): Promise<void>;
67
78
  /**
@@ -44,12 +44,24 @@ export declare class SignalRService {
44
44
  readonly isConnected: import("@angular/core").Signal<boolean>;
45
45
  constructor();
46
46
  /**
47
- * Establish a connection to the SignalR hub
47
+ * Establish a connection to the SignalR hub.
48
+ *
49
+ * Awaitable — the returned promise resolves when the first connection attempt
50
+ * settles (success or failure). Idempotent: repeated calls are de-duplicated;
51
+ * if already CONNECTED, resolves immediately.
48
52
  *
49
- * This method is idempotent - if the connection is already established, it will not be re-established.
50
53
  * Hub URL is read from Common.signalRHubUrl (set during app initialization via Common.init())
51
54
  */
52
- connect(): void;
55
+ connect(): Promise<void>;
56
+ /**
57
+ * Tear down the connection (call from auth signOut or cross-tab logout).
58
+ *
59
+ * - Stops the hub and clears tracked groups
60
+ * - Drops all component registrations (stale once the socket dies)
61
+ * - Errors any in-flight waitForOperation() observers so the UI doesn't
62
+ * strand until the 120s timeout
63
+ */
64
+ disconnect(): Promise<void>;
53
65
  /**
54
66
  * Register component for real-time notifications
55
67
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@techextensor/tab-core-utility",
3
- "version": "2.2.199",
3
+ "version": "2.2.200",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.15",
6
6
  "@angular/core": "^19.2.15",