@techextensor/tab-core-utility 2.2.190 → 2.2.191

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.
Files changed (73) hide show
  1. package/esm2022/index.mjs +1 -5
  2. package/esm2022/lib/tab-core-utility/app/constants/api-constants.mjs +15 -31
  3. package/esm2022/lib/tab-core-utility/app/constants/common.mjs +50 -14
  4. package/esm2022/lib/tab-core-utility/app/constants/storage-constants.mjs +2 -2
  5. package/esm2022/lib/tab-core-utility/app/crud/tab-crud.service.mjs +54 -41
  6. package/esm2022/lib/tab-core-utility/app/crud/tab-delete.service.mjs +30 -84
  7. package/esm2022/lib/tab-core-utility/app/crud/tab-formio.service.mjs +12 -141
  8. package/esm2022/lib/tab-core-utility/app/crud/tab-get.service.mjs +35 -136
  9. package/esm2022/lib/tab-core-utility/app/crud/tab-insert.service.mjs +38 -89
  10. package/esm2022/lib/tab-core-utility/app/crud/tab-update.service.mjs +129 -159
  11. package/esm2022/lib/tab-core-utility/app/enums/query.enum.mjs +7 -7
  12. package/esm2022/lib/tab-core-utility/app/helpers/common/app.helpers.mjs +19 -26
  13. package/esm2022/lib/tab-core-utility/app/helpers/common/dsq.helpers.mjs +11 -9
  14. package/esm2022/lib/tab-core-utility/app/helpers/common/meta-data.helpers.mjs +13 -13
  15. package/esm2022/lib/tab-core-utility/app/helpers/common/req-res.helpers.mjs +45 -7
  16. package/esm2022/lib/tab-core-utility/app/helpers/common/where-clause.helpers.mjs +76 -79
  17. package/esm2022/lib/tab-core-utility/app/helpers/screen/grid.helpers.mjs +4 -8
  18. package/esm2022/lib/tab-core-utility/app/helpers/screen/screen.helpers.mjs +33 -8
  19. package/esm2022/lib/tab-core-utility/app/interfaces/common.interface.mjs +1 -1
  20. package/esm2022/lib/tab-core-utility/app/models/api-query.class.mjs +1 -39
  21. package/esm2022/lib/tab-core-utility/app/models/app-field.model.mjs +7 -36
  22. package/esm2022/lib/tab-core-utility/app/models/app-object.model.mjs +47 -84
  23. package/esm2022/lib/tab-core-utility/app/models/app-screen.model.mjs +13 -24
  24. package/esm2022/lib/tab-core-utility/app/models/data-source-query.model.mjs +23 -57
  25. package/esm2022/lib/tab-core-utility/app/models/filter.model.mjs +10 -21
  26. package/esm2022/lib/tab-core-utility/app/models/parameter.model.mjs +6 -12
  27. package/esm2022/lib/tab-core-utility/app/models/sort.model.mjs +4 -11
  28. package/esm2022/lib/tab-core-utility/app/utils/json.util.mjs +16 -17
  29. package/esm2022/lib/tab-core-utility/app/utils/req-res.util.mjs +55 -1
  30. package/esm2022/lib/tab-core-utility/app/utils/tab-app.util.mjs +164 -1
  31. package/esm2022/lib/tab-core-utility/core/http-client/api.service.mjs +1 -78
  32. package/index.d.ts +0 -4
  33. package/lib/tab-core-utility/app/constants/api-constants.d.ts +12 -19
  34. package/lib/tab-core-utility/app/constants/common.d.ts +0 -9
  35. package/lib/tab-core-utility/app/constants/storage-constants.d.ts +1 -1
  36. package/lib/tab-core-utility/app/crud/tab-crud.service.d.ts +1 -8
  37. package/lib/tab-core-utility/app/crud/tab-delete.service.d.ts +10 -20
  38. package/lib/tab-core-utility/app/crud/tab-formio.service.d.ts +6 -33
  39. package/lib/tab-core-utility/app/crud/tab-get.service.d.ts +3 -45
  40. package/lib/tab-core-utility/app/crud/tab-insert.service.d.ts +21 -16
  41. package/lib/tab-core-utility/app/crud/tab-update.service.d.ts +19 -34
  42. package/lib/tab-core-utility/app/enums/query.enum.d.ts +6 -3
  43. package/lib/tab-core-utility/app/helpers/common/app.helpers.d.ts +8 -5
  44. package/lib/tab-core-utility/app/helpers/common/dsq.helpers.d.ts +0 -3
  45. package/lib/tab-core-utility/app/helpers/common/meta-data.helpers.d.ts +3 -3
  46. package/lib/tab-core-utility/app/helpers/common/req-res.helpers.d.ts +51 -7
  47. package/lib/tab-core-utility/app/helpers/common/where-clause.helpers.d.ts +0 -1
  48. package/lib/tab-core-utility/app/helpers/screen/grid.helpers.d.ts +1 -2
  49. package/lib/tab-core-utility/app/helpers/screen/screen.helpers.d.ts +0 -1
  50. package/lib/tab-core-utility/app/interfaces/common.interface.d.ts +2 -51
  51. package/lib/tab-core-utility/app/models/api-query.class.d.ts +9 -54
  52. package/lib/tab-core-utility/app/models/app-field.model.d.ts +2 -4
  53. package/lib/tab-core-utility/app/models/app-object.model.d.ts +3 -5
  54. package/lib/tab-core-utility/app/models/app-screen.model.d.ts +2 -2
  55. package/lib/tab-core-utility/app/models/data-source-query.model.d.ts +2 -7
  56. package/lib/tab-core-utility/app/models/filter.model.d.ts +2 -2
  57. package/lib/tab-core-utility/app/models/parameter.model.d.ts +2 -2
  58. package/lib/tab-core-utility/app/models/sort.model.d.ts +1 -1
  59. package/lib/tab-core-utility/app/utils/json.util.d.ts +2 -3
  60. package/lib/tab-core-utility/app/utils/req-res.util.d.ts +9 -1
  61. package/lib/tab-core-utility/app/utils/tab-app.util.d.ts +61 -0
  62. package/lib/tab-core-utility/core/http-client/api.service.d.ts +0 -46
  63. package/package.json +2 -3
  64. package/esm2022/lib/tab-core-utility/app/helpers/response.adapter.mjs +0 -38
  65. package/esm2022/lib/tab-core-utility/app/interfaces/signalr.interface.mjs +0 -42
  66. package/esm2022/lib/tab-core-utility/core/service/signalr/operation-tracker.service.mjs +0 -90
  67. package/esm2022/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.mjs +0 -268
  68. package/esm2022/lib/tab-core-utility/core/service/signalr/signalr.service.mjs +0 -207
  69. package/lib/tab-core-utility/app/helpers/response.adapter.d.ts +0 -22
  70. package/lib/tab-core-utility/app/interfaces/signalr.interface.d.ts +0 -84
  71. package/lib/tab-core-utility/core/service/signalr/operation-tracker.service.d.ts +0 -40
  72. package/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.d.ts +0 -73
  73. package/lib/tab-core-utility/core/service/signalr/signalr.service.d.ts +0 -122
@@ -18,12 +18,9 @@ export declare class DataSourceQueryModel {
18
18
  private cachedParameters;
19
19
  private cachedFilters;
20
20
  private cachedSorts;
21
- private parsedConfiguration;
22
21
  constructor(raw: any, parentAppObject: AppObjectModel, metadataHelper: MetadataHelper);
23
- private parseConfiguration;
24
22
  /**
25
23
  * Gets the fields for the data source query. The fields are enriched with the corresponding `AppFieldModel` objects.
26
- * Handles both old format (array of objects) and new format (array of field ID strings).
27
24
  * @returns {DataSourceQueries_Fields[]} The array of enriched fields.
28
25
  */
29
26
  fields(): DataSourceQueries_Fields[];
@@ -67,10 +64,8 @@ export declare class DataSourceQueryModel {
67
64
  */
68
65
  search(term: string): boolean;
69
66
  /**
70
- * Converts the DataSourceQueryModel instance to JSON in the old API format (PascalCase).
71
- * This ensures backward compatibility with code expecting the old format.
72
- *
73
- * @returns {any} The data in old API format.
67
+ * Converts the DataSourceQueryModel instance to a JSON representation.
68
+ * @returns {any} The raw data in JSON format.
74
69
  */
75
70
  toJSON(): any;
76
71
  }
@@ -13,9 +13,9 @@ export declare class FilterModel {
13
13
  readonly FieldID: string;
14
14
  constructor(raw: any);
15
15
  /**
16
- * Converts the model to JSON in the old API format (PascalCase).
16
+ * Converts the current object to a JSON object.
17
17
  *
18
- * @returns A JSON representation in old format.
18
+ * @returns A JSON representation of the current object.
19
19
  */
20
20
  toJSON(): any;
21
21
  }
@@ -7,8 +7,8 @@ export declare class ParameterModel {
7
7
  readonly IsMandatory: boolean;
8
8
  constructor(raw: any);
9
9
  /**
10
- * Converts the model to JSON in the old API format (PascalCase).
11
- * @returns {any} The model as a JSON object in old format.
10
+ * Converts the model to JSON.
11
+ * @returns {any} The model as a JSON object.
12
12
  */
13
13
  toJSON(): any;
14
14
  }
@@ -9,7 +9,7 @@ export declare class SortModel {
9
9
  readonly AppFieldID: string;
10
10
  constructor(raw: any);
11
11
  /**
12
- * Converts the model to JSON in the old API format (PascalCase).
12
+ * Get raw data for this app object
13
13
  */
14
14
  toJSON(): any;
15
15
  }
@@ -5,10 +5,9 @@
5
5
  */
6
6
  export declare function validateJSON(str: string): boolean;
7
7
  /**
8
- * Creates dynamic data based on the input object for new API format
9
- * Transforms object into array of {fieldName, value} pairs
8
+ * Creates dynamic data based on the input object
10
9
  * @param obj The input object to create dynamic data from
11
- * @returns The formatted array with {fieldName, value} pairs
10
+ * @returns The formatted array
12
11
  */
13
12
  export declare function createDynamicData(obj: any): any;
14
13
  /**
@@ -1,5 +1,6 @@
1
1
  import { HttpHeaders } from '@angular/common/http';
2
2
  import { AppObject } from '../models/app-object.class';
3
+ import { AppFields } from '../models/data-source-queries.class';
3
4
  /**
4
5
  * Delete a key from the response object
5
6
  *
@@ -36,7 +37,7 @@ export declare function getHeaders(headers?: any): any;
36
37
  * @param appObject - The AppObject
37
38
  * @returns AppFields[] | null - The array of primary key fields or null
38
39
  */
39
- export declare function getPrimaryKeyFields(appObject: AppObject): import("@techextensor/tab-core-utility").AppFields[] | null;
40
+ export declare function getPrimaryKeyFields(appObject: AppObject): AppFields[] | null;
40
41
  /**
41
42
  * Get the edit record ID from the response object
42
43
  *
@@ -45,6 +46,13 @@ export declare function getPrimaryKeyFields(appObject: AppObject): import("@tech
45
46
  * @returns any - The edit record ID
46
47
  */
47
48
  export declare function getEditRecordId(response: any, fieldName: any): any;
49
+ /**
50
+ * Generate the fields schema based on the AppFields
51
+ *
52
+ * @param fields - The AppFields object
53
+ * @returns any - The generated fields schema
54
+ */
55
+ export declare function generateFieldsSchema(url: any, fields: AppFields): {};
48
56
  /**
49
57
  * Get the HttpHeaders for form data requests
50
58
  *
@@ -1,4 +1,36 @@
1
1
  import { AppObject } from '../models/app-object.class';
2
+ /** Get the DataSourceQuery ID from the selected AppObject's DataSourceQuery array
3
+ * @param dsqList - The list of DataSourceQueries
4
+ * @param table - The table name
5
+ * @param like - The like string
6
+ * @returns string - The ID of the DataSourceQuery
7
+ */
8
+ export declare function getDsqIdfromSelectedAppObjectDSQArray(dsqList: any, table: string, like: string): any;
9
+ /** Get the AppObject based on the provided ID
10
+ * @param id - The ID of the AppObject
11
+ * @returns AppObject | null - The found AppObject or null
12
+ */
13
+ export declare function getAppObject(id: string): any;
14
+ /**
15
+ * Get the AppObject from the DataSourceQuery ID
16
+ * @param dsqId - The DataSourceQuery ID
17
+ * @returns AppObject | null - The found AppObject or null
18
+ */
19
+ export declare function getAppObjectFromDataSourceQueryID(dsqId: string): any;
20
+ /**
21
+ * Get the DataSourceQuery ID from the QueryName and table
22
+ * @param table - The table name
23
+ * @param dsq - The DataSourceQuery name
24
+ * @returns any - The found DataSourceQuery
25
+ */
26
+ export declare function getDsqIDFromQueryName(table: string, dsq: string): any;
27
+ /**
28
+ * Get the Data from the DataSourceQuery ID
29
+ *
30
+ * @param dsqId - The DataSourceQuery ID
31
+ * @returns any - The found Data
32
+ */
33
+ export declare function getDataFromDataSourceQueryID(dsqId: string): any;
2
34
  /**
3
35
  * Synchronize AppObject fields with the response
4
36
  *
@@ -7,3 +39,32 @@ import { AppObject } from '../models/app-object.class';
7
39
  * @returns any - The synchronized response object
8
40
  */
9
41
  export declare function syncAppObjectFields(response: any, appObject: AppObject): any;
42
+ /**
43
+ * Get the AppObject based on the SystemDBTableName
44
+ *
45
+ * @param tableName - The SystemDBTableName
46
+ * @returns AppObject | null - The found AppObject or null
47
+ */
48
+ export declare function getAppObjectFromSystemDBTableName(tableName: string): any;
49
+ /**
50
+ * Get the fields based on the appobjectid
51
+ *
52
+ * @param appObjectId - The appobjectid
53
+ * @returns AppObject | null - The found AppObject or null
54
+ */
55
+ export declare function getAppfieldsFromAppObjectId(appObjectId: string): any;
56
+ export declare function getLookupAppfieldsFromAppObjectId(appObjectId: string): any;
57
+ export declare function getViewAppObjectDetailsFromDSQID(dsqID: string): any;
58
+ /**
59
+ * Retrieves all appObjects and their DSQs in a single list
60
+ * suitable for tree view representation.
61
+ * @author : Parth B Thakkar
62
+ * @Usage : HTTP Request
63
+ * @returns Array<{ id: string; name: string; hasChildren: boolean; parentID: string | null }>
64
+ */
65
+ export declare function getAllAppObjectsForTreeViewJson(): {
66
+ id: string;
67
+ name: string;
68
+ hasChildren: boolean;
69
+ parentID: string | null;
70
+ }[];
@@ -1,6 +1,5 @@
1
1
  import { HttpParams, HttpHeaders } from '@angular/common/http';
2
2
  import { Observable } from 'rxjs';
3
- import { APIServiceName, CommonApiResponse } from '../../app/interfaces/common.interface';
4
3
  import * as i0 from "@angular/core";
5
4
  export declare class ApiService {
6
5
  private readonly http;
@@ -82,51 +81,6 @@ export declare class ApiService {
82
81
  * @returns An Observable emitting the response data of type T.
83
82
  */
84
83
  deleteByUrl<T>(url: string, options?: any): Observable<any>;
85
- /**
86
- * Makes an HTTP GET request to a specific microservice
87
- * @param serviceName - Name of the microservice (e.g., 'crudService', 'metadataService')
88
- * @param endPointName - Endpoint path relative to the service
89
- * @param params - Query parameters for the request
90
- * @param reqHeader - Custom headers for the request
91
- * @returns An Observable emitting the response data (auto-normalized to CommonApiResponse format)
92
- */
93
- getFromService(serviceName: APIServiceName, endPointName: string, params?: HttpParams, reqHeader?: HttpHeaders): Observable<CommonApiResponse>;
94
- /**
95
- * Makes an HTTP POST request to a specific microservice
96
- * @param serviceName - Name of the microservice (e.g., 'crudService', 'formioService')
97
- * @param endPointName - Endpoint path relative to the service
98
- * @param data - Data to send with the request
99
- * @param reqHeader - Custom headers for the request
100
- * @returns An Observable emitting the response data (auto-normalized to CommonApiResponse format)
101
- */
102
- postToService<T, D>(serviceName: APIServiceName, endPointName: string, data?: D, reqHeader?: HttpHeaders): Observable<CommonApiResponse>;
103
- /**
104
- * Makes an HTTP PUT request to a specific microservice
105
- * @param serviceName - Name of the microservice
106
- * @param endPointName - Endpoint path relative to the service
107
- * @param data - Data to send with the request
108
- * @param reqHeader - Custom headers for the request
109
- * @returns An Observable emitting the response data (auto-normalized to CommonApiResponse format)
110
- */
111
- putToService<T, D>(serviceName: APIServiceName, endPointName: string, data: D, reqHeader?: HttpHeaders): Observable<CommonApiResponse>;
112
- /**
113
- * Makes an HTTP DELETE request to a specific microservice
114
- * @param serviceName - Name of the microservice
115
- * @param endPointName - Endpoint path relative to the service
116
- * @param data - Data to send with the request (optional, for DELETE with body)
117
- * @param reqHeader - Custom headers for the request
118
- * @returns An Observable emitting the response data (auto-normalized to CommonApiResponse format)
119
- */
120
- deleteFromService<D>(serviceName: APIServiceName, endPointName: string, data?: D, reqHeader?: HttpHeaders): Observable<CommonApiResponse>;
121
- /**
122
- * Makes an HTTP POST request to a specific microservice and returns a Blob response
123
- * @param serviceName - Name of the microservice (e.g., 'reportService')
124
- * @param endPointName - Endpoint path relative to the service
125
- * @param data - Data to send with the request
126
- * @param reqHeader - Custom headers for the request
127
- * @returns An Observable emitting the response as a Blob
128
- */
129
- postBlobToService<D>(serviceName: APIServiceName, endPointName: string, data?: D, reqHeader?: HttpHeaders): Observable<Blob>;
130
84
  static ɵfac: i0.ɵɵFactoryDeclaration<ApiService, never>;
131
85
  static ɵprov: i0.ɵɵInjectableDeclaration<ApiService>;
132
86
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@techextensor/tab-core-utility",
3
- "version": "2.2.190",
3
+ "version": "2.2.191",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.15",
6
6
  "@angular/core": "^19.2.15",
@@ -11,8 +11,7 @@
11
11
  "idb": "^8.0.2",
12
12
  "liquidjs": "^10.20.3",
13
13
  "cypress": "^13.17.0",
14
- "crypto-js": "^4.2.0",
15
- "@microsoft/signalr": "^10.0.0"
14
+ "crypto-js": "^4.2.0"
16
15
  },
17
16
  "dependencies": {
18
17
  "tslib": "^2.8.1"
@@ -1,38 +0,0 @@
1
- /**
2
- * ResponseAdapter - Transforms new API response format to legacy format
3
- *
4
- * This adapter maintains backward compatibility by converting the new camelCase
5
- * response format from the backend to the old PascalCase format expected by
6
- * existing application code.
7
- *
8
- * @example
9
- * // Auto-detect and normalize response
10
- * return this.apiService.postToService(...).pipe(
11
- * map(response => ResponseAdapter.normalize(response))
12
- * );
13
- */
14
- export class ResponseAdapter {
15
- /**
16
- * Normalizes a StandardApiResponse to CommonApiResponse format.
17
- * @param newResponse The response object in the new API format.
18
- * @returns The normalized response in the legacy format.
19
- */
20
- static normalize(newResponse) {
21
- return {
22
- IsSuccess: newResponse?.isSuccess || false,
23
- Result: newResponse?.result || null,
24
- RecordAffectted: newResponse?.affectedRecords ?? 0,
25
- TotalRecords: newResponse?.totalRecords ?? 0,
26
- TotalExecutionTime: newResponse?.executionTimeMs ?? 0,
27
- Log: newResponse?.logs ?? [],
28
- Errors: newResponse?.error
29
- ? [
30
- newResponse.error?.message,
31
- ...(newResponse.error?.details ? [newResponse.error?.details] : [])
32
- ]
33
- : [],
34
- CorrelationId: newResponse?.correlationId // Preserve correlationId for async operations
35
- };
36
- }
37
- }
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZGF0YS1hY2Nlc3Mvc3JjL2xpYi90YWItY29yZS11dGlsaXR5L2FwcC9oZWxwZXJzL3Jlc3BvbnNlLmFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0E7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFFMUI7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBZ0M7UUFDL0MsT0FBTztZQUNMLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxJQUFJLEtBQUs7WUFDMUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLElBQUksSUFBSTtZQUNuQyxlQUFlLEVBQUUsV0FBVyxFQUFFLGVBQWUsSUFBSSxDQUFDO1lBQ2xELFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxJQUFJLENBQUM7WUFDNUMsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLGVBQWUsSUFBSSxDQUFDO1lBQ3JELEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDNUIsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLO2dCQUN4QixDQUFDLENBQUM7b0JBQ0UsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPO29CQUMxQixHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNwRTtnQkFDSCxDQUFDLENBQUMsRUFBRTtZQUNOLGFBQWEsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFFLDhDQUE4QztTQUMxRixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xyXG5pbXBvcnQgeyBDb21tb25BcGlSZXNwb25zZSwgU3RhbmRhcmRBcGlSZXNwb25zZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29tbW9uLmludGVyZmFjZSc7XHJcblxyXG4vKipcclxuICogUmVzcG9uc2VBZGFwdGVyIC0gVHJhbnNmb3JtcyBuZXcgQVBJIHJlc3BvbnNlIGZvcm1hdCB0byBsZWdhY3kgZm9ybWF0XHJcbiAqXHJcbiAqIFRoaXMgYWRhcHRlciBtYWludGFpbnMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBieSBjb252ZXJ0aW5nIHRoZSBuZXcgY2FtZWxDYXNlXHJcbiAqIHJlc3BvbnNlIGZvcm1hdCBmcm9tIHRoZSBiYWNrZW5kIHRvIHRoZSBvbGQgUGFzY2FsQ2FzZSBmb3JtYXQgZXhwZWN0ZWQgYnlcclxuICogZXhpc3RpbmcgYXBwbGljYXRpb24gY29kZS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogLy8gQXV0by1kZXRlY3QgYW5kIG5vcm1hbGl6ZSByZXNwb25zZVxyXG4gKiByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3RUb1NlcnZpY2UoLi4uKS5waXBlKFxyXG4gKiAgIG1hcChyZXNwb25zZSA9PiBSZXNwb25zZUFkYXB0ZXIubm9ybWFsaXplKHJlc3BvbnNlKSlcclxuICogKTtcclxuICovXHJcbmV4cG9ydCBjbGFzcyBSZXNwb25zZUFkYXB0ZXIge1xyXG5cclxuICAvKipcclxuICAgKiBOb3JtYWxpemVzIGEgU3RhbmRhcmRBcGlSZXNwb25zZSB0byBDb21tb25BcGlSZXNwb25zZSBmb3JtYXQuXHJcbiAgICogQHBhcmFtIG5ld1Jlc3BvbnNlIFRoZSByZXNwb25zZSBvYmplY3QgaW4gdGhlIG5ldyBBUEkgZm9ybWF0LlxyXG4gICAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIHJlc3BvbnNlIGluIHRoZSBsZWdhY3kgZm9ybWF0LlxyXG4gICAqL1xyXG4gIHN0YXRpYyBub3JtYWxpemUobmV3UmVzcG9uc2U6IFN0YW5kYXJkQXBpUmVzcG9uc2UpOiBDb21tb25BcGlSZXNwb25zZSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBJc1N1Y2Nlc3M6IG5ld1Jlc3BvbnNlPy5pc1N1Y2Nlc3MgfHwgZmFsc2UsXHJcbiAgICAgIFJlc3VsdDogbmV3UmVzcG9uc2U/LnJlc3VsdCB8fCBudWxsLFxyXG4gICAgICBSZWNvcmRBZmZlY3R0ZWQ6IG5ld1Jlc3BvbnNlPy5hZmZlY3RlZFJlY29yZHMgPz8gMCxcclxuICAgICAgVG90YWxSZWNvcmRzOiBuZXdSZXNwb25zZT8udG90YWxSZWNvcmRzID8/IDAsXHJcbiAgICAgIFRvdGFsRXhlY3V0aW9uVGltZTogbmV3UmVzcG9uc2U/LmV4ZWN1dGlvblRpbWVNcyA/PyAwLFxyXG4gICAgICBMb2c6IG5ld1Jlc3BvbnNlPy5sb2dzID8/IFtdLFxyXG4gICAgICBFcnJvcnM6IG5ld1Jlc3BvbnNlPy5lcnJvclxyXG4gICAgICAgID8gW1xyXG4gICAgICAgICAgICBuZXdSZXNwb25zZS5lcnJvcj8ubWVzc2FnZSxcclxuICAgICAgICAgICAgLi4uKG5ld1Jlc3BvbnNlLmVycm9yPy5kZXRhaWxzID8gW25ld1Jlc3BvbnNlLmVycm9yPy5kZXRhaWxzXSA6IFtdKVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIDogW10sXHJcbiAgICAgIENvcnJlbGF0aW9uSWQ6IG5ld1Jlc3BvbnNlPy5jb3JyZWxhdGlvbklkICAvLyBQcmVzZXJ2ZSBjb3JyZWxhdGlvbklkIGZvciBhc3luYyBvcGVyYXRpb25zXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,42 +0,0 @@
1
- // ============= CONSTANTS =============
2
- /**
3
- * SignalR hub method names
4
- */
5
- export const SIGNALR_HUB_METHODS = {
6
- JOIN_GROUP: 'JoinGroupAsync',
7
- LEAVE_GROUP: 'LeaveGroupAsync',
8
- };
9
- /**
10
- * SignalR event names from backend
11
- */
12
- export const SIGNALR_EVENTS = {
13
- INSERT_COMPLETED: 'InsertOperationCompleted',
14
- UPDATE_COMPLETED: 'UpdateOperationCompleted',
15
- DELETE_COMPLETED: 'DeleteOperationCompleted',
16
- };
17
- /**
18
- * CRUD operation types
19
- */
20
- export const CRUD_OPERATION = {
21
- INSERT: 'INSERT',
22
- UPDATE: 'UPDATE',
23
- DELETE: 'DELETE',
24
- };
25
- /**
26
- * SignalR connection states
27
- */
28
- export const CONNECTION_STATE = {
29
- DISCONNECTED: 'Disconnected',
30
- CONNECTING: 'Connecting',
31
- CONNECTED: 'Connected',
32
- RECONNECTING: 'Reconnecting',
33
- FAILED: 'Failed',
34
- };
35
- /**
36
- * SignalR configuration constants
37
- */
38
- export const SIGNALR_CONFIG = {
39
- DEFAULT_TIMEOUT: 120000, // 2 minutes
40
- RECONNECT_DELAYS: [0, 2000, 10000, 30000, 60000], // Exponential backoff
41
- };
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2RhdGEtYWNjZXNzL3NyYy9saWIvdGFiLWNvcmUtdXRpbGl0eS9hcHAvaW50ZXJmYWNlcy9zaWduYWxyLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFxREEsd0NBQXdDO0FBRXhDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsVUFBVSxFQUFFLGdCQUFnQjtJQUM1QixXQUFXLEVBQUUsaUJBQWlCO0NBQ3RCLENBQUM7QUFFWDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRztJQUM1QixnQkFBZ0IsRUFBRSwwQkFBMEI7SUFDNUMsZ0JBQWdCLEVBQUUsMEJBQTBCO0lBQzVDLGdCQUFnQixFQUFFLDBCQUEwQjtDQUNwQyxDQUFDO0FBRVg7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsTUFBTSxFQUFFLFFBQVE7Q0FDUixDQUFDO0FBRVg7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixZQUFZLEVBQUUsY0FBYztJQUM1QixVQUFVLEVBQUUsWUFBWTtJQUN4QixTQUFTLEVBQUUsV0FBVztJQUN0QixZQUFZLEVBQUUsY0FBYztJQUM1QixNQUFNLEVBQUUsUUFBUTtDQUNSLENBQUM7QUFFWDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRztJQUM1QixlQUFlLEVBQUUsTUFBTSxFQUFFLFlBQVk7SUFDckMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsc0JBQXNCO0NBQ2hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogUmF3IFNpZ25hbFIgbWVzc2FnZSB3cmFwcGVyXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFJNZXNzYWdlIHtcclxuICB0eXBlOiBudW1iZXI7XHJcbiAgdGFyZ2V0OiBzdHJpbmc7XHJcbiAgYXJndW1lbnRzOiBDcnVkTm90aWZpY2F0aW9uW107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDUlVEIG5vdGlmaWNhdGlvbiBwYXlsb2FkIHJlY2VpdmVkIGZyb20gU2lnbmFsUiBodWJcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ3J1ZE5vdGlmaWNhdGlvbiB7XHJcbiAgLy8gQmFja2VuZCBmaWVsZHNcclxuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XHJcbiAgcmVzdWx0OiBhbnk7XHJcbiAgZW50aXR5TmFtZTogc3RyaW5nO1xyXG4gIGFwcE9iamVjdElkOiBzdHJpbmc7XHJcbiAgaXNTdWNjZXNzOiBib29sZWFuO1xyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcclxuICBlcnJvckNvZGU6IHN0cmluZyB8IG51bGw7XHJcbiAgZXhlY3V0aW9uVGltZU1zOiBudW1iZXI7XHJcbiAgYWZmZWN0ZWRSZWNvcmRzOiBudW1iZXIgfCBudWxsO1xyXG5cclxuICAvLyBGcm9udGVuZCBhZGRpdGlvbnNcclxuICBvcGVyYXRpb24/OiBDcnVkT3BlcmF0aW9uO1xyXG4gIHJlY2VpdmVkQXQ/OiBEYXRlO1xyXG59XHJcblxyXG4vKipcclxuICogUGVuZGluZyBhc3luYyBvcGVyYXRpb24gdHJhY2tlZCBieSBPcGVyYXRpb25UcmFja2VyU2VydmljZVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nT3BlcmF0aW9uIHtcclxuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XHJcbiAgdGltZXN0YW1wOiBEYXRlO1xyXG4gIHRpbWVvdXQ6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENhbGxiYWNrIGZ1bmN0aW9uIHR5cGUgZm9yIGNvbXBvbmVudCBub3RpZmljYXRpb25zXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBOb3RpZmljYXRpb25DYWxsYmFjayA9IChub3RpZmljYXRpb246IENydWROb3RpZmljYXRpb24pID0+IHZvaWQ7XHJcblxyXG4vKipcclxuICogQ1JVRCBvcGVyYXRpb24gdHlwZXNcclxuICovXHJcbmV4cG9ydCB0eXBlIENydWRPcGVyYXRpb24gPSB0eXBlb2YgQ1JVRF9PUEVSQVRJT05ba2V5b2YgdHlwZW9mIENSVURfT1BFUkFUSU9OXTtcclxuXHJcbi8qKlxyXG4gKiBTaWduYWxSIGNvbm5lY3Rpb24gc3RhdGUgdHlwZXNcclxuICovXHJcbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25TdGF0ZSA9IHR5cGVvZiBDT05ORUNUSU9OX1NUQVRFW2tleW9mIHR5cGVvZiBDT05ORUNUSU9OX1NUQVRFXTtcclxuXHJcbi8vID09PT09PT09PT09PT0gQ09OU1RBTlRTID09PT09PT09PT09PT1cclxuXHJcbi8qKlxyXG4gKiBTaWduYWxSIGh1YiBtZXRob2QgbmFtZXNcclxuICovXHJcbmV4cG9ydCBjb25zdCBTSUdOQUxSX0hVQl9NRVRIT0RTID0ge1xyXG4gIEpPSU5fR1JPVVA6ICdKb2luR3JvdXBBc3luYycsXHJcbiAgTEVBVkVfR1JPVVA6ICdMZWF2ZUdyb3VwQXN5bmMnLFxyXG59IGFzIGNvbnN0O1xyXG5cclxuLyoqXHJcbiAqIFNpZ25hbFIgZXZlbnQgbmFtZXMgZnJvbSBiYWNrZW5kXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU0lHTkFMUl9FVkVOVFMgPSB7XHJcbiAgSU5TRVJUX0NPTVBMRVRFRDogJ0luc2VydE9wZXJhdGlvbkNvbXBsZXRlZCcsXHJcbiAgVVBEQVRFX0NPTVBMRVRFRDogJ1VwZGF0ZU9wZXJhdGlvbkNvbXBsZXRlZCcsXHJcbiAgREVMRVRFX0NPTVBMRVRFRDogJ0RlbGV0ZU9wZXJhdGlvbkNvbXBsZXRlZCcsXHJcbn0gYXMgY29uc3Q7XHJcblxyXG4vKipcclxuICogQ1JVRCBvcGVyYXRpb24gdHlwZXNcclxuICovXHJcbmV4cG9ydCBjb25zdCBDUlVEX09QRVJBVElPTiA9IHtcclxuICBJTlNFUlQ6ICdJTlNFUlQnLFxyXG4gIFVQREFURTogJ1VQREFURScsXHJcbiAgREVMRVRFOiAnREVMRVRFJyxcclxufSBhcyBjb25zdDtcclxuXHJcbi8qKlxyXG4gKiBTaWduYWxSIGNvbm5lY3Rpb24gc3RhdGVzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgQ09OTkVDVElPTl9TVEFURSA9IHtcclxuICBESVNDT05ORUNURUQ6ICdEaXNjb25uZWN0ZWQnLFxyXG4gIENPTk5FQ1RJTkc6ICdDb25uZWN0aW5nJyxcclxuICBDT05ORUNURUQ6ICdDb25uZWN0ZWQnLFxyXG4gIFJFQ09OTkVDVElORzogJ1JlY29ubmVjdGluZycsXHJcbiAgRkFJTEVEOiAnRmFpbGVkJyxcclxufSBhcyBjb25zdDtcclxuXHJcbi8qKlxyXG4gKiBTaWduYWxSIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU0lHTkFMUl9DT05GSUcgPSB7XHJcbiAgREVGQVVMVF9USU1FT1VUOiAxMjAwMDAsIC8vIDIgbWludXRlc1xyXG4gIFJFQ09OTkVDVF9ERUxBWVM6IFswLCAyMDAwLCAxMDAwMCwgMzAwMDAsIDYwMDAwXSwgLy8gRXhwb25lbnRpYWwgYmFja29mZlxyXG59IGFzIGNvbnN0OyJdfQ==
@@ -1,90 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { Subject, throwError, TimeoutError } from 'rxjs';
3
- import { filter, take, timeout, catchError } from 'rxjs/operators';
4
- import { SIGNALR_CONFIG, } from '../../../app/interfaces/signalr.interface';
5
- import * as i0 from "@angular/core";
6
- /**
7
- * Operation Tracker Service
8
- * Tracks async operations by correlationId and matches them with SignalR notifications
9
- * Used by TabFormioService for handling async processRequest operations
10
- */
11
- export class OperationTrackerService {
12
- constructor() {
13
- // Map<correlationId, PendingOperation>
14
- this.pendingOperations = new Map();
15
- // Observable for completed operations
16
- this.operationCompleted$ = new Subject();
17
- }
18
- /**
19
- * Register an async operation for tracking
20
- */
21
- registerOperation(operation) {
22
- this.pendingOperations.set(operation.correlationId, operation);
23
- // Auto-cleanup after timeout
24
- setTimeout(() => {
25
- if (this.pendingOperations.has(operation.correlationId)) {
26
- this.pendingOperations.delete(operation.correlationId);
27
- }
28
- }, operation.timeout || SIGNALR_CONFIG.DEFAULT_TIMEOUT);
29
- }
30
- /**
31
- * Wait for operation to complete via SignalR notification
32
- * Returns Observable that emits when notification with matching correlationId is received
33
- */
34
- waitForOperation(correlationId, timeoutMs = SIGNALR_CONFIG.DEFAULT_TIMEOUT) {
35
- // Auto-register so handleNotification can match it
36
- if (!this.pendingOperations.has(correlationId)) {
37
- this.registerOperation({
38
- correlationId,
39
- timestamp: new Date(),
40
- timeout: timeoutMs
41
- });
42
- }
43
- return this.operationCompleted$.pipe(filter((notification) => notification.correlationId === correlationId), take(1), timeout(timeoutMs), catchError((error) => {
44
- // Cleanup on timeout
45
- this.pendingOperations.delete(correlationId);
46
- if (error instanceof TimeoutError) {
47
- return throwError(() => new Error('Operation timed out'));
48
- }
49
- return throwError(() => error);
50
- }));
51
- }
52
- /**
53
- * Handle incoming SignalR notification
54
- * Called by SignalRService when notification is received
55
- */
56
- handleNotification(notification) {
57
- const operation = this.pendingOperations.get(notification.correlationId);
58
- if (operation) {
59
- // Emit to observers waiting for this operation
60
- this.operationCompleted$.next(notification);
61
- // Cleanup
62
- this.pendingOperations.delete(notification.correlationId);
63
- }
64
- }
65
- /**
66
- * Check if operation is pending
67
- */
68
- isPending(correlationId) {
69
- return this.pendingOperations.has(correlationId);
70
- }
71
- /**
72
- * Get pending operations count (for debugging)
73
- */
74
- getPendingCount() {
75
- return this.pendingOperations.size;
76
- }
77
- /**
78
- * Get all pending operations (for debugging)
79
- */
80
- getAllPending() {
81
- return Array.from(this.pendingOperations.values());
82
- }
83
- static { this.ɵfac = function OperationTrackerService_Factory(t) { return new (t || OperationTrackerService)(); }; }
84
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: OperationTrackerService, factory: OperationTrackerService.ɵfac, providedIn: 'root' }); }
85
- }
86
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(OperationTrackerService, [{
87
- type: Injectable,
88
- args: [{ providedIn: 'root' }]
89
- }], null, null); })();
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLXRyYWNrZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZGF0YS1hY2Nlc3Mvc3JjL2xpYi90YWItY29yZS11dGlsaXR5L2NvcmUvc2VydmljZS9zaWduYWxyL29wZXJhdGlvbi10cmFja2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFHTCxjQUFjLEdBQ2YsTUFBTSwyQ0FBMkMsQ0FBQzs7QUFFbkQ7Ozs7R0FJRztBQUVILE1BQU0sT0FBTyx1QkFBdUI7SUFEcEM7UUFFRSx1Q0FBdUM7UUFDL0Isc0JBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUFFaEUsc0NBQXNDO1FBQzlCLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUFvQixDQUFDO0tBZ0YvRDtJQTlFQzs7T0FFRztJQUNILGlCQUFpQixDQUFDLFNBQTJCO1FBQzNDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUvRCw2QkFBNkI7UUFDN0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUMsRUFBRSxTQUFTLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsYUFBcUIsRUFBRSxZQUFvQixjQUFjLENBQUMsZUFBZTtRQUN4RixtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3JCLGFBQWE7Z0JBQ2IsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNyQixPQUFPLEVBQUUsU0FBUzthQUNuQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUNsQyxNQUFNLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxhQUFhLEtBQUssYUFBYSxDQUFDLEVBQ3RFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQ2xCLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLHFCQUFxQjtZQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRTdDLElBQUksS0FBSyxZQUFZLFlBQVksRUFBRSxDQUFDO2dCQUNsQyxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUNELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCLENBQUMsWUFBOEI7UUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLCtDQUErQztZQUMvQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRTVDLFVBQVU7WUFDVixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLGFBQXFCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQzt3RkFwRlUsdUJBQXVCO3VFQUF2Qix1QkFBdUIsV0FBdkIsdUJBQXVCLG1CQURWLE1BQU07O2lGQUNuQix1QkFBdUI7Y0FEbkMsVUFBVTtlQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGhyb3dFcnJvciwgVGltZW91dEVycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgdGFrZSwgdGltZW91dCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtcclxuICBDcnVkTm90aWZpY2F0aW9uLFxyXG4gIFBlbmRpbmdPcGVyYXRpb24sXHJcbiAgU0lHTkFMUl9DT05GSUcsXHJcbn0gZnJvbSAnLi4vLi4vLi4vYXBwL2ludGVyZmFjZXMvc2lnbmFsci5pbnRlcmZhY2UnO1xyXG5cclxuLyoqXHJcbiAqIE9wZXJhdGlvbiBUcmFja2VyIFNlcnZpY2VcclxuICogVHJhY2tzIGFzeW5jIG9wZXJhdGlvbnMgYnkgY29ycmVsYXRpb25JZCBhbmQgbWF0Y2hlcyB0aGVtIHdpdGggU2lnbmFsUiBub3RpZmljYXRpb25zXHJcbiAqIFVzZWQgYnkgVGFiRm9ybWlvU2VydmljZSBmb3IgaGFuZGxpbmcgYXN5bmMgcHJvY2Vzc1JlcXVlc3Qgb3BlcmF0aW9uc1xyXG4gKi9cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIE9wZXJhdGlvblRyYWNrZXJTZXJ2aWNlIHtcclxuICAvLyBNYXA8Y29ycmVsYXRpb25JZCwgUGVuZGluZ09wZXJhdGlvbj5cclxuICBwcml2YXRlIHBlbmRpbmdPcGVyYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFBlbmRpbmdPcGVyYXRpb24+KCk7XHJcblxyXG4gIC8vIE9ic2VydmFibGUgZm9yIGNvbXBsZXRlZCBvcGVyYXRpb25zXHJcbiAgcHJpdmF0ZSBvcGVyYXRpb25Db21wbGV0ZWQkID0gbmV3IFN1YmplY3Q8Q3J1ZE5vdGlmaWNhdGlvbj4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgYW4gYXN5bmMgb3BlcmF0aW9uIGZvciB0cmFja2luZ1xyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT3BlcmF0aW9uKG9wZXJhdGlvbjogUGVuZGluZ09wZXJhdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5wZW5kaW5nT3BlcmF0aW9ucy5zZXQob3BlcmF0aW9uLmNvcnJlbGF0aW9uSWQsIG9wZXJhdGlvbik7XHJcblxyXG4gICAgLy8gQXV0by1jbGVhbnVwIGFmdGVyIHRpbWVvdXRcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5wZW5kaW5nT3BlcmF0aW9ucy5oYXMob3BlcmF0aW9uLmNvcnJlbGF0aW9uSWQpKSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nT3BlcmF0aW9ucy5kZWxldGUob3BlcmF0aW9uLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgICB9XHJcbiAgICB9LCBvcGVyYXRpb24udGltZW91dCB8fCBTSUdOQUxSX0NPTkZJRy5ERUZBVUxUX1RJTUVPVVQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2FpdCBmb3Igb3BlcmF0aW9uIHRvIGNvbXBsZXRlIHZpYSBTaWduYWxSIG5vdGlmaWNhdGlvblxyXG4gICAqIFJldHVybnMgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gbm90aWZpY2F0aW9uIHdpdGggbWF0Y2hpbmcgY29ycmVsYXRpb25JZCBpcyByZWNlaXZlZFxyXG4gICAqL1xyXG4gIHdhaXRGb3JPcGVyYXRpb24oY29ycmVsYXRpb25JZDogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlciA9IFNJR05BTFJfQ09ORklHLkRFRkFVTFRfVElNRU9VVCk6IE9ic2VydmFibGU8Q3J1ZE5vdGlmaWNhdGlvbj4ge1xyXG4gICAgLy8gQXV0by1yZWdpc3RlciBzbyBoYW5kbGVOb3RpZmljYXRpb24gY2FuIG1hdGNoIGl0XHJcbiAgICBpZiAoIXRoaXMucGVuZGluZ09wZXJhdGlvbnMuaGFzKGNvcnJlbGF0aW9uSWQpKSB7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJPcGVyYXRpb24oe1xyXG4gICAgICAgIGNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgIHRpbWVvdXQ6IHRpbWVvdXRNc1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbkNvbXBsZXRlZCQucGlwZShcclxuICAgICAgZmlsdGVyKChub3RpZmljYXRpb24pID0+IG5vdGlmaWNhdGlvbi5jb3JyZWxhdGlvbklkID09PSBjb3JyZWxhdGlvbklkKSxcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgdGltZW91dCh0aW1lb3V0TXMpLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIC8vIENsZWFudXAgb24gdGltZW91dFxyXG4gICAgICAgIHRoaXMucGVuZGluZ09wZXJhdGlvbnMuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xyXG5cclxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignT3BlcmF0aW9uIHRpbWVkIG91dCcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBpbmNvbWluZyBTaWduYWxSIG5vdGlmaWNhdGlvblxyXG4gICAqIENhbGxlZCBieSBTaWduYWxSU2VydmljZSB3aGVuIG5vdGlmaWNhdGlvbiBpcyByZWNlaXZlZFxyXG4gICAqL1xyXG4gIGhhbmRsZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IENydWROb3RpZmljYXRpb24pOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMucGVuZGluZ09wZXJhdGlvbnMuZ2V0KG5vdGlmaWNhdGlvbi5jb3JyZWxhdGlvbklkKTtcclxuICAgIGlmIChvcGVyYXRpb24pIHtcclxuICAgICAgLy8gRW1pdCB0byBvYnNlcnZlcnMgd2FpdGluZyBmb3IgdGhpcyBvcGVyYXRpb25cclxuICAgICAgdGhpcy5vcGVyYXRpb25Db21wbGV0ZWQkLm5leHQobm90aWZpY2F0aW9uKTtcclxuXHJcbiAgICAgIC8vIENsZWFudXBcclxuICAgICAgdGhpcy5wZW5kaW5nT3BlcmF0aW9ucy5kZWxldGUobm90aWZpY2F0aW9uLmNvcnJlbGF0aW9uSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgb3BlcmF0aW9uIGlzIHBlbmRpbmdcclxuICAgKi9cclxuICBpc1BlbmRpbmcoY29ycmVsYXRpb25JZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nT3BlcmF0aW9ucy5oYXMoY29ycmVsYXRpb25JZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgcGVuZGluZyBvcGVyYXRpb25zIGNvdW50IChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldFBlbmRpbmdDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ09wZXJhdGlvbnMuc2l6ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgcGVuZGluZyBvcGVyYXRpb25zIChmb3IgZGVidWdnaW5nKVxyXG4gICAqL1xyXG4gIGdldEFsbFBlbmRpbmcoKTogUGVuZGluZ09wZXJhdGlvbltdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucGVuZGluZ09wZXJhdGlvbnMudmFsdWVzKCkpO1xyXG4gIH1cclxufSJdfQ==