@techextensor/tab-core-utility 2.2.188 → 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.
- package/esm2022/index.mjs +1 -5
- package/esm2022/lib/tab-core-utility/app/constants/api-constants.mjs +15 -27
- package/esm2022/lib/tab-core-utility/app/constants/common.mjs +50 -14
- package/esm2022/lib/tab-core-utility/app/constants/storage-constants.mjs +2 -2
- package/esm2022/lib/tab-core-utility/app/crud/tab-crud.service.mjs +54 -41
- package/esm2022/lib/tab-core-utility/app/crud/tab-delete.service.mjs +30 -84
- package/esm2022/lib/tab-core-utility/app/crud/tab-formio.service.mjs +12 -141
- package/esm2022/lib/tab-core-utility/app/crud/tab-get.service.mjs +35 -136
- package/esm2022/lib/tab-core-utility/app/crud/tab-insert.service.mjs +38 -89
- package/esm2022/lib/tab-core-utility/app/crud/tab-update.service.mjs +129 -159
- package/esm2022/lib/tab-core-utility/app/enums/query.enum.mjs +7 -7
- package/esm2022/lib/tab-core-utility/app/helpers/common/app.helpers.mjs +19 -26
- package/esm2022/lib/tab-core-utility/app/helpers/common/dsq.helpers.mjs +11 -9
- package/esm2022/lib/tab-core-utility/app/helpers/common/meta-data.helpers.mjs +13 -13
- package/esm2022/lib/tab-core-utility/app/helpers/common/req-res.helpers.mjs +45 -7
- package/esm2022/lib/tab-core-utility/app/helpers/common/where-clause.helpers.mjs +76 -79
- package/esm2022/lib/tab-core-utility/app/helpers/screen/grid.helpers.mjs +4 -8
- package/esm2022/lib/tab-core-utility/app/helpers/screen/screen.helpers.mjs +33 -8
- package/esm2022/lib/tab-core-utility/app/interfaces/common.interface.mjs +1 -1
- package/esm2022/lib/tab-core-utility/app/models/api-query.class.mjs +1 -39
- package/esm2022/lib/tab-core-utility/app/models/app-field.model.mjs +7 -36
- package/esm2022/lib/tab-core-utility/app/models/app-object.model.mjs +47 -84
- package/esm2022/lib/tab-core-utility/app/models/app-screen.model.mjs +13 -24
- package/esm2022/lib/tab-core-utility/app/models/data-source-query.model.mjs +23 -57
- package/esm2022/lib/tab-core-utility/app/models/filter.model.mjs +10 -21
- package/esm2022/lib/tab-core-utility/app/models/parameter.model.mjs +6 -12
- package/esm2022/lib/tab-core-utility/app/models/sort.model.mjs +4 -11
- package/esm2022/lib/tab-core-utility/app/utils/json.util.mjs +16 -17
- package/esm2022/lib/tab-core-utility/app/utils/req-res.util.mjs +55 -1
- package/esm2022/lib/tab-core-utility/app/utils/tab-app.util.mjs +164 -1
- package/esm2022/lib/tab-core-utility/core/http-client/api.service.mjs +1 -78
- package/index.d.ts +0 -4
- package/lib/tab-core-utility/app/constants/api-constants.d.ts +12 -15
- package/lib/tab-core-utility/app/constants/common.d.ts +0 -9
- package/lib/tab-core-utility/app/constants/storage-constants.d.ts +1 -1
- package/lib/tab-core-utility/app/crud/tab-crud.service.d.ts +1 -8
- package/lib/tab-core-utility/app/crud/tab-delete.service.d.ts +10 -20
- package/lib/tab-core-utility/app/crud/tab-formio.service.d.ts +6 -33
- package/lib/tab-core-utility/app/crud/tab-get.service.d.ts +3 -45
- package/lib/tab-core-utility/app/crud/tab-insert.service.d.ts +21 -16
- package/lib/tab-core-utility/app/crud/tab-update.service.d.ts +19 -34
- package/lib/tab-core-utility/app/enums/query.enum.d.ts +6 -3
- package/lib/tab-core-utility/app/helpers/common/app.helpers.d.ts +8 -5
- package/lib/tab-core-utility/app/helpers/common/dsq.helpers.d.ts +0 -3
- package/lib/tab-core-utility/app/helpers/common/meta-data.helpers.d.ts +3 -3
- package/lib/tab-core-utility/app/helpers/common/req-res.helpers.d.ts +51 -7
- package/lib/tab-core-utility/app/helpers/common/where-clause.helpers.d.ts +0 -1
- package/lib/tab-core-utility/app/helpers/screen/grid.helpers.d.ts +1 -2
- package/lib/tab-core-utility/app/helpers/screen/screen.helpers.d.ts +0 -1
- package/lib/tab-core-utility/app/interfaces/common.interface.d.ts +2 -51
- package/lib/tab-core-utility/app/models/api-query.class.d.ts +9 -54
- package/lib/tab-core-utility/app/models/app-field.model.d.ts +2 -4
- package/lib/tab-core-utility/app/models/app-object.model.d.ts +3 -5
- package/lib/tab-core-utility/app/models/app-screen.model.d.ts +2 -2
- package/lib/tab-core-utility/app/models/data-source-query.model.d.ts +2 -7
- package/lib/tab-core-utility/app/models/filter.model.d.ts +2 -2
- package/lib/tab-core-utility/app/models/parameter.model.d.ts +2 -2
- package/lib/tab-core-utility/app/models/sort.model.d.ts +1 -1
- package/lib/tab-core-utility/app/utils/json.util.d.ts +2 -3
- package/lib/tab-core-utility/app/utils/req-res.util.d.ts +9 -1
- package/lib/tab-core-utility/app/utils/tab-app.util.d.ts +61 -0
- package/lib/tab-core-utility/core/http-client/api.service.d.ts +0 -46
- package/package.json +2 -3
- package/esm2022/lib/tab-core-utility/app/helpers/response.adapter.mjs +0 -38
- package/esm2022/lib/tab-core-utility/app/interfaces/signalr.interface.mjs +0 -42
- package/esm2022/lib/tab-core-utility/core/service/signalr/operation-tracker.service.mjs +0 -90
- package/esm2022/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.mjs +0 -268
- package/esm2022/lib/tab-core-utility/core/service/signalr/signalr.service.mjs +0 -207
- package/lib/tab-core-utility/app/helpers/response.adapter.d.ts +0 -22
- package/lib/tab-core-utility/app/interfaces/signalr.interface.d.ts +0 -84
- package/lib/tab-core-utility/core/service/signalr/operation-tracker.service.d.ts +0 -40
- package/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.d.ts +0 -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
|
|
71
|
-
*
|
|
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
|
|
16
|
+
* Converts the current object to a JSON object.
|
|
17
17
|
*
|
|
18
|
-
* @returns A JSON representation
|
|
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
|
|
11
|
-
* @returns {any} The model as a JSON object
|
|
10
|
+
* Converts the model to JSON.
|
|
11
|
+
* @returns {any} The model as a JSON object.
|
|
12
12
|
*/
|
|
13
13
|
toJSON(): any;
|
|
14
14
|
}
|
|
@@ -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
|
|
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
|
|
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):
|
|
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.
|
|
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==
|