http-request-manager 0.0.1 → 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +262 -13
- package/esm2022/http-request-manager.mjs +5 -0
- package/esm2022/lib/interceptors/credentials.interceptor.mjs +14 -0
- package/esm2022/lib/interceptors/index.mjs +5 -0
- package/esm2022/lib/interceptors/models/error-settings.model.mjs +10 -0
- package/esm2022/lib/interceptors/request-error.interceptor.mjs +49 -0
- package/esm2022/lib/interceptors/request-header.interceptor.mjs +41 -0
- package/esm2022/lib/models/data-type.enum.mjs +7 -0
- package/esm2022/lib/models/database-storage.model.mjs +10 -0
- package/esm2022/lib/models/index.mjs +4 -0
- package/esm2022/lib/models/retry-options.model.mjs +10 -0
- package/esm2022/lib/services/index.mjs +6 -0
- package/esm2022/lib/services/local-storage-manager-service/index.mjs +3 -0
- package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +275 -0
- package/esm2022/lib/services/local-storage-manager-service/models/global-store-options.model.mjs +13 -0
- package/esm2022/lib/services/local-storage-manager-service/models/index.mjs +7 -0
- package/esm2022/lib/services/local-storage-manager-service/models/setting-options.model.mjs +13 -0
- package/esm2022/lib/services/local-storage-manager-service/models/storage-data.model.mjs +10 -0
- package/esm2022/lib/services/local-storage-manager-service/models/storage-option-settings.model.mjs +13 -0
- package/esm2022/lib/services/local-storage-manager-service/models/storage-option.model.mjs +12 -0
- package/esm2022/lib/services/local-storage-manager-service/models/storage-type.enum.mjs +7 -0
- package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +172 -0
- package/esm2022/lib/services/request-manager-services/index.mjs +5 -0
- package/esm2022/lib/services/request-manager-services/request.service.mjs +159 -0
- package/esm2022/lib/services/request-manager-services/rxjs-operators/countdown.mjs +9 -0
- package/esm2022/lib/services/request-manager-services/rxjs-operators/delay-retry.mjs +8 -0
- package/esm2022/lib/services/request-manager-services/rxjs-operators/index.mjs +5 -0
- package/esm2022/lib/services/request-manager-services/rxjs-operators/request-polling.mjs +14 -0
- package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +19 -0
- package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +299 -0
- package/esm2022/lib/services/request-manager-state-service/index.mjs +3 -0
- package/esm2022/lib/services/request-manager-state-service/models/api-request.model.mjs +20 -0
- package/esm2022/lib/services/request-manager-state-service/models/index.mjs +3 -0
- package/esm2022/lib/services/request-manager-state-service/models/request-options.model.mjs +10 -0
- package/esm2022/lib/services/utils/app.service.mjs +20 -0
- package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +186 -0
- package/esm2022/lib/services/utils/encryption/encryption-test.service.mjs +35 -0
- package/esm2022/lib/services/utils/encryption/index.mjs +4 -0
- package/esm2022/lib/services/utils/encryption/random.mjs +52 -0
- package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +77 -0
- package/esm2022/lib/services/utils/headers.service.mjs +21 -0
- package/esm2022/lib/services/utils/index.mjs +6 -0
- package/esm2022/lib/services/utils/path-query.service.mjs +53 -0
- package/esm2022/lib/services/utils/utils.service.mjs +134 -0
- package/esm2022/public-api.mjs +7 -0
- package/fesm2022/http-request-manager.mjs +1715 -0
- package/fesm2022/http-request-manager.mjs.map +1 -0
- package/http-request-manager-0.0.20.tgz +0 -0
- package/index.d.ts +5 -0
- package/lib/interceptors/credentials.interceptor.d.ts +8 -0
- package/lib/interceptors/index.d.ts +4 -0
- package/lib/interceptors/models/error-settings.model.d.ts +10 -0
- package/lib/interceptors/request-error.interceptor.d.ts +10 -0
- package/lib/interceptors/request-header.interceptor.d.ts +15 -0
- package/lib/models/data-type.enum.d.ts +5 -0
- package/lib/models/database-storage.model.d.ts +10 -0
- package/lib/models/index.d.ts +3 -0
- package/lib/models/retry-options.model.d.ts +10 -0
- package/lib/services/index.d.ts +4 -0
- package/lib/services/local-storage-manager-service/index.d.ts +2 -0
- package/lib/services/local-storage-manager-service/local-storage-manager.service.d.ts +81 -0
- package/lib/services/local-storage-manager-service/models/global-store-options.model.d.ts +15 -0
- package/lib/services/local-storage-manager-service/models/index.d.ts +6 -0
- package/lib/services/local-storage-manager-service/models/setting-options.model.d.ts +15 -0
- package/lib/services/local-storage-manager-service/models/storage-data.model.d.ts +10 -0
- package/lib/services/local-storage-manager-service/models/storage-option-settings.model.d.ts +15 -0
- package/lib/services/local-storage-manager-service/models/storage-option.model.d.ts +13 -0
- package/lib/services/local-storage-manager-service/models/storage-type.enum.d.ts +5 -0
- package/lib/services/request-manager-services/http-manager.service.d.ts +35 -0
- package/lib/services/request-manager-services/index.d.ts +3 -0
- package/lib/services/request-manager-services/request.service.d.ts +27 -0
- package/lib/services/request-manager-services/rxjs-operators/countdown.d.ts +2 -0
- package/lib/services/request-manager-services/rxjs-operators/delay-retry.d.ts +2 -0
- package/lib/services/request-manager-services/rxjs-operators/index.d.ts +4 -0
- package/lib/services/request-manager-services/rxjs-operators/request-polling.d.ts +7 -0
- package/lib/services/request-manager-services/rxjs-operators/request-streaming.d.ts +2 -0
- package/lib/services/request-manager-state-service/http-manager-state.store.d.ts +55 -0
- package/lib/services/request-manager-state-service/index.d.ts +2 -0
- package/lib/services/request-manager-state-service/models/api-request.model.d.ts +25 -0
- package/lib/services/request-manager-state-service/models/index.d.ts +2 -0
- package/lib/services/request-manager-state-service/models/request-options.model.d.ts +10 -0
- package/lib/services/utils/app.service.d.ts +8 -0
- package/lib/services/utils/encryption/asymmetrical-encryption.service.d.ts +17 -0
- package/lib/services/utils/encryption/encryption-test.service.d.ts +10 -0
- package/lib/services/utils/encryption/index.d.ts +3 -0
- package/lib/services/utils/encryption/random.d.ts +7 -0
- package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +14 -0
- package/lib/services/utils/headers.service.d.ts +10 -0
- package/lib/services/utils/index.d.ts +5 -0
- package/lib/services/utils/path-query.service.d.ts +11 -0
- package/lib/services/utils/utils.service.d.ts +24 -0
- package/package.json +24 -10
- package/public-api.d.ts +3 -0
- package/ng-package.json +0 -7
- package/src/lib/http-request-manager.component.spec.ts +0 -21
- package/src/lib/http-request-manager.component.ts +0 -15
- package/src/lib/http-request-manager.module.ts +0 -16
- package/src/lib/http-request-manager.service.spec.ts +0 -16
- package/src/lib/http-request-manager.service.ts +0 -9
- package/src/public-api.ts +0 -7
- package/tsconfig.lib.json +0 -14
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -14
package/README.md
CHANGED
|
@@ -1,24 +1,273 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Global Store Module
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The NGRX Store is the core part of the NGRX library. It is a state container that holds the application state and provides an observable stream of state changes.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
A Component Store is a lightweight state management solution designed to be used at the component level. It's particularly useful when you have a component that doesn't need to communicate with the global store but still requires local state management. By using Component Store, you can encapsulate the state management within the component, making it easier to understand and maintain. It also provides a more concise and reactive approach to managing state within a component.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
> Note: Don't forget to add `--project http-request-manager` or else it will be added to the default project in your `angular.json` file.
|
|
7
|
+
## Installation of Component Store (NGRX Store)
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
ng add @ngrx/component-store@latest
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
## Installation of DixieJS Database
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
npm install dexie
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
## Installation of Crypto-JS
|
|
17
16
|
|
|
18
|
-
|
|
17
|
+
npm install crypto-js
|
|
18
|
+
npm install --save @types/crypto-js
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
## Angular 15 or Greater
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Angular 15 and up do not create environment files. If you need to create one for storing a base API path, follow these steps:
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
ng generate environments
|
|
25
|
+
|
|
26
|
+
Once your environment for your API is set, you need to proxy your requests. Create a `proxy.conf.json` file with the following entry:
|
|
27
|
+
|
|
28
|
+
{
|
|
29
|
+
"/api/*": {
|
|
30
|
+
"target": "https://me.ca/rest/wavecoders",
|
|
31
|
+
"secure": false,
|
|
32
|
+
"changeOrigin": true,
|
|
33
|
+
"pathRewrite": { "^/api": "" },
|
|
34
|
+
"logLevel": "debug"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
- The "/api/\*" describes what it will search for in your request to replace with the target URL (proxy), "target" is the target URL, and adjust the "pathRewrite" to match the search.
|
|
39
|
+
Then run your app with:
|
|
40
|
+
|
|
41
|
+
ng serve --proxy-config proxy.conf.json --port 8080
|
|
42
|
+
|
|
43
|
+
Or set up an `npm start:local` command in your package.json.
|
|
44
|
+
|
|
45
|
+
The Store Module is composed of three main components:
|
|
46
|
+
|
|
47
|
+
- GlobalDataStore
|
|
48
|
+
|
|
49
|
+
This is the main component to extend a class and provide options. It connects to all the following services.
|
|
50
|
+
|
|
51
|
+
## Extended Services
|
|
52
|
+
|
|
53
|
+
- DBStorageService (DixieJS)
|
|
54
|
+
- ApiDataService (HTTP Request)
|
|
55
|
+
- GlobalDataStorageService (Session/Local Storage)
|
|
56
|
+
- EncryptionDecryptionService (Encryption/Decryption for GlobalDataStorageService)
|
|
57
|
+
- UtilsService (Utility functions)
|
|
58
|
+
- AppService (Unique Instance ID used for Encryption Services for GlobalDataStorageService)
|
|
59
|
+
|
|
60
|
+
## How to Use GlobalDataStore
|
|
61
|
+
|
|
62
|
+
1. Extend the Component or Service with `GlobalDataStore` and provide the DataModel:
|
|
63
|
+
|
|
64
|
+
export class DashboardComponent extends GlobalDataStore`<ClientBasicDetails>` implements OnInit {
|
|
65
|
+
|
|
66
|
+
In the constructor, call super with a few options available:
|
|
67
|
+
|
|
68
|
+
constructor() {
|
|
69
|
+
super(
|
|
70
|
+
{
|
|
71
|
+
server:`/as/authorization.oauth2`,
|
|
72
|
+
endpoint: ['oidc', 'clients'],
|
|
73
|
+
retryTimes: 3,
|
|
74
|
+
polling: true,
|
|
75
|
+
retryNextIn: 30,
|
|
76
|
+
headers: { 'myheader': 'test }
|
|
77
|
+
},
|
|
78
|
+
DataType.ARRAY,
|
|
79
|
+
{
|
|
80
|
+
adapters: { incoming: ClientBasicDetails.adapt, outgoing: ClientBasicDetails.adapt },
|
|
81
|
+
database: { table: 'toolrental', expiresIn: '1min' }
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
A) The first parameter is the API fetch process, with the following options:
|
|
87
|
+
|
|
88
|
+
- server: `/as/authorization.oauth2` (STRING | REQUIRED)
|
|
89
|
+
|
|
90
|
+
Server param has been modified to accepts the following configurations:
|
|
91
|
+
|
|
92
|
+
adding `config` allows and Observable or an Object with key/values to be passed as a config setting that may be exhaustive. To define `server` or `endpoint` values from the config properties you simply add the key to the `server` and `endpoint` and they will be extracted.
|
|
93
|
+
|
|
94
|
+
### Sample configurations:
|
|
95
|
+
|
|
96
|
+
#### Config_1 - this is an Object:
|
|
97
|
+
|
|
98
|
+
{
|
|
99
|
+
config: { apiService: 'http://apple.com', another: 'sample', endpoint: 'my/endpoint' },
|
|
100
|
+
server : 'apiService',
|
|
101
|
+
endpoint: 'endpoint',
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
#### Config_2 - configs is an Observable (Object) and endpoint is a STRING:
|
|
105
|
+
|
|
106
|
+
{
|
|
107
|
+
config: appConfigService.configSubject$,
|
|
108
|
+
server : 'apiService',
|
|
109
|
+
endpoint: 'auth/api/toolrental/v1/categories',
|
|
110
|
+
}
|
|
111
|
+
- endpoint: `['oidc', 'clients']` (STRING|NUMBER)ARRAY | STRING | REQUIRED
|
|
112
|
+
- polling: true (BOOLEAN| OPTIONAL)
|
|
113
|
+
- retryTimes: 3 (NUMBER | OPTIONAL)
|
|
114
|
+
- retryNextIn: 30 (NUMBER | OPTIONAL)
|
|
115
|
+
- headers: { 'myheader': 'test } ( any | OPTIONAL)
|
|
116
|
+
|
|
117
|
+
B) The second parameter is the Data type expected - ARRAY or OBJECT.
|
|
118
|
+
|
|
119
|
+
C) The last parameter (optional) defines the shape of the data and the data's persistence:
|
|
120
|
+
|
|
121
|
+
- adapters: You have `incoming` and `outgoing` adapters (refer to 'Adapter Data Model Pattern' section of this document).
|
|
122
|
+
- database: This is the storage persistence for IndexDB:
|
|
123
|
+
- table: Name of the table for storage ('toolrental').
|
|
124
|
+
- expiresIn: Defines when the storage is stale and needs to fetch a new request ('1min').
|
|
125
|
+
|
|
126
|
+
## Options for Super
|
|
127
|
+
|
|
128
|
+
### API Request Options:
|
|
129
|
+
|
|
130
|
+
- SERVER: Base URL for all requests server: `'/as/authorization.oauth2'`.
|
|
131
|
+
- ENDPOINT: An array of path endpoints `['oidc', 'clients']`. QUERY-style requests can be provided as an Object `{ sort: true, client_id: 123 }` and will convert to ?sort=true&client_id:123.
|
|
132
|
+
- POLLING: Poll the request every #seconds (polling: 5 for 5 seconds).
|
|
133
|
+
- RETRYTIMES: Retry the request if it fails #times and then throw an error.
|
|
134
|
+
- RETYRNEXTIN: The HTTP request will wait for #seconds before trying the request again (this only applies to failed requests).
|
|
135
|
+
- HEADERS: All HTTP requests made through this instance will apply HEADERS to the request
|
|
136
|
+
|
|
137
|
+
### DataType
|
|
138
|
+
|
|
139
|
+
This refers to the expected response data type, which can be either ARRAY or OBJECT:
|
|
140
|
+
|
|
141
|
+
- ARRAY: A dataset that may be an array of types or objects.
|
|
142
|
+
- OBJECT: Object structure containing keys and values.
|
|
143
|
+
|
|
144
|
+
### Input Data Model
|
|
145
|
+
|
|
146
|
+
This is the model to shape the incoming data. You need to use a Model Adapter pattern to supply the correct type. If you provide no Incoming model, then the default will be whatever the data model currently is. Please refer to the 'Adapter Data Model Pattern' section.
|
|
147
|
+
|
|
148
|
+
### Output Data Model
|
|
149
|
+
|
|
150
|
+
This is the model to shape the outgoing (API) data. You need to use a Model Adapter pattern to supply the correct type. If you provide no Outgoing model, then the default will be whatever the data model currently is. Please refer to the 'Adapter Data Model Pattern' section.
|
|
151
|
+
|
|
152
|
+
### Database Options
|
|
153
|
+
|
|
154
|
+
If you do not provide the database options, no data storage (cache) will be applied. All requests will continually make requests when called.
|
|
155
|
+
|
|
156
|
+
- TABLE: This is the Table you would like to create for the HTTP request to store the incoming data. If you need to access and perform your own queries on the data in the database, you can do so with this reference.
|
|
157
|
+
- EXPIRESIN: This indicates when the database data is stale and a new request to replace the data in the database should be made.
|
|
158
|
+
|
|
159
|
+
### Path Config
|
|
160
|
+
|
|
161
|
+
server: is the general fixed path for the API.
|
|
162
|
+
endpoint: is related to the endpoint that is used and added to the main server path. This is an ARRAY structure giving you the ability to add dynamic variables at any point for the request; the path is automatically constructed.
|
|
163
|
+
|
|
164
|
+
Example:
|
|
165
|
+
Using a proxy, the main endpoint is provided and replaced with this value if api is provided in the HTTP request path. This is great if you are switching between environments such as dev, QA, and prod environments.
|
|
166
|
+
|
|
167
|
+
I) Next, the user wants to use the general server API path - `/as/authorization.oauth2`
|
|
168
|
+
|
|
169
|
+
II) and then the endpoint that will be added - `['oidc', 'clients']`. This allows you to add dynamic properties.
|
|
170
|
+
|
|
171
|
+
Here is what the setup would look like:
|
|
172
|
+
|
|
173
|
+
super({ server: '/as/authorization.oauth2', endpoint: ['oidc', 'clients'] });
|
|
174
|
+
|
|
175
|
+
## Adapter Data Model Pattern
|
|
176
|
+
|
|
177
|
+
export interface SampleInterface {
|
|
178
|
+
id: number;
|
|
179
|
+
name: string;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export class Sample implements SampleInterface {
|
|
183
|
+
constructor(public id = 0, public name = '') {}
|
|
184
|
+
|
|
185
|
+
static adapt(item?: any): Sample {
|
|
186
|
+
// Model your incoming data
|
|
187
|
+
return new Sample(item?.id, item?.name);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
static adaptApi(item?: any): any {
|
|
191
|
+
// Model your outgoing data
|
|
192
|
+
return {
|
|
193
|
+
id: item?.id,
|
|
194
|
+
name: item?.name,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
static schema(): string {
|
|
199
|
+
const model = Object(new Sample()).keys;
|
|
200
|
+
return model.join();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
In the above example, the two areas of focus are the static `adapt` function and the `adaptApi` static function. The `adapt` function will shape the incoming data, adding missing properties and defaults. The `adaptApi` function will shape the outgoing data.
|
|
205
|
+
|
|
206
|
+
The `schema` needs to be defined if you are using the database option. The schema will shape the database keys used for the lookups; it takes the current object's model and extracts the keys. Please note that keys MUST not contain any special characters other than \_, spaces are permitted.
|
|
207
|
+
|
|
208
|
+
## HTTP Request Methods
|
|
209
|
+
|
|
210
|
+
Providing no params will request types such as:
|
|
211
|
+
|
|
212
|
+
- fetchRecords()
|
|
213
|
+
- updateRecord()
|
|
214
|
+
- createRecord()
|
|
215
|
+
- deleteRecord()
|
|
216
|
+
|
|
217
|
+
will create a request with the base path + endpoint defined.
|
|
218
|
+
|
|
219
|
+
`this.fetchRecords()`
|
|
220
|
+
|
|
221
|
+
Example: `https://thd.com/myapp/users/roles`
|
|
222
|
+
|
|
223
|
+
You may provide additional paths to add to the current path structure (base path + endpoint) by providing an array of `(string|numbers)`. In this example, we have `this.client_id` which is a dynamic variable that changes.
|
|
224
|
+
|
|
225
|
+
this.fetchRecords([this.client_id])
|
|
226
|
+
|
|
227
|
+
Example: `https://thd.com/myapp/users/roles/12`
|
|
228
|
+
|
|
229
|
+
## GET REQUEST
|
|
230
|
+
|
|
231
|
+
To GET data from an endpoint:
|
|
232
|
+
|
|
233
|
+
this.fetchRecords(params, headers)
|
|
234
|
+
- PARAMS: additional paths to be added - string[], this is added to nstance of class path
|
|
235
|
+
- HEADERS: The HTTP request made will apply HEADERS to the request - interceptors and HEADERS instance of class are also applied
|
|
236
|
+
|
|
237
|
+
## POST REQUEST
|
|
238
|
+
|
|
239
|
+
To CREATE the new record - the data represents the object to create:
|
|
240
|
+
|
|
241
|
+
this.createRecord(data, params, headers)
|
|
242
|
+
- PARAMS: additional paths to be added - string[], this is added to nstance of class path
|
|
243
|
+
- HEADERS: The HTTP request made will apply HEADERS to the request - interceptors and HEADERS instance of class are also applied
|
|
244
|
+
|
|
245
|
+
## PUT REQUEST
|
|
246
|
+
|
|
247
|
+
To UPDATE the existing record - the `data` represents the object to update, which should include the `ID` which will be used in the request:
|
|
248
|
+
|
|
249
|
+
this.updateRecord(data, params, headers)
|
|
250
|
+
- PARAMS: additional paths to be added - string[], this is added to nstance of class path
|
|
251
|
+
- HEADERS: The HTTP request made will apply HEADERS to the request - interceptors and HEADERS instance of class are also applied
|
|
252
|
+
|
|
253
|
+
## DELETE REQUEST
|
|
254
|
+
|
|
255
|
+
To DELETE the existing record - the data represents the object to update, which should include the ID which will be used in the request:
|
|
256
|
+
|
|
257
|
+
this.deleteRecord(data, params, headers)
|
|
258
|
+
- PARAMS: additional paths to be added - string[], this is added to nstance of class path
|
|
259
|
+
- HEADERS: The HTTP request made will apply HEADERS to the request - interceptors and HEADERS instance of class are also applied
|
|
260
|
+
|
|
261
|
+
## Access to Data from API
|
|
262
|
+
|
|
263
|
+
To get the data, it is available as `data$` from the extended class, as with the methods since it extends the current class.
|
|
264
|
+
|
|
265
|
+
You should define a variable to use the `data$` from the extended class in your component or service like the following:
|
|
266
|
+
|
|
267
|
+
myData$ = this.data$ as Observable<ClientDetails[]>
|
|
268
|
+
|
|
269
|
+
This defines the observable as this type.
|
|
270
|
+
|
|
271
|
+
Then you can in your HTML reference this Observable
|
|
272
|
+
|
|
273
|
+
`<div ngif="(myData$ | async) as data">{{ data.name }}</div>`
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZXF1ZXN0LW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class WithCredentialsInterceptor {
|
|
4
|
+
intercept(req, next) {
|
|
5
|
+
req = req.clone({ withCredentials: true });
|
|
6
|
+
return next.handle(req);
|
|
7
|
+
}
|
|
8
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WithCredentialsInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
9
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WithCredentialsInterceptor }); }
|
|
10
|
+
}
|
|
11
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WithCredentialsInterceptor, decorators: [{
|
|
12
|
+
type: Injectable
|
|
13
|
+
}] });
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlZGVudGlhbHMuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2ludGVyY2VwdG9ycy9jcmVkZW50aWFscy5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVEzQyxNQUFNLE9BQU8sMEJBQTBCO0lBRXJDLFNBQVMsQ0FBQyxHQUFxQixFQUFFLElBQWlCO1FBRzlDLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFFMUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7K0dBUlUsMEJBQTBCO21IQUExQiwwQkFBMEI7OzRGQUExQiwwQkFBMEI7a0JBRHRDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBIdHRwRXZlbnQsIEh0dHBJbnRlcmNlcHRvciwgSHR0cEhhbmRsZXIsIEh0dHBSZXF1ZXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgV2l0aENyZWRlbnRpYWxzSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuXG4gIGludGVyY2VwdChyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKTpcbiAgICBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG5cbiAgICAgIHJlcSA9IHJlcS5jbG9uZSh7IHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KVxuXG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from "./models/error-settings.model";
|
|
2
|
+
export * from "./credentials.interceptor";
|
|
3
|
+
export * from "./request-header.interceptor";
|
|
4
|
+
export * from "./request-error.interceptor";
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2ludGVyY2VwdG9ycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxjQUFjLCtCQUErQixDQUFDO0FBRTlDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbHMvZXJyb3Itc2V0dGluZ3MubW9kZWxcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vY3JlZGVudGlhbHMuaW50ZXJjZXB0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlcXVlc3QtaGVhZGVyLmludGVyY2VwdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXF1ZXN0LWVycm9yLmludGVyY2VwdG9yXCI7XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export class ErrorDisplaySettings {
|
|
2
|
+
constructor(displayTime = 3 * 1000, position = 'top') {
|
|
3
|
+
this.displayTime = displayTime;
|
|
4
|
+
this.position = position;
|
|
5
|
+
}
|
|
6
|
+
static adapt(item) {
|
|
7
|
+
return new ErrorDisplaySettings((item?.displayTime) ? item.displayTime * 1000 : 3 * 1000, item?.position);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3Itc2V0dGluZ3MubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2ludGVyY2VwdG9ycy9tb2RlbHMvZXJyb3Itc2V0dGluZ3MubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxPQUFPLG9CQUFvQjtJQUUvQixZQUNTLGNBQWMsQ0FBQyxHQUFHLElBQUksRUFDdEIsV0FBVyxLQUFLO1FBRGhCLGdCQUFXLEdBQVgsV0FBVyxDQUFXO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVE7SUFDdEIsQ0FBQztJQUVKLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBVTtRQUVyQixPQUFPLElBQUksb0JBQW9CLENBQzdCLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFDeEQsSUFBSSxFQUFFLFFBQVEsQ0FDZixDQUFBO0lBRUgsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBFcnJvckRpc3BsYXlTZXR0aW5nc0ludGVyZmFjZSB7XG4gIGRpc3BsYXlUaW1lOiBudW1iZXJcbiAgcG9zaXRpb246IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgRXJyb3JEaXNwbGF5U2V0dGluZ3MgaW1wbGVtZW50cyBFcnJvckRpc3BsYXlTZXR0aW5nc0ludGVyZmFjZSB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpc3BsYXlUaW1lID0gMyAqIDEwMDAsXG4gICAgcHVibGljIHBvc2l0aW9uID0gJ3RvcCdcbiAgKSB7fVxuXG4gIHN0YXRpYyBhZGFwdChpdGVtPzogYW55KTogRXJyb3JEaXNwbGF5U2V0dGluZ3Mge1xuXG4gICAgcmV0dXJuIG5ldyBFcnJvckRpc3BsYXlTZXR0aW5ncyhcbiAgICAgIChpdGVtPy5kaXNwbGF5VGltZSkgPyBpdGVtLmRpc3BsYXlUaW1lICogMTAwMCA6IDMgKiAxMDAwLFxuICAgICAgaXRlbT8ucG9zaXRpb24sXG4gICAgKVxuXG4gIH1cblxufVxuIl19
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { catchError, throwError } from 'rxjs';
|
|
3
|
+
import { ToastColors, ToastDisplay, ToastMessageService } from 'toast-message';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class RequestErrorInterceptor {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.toastMessage = inject(ToastMessageService);
|
|
8
|
+
}
|
|
9
|
+
intercept(req, next) {
|
|
10
|
+
return next.handle(req).pipe(catchError((error) => {
|
|
11
|
+
const displayError = ToastDisplay.adapt({
|
|
12
|
+
message: 'This is a toast message. This is an Error!!',
|
|
13
|
+
action: 'OK',
|
|
14
|
+
color: ToastColors.SUCCESS,
|
|
15
|
+
icon: 'info',
|
|
16
|
+
duration: 5 * 1000, //5 seconds
|
|
17
|
+
});
|
|
18
|
+
if (error.status >= 400 && error.status < 500) {
|
|
19
|
+
displayError.color = ToastColors.ERROR;
|
|
20
|
+
displayError.message = `${error.status}: ${error.statusText}`;
|
|
21
|
+
console.error('Client Error:', {
|
|
22
|
+
status: error.status,
|
|
23
|
+
message: error.message,
|
|
24
|
+
error: error.error,
|
|
25
|
+
text: error.statusText,
|
|
26
|
+
});
|
|
27
|
+
this.toastMessage.toastMessage(displayError);
|
|
28
|
+
}
|
|
29
|
+
else if (error.status >= 500) {
|
|
30
|
+
displayError.color = ToastColors.ERROR;
|
|
31
|
+
displayError.message = `${error.status}: ${error.statusText}`;
|
|
32
|
+
console.error('Server Error:', {
|
|
33
|
+
status: error.status,
|
|
34
|
+
message: error.message,
|
|
35
|
+
error: error.error,
|
|
36
|
+
text: error.statusText,
|
|
37
|
+
});
|
|
38
|
+
this.toastMessage.toastMessage(displayError);
|
|
39
|
+
}
|
|
40
|
+
return throwError(() => error);
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RequestErrorInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
44
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RequestErrorInterceptor }); }
|
|
45
|
+
}
|
|
46
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RequestErrorInterceptor, decorators: [{
|
|
47
|
+
type: Injectable
|
|
48
|
+
}] });
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1lcnJvci5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvaW50ZXJjZXB0b3JzL3JlcXVlc3QtZXJyb3IuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFbEQsT0FBTyxFQUFjLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUE7O0FBRzlFLE1BQU0sT0FBTyx1QkFBdUI7SUFEcEM7UUFHRSxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0tBcUQzQztJQW5EQyxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUVoRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUUxQixVQUFVLENBQUMsQ0FBQyxLQUF3QixFQUFFLEVBQUU7WUFFdEMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztnQkFDdEMsT0FBTyxFQUFFLDZDQUE2QztnQkFDdEQsTUFBTSxFQUFFLElBQUk7Z0JBQ1osS0FBSyxFQUFFLFdBQVcsQ0FBQyxPQUFPO2dCQUMxQixJQUFJLEVBQUUsTUFBTTtnQkFDWixRQUFRLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxXQUFXO2FBQ2hDLENBQUMsQ0FBQTtZQUVGLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7Z0JBRTdDLFlBQVksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQTtnQkFDdEMsWUFBWSxDQUFDLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFBO2dCQUU3RCxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTtvQkFDN0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO29CQUNwQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87b0JBQ3RCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztvQkFDbEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxVQUFVO2lCQUN2QixDQUFDLENBQUE7Z0JBRUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUE7YUFFN0M7aUJBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRTtnQkFFOUIsWUFBWSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFBO2dCQUN0QyxZQUFZLENBQUMsT0FBTyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUE7Z0JBRTdELE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO29CQUM3QixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07b0JBQ3BCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztvQkFDdEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO29CQUNsQixJQUFJLEVBQUUsS0FBSyxDQUFDLFVBQVU7aUJBQ3ZCLENBQUMsQ0FBQTtnQkFFRixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQTthQUU3QztZQUVELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRWhDLENBQUMsQ0FBQyxDQUVILENBQUE7SUFDSCxDQUFDOytHQXJEVSx1QkFBdUI7bUhBQXZCLHVCQUF1Qjs7NEZBQXZCLHVCQUF1QjtrQkFEbkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBIdHRwRXZlbnQsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY2F0Y2hFcnJvciwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBUb2FzdENvbG9ycywgVG9hc3REaXNwbGF5LCBUb2FzdE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAndG9hc3QtbWVzc2FnZSdcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcXVlc3RFcnJvckludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcblxuICB0b2FzdE1lc3NhZ2UgPSBpbmplY3QoVG9hc3RNZXNzYWdlU2VydmljZSlcblxuICBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcblxuICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpLnBpcGUoXG5cbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGRpc3BsYXlFcnJvciA9IFRvYXN0RGlzcGxheS5hZGFwdCh7XG4gICAgICAgICAgbWVzc2FnZTogJ1RoaXMgaXMgYSB0b2FzdCBtZXNzYWdlLiBUaGlzIGlzIGFuIEVycm9yISEnLFxuICAgICAgICAgIGFjdGlvbjogJ09LJyxcbiAgICAgICAgICBjb2xvcjogVG9hc3RDb2xvcnMuU1VDQ0VTUyxcbiAgICAgICAgICBpY29uOiAnaW5mbycsXG4gICAgICAgICAgZHVyYXRpb246IDUgKiAxMDAwLCAvLzUgc2Vjb25kc1xuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChlcnJvci5zdGF0dXMgPj0gNDAwICYmIGVycm9yLnN0YXR1cyA8IDUwMCkge1xuXG4gICAgICAgICAgZGlzcGxheUVycm9yLmNvbG9yID0gVG9hc3RDb2xvcnMuRVJST1JcbiAgICAgICAgICBkaXNwbGF5RXJyb3IubWVzc2FnZSA9IGAke2Vycm9yLnN0YXR1c306ICR7ZXJyb3Iuc3RhdHVzVGV4dH1gXG5cbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdDbGllbnQgRXJyb3I6Jywge1xuICAgICAgICAgICAgc3RhdHVzOiBlcnJvci5zdGF0dXMsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLmVycm9yLFxuICAgICAgICAgICAgdGV4dDogZXJyb3Iuc3RhdHVzVGV4dCxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgdGhpcy50b2FzdE1lc3NhZ2UudG9hc3RNZXNzYWdlKGRpc3BsYXlFcnJvcilcblxuICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnN0YXR1cyA+PSA1MDApIHtcblxuICAgICAgICAgIGRpc3BsYXlFcnJvci5jb2xvciA9IFRvYXN0Q29sb3JzLkVSUk9SXG4gICAgICAgICAgZGlzcGxheUVycm9yLm1lc3NhZ2UgPSBgJHtlcnJvci5zdGF0dXN9OiAke2Vycm9yLnN0YXR1c1RleHR9YFxuXG4gICAgICAgICAgY29uc29sZS5lcnJvcignU2VydmVyIEVycm9yOicsIHtcbiAgICAgICAgICAgIHN0YXR1czogZXJyb3Iuc3RhdHVzLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvci5lcnJvcixcbiAgICAgICAgICAgIHRleHQ6IGVycm9yLnN0YXR1c1RleHQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHRoaXMudG9hc3RNZXNzYWdlLnRvYXN0TWVzc2FnZShkaXNwbGF5RXJyb3IpXG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKVxuXG4gICAgICB9KVxuXG4gICAgKVxuICB9XG5cbn1cblxuXG4iXX0=
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Subscription } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@ngx-translate/core";
|
|
5
|
+
export class RequestHeadersInterceptor {
|
|
6
|
+
get currentDate() {
|
|
7
|
+
const date = new Date();
|
|
8
|
+
const year = date.getFullYear();
|
|
9
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
10
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
11
|
+
return `${year}-${month}-${day}`;
|
|
12
|
+
}
|
|
13
|
+
constructor(translate) {
|
|
14
|
+
this.translate = translate;
|
|
15
|
+
this.subscriptions = new Subscription();
|
|
16
|
+
this.language = 'en-CA';
|
|
17
|
+
this.subscriptions.add(this.translate.onLangChange
|
|
18
|
+
.subscribe((params) => {
|
|
19
|
+
this.language = `${params.lang}-CA`;
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
intercept(request, next) {
|
|
23
|
+
request = request.clone({
|
|
24
|
+
setHeaders: {
|
|
25
|
+
'Content-Type': 'application/json',
|
|
26
|
+
'Accept-Language': this.language || 'en-CA',
|
|
27
|
+
'Current-Date': this.currentDate
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
return next.handle(request);
|
|
31
|
+
}
|
|
32
|
+
ngOnDestroy() {
|
|
33
|
+
this.subscriptions.unsubscribe();
|
|
34
|
+
}
|
|
35
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RequestHeadersInterceptor, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
36
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RequestHeadersInterceptor }); }
|
|
37
|
+
}
|
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RequestHeadersInterceptor, decorators: [{
|
|
39
|
+
type: Injectable
|
|
40
|
+
}], ctorParameters: function () { return [{ type: i1.TranslateService }]; } });
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1oZWFkZXIuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2ludGVyY2VwdG9ycy9yZXF1ZXN0LWhlYWRlci5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTzNDLE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQUloRCxNQUFNLE9BQU8seUJBQXlCO0lBS3BDLElBQUksV0FBVztRQUViLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFFdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQy9CLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUVuRCxPQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUVsQyxDQUFDO0lBRUQsWUFDVSxTQUEyQjtRQUEzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQWhCckMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO1FBQ2xDLGFBQVEsR0FBRyxPQUFPLENBQUE7UUFpQmhCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVk7YUFDMUIsU0FBUyxDQUFDLENBQUMsTUFBdUIsRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUE7UUFDdkMsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtJQUNILENBQUM7SUFFRCxTQUFTLENBQUMsT0FBeUIsRUFBRSxJQUFpQjtRQUVwRCxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN0QixVQUFVLEVBQUU7Z0JBQ1YsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPO2dCQUMzQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVc7YUFDakM7U0FDRixDQUFDLENBQUE7UUFFRixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7SUFFN0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ2xDLENBQUM7K0dBNUNVLHlCQUF5QjttSEFBekIseUJBQXlCOzs0RkFBekIseUJBQXlCO2tCQURyQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSHR0cFJlcXVlc3QsXG4gIEh0dHBIYW5kbGVyLFxuICBIdHRwRXZlbnQsXG4gIEh0dHBJbnRlcmNlcHRvcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMYW5nQ2hhbmdlRXZlbnQsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuXG4gIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKClcbiAgbGFuZ3VhZ2UgPSAnZW4tQ0EnXG5cbiAgZ2V0IGN1cnJlbnREYXRlKCkge1xuXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcblxuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpXG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpXG5cbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YFxuXG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZVxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50cmFuc2xhdGUub25MYW5nQ2hhbmdlXG4gICAgICAuc3Vic2NyaWJlKChwYXJhbXM6IExhbmdDaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBgJHtwYXJhbXMubGFuZ30tQ0FgXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIGludGVyY2VwdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcblxuICAgIHJlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHtcbiAgICAgIHNldEhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6IHRoaXMubGFuZ3VhZ2UgfHwgJ2VuLUNBJyxcbiAgICAgICAgJ0N1cnJlbnQtRGF0ZSc6IHRoaXMuY3VycmVudERhdGVcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpXG5cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpXG4gIH1cbn1cblxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export var DataType;
|
|
2
|
+
(function (DataType) {
|
|
3
|
+
DataType[DataType["ANY"] = 0] = "ANY";
|
|
4
|
+
DataType[DataType["ARRAY"] = 1] = "ARRAY";
|
|
5
|
+
DataType[DataType["OBJECT"] = 2] = "OBJECT";
|
|
6
|
+
})(DataType || (DataType = {}));
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10eXBlLmVudW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL21vZGVscy9kYXRhLXR5cGUuZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxRQUlYO0FBSkQsV0FBWSxRQUFRO0lBQ2xCLHFDQUFPLENBQUE7SUFDUCx5Q0FBSyxDQUFBO0lBQ0wsMkNBQU0sQ0FBQTtBQUNSLENBQUMsRUFKVyxRQUFRLEtBQVIsUUFBUSxRQUluQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERhdGFUeXBlIHtcbiAgQU5ZID0gMCxcbiAgQVJSQVksXG4gIE9CSkVDVFxufVxuIl19
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export class DatabaseStorage {
|
|
2
|
+
constructor(table = '', expiresIn) {
|
|
3
|
+
this.table = table;
|
|
4
|
+
this.expiresIn = expiresIn;
|
|
5
|
+
}
|
|
6
|
+
static adapt(item) {
|
|
7
|
+
return new DatabaseStorage(item?.table, item?.expiresIn);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2Utc3RvcmFnZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvbW9kZWxzL2RhdGFiYXNlLXN0b3JhZ2UubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsTUFBTSxPQUFPLGVBQWU7SUFFMUIsWUFDUyxRQUFRLEVBQUUsRUFDVixTQUFhO1FBRGIsVUFBSyxHQUFMLEtBQUssQ0FBSztRQUNWLGNBQVMsR0FBVCxTQUFTLENBQUk7SUFDbkIsQ0FBQztJQUVKLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBVTtRQUVyQixPQUFPLElBQUksZUFBZSxDQUN4QixJQUFJLEVBQUUsS0FBSyxFQUNYLElBQUksRUFBRSxTQUFTLENBQ2hCLENBQUE7SUFFSCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gXCIuL2RhdGEtdHlwZS5lbnVtXCJcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZVN0b3JhZ2VJbnRlcmZhY2Uge1xuICB0YWJsZTogc3RyaW5nXG4gIGV4cGlyZXNJbjogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZVN0b3JhZ2UgaW1wbGVtZW50cyBEYXRhYmFzZVN0b3JhZ2VJbnRlcmZhY2Uge1xuICBcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRhYmxlID0gJycsXG4gICAgcHVibGljIGV4cGlyZXNJbjogJycsXG4gICkge31cblxuICBzdGF0aWMgYWRhcHQoaXRlbT86IGFueSk6IERhdGFiYXNlU3RvcmFnZSB7XG5cbiAgICByZXR1cm4gbmV3IERhdGFiYXNlU3RvcmFnZShcbiAgICAgIGl0ZW0/LnRhYmxlLFxuICAgICAgaXRlbT8uZXhwaXJlc0luLFxuICAgIClcblxuICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './database-storage.model';
|
|
2
|
+
export * from './retry-options.model';
|
|
3
|
+
export * from './data-type.enum';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL21vZGVscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFBO0FBQ3hDLGNBQWMsdUJBQXVCLENBQUE7QUFFckMsY0FBYyxrQkFBa0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGF0YWJhc2Utc3RvcmFnZS5tb2RlbCdcbmV4cG9ydCAqIGZyb20gJy4vcmV0cnktb3B0aW9ucy5tb2RlbCdcblxuZXhwb3J0ICogZnJvbSAnLi9kYXRhLXR5cGUuZW51bSdcbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export class RetryOptions {
|
|
2
|
+
constructor(times = 0, delay = 0) {
|
|
3
|
+
this.times = times;
|
|
4
|
+
this.delay = delay;
|
|
5
|
+
}
|
|
6
|
+
static adapt(item) {
|
|
7
|
+
return new RetryOptions(item?.times ? Math.floor(item.times) : 0, item?.delay ? Math.floor(item.delay) : 0);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktb3B0aW9ucy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvbW9kZWxzL3JldHJ5LW9wdGlvbnMubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxPQUFPLFlBQVk7SUFFdkIsWUFDUyxRQUFRLENBQUMsRUFDVCxRQUFRLENBQUM7UUFEVCxVQUFLLEdBQUwsS0FBSyxDQUFJO1FBQ1QsVUFBSyxHQUFMLEtBQUssQ0FBSTtJQUNmLENBQUM7SUFFSixNQUFNLENBQUMsS0FBSyxDQUFDLElBQVU7UUFFckIsT0FBTyxJQUFJLFlBQVksQ0FDckIsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDeEMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDekMsQ0FBQTtJQUVILENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zSW50ZXJmYWNlIHtcbiAgdGltZXM/OiBudW1iZXIgLy8gdG90YWwgcmVxdWVzdCB0byBiZSBtYWRlIGluY2x1ZGluZyBpbml0aWFsIHJlcXVlc3RcbiAgZGVsYXk/OiBudW1iZXIgLy8gc2Vjb25kcyAoPD0gMyBkZWZhdWx0IDMgc2Vjb25kcylcbn1cblxuZXhwb3J0IGNsYXNzIFJldHJ5T3B0aW9ucyBpbXBsZW1lbnRzIFJldHJ5T3B0aW9uc0ludGVyZmFjZSB7XG4gIFxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdGltZXMgPSAwLFxuICAgIHB1YmxpYyBkZWxheSA9IDAsXG4gICkge31cblxuICBzdGF0aWMgYWRhcHQoaXRlbT86IGFueSk6IFJldHJ5T3B0aW9ucyB7XG5cbiAgICByZXR1cm4gbmV3IFJldHJ5T3B0aW9ucyhcbiAgICAgIGl0ZW0/LnRpbWVzID8gTWF0aC5mbG9vcihpdGVtLnRpbWVzKSA6IDAsXG4gICAgICBpdGVtPy5kZWxheSA/IE1hdGguZmxvb3IoaXRlbS5kZWxheSkgOiAwLFxuICAgIClcblxuICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// export * from "./database-manager-services/index";
|
|
2
|
+
export * from "./local-storage-manager-service/index";
|
|
3
|
+
export * from "./request-manager-services/index";
|
|
4
|
+
export * from "./request-manager-state-service/index";
|
|
5
|
+
export * from "./utils/index";
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLHFEQUFxRDtBQUNyRCxjQUFjLHVDQUF1QyxDQUFDO0FBRXRELGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyx1Q0FBdUMsQ0FBQztBQUV0RCxjQUFjLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLy8gZXhwb3J0ICogZnJvbSBcIi4vZGF0YWJhc2UtbWFuYWdlci1zZXJ2aWNlcy9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbG9jYWwtc3RvcmFnZS1tYW5hZ2VyLXNlcnZpY2UvaW5kZXhcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vcmVxdWVzdC1tYW5hZ2VyLXNlcnZpY2VzL2luZGV4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXF1ZXN0LW1hbmFnZXItc3RhdGUtc2VydmljZS9pbmRleFwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuXG4iXX0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from "./models/index";
|
|
2
|
+
export * from "./local-storage-manager.service";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2UtbWFuYWdlci1zZXJ2aWNlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZ0JBQWdCLENBQUE7QUFDOUIsY0FBYyxpQ0FBaUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL21vZGVscy9pbmRleFwiXG5leHBvcnQgKiBmcm9tIFwiLi9sb2NhbC1zdG9yYWdlLW1hbmFnZXIuc2VydmljZVwiOyJdfQ==
|