@ethlete/query 5.21.0 → 5.22.0
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/CHANGELOG.md +12 -0
- package/fesm2022/ethlete-query.mjs +419 -228
- package/fesm2022/ethlete-query.mjs.map +1 -1
- package/lib/experimental/http-request.d.ts +3 -1
- package/lib/experimental/index.d.ts +1 -0
- package/lib/experimental/paged-query.d.ts +35 -0
- package/lib/experimental/query-errors.d.ts +7 -1
- package/lib/experimental/query-stack.d.ts +4 -2
- package/package.json +5 -7
- package/esm2022/ethlete-query.mjs +0 -5
- package/esm2022/index.mjs +0 -21
- package/esm2022/lib/auth/auth-provider.types.mjs +0 -2
- package/esm2022/lib/auth/auth-provider.utils.mjs +0 -25
- package/esm2022/lib/auth/basic-auth-provider.mjs +0 -15
- package/esm2022/lib/auth/bearer-auth-provider.mjs +0 -168
- package/esm2022/lib/auth/custom-header-auth-provider.mjs +0 -12
- package/esm2022/lib/auth/index.mjs +0 -6
- package/esm2022/lib/class-validator/class-validator.types.mjs +0 -2
- package/esm2022/lib/class-validator/class-validator.utils.mjs +0 -4
- package/esm2022/lib/class-validator/index.mjs +0 -3
- package/esm2022/lib/devtools/components/query-devtools/index.mjs +0 -2
- package/esm2022/lib/devtools/components/query-devtools/query-devtools.component.mjs +0 -297
- package/esm2022/lib/devtools/pipes/index.mjs +0 -2
- package/esm2022/lib/devtools/pipes/query-short-name.pipe.mjs +0 -24
- package/esm2022/lib/devtools/utils/index.mjs +0 -2
- package/esm2022/lib/devtools/utils/query-client.utils.mjs +0 -13
- package/esm2022/lib/directives/index.mjs +0 -4
- package/esm2022/lib/directives/infinity-query-trigger.directive.mjs +0 -56
- package/esm2022/lib/directives/infinity-query.directive.mjs +0 -147
- package/esm2022/lib/directives/query.directive.mjs +0 -123
- package/esm2022/lib/entity/entity-store.mjs +0 -127
- package/esm2022/lib/entity/entity.types.mjs +0 -2
- package/esm2022/lib/entity/entity.utils.mjs +0 -29
- package/esm2022/lib/entity/index.mjs +0 -4
- package/esm2022/lib/experimental/bearer-auth-provider-config.mjs +0 -19
- package/esm2022/lib/experimental/bearer-auth-provider.mjs +0 -245
- package/esm2022/lib/experimental/http-request.mjs +0 -154
- package/esm2022/lib/experimental/index.mjs +0 -22
- package/esm2022/lib/experimental/query-client-config.mjs +0 -13
- package/esm2022/lib/experimental/query-client.mjs +0 -16
- package/esm2022/lib/experimental/query-creator-templates.mjs +0 -33
- package/esm2022/lib/experimental/query-creator.mjs +0 -28
- package/esm2022/lib/experimental/query-dependencies.mjs +0 -14
- package/esm2022/lib/experimental/query-errors.mjs +0 -61
- package/esm2022/lib/experimental/query-execute-utils.mjs +0 -54
- package/esm2022/lib/experimental/query-execute.mjs +0 -14
- package/esm2022/lib/experimental/query-features.mjs +0 -126
- package/esm2022/lib/experimental/query-repository.mjs +0 -97
- package/esm2022/lib/experimental/query-snapshot.mjs +0 -45
- package/esm2022/lib/experimental/query-stack.mjs +0 -65
- package/esm2022/lib/experimental/query-state.mjs +0 -20
- package/esm2022/lib/experimental/query-utils.mjs +0 -176
- package/esm2022/lib/experimental/query.mjs +0 -29
- package/esm2022/lib/experimental/secure-query-creator.mjs +0 -15
- package/esm2022/lib/experimental/secure-query-execute.mjs +0 -80
- package/esm2022/lib/experimental/secure-query.mjs +0 -33
- package/esm2022/lib/gql/gql.mjs +0 -23
- package/esm2022/lib/gql/index.mjs +0 -2
- package/esm2022/lib/infinite-query/index.mjs +0 -4
- package/esm2022/lib/infinite-query/infinity-query.mjs +0 -171
- package/esm2022/lib/infinite-query/infinity-query.types.mjs +0 -2
- package/esm2022/lib/infinite-query/infinity-query.utils.mjs +0 -3
- package/esm2022/lib/logger/index.mjs +0 -2
- package/esm2022/lib/logger/logger.mjs +0 -16
- package/esm2022/lib/query/index.mjs +0 -4
- package/esm2022/lib/query/query.mjs +0 -431
- package/esm2022/lib/query/query.types.mjs +0 -2
- package/esm2022/lib/query/query.utils.mjs +0 -253
- package/esm2022/lib/query-client/index.mjs +0 -4
- package/esm2022/lib/query-client/query-client.mjs +0 -80
- package/esm2022/lib/query-client/query-client.types.mjs +0 -2
- package/esm2022/lib/query-client/query-client.utils.mjs +0 -20
- package/esm2022/lib/query-creator/index.mjs +0 -3
- package/esm2022/lib/query-creator/query-creator.mjs +0 -55
- package/esm2022/lib/query-creator/query-creator.types.mjs +0 -2
- package/esm2022/lib/query-form/index.mjs +0 -4
- package/esm2022/lib/query-form/query-form.mjs +0 -412
- package/esm2022/lib/query-form/query-form.types.mjs +0 -2
- package/esm2022/lib/query-form/query-form.utils.mjs +0 -97
- package/esm2022/lib/query-store/index.mjs +0 -2
- package/esm2022/lib/query-store/query-store.mjs +0 -144
- package/esm2022/lib/request/index.mjs +0 -4
- package/esm2022/lib/request/request.mjs +0 -196
- package/esm2022/lib/request/request.types.mjs +0 -2
- package/esm2022/lib/request/request.util.mjs +0 -252
- package/esm2022/lib/symfony/index.mjs +0 -3
- package/esm2022/lib/symfony/symfony.types.mjs +0 -2
- package/esm2022/lib/symfony/symfony.utils.mjs +0 -31
- package/esm2022/lib/utils/data.utils.mjs +0 -138
- package/esm2022/lib/utils/deep-freeze.util.mjs +0 -17
- package/esm2022/lib/utils/def.util.mjs +0 -8
- package/esm2022/lib/utils/index.mjs +0 -4
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
2
|
-
import { computed, effect, isDevMode, signal, untracked } from '@angular/core';
|
|
3
|
-
import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { deleteCookie as coreDeleteCookie, getCookie, getDomain, isObject, setCookie } from '@ethlete/core';
|
|
5
|
-
import { of, switchMap, tap, timer } from 'rxjs';
|
|
6
|
-
import { decryptBearer } from '../auth';
|
|
7
|
-
import { bearerExpiresInPropertyNotNumber, cookieLoginTriedButCookieDisabled, defaultResponseTransformerResponseNotContainingAccessToken, defaultResponseTransformerResponseNotContainingRefreshToken, defaultResponseTransformerResponseNotObject, disableCookieCalledWithoutCookieConfig, enableCookieCalledWithoutCookieConfig, loginCalledWithoutConfig, loginWithTokenCalledWithoutConfig, refreshTokenCalledWithoutConfig, selectRoleCalledWithoutConfig, unableToDecryptBearerToken, } from './query-errors';
|
|
8
|
-
const defaultResponseTransformer = (response) => {
|
|
9
|
-
if (!isObject(response)) {
|
|
10
|
-
throw defaultResponseTransformerResponseNotObject(typeof response);
|
|
11
|
-
}
|
|
12
|
-
if (!('accessToken' in response)) {
|
|
13
|
-
throw defaultResponseTransformerResponseNotContainingAccessToken();
|
|
14
|
-
}
|
|
15
|
-
if (!('refreshToken' in response)) {
|
|
16
|
-
throw defaultResponseTransformerResponseNotContainingRefreshToken();
|
|
17
|
-
}
|
|
18
|
-
return response;
|
|
19
|
-
};
|
|
20
|
-
const FIVE_MINUTES = 5 * 60 * 1000;
|
|
21
|
-
const createAuthProviderQuery = (config, authProviderConfig) => {
|
|
22
|
-
const query = config.queryCreator();
|
|
23
|
-
const triggeredInternally = signal(false);
|
|
24
|
-
const tokens = computed(() => {
|
|
25
|
-
const res = query.response();
|
|
26
|
-
if (!res)
|
|
27
|
-
return null;
|
|
28
|
-
const transformed = config.responseTransformer?.(res) ?? defaultResponseTransformer(res);
|
|
29
|
-
const bearerValue = decryptBearer(transformed.accessToken);
|
|
30
|
-
if (!bearerValue)
|
|
31
|
-
throw unableToDecryptBearerToken(transformed.accessToken);
|
|
32
|
-
return {
|
|
33
|
-
bearer: bearerValue,
|
|
34
|
-
tokens: transformed,
|
|
35
|
-
};
|
|
36
|
-
});
|
|
37
|
-
const expiresIn = computed(() => {
|
|
38
|
-
const res = tokens();
|
|
39
|
-
if (!res)
|
|
40
|
-
return null;
|
|
41
|
-
const expiresIn = res.bearer[authProviderConfig.expiresInPropertyName ?? 'exp'];
|
|
42
|
-
const refreshBuffer = authProviderConfig.refreshBuffer ?? FIVE_MINUTES;
|
|
43
|
-
if (typeof expiresIn !== 'number') {
|
|
44
|
-
throw bearerExpiresInPropertyNotNumber(expiresIn);
|
|
45
|
-
}
|
|
46
|
-
// const dummyRemainingTime = (query.lastTimeExecutedAt() ?? 0) + 5000 - new Date().getTime();
|
|
47
|
-
const remainingTime = new Date(expiresIn * 1000).getTime() - refreshBuffer - new Date().getTime();
|
|
48
|
-
return remainingTime;
|
|
49
|
-
});
|
|
50
|
-
const execute = (newArgs, options) => {
|
|
51
|
-
query.execute({ args: newArgs });
|
|
52
|
-
triggeredInternally.set(options?.triggeredInternally ?? false);
|
|
53
|
-
};
|
|
54
|
-
return {
|
|
55
|
-
execute,
|
|
56
|
-
query,
|
|
57
|
-
tokens,
|
|
58
|
-
expiresIn,
|
|
59
|
-
triggeredInternally: triggeredInternally.asReadonly(),
|
|
60
|
-
};
|
|
61
|
-
};
|
|
62
|
-
export const createBearerAuthProvider = (options) => {
|
|
63
|
-
const cookieEnabled = signal(options.cookie === undefined ? false : (options.cookie.enabled ?? true));
|
|
64
|
-
const cookieOptions = {
|
|
65
|
-
expiresInDays: 30,
|
|
66
|
-
name: 'etAuth',
|
|
67
|
-
path: '/',
|
|
68
|
-
sameSite: 'lax',
|
|
69
|
-
domain: getDomain() ?? 'localhost',
|
|
70
|
-
refreshArgsTransformer: (token) => ({ body: { token } }),
|
|
71
|
-
...(options.cookie ?? {}),
|
|
72
|
-
};
|
|
73
|
-
const loginQuery = options.login ? createAuthProviderQuery(options.login, options) : null;
|
|
74
|
-
const tokenLoginQuery = options.tokenLogin ? createAuthProviderQuery(options.tokenLogin, options) : null;
|
|
75
|
-
const tokenRefreshQuery = options.tokenRefresh ? createAuthProviderQuery(options.tokenRefresh, options) : null;
|
|
76
|
-
const selectRoleQuery = options.selectRole ? createAuthProviderQuery(options.selectRole, options) : null;
|
|
77
|
-
const queries = [
|
|
78
|
-
{ type: 'login', query: loginQuery },
|
|
79
|
-
{ type: 'tokenLogin', query: tokenLoginQuery },
|
|
80
|
-
{ type: 'tokenRefresh', query: tokenRefreshQuery },
|
|
81
|
-
{ type: 'selectRole', query: selectRoleQuery },
|
|
82
|
-
];
|
|
83
|
-
const latestExecutedQuery = computed(() => {
|
|
84
|
-
const relevantQueries = queries.filter((q) => q.query && q.query.query.lastTimeExecutedAt() !== null);
|
|
85
|
-
return findMostRecentQuery(relevantQueries);
|
|
86
|
-
});
|
|
87
|
-
const tokens = computed(() => {
|
|
88
|
-
const query = latestExecutedQuery();
|
|
89
|
-
return query?.query?.tokens()?.tokens ?? null;
|
|
90
|
-
});
|
|
91
|
-
toObservable(computed(() => {
|
|
92
|
-
const query = latestExecutedQuery();
|
|
93
|
-
const expiresIn = query?.query?.expiresIn() ?? null;
|
|
94
|
-
const tokens = query?.query?.tokens() ?? null;
|
|
95
|
-
return { expiresIn, tokens, query };
|
|
96
|
-
}))
|
|
97
|
-
.pipe(switchMap((res) => {
|
|
98
|
-
if (!res.tokens || res.expiresIn === null || !options.tokenRefresh)
|
|
99
|
-
return of(null);
|
|
100
|
-
const expIn = res.expiresIn;
|
|
101
|
-
const tokens = res.tokens;
|
|
102
|
-
if (!expIn || !tokens)
|
|
103
|
-
return of(null);
|
|
104
|
-
return timer(expIn).pipe(tap(() => refreshToken({
|
|
105
|
-
...cookieOptions.refreshArgsTransformer(tokens.tokens.refreshToken),
|
|
106
|
-
}, { triggeredInternally: true })));
|
|
107
|
-
}), takeUntilDestroyed())
|
|
108
|
-
.subscribe();
|
|
109
|
-
const latestNonInternalQuery = signal(null);
|
|
110
|
-
effect(() => {
|
|
111
|
-
const relevantQueries = queries.filter((q) => q.query && !q.query.triggeredInternally() && q.query.query.lastTimeExecutedAt() !== null);
|
|
112
|
-
const lastQuery = findMostRecentQuery(relevantQueries);
|
|
113
|
-
untracked(() => {
|
|
114
|
-
if (!lastQuery || !lastQuery.query?.query)
|
|
115
|
-
return;
|
|
116
|
-
latestNonInternalQuery.set({
|
|
117
|
-
type: lastQuery.type,
|
|
118
|
-
...lastQuery.query.query.createSnapshot(),
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
// Cookie writing
|
|
123
|
-
effect(() => {
|
|
124
|
-
const isCookieEnabled = cookieEnabled();
|
|
125
|
-
const res = latestExecutedQuery();
|
|
126
|
-
const error = res?.query?.query.error();
|
|
127
|
-
if (!isCookieEnabled || (error && error.status === 401)) {
|
|
128
|
-
deleteCookie();
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
if (!res?.query)
|
|
132
|
-
return;
|
|
133
|
-
const { tokens } = res.query;
|
|
134
|
-
const rt = tokens()?.tokens.refreshToken;
|
|
135
|
-
if (!rt)
|
|
136
|
-
return;
|
|
137
|
-
writeCookie(rt);
|
|
138
|
-
});
|
|
139
|
-
const login = (args) => {
|
|
140
|
-
if (!loginQuery) {
|
|
141
|
-
throw loginCalledWithoutConfig();
|
|
142
|
-
}
|
|
143
|
-
loginQuery.execute(args);
|
|
144
|
-
return loginQuery.query.createSnapshot();
|
|
145
|
-
};
|
|
146
|
-
const loginWithToken = (args) => {
|
|
147
|
-
if (!tokenLoginQuery) {
|
|
148
|
-
throw loginWithTokenCalledWithoutConfig();
|
|
149
|
-
}
|
|
150
|
-
tokenLoginQuery.execute(args);
|
|
151
|
-
return tokenLoginQuery.query.createSnapshot();
|
|
152
|
-
};
|
|
153
|
-
const refreshToken = (args, options) => {
|
|
154
|
-
if (!tokenRefreshQuery) {
|
|
155
|
-
throw refreshTokenCalledWithoutConfig();
|
|
156
|
-
}
|
|
157
|
-
tokenRefreshQuery.execute(args, { triggeredInternally: options?.triggeredInternally });
|
|
158
|
-
return tokenRefreshQuery.query.createSnapshot();
|
|
159
|
-
};
|
|
160
|
-
const selectRole = (args) => {
|
|
161
|
-
if (!selectRoleQuery) {
|
|
162
|
-
throw selectRoleCalledWithoutConfig();
|
|
163
|
-
}
|
|
164
|
-
selectRoleQuery.execute(args);
|
|
165
|
-
return selectRoleQuery.query.createSnapshot();
|
|
166
|
-
};
|
|
167
|
-
const logout = () => {
|
|
168
|
-
deleteCookie();
|
|
169
|
-
loginQuery?.query.execute.reset();
|
|
170
|
-
tokenLoginQuery?.query.execute.reset();
|
|
171
|
-
tokenRefreshQuery?.query.execute.reset();
|
|
172
|
-
selectRoleQuery?.query.execute.reset();
|
|
173
|
-
latestNonInternalQuery.set(null);
|
|
174
|
-
};
|
|
175
|
-
const enableCookie = () => {
|
|
176
|
-
if (isDevMode() && !options.cookie) {
|
|
177
|
-
throw enableCookieCalledWithoutCookieConfig();
|
|
178
|
-
}
|
|
179
|
-
cookieEnabled.set(true);
|
|
180
|
-
};
|
|
181
|
-
const disableCookie = () => {
|
|
182
|
-
if (isDevMode() && !options.cookie) {
|
|
183
|
-
throw disableCookieCalledWithoutCookieConfig();
|
|
184
|
-
}
|
|
185
|
-
cookieEnabled.set(false);
|
|
186
|
-
deleteCookie();
|
|
187
|
-
};
|
|
188
|
-
const tryLoginWithCookie = () => {
|
|
189
|
-
const isCookieEnabled = cookieEnabled();
|
|
190
|
-
if (!isCookieEnabled) {
|
|
191
|
-
if (isDevMode()) {
|
|
192
|
-
throw cookieLoginTriedButCookieDisabled();
|
|
193
|
-
}
|
|
194
|
-
return false;
|
|
195
|
-
}
|
|
196
|
-
const cookie = getCookie(cookieOptions.name);
|
|
197
|
-
if (!cookie) {
|
|
198
|
-
return false;
|
|
199
|
-
}
|
|
200
|
-
refreshToken(cookieOptions.refreshArgsTransformer(cookie));
|
|
201
|
-
return true;
|
|
202
|
-
};
|
|
203
|
-
const writeCookie = (refreshToken) => {
|
|
204
|
-
const { name, expiresInDays, domain, path, sameSite } = cookieOptions;
|
|
205
|
-
setCookie(name, refreshToken, expiresInDays, domain, path, sameSite);
|
|
206
|
-
};
|
|
207
|
-
const deleteCookie = () => {
|
|
208
|
-
const { name, path, domain } = cookieOptions;
|
|
209
|
-
coreDeleteCookie(name, path, domain);
|
|
210
|
-
};
|
|
211
|
-
const findMostRecentQuery = (queriesToSearch) => {
|
|
212
|
-
return queriesToSearch.reduce((acc, curr) => {
|
|
213
|
-
if (!acc)
|
|
214
|
-
return curr;
|
|
215
|
-
const accExp = acc.query?.query.lastTimeExecutedAt() ?? null;
|
|
216
|
-
const currExp = curr.query?.query.lastTimeExecutedAt() ?? null;
|
|
217
|
-
if (currExp === null || accExp === null)
|
|
218
|
-
return acc;
|
|
219
|
-
return accExp > currExp ? acc : curr;
|
|
220
|
-
}, null);
|
|
221
|
-
};
|
|
222
|
-
const bearerAuthProvider = {
|
|
223
|
-
login,
|
|
224
|
-
loginWithToken,
|
|
225
|
-
refreshToken,
|
|
226
|
-
selectRole,
|
|
227
|
-
logout,
|
|
228
|
-
enableCookie,
|
|
229
|
-
disableCookie,
|
|
230
|
-
tryLoginWithCookie,
|
|
231
|
-
latestExecutedQuery: latestNonInternalQuery.asReadonly(),
|
|
232
|
-
tokens,
|
|
233
|
-
};
|
|
234
|
-
if (cookieEnabled()) {
|
|
235
|
-
tryLoginWithCookie();
|
|
236
|
-
}
|
|
237
|
-
return bearerAuthProvider;
|
|
238
|
-
};
|
|
239
|
-
export const provideBearerAuthProvider = (config) => {
|
|
240
|
-
return {
|
|
241
|
-
provide: config.token,
|
|
242
|
-
useFactory: () => createBearerAuthProvider(config),
|
|
243
|
-
};
|
|
244
|
-
};
|
|
245
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVhcmVyLWF1dGgtcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvZXhwZXJpbWVudGFsL2JlYXJlci1hdXRoLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUd6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFlBQVksSUFBSSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBUXhDLE9BQU8sRUFDTCxnQ0FBZ0MsRUFDaEMsaUNBQWlDLEVBQ2pDLDBEQUEwRCxFQUMxRCwyREFBMkQsRUFDM0QsMkNBQTJDLEVBQzNDLHNDQUFzQyxFQUN0QyxxQ0FBcUMsRUFDckMsd0JBQXdCLEVBQ3hCLGlDQUFpQyxFQUNqQywrQkFBK0IsRUFDL0IsNkJBQTZCLEVBQzdCLDBCQUEwQixHQUMzQixNQUFNLGdCQUFnQixDQUFDO0FBaUh4QixNQUFNLDBCQUEwQixHQUFHLENBQUksUUFBVyxFQUFFLEVBQUU7SUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sMkNBQTJDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsSUFBSSxDQUFDLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxF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d0Y7UUFDOUcsS0FBSztRQUNMLGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLE1BQU07UUFDTixZQUFZO1FBQ1osYUFBYTtRQUNiLGtCQUFrQjtRQUNsQixtQkFBbUIsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUU7UUFDeEQsTUFBTTtLQUNQLENBQUM7SUFFRixJQUFJLGFBQWEsRUFBRSxFQUFFLENBQUM7UUFDcEIsa0JBQWtCLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQU12QyxNQUFpRyxFQUNqRyxFQUFFO0lBQ0YsT0FBTztRQUNMLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSztRQUNyQixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDO0tBQ25ELENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb24gKi9cblxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBjb21wdXRlZCwgZWZmZWN0LCBpc0Rldk1vZGUsIFNpZ25hbCwgc2lnbmFsLCB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgZGVsZXRlQ29va2llIGFzIGNvcmVEZWxldGVDb29raWUsIGdldENvb2tpZSwgZ2V0RG9tYWluLCBpc09iamVjdCwgc2V0Q29va2llIH0gZnJvbSAnQGV0aGxldGUvY29yZSc7XG5pbXBvcnQgeyBvZiwgc3dpdGNoTWFwLCB0YXAsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWNyeXB0QmVhcmVyIH0gZnJvbSAnLi4vYXV0aCc7XG5pbXBvcnQge1xuICBCZWFyZXJBdXRoUHJvdmlkZXJDb25maWcsXG4gIEJlYXJlckF1dGhQcm92aWRlckNvb2tpZUNvbmZpZyxcbiAgQmVhcmVyQXV0aFByb3ZpZGVyUm91dGVDb25maWcsXG4gIEJlYXJlckF1dGhQcm92aWRlclRva2Vucyxcbn0gZnJvbSAnLi9iZWFyZXItYXV0aC1wcm92aWRlci1jb25maWcnO1xuaW1wb3J0IHsgUXVlcnlBcmdzLCBRdWVyeVNuYXBzaG90LCBSZXF1ZXN0QXJncyB9IGZyb20gJy4vcXVlcnknO1xuaW1wb3J0IHtcbiAgYmVhcmVyRXhwaXJlc0luUHJvcGVydHlOb3ROdW1iZXIsXG4gIGNvb2tpZUxvZ2luVHJpZWRCdXRDb29raWVEaXNhYmxlZCxcbiAgZGVmYXVsdFJlc3BvbnNlVHJhbnNmb3JtZXJSZXNwb25zZU5vdENvbnRhaW5pbmdBY2Nlc3NUb2tlbixcbiAgZGVmYXVsdFJlc3BvbnNlVHJhbnNmb3JtZXJSZXNwb25zZU5vdENvbnRhaW5pbmdSZWZyZXNoVG9rZW4sXG4gIGRlZmF1bHRSZXNwb25zZVRyYW5zZm9ybWVyUmVzcG9uc2VOb3RPYmplY3QsXG4gIGRpc2FibGVDb29raWVDYWxsZWRXaXRob3V0Q29va2llQ29uZmlnLFxuICBlbmFibGVDb29raWVDYWxsZWRXaXRob3V0Q29va2llQ29uZmlnLFxuICBsb2dpbkNhbGxlZFdpdGhvdXRDb25maWcsXG4gIGxvZ2luV2l0aFRva2VuQ2FsbGVkV2l0aG91dENvbmZpZyxcbiAgcmVmcmVzaFRva2VuQ2FsbGVkV2l0aG91dENvbmZpZyxcbiAgc2VsZWN0Um9sZUNhbGxlZFdpdGhvdXRDb25maWcsXG4gIHVuYWJsZVRvRGVjcnlwdEJlYXJlclRva2VuLFxufSBmcm9tICcuL3F1ZXJ5LWVycm9ycyc7XG5cbnR5cGUgSW50ZXJuYWxRdWVyeUV4ZWN1dGVPcHRpb25zID0ge1xuICB0cmlnZ2VyZWRJbnRlcm5hbGx5PzogYm9vbGVhbjtcbn07XG5cbnR5cGUgQXV0aFByb3ZpZGVyUXVlcnlXaXRoVHlwZTxcbiAgVExvZ2luQXJncyBleHRlbmRzIFF1ZXJ5QXJncyxcbiAgVFRva2VuTG9naW5BcmdzIGV4dGVuZHMgUXVlcnlBcmdzLFxuICBUVG9rZW5SZWZyZXNoQXJncyBleHRlbmRzIFF1ZXJ5QXJncyxcbiAgVFNlbGVjdFJvbGVBcmdzIGV4dGVuZHMgUXVlcnlBcmdzLFxuPiA9XG4gIHwge1xuICAgICAgdHlwZTogJ2xvZ2luJztcbiAgICAgIHF1ZXJ5OiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVBdXRoUHJvdmlkZXJRdWVyeTxUTG9naW5BcmdzPj4gfCBudWxsO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiAndG9rZW5Mb2dpbic7XG4gICAgICBxdWVyeTogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQXV0aFByb3ZpZGVyUXVlcnk8VFRva2VuTG9naW5BcmdzPj4gfCBudWxsO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiAndG9rZW5SZWZyZXNoJztcbiAgICAgIHF1ZXJ5OiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVBdXRoUHJvdmlkZXJRdWVyeTxUVG9rZW5SZWZyZXNoQXJncz4+IHwgbnVsbDtcbiAgICB9XG4gIHwge1xuICAgICAgdHlwZTogJ3NlbGVjdFJvbGUnO1xuICAgICAgcXVlcnk6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUF1dGhQcm92aWRlclF1ZXJ5PFRTZWxlY3RSb2xlQXJncz4+IHwgbnVsbDtcbiAgICB9O1xuXG50eXBlIFF1ZXJ5U25hcHNob3RXaXRoVHlwZTxcbiAgVExvZ2luQXJncyBleHRlbmRzIFF1ZXJ5QXJncyxcbiAgVFRva2VuTG9naW5BcmdzIGV4dGVuZHMgUXVlcnlBcmdzLFxuICBUVG9rZW5SZWZyZXNoQXJncyBleHRlbmRzIFF1ZXJ5QXJncyxcbiAgVFNlbGVjdFJvbGVBcmdzIGV4dGVuZHMgUXVlcnlBcmdzLFxuPiA9XG4gIHwgKHtcbiAgICAgIHR5cGU6ICdsb2dpbic7XG4gICAgfSAmIFF1ZXJ5U25hcHNob3Q8VExvZ2luQXJncz4pXG4gIHwgKHtcbiAgICAgIHR5cGU6ICd0b2tlbkxvZ2luJztcbiAgICB9ICYgUXVlcnlTbmFwc2hvdDxUVG9rZW5Mb2dpbkFyZ3M+KVxuICB8ICh7XG4gICAgICB0eXBlOiAndG9rZW5SZWZyZXNoJztcbiAgICB9ICYgUXVlcnlTbmFwc2hvdDxUVG9rZW5SZWZyZXNoQXJncz4pXG4gIHwgKHtcbiAgICAgIHR5cGU6ICdzZWxlY3RSb2xlJztcbiAgICB9ICYgUXVlcnlTbmFwc2hvdDxUU2VsZWN0Um9sZUFyZ3M+KTtcblxuZXhwb3J0IHR5cGUgQmVhcmVyQXV0aFByb3ZpZGVyPFxuICBUTG9naW5BcmdzIGV4dGVuZHMgUXVlcnlBcmdzLFxuICBUVG9rZW5Mb2dpbkFyZ3MgZXh0ZW5kcyBRdWVyeUFyZ3MsXG4gIFRUb2tlblJlZnJlc2hBcmdzIGV4dGVuZHMgUXVlcnlBcmdzLFxuICBUU2VsZWN0Um9sZUFyZ3MgZXh0ZW5kcyBRdWVyeUFyZ3MsXG4+ID0ge1xuICAvKipcbiAgICogTG9ncyBpbiB0aGUgdXNlciB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuICAgKi9cbiAgbG9naW46IChhcmdzOiBSZXF1ZXN0QXJnczxUTG9naW5BcmdzPikgPT4gUXVlcnlTbmFwc2hvdDxUTG9naW5BcmdzPjtcblxuICAvKipcbiAgICogTG9ncyBpbiB0aGUgdXNlciB3aXRoIHRoZSBnaXZlbiB0b2tlbi5cbiAgICovXG4gIGxvZ2luV2l0aFRva2VuOiAoYXJnczogUmVxdWVzdEFyZ3M8VFRva2VuTG9naW5BcmdzPikgPT4gUXVlcnlTbmFwc2hvdDxUVG9rZW5Mb2dpbkFyZ3M+O1xuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgdGhlIHRva2VuIHdpdGggdGhlIGdpdmVuIHJlZnJlc2ggdG9rZW4uXG4gICAqL1xuICByZWZyZXNoVG9rZW46IChhcmdzOiBSZXF1ZXN0QXJnczxUVG9rZW5SZWZyZXNoQXJncz4pID0+IFF1ZXJ5U25hcHNob3Q8VFRva2VuUmVmcmVzaEFyZ3M+O1xuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSByb2xlIGZvciB0aGUgdXNlci5cbiAgICovXG4gIHNlbGVjdFJvbGU6IChhcmdzOiBSZXF1ZXN0QXJnczxUU2VsZWN0Um9sZUFyZ3M+KSA9PiBRdWVyeVNuYXBzaG90PFRTZWxlY3RSb2xlQXJncz47XG5cbiAgLyoqXG4gICAqIExvZ3Mgb3V0IHRoZSB1c2VyIGFuZCByZW1vdmVzIHRoZSBjb29raWUuXG4gICAqL1xuICBsb2dvdXQ6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgY29va2llIHVzYWdlIGZvciB0aGUgYXV0aCBwcm92aWRlci5cbiAgICovXG4gIGVuYWJsZUNvb2tpZTogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogRGlzYWJsZXMgY29va2llIHVzYWdlIGZvciB0aGUgYXV0aCBwcm92aWRlciBhbmQgcmVtb3ZlcyB0aGUgY29va2llLlxuICAgKi9cbiAgZGlzYWJsZUNvb2tpZTogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogVHJpZXMgdG8gbG9naW4gd2l0aCB0aGUgZ2l2ZW4gY29va2llIGNvbmZpZy5cbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYSBjb29raWUgd2FzIGZvdW5kLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHRyeUxvZ2luV2l0aENvb2tpZTogKCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxhdGVzdCBleGVjdXRlZCBxdWVyeSB0aGF0IHdhcyBub3QgdHJpZ2dlcmVkIGludGVybmFsbHkuXG4gICAqL1xuICBsYXRlc3RFeGVjdXRlZFF1ZXJ5OiBTaWduYWw8UXVlcnlTbmFwc2hvdFdpdGhUeXBlPFxuICAgIFRMb2dpbkFyZ3MsXG4gICAgVFRva2VuTG9naW5BcmdzLFxuICAgIFRUb2tlblJlZnJlc2hBcmdzLFxuICAgIFRTZWxlY3RSb2xlQXJnc1xuICA+IHwgbnVsbD47XG5cbiAgb25SZWZyZXNoRmFpbHVyZT86IChjYWxsYmFjazogKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdm9pZCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQSBzaWduYWwgdGhhdCBjb250YWlucyB0aGUgY3VycmVudCBhY2Nlc3MgYW5kIHJlZnJlc2ggdG9rZW5zLlxuICAgKi9cbiAgdG9rZW5zOiBTaWduYWw8QmVhcmVyQXV0aFByb3ZpZGVyVG9rZW5zIHwgbnVsbD47XG59O1xuXG5jb25zdCBkZWZhdWx0UmVzcG9uc2VUcmFuc2Zvcm1lciA9IDxUPihyZXNwb25zZTogVCkgPT4ge1xuICBpZiAoIWlzT2JqZWN0KHJlc3BvbnNlKSkge1xuICAgIHRocm93IGRlZmF1bHRSZXNwb25zZVRyYW5zZm9ybWVyUmVzcG9uc2VOb3RPYmplY3QodHlwZW9mIHJlc3BvbnNlKTtcbiAgfVxuXG4gIGlmICghKCdhY2Nlc3NUb2tlbicgaW4gcmVzcG9uc2UpKSB7XG4gICAgdGhyb3cgZGVmYXVsdFJlc3BvbnNlVHJhbnNmb3JtZXJSZXNwb25zZU5vdENvbnRhaW5pbmdBY2Nlc3NUb2tlbigpO1xuICB9XG5cbiAgaWYgKCEoJ3JlZnJlc2hUb2tlbicgaW4gcmVzcG9uc2UpKSB7XG4gICAgdGhyb3cgZGVmYXVsdFJlc3BvbnNlVHJhbnNmb3JtZXJSZXNwb25zZU5vdENvbnRhaW5pbmdSZWZyZXNoVG9rZW4oKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZSBhcyB1bmtub3duIGFzIEJlYXJlckF1dGhQcm92aWRlclRva2Vucztcbn07XG5cbmNvbnN0IEZJVkVfTUlOVVRFUyA9IDUgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGNyZWF0ZUF1dGhQcm92aWRlclF1ZXJ5ID0gPFQgZXh0ZW5kcyBRdWVyeUFyZ3M+KFxuICBjb25maWc6IEJlYXJlckF1dGhQcm92aWRlclJvdXRlQ29uZmlnPFQ+LFxuICBhdXRoUHJvdmlkZXJDb25maWc6IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSB0b2tlbiBleHBpcmVzIHdoZW4gdGhlIHJlZnJlc2ggc2hvdWxkIGJlIHRyaWdnZXJlZC5cbiAgICAgKiBAZGVmYXVsdCAzMDAwMDAgLy8gKDUgbWludXRlcylcbiAgICAgKi9cbiAgICByZWZyZXNoQnVmZmVyPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyZXMgaW4gcHJvcGVydHkgbmFtZSBpbnNpZGUgdGhlIGp3dCBib2R5XG4gICAgICogQGRlZmF1bHQgJ2V4cCdcbiAgICAgKi9cbiAgICBleHBpcmVzSW5Qcm9wZXJ0eU5hbWU/OiBzdHJpbmc7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgcXVlcnkgPSBjb25maWcucXVlcnlDcmVhdG9yKCk7XG5cbiAgY29uc3QgdHJpZ2dlcmVkSW50ZXJuYWxseSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgY29uc3QgdG9rZW5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IHF1ZXJ5LnJlc3BvbnNlKCk7XG5cbiAgICBpZiAoIXJlcykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IGNvbmZpZy5yZXNwb25zZVRyYW5zZm9ybWVyPy4ocmVzKSA/PyBkZWZhdWx0UmVzcG9uc2VUcmFuc2Zvcm1lcihyZXMpO1xuXG4gICAgY29uc3QgYmVhcmVyVmFsdWUgPSBkZWNyeXB0QmVhcmVyKHRyYW5zZm9ybWVkLmFjY2Vzc1Rva2VuKTtcblxuICAgIGlmICghYmVhcmVyVmFsdWUpIHRocm93IHVuYWJsZVRvRGVjcnlwdEJlYXJlclRva2VuKHRyYW5zZm9ybWVkLmFjY2Vzc1Rva2VuKTtcblxuICAgIHJldHVybiB7XG4gICAgICBiZWFyZXI6IGJlYXJlclZhbHVlLFxuICAgICAgdG9rZW5zOiB0cmFuc2Zvcm1lZCxcbiAgICB9O1xuICB9KTtcblxuICBjb25zdCBleHBpcmVzSW4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gdG9rZW5zKCk7XG5cbiAgICBpZiAoIXJlcykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBleHBpcmVzSW4gPSByZXMuYmVhcmVyW2F1dGhQcm92aWRlckNvbmZpZy5leHBpcmVzSW5Qcm9wZXJ0eU5hbWUgPz8gJ2V4cCddO1xuICAgIGNvbnN0IHJlZnJlc2hCdWZmZXIgPSBhdXRoUHJvdmlkZXJDb25maWcucmVmcmVzaEJ1ZmZlciA/PyBGSVZFX01JTlVURVM7XG5cbiAgICBpZiAodHlwZW9mIGV4cGlyZXNJbiAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IGJlYXJlckV4cGlyZXNJblByb3BlcnR5Tm90TnVtYmVyKGV4cGlyZXNJbik7XG4gICAgfVxuXG4gICAgLy8gY29uc3QgZHVtbXlSZW1haW5pbmdUaW1lID0gKHF1ZXJ5Lmxhc3RUaW1lRXhlY3V0ZWRBdCgpID8/IDApICsgNTAwMCAtIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGNvbnN0IHJlbWFpbmluZ1RpbWUgPSBuZXcgRGF0ZShleHBpcmVzSW4gKiAxMDAwKS5nZXRUaW1lKCkgLSByZWZyZXNoQnVmZmVyIC0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgICByZXR1cm4gcmVtYWluaW5nVGltZTtcbiAgfSk7XG5cbiAgY29uc3QgZXhlY3V0ZSA9IChuZXdBcmdzOiBSZXF1ZXN0QXJnczxUPiwgb3B0aW9ucz86IEludGVybmFsUXVlcnlFeGVjdXRlT3B0aW9ucykgPT4ge1xuICAgIHF1ZXJ5LmV4ZWN1dGUoeyBhcmdzOiBuZXdBcmdzIH0pO1xuICAgIHRyaWdnZXJlZEludGVybmFsbHkuc2V0KG9wdGlvbnM/LnRyaWdnZXJlZEludGVybmFsbHkgPz8gZmFsc2UpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgZXhlY3V0ZSxcbiAgICBxdWVyeSxcbiAgICB0b2tlbnMsXG4gICAgZXhwaXJlc0luLFxuICAgIHRyaWdnZXJlZEludGVybmFsbHk6IHRyaWdnZXJlZEludGVybmFsbHkuYXNSZWFkb25seSgpLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUJlYXJlckF1dGhQcm92aWRlciA9IDxcbiAgVExvZ2luQXJncyBleHRlbmRzIFF1ZXJ5QXJncyxcbiAgVFRva2VuTG9naW5BcmdzIGV4dGVuZHMgUXVlcnlBcmdzLFxuICBUVG9rZW5SZWZyZXNoQXJncyBleHRlbmRzIFF1ZXJ5QXJncyxcbiAgVFNlbGVjdFJvbGVBcmdzIGV4dGVuZHMgUXVlcnlBcmdzLFxuPihcbiAgb3B0aW9uczogQmVhcmVyQXV0aFByb3ZpZGVyQ29uZmlnPFRMb2dpbkFyZ3MsIFRUb2tlbkxvZ2luQXJncywgVFRva2VuUmVmcmVzaEFyZ3MsIFRTZWxlY3RSb2xlQXJncz4sXG4pOiBCZWFyZXJBdXRoUHJvdmlkZXI8VExvZ2luQXJncywgVFRva2VuTG9naW5BcmdzLCBUVG9rZW5SZWZyZXNoQXJncywgVFNlbGVjdFJvbGVBcmdzPiA9PiB7XG4gIGNvbnN0IGNvb2tpZUVuYWJsZWQgPSBzaWduYWwob3B0aW9ucy5jb29raWUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogKG9wdGlvbnMuY29va2llLmVuYWJsZWQgPz8gdHJ1ZSkpO1xuICBjb25zdCBjb29raWVPcHRpb25zOiBSZXF1aXJlZDxPbWl0PEJlYXJlckF1dGhQcm92aWRlckNvb2tpZUNvbmZpZzxUVG9rZW5SZWZyZXNoQXJncz4sICdlbmFibGVkJz4+ID0ge1xuICAgIGV4cGlyZXNJbkRheXM6IDMwLFxuICAgIG5hbWU6ICdldEF1dGgnLFxuICAgIHBhdGg6ICcvJyxcbiAgICBzYW1lU2l0ZTogJ2xheCcsXG4gICAgZG9tYWluOiBnZXREb21haW4oKSA/PyAnbG9jYWxob3N0JyxcbiAgICByZWZyZXNoQXJnc1RyYW5zZm9ybWVyOiAodG9rZW4pID0+ICh7IGJvZHk6IHsgdG9rZW4gfSB9KSBhcyBSZXF1ZXN0QXJnczxUVG9rZW5SZWZyZXNoQXJncz4sXG4gICAgLi4uKG9wdGlvbnMuY29va2llID8/IHt9KSxcbiAgfTtcblxuICBjb25zdCBsb2dpblF1ZXJ5ID0gb3B0aW9ucy5sb2dpbiA/IGNyZWF0ZUF1dGhQcm92aWRlclF1ZXJ5KG9wdGlvbnMubG9naW4sIG9wdGlvbnMpIDogbnVsbDtcbiAgY29uc3QgdG9rZW5Mb2dpblF1ZXJ5ID0gb3B0aW9ucy50b2tlbkxvZ2luID8gY3JlYXRlQXV0aFByb3ZpZGVyUXVlcnkob3B0aW9ucy50b2tlbkxvZ2luLCBvcHRpb25zKSA6IG51bGw7XG4gIGNvbnN0IHRva2VuUmVmcmVzaFF1ZXJ5ID0gb3B0aW9ucy50b2tlblJlZnJlc2ggPyBjcmVhdGVBdXRoUHJvdmlkZXJRdWVyeShvcHRpb25zLnRva2VuUmVmcmVzaCwgb3B0aW9ucykgOiBudWxsO1xuICBjb25zdCBzZWxlY3RSb2xlUXVlcnkgPSBvcHRpb25zLnNlbGVjdFJvbGUgPyBjcmVhdGVBdXRoUHJvdmlkZXJRdWVyeShvcHRpb25zLnNlbGVjdFJvbGUsIG9wdGlvbnMpIDogbnVsbDtcblxuICBjb25zdCBxdWVyaWVzOiBBdXRoUHJvdmlkZXJRdWVyeVdpdGhUeXBlPFRMb2dpbkFyZ3MsIFRUb2tlbkxvZ2luQXJncywgVFRva2VuUmVmcmVzaEFyZ3MsIFRTZWxlY3RSb2xlQXJncz5bXSA9IFtcbiAgICB7IHR5cGU6ICdsb2dpbicsIHF1ZXJ5OiBsb2dpblF1ZXJ5IH0sXG4gICAgeyB0eXBlOiAndG9rZW5Mb2dpbicsIHF1ZXJ5OiB0b2tlbkxvZ2luUXVlcnkgfSxcbiAgICB7IHR5cGU6ICd0b2tlblJlZnJlc2gnLCBxdWVyeTogdG9rZW5SZWZyZXNoUXVlcnkgfSxcbiAgICB7IHR5cGU6ICdzZWxlY3RSb2xlJywgcXVlcnk6IHNlbGVjdFJvbGVRdWVyeSB9LFxuICBdO1xuXG4gIGNvbnN0IGxhdGVzdEV4ZWN1dGVkUXVlcnkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgcmVsZXZhbnRRdWVyaWVzID0gcXVlcmllcy5maWx0ZXIoKHEpID0+IHEucXVlcnkgJiYgcS5xdWVyeS5xdWVyeS5sYXN0VGltZUV4ZWN1dGVkQXQoKSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gZmluZE1vc3RSZWNlbnRRdWVyeShyZWxldmFudFF1ZXJpZXMpO1xuICB9KTtcblxuICBjb25zdCB0b2tlbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgcXVlcnkgPSBsYXRlc3RFeGVjdXRlZFF1ZXJ5KCk7XG5cbiAgICByZXR1cm4gcXVlcnk/LnF1ZXJ5Py50b2tlbnMoKT8udG9rZW5zID8/IG51bGw7XG4gIH0pO1xuXG4gIHRvT2JzZXJ2YWJsZShcbiAgICBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBxdWVyeSA9IGxhdGVzdEV4ZWN1dGVkUXVlcnkoKTtcbiAgICAgIGNvbnN0IGV4cGlyZXNJbiA9IHF1ZXJ5Py5xdWVyeT8uZXhwaXJlc0luKCkgPz8gbnVsbDtcbiAgICAgIGNvbnN0IHRva2VucyA9IHF1ZXJ5Py5xdWVyeT8udG9rZW5zKCkgPz8gbnVsbDtcblxuICAgICAgcmV0dXJuIHsgZXhwaXJlc0luLCB0b2tlbnMsIHF1ZXJ5IH07XG4gICAgfSksXG4gIClcbiAgICAucGlwZShcbiAgICAgIHN3aXRjaE1hcCgocmVzKSA9PiB7XG4gICAgICAgIGlmICghcmVzLnRva2VucyB8fCByZXMuZXhwaXJlc0luID09PSBudWxsIHx8ICFvcHRpb25zLnRva2VuUmVmcmVzaCkgcmV0dXJuIG9mKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IGV4cEluID0gcmVzLmV4cGlyZXNJbjtcbiAgICAgICAgY29uc3QgdG9rZW5zID0gcmVzLnRva2VucztcblxuICAgICAgICBpZiAoIWV4cEluIHx8ICF0b2tlbnMpIHJldHVybiBvZihudWxsKTtcblxuICAgICAgICByZXR1cm4gdGltZXIoZXhwSW4pLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+XG4gICAgICAgICAgICByZWZyZXNoVG9rZW4oXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5jb29raWVPcHRpb25zLnJlZnJlc2hBcmdzVHJhbnNmb3JtZXIodG9rZW5zLnRva2Vucy5yZWZyZXNoVG9rZW4pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7IHRyaWdnZXJlZEludGVybmFsbHk6IHRydWUgfSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKTtcblxuICBjb25zdCBsYXRlc3ROb25JbnRlcm5hbFF1ZXJ5ID0gc2lnbmFsPFF1ZXJ5U25hcHNob3RXaXRoVHlwZTxcbiAgICBUTG9naW5BcmdzLFxuICAgIFRUb2tlbkxvZ2luQXJncyxcbiAgICBUVG9rZW5SZWZyZXNoQXJncyxcbiAgICBUU2VsZWN0Um9sZUFyZ3NcbiAgPiB8IG51bGw+KG51bGwpO1xuXG4gIGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgcmVsZXZhbnRRdWVyaWVzID0gcXVlcmllcy5maWx0ZXIoXG4gICAgICAocSkgPT4gcS5xdWVyeSAmJiAhcS5xdWVyeS50cmlnZ2VyZWRJbnRlcm5hbGx5KCkgJiYgcS5xdWVyeS5xdWVyeS5sYXN0VGltZUV4ZWN1dGVkQXQoKSAhPT0gbnVsbCxcbiAgICApO1xuXG4gICAgY29uc3QgbGFzdFF1ZXJ5ID0gZmluZE1vc3RSZWNlbnRRdWVyeShyZWxldmFudFF1ZXJpZXMpO1xuXG4gICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgIGlmICghbGFzdFF1ZXJ5IHx8ICFsYXN0UXVlcnkucXVlcnk/LnF1ZXJ5KSByZXR1cm47XG5cbiAgICAgIGxhdGVzdE5vbkludGVybmFsUXVlcnkuc2V0KHtcbiAgICAgICAgdHlwZTogbGFzdFF1ZXJ5LnR5cGUsXG4gICAgICAgIC4uLmxhc3RRdWVyeS5xdWVyeS5xdWVyeS5jcmVhdGVTbmFwc2hvdCgpLFxuICAgICAgfSBhcyBRdWVyeVNuYXBzaG90V2l0aFR5cGU8VExvZ2luQXJncywgVFRva2VuTG9naW5BcmdzLCBUVG9rZW5SZWZyZXNoQXJncywgVFNlbGVjdFJvbGVBcmdzPik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIENvb2tpZSB3cml0aW5nXG4gIGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaXNDb29raWVFbmFibGVkID0gY29va2llRW5hYmxlZCgpO1xuICAgIGNvbnN0IHJlcyA9IGxhdGVzdEV4ZWN1dGVkUXVlcnkoKTtcbiAgICBjb25zdCBlcnJvciA9IHJlcz8ucXVlcnk/LnF1ZXJ5LmVycm9yKCk7XG5cbiAgICBpZiAoIWlzQ29va2llRW5hYmxlZCB8fCAoZXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDEpKSB7XG4gICAgICBkZWxldGVDb29raWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlcz8ucXVlcnkpIHJldHVybjtcblxuICAgIGNvbnN0IHsgdG9rZW5zIH0gPSByZXMucXVlcnk7XG5cbiAgICBjb25zdCBydCA9IHRva2VucygpPy50b2tlbnMucmVmcmVzaFRva2VuO1xuXG4gICAgaWYgKCFydCkgcmV0dXJuO1xuXG4gICAgd3JpdGVDb29raWUocnQpO1xuICB9KTtcblxuICBjb25zdCBsb2dpbiA9IChhcmdzOiBSZXF1ZXN0QXJnczxUTG9naW5BcmdzPikgPT4ge1xuICAgIGlmICghbG9naW5RdWVyeSkge1xuICAgICAgdGhyb3cgbG9naW5DYWxsZWRXaXRob3V0Q29uZmlnKCk7XG4gICAgfVxuXG4gICAgbG9naW5RdWVyeS5leGVjdXRlKGFyZ3MpO1xuXG4gICAgcmV0dXJuIGxvZ2luUXVlcnkucXVlcnkuY3JlYXRlU25hcHNob3QoKTtcbiAgfTtcblxuICBjb25zdCBsb2dpbldpdGhUb2tlbiA9IChhcmdzOiBSZXF1ZXN0QXJnczxUVG9rZW5Mb2dpbkFyZ3M+KSA9PiB7XG4gICAgaWYgKCF0b2tlbkxvZ2luUXVlcnkpIHtcbiAgICAgIHRocm93IGxvZ2luV2l0aFRva2VuQ2FsbGVkV2l0aG91dENvbmZpZygpO1xuICAgIH1cblxuICAgIHRva2VuTG9naW5RdWVyeS5leGVjdXRlKGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRva2VuTG9naW5RdWVyeS5xdWVyeS5jcmVhdGVTbmFwc2hvdCgpO1xuICB9O1xuXG4gIGNvbnN0IHJlZnJlc2hUb2tlbiA9IChhcmdzOiBSZXF1ZXN0QXJnczxUVG9rZW5SZWZyZXNoQXJncz4sIG9wdGlvbnM/OiBJbnRlcm5hbFF1ZXJ5RXhlY3V0ZU9wdGlvbnMpID0+IHtcbiAgICBpZiAoIXRva2VuUmVmcmVzaFF1ZXJ5KSB7XG4gICAgICB0aHJvdyByZWZyZXNoVG9rZW5DYWxsZWRXaXRob3V0Q29uZmlnKCk7XG4gICAgfVxuXG4gICAgdG9rZW5SZWZyZXNoUXVlcnkuZXhlY3V0ZShhcmdzLCB7IHRyaWdnZXJlZEludGVybmFsbHk6IG9wdGlvbnM/LnRyaWdnZXJlZEludGVybmFsbHkgfSk7XG5cbiAgICByZXR1cm4gdG9rZW5SZWZyZXNoUXVlcnkucXVlcnkuY3JlYXRlU25hcHNob3QoKTtcbiAgfTtcblxuICBjb25zdCBzZWxlY3RSb2xlID0gKGFyZ3M6IFJlcXVlc3RBcmdzPFRTZWxlY3RSb2xlQXJncz4pID0+IHtcbiAgICBpZiAoIXNlbGVjdFJvbGVRdWVyeSkge1xuICAgICAgdGhyb3cgc2VsZWN0Um9sZUNhbGxlZFdpdGhvdXRDb25maWcoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RSb2xlUXVlcnkuZXhlY3V0ZShhcmdzKTtcblxuICAgIHJldHVybiBzZWxlY3RSb2xlUXVlcnkucXVlcnkuY3JlYXRlU25hcHNob3QoKTtcbiAgfTtcblxuICBjb25zdCBsb2dvdXQgPSAoKSA9PiB7XG4gICAgZGVsZXRlQ29va2llKCk7XG4gICAgbG9naW5RdWVyeT8ucXVlcnkuZXhlY3V0ZS5yZXNldCgpO1xuICAgIHRva2VuTG9naW5RdWVyeT8ucXVlcnkuZXhlY3V0ZS5yZXNldCgpO1xuICAgIHRva2VuUmVmcmVzaFF1ZXJ5Py5xdWVyeS5leGVjdXRlLnJlc2V0KCk7XG4gICAgc2VsZWN0Um9sZVF1ZXJ5Py5xdWVyeS5leGVjdXRlLnJlc2V0KCk7XG4gICAgbGF0ZXN0Tm9uSW50ZXJuYWxRdWVyeS5zZXQobnVsbCk7XG4gIH07XG5cbiAgY29uc3QgZW5hYmxlQ29va2llID0gKCkgPT4ge1xuICAgIGlmIChpc0Rldk1vZGUoKSAmJiAhb3B0aW9ucy5jb29raWUpIHtcbiAgICAgIHRocm93IGVuYWJsZUNvb2tpZUNhbGxlZFdpdGhvdXRDb29raWVDb25maWcoKTtcbiAgICB9XG5cbiAgICBjb29raWVFbmFibGVkLnNldCh0cnVlKTtcbiAgfTtcblxuICBjb25zdCBkaXNhYmxlQ29va2llID0gKCkgPT4ge1xuICAgIGlmIChpc0Rldk1vZGUoKSAmJiAhb3B0aW9ucy5jb29raWUpIHtcbiAgICAgIHRocm93IGRpc2FibGVDb29raWVDYWxsZWRXaXRob3V0Q29va2llQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgY29va2llRW5hYmxlZC5zZXQoZmFsc2UpO1xuICAgIGRlbGV0ZUNvb2tpZSgpO1xuICB9O1xuXG4gIGNvbnN0IHRyeUxvZ2luV2l0aENvb2tpZSA9ICgpID0+IHtcbiAgICBjb25zdCBpc0Nvb2tpZUVuYWJsZWQgPSBjb29raWVFbmFibGVkKCk7XG5cbiAgICBpZiAoIWlzQ29va2llRW5hYmxlZCkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIHRocm93IGNvb2tpZUxvZ2luVHJpZWRCdXRDb29raWVEaXNhYmxlZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvb2tpZSA9IGdldENvb2tpZShjb29raWVPcHRpb25zLm5hbWUpO1xuXG4gICAgaWYgKCFjb29raWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZWZyZXNoVG9rZW4oY29va2llT3B0aW9ucy5yZWZyZXNoQXJnc1RyYW5zZm9ybWVyKGNvb2tpZSkpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3Qgd3JpdGVDb29raWUgPSAocmVmcmVzaFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IG5hbWUsIGV4cGlyZXNJbkRheXMsIGRvbWFpbiwgcGF0aCwgc2FtZVNpdGUgfSA9IGNvb2tpZU9wdGlvbnM7XG5cbiAgICBzZXRDb29raWUobmFtZSwgcmVmcmVzaFRva2VuLCBleHBpcmVzSW5EYXlzLCBkb21haW4sIHBhdGgsIHNhbWVTaXRlKTtcbiAgfTtcblxuICBjb25zdCBkZWxldGVDb29raWUgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCBwYXRoLCBkb21haW4gfSA9IGNvb2tpZU9wdGlvbnM7XG5cbiAgICBjb3JlRGVsZXRlQ29va2llKG5hbWUsIHBhdGgsIGRvbWFpbik7XG4gIH07XG5cbiAgY29uc3QgZmluZE1vc3RSZWNlbnRRdWVyeSA9IChcbiAgICBxdWVyaWVzVG9TZWFyY2g6IEF1dGhQcm92aWRlclF1ZXJ5V2l0aFR5cGU8VExvZ2luQXJncywgVFRva2VuTG9naW5BcmdzLCBUVG9rZW5SZWZyZXNoQXJncywgVFNlbGVjdFJvbGVBcmdzPltdLFxuICApID0+IHtcbiAgICByZXR1cm4gcXVlcmllc1RvU2VhcmNoLnJlZHVjZShcbiAgICAgIChhY2MsIGN1cnIpID0+IHtcbiAgICAgICAgaWYgKCFhY2MpIHJldHVybiBjdXJyO1xuXG4gICAgICAgIGNvbnN0IGFjY0V4cCA9IGFjYy5xdWVyeT8ucXVlcnkubGFzdFRpbWVFeGVjdXRlZEF0KCkgPz8gbnVsbDtcbiAgICAgICAgY29uc3QgY3VyckV4cCA9IGN1cnIucXVlcnk/LnF1ZXJ5Lmxhc3RUaW1lRXhlY3V0ZWRBdCgpID8/IG51bGw7XG5cbiAgICAgICAgaWYgKGN1cnJFeHAgPT09IG51bGwgfHwgYWNjRXhwID09PSBudWxsKSByZXR1cm4gYWNjO1xuXG4gICAgICAgIHJldHVybiBhY2NFeHAgPiBjdXJyRXhwID8gYWNjIDogY3VycjtcbiAgICAgIH0sXG4gICAgICBudWxsIGFzIEF1dGhQcm92aWRlclF1ZXJ5V2l0aFR5cGU8VExvZ2luQXJncywgVFRva2VuTG9naW5BcmdzLCBUVG9rZW5SZWZyZXNoQXJncywgVFNlbGVjdFJvbGVBcmdzPiB8IG51bGwsXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBiZWFyZXJBdXRoUHJvdmlkZXI6IEJlYXJlckF1dGhQcm92aWRlcjxUTG9naW5BcmdzLCBUVG9rZW5Mb2dpbkFyZ3MsIFRUb2tlblJlZnJlc2hBcmdzLCBUU2VsZWN0Um9sZUFyZ3M+ID0ge1xuICAgIGxvZ2luLFxuICAgIGxvZ2luV2l0aFRva2VuLFxuICAgIHJlZnJlc2hUb2tlbixcbiAgICBzZWxlY3RSb2xlLFxuICAgIGxvZ291dCxcbiAgICBlbmFibGVDb29raWUsXG4gICAgZGlzYWJsZUNvb2tpZSxcbiAgICB0cnlMb2dpbldpdGhDb29raWUsXG4gICAgbGF0ZXN0RXhlY3V0ZWRRdWVyeTogbGF0ZXN0Tm9uSW50ZXJuYWxRdWVyeS5hc1JlYWRvbmx5KCksXG4gICAgdG9rZW5zLFxuICB9O1xuXG4gIGlmIChjb29raWVFbmFibGVkKCkpIHtcbiAgICB0cnlMb2dpbldpdGhDb29raWUoKTtcbiAgfVxuXG4gIHJldHVybiBiZWFyZXJBdXRoUHJvdmlkZXI7XG59O1xuXG5leHBvcnQgY29uc3QgcHJvdmlkZUJlYXJlckF1dGhQcm92aWRlciA9IDxcbiAgVExvZ2luQXJncyBleHRlbmRzIFF1ZXJ5QXJncyxcbiAgVFRva2VuTG9naW5BcmdzIGV4dGVuZHMgUXVlcnlBcmdzLFxuICBUVG9rZW5SZWZyZXNoQXJncyBleHRlbmRzIFF1ZXJ5QXJncyxcbiAgVFNlbGVjdFJvbGVBcmdzIGV4dGVuZHMgUXVlcnlBcmdzLFxuPihcbiAgY29uZmlnOiBCZWFyZXJBdXRoUHJvdmlkZXJDb25maWc8VExvZ2luQXJncywgVFRva2VuTG9naW5BcmdzLCBUVG9rZW5SZWZyZXNoQXJncywgVFNlbGVjdFJvbGVBcmdzPixcbikgPT4ge1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGU6IGNvbmZpZy50b2tlbixcbiAgICB1c2VGYWN0b3J5OiAoKSA9PiBjcmVhdGVCZWFyZXJBdXRoUHJvdmlkZXIoY29uZmlnKSxcbiAgfTtcbn07XG4iXX0=
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
2
|
-
import { HttpErrorResponse, HttpEventType, } from '@angular/common/http';
|
|
3
|
-
import { computed, signal } from '@angular/core';
|
|
4
|
-
import { Subscription, catchError, retry, tap, throwError, timer } from 'rxjs';
|
|
5
|
-
import { buildTimestampFromSeconds } from '../request';
|
|
6
|
-
import { extractExpiresInSeconds, shouldRetryRequest, } from './query-utils';
|
|
7
|
-
export const SPEED_BUFFER_TIME_IN_MS = 2000;
|
|
8
|
-
export const createHttpRequest = (options) => {
|
|
9
|
-
let currentStreamSubscription = Subscription.EMPTY;
|
|
10
|
-
const { args, clientOptions, dependencies } = options;
|
|
11
|
-
const currentEvent = signal(null);
|
|
12
|
-
const loading = signal(null);
|
|
13
|
-
const error = signal(null);
|
|
14
|
-
const response = signal(null);
|
|
15
|
-
const lastLoadEventTime = signal(0);
|
|
16
|
-
const lastLoadEventAmount = signal(0);
|
|
17
|
-
const lastExecuteTime = signal(0);
|
|
18
|
-
const expiresIn = signal(null);
|
|
19
|
-
const isStale = computed(() => {
|
|
20
|
-
const expiresInTs = expiresIn();
|
|
21
|
-
return expiresInTs === null || expiresInTs < Date.now();
|
|
22
|
-
});
|
|
23
|
-
const stream = dependencies.httpClient
|
|
24
|
-
.request(options.method, options.fullPath, {
|
|
25
|
-
observe: 'events',
|
|
26
|
-
body: args?.body,
|
|
27
|
-
reportProgress: clientOptions?.reportProgress,
|
|
28
|
-
withCredentials: clientOptions?.withCredentials,
|
|
29
|
-
transferCache: clientOptions?.transferCache,
|
|
30
|
-
responseType: clientOptions?.responseType || 'json',
|
|
31
|
-
context: clientOptions?.context,
|
|
32
|
-
headers: args?.headers,
|
|
33
|
-
})
|
|
34
|
-
.pipe(tap((event) => updateState(event)), retry({
|
|
35
|
-
delay: (error, retryCount) => {
|
|
36
|
-
const retryOptions = { error, retryCount };
|
|
37
|
-
const retryResult = options.retryFn?.(retryOptions) || shouldRetryRequest(retryOptions);
|
|
38
|
-
if (!retryResult.retry) {
|
|
39
|
-
return throwError(() => error);
|
|
40
|
-
}
|
|
41
|
-
return timer(retryResult.delay);
|
|
42
|
-
},
|
|
43
|
-
}), catchError((e) => {
|
|
44
|
-
updateErrorState(e);
|
|
45
|
-
return throwError(() => e);
|
|
46
|
-
}));
|
|
47
|
-
const execute = () => {
|
|
48
|
-
if (loading() || !isStale()) {
|
|
49
|
-
// Do not execute if there is already a request in progress or the request is not stale
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
currentStreamSubscription.unsubscribe();
|
|
53
|
-
lastExecuteTime.set(Date.now());
|
|
54
|
-
lastLoadEventTime.set(lastExecuteTime());
|
|
55
|
-
loading.set({
|
|
56
|
-
executeTime: lastExecuteTime(),
|
|
57
|
-
progress: null,
|
|
58
|
-
});
|
|
59
|
-
error.set(null);
|
|
60
|
-
expiresIn.set(null);
|
|
61
|
-
currentStreamSubscription = stream.subscribe();
|
|
62
|
-
return true;
|
|
63
|
-
};
|
|
64
|
-
const destroy = () => {
|
|
65
|
-
if (currentStreamSubscription.closed) {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
currentStreamSubscription.unsubscribe();
|
|
69
|
-
return true;
|
|
70
|
-
};
|
|
71
|
-
const updateState = (event) => {
|
|
72
|
-
currentEvent.set(event);
|
|
73
|
-
switch (event.type) {
|
|
74
|
-
case HttpEventType.Response:
|
|
75
|
-
{
|
|
76
|
-
loading.set(null);
|
|
77
|
-
response.set(event.body);
|
|
78
|
-
const expiresInSeconds = options.cacheAdapter
|
|
79
|
-
? options.cacheAdapter(event.headers)
|
|
80
|
-
: extractExpiresInSeconds(event.headers);
|
|
81
|
-
const expiresInTimestamp = buildTimestampFromSeconds(expiresInSeconds);
|
|
82
|
-
expiresIn.set(expiresInTimestamp);
|
|
83
|
-
}
|
|
84
|
-
break;
|
|
85
|
-
case HttpEventType.UploadProgress:
|
|
86
|
-
case HttpEventType.DownloadProgress:
|
|
87
|
-
{
|
|
88
|
-
updateLoadingState(event);
|
|
89
|
-
}
|
|
90
|
-
break;
|
|
91
|
-
case HttpEventType.Sent:
|
|
92
|
-
case HttpEventType.ResponseHeader:
|
|
93
|
-
case HttpEventType.User:
|
|
94
|
-
{
|
|
95
|
-
// we don't care about these events
|
|
96
|
-
}
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
const updateErrorState = (errorResponse) => {
|
|
101
|
-
let err = errorResponse instanceof HttpErrorResponse ? errorResponse : null;
|
|
102
|
-
if (!err) {
|
|
103
|
-
err = new HttpErrorResponse({
|
|
104
|
-
error: errorResponse,
|
|
105
|
-
status: 0,
|
|
106
|
-
statusText: 'Unknown Error',
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
error.set(err);
|
|
110
|
-
loading.set(null);
|
|
111
|
-
currentEvent.set({ type: 'error', error: err });
|
|
112
|
-
};
|
|
113
|
-
const updateLoadingState = (event) => {
|
|
114
|
-
if (event.total === undefined) {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
const progress = {
|
|
118
|
-
total: event.total,
|
|
119
|
-
loaded: event.loaded,
|
|
120
|
-
percentage: (event.loaded / event.total) * 100,
|
|
121
|
-
speed: null,
|
|
122
|
-
remainingTime: null,
|
|
123
|
-
};
|
|
124
|
-
const state = {
|
|
125
|
-
executeTime: lastExecuteTime(),
|
|
126
|
-
progress,
|
|
127
|
-
};
|
|
128
|
-
const currentTime = Date.now();
|
|
129
|
-
const elapsedTimeSinceLastEvent = currentTime - lastLoadEventTime();
|
|
130
|
-
const elapsedTimeSinceLastExecute = currentTime - lastExecuteTime();
|
|
131
|
-
const loadedAmount = event.loaded - lastLoadEventAmount();
|
|
132
|
-
// We only want to calculate speed and remaining time after 2 seconds of the execution
|
|
133
|
-
// This is to avoid showing incorrect speed and remaining time when the request is very fast
|
|
134
|
-
if (elapsedTimeSinceLastExecute > SPEED_BUFFER_TIME_IN_MS) {
|
|
135
|
-
const speed = (loadedAmount / elapsedTimeSinceLastEvent) * 1000;
|
|
136
|
-
progress.speed = speed * 1000;
|
|
137
|
-
progress.remainingTime = Math.round((event.total - event.loaded) / speed) * 1000;
|
|
138
|
-
}
|
|
139
|
-
lastLoadEventTime.set(currentTime);
|
|
140
|
-
lastLoadEventAmount.set(event.loaded);
|
|
141
|
-
loading.set(state);
|
|
142
|
-
};
|
|
143
|
-
const httpRequest = {
|
|
144
|
-
execute,
|
|
145
|
-
destroy,
|
|
146
|
-
loading: loading.asReadonly(),
|
|
147
|
-
error: error.asReadonly(),
|
|
148
|
-
response: response.asReadonly(),
|
|
149
|
-
currentEvent: currentEvent.asReadonly(),
|
|
150
|
-
isStale,
|
|
151
|
-
};
|
|
152
|
-
return httpRequest;
|
|
153
|
-
};
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9xdWVyeS9zcmMvbGliL2V4cGVyaW1lbnRhbC9odHRwLXJlcXVlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBRXpELE9BQU8sRUFHTCxpQkFBaUIsRUFFakIsYUFBYSxHQUVkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9FLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUl2RCxPQUFPLEVBR0wsdUJBQXVCLEVBQ3ZCLGtCQUFrQixHQUNuQixNQUFNLGVBQWUsQ0FBQztBQUV2QixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUM7QUEySTVDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQTBCLE9BQXdDLEVBQUUsRUFBRTtJQUNyRyxJQUFJLHlCQUF5QixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUM7SUFFbkQsTUFBTSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRXRELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBeUQsSUFBSSxDQUFDLENBQUM7SUFDMUYsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFpQyxJQUFJLENBQUMsQ0FBQztJQUM3RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQTJCLElBQUksQ0FBQyxDQUFDO0lBQ3JELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBNkIsSUFBSSxDQUFDLENBQUM7SUFFMUQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFD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aW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uICovXG5cbmltcG9ydCB7XG4gIEh0dHBDbGllbnQsXG4gIEh0dHBDb250ZXh0LFxuICBIdHRwRXJyb3JSZXNwb25zZSxcbiAgSHR0cEV2ZW50LFxuICBIdHRwRXZlbnRUeXBlLFxuICBIdHRwUHJvZ3Jlc3NFdmVudCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgU2lnbmFsLCBjb21wdXRlZCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGNhdGNoRXJyb3IsIHJldHJ5LCB0YXAsIHRocm93RXJyb3IsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBidWlsZFRpbWVzdGFtcEZyb21TZWNvbmRzIH0gZnJvbSAnLi4vcmVxdWVzdCc7XG5pbXBvcnQgeyBRdWVyeUFyZ3MsIFJlcXVlc3RBcmdzLCBSZXNwb25zZVR5cGUgfSBmcm9tICcuL3F1ZXJ5JztcbmltcG9ydCB7IENhY2hlQWRhcHRlckZuIH0gZnJvbSAnLi9xdWVyeS1jbGllbnQtY29uZmlnJztcbmltcG9ydCB7IFF1ZXJ5TWV0aG9kIH0gZnJvbSAnLi9xdWVyeS1jcmVhdG9yJztcbmltcG9ydCB7XG4gIFNob3VsZFJldHJ5UmVxdWVzdEZuLFxuICBTaG91bGRSZXRyeVJlcXVlc3RPcHRpb25zLFxuICBleHRyYWN0RXhwaXJlc0luU2Vjb25kcyxcbiAgc2hvdWxkUmV0cnlSZXF1ZXN0LFxufSBmcm9tICcuL3F1ZXJ5LXV0aWxzJztcblxuZXhwb3J0IGNvbnN0IFNQRUVEX0JVRkZFUl9USU1FX0lOX01TID0gMjAwMDtcblxuZXhwb3J0IHR5cGUgSHR0cFJlcXVlc3RUcmFuc2ZlckNhY2hlQ29uZmlnID1cbiAgfCBib29sZWFuXG4gIHwge1xuICAgICAgaW5jbHVkZUhlYWRlcnM/OiBzdHJpbmdbXTtcbiAgICB9O1xuXG5leHBvcnQgdHlwZSBIdHRwUmVxdWVzdFJlc3BvbnNlVHlwZSA9ICdqc29uJyB8ICd0ZXh0JyB8ICdibG9iJyB8ICdhcnJheWJ1ZmZlcic7XG5cbmV4cG9ydCB0eXBlIENyZWF0ZUh0dHBSZXF1ZXN0RGVwZW5kZW5jaWVzID0ge1xuICAvKiogVGhlIGh0dHAgY2xpZW50IGluc3RhbmNlIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QgKi9cbiAgaHR0cENsaWVudDogSHR0cENsaWVudDtcbn07XG5cbmV4cG9ydCB0eXBlIENyZWF0ZUh0dHBSZXF1ZXN0Q2xpZW50T3B0aW9ucyA9IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVwb3J0IHRoZSBwcm9ncmVzcyBvZiB0aGUgcmVxdWVzdCBvciBub3QuIElmIHRoZSBmZXRjaCBiYWNrZW5kIGlzIHVzZWQsIHRoaXMgd2lsbCBvbmx5IHdvcmsgZm9yIGRvd25sb2Fkcy5cbiAgICogQHNlZSBodHRwczovL2FuZ3VsYXIuZGV2L2d1aWRlL2h0dHAvbWFraW5nLXJlcXVlc3RzI3JlY2VpdmluZy1yYXctcHJvZ3Jlc3MtZXZlbnRzXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBjcmVkZW50aWFscyBpbiB0aGUgcmVxdWVzdCBvciBub3RcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgYWNjZXB0cyBlaXRoZXIgYSBib29sZWFuIHRvIGVuYWJsZS9kaXNhYmxlIHRyYW5zZmVycmluZyBjYWNoZSBmb3IgZWxpZ2libGVcbiAgICogcmVxdWVzdHMgcGVyZm9ybWVkIHVzaW5nIGBIdHRwQ2xpZW50YCwgb3IgYW4gb2JqZWN0LCB3aGljaCBhbGxvd3MgdG8gY29uZmlndXJlIGNhY2hlXG4gICAqIHBhcmFtZXRlcnMsIHN1Y2ggYXMgd2hpY2ggaGVhZGVycyBzaG91bGQgYmUgaW5jbHVkZWQgKG5vIGhlYWRlcnMgYXJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQpLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgd2lsbCBvdmVycmlkZSB0aGUgb3B0aW9ucyBwYXNzZWQgdG8gYHByb3ZpZGVDbGllbnRIeWRyYXRpb24oKWAgZm9yIHRoaXNcbiAgICogcGFydGljdWxhciByZXF1ZXN0XG4gICAqL1xuICB0cmFuc2ZlckNhY2hlPzogSHR0cFJlcXVlc3RUcmFuc2ZlckNhY2hlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uc2UgdHlwZSBvZiB0aGUgcmVxdWVzdFxuICAgKiBAZGVmYXVsdCAnanNvbidcbiAgICovXG4gIHJlc3BvbnNlVHlwZT86IEh0dHBSZXF1ZXN0UmVzcG9uc2VUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBvZiB0aGUgcmVxdWVzdFxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICogQHNlZSBodHRwczovL2FuZ3VsYXIuZGV2L2d1aWRlL2h0dHAvaW50ZXJjZXB0b3JzI3JlcXVlc3QtYW5kLXJlc3BvbnNlLW1ldGFkYXRhXG4gICAqL1xuICBjb250ZXh0PzogSHR0cENvbnRleHQ7XG59O1xuXG5leHBvcnQgdHlwZSBDcmVhdGVIdHRwUmVxdWVzdE9wdGlvbnM8VEFyZ3MgZXh0ZW5kcyBRdWVyeUFyZ3M+ID0ge1xuICAvKiogVGhlIEhUVFAgbWV0aG9kIG9mIHRoZSByZXF1ZXN0ICovXG4gIG1ldGhvZDogUXVlcnlNZXRob2Q7XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIHBhdGggb2YgdGhlIHJlcXVlc3RcbiAgICogQGV4YW1wbGUgJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tL3YxL3VzZXJzJ1xuICAgKi9cbiAgZnVsbFBhdGg6IHN0cmluZztcblxuICAvKiogVGhlIGRhdGEgb2YgdGhlIHJlcXVlc3QgKi9cbiAgYXJncz86IFJlcXVlc3RBcmdzPFRBcmdzPiB8IG51bGw7XG5cbiAgLyoqIFRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIHJlcXVlc3QgKi9cbiAgZGVwZW5kZW5jaWVzOiBDcmVhdGVIdHRwUmVxdWVzdERlcGVuZGVuY2llcztcblxuICAvKiogVGhlIGNsaWVudCBvcHRpb25zIG9mIHRoZSByZXF1ZXN0ICovXG4gIGNsaWVudE9wdGlvbnM/OiBDcmVhdGVIdHRwUmVxdWVzdENsaWVudE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBjYWNoZSBhZGFwdGVyIGZ1bmN0aW9uIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3RcbiAgICogQGRlZmF1bHQgZXh0cmFjdEV4cGlyZXNJblNlY29uZHMoKVxuICAgKi9cbiAgY2FjaGVBZGFwdGVyPzogQ2FjaGVBZGFwdGVyRm47XG5cbiAgLyoqXG4gICAqIFRoZSByZXRyeSBmdW5jdGlvbiB0byB1c2UgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEBkZWZhdWx0IHNob3VsZFJldHJ5UmVxdWVzdCgpXG4gICAqL1xuICByZXRyeUZuPzogU2hvdWxkUmV0cnlSZXF1ZXN0Rm47XG59O1xuXG5leHBvcnQgdHlwZSBIdHRwUmVxdWVzdExvYWRpbmdTdGF0ZSA9IHtcbiAgLyoqIFRoZSB0aW1lIHdoZW4gdGhlIHJlcXVlc3Qgd2FzIGV4ZWN1dGVkIGluIG1zICovXG4gIGV4ZWN1dGVUaW1lOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBwcm9ncmVzcyBvZiB0aGUgcmVxdWVzdC4gTnVsbCBpZiByZXBvcnRQcm9ncmVzcyBpcyBmYWxzZSBvciBwcm9ncmVzcyBpcyBub3QgYXZhaWxhYmxlIC8gdW5zdXBwb3J0ZWQgKi9cbiAgcHJvZ3Jlc3M6IEh0dHBSZXF1ZXN0TG9hZGluZ1Byb2dyZXNzU3RhdGUgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgSHR0cFJlcXVlc3RMb2FkaW5nUHJvZ3Jlc3NTdGF0ZSA9IHtcbiAgLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNmZXJyZWQgKi9cbiAgdG90YWw6IG51bWJlcjtcblxuICAvKiogVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCAqL1xuICBsb2FkZWQ6IG51bWJlcjtcblxuICAvKiogVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRyYW5zZmVyIHRoYXQgaXMgY29tcGxldGVkICovXG4gIHBlcmNlbnRhZ2U6IG51bWJlcjtcblxuICAvKiogVGhlIHNwZWVkIG9mIHRoZSB0cmFuc2ZlciBpbiBieXRlcyBwZXIgbWlsbGlzZWNvbmQgKi9cbiAgc3BlZWQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqIFRoZSBlc3RpbWF0ZWQgcmVtYWluaW5nIHRpbWUgaW4gbWlsbGlzZWNvbmRzICovXG4gIHJlbWFpbmluZ1RpbWU6IG51bWJlciB8IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBIdHRwUmVxdWVzdDxUQXJncyBleHRlbmRzIFF1ZXJ5QXJncz4gPSB7XG4gIC8qKiBFeGVjdXRlcyB0aGUgcmVxdWVzdCAqL1xuICBleGVjdXRlOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKiBEZXN0cm95cyB0aGUgcmVxdWVzdCAoY2FuY2VscyBpdCBpZiBpbiBwcm9ncmVzcykgKi9cbiAgZGVzdHJveTogKCkgPT4gYm9vbGVhbjtcblxuICAvKiogVGhlIGxvYWRpbmcgc3RhdGUgb2YgdGhlIHJlcXVlc3QgKi9cbiAgbG9hZGluZzogU2lnbmFsPEh0dHBSZXF1ZXN0TG9hZGluZ1N0YXRlIHwgbnVsbD47XG5cbiAgLyoqIFRoZSBlcnJvciBzdGF0ZSBvZiB0aGUgcmVxdWVzdCAqL1xuICBlcnJvcjogU2lnbmFsPEh0dHBFcnJvclJlc3BvbnNlIHwgbnVsbD47XG5cbiAgLyoqIFRoZSByZXNwb25zZSBzdGF0ZSBvZiB0aGUgcmVxdWVzdCAqL1xuICByZXNwb25zZTogU2lnbmFsPFJlc3BvbnNlVHlwZTxUQXJncz4gfCBudWxsPjtcblxuICAvKiogVGhlIGN1cnJlbnQgZXZlbnQgb2YgdGhlIHJlcXVlc3QgKi9cbiAgY3VycmVudEV2ZW50OiBTaWduYWw8SHR0cEV2ZW50PFJlc3BvbnNlVHlwZTxUQXJncz4+IHwgSHR0cEVycm9yRXZlbnQgfCBudWxsPjtcblxuICAvKiogV2hldGhlciB0aGUgcmVxdWVzdCBpcyBzdGFsZSBvciBub3QgYWthIHRoZSBjYWNoZSBoZWFkZXIgaGFzIGV4cGlyZWQgKi9cbiAgaXNTdGFsZTogU2lnbmFsPGJvb2xlYW4+O1xufTtcblxuLyoqIEEgY3VzdG9tIGVycm9yIGV2ZW50IHNpbmNlIHRoZSBBbmd1bGFyIGh0dHAgY2xpZW50IGRvZXMgbm90IHByb3ZpZGUgYSBzcGVjaWZpYyBldmVudCBmb3IgZXJyb3JzICovXG5leHBvcnQgdHlwZSBIdHRwRXJyb3JFdmVudCA9IHtcbiAgdHlwZTogJ2Vycm9yJztcbiAgZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUh0dHBSZXF1ZXN0ID0gPFRBcmdzIGV4dGVuZHMgUXVlcnlBcmdzPihvcHRpb25zOiBDcmVhdGVIdHRwUmVxdWVzdE9wdGlvbnM8VEFyZ3M+KSA9PiB7XG4gIGxldCBjdXJyZW50U3RyZWFtU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIGNvbnN0IHsgYXJncywgY2xpZW50T3B0aW9ucywgZGVwZW5kZW5jaWVzIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IGN1cnJlbnRFdmVudCA9IHNpZ25hbDxIdHRwRXZlbnQ8UmVzcG9uc2VUeXBlPFRBcmdzPj4gfCBIdHRwRXJyb3JFdmVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCBsb2FkaW5nID0gc2lnbmFsPEh0dHBSZXF1ZXN0TG9hZGluZ1N0YXRlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGVycm9yID0gc2lnbmFsPEh0dHBFcnJvclJlc3BvbnNlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gc2lnbmFsPFJlc3BvbnNlVHlwZTxUQXJncz4gfCBudWxsPihudWxsKTtcblxuICBjb25zdCBsYXN0TG9hZEV2ZW50VGltZSA9IHNpZ25hbCgwKTtcbiAgY29uc3QgbGFzdExvYWRFdmVudEFtb3VudCA9IHNpZ25hbCgwKTtcbiAgY29uc3QgbGFzdEV4ZWN1dGVUaW1lID0gc2lnbmFsKDApO1xuICBjb25zdCBleHBpcmVzSW4gPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgaXNTdGFsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBleHBpcmVzSW5UcyA9IGV4cGlyZXNJbigpO1xuXG4gICAgcmV0dXJuIGV4cGlyZXNJblRzID09PSBudWxsIHx8IGV4cGlyZXNJblRzIDwgRGF0ZS5ub3coKTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RyZWFtID0gZGVwZW5kZW5jaWVzLmh0dHBDbGllbnRcbiAgICAucmVxdWVzdChvcHRpb25zLm1ldGhvZCwgb3B0aW9ucy5mdWxsUGF0aCwge1xuICAgICAgb2JzZXJ2ZTogJ2V2ZW50cycsXG4gICAgICBib2R5OiBhcmdzPy5ib2R5LFxuICAgICAgcmVwb3J0UHJvZ3Jlc3M6IGNsaWVudE9wdGlvbnM/LnJlcG9ydFByb2dyZXNzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBjbGllbnRPcHRpb25zPy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0cmFuc2ZlckNhY2hlOiBjbGllbnRPcHRpb25zPy50cmFuc2ZlckNhY2hlLFxuICAgICAgcmVzcG9uc2VUeXBlOiBjbGllbnRPcHRpb25zPy5yZXNwb25zZVR5cGUgfHwgJ2pzb24nLFxuICAgICAgY29udGV4dDogY2xpZW50T3B0aW9ucz8uY29udGV4dCxcbiAgICAgIGhlYWRlcnM6IGFyZ3M/LmhlYWRlcnMsXG4gICAgfSlcbiAgICAucGlwZShcbiAgICAgIHRhcCgoZXZlbnQpID0+IHVwZGF0ZVN0YXRlKGV2ZW50KSksXG4gICAgICByZXRyeSh7XG4gICAgICAgIGRlbGF5OiAoZXJyb3IsIHJldHJ5Q291bnQpID0+IHtcbiAgICAgICAgICBjb25zdCByZXRyeU9wdGlvbnM6IFNob3VsZFJldHJ5UmVxdWVzdE9wdGlvbnMgPSB7IGVycm9yLCByZXRyeUNvdW50IH07XG5cbiAgICAgICAgICBjb25zdCByZXRyeVJlc3VsdCA9IG9wdGlvbnMucmV0cnlGbj8uKHJldHJ5T3B0aW9ucykgfHwgc2hvdWxkUmV0cnlSZXF1ZXN0KHJldHJ5T3B0aW9ucyk7XG5cbiAgICAgICAgICBpZiAoIXJldHJ5UmVzdWx0LnJldHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRpbWVyKHJldHJ5UmVzdWx0LmRlbGF5KTtcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZSkgPT4ge1xuICAgICAgICB1cGRhdGVFcnJvclN0YXRlKGUpO1xuXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGUpO1xuICAgICAgfSksXG4gICAgKTtcblxuICBjb25zdCBleGVjdXRlID0gKCkgPT4ge1xuICAgIGlmIChsb2FkaW5nKCkgfHwgIWlzU3RhbGUoKSkge1xuICAgICAgLy8gRG8gbm90IGV4ZWN1dGUgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlcXVlc3QgaW4gcHJvZ3Jlc3Mgb3IgdGhlIHJlcXVlc3QgaXMgbm90IHN0YWxlXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY3VycmVudFN0cmVhbVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuXG4gICAgbGFzdEV4ZWN1dGVUaW1lLnNldChEYXRlLm5vdygpKTtcbiAgICBsYXN0TG9hZEV2ZW50VGltZS5zZXQobGFzdEV4ZWN1dGVUaW1lKCkpO1xuXG4gICAgbG9hZGluZy5zZXQoe1xuICAgICAgZXhlY3V0ZVRpbWU6IGxhc3RFeGVjdXRlVGltZSgpLFxuICAgICAgcHJvZ3Jlc3M6IG51bGwsXG4gICAgfSk7XG4gICAgZXJyb3Iuc2V0KG51bGwpO1xuICAgIGV4cGlyZXNJbi5zZXQobnVsbCk7XG5cbiAgICBjdXJyZW50U3RyZWFtU3Vic2NyaXB0aW9uID0gc3RyZWFtLnN1YnNjcmliZSgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICBpZiAoY3VycmVudFN0cmVhbVN1YnNjcmlwdGlvbi5jbG9zZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjdXJyZW50U3RyZWFtU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVTdGF0ZSA9IChldmVudDogSHR0cEV2ZW50PFJlc3BvbnNlVHlwZTxUQXJncz4+KSA9PiB7XG4gICAgY3VycmVudEV2ZW50LnNldChldmVudCk7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5SZXNwb25zZTpcbiAgICAgICAge1xuICAgICAgICAgIGxvYWRpbmcuc2V0KG51bGwpO1xuICAgICAgICAgIHJlc3BvbnNlLnNldChldmVudC5ib2R5KTtcblxuICAgICAgICAgIGNvbnN0IGV4cGlyZXNJblNlY29uZHMgPSBvcHRpb25zLmNhY2hlQWRhcHRlclxuICAgICAgICAgICAgPyBvcHRpb25zLmNhY2hlQWRhcHRlcihldmVudC5oZWFkZXJzKVxuICAgICAgICAgICAgOiBleHRyYWN0RXhwaXJlc0luU2Vjb25kcyhldmVudC5oZWFkZXJzKTtcbiAgICAgICAgICBjb25zdCBleHBpcmVzSW5UaW1lc3RhbXAgPSBidWlsZFRpbWVzdGFtcEZyb21TZWNvbmRzKGV4cGlyZXNJblNlY29uZHMpO1xuICAgICAgICAgIGV4cGlyZXNJbi5zZXQoZXhwaXJlc0luVGltZXN0YW1wKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzOlxuICAgICAgY2FzZSBIdHRwRXZlbnRUeXBlLkRvd25sb2FkUHJvZ3Jlc3M6XG4gICAgICAgIHtcbiAgICAgICAgICB1cGRhdGVMb2FkaW5nU3RhdGUoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEh0dHBFdmVudFR5cGUuU2VudDpcbiAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5SZXNwb25zZUhlYWRlcjpcbiAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5Vc2VyOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVzZSBldmVudHNcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlRXJyb3JTdGF0ZSA9IChlcnJvclJlc3BvbnNlOiB1bmtub3duKSA9PiB7XG4gICAgbGV0IGVyciA9IGVycm9yUmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSA/IGVycm9yUmVzcG9uc2UgOiBudWxsO1xuXG4gICAgaWYgKCFlcnIpIHtcbiAgICAgIGVyciA9IG5ldyBIdHRwRXJyb3JSZXNwb25zZSh7XG4gICAgICAgIGVycm9yOiBlcnJvclJlc3BvbnNlLFxuICAgICAgICBzdGF0dXM6IDAsXG4gICAgICAgIHN0YXR1c1RleHQ6ICdVbmtub3duIEVycm9yJyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGVycm9yLnNldChlcnIpO1xuICAgIGxvYWRpbmcuc2V0KG51bGwpO1xuICAgIGN1cnJlbnRFdmVudC5zZXQoeyB0eXBlOiAnZXJyb3InLCBlcnJvcjogZXJyIH0pO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZUxvYWRpbmdTdGF0ZSA9IChldmVudDogSHR0cFByb2dyZXNzRXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQudG90YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2dyZXNzOiBIdHRwUmVxdWVzdExvYWRpbmdQcm9ncmVzc1N0YXRlID0ge1xuICAgICAgdG90YWw6IGV2ZW50LnRvdGFsLFxuICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICBwZXJjZW50YWdlOiAoZXZlbnQubG9hZGVkIC8gZXZlbnQudG90YWwpICogMTAwLFxuICAgICAgc3BlZWQ6IG51bGwsXG4gICAgICByZW1haW5pbmdUaW1lOiBudWxsLFxuICAgIH07XG5cbiAgICBjb25zdCBzdGF0ZTogSHR0cFJlcXVlc3RMb2FkaW5nU3RhdGUgPSB7XG4gICAgICBleGVjdXRlVGltZTogbGFzdEV4ZWN1dGVUaW1lKCksXG4gICAgICBwcm9ncmVzcyxcbiAgICB9O1xuXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGVsYXBzZWRUaW1lU2luY2VMYXN0RXZlbnQgPSBjdXJyZW50VGltZSAtIGxhc3RMb2FkRXZlbnRUaW1lKCk7XG4gICAgY29uc3QgZWxhcHNlZFRpbWVTaW5jZUxhc3RFeGVjdXRlID0gY3VycmVudFRpbWUgLSBsYXN0RXhlY3V0ZVRpbWUoKTtcbiAgICBjb25zdCBsb2FkZWRBbW91bnQgPSBldmVudC5sb2FkZWQgLSBsYXN0TG9hZEV2ZW50QW1vdW50KCk7XG5cbiAgICAvLyBXZSBvbmx5IHdhbnQgdG8gY2FsY3VsYXRlIHNwZWVkIGFuZCByZW1haW5pbmcgdGltZSBhZnRlciAyIHNlY29uZHMgb2YgdGhlIGV4ZWN1dGlvblxuICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgc2hvd2luZyBpbmNvcnJlY3Qgc3BlZWQgYW5kIHJlbWFpbmluZyB0aW1lIHdoZW4gdGhlIHJlcXVlc3QgaXMgdmVyeSBmYXN0XG4gICAgaWYgKGVsYXBzZWRUaW1lU2luY2VMYXN0RXhlY3V0ZSA+IFNQRUVEX0JVRkZFUl9USU1FX0lOX01TKSB7XG4gICAgICBjb25zdCBzcGVlZCA9IChsb2FkZWRBbW91bnQgLyBlbGFwc2VkVGltZVNpbmNlTGFzdEV2ZW50KSAqIDEwMDA7XG5cbiAgICAgIHByb2dyZXNzLnNwZWVkID0gc3BlZWQgKiAxMDAwO1xuICAgICAgcHJvZ3Jlc3MucmVtYWluaW5nVGltZSA9IE1hdGgucm91bmQoKGV2ZW50LnRvdGFsIC0gZXZlbnQubG9hZGVkKSAvIHNwZWVkKSAqIDEwMDA7XG4gICAgfVxuXG4gICAgbGFzdExvYWRFdmVudFRpbWUuc2V0KGN1cnJlbnRUaW1lKTtcbiAgICBsYXN0TG9hZEV2ZW50QW1vdW50LnNldChldmVudC5sb2FkZWQpO1xuXG4gICAgbG9hZGluZy5zZXQoc3RhdGUpO1xuICB9O1xuXG4gIGNvbnN0IGh0dHBSZXF1ZXN0OiBIdHRwUmVxdWVzdDxUQXJncz4gPSB7XG4gICAgZXhlY3V0ZSxcbiAgICBkZXN0cm95LFxuICAgIGxvYWRpbmc6IGxvYWRpbmcuYXNSZWFkb25seSgpLFxuICAgIGVycm9yOiBlcnJvci5hc1JlYWRvbmx5KCksXG4gICAgcmVzcG9uc2U6IHJlc3BvbnNlLmFzUmVhZG9ubHkoKSxcbiAgICBjdXJyZW50RXZlbnQ6IGN1cnJlbnRFdmVudC5hc1JlYWRvbmx5KCksXG4gICAgaXNTdGFsZSxcbiAgfTtcblxuICByZXR1cm4gaHR0cFJlcXVlc3Q7XG59O1xuIl19
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export * from './bearer-auth-provider';
|
|
2
|
-
export * from './bearer-auth-provider-config';
|
|
3
|
-
export * from './http-request';
|
|
4
|
-
export * from './query';
|
|
5
|
-
export * from './query-client';
|
|
6
|
-
export * from './query-client-config';
|
|
7
|
-
export * from './query-creator';
|
|
8
|
-
export * from './query-creator-templates';
|
|
9
|
-
export * from './query-dependencies';
|
|
10
|
-
export * from './query-errors';
|
|
11
|
-
export * from './query-execute';
|
|
12
|
-
export * from './query-execute-utils';
|
|
13
|
-
export * from './query-features';
|
|
14
|
-
export * from './query-repository';
|
|
15
|
-
export * from './query-snapshot';
|
|
16
|
-
export * from './query-stack';
|
|
17
|
-
export * from './query-state';
|
|
18
|
-
export * from './query-utils';
|
|
19
|
-
export * from './secure-query';
|
|
20
|
-
export * from './secure-query-creator';
|
|
21
|
-
export * from './secure-query-execute';
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvZXhwZXJpbWVudGFsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx3QkFBd0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYmVhcmVyLWF1dGgtcHJvdmlkZXInO1xuZXhwb3J0ICogZnJvbSAnLi9iZWFyZXItYXV0aC1wcm92aWRlci1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9odHRwLXJlcXVlc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWVyeSc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5LWNsaWVudCc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5LWNsaWVudC1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWVyeS1jcmVhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXVlcnktY3JlYXRvci10ZW1wbGF0ZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWVyeS1kZXBlbmRlbmNpZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWVyeS1lcnJvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWVyeS1leGVjdXRlJztcbmV4cG9ydCAqIGZyb20gJy4vcXVlcnktZXhlY3V0ZS11dGlscyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5LWZlYXR1cmVzJztcbmV4cG9ydCAqIGZyb20gJy4vcXVlcnktcmVwb3NpdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5LXNuYXBzaG90JztcbmV4cG9ydCAqIGZyb20gJy4vcXVlcnktc3RhY2snO1xuZXhwb3J0ICogZnJvbSAnLi9xdWVyeS1zdGF0ZSc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5LXV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vc2VjdXJlLXF1ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vc2VjdXJlLXF1ZXJ5LWNyZWF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zZWN1cmUtcXVlcnktZXhlY3V0ZSc7XG4iXX0=
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
2
|
-
import { InjectionToken } from '@angular/core';
|
|
3
|
-
export const createQueryClientConfig = (options) => {
|
|
4
|
-
const token = new InjectionToken(`QueryClient_${options.name}`);
|
|
5
|
-
const clientConfig = {
|
|
6
|
-
baseUrl: options.baseUrl,
|
|
7
|
-
token,
|
|
8
|
-
name: options.name,
|
|
9
|
-
queryString: options.queryString,
|
|
10
|
-
};
|
|
11
|
-
return clientConfig;
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktY2xpZW50LWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9leHBlcmltZW50YWwvcXVlcnktY2xpZW50LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFHekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQXFCL0MsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxPQUF1QyxFQUFFLEVBQUU7SUFDakYsTUFBTSxLQUFLLEdBQUcsSUFBSSxjQUFjLENBQW9CLGVBQWUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFFbkYsTUFBTSxZQUFZLEdBQXNCO1FBQ3RDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixLQUFLO1FBQ0wsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztLQUNqQyxDQUFDO0lBRUYsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uICovXG5cbmltcG9ydCB7IEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJ1aWxkUXVlcnlTdHJpbmdDb25maWcgfSBmcm9tICcuLi9yZXF1ZXN0JztcbmltcG9ydCB7IFF1ZXJ5Q2xpZW50IH0gZnJvbSAnLi9xdWVyeS1jbGllbnQnO1xuaW1wb3J0IHsgU2hvdWxkUmV0cnlSZXF1ZXN0Rm4gfSBmcm9tICcuL3F1ZXJ5LXV0aWxzJztcblxuZXhwb3J0IHR5cGUgQ2FjaGVBZGFwdGVyRm4gPSAoaGVhZGVyczogSHR0cEhlYWRlcnMpID0+IG51bWJlciB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIENyZWF0ZVF1ZXJ5Q2xpZW50Q29uZmlnT3B0aW9ucyA9IHtcbiAgYmFzZVVybDogc3RyaW5nO1xuICBxdWVyeVN0cmluZz86IEJ1aWxkUXVlcnlTdHJpbmdDb25maWc7XG4gIG5hbWU6IHN0cmluZztcbiAgY2FjaGVBZGFwdGVyPzogQ2FjaGVBZGFwdGVyRm47XG4gIHJldHJ5Rm4/OiBTaG91bGRSZXRyeVJlcXVlc3RGbjtcbn07XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5Q2xpZW50Q29uZmlnID0gQ3JlYXRlUXVlcnlDbGllbnRDb25maWdPcHRpb25zICYge1xuICB0b2tlbjogUXVlcnlDbGllbnRSZWY7XG59O1xuXG5leHBvcnQgdHlwZSBRdWVyeUNsaWVudFJlZiA9IEluamVjdGlvblRva2VuPFF1ZXJ5Q2xpZW50PjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVF1ZXJ5Q2xpZW50Q29uZmlnID0gKG9wdGlvbnM6IENyZWF0ZVF1ZXJ5Q2xpZW50Q29uZmlnT3B0aW9ucykgPT4ge1xuICBjb25zdCB0b2tlbiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxRdWVyeUNsaWVudENvbmZpZz4oYFF1ZXJ5Q2xpZW50XyR7b3B0aW9ucy5uYW1lfWApO1xuXG4gIGNvbnN0IGNsaWVudENvbmZpZzogUXVlcnlDbGllbnRDb25maWcgPSB7XG4gICAgYmFzZVVybDogb3B0aW9ucy5iYXNlVXJsLFxuICAgIHRva2VuLFxuICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICBxdWVyeVN0cmluZzogb3B0aW9ucy5xdWVyeVN0cmluZyxcbiAgfTtcblxuICByZXR1cm4gY2xpZW50Q29uZmlnO1xufTtcbiJdfQ==
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
2
|
-
import { createQueryRepository } from './query-repository';
|
|
3
|
-
export const createQueryClient = (config) => {
|
|
4
|
-
const repository = createQueryRepository(config);
|
|
5
|
-
const client = {
|
|
6
|
-
repository,
|
|
7
|
-
};
|
|
8
|
-
return client;
|
|
9
|
-
};
|
|
10
|
-
export const provideQueryClient = (config) => {
|
|
11
|
-
return {
|
|
12
|
-
provide: config.token,
|
|
13
|
-
useFactory: () => createQueryClient(config),
|
|
14
|
-
};
|
|
15
|
-
};
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9xdWVyeS9zcmMvbGliL2V4cGVyaW1lbnRhbC9xdWVyeS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBR3pELE9BQU8sRUFBbUIscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU01RSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQXlCLEVBQUUsRUFBRTtJQUM3RCxNQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVqRCxNQUFNLE1BQU0sR0FBZ0I7UUFDMUIsVUFBVTtLQUNYLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE1BQXlCLEVBQUUsRUFBRTtJQUM5RCxPQUFPO1FBQ0wsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1FBQ3JCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7S0FDNUMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvbiAqL1xuXG5pbXBvcnQgeyBRdWVyeUNsaWVudENvbmZpZyB9IGZyb20gJy4vcXVlcnktY2xpZW50LWNvbmZpZyc7XG5pbXBvcnQgeyBRdWVyeVJlcG9zaXRvcnksIGNyZWF0ZVF1ZXJ5UmVwb3NpdG9yeSB9IGZyb20gJy4vcXVlcnktcmVwb3NpdG9yeSc7XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5Q2xpZW50ID0ge1xuICByZXBvc2l0b3J5OiBRdWVyeVJlcG9zaXRvcnk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUXVlcnlDbGllbnQgPSAoY29uZmlnOiBRdWVyeUNsaWVudENvbmZpZykgPT4ge1xuICBjb25zdCByZXBvc2l0b3J5ID0gY3JlYXRlUXVlcnlSZXBvc2l0b3J5KGNvbmZpZyk7XG5cbiAgY29uc3QgY2xpZW50OiBRdWVyeUNsaWVudCA9IHtcbiAgICByZXBvc2l0b3J5LFxuICB9O1xuXG4gIHJldHVybiBjbGllbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgcHJvdmlkZVF1ZXJ5Q2xpZW50ID0gKGNvbmZpZzogUXVlcnlDbGllbnRDb25maWcpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlOiBjb25maWcudG9rZW4sXG4gICAgdXNlRmFjdG9yeTogKCkgPT4gY3JlYXRlUXVlcnlDbGllbnQoY29uZmlnKSxcbiAgfTtcbn07XG4iXX0=
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { createQueryCreator } from './query-creator';
|
|
2
|
-
import { createSecureQueryCreator } from './secure-query-creator';
|
|
3
|
-
export const createGetQuery = (client) => {
|
|
4
|
-
return (creatorOptions) => createQueryCreator(creatorOptions, { method: 'GET', client });
|
|
5
|
-
};
|
|
6
|
-
export const createSecureGetQuery = (client, authProvider) => {
|
|
7
|
-
return (creatorOptions) => createSecureQueryCreator(creatorOptions, { method: 'GET', client, authProvider });
|
|
8
|
-
};
|
|
9
|
-
export const createPostQuery = (client) => {
|
|
10
|
-
return (creatorOptions) => createQueryCreator(creatorOptions, { method: 'POST', client });
|
|
11
|
-
};
|
|
12
|
-
export const createSecurePostQuery = (client, authProvider) => {
|
|
13
|
-
return (creatorOptions) => createSecureQueryCreator(creatorOptions, { method: 'POST', client, authProvider });
|
|
14
|
-
};
|
|
15
|
-
export const createPutQuery = (client) => {
|
|
16
|
-
return (creatorOptions) => createQueryCreator(creatorOptions, { method: 'PUT', client });
|
|
17
|
-
};
|
|
18
|
-
export const createSecurePutQuery = (client, authProvider) => {
|
|
19
|
-
return (creatorOptions) => createSecureQueryCreator(creatorOptions, { method: 'PUT', client, authProvider });
|
|
20
|
-
};
|
|
21
|
-
export const createDeleteQuery = (client) => {
|
|
22
|
-
return (creatorOptions) => createQueryCreator(creatorOptions, { method: 'DELETE', client });
|
|
23
|
-
};
|
|
24
|
-
export const createSecureDeleteQuery = (client, authProvider) => {
|
|
25
|
-
return (creatorOptions) => createSecureQueryCreator(creatorOptions, { method: 'DELETE', client, authProvider });
|
|
26
|
-
};
|
|
27
|
-
export const createPatchQuery = (client) => {
|
|
28
|
-
return (creatorOptions) => createQueryCreator(creatorOptions, { method: 'PATCH', client });
|
|
29
|
-
};
|
|
30
|
-
export const createSecurePatchQuery = (client, authProvider) => {
|
|
31
|
-
return (creatorOptions) => createSecureQueryCreator(creatorOptions, { method: 'PATCH', client, authProvider });
|
|
32
|
-
};
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktY3JlYXRvci10ZW1wbGF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvZXhwZXJpbWVudGFsL3F1ZXJ5LWNyZWF0b3ItdGVtcGxhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBNkIsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVsRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUF5QixFQUFFLEVBQUU7SUFDMUQsT0FBTyxDQUEwQixjQUFnRCxFQUFFLEVBQUUsQ0FDbkYsa0JBQWtCLENBQVEsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsTUFBeUIsRUFBRSxZQUF5QyxFQUFFLEVBQUU7SUFDM0csT0FBTyxDQUEwQixjQUFnRCxFQUFFLEVBQUUsQ0FDbkYsd0JBQXdCLENBQVEsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztBQUM3RixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUF5QixFQUFFLEVBQUU7SUFDM0QsT0FBTyxDQUEwQixjQUFnRCxFQUFFLEVBQUUsQ0FDbkYsa0JBQWtCLENBQVEsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsTUFBeUIsRUFBRSxZQUF5QyxFQUFFLEVBQUU7SUFDNUcsT0FBTyxDQUEwQixjQUFnRCxFQUFFLEVBQUUsQ0FDbkYsd0JBQXdCLENBQVEsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztBQUM5RixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUF5QixFQUFFLEVBQUU7SUFDMUQsT0FBTyxDQUEwQixjQUFnRCxFQUFFLEVBQUUsQ0FDbkYsa0JBQWtCLENBQVEsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsTUFBeUIsRUFBRSxZQUF5QyxFQUFFLEVBQUU7SUFDM0csT0FBTyxDQUEwQixjQUFnRCxFQUFFLEVBQUUsQ0FDbkYsd0JBQXdCLENBQVEsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztBQUM3RixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQXlCLEVBQUUsRUFBRTtJQUM3RCxPQUFPLENBQTBCLGNBQWdELEVBQUUsRUFBRSxDQUNuRixrQkFBa0IsQ0FBUSxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDNUUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxNQUF5QixFQUFFLFlBQXlDLEVBQUUsRUFBRTtJQUM5RyxPQUFPLENBQTBCLGNBQWdELEVBQUUsRUFBRSxDQUNuRix3QkFBd0IsQ0FBUSxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBQ2hHLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBeUIsRUFBRSxFQUFFO0lBQzVELE9BQU8sQ0FBMEIsY0FBZ0QsRUFBRSxFQUFFLENBQ25GLGtCQUFrQixDQUFRLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUMzRSxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLE1BQXlCLEVBQUUsWUFBeUMsRUFBRSxFQUFFO0lBQzdHLE9BQU8sQ0FBMEIsY0FBZ0QsRUFBRSxFQUFFLENBQ25GLHdCQUF3QixDQUFRLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFDL0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QmVhcmVyQXV0aFByb3ZpZGVyQ29uZmlnIH0gZnJvbSAnLi9iZWFyZXItYXV0aC1wcm92aWRlci1jb25maWcnO1xuaW1wb3J0IHsgUXVlcnlBcmdzIH0gZnJvbSAnLi9xdWVyeSc7XG5pbXBvcnQgeyBRdWVyeUNsaWVudENvbmZpZyB9IGZyb20gJy4vcXVlcnktY2xpZW50LWNvbmZpZyc7XG5pbXBvcnQgeyBDcmVhdGVRdWVyeUNyZWF0b3JPcHRpb25zLCBjcmVhdGVRdWVyeUNyZWF0b3IgfSBmcm9tICcuL3F1ZXJ5LWNyZWF0b3InO1xuaW1wb3J0IHsgY3JlYXRlU2VjdXJlUXVlcnlDcmVhdG9yIH0gZnJvbSAnLi9zZWN1cmUtcXVlcnktY3JlYXRvcic7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVHZXRRdWVyeSA9IChjbGllbnQ6IFF1ZXJ5Q2xpZW50Q29uZmlnKSA9PiB7XG4gIHJldHVybiA8VEFyZ3MgZXh0ZW5kcyBRdWVyeUFyZ3M+KGNyZWF0b3JPcHRpb25zOiBDcmVhdGVRdWVyeUNyZWF0b3JPcHRpb25zPFRBcmdzPikgPT5cbiAgICBjcmVhdGVRdWVyeUNyZWF0b3I8VEFyZ3M+KGNyZWF0b3JPcHRpb25zLCB7IG1ldGhvZDogJ0dFVCcsIGNsaWVudCB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTZWN1cmVHZXRRdWVyeSA9IChjbGllbnQ6IFF1ZXJ5Q2xpZW50Q29uZmlnLCBhdXRoUHJvdmlkZXI6IEFueUJlYXJlckF1dGhQcm92aWRlckNvbmZpZykgPT4ge1xuICByZXR1cm4gPFRBcmdzIGV4dGVuZHMgUXVlcnlBcmdzPihjcmVhdG9yT3B0aW9uczogQ3JlYXRlUXVlcnlDcmVhdG9yT3B0aW9uczxUQXJncz4pID0+XG4gICAgY3JlYXRlU2VjdXJlUXVlcnlDcmVhdG9yPFRBcmdzPihjcmVhdG9yT3B0aW9ucywgeyBtZXRob2Q6ICdHRVQnLCBjbGllbnQsIGF1dGhQcm92aWRlciB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQb3N0UXVlcnkgPSAoY2xpZW50OiBRdWVyeUNsaWVudENvbmZpZykgPT4ge1xuICByZXR1cm4gPFRBcmdzIGV4dGVuZHMgUXVlcnlBcmdzPihjcmVhdG9yT3B0aW9uczogQ3JlYXRlUXVlcnlDcmVhdG9yT3B0aW9uczxUQXJncz4pID0+XG4gICAgY3JlYXRlUXVlcnlDcmVhdG9yPFRBcmdzPihjcmVhdG9yT3B0aW9ucywgeyBtZXRob2Q6ICdQT1NUJywgY2xpZW50IH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNlY3VyZVBvc3RRdWVyeSA9IChjbGllbnQ6IFF1ZXJ5Q2xpZW50Q29uZmlnLCBhdXRoUHJvdmlkZXI6IEFueUJlYXJlckF1dGhQcm92aWRlckNvbmZpZykgPT4ge1xuICByZXR1cm4gPFRBcmdzIGV4dGVuZHMgUXVlcnlBcmdzPihjcmVhdG9yT3B0aW9uczogQ3JlYXRlUXVlcnlDcmVhdG9yT3B0aW9uczxUQXJncz4pID0+XG4gICAgY3JlYXRlU2VjdXJlUXVlcnlDcmVhdG9yPFRBcmdzPihjcmVhdG9yT3B0aW9ucywgeyBtZXRob2Q6ICdQT1NUJywgY2xpZW50LCBhdXRoUHJvdmlkZXIgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUHV0UXVlcnkgPSAoY2xpZW50OiBRdWVyeUNsaWVudENvbmZpZykgPT4ge1xuICByZXR1cm4gPFRBcmdzIGV4dGVuZHMgUXVlcnlBcmdzPihjcmVhdG9yT3B0aW9uczogQ3JlYXRlUXVlcnlDcmVhdG9yT3B0aW9uczxUQXJncz4pID0+XG4gICAgY3JlYXRlUXVlcnlDcmVhdG9yPFRBcmdzPihjcmVhdG9yT3B0aW9ucywgeyBtZXRob2Q6ICdQVVQnLCBjbGllbnQgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlU2VjdXJlUHV0UXVlcnkgPSAoY2xpZW50OiBRdWVyeUNsaWVudENvbmZpZywgYXV0aFByb3ZpZGVyOiBBbnlCZWFyZXJBdXRoUHJvdmlkZXJDb25maWcpID0+IHtcbiAgcmV0dXJuIDxUQXJncyBleHRlbmRzIFF1ZXJ5QXJncz4oY3JlYXRvck9wdGlvbnM6IENyZWF0ZVF1ZXJ5Q3JlYXRvck9wdGlvbnM8VEFyZ3M+KSA9PlxuICAgIGNyZWF0ZVNlY3VyZVF1ZXJ5Q3JlYXRvcjxUQXJncz4oY3JlYXRvck9wdGlvbnMsIHsgbWV0aG9kOiAnUFVUJywgY2xpZW50LCBhdXRoUHJvdmlkZXIgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRGVsZXRlUXVlcnkgPSAoY2xpZW50OiBRdWVyeUNsaWVudENvbmZpZykgPT4ge1xuICByZXR1cm4gPFRBcmdzIGV4dGVuZHMgUXVlcnlBcmdzPihjcmVhdG9yT3B0aW9uczogQ3JlYXRlUXVlcnlDcmVhdG9yT3B0aW9uczxUQXJncz4pID0+XG4gICAgY3JlYXRlUXVlcnlDcmVhdG9yPFRBcmdzPihjcmVhdG9yT3B0aW9ucywgeyBtZXRob2Q6ICdERUxFVEUnLCBjbGllbnQgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlU2VjdXJlRGVsZXRlUXVlcnkgPSAoY2xpZW50OiBRdWVyeUNsaWVudENvbmZpZywgYXV0aFByb3ZpZGVyOiBBbnlCZWFyZXJBdXRoUHJvdmlkZXJDb25maWcpID0+IHtcbiAgcmV0dXJuIDxUQXJncyBleHRlbmRzIFF1ZXJ5QXJncz4oY3JlYXRvck9wdGlvbnM6IENyZWF0ZVF1ZXJ5Q3JlYXRvck9wdGlvbnM8VEFyZ3M+KSA9PlxuICAgIGNyZWF0ZVNlY3VyZVF1ZXJ5Q3JlYXRvcjxUQXJncz4oY3JlYXRvck9wdGlvbnMsIHsgbWV0aG9kOiAnREVMRVRFJywgY2xpZW50LCBhdXRoUHJvdmlkZXIgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUGF0Y2hRdWVyeSA9IChjbGllbnQ6IFF1ZXJ5Q2xpZW50Q29uZmlnKSA9PiB7XG4gIHJldHVybiA8VEFyZ3MgZXh0ZW5kcyBRdWVyeUFyZ3M+KGNyZWF0b3JPcHRpb25zOiBDcmVhdGVRdWVyeUNyZWF0b3JPcHRpb25zPFRBcmdzPikgPT5cbiAgICBjcmVhdGVRdWVyeUNyZWF0b3I8VEFyZ3M+KGNyZWF0b3JPcHRpb25zLCB7IG1ldGhvZDogJ1BBVENIJywgY2xpZW50IH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNlY3VyZVBhdGNoUXVlcnkgPSAoY2xpZW50OiBRdWVyeUNsaWVudENvbmZpZywgYXV0aFByb3ZpZGVyOiBBbnlCZWFyZXJBdXRoUHJvdmlkZXJDb25maWcpID0+IHtcbiAgcmV0dXJuIDxUQXJncyBleHRlbmRzIFF1ZXJ5QXJncz4oY3JlYXRvck9wdGlvbnM6IENyZWF0ZVF1ZXJ5Q3JlYXRvck9wdGlvbnM8VEFyZ3M+KSA9PlxuICAgIGNyZWF0ZVNlY3VyZVF1ZXJ5Q3JlYXRvcjxUQXJncz4oY3JlYXRvck9wdGlvbnMsIHsgbWV0aG9kOiAnUEFUQ0gnLCBjbGllbnQsIGF1dGhQcm92aWRlciB9KTtcbn07XG4iXX0=
|