@ethlete/query 5.16.0 → 5.16.2
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/esm2022/ethlete-query.mjs +5 -0
- package/esm2022/index.mjs +20 -0
- package/esm2022/lib/auth/auth-provider.types.mjs +2 -0
- package/esm2022/lib/auth/auth-provider.utils.mjs +25 -0
- package/esm2022/lib/auth/basic-auth-provider.mjs +15 -0
- package/esm2022/lib/auth/bearer-auth-provider.mjs +168 -0
- package/esm2022/lib/auth/custom-header-auth-provider.mjs +12 -0
- package/esm2022/lib/auth/index.mjs +6 -0
- package/esm2022/lib/class-validator/class-validator.types.mjs +2 -0
- package/esm2022/lib/class-validator/class-validator.utils.mjs +4 -0
- package/esm2022/lib/class-validator/index.mjs +3 -0
- package/esm2022/lib/devtools/components/query-devtools/index.mjs +2 -0
- package/esm2022/lib/devtools/components/query-devtools/query-devtools.component.mjs +297 -0
- package/esm2022/lib/devtools/pipes/index.mjs +2 -0
- package/esm2022/lib/devtools/pipes/query-short-name.pipe.mjs +24 -0
- package/esm2022/lib/devtools/utils/index.mjs +2 -0
- package/esm2022/lib/devtools/utils/query-client.utils.mjs +13 -0
- package/esm2022/lib/directives/index.mjs +4 -0
- package/esm2022/lib/directives/infinity-query-trigger.directive.mjs +56 -0
- package/esm2022/lib/directives/infinity-query.directive.mjs +147 -0
- package/esm2022/lib/directives/query.directive.mjs +123 -0
- package/esm2022/lib/entity/entity-store.mjs +127 -0
- package/esm2022/lib/entity/entity.types.mjs +2 -0
- package/esm2022/lib/entity/entity.utils.mjs +29 -0
- package/esm2022/lib/entity/index.mjs +4 -0
- package/esm2022/lib/gql/gql.mjs +23 -0
- package/esm2022/lib/gql/index.mjs +2 -0
- package/esm2022/lib/infinite-query/index.mjs +4 -0
- package/esm2022/lib/infinite-query/infinity-query.mjs +171 -0
- package/esm2022/lib/infinite-query/infinity-query.types.mjs +2 -0
- package/esm2022/lib/infinite-query/infinity-query.utils.mjs +3 -0
- package/esm2022/lib/logger/index.mjs +2 -0
- package/esm2022/lib/logger/logger.mjs +16 -0
- package/esm2022/lib/query/index.mjs +4 -0
- package/esm2022/lib/query/query.mjs +430 -0
- package/esm2022/lib/query/query.types.mjs +2 -0
- package/esm2022/lib/query/query.utils.mjs +253 -0
- package/esm2022/lib/query-client/index.mjs +4 -0
- package/esm2022/lib/query-client/query-client.mjs +80 -0
- package/esm2022/lib/query-client/query-client.types.mjs +2 -0
- package/esm2022/lib/query-client/query-client.utils.mjs +20 -0
- package/esm2022/lib/query-creator/index.mjs +3 -0
- package/esm2022/lib/query-creator/query-creator.mjs +55 -0
- package/esm2022/lib/query-creator/query-creator.types.mjs +2 -0
- package/esm2022/lib/query-form/index.mjs +4 -0
- package/esm2022/lib/query-form/query-form.mjs +379 -0
- package/esm2022/lib/query-form/query-form.types.mjs +2 -0
- package/esm2022/lib/query-form/query-form.utils.mjs +97 -0
- package/esm2022/lib/query-store/index.mjs +2 -0
- package/esm2022/lib/query-store/query-store.mjs +144 -0
- package/esm2022/lib/request/index.mjs +4 -0
- package/esm2022/lib/request/request.mjs +196 -0
- package/esm2022/lib/request/request.types.mjs +2 -0
- package/esm2022/lib/request/request.util.mjs +252 -0
- package/esm2022/lib/symfony/index.mjs +3 -0
- package/esm2022/lib/symfony/symfony.types.mjs +2 -0
- package/esm2022/lib/symfony/symfony.utils.mjs +31 -0
- package/esm2022/lib/utils/data.utils.mjs +138 -0
- package/esm2022/lib/utils/deep-freeze.util.mjs +17 -0
- package/esm2022/lib/utils/def.util.mjs +8 -0
- package/esm2022/lib/utils/index.mjs +4 -0
- package/fesm2022/ethlete-query.mjs +3289 -0
- package/fesm2022/ethlete-query.mjs.map +1 -0
- package/{src/index.ts → index.d.ts} +0 -2
- package/lib/auth/auth-provider.types.d.ts +133 -0
- package/lib/auth/auth-provider.utils.d.ts +9 -0
- package/lib/auth/basic-auth-provider.d.ts +10 -0
- package/lib/auth/bearer-auth-provider.d.ts +23 -0
- package/lib/auth/custom-header-auth-provider.d.ts +9 -0
- package/{src/lib/class-validator/class-validator.types.ts → lib/class-validator/class-validator.types.d.ts} +3 -4
- package/lib/class-validator/class-validator.utils.d.ts +2 -0
- package/lib/devtools/components/query-devtools/query-devtools.component.d.ts +151 -0
- package/lib/devtools/pipes/query-short-name.pipe.d.ts +8 -0
- package/lib/devtools/utils/query-client.utils.d.ts +12 -0
- package/lib/directives/infinity-query-trigger.directive.d.ts +15 -0
- package/lib/directives/infinity-query.directive.d.ts +49 -0
- package/lib/directives/query.directive.d.ts +63 -0
- package/lib/entity/entity-store.d.ts +25 -0
- package/lib/entity/entity.types.d.ts +25 -0
- package/lib/entity/entity.utils.d.ts +12 -0
- package/lib/gql/gql.d.ts +6 -0
- package/lib/infinite-query/infinity-query.d.ts +29 -0
- package/lib/infinite-query/infinity-query.types.d.ts +104 -0
- package/lib/infinite-query/infinity-query.utils.d.ts +4 -0
- package/lib/logger/logger.d.ts +12 -0
- package/lib/query/query.d.ts +60 -0
- package/lib/query/query.types.d.ts +388 -0
- package/lib/query/query.utils.d.ts +82 -0
- package/lib/query-client/query-client.d.ts +29 -0
- package/lib/query-client/query-client.types.d.ts +82 -0
- package/lib/query-client/query-client.utils.d.ts +4 -0
- package/lib/query-creator/query-creator.d.ts +20 -0
- package/lib/query-creator/query-creator.types.d.ts +13 -0
- package/lib/query-form/query-form.d.ts +91 -0
- package/lib/query-form/query-form.types.d.ts +145 -0
- package/lib/query-form/query-form.utils.d.ts +13 -0
- package/lib/query-store/query-store.d.ts +31 -0
- package/lib/request/request.d.ts +3 -0
- package/lib/request/request.types.d.ts +126 -0
- package/lib/request/request.util.d.ts +92 -0
- package/lib/symfony/symfony.types.d.ts +19 -0
- package/lib/symfony/symfony.utils.d.ts +6 -0
- package/lib/utils/data.utils.d.ts +59 -0
- package/lib/utils/deep-freeze.util.d.ts +1 -0
- package/{src/lib/utils/def.util.ts → lib/utils/def.util.d.ts} +1 -1
- package/package.json +23 -6
- package/.eslintrc.json +0 -40
- package/jest.config.ts +0 -23
- package/ng-package.json +0 -8
- package/project.json +0 -37
- package/src/lib/auth/auth-provider.types.ts +0 -160
- package/src/lib/auth/auth-provider.utils.ts +0 -39
- package/src/lib/auth/basic-auth-provider.ts +0 -17
- package/src/lib/auth/bearer-auth-provider.ts +0 -243
- package/src/lib/auth/custom-header-auth-provider.ts +0 -13
- package/src/lib/class-validator/class-validator.utils.ts +0 -5
- package/src/lib/devtools/components/query-devtools/query-devtools.component.html +0 -402
- package/src/lib/devtools/components/query-devtools/query-devtools.component.scss +0 -360
- package/src/lib/devtools/components/query-devtools/query-devtools.component.ts +0 -427
- package/src/lib/devtools/pipes/query-short-name.pipe.ts +0 -24
- package/src/lib/devtools/utils/query-client.utils.ts +0 -25
- package/src/lib/directives/infinity-query-trigger.directive.ts +0 -58
- package/src/lib/directives/infinity-query.directive.ts +0 -208
- package/src/lib/directives/query.directive.ts +0 -201
- package/src/lib/entity/entity-store.ts +0 -180
- package/src/lib/entity/entity.types.ts +0 -34
- package/src/lib/entity/entity.utils.ts +0 -51
- package/src/lib/gql/gql.ts +0 -22
- package/src/lib/infinite-query/infinity-query.ts +0 -245
- package/src/lib/infinite-query/infinity-query.types.ts +0 -149
- package/src/lib/infinite-query/infinity-query.utils.ts +0 -14
- package/src/lib/logger/logger.ts +0 -30
- package/src/lib/query/query.ts +0 -631
- package/src/lib/query/query.types.ts +0 -532
- package/src/lib/query/query.utils.spec.ts +0 -92
- package/src/lib/query/query.utils.ts +0 -450
- package/src/lib/query-client/query-client.spec.ts +0 -77
- package/src/lib/query-client/query-client.ts +0 -195
- package/src/lib/query-client/query-client.types.ts +0 -101
- package/src/lib/query-client/query-client.utils.spec.ts +0 -61
- package/src/lib/query-client/query-client.utils.ts +0 -28
- package/src/lib/query-creator/query-creator.ts +0 -103
- package/src/lib/query-creator/query-creator.types.ts +0 -74
- package/src/lib/query-form/query-form.ts +0 -526
- package/src/lib/query-form/query-form.types.ts +0 -169
- package/src/lib/query-form/query-form.utils.ts +0 -116
- package/src/lib/query-store/query-store.ts +0 -192
- package/src/lib/request/request.ts +0 -253
- package/src/lib/request/request.types.ts +0 -164
- package/src/lib/request/request.util.spec.ts +0 -177
- package/src/lib/request/request.util.ts +0 -399
- package/src/lib/stories/angular-example-page.mdx +0 -85
- package/src/lib/stories/authentication-page.mdx +0 -35
- package/src/lib/stories/changelog-page.mdx +0 -9
- package/src/lib/stories/client-page.mdx +0 -100
- package/src/lib/stories/queries-page.mdx +0 -117
- package/src/lib/symfony/symfony.types.ts +0 -21
- package/src/lib/symfony/symfony.utils.ts +0 -43
- package/src/lib/utils/data.utils.ts +0 -280
- package/src/lib/utils/deep-freeze.util.ts +0 -21
- package/src/test-setup.ts +0 -1
- package/tsconfig.json +0 -29
- package/tsconfig.lib.json +0 -12
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -11
- /package/{src/lib/auth/index.ts → lib/auth/index.d.ts} +0 -0
- /package/{src/lib/class-validator/index.ts → lib/class-validator/index.d.ts} +0 -0
- /package/{src/lib/devtools/components/query-devtools/index.ts → lib/devtools/components/query-devtools/index.d.ts} +0 -0
- /package/{src/lib/devtools/pipes/index.ts → lib/devtools/pipes/index.d.ts} +0 -0
- /package/{src/lib/devtools/utils/index.ts → lib/devtools/utils/index.d.ts} +0 -0
- /package/{src/lib/directives/index.ts → lib/directives/index.d.ts} +0 -0
- /package/{src/lib/entity/index.ts → lib/entity/index.d.ts} +0 -0
- /package/{src/lib/gql/index.ts → lib/gql/index.d.ts} +0 -0
- /package/{src/lib/infinite-query/index.ts → lib/infinite-query/index.d.ts} +0 -0
- /package/{src/lib/logger/index.ts → lib/logger/index.d.ts} +0 -0
- /package/{src/lib/query/index.ts → lib/query/index.d.ts} +0 -0
- /package/{src/lib/query-client/index.ts → lib/query-client/index.d.ts} +0 -0
- /package/{src/lib/query-creator/index.ts → lib/query-creator/index.d.ts} +0 -0
- /package/{src/lib/query-form/index.ts → lib/query-form/index.d.ts} +0 -0
- /package/{src/lib/query-store/index.ts → lib/query-store/index.d.ts} +0 -0
- /package/{src/lib/request/index.ts → lib/request/index.d.ts} +0 -0
- /package/{src/lib/symfony/index.ts → lib/symfony/index.d.ts} +0 -0
- /package/{src/lib/utils/index.ts → lib/utils/index.d.ts} +0 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Subject, fromEvent, take, takeUntil, timer } from 'rxjs';
|
|
2
|
+
export class QueryStore {
|
|
3
|
+
constructor(_config) {
|
|
4
|
+
this._config = _config;
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
this._store = new Map();
|
|
9
|
+
this._garbageCollector = null;
|
|
10
|
+
this._isInLowResourceMode = false;
|
|
11
|
+
this._lastBlurTimestamp = Date.now();
|
|
12
|
+
this._storeChange$ = new Subject();
|
|
13
|
+
this._queryCreated$ = new Subject();
|
|
14
|
+
this.storeChange$ = this._storeChange$.asObservable();
|
|
15
|
+
this.queryCreated$ = this._queryCreated$.asObservable();
|
|
16
|
+
this._initSmartQueryHandling();
|
|
17
|
+
}
|
|
18
|
+
add(id, query) {
|
|
19
|
+
this._store.set(id, query);
|
|
20
|
+
this._initGarbageCollector();
|
|
21
|
+
this._logState(id, query, 'SET');
|
|
22
|
+
this._storeChange$.next(id);
|
|
23
|
+
}
|
|
24
|
+
get(id) {
|
|
25
|
+
return this._store.get(id) ?? null;
|
|
26
|
+
}
|
|
27
|
+
remove(id) {
|
|
28
|
+
this._store.delete(id);
|
|
29
|
+
this._logState(id, null, 'REMOVE');
|
|
30
|
+
this._storeChange$.next(id);
|
|
31
|
+
}
|
|
32
|
+
forEach(callback) {
|
|
33
|
+
for (const [key, query] of this._store) {
|
|
34
|
+
callback(query, key);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
refreshQueriesInUse(config) {
|
|
38
|
+
const { ignoreCacheValidity, purgeUnused } = config ?? {};
|
|
39
|
+
for (const [key, query] of this._store) {
|
|
40
|
+
if (query.isInUse &&
|
|
41
|
+
(query.isExpired || ignoreCacheValidity) &&
|
|
42
|
+
query.autoRefreshOnConfig.queryClientDefaultHeadersChange) {
|
|
43
|
+
query.execute({ skipCache: true, _triggeredVia: 'auto' });
|
|
44
|
+
}
|
|
45
|
+
else if (purgeUnused && !query.isInUse) {
|
|
46
|
+
this.remove(key);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
53
|
+
_dispatchQueryCreated(query) {
|
|
54
|
+
this._queryCreated$.next(query);
|
|
55
|
+
}
|
|
56
|
+
_initSmartQueryHandling() {
|
|
57
|
+
const windowBlur$ = fromEvent(window, 'blur');
|
|
58
|
+
const windowFocus$ = fromEvent(window, 'focus');
|
|
59
|
+
windowBlur$.subscribe(() => {
|
|
60
|
+
timer(5000)
|
|
61
|
+
.pipe(takeUntil(windowFocus$), take(1))
|
|
62
|
+
.subscribe(() => {
|
|
63
|
+
this._lastBlurTimestamp = Date.now();
|
|
64
|
+
this._isInLowResourceMode = true;
|
|
65
|
+
this._stopGarbageCollector();
|
|
66
|
+
if (this._config?.enableSmartPolling) {
|
|
67
|
+
this.forEach((query) => {
|
|
68
|
+
if (!query.isPolling || !query._enableSmartPolling) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
query.pausePolling();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
windowFocus$.subscribe(() => {
|
|
77
|
+
if (!this._isInLowResourceMode) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this._isInLowResourceMode = false;
|
|
81
|
+
if (this._config?.enableSmartPolling || this._config?.autoRefreshQueriesOnWindowFocus) {
|
|
82
|
+
this.forEach((query) => {
|
|
83
|
+
if (this._config?.enableSmartPolling && query._isPollingPaused) {
|
|
84
|
+
query.resumePolling();
|
|
85
|
+
}
|
|
86
|
+
if (Date.now() - this._lastBlurTimestamp > 15000) {
|
|
87
|
+
if (this._config?.autoRefreshQueriesOnWindowFocus &&
|
|
88
|
+
query.isExpired &&
|
|
89
|
+
query.isInUse &&
|
|
90
|
+
query.autoRefreshOnConfig.windowFocus) {
|
|
91
|
+
query.execute({ skipCache: true, _triggeredVia: 'auto' });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
this._initGarbageCollector();
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
_logState(key, item, operation) {
|
|
100
|
+
if (!this._config?.enableChangeLogging)
|
|
101
|
+
return;
|
|
102
|
+
const stateAsJson = {};
|
|
103
|
+
this._store.forEach((value, key) => {
|
|
104
|
+
stateAsJson[key] = value;
|
|
105
|
+
});
|
|
106
|
+
console.log(`%c[${operation}] ${key}`, 'font-weight: bold');
|
|
107
|
+
console.log({ operation, key, item });
|
|
108
|
+
console.log(stateAsJson);
|
|
109
|
+
}
|
|
110
|
+
_initGarbageCollector() {
|
|
111
|
+
if (this._garbageCollector !== null) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
this._logGarbageCollector('Start');
|
|
115
|
+
this._garbageCollector = window.setInterval(() => {
|
|
116
|
+
this._runGarbageCollector();
|
|
117
|
+
}, 15000);
|
|
118
|
+
}
|
|
119
|
+
_stopGarbageCollector() {
|
|
120
|
+
if (this._garbageCollector !== null) {
|
|
121
|
+
window.clearInterval(this._garbageCollector);
|
|
122
|
+
this._garbageCollector = null;
|
|
123
|
+
this._logGarbageCollector('Stop');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
_runGarbageCollector() {
|
|
127
|
+
this._logGarbageCollector('Collecting...');
|
|
128
|
+
this._store.forEach((item, key) => {
|
|
129
|
+
if (item.isExpired && !item.isInUse) {
|
|
130
|
+
this.remove(key);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
this._logGarbageCollector('Collection done');
|
|
134
|
+
if (!this._store.size) {
|
|
135
|
+
this._stopGarbageCollector();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
_logGarbageCollector(action) {
|
|
139
|
+
if (!this._config?.enableGarbageCollectorLogging)
|
|
140
|
+
return;
|
|
141
|
+
console.log(`%cGC: ${action}`, 'color: yellow; font-weight: bold');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvcXVlcnktc3RvcmUvcXVlcnktc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHbEUsTUFBTSxPQUFPLFVBQVU7SUFnQnJCLFlBQ1UsT0FLUDtRQUxPLFlBQU8sR0FBUCxPQUFPLENBS2Q7UUFyQkg7O1dBRUc7UUFDTSxXQUFNLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFFdEMsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQUN4Qyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDN0IsdUJBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWhDLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUN0QyxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFZLENBQUM7UUFFeEMsaUJBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2pELGtCQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQVUxRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsR0FBRyxDQUFDLEVBQVUsRUFBRSxLQUFlO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUUzQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUU3QixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENB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QUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTdDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsTUFBYztRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSw2QkFBNkI7WUFBRSxPQUFPO1FBRXpELE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxNQUFNLEVBQUUsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YmplY3QsIGZyb21FdmVudCwgdGFrZSwgdGFrZVVudGlsLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQW55UXVlcnkgfSBmcm9tICcuLi9xdWVyeSc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeVN0b3JlIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcmVhZG9ubHkgX3N0b3JlID0gbmV3IE1hcDxzdHJpbmcsIEFueVF1ZXJ5PigpO1xuXG4gIHByaXZhdGUgX2dhcmJhZ2VDb2xsZWN0b3I6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9pc0luTG93UmVzb3VyY2VNb2RlID0gZmFsc2U7XG4gIHByaXZhdGUgX2xhc3RCbHVyVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcblxuICBwcml2YXRlIF9zdG9yZUNoYW5nZSQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgX3F1ZXJ5Q3JlYXRlZCQgPSBuZXcgU3ViamVjdDxBbnlRdWVyeT4oKTtcblxuICByZWFkb25seSBzdG9yZUNoYW5nZSQgPSB0aGlzLl9zdG9yZUNoYW5nZSQuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IHF1ZXJ5Q3JlYXRlZCQgPSB0aGlzLl9xdWVyeUNyZWF0ZWQkLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NvbmZpZz86IHtcbiAgICAgIGVuYWJsZUNoYW5nZUxvZ2dpbmc/OiBib29sZWFuO1xuICAgICAgZW5hYmxlR2FyYmFnZUNvbGxlY3RvckxvZ2dpbmc/OiBib29sZWFuO1xuICAgICAgYXV0b1JlZnJlc2hRdWVyaWVzT25XaW5kb3dGb2N1cz86IGJvb2xlYW47XG4gICAgICBlbmFibGVTbWFydFBvbGxpbmc/OiBib29sZWFuO1xuICAgIH0sXG4gICkge1xuICAgIHRoaXMuX2luaXRTbWFydFF1ZXJ5SGFuZGxpbmcoKTtcbiAgfVxuXG4gIGFkZChpZDogc3RyaW5nLCBxdWVyeTogQW55UXVlcnkpIHtcbiAgICB0aGlzLl9zdG9yZS5zZXQoaWQsIHF1ZXJ5KTtcblxuICAgIHRoaXMuX2luaXRHYXJiYWdlQ29sbGVjdG9yKCk7XG5cbiAgICB0aGlzLl9sb2dTdGF0ZShpZCwgcXVlcnksICdTRVQnKTtcblxuICAgIHRoaXMuX3N0b3JlQ2hhbmdlJC5uZXh0KGlkKTtcbiAgfVxuXG4gIGdldDxUIGV4dGVuZHMgQW55UXVlcnk+KGlkOiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuICh0aGlzLl9zdG9yZS5nZXQoaWQpIGFzIFQpID8/IG51bGw7XG4gIH1cblxuICByZW1vdmUoaWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3N0b3JlLmRlbGV0ZShpZCk7XG5cbiAgICB0aGlzLl9sb2dTdGF0ZShpZCwgbnVsbCwgJ1JFTU9WRScpO1xuXG4gICAgdGhpcy5fc3RvcmVDaGFuZ2UkLm5leHQoaWQpO1xuICB9XG5cbiAgZm9yRWFjaChjYWxsYmFjazogKHZhbHVlOiBBbnlRdWVyeSwga2V5OiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHF1ZXJ5XSBvZiB0aGlzLl9zdG9yZSkge1xuICAgICAgY2FsbGJhY2socXVlcnksIGtleSk7XG4gICAgfVxuICB9XG5cbiAgcmVmcmVzaFF1ZXJpZXNJblVzZShjb25maWc/OiB7IGlnbm9yZUNhY2hlVmFsaWRpdHk/OiBib29sZWFuOyBwdXJnZVVudXNlZD86IGJvb2xlYW4gfSkge1xuICAgIGNvbnN0IHsgaWdub3JlQ2FjaGVWYWxpZGl0eSwgcHVyZ2VVbnVzZWQgfSA9IGNvbmZpZyA/PyB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgcXVlcnldIG9mIHRoaXMuX3N0b3JlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHF1ZXJ5LmlzSW5Vc2UgJiZcbiAgICAgICAgKHF1ZXJ5LmlzRXhwaXJlZCB8fCBpZ25vcmVDYWNoZVZhbGlkaXR5KSAmJlxuICAgICAgICBxdWVyeS5hdXRvUmVmcmVzaE9uQ29uZmlnLnF1ZXJ5Q2xpZW50RGVmYXVsdEhlYWRlcnNDaGFuZ2VcbiAgICAgICkge1xuICAgICAgICBxdWVyeS5leGVjdXRlKHsgc2tpcENhY2hlOiB0cnVlLCBfdHJpZ2dlcmVkVmlhOiAnYXV0bycgfSk7XG4gICAgICB9IGVsc2UgaWYgKHB1cmdlVW51c2VkICYmICFxdWVyeS5pc0luVXNlKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2Rpc3BhdGNoUXVlcnlDcmVhdGVkKHF1ZXJ5OiBBbnlRdWVyeSkge1xuICAgIHRoaXMuX3F1ZXJ5Q3JlYXRlZCQubmV4dChxdWVyeSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0U21hcnRRdWVyeUhhbmRsaW5nKCkge1xuICAgIGNvbnN0IHdpbmRvd0JsdXIkID0gZnJvbUV2ZW50PEV2ZW50Pih3aW5kb3csICdibHVyJyk7XG4gICAgY29uc3Qgd2luZG93Rm9jdXMkID0gZnJvbUV2ZW50PEV2ZW50Pih3aW5kb3csICdmb2N1cycpO1xuXG4gICAgd2luZG93Qmx1ciQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRpbWVyKDUwMDApXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh3aW5kb3dGb2N1cyQpLCB0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9sYXN0Qmx1clRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgICAgdGhpcy5faXNJbkxvd1Jlc291cmNlTW9kZSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fc3RvcEdhcmJhZ2VDb2xsZWN0b3IoKTtcblxuICAgICAgICAgIGlmICh0aGlzLl9jb25maWc/LmVuYWJsZVNtYXJ0UG9sbGluZykge1xuICAgICAgICAgICAgdGhpcy5mb3JFYWNoKChxdWVyeSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXF1ZXJ5LmlzUG9sbGluZyB8fCAhcXVlcnkuX2VuYWJsZVNtYXJ0UG9sbGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHF1ZXJ5LnBhdXNlUG9sbGluZygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHdpbmRvd0ZvY3VzJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9pc0luTG93UmVzb3VyY2VNb2RlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNJbkxvd1Jlc291cmNlTW9kZSA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5fY29uZmlnPy5lbmFibGVTbWFydFBvbGxpbmcgfHwgdGhpcy5fY29uZmlnPy5hdXRvUmVmcmVzaFF1ZXJpZXNPbldpbmRvd0ZvY3VzKSB7XG4gICAgICAgIHRoaXMuZm9yRWFjaCgocXVlcnkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fY29uZmlnPy5lbmFibGVTbWFydFBvbGxpbmcgJiYgcXVlcnkuX2lzUG9sbGluZ1BhdXNlZCkge1xuICAgICAgICAgICAgcXVlcnkucmVzdW1lUG9sbGluZygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5fbGFzdEJsdXJUaW1lc3RhbXAgPiAxNTAwMCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLl9jb25maWc/LmF1dG9SZWZyZXNoUXVlcmllc09uV2luZG93Rm9jdXMgJiZcbiAgICAgICAgICAgICAgcXVlcnkuaXNFeHBpcmVkICYmXG4gICAgICAgICAgICAgIHF1ZXJ5LmlzSW5Vc2UgJiZcbiAgICAgICAgICAgICAgcXVlcnkuYXV0b1JlZnJlc2hPbkNvbmZpZy53aW5kb3dGb2N1c1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5LmV4ZWN1dGUoeyBza2lwQ2FjaGU6IHRydWUsIF90cmlnZ2VyZWRWaWE6ICdhdXRvJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pbml0R2FyYmFnZUNvbGxlY3RvcigpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9nU3RhdGUoa2V5OiBzdHJpbmcgfCBudWxsLCBpdGVtOiBBbnlRdWVyeSB8IG51bGwsIG9wZXJhdGlvbjogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWc/LmVuYWJsZUNoYW5nZUxvZ2dpbmcpIHJldHVybjtcblxuICAgIGNvbnN0IHN0YXRlQXNKc29uOiBSZWNvcmQ8c3RyaW5nLCBBbnlRdWVyeT4gPSB7fTtcblxuICAgIHRoaXMuX3N0b3JlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIHN0YXRlQXNKc29uW2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGAlY1ske29wZXJhdGlvbn1dICR7a2V5fWAsICdmb250LXdlaWdodDogYm9sZCcpO1xuXG4gICAgY29uc29sZS5sb2coeyBvcGVyYXRpb24sIGtleSwgaXRlbSB9KTtcbiAgICBjb25zb2xlLmxvZyhzdGF0ZUFzSnNvbik7XG4gIH1cblxuICBwcml2YXRlIF9pbml0R2FyYmFnZUNvbGxlY3RvcigpIHtcbiAgICBpZiAodGhpcy5fZ2FyYmFnZUNvbGxlY3RvciAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ0dhcmJhZ2VDb2xsZWN0b3IoJ1N0YXJ0Jyk7XG5cbiAgICB0aGlzLl9nYXJiYWdlQ29sbGVjdG9yID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuX3J1bkdhcmJhZ2VDb2xsZWN0b3IoKTtcbiAgICB9LCAxNTAwMCk7XG4gIH1cblxuICBwcml2YXRlIF9zdG9wR2FyYmFnZUNvbGxlY3RvcigpIHtcbiAgICBpZiAodGhpcy5fZ2FyYmFnZUNvbGxlY3RvciAhPT0gbnVsbCkge1xuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fZ2FyYmFnZUNvbGxlY3Rvcik7XG4gICAgICB0aGlzLl9nYXJiYWdlQ29sbGVjdG9yID0gbnVsbDtcbiAgICAgIHRoaXMuX2xvZ0dhcmJhZ2VDb2xsZWN0b3IoJ1N0b3AnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9ydW5HYXJiYWdlQ29sbGVjdG9yKCkge1xuICAgIHRoaXMuX2xvZ0dhcmJhZ2VDb2xsZWN0b3IoJ0NvbGxlY3RpbmcuLi4nKTtcblxuICAgIHRoaXMuX3N0b3JlLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uaXNFeHBpcmVkICYmICFpdGVtLmlzSW5Vc2UpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuX2xvZ0dhcmJhZ2VDb2xsZWN0b3IoJ0NvbGxlY3Rpb24gZG9uZScpO1xuXG4gICAgaWYgKCF0aGlzLl9zdG9yZS5zaXplKSB7XG4gICAgICB0aGlzLl9zdG9wR2FyYmFnZUNvbGxlY3RvcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xvZ0dhcmJhZ2VDb2xsZWN0b3IoYWN0aW9uOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZz8uZW5hYmxlR2FyYmFnZUNvbGxlY3RvckxvZ2dpbmcpIHJldHVybjtcblxuICAgIGNvbnNvbGUubG9nKGAlY0dDOiAke2FjdGlvbn1gLCAnY29sb3I6IHllbGxvdzsgZm9udC13ZWlnaHQ6IGJvbGQnKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './request';
|
|
2
|
+
export * from './request.types';
|
|
3
|
+
export * from './request.util';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvcmVxdWVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3JlcXVlc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXF1ZXN0LnR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVxdWVzdC51dGlsJztcbiJdfQ==
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { buildTimestampFromSeconds, detectContentTypeHeader, extractExpiresInSeconds, forEachHeader, getResponseUrl, hasHeader, parseAllXhrResponseHeaders, serializeBody, shouldRetryRequest, } from './request.util';
|
|
3
|
+
const XSSI_PREFIX = /^\)\]\}',?\n/;
|
|
4
|
+
export const request = (config) => {
|
|
5
|
+
const headers = config.headers || {};
|
|
6
|
+
const responseType = config.responseType || 'json';
|
|
7
|
+
const body = config.body || null;
|
|
8
|
+
const url = config.urlWithParams.split('?')[0] || '';
|
|
9
|
+
const retryFn = config.retryFn || shouldRetryRequest;
|
|
10
|
+
let currentRetryCount = 0;
|
|
11
|
+
let retryTimeout = null;
|
|
12
|
+
return new Observable((observer) => {
|
|
13
|
+
const xhr = new XMLHttpRequest();
|
|
14
|
+
const reqBody = serializeBody(body);
|
|
15
|
+
const setupXhr = () => {
|
|
16
|
+
xhr.open(config.method, config.urlWithParams);
|
|
17
|
+
if (config.withCredentials) {
|
|
18
|
+
xhr.withCredentials = true;
|
|
19
|
+
}
|
|
20
|
+
forEachHeader(headers, (name, value) => xhr.setRequestHeader(name, value));
|
|
21
|
+
if (!hasHeader(headers, 'Accept')) {
|
|
22
|
+
xhr.setRequestHeader('Accept', 'application/json, text/plain, */*');
|
|
23
|
+
}
|
|
24
|
+
if (!hasHeader(headers, 'Content-Type')) {
|
|
25
|
+
const detectedType = detectContentTypeHeader(body);
|
|
26
|
+
if (detectedType) {
|
|
27
|
+
xhr.setRequestHeader('Content-Type', detectedType);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
xhr.responseType = responseType !== 'json' ? responseType : 'text';
|
|
31
|
+
};
|
|
32
|
+
setupXhr();
|
|
33
|
+
const partialFromXhr = () => {
|
|
34
|
+
const statusText = xhr.statusText || 'OK';
|
|
35
|
+
const headers = parseAllXhrResponseHeaders(xhr);
|
|
36
|
+
const _url = getResponseUrl(xhr) || url;
|
|
37
|
+
return { headers, status: xhr.status, statusText, url: _url };
|
|
38
|
+
};
|
|
39
|
+
const handleRetry = (error) => {
|
|
40
|
+
const newRetryCount = currentRetryCount + 1;
|
|
41
|
+
const { headers } = partialFromXhr();
|
|
42
|
+
const { retry, delay } = retryFn({ currentRetryCount: newRetryCount, headers, error });
|
|
43
|
+
if (!retry) {
|
|
44
|
+
observer.next({ type: 'failure', headers, error });
|
|
45
|
+
observer.complete();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const _delay = delay ?? 1000;
|
|
49
|
+
observer.next({ type: 'delay-retry', headers, retryNumber: newRetryCount, retryDelay: _delay });
|
|
50
|
+
retryTimeout = window.setTimeout(() => {
|
|
51
|
+
setupXhr();
|
|
52
|
+
xhr.send(reqBody);
|
|
53
|
+
currentRetryCount = newRetryCount;
|
|
54
|
+
observer.next({ type: 'start', headers, isRetry: true, retryNumber: currentRetryCount, retryDelay: _delay });
|
|
55
|
+
}, _delay);
|
|
56
|
+
};
|
|
57
|
+
const onLoad = async () => {
|
|
58
|
+
const { headers, statusText, url } = partialFromXhr();
|
|
59
|
+
let { status } = partialFromXhr();
|
|
60
|
+
let body = null;
|
|
61
|
+
if (status !== 204 /* HttpStatusCode.NoContent */) {
|
|
62
|
+
body = typeof xhr.response === 'undefined' ? xhr.responseText : xhr.response;
|
|
63
|
+
}
|
|
64
|
+
if (status === 0) {
|
|
65
|
+
status = body ? 200 /* HttpStatusCode.Ok */ : 0;
|
|
66
|
+
}
|
|
67
|
+
let ok = status >= 200 && status < 300;
|
|
68
|
+
if (responseType === 'json' && typeof body === 'string') {
|
|
69
|
+
const originalBody = body;
|
|
70
|
+
body = body.replace(XSSI_PREFIX, '');
|
|
71
|
+
try {
|
|
72
|
+
body = body !== '' ? JSON.parse(body) : null;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
body = originalBody;
|
|
76
|
+
if (ok) {
|
|
77
|
+
ok = false;
|
|
78
|
+
body = { error, text: body };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else if (!ok && body instanceof Blob) {
|
|
83
|
+
try {
|
|
84
|
+
const text = await body.text();
|
|
85
|
+
if (body.type === 'application/json') {
|
|
86
|
+
body = JSON.parse(text);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
body = text;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
// Ignore the error.
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (ok) {
|
|
97
|
+
const successEvent = {
|
|
98
|
+
type: 'success',
|
|
99
|
+
headers,
|
|
100
|
+
response: body,
|
|
101
|
+
};
|
|
102
|
+
const expiresInSeconds = config.cacheAdapter?.(headers) ?? extractExpiresInSeconds(headers);
|
|
103
|
+
const expiresInTimestamp = buildTimestampFromSeconds(expiresInSeconds);
|
|
104
|
+
if (expiresInTimestamp) {
|
|
105
|
+
successEvent.expiresInTimestamp = expiresInTimestamp;
|
|
106
|
+
}
|
|
107
|
+
observer.next(successEvent);
|
|
108
|
+
observer.complete();
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
handleRetry({
|
|
112
|
+
url,
|
|
113
|
+
detail: body,
|
|
114
|
+
status,
|
|
115
|
+
statusText,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const onError = (error) => {
|
|
120
|
+
const { url } = partialFromXhr();
|
|
121
|
+
handleRetry({
|
|
122
|
+
url,
|
|
123
|
+
detail: error,
|
|
124
|
+
status: xhr.status || 0,
|
|
125
|
+
statusText: xhr.statusText || 'Unknown Error',
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
const onDownProgress = (event) => {
|
|
129
|
+
const { headers } = partialFromXhr();
|
|
130
|
+
const progress = {
|
|
131
|
+
type: 'download-progress',
|
|
132
|
+
headers,
|
|
133
|
+
progress: {
|
|
134
|
+
current: event.loaded,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
if (event.lengthComputable) {
|
|
138
|
+
const progressPercent = (event.loaded / event.total) * 100;
|
|
139
|
+
progress.progress.percentage = Math.round(progressPercent * 100) / 100;
|
|
140
|
+
progress.progress.total = event.total;
|
|
141
|
+
}
|
|
142
|
+
if (responseType === 'text' && !!xhr.responseText) {
|
|
143
|
+
progress.partialText = xhr.responseText;
|
|
144
|
+
}
|
|
145
|
+
observer.next(progress);
|
|
146
|
+
};
|
|
147
|
+
const onUpProgress = (event) => {
|
|
148
|
+
const { headers } = partialFromXhr();
|
|
149
|
+
const progress = {
|
|
150
|
+
type: 'upload-progress',
|
|
151
|
+
headers,
|
|
152
|
+
progress: {
|
|
153
|
+
current: event.loaded,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
if (event.lengthComputable) {
|
|
157
|
+
const progressPercent = (event.loaded / event.total) * 100;
|
|
158
|
+
progress.progress.percentage = Math.round(progressPercent * 100) / 100;
|
|
159
|
+
progress.progress.total = event.total;
|
|
160
|
+
}
|
|
161
|
+
observer.next(progress);
|
|
162
|
+
};
|
|
163
|
+
xhr.addEventListener('load', onLoad);
|
|
164
|
+
xhr.addEventListener('error', onError);
|
|
165
|
+
xhr.addEventListener('timeout', onError);
|
|
166
|
+
xhr.addEventListener('abort', onError);
|
|
167
|
+
if (config.reportProgress) {
|
|
168
|
+
xhr.addEventListener('progress', onDownProgress);
|
|
169
|
+
if (reqBody !== null && xhr.upload) {
|
|
170
|
+
xhr.upload.addEventListener('progress', onUpProgress);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
xhr.send(reqBody);
|
|
174
|
+
observer.next({ type: 'start', headers });
|
|
175
|
+
return () => {
|
|
176
|
+
xhr.removeEventListener('error', onError);
|
|
177
|
+
xhr.removeEventListener('abort', onError);
|
|
178
|
+
xhr.removeEventListener('load', onLoad);
|
|
179
|
+
xhr.removeEventListener('timeout', onError);
|
|
180
|
+
if (retryTimeout) {
|
|
181
|
+
window.clearTimeout(retryTimeout);
|
|
182
|
+
}
|
|
183
|
+
if (config.reportProgress) {
|
|
184
|
+
xhr.removeEventListener('progress', onDownProgress);
|
|
185
|
+
if (reqBody !== null && xhr.upload) {
|
|
186
|
+
xhr.upload.removeEventListener('progress', onUpProgress);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (xhr.readyState !== xhr.DONE) {
|
|
190
|
+
xhr.abort();
|
|
191
|
+
}
|
|
192
|
+
observer.next({ type: 'cancel', headers });
|
|
193
|
+
};
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9yZXF1ZXN0L3JlcXVlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLE1BQU0sQ0FBQztBQUU1QyxPQUFPLEVBRUwseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qix1QkFBdUIsRUFDdkIsYUFBYSxFQUNiLGNBQWMsRUFDZCxTQUFTLEVBQ1QsMEJBQTBCLEVBQzFCLGFBQWEsRUFDYixrQkFBa0IsR0FDbkIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUM7QUFFbkMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQXFCLE1BQXFCLEVBQXNDLEVBQUU7SUFDdkcsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDckMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUM7SUFDbkQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7SUFDakMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksa0JBQWtCLENBQUM7SUFDckQsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFDMUIsSUFBSSxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUV2QyxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBMEMsRUFBRSxFQUFFO1FBQ25FLE1BQU0sR0FBRyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFD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QUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQzNELENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDaEMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2QsQ0FBQztZQUVELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUGFydGlhbFhoclN0YXRlLCBSZXF1ZXN0Q29uZmlnLCBSZXF1ZXN0RXJyb3IsIFJlcXVlc3RFdmVudCB9IGZyb20gJy4vcmVxdWVzdC50eXBlcyc7XG5pbXBvcnQge1xuICBIdHRwU3RhdHVzQ29kZSxcbiAgYnVpbGRUaW1lc3RhbXBGcm9tU2Vjb25kcyxcbiAgZGV0ZWN0Q29udGVudFR5cGVIZWFkZXIsXG4gIGV4dHJhY3RFeHBpcmVzSW5TZWNvbmRzLFxuICBmb3JFYWNoSGVhZGVyLFxuICBnZXRSZXNwb25zZVVybCxcbiAgaGFzSGVhZGVyLFxuICBwYXJzZUFsbFhoclJlc3BvbnNlSGVhZGVycyxcbiAgc2VyaWFsaXplQm9keSxcbiAgc2hvdWxkUmV0cnlSZXF1ZXN0LFxufSBmcm9tICcuL3JlcXVlc3QudXRpbCc7XG5cbmNvbnN0IFhTU0lfUFJFRklYID0gL15cXClcXF1cXH0nLD9cXG4vO1xuXG5leHBvcnQgY29uc3QgcmVxdWVzdCA9IDxSZXNwb25zZSA9IHVua25vd24+KGNvbmZpZzogUmVxdWVzdENvbmZpZyk6IE9ic2VydmFibGU8UmVxdWVzdEV2ZW50PFJlc3BvbnNlPj4gPT4ge1xuICBjb25zdCBoZWFkZXJzID0gY29uZmlnLmhlYWRlcnMgfHwge307XG4gIGNvbnN0IHJlc3BvbnNlVHlwZSA9IGNvbmZpZy5yZXNwb25zZVR5cGUgfHwgJ2pzb24nO1xuICBjb25zdCBib2R5ID0gY29uZmlnLmJvZHkgfHwgbnVsbDtcbiAgY29uc3QgdXJsID0gY29uZmlnLnVybFdpdGhQYXJhbXMuc3BsaXQoJz8nKVswXSB8fCAnJztcbiAgY29uc3QgcmV0cnlGbiA9IGNvbmZpZy5yZXRyeUZuIHx8IHNob3VsZFJldHJ5UmVxdWVzdDtcbiAgbGV0IGN1cnJlbnRSZXRyeUNvdW50ID0gMDtcbiAgbGV0IHJldHJ5VGltZW91dDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8UmVxdWVzdEV2ZW50PFJlc3BvbnNlPj4pID0+IHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBjb25zdCByZXFCb2R5ID0gc2VyaWFsaXplQm9keShib2R5KTtcblxuICAgIGNvbnN0IHNldHVwWGhyID0gKCkgPT4ge1xuICAgICAgeGhyLm9wZW4oY29uZmlnLm1ldGhvZCwgY29uZmlnLnVybFdpdGhQYXJhbXMpO1xuICAgICAgaWYgKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGZvckVhY2hIZWFkZXIoaGVhZGVycywgKG5hbWUsIHZhbHVlKSA9PiB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSkpO1xuXG4gICAgICBpZiAoIWhhc0hlYWRlcihoZWFkZXJzLCAnQWNjZXB0JykpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFoYXNIZWFkZXIoaGVhZGVycywgJ0NvbnRlbnQtVHlwZScpKSB7XG4gICAgICAgIGNvbnN0IGRldGVjdGVkVHlwZSA9IGRldGVjdENvbnRlbnRUeXBlSGVhZGVyKGJvZHkpO1xuXG4gICAgICAgIGlmIChkZXRlY3RlZFR5cGUpIHtcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgZGV0ZWN0ZWRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlICE9PSAnanNvbicgPyByZXNwb25zZVR5cGUgOiAndGV4dCc7XG4gICAgfTtcblxuICAgIHNldHVwWGhyKCk7XG5cbiAgICBjb25zdCBwYXJ0aWFsRnJvbVhociA9ICgpOiBQYXJ0aWFsWGhyU3RhdGUgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzVGV4dCA9IHhoci5zdGF0dXNUZXh0IHx8ICdPSyc7XG4gICAgICBjb25zdCBoZWFkZXJzID0gcGFyc2VBbGxYaHJSZXNwb25zZUhlYWRlcnMoeGhyKTtcbiAgICAgIGNvbnN0IF91cmwgPSBnZXRSZXNwb25zZVVybCh4aHIpIHx8IHVybDtcblxuICAgICAgcmV0dXJuIHsgaGVhZGVycywgc3RhdHVzOiB4aHIuc3RhdHVzLCBzdGF0dXNUZXh0LCB1cmw6IF91cmwgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlUmV0cnkgPSAoZXJyb3I6IFJlcXVlc3RFcnJvcikgPT4ge1xuICAgICAgY29uc3QgbmV3UmV0cnlDb3VudCA9IGN1cnJlbnRSZXRyeUNvdW50ICsgMTtcbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcGFydGlhbEZyb21YaHIoKTtcbiAgICAgIGNvbnN0IHsgcmV0cnksIGRlbGF5IH0gPSByZXRyeUZuKHsgY3VycmVudFJldHJ5Q291bnQ6IG5ld1JldHJ5Q291bnQsIGhlYWRlcnMsIGVycm9yIH0pO1xuXG4gICAgICBpZiAoIXJldHJ5KSB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoeyB0eXBlOiAnZmFpbHVyZScsIGhlYWRlcnMsIGVycm9yIH0pO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IF9kZWxheSA9IGRlbGF5ID8/IDEwMDA7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgdHlwZTogJ2RlbGF5LXJldHJ5JywgaGVhZGVycywgcmV0cnlOdW1iZXI6IG5ld1JldHJ5Q291bnQsIHJldHJ5RGVsYXk6IF9kZWxheSB9KTtcblxuICAgICAgcmV0cnlUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZXR1cFhocigpO1xuICAgICAgICB4aHIuc2VuZChyZXFCb2R5KTtcbiAgICAgICAgY3VycmVudFJldHJ5Q291bnQgPSBuZXdSZXRyeUNvdW50O1xuICAgICAgICBvYnNlcnZlci5uZXh0KHsgdHlwZTogJ3N0YXJ0JywgaGVhZGVycywgaXNSZXRyeTogdHJ1ZSwgcmV0cnlOdW1iZXI6IGN1cnJlbnRSZXRyeUNvdW50LCByZXRyeURlbGF5OiBfZGVsYXkgfSk7XG4gICAgICB9LCBfZGVsYXkpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbkxvYWQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGhlYWRlcnMsIHN0YXR1c1RleHQsIHVybCB9ID0gcGFydGlhbEZyb21YaHIoKTtcblxuICAgICAgbGV0IHsgc3RhdHVzIH0gPSBwYXJ0aWFsRnJvbVhocigpO1xuXG4gICAgICBsZXQgYm9keTogdW5rbm93biB8IG51bGwgPSBudWxsO1xuXG4gICAgICBpZiAoc3RhdHVzICE9PSBIdHRwU3RhdHVzQ29kZS5Ob0NvbnRlbnQpIHtcbiAgICAgICAgYm9keSA9IHR5cGVvZiB4aHIucmVzcG9uc2UgPT09ICd1bmRlZmluZWQnID8geGhyLnJlc3BvbnNlVGV4dCA6IHhoci5yZXNwb25zZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXR1cyA9PT0gMCkge1xuICAgICAgICBzdGF0dXMgPSBib2R5ID8gSHR0cFN0YXR1c0NvZGUuT2sgOiAwO1xuICAgICAgfVxuXG4gICAgICBsZXQgb2sgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcblxuICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nICYmIHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbEJvZHkgPSBib2R5O1xuICAgICAgICBib2R5ID0gYm9keS5yZXBsYWNlKFhTU0lfUFJFRklYLCAnJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYm9keSA9IGJvZHkgIT09ICcnID8gSlNPTi5wYXJzZShib2R5IGFzIHN0cmluZykgOiBudWxsO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGJvZHkgPSBvcmlnaW5hbEJvZHk7XG5cbiAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgIG9rID0gZmFsc2U7XG4gICAgICAgICAgICBib2R5ID0geyBlcnJvciwgdGV4dDogYm9keSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghb2sgJiYgYm9keSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgYm9keS50ZXh0KCk7XG5cbiAgICAgICAgICBpZiAoYm9keS50eXBlID09PSAnYXBwbGljYXRpb24vanNvbicpIHtcbiAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib2R5ID0gdGV4dDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWdub3JlIHRoZSBlcnJvci5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob2spIHtcbiAgICAgICAgY29uc3Qgc3VjY2Vzc0V2ZW50OiBSZXF1ZXN0RXZlbnQ8UmVzcG9uc2U+ID0ge1xuICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIHJlc3BvbnNlOiBib2R5IGFzIFJlc3BvbnNlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGV4cGlyZXNJblNlY29uZHMgPSBjb25maWcuY2FjaGVBZGFwdGVyPy4oaGVhZGVycykgPz8gZXh0cmFjdEV4cGlyZXNJblNlY29uZHMoaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IGV4cGlyZXNJblRpbWVzdGFtcCA9IGJ1aWxkVGltZXN0YW1wRnJvbVNlY29uZHMoZXhwaXJlc0luU2Vjb25kcyk7XG5cbiAgICAgICAgaWYgKGV4cGlyZXNJblRpbWVzdGFtcCkge1xuICAgICAgICAgIHN1Y2Nlc3NFdmVudC5leHBpcmVzSW5UaW1lc3RhbXAgPSBleHBpcmVzSW5UaW1lc3RhbXA7XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5uZXh0KHN1Y2Nlc3NFdmVudCk7XG5cbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhbmRsZVJldHJ5KHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgZGV0YWlsOiBib2R5LFxuICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgdXJsIH0gPSBwYXJ0aWFsRnJvbVhocigpO1xuXG4gICAgICBoYW5kbGVSZXRyeSh7XG4gICAgICAgIHVybCxcbiAgICAgICAgZGV0YWlsOiBlcnJvcixcbiAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzIHx8IDAsXG4gICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0IHx8ICdVbmtub3duIEVycm9yJyxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBvbkRvd25Qcm9ncmVzcyA9IChldmVudDogUHJvZ3Jlc3NFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSBwYXJ0aWFsRnJvbVhocigpO1xuXG4gICAgICBjb25zdCBwcm9ncmVzczogUmVxdWVzdEV2ZW50ID0ge1xuICAgICAgICB0eXBlOiAnZG93bmxvYWQtcHJvZ3Jlc3MnLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBwcm9ncmVzczoge1xuICAgICAgICAgIGN1cnJlbnQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChldmVudC5sZW5ndGhDb21wdXRhYmxlKSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzUGVyY2VudCA9IChldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCkgKiAxMDA7XG4gICAgICAgIHByb2dyZXNzLnByb2dyZXNzLnBlcmNlbnRhZ2UgPSBNYXRoLnJvdW5kKHByb2dyZXNzUGVyY2VudCAqIDEwMCkgLyAxMDA7XG4gICAgICAgIHByb2dyZXNzLnByb2dyZXNzLnRvdGFsID0gZXZlbnQudG90YWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICd0ZXh0JyAmJiAhIXhoci5yZXNwb25zZVRleHQpIHtcbiAgICAgICAgcHJvZ3Jlc3MucGFydGlhbFRleHQgPSB4aHIucmVzcG9uc2VUZXh0O1xuICAgICAgfVxuXG4gICAgICBvYnNlcnZlci5uZXh0KHByb2dyZXNzKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25VcFByb2dyZXNzID0gKGV2ZW50OiBQcm9ncmVzc0V2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHBhcnRpYWxGcm9tWGhyKCk7XG5cbiAgICAgIGNvbnN0IHByb2dyZXNzOiBSZXF1ZXN0RXZlbnQgPSB7XG4gICAgICAgIHR5cGU6ICd1cGxvYWQtcHJvZ3Jlc3MnLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBwcm9ncmVzczoge1xuICAgICAgICAgIGN1cnJlbnQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChldmVudC5sZW5ndGhDb21wdXRhYmxlKSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzUGVyY2VudCA9IChldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCkgKiAxMDA7XG4gICAgICAgIHByb2dyZXNzLnByb2dyZXNzLnBlcmNlbnRhZ2UgPSBNYXRoLnJvdW5kKHByb2dyZXNzUGVyY2VudCAqIDEwMCkgLyAxMDA7XG4gICAgICAgIHByb2dyZXNzLnByb2dyZXNzLnRvdGFsID0gZXZlbnQudG90YWw7XG4gICAgICB9XG5cbiAgICAgIG9ic2VydmVyLm5leHQocHJvZ3Jlc3MpO1xuICAgIH07XG5cbiAgICB4aHIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7XG4gICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ3RpbWVvdXQnLCBvbkVycm9yKTtcbiAgICB4aHIuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkVycm9yKTtcblxuICAgIGlmIChjb25maWcucmVwb3J0UHJvZ3Jlc3MpIHtcbiAgICAgIHhoci5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIG9uRG93blByb2dyZXNzKTtcblxuICAgICAgaWYgKHJlcUJvZHkgIT09IG51bGwgJiYgeGhyLnVwbG9hZCkge1xuICAgICAgICB4aHIudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgb25VcFByb2dyZXNzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIuc2VuZChyZXFCb2R5KTtcbiAgICBvYnNlcnZlci5uZXh0KHsgdHlwZTogJ3N0YXJ0JywgaGVhZGVycyB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB4aHIucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgIHhoci5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uRXJyb3IpO1xuICAgICAgeGhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgICAgeGhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RpbWVvdXQnLCBvbkVycm9yKTtcblxuICAgICAgaWYgKHJldHJ5VGltZW91dCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHJldHJ5VGltZW91dCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcucmVwb3J0UHJvZ3Jlc3MpIHtcbiAgICAgICAgeGhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgb25Eb3duUHJvZ3Jlc3MpO1xuXG4gICAgICAgIGlmIChyZXFCb2R5ICE9PSBudWxsICYmIHhoci51cGxvYWQpIHtcbiAgICAgICAgICB4aHIudXBsb2FkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgb25VcFByb2dyZXNzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHhoci5ET05FKSB7XG4gICAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgfVxuXG4gICAgICBvYnNlcnZlci5uZXh0KHsgdHlwZTogJ2NhbmNlbCcsIGhlYWRlcnMgfSk7XG4gICAgfTtcbiAgfSk7XG59O1xuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9yZXF1ZXN0L3JlcXVlc3QudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBTdGF0dXNDb2RlIH0gZnJvbSAnLi9yZXF1ZXN0LnV0aWwnO1xuXG5leHBvcnQgdHlwZSBNZXRob2QgPVxuICB8ICdHRVQnXG4gIHwgJ1BPU1QnXG4gIHwgJ1BVVCdcbiAgfCAnREVMRVRFJ1xuICB8ICdQQVRDSCdcbiAgfCAnSEVBRCdcbiAgfCAnT1BUSU9OUydcbiAgfCAnVFJBQ0UnXG4gIHwgJ0NPTk5FQ1QnXG4gIHwgJ1BVUkdFJ1xuICB8ICdMSU5LJ1xuICB8ICdVTkxJTksnXG4gIHwgJ0dRTF9RVUVSWSdcbiAgfCAnR1FMX01VVEFURSdcbiAgfCAnQ1VTVE9NJztcblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0RXJyb3I8RGV0YWlsID0gdW5rbm93bj4ge1xuICB1cmw6IHN0cmluZztcbiAgc3RhdHVzOiBIdHRwU3RhdHVzQ29kZTtcbiAgc3RhdHVzVGV4dDogc3RyaW5nO1xuICBkZXRhaWw6IERldGFpbDtcbn1cblxuZXhwb3J0IHR5cGUgUmVxdWVzdEhlYWRlcnMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuZXhwb3J0IHR5cGUgUXVlcnlQYXJhbXMgPSBvYmplY3Q7XG5leHBvcnQgdHlwZSBQYXRoUGFyYW1zID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPjtcblxuZXhwb3J0IHR5cGUgQ2FjaGVBZGFwdGVyRm4gPSAoaGVhZGVyczogUmVxdWVzdEhlYWRlcnMpID0+IG51bWJlciB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RIZWFkZXJzTWV0aG9kTWFwID0ge1xuICBbTSBpbiBNZXRob2RdPzogUmVxdWVzdEhlYWRlcnM7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpYWxYaHJTdGF0ZSB7XG4gIGhlYWRlcnM6IFJlcXVlc3RIZWFkZXJzO1xuICBzdGF0dXM6IG51bWJlcjtcbiAgc3RhdHVzVGV4dDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0UmV0cnlGbkNvbmZpZyB7XG4gIGVycm9yOiBSZXF1ZXN0RXJyb3I7XG4gIGhlYWRlcnM6IFJlcXVlc3RIZWFkZXJzO1xuICBjdXJyZW50UmV0cnlDb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RSZXRyeUZuUmVzdWx0IHtcbiAgcmV0cnk6IGJvb2xlYW47XG4gIGRlbGF5PzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0UmV0cnlGbiA9IChjb25maWc6IFJlcXVlc3RSZXRyeUZuQ29uZmlnKSA9PiBSZXF1ZXN0UmV0cnlGblJlc3VsdDtcblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0Q29uZmlnIHtcbiAgbWV0aG9kOiBNZXRob2Q7XG4gIHVybFdpdGhQYXJhbXM6IHN0cmluZztcbiAgYm9keT86IHVua25vd247XG4gIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcbiAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcbiAgcmVzcG9uc2VUeXBlPzogJ2FycmF5YnVmZmVyJyB8ICdibG9iJyB8ICdqc29uJyB8ICd0ZXh0JztcbiAgaGVhZGVycz86IFJlcXVlc3RIZWFkZXJzO1xuICBjYWNoZUFkYXB0ZXI/OiBDYWNoZUFkYXB0ZXJGbjtcbiAgcmV0cnlGbj86IFJlcXVlc3RSZXRyeUZuO1xufVxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0UHJvZ3Jlc3MgPSB7XG4gIGN1cnJlbnQ6IG51bWJlcjtcbiAgcGVyY2VudGFnZT86IG51bWJlcjtcbiAgdG90YWw/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0RXZlbnQ8UmVzcG9uc2UgPSB1bmtub3duPiA9XG4gIHwge1xuICAgICAgdHlwZTogJ3N0YXJ0JztcbiAgICAgIGhlYWRlcnM6IFJlcXVlc3RIZWFkZXJzO1xuICAgICAgaXNSZXRyeT86IGJvb2xlYW47XG4gICAgICByZXRyeU51bWJlcj86IG51bWJlcjtcbiAgICAgIHJldHJ5RGVsYXk/OiBudW1iZXI7XG4gICAgfVxuICB8IHtcbiAgICAgIHR5cGU6ICdkZWxheS1yZXRyeSc7XG4gICAgICBoZWFkZXJzOiBSZXF1ZXN0SGVhZGVycztcbiAgICAgIHJldHJ5TnVtYmVyOiBudW1iZXI7XG4gICAgICByZXRyeURlbGF5OiBudW1iZXI7XG4gICAgfVxuICB8IHtcbiAgICAgIHR5cGU6ICdkb3dubG9hZC1wcm9ncmVzcyc7XG4gICAgICBoZWFkZXJzOiBSZXF1ZXN0SGVhZGVycztcbiAgICAgIHByb2dyZXNzOiBSZXF1ZXN0UHJvZ3Jlc3M7XG4gICAgICBwYXJ0aWFsVGV4dD86IHN0cmluZztcbiAgICB9XG4gIHwge1xuICAgICAgdHlwZTogJ3VwbG9hZC1wcm9ncmVzcyc7XG4gICAgICBoZWFkZXJzOiBSZXF1ZXN0SGVhZGVycztcbiAgICAgIHByb2dyZXNzOiBSZXF1ZXN0UHJvZ3Jlc3M7XG4gICAgfVxuICB8IHtcbiAgICAgIHR5cGU6ICdzdWNjZXNzJztcbiAgICAgIGhlYWRlcnM6IFJlcXVlc3RIZWFkZXJzO1xuICAgICAgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgICAgZXhwaXJlc0luVGltZXN0YW1wPzogbnVtYmVyO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiAnZmFpbHVyZSc7XG4gICAgICBoZWFkZXJzOiBSZXF1ZXN0SGVhZGVycztcbiAgICAgIGVycm9yOiBSZXF1ZXN0RXJyb3I7XG4gICAgfVxuICB8IHtcbiAgICAgIHR5cGU6ICdjYW5jZWwnO1xuICAgICAgaGVhZGVyczogUmVxdWVzdEhlYWRlcnM7XG4gICAgfTtcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFF1ZXJ5U3RyaW5nQ29uZmlnIHtcbiAgLyoqXG4gICAqIE9iamVjdCBub3RhdGlvbiB0byB1c2UgZm9yIG5lc3RlZCBvYmplY3RzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBkb3Qgbm90YXRpb25cbiAgICogeyBmb286IHsgYmFyOiAnYmF6JyB9IH0gPT4gXCJmb28uYmFyPWJhelwiXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIGJyYWNrZXQgbm90YXRpb25cbiAgICogeyBmb286IHsgYmFyOiAnYmF6JyB9IH0gPT4gXCJmb29bYmFyXT1iYXpcIlxuICAgKlxuICAgKiBAZGVmYXVsdCAnYnJhY2tldCdcbiAgICovXG4gIG9iamVjdE5vdGF0aW9uPzogJ2RvdCcgfCAnYnJhY2tldCc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gd3JpdGUgYXJyYXkgaW5kZXhlcyBpbiBicmFja2V0IG5vdGF0aW9uLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyB0cnVlXG4gICAqIHsgZm9vOiBbJ2JhcicsICdiYXonXSB9ID0+IFwiZm9vWzBdPWJhciZmb29bMV09YmF6XCJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gZmFsc2VcbiAgICogeyBmb286IFsnYmFyJywgJ2JheiddIH0gPT4gXCJmb29bXT1iYXImZm9vW109YmF6XCJcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHdyaXRlQXJyYXlJbmRleGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkIHdoZW4gYnVpbGRpbmcgdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICpcbiAgICogQWxzbyBoYXZlIGEgbG9vayBhdCBgaWdub3JlZFZhbHVlc0Zuc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IFt1bmRlZmluZWQsIG51bGwsIEluZmluaXR5LCAtSW5maW5pdHldXG4gICAqL1xuICBpZ25vcmVkVmFsdWVzPzogQXJyYXk8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHZhbHVlIHNob3VsZCBiZSBpZ25vcmVkIHdoZW4gYnVpbGRpbmcgdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICpcbiAgICogQWxzbyBoYXZlIGEgbG9vayBhdCBgaWdub3JlZFZhbHVlc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtpc05hTiwgaXNFbXB0eVN0cmluZ11cbiAgICovXG4gIGlnbm9yZWRWYWx1ZXNGbnM/OiBBcnJheTwodmFsdWU6IHVua25vd24pID0+IGJvb2xlYW4+O1xufVxuIl19
|