@kovalenko/http-request-cache 1.3.5 → 1.3.7
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 +16 -0
- package/esm2020/lib/http-request-cache.decorator.mjs +46 -33
- package/fesm2015/kovalenko-http-request-cache.mjs +48 -33
- package/fesm2015/kovalenko-http-request-cache.mjs.map +1 -1
- package/fesm2020/kovalenko-http-request-cache.mjs +45 -32
- package/fesm2020/kovalenko-http-request-cache.mjs.map +1 -1
- package/lib/http-request-cache.decorator.js +47 -33
- package/lib/http-request-cache.decorator.js.map +1 -1
- package/package.json +1 -1
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
## [1.3.7](https://github.com/menelai/http-request-cache/compare/v1.3.6...v1.3.7) (2026-09-28)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* args serializer ([242948a](https://github.com/menelai/http-request-cache/commit/242948ae49188e6e574c3d159a3e1df16871af45))
|
|
7
|
+
* cache in instance ([736dde3](https://github.com/menelai/http-request-cache/commit/736dde34e799a6d64c786f9948bf502b950e8c84))
|
|
8
|
+
* subscriber number increment ([449b56e](https://github.com/menelai/http-request-cache/commit/449b56ef1ea0c5db4c26bcaa6d5f90246c9d257a))
|
|
9
|
+
|
|
10
|
+
## [1.3.6](https://github.com/menelai/http-request-cache/compare/v1.3.5...v1.3.6) (2026-09-28)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* revert ([23960f6](https://github.com/menelai/http-request-cache/commit/23960f66b333d52a046706d9241dfc49d6ce0588))
|
|
16
|
+
|
|
1
17
|
## [1.3.5](https://github.com/menelai/http-request-cache/compare/v1.3.4...v1.3.5) (2026-09-24)
|
|
2
18
|
|
|
3
19
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { finalize, merge, NEVER,
|
|
1
|
+
import { filter, finalize, merge, NEVER, ReplaySubject, share, startWith, Subject, switchMap, tap, timer, } from 'rxjs';
|
|
2
2
|
import { DefaultStorage } from './default-storage';
|
|
3
3
|
import { RequestTimes } from './request-times';
|
|
4
4
|
const serializeArg = (value) => {
|
|
@@ -46,7 +46,7 @@ const serializeArg = (value) => {
|
|
|
46
46
|
out = `[${v.map(serialize).join(',')}]`;
|
|
47
47
|
}
|
|
48
48
|
else {
|
|
49
|
-
out = `{${Object.keys(v).sort().map(k => `${serialize(k)}:${serialize(v[k])}`).join(',')}}`;
|
|
49
|
+
out = `{${Object.keys(v).sort().map((k) => `${serialize(k)}:${serialize(v[k])}`).join(',')}}`;
|
|
50
50
|
}
|
|
51
51
|
seen.delete(v);
|
|
52
52
|
return out;
|
|
@@ -63,29 +63,28 @@ const hashArgs = (input) => {
|
|
|
63
63
|
};
|
|
64
64
|
export const HttpRequestCache = (optionsHandler) => {
|
|
65
65
|
return (target, methodName, descriptor) => {
|
|
66
|
-
if (
|
|
66
|
+
if (!(descriptor?.value instanceof Function)) {
|
|
67
67
|
throw Error(`'@HttpRequestCache' can be applied only to the class method which returns an Observable`);
|
|
68
68
|
}
|
|
69
69
|
const cacheKeyPrefix = `${target.constructor.name}_${methodName}`;
|
|
70
70
|
const originalMethod = descriptor.value;
|
|
71
|
-
const
|
|
71
|
+
const working = {};
|
|
72
|
+
const subscribers = {};
|
|
73
|
+
const removeTimers = {};
|
|
72
74
|
const instanceIds = new WeakMap();
|
|
73
75
|
let instanceIdCounter = 0;
|
|
74
76
|
descriptor.value = function (...args) {
|
|
75
|
-
const self = this;
|
|
77
|
+
const self = this ?? target;
|
|
76
78
|
const options = optionsHandler?.call(self, self, ...args);
|
|
77
|
-
|
|
78
|
-
if (useDefaultStorage && !self.___storage___) {
|
|
79
|
+
if (!options?.storage && !self.___storage___) {
|
|
79
80
|
self.___storage___ = new DefaultStorage();
|
|
80
81
|
}
|
|
81
|
-
|
|
82
|
-
if (ttlEnabled && !self.___ttl_storage___) {
|
|
82
|
+
if (options?.ttl && !self.___ttl_storage___) {
|
|
83
83
|
self.___ttl_storage___ = new RequestTimes();
|
|
84
84
|
}
|
|
85
85
|
const storage = options?.storage ?? self.___storage___;
|
|
86
|
-
const ttlStorage = self.___ttl_storage___;
|
|
87
86
|
let instanceId = '';
|
|
88
|
-
if (
|
|
87
|
+
if (!options?.storage) {
|
|
89
88
|
let id = instanceIds.get(self);
|
|
90
89
|
if (id === undefined) {
|
|
91
90
|
id = ++instanceIdCounter;
|
|
@@ -94,58 +93,72 @@ export const HttpRequestCache = (optionsHandler) => {
|
|
|
94
93
|
instanceId = `_${id}`;
|
|
95
94
|
}
|
|
96
95
|
const key = `${cacheKeyPrefix}${instanceId}_${hashArgs(serializeArg(args))}`;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
// отменяем запланированное удаление
|
|
97
|
+
if (removeTimers[key]) {
|
|
98
|
+
clearTimeout(removeTimers[key]);
|
|
99
|
+
delete removeTimers[key];
|
|
100
|
+
}
|
|
100
101
|
let ttl = undefined;
|
|
101
|
-
if (
|
|
102
|
-
ttl =
|
|
102
|
+
if (options?.ttl) {
|
|
103
|
+
ttl = self.___ttl_storage___.getItem(key);
|
|
103
104
|
if (!ttl) {
|
|
104
105
|
ttl = {
|
|
105
106
|
requestTime: Date.now(),
|
|
106
107
|
subject: new Subject(),
|
|
107
108
|
};
|
|
108
109
|
}
|
|
109
|
-
else if (ttl.requestTime + options
|
|
110
|
+
else if (ttl.requestTime + options.ttl <= Date.now()) {
|
|
111
|
+
working[key] = true;
|
|
110
112
|
ttl.requestTime = Date.now();
|
|
111
113
|
ttl.subject.next();
|
|
112
114
|
}
|
|
113
|
-
|
|
115
|
+
self.___ttl_storage___.setItem(key, ttl);
|
|
114
116
|
}
|
|
115
117
|
const refreshOn = merge(options?.refreshOn ?? NEVER, ttl?.subject ?? NEVER);
|
|
116
118
|
let observable = storage.getItem(key);
|
|
117
119
|
if (!observable) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
: 0;
|
|
121
|
-
observable = refreshOn.pipe(startWith(true), switchMap(() => originalMethod.apply(latest.self, latest.args)), finalize(() => {
|
|
122
|
-
storage.deleteItem(key);
|
|
123
|
-
ttlStorage?.deleteItem(key);
|
|
124
|
-
delete latestCall[key];
|
|
120
|
+
observable = refreshOn.pipe(startWith(true), switchMap(() => originalMethod.apply(this, [...args])), tap(() => {
|
|
121
|
+
delete working[key];
|
|
125
122
|
}), share({
|
|
126
123
|
connector: () => new ReplaySubject(1),
|
|
127
124
|
resetOnComplete: false,
|
|
128
125
|
resetOnError: true,
|
|
129
|
-
resetOnRefCountZero: options?.refCount
|
|
130
|
-
?
|
|
126
|
+
resetOnRefCountZero: !options?.refCount
|
|
127
|
+
? false
|
|
128
|
+
: options.refCountDelay != null
|
|
131
129
|
? () => timer(options.refCountDelay)
|
|
132
|
-
: true
|
|
133
|
-
: ttlRemaining > 0
|
|
134
|
-
? () => timer(ttlRemaining)
|
|
135
130
|
: true,
|
|
131
|
+
}), filter(() => !working[key]), finalize(() => {
|
|
132
|
+
subscribers[key]--;
|
|
133
|
+
if (subscribers[key] <= 0) {
|
|
134
|
+
delete subscribers[key];
|
|
135
|
+
if (options?.refCount) {
|
|
136
|
+
const unset = () => {
|
|
137
|
+
storage.deleteItem(key);
|
|
138
|
+
self.___ttl_storage___?.deleteItem(key);
|
|
139
|
+
delete removeTimers[key];
|
|
140
|
+
};
|
|
141
|
+
if (options.refCountDelay == null) {
|
|
142
|
+
unset();
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
removeTimers[key] = setTimeout(unset, options.refCountDelay);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
136
149
|
}));
|
|
137
150
|
storage.setItem(key, observable);
|
|
138
151
|
if (options?.windowTime) {
|
|
139
152
|
setTimeout(() => {
|
|
140
153
|
storage.deleteItem(key);
|
|
141
|
-
|
|
142
|
-
delete latestCall[key];
|
|
154
|
+
self.___ttl_storage___?.deleteItem(key);
|
|
143
155
|
}, options.windowTime);
|
|
144
156
|
}
|
|
145
157
|
}
|
|
158
|
+
subscribers[key] = (subscribers[key] ?? 0) + 1;
|
|
146
159
|
return observable;
|
|
147
160
|
};
|
|
148
161
|
return descriptor;
|
|
149
162
|
};
|
|
150
163
|
};
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZXF1ZXN0LWNhY2hlLmRlY29yYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1jYWNoZS9zcmMvbGliL2h0dHAtcmVxdWVzdC1jYWNoZS5kZWNvcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFDeEUsYUFBYSxFQUFFLEtBQUssR0FDckIsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBSTdDLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBVSxFQUFVLEVBQUU7SUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7SUFDM0MsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBRWhCLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBTSxFQUFVLEVBQUU7UUFDbkMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2QsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUNELE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRW5CLElBQUksQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3JDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ2xCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQztTQUNoQjtRQUNELElBQUksQ0FBQyxLQUFLLFdBQVcsSUFBSSxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7WUFDM0QsT0FBTyxPQUFPLENBQUM7U0FDaEI7UUFD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QUFDLGFBQWMsQ0FBQzs0QkFDekQsQ0FBQyxDQUFDLElBQUk7d0JBQ1IsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDOzRCQUNoQixDQUFDLENBQUMsR0FBdUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7NEJBQy9DLENBQUMsQ0FBQyxJQUFJO2lCQUNYLENBQUMsQ0FDSCxDQUFDO2dCQUNGLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUVqQyxJQUFJLE9BQU8sRUFBRSxVQUFVLEVBQUU7b0JBQ3ZCLFVBQVUsQ0FDUixHQUFHLEVBQUU7d0JBQ0gsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDeEIsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDNUIsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3pCLENBQUMsRUFDRCxPQUFPLENBQUMsVUFBVSxDQUNuQixDQUFDO2lCQUNIO2FBQ0Y7WUFFRCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDLENBQUM7UUFFRixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBmaW5hbGl6ZSwgbWVyZ2UsIE5FVkVSLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgc2hhcmUsXG4gIFJlcGxheVN1YmplY3QsIHRpbWVyLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtEZWZhdWx0U3RvcmFnZX0gZnJvbSAnLi9kZWZhdWx0LXN0b3JhZ2UnO1xuaW1wb3J0IHtIdHRwQ2FjaGVPcHRpb25zfSBmcm9tICcuL2h0dHAtY2FjaGUtb3B0aW9ucyc7XG5pbXBvcnQge1JlcXVlc3RUaW1lc30gZnJvbSAnLi9yZXF1ZXN0LXRpbWVzJztcblxudHlwZSBIdHRwUmVxdWVzdENhY2hlTWV0aG9kID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBPYnNlcnZhYmxlPGFueT47XG5cbmNvbnN0IHNlcmlhbGl6ZUFyZyA9ICh2YWx1ZTogYW55KTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBXZWFrTWFwPG9iamVjdCwgc3RyaW5nPigpO1xuICBsZXQgY291bnRlciA9IDA7XG5cbiAgY29uc3Qgc2VyaWFsaXplID0gKHY6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgaWYgKHYgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGNvbnN0IHQgPSB0eXBlb2YgdjtcblxuICAgIGlmICh0ID09PSAnbnVtYmVyJyB8fCB0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodik7XG4gICAgfVxuICAgIGlmICh0ID09PSAnYmlnaW50Jykge1xuICAgICAgcmV0dXJuIGAke3Z9bmA7XG4gICAgfVxuICAgIGlmICh0ID09PSAndW5kZWZpbmVkJyB8fCB0ID09PSAnc3ltYm9sJyB8fCB0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gJ3VuZGVmJztcbiAgICB9XG4gICAgaWYgKHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYHN0cjoke3Z9YDtcbiAgICB9XG4gICAgaWYgKHQgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gYCR7dH06JHtTdHJpbmcodil9YDtcbiAgICB9XG5cbiAgICBpZiAodiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBgZGF0ZToke3YudG9JU09TdHJpbmcoKX1gO1xuICAgIH1cbiAgICBpZiAodiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgcmV0dXJuIGByZWdleHA6JHt2LnRvU3RyaW5nKCl9YDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gc2Vlbi5nZXQodik7XG4gICAgaWYgKHBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGBjaXJjOiR7cGF0aH1gO1xuICAgIH1cbiAgICBzZWVuLnNldCh2LCBgdiR7Y291bnRlcisrfWApO1xuXG4gICAgbGV0IG91dDogc3RyaW5nO1xuICAgIGlmICh2IGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICBvdXQgPSBgbWFwOiR7c2VyaWFsaXplKEFycmF5LmZyb20odi5lbnRyaWVzKCkpKX1gO1xuICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgb3V0ID0gYHNldDoke3NlcmlhbGl6ZShBcnJheS5mcm9tKHYudmFsdWVzKCkpKX1gO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgb3V0ID0gYFske3YubWFwKHNlcmlhbGl6ZSkuam9pbignLCcpfV1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgPSBgeyR7T2JqZWN0LmtleXModikuc29ydCgpLm1hcChrID0+IGAke3NlcmlhbGl6ZShrKX06JHtzZXJpYWxpemUodltrXSl9YCkuam9pbignLCcpfX1gO1xuICAgIH1cblxuICAgIHNlZW4uZGVsZXRlKHYpO1xuICAgIHJldHVybiBvdXQ7XG4gIH07XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZSh2YWx1ZSk7XG59O1xuXG5jb25zdCBoYXNoQXJncyA9IChpbnB1dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgbGV0IGggPSAweDgxMWM5ZGM1O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaCBePSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgIGggPSBNYXRoLmltdWwoaCwgMHgwMTAwMDE5Myk7XG4gIH1cbiAgcmV0dXJuIChoID4+PiAwKS50b1N0cmluZygzNik7XG59O1xuXG5leHBvcnQgY29uc3QgSHR0cFJlcXVlc3RDYWNoZSA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob3B0aW9uc0hhbmRsZXI/OiAob2JqOiBULCAuLi5hcmdzOiBhbnlbXSkgPT4gSHR0cENhY2hlT3B0aW9ucykgPT4ge1xuICByZXR1cm4gKHRhcmdldDogVCwgbWV0aG9kTmFtZTogc3RyaW5nLCBkZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxIdHRwUmVxdWVzdENhY2hlTWV0aG9kPik6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPEh0dHBSZXF1ZXN0Q2FjaGVNZXRob2Q+ID0+IHtcbiAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3I/LnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJ0BIdHRwUmVxdWVzdENhY2hlJyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHRoZSBjbGFzcyBtZXRob2Qgd2hpY2ggcmV0dXJucyBhbiBPYnNlcnZhYmxlYCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FjaGVLZXlQcmVmaXggPSBgJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX1fJHttZXRob2ROYW1lfWA7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGNvbnN0IGxhdGVzdENhbGw6IFJlY29yZDxzdHJpbmcsIHtzZWxmOiBhbnksIGFyZ3M6IGFueVtdfT4gPSB7fTtcblxuICAgIGNvbnN0IGluc3RhbmNlSWRzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBudW1iZXI+KCk7XG4gICAgbGV0IGluc3RhbmNlSWRDb3VudGVyID0gMDtcblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiguLi5hcmdzOiBhbnlbXSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICBjb25zdCBzZWxmID0gdGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IG9wdGlvbnNIYW5kbGVyPy5jYWxsKHNlbGYgYXMgVCwgc2VsZiBhcyBULCAuLi5hcmdzKTtcblxuICAgICAgY29uc3QgdXNlRGVmYXVsdFN0b3JhZ2UgPSAhb3B0aW9ucz8uc3RvcmFnZTtcbiAgICAgIGlmICh1c2VEZWZhdWx0U3RvcmFnZSAmJiAhc2VsZi5fX19zdG9yYWdlX19fKSB7XG4gICAgICAgIHNlbGYuX19fc3RvcmFnZV9fXyA9IG5ldyBEZWZhdWx0U3RvcmFnZSgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0dGxFbmFibGVkID0gb3B0aW9ucz8udHRsICE9IG51bGw7XG4gICAgICBpZiAodHRsRW5hYmxlZCAmJiAhc2VsZi5fX190dGxfc3RvcmFnZV9fXykge1xuICAgICAgICBzZWxmLl9fX3R0bF9zdG9yYWdlX19fID0gbmV3IFJlcXVlc3RUaW1lcygpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yYWdlID0gb3B0aW9ucz8uc3RvcmFnZSA/PyBzZWxmLl9fX3N0b3JhZ2VfX187XG4gICAgICBjb25zdCB0dGxTdG9yYWdlID0gc2VsZi5fX190dGxfc3RvcmFnZV9fXztcblxuICAgICAgbGV0IGluc3RhbmNlSWQgPSAnJztcbiAgICAgIGlmICh1c2VEZWZhdWx0U3RvcmFnZSkge1xuICAgICAgICBsZXQgaWQgPSBpbnN0YW5jZUlkcy5nZXQoc2VsZik7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWQgPSArK2luc3RhbmNlSWRDb3VudGVyO1xuICAgICAgICAgIGluc3RhbmNlSWRzLnNldChzZWxmLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2VJZCA9IGBfJHtpZH1gO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSBgJHtjYWNoZUtleVByZWZpeH0ke2luc3RhbmNlSWR9XyR7aGFzaEFyZ3Moc2VyaWFsaXplQXJnKGFyZ3MpKX1gO1xuICAgICAgY29uc3QgbGF0ZXN0ID0gbGF0ZXN0Q2FsbFtrZXldID8/IChsYXRlc3RDYWxsW2tleV0gPSB7c2VsZiwgYXJnc30pO1xuICAgICAgbGF0ZXN0LnNlbGYgPSBzZWxmO1xuICAgICAgbGF0ZXN0LmFyZ3MgPSBhcmdzO1xuXG4gICAgICBsZXQgdHRsOiB7cmVxdWVzdFRpbWU6IG51bWJlciwgc3ViamVjdDogU3ViamVjdDx2b2lkPn0gPSB1bmRlZmluZWQgYXMgYW55O1xuXG4gICAgICBpZiAodHRsRW5hYmxlZCAmJiB0dGxTdG9yYWdlKSB7XG4gICAgICAgIHR0bCA9IHR0bFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgICAgIGlmICghdHRsKSB7XG4gICAgICAgICAgdHRsID0ge1xuICAgICAgICAgICAgcmVxdWVzdFRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdCgpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodHRsLnJlcXVlc3RUaW1lICsgKG9wdGlvbnM/LnR0bCBhcyBudW1iZXIpIDw9IERhdGUubm93KCkpIHtcbiAgICAgICAgICB0dGwucmVxdWVzdFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIHR0bC5zdWJqZWN0Lm5leHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHR0bFN0b3JhZ2Uuc2V0SXRlbShrZXksIHR0bCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlZnJlc2hPbiA9IG1lcmdlKFxuICAgICAgICBvcHRpb25zPy5yZWZyZXNoT24gPz8gTkVWRVIgYXMgT2JzZXJ2YWJsZTx1bmtub3duPixcbiAgICAgICAgdHRsPy5zdWJqZWN0ID8/IE5FVkVSIGFzIE9ic2VydmFibGU8dW5rbm93bj4sXG4gICAgICApO1xuXG4gICAgICBsZXQgb2JzZXJ2YWJsZSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgICBpZiAoIW9ic2VydmFibGUpIHtcbiAgICAgICAgY29uc3QgdHRsUmVtYWluaW5nID0gdHRsRW5hYmxlZCAmJiB0dGxcbiAgICAgICAgICA/IHR0bC5yZXF1ZXN0VGltZSArIChvcHRpb25zPy50dGwgYXMgbnVtYmVyKSAtIERhdGUubm93KClcbiAgICAgICAgICA6IDA7XG5cbiAgICAgICAgb2JzZXJ2YWJsZSA9IHJlZnJlc2hPbi5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aCh0cnVlKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gb3JpZ2luYWxNZXRob2QuYXBwbHkobGF0ZXN0LnNlbGYsIGxhdGVzdC5hcmdzKSksXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgICAgc3RvcmFnZS5kZWxldGVJdGVtKGtleSk7XG4gICAgICAgICAgICB0dGxTdG9yYWdlPy5kZWxldGVJdGVtKGtleSk7XG4gICAgICAgICAgICBkZWxldGUgbGF0ZXN0Q2FsbFtrZXldO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNoYXJlKHtcbiAgICAgICAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXG4gICAgICAgICAgICByZXNldE9uQ29tcGxldGU6IGZhbHNlLFxuICAgICAgICAgICAgcmVzZXRPbkVycm9yOiB0cnVlLFxuICAgICAgICAgICAgcmVzZXRPblJlZkNvdW50WmVybzogb3B0aW9ucz8ucmVmQ291bnRcbiAgICAgICAgICAgICAgPyBvcHRpb25zLnJlZkNvdW50RGVsYXkgIT0gbnVsbFxuICAgICAgICAgICAgICAgID8gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PiB0aW1lcihvcHRpb25zLnJlZkNvdW50RGVsYXkhKVxuICAgICAgICAgICAgICAgIDogdHJ1ZVxuICAgICAgICAgICAgICA6IHR0bFJlbWFpbmluZyA+IDBcbiAgICAgICAgICAgICAgICA/ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT4gdGltZXIodHRsUmVtYWluaW5nKVxuICAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgb2JzZXJ2YWJsZSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LndpbmRvd1RpbWUpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICBzdG9yYWdlLmRlbGV0ZUl0ZW0oa2V5KTtcbiAgICAgICAgICAgICAgdHRsU3RvcmFnZT8uZGVsZXRlSXRlbShrZXkpO1xuICAgICAgICAgICAgICBkZWxldGUgbGF0ZXN0Q2FsbFtrZXldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wdGlvbnMud2luZG93VGltZSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn07XG4iXX0=
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZXF1ZXN0LWNhY2hlLmRlY29yYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1jYWNoZS9zcmMvbGliL2h0dHAtcmVxdWVzdC1jYWNoZS5kZWNvcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFFTCxhQUFhLEVBQ2IsS0FBSyxFQUNMLFNBQVMsRUFDVCxPQUFPLEVBQ1AsU0FBUyxFQUNULEdBQUcsRUFDSCxLQUFLLEdBQ04sTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBSTdDLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBVSxFQUFVLEVBQUU7SUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7SUFDM0MsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBRWhCLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBTSxFQUFVLEVBQUU7UUFDbkMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2QsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUNELE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRW5CLElBQUksQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3JDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ2xCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQztTQUNoQjtRQUNELElBQUksQ0FBQyxLQUFLLFdBQVcsSUFBSSxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7WUFDM0QsT0FBTyxP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QUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGZpbHRlcixcbiAgZmluYWxpemUsXG4gIG1lcmdlLFxuICBORVZFUixcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgc2hhcmUsXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG4gIHRpbWVyLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtEZWZhdWx0U3RvcmFnZX0gZnJvbSAnLi9kZWZhdWx0LXN0b3JhZ2UnO1xuaW1wb3J0IHtIdHRwQ2FjaGVPcHRpb25zfSBmcm9tICcuL2h0dHAtY2FjaGUtb3B0aW9ucyc7XG5pbXBvcnQge1JlcXVlc3RUaW1lc30gZnJvbSAnLi9yZXF1ZXN0LXRpbWVzJztcblxudHlwZSBIdHRwUmVxdWVzdENhY2hlTWV0aG9kID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBPYnNlcnZhYmxlPGFueT47XG5cbmNvbnN0IHNlcmlhbGl6ZUFyZyA9ICh2YWx1ZTogYW55KTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBXZWFrTWFwPG9iamVjdCwgc3RyaW5nPigpO1xuICBsZXQgY291bnRlciA9IDA7XG5cbiAgY29uc3Qgc2VyaWFsaXplID0gKHY6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgaWYgKHYgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGNvbnN0IHQgPSB0eXBlb2YgdjtcblxuICAgIGlmICh0ID09PSAnbnVtYmVyJyB8fCB0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodik7XG4gICAgfVxuICAgIGlmICh0ID09PSAnYmlnaW50Jykge1xuICAgICAgcmV0dXJuIGAke3Z9bmA7XG4gICAgfVxuICAgIGlmICh0ID09PSAndW5kZWZpbmVkJyB8fCB0ID09PSAnc3ltYm9sJyB8fCB0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gJ3VuZGVmJztcbiAgICB9XG4gICAgaWYgKHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYHN0cjoke3Z9YDtcbiAgICB9XG4gICAgaWYgKHQgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gYCR7dH06JHtTdHJpbmcodil9YDtcbiAgICB9XG5cbiAgICBpZiAodiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBgZGF0ZToke3YudG9JU09TdHJpbmcoKX1gO1xuICAgIH1cbiAgICBpZiAodiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgcmV0dXJuIGByZWdleHA6JHt2LnRvU3RyaW5nKCl9YDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gc2Vlbi5nZXQodik7XG4gICAgaWYgKHBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGBjaXJjOiR7cGF0aH1gO1xuICAgIH1cbiAgICBzZWVuLnNldCh2LCBgdiR7Y291bnRlcisrfWApO1xuXG4gICAgbGV0IG91dDogc3RyaW5nO1xuICAgIGlmICh2IGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICBvdXQgPSBgbWFwOiR7c2VyaWFsaXplKEFycmF5LmZyb20odi5lbnRyaWVzKCkpKX1gO1xuICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgb3V0ID0gYHNldDoke3NlcmlhbGl6ZShBcnJheS5mcm9tKHYudmFsdWVzKCkpKX1gO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgb3V0ID0gYFske3YubWFwKHNlcmlhbGl6ZSkuam9pbignLCcpfV1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQgPSBgeyR7T2JqZWN0LmtleXModikuc29ydCgpLm1hcCgoazogc3RyaW5nKTogc3RyaW5nID0+IGAke3NlcmlhbGl6ZShrKX06JHtzZXJpYWxpemUodltrXSl9YCkuam9pbignLCcpfX1gO1xuICAgIH1cblxuICAgIHNlZW4uZGVsZXRlKHYpO1xuICAgIHJldHVybiBvdXQ7XG4gIH07XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZSh2YWx1ZSk7XG59O1xuXG5jb25zdCBoYXNoQXJncyA9IChpbnB1dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgbGV0IGggPSAweDgxMWM5ZGM1O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaCBePSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgIGggPSBNYXRoLmltdWwoaCwgMHgwMTAwMDE5Myk7XG4gIH1cbiAgcmV0dXJuIChoID4+PiAwKS50b1N0cmluZygzNik7XG59O1xuXG5leHBvcnQgY29uc3QgSHR0cFJlcXVlc3RDYWNoZSA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob3B0aW9uc0hhbmRsZXI/OiAob2JqOiBULCAuLi5hcmdzOiBhbnlbXSkgPT4gSHR0cENhY2hlT3B0aW9ucykgPT4ge1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogVCxcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8SHR0cFJlcXVlc3RDYWNoZU1ldGhvZD4sXG4gICk6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPEh0dHBSZXF1ZXN0Q2FjaGVNZXRob2Q+ID0+IHtcbiAgICBpZiAoIShkZXNjcmlwdG9yPy52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYCdASHR0cFJlcXVlc3RDYWNoZScgY2FuIGJlIGFwcGxpZWQgb25seSB0byB0aGUgY2xhc3MgbWV0aG9kIHdoaWNoIHJldHVybnMgYW4gT2JzZXJ2YWJsZWApO1xuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlS2V5UHJlZml4ID0gYCR7dGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWV9XyR7bWV0aG9kTmFtZX1gO1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICBjb25zdCB3b3JraW5nOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAgIGNvbnN0IHN1YnNjcmliZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgY29uc3QgcmVtb3ZlVGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4gPSB7fTtcbiAgICBjb25zdCBpbnN0YW5jZUlkcyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgbnVtYmVyPigpO1xuICAgIGxldCBpbnN0YW5jZUlkQ291bnRlciA9IDA7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24oLi4uYXJnczogYW55W10pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgY29uc3Qgc2VsZiA9ICh0aGlzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pID8/IHRhcmdldDtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25zSGFuZGxlcj8uY2FsbChzZWxmIGFzIFQsIHNlbGYgYXMgVCwgLi4uYXJncyk7XG5cbiAgICAgIGlmICghb3B0aW9ucz8uc3RvcmFnZSAmJiAhc2VsZi5fX19zdG9yYWdlX19fKSB7XG4gICAgICAgIHNlbGYuX19fc3RvcmFnZV9fXyA9IG5ldyBEZWZhdWx0U3RvcmFnZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucz8udHRsICYmICFzZWxmLl9fX3R0bF9zdG9yYWdlX19fKSB7XG4gICAgICAgIHNlbGYuX19fdHRsX3N0b3JhZ2VfX18gPSBuZXcgUmVxdWVzdFRpbWVzKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSBvcHRpb25zPy5zdG9yYWdlID8/IHNlbGYuX19fc3RvcmFnZV9fXztcblxuICAgICAgbGV0IGluc3RhbmNlSWQgPSAnJztcbiAgICAgIGlmICghb3B0aW9ucz8uc3RvcmFnZSkge1xuICAgICAgICBsZXQgaWQgPSBpbnN0YW5jZUlkcy5nZXQoc2VsZik7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWQgPSArK2luc3RhbmNlSWRDb3VudGVyO1xuICAgICAgICAgIGluc3RhbmNlSWRzLnNldChzZWxmLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2VJZCA9IGBfJHtpZH1gO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSBgJHtjYWNoZUtleVByZWZpeH0ke2luc3RhbmNlSWR9XyR7aGFzaEFyZ3Moc2VyaWFsaXplQXJnKGFyZ3MpKX1gO1xuXG4gICAgICAvLyDQvtGC0LzQtdC90Y/QtdC8INC30LDQv9C70LDQvdC40YDQvtCy0LDQvdC90L7QtSDRg9C00LDQu9C10L3QuNC1XG4gICAgICBpZiAocmVtb3ZlVGltZXJzW2tleV0pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlbW92ZVRpbWVyc1trZXldKTtcbiAgICAgICAgZGVsZXRlIHJlbW92ZVRpbWVyc1trZXldO1xuICAgICAgfVxuXG4gICAgICBsZXQgdHRsOiB7cmVxdWVzdFRpbWU6IG51bWJlciwgc3ViamVjdDogU3ViamVjdDx2b2lkPn0gPSB1bmRlZmluZWQgYXMgYW55O1xuXG4gICAgICBpZiAob3B0aW9ucz8udHRsKSB7XG4gICAgICAgIHR0bCA9IHNlbGYuX19fdHRsX3N0b3JhZ2VfX18uZ2V0SXRlbShrZXkpO1xuXG4gICAgICAgIGlmICghdHRsKSB7XG4gICAgICAgICAgdHRsID0ge1xuICAgICAgICAgICAgcmVxdWVzdFRpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdCgpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodHRsLnJlcXVlc3RUaW1lICsgb3B0aW9ucy50dGwgPD0gRGF0ZS5ub3coKSkge1xuICAgICAgICAgIHdvcmtpbmdba2V5XSA9IHRydWU7XG4gICAgICAgICAgdHRsLnJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICB0dGwuc3ViamVjdC5uZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLl9fX3R0bF9zdG9yYWdlX19fLnNldEl0ZW0oa2V5LCB0dGwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWZyZXNoT24gPSBtZXJnZShcbiAgICAgICAgb3B0aW9ucz8ucmVmcmVzaE9uID8/IE5FVkVSIGFzIE9ic2VydmFibGU8dW5rbm93bj4sXG4gICAgICAgIHR0bD8uc3ViamVjdCA/PyBORVZFUiBhcyBPYnNlcnZhYmxlPHVua25vd24+LFxuICAgICAgKTtcblxuICAgICAgbGV0IG9ic2VydmFibGUgPSBzdG9yYWdlLmdldEl0ZW0oa2V5KTtcblxuICAgICAgaWYgKCFvYnNlcnZhYmxlKSB7XG4gICAgICAgIG9ic2VydmFibGUgPSByZWZyZXNoT24ucGlwZShcbiAgICAgICAgICBzdGFydFdpdGgodHJ1ZSksXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIFsuLi5hcmdzXSkpLFxuICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgd29ya2luZ1trZXldO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNoYXJlKHtcbiAgICAgICAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXG4gICAgICAgICAgICByZXNldE9uQ29tcGxldGU6IGZhbHNlLFxuICAgICAgICAgICAgcmVzZXRPbkVycm9yOiB0cnVlLFxuICAgICAgICAgICAgcmVzZXRPblJlZkNvdW50WmVybzogIW9wdGlvbnM/LnJlZkNvdW50XG4gICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgOiBvcHRpb25zLnJlZkNvdW50RGVsYXkgIT0gbnVsbFxuICAgICAgICAgICAgICAgID8gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PiB0aW1lcihvcHRpb25zLnJlZkNvdW50RGVsYXkhKVxuICAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXdvcmtpbmdba2V5XSksXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcnNba2V5XS0tO1xuXG4gICAgICAgICAgICBpZiAoc3Vic2NyaWJlcnNba2V5XSA8PSAwKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBzdWJzY3JpYmVyc1trZXldO1xuXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zPy5yZWZDb3VudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVuc2V0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgc3RvcmFnZS5kZWxldGVJdGVtKGtleSk7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9fX3R0bF9zdG9yYWdlX19fPy5kZWxldGVJdGVtKGtleSk7XG5cbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZW1vdmVUaW1lcnNba2V5XTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVmQ291bnREZWxheSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICB1bnNldCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZW1vdmVUaW1lcnNba2V5XSA9IHNldFRpbWVvdXQodW5zZXQsIG9wdGlvbnMucmVmQ291bnREZWxheSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHN0b3JhZ2Uuc2V0SXRlbShrZXksIG9ic2VydmFibGUpO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy53aW5kb3dUaW1lKSB7XG4gICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgc3RvcmFnZS5kZWxldGVJdGVtKGtleSk7XG4gICAgICAgICAgICAgIHNlbGYuX19fdHRsX3N0b3JhZ2VfX18/LmRlbGV0ZUl0ZW0oa2V5KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRpb25zLndpbmRvd1RpbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdWJzY3JpYmVyc1trZXldID0gKHN1YnNjcmliZXJzW2tleV0gPz8gMCkgKyAxO1xuXG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59O1xuXG4iXX0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Subject, merge, NEVER, startWith, switchMap,
|
|
1
|
+
import { Subject, merge, NEVER, startWith, switchMap, tap, share, ReplaySubject, timer, filter, finalize } from 'rxjs';
|
|
2
2
|
|
|
3
3
|
class DefaultStorage {
|
|
4
4
|
constructor() {
|
|
@@ -75,7 +75,7 @@ const serializeArg = (value) => {
|
|
|
75
75
|
out = `[${v.map(serialize).join(',')}]`;
|
|
76
76
|
}
|
|
77
77
|
else {
|
|
78
|
-
out = `{${Object.keys(v).sort().map(k => `${serialize(k)}:${serialize(v[k])}`).join(',')}}`;
|
|
78
|
+
out = `{${Object.keys(v).sort().map((k) => `${serialize(k)}:${serialize(v[k])}`).join(',')}}`;
|
|
79
79
|
}
|
|
80
80
|
seen.delete(v);
|
|
81
81
|
return out;
|
|
@@ -92,30 +92,29 @@ const hashArgs = (input) => {
|
|
|
92
92
|
};
|
|
93
93
|
const HttpRequestCache = (optionsHandler) => {
|
|
94
94
|
return (target, methodName, descriptor) => {
|
|
95
|
-
if (
|
|
95
|
+
if (!((descriptor === null || descriptor === void 0 ? void 0 : descriptor.value) instanceof Function)) {
|
|
96
96
|
throw Error(`'@HttpRequestCache' can be applied only to the class method which returns an Observable`);
|
|
97
97
|
}
|
|
98
98
|
const cacheKeyPrefix = `${target.constructor.name}_${methodName}`;
|
|
99
99
|
const originalMethod = descriptor.value;
|
|
100
|
-
const
|
|
100
|
+
const working = {};
|
|
101
|
+
const subscribers = {};
|
|
102
|
+
const removeTimers = {};
|
|
101
103
|
const instanceIds = new WeakMap();
|
|
102
104
|
let instanceIdCounter = 0;
|
|
103
105
|
descriptor.value = function (...args) {
|
|
104
106
|
var _a, _b, _c, _d;
|
|
105
|
-
const self = this;
|
|
107
|
+
const self = this !== null && this !== void 0 ? this : target;
|
|
106
108
|
const options = optionsHandler === null || optionsHandler === void 0 ? void 0 : optionsHandler.call(self, self, ...args);
|
|
107
|
-
|
|
108
|
-
if (useDefaultStorage && !self.___storage___) {
|
|
109
|
+
if (!(options === null || options === void 0 ? void 0 : options.storage) && !self.___storage___) {
|
|
109
110
|
self.___storage___ = new DefaultStorage();
|
|
110
111
|
}
|
|
111
|
-
|
|
112
|
-
if (ttlEnabled && !self.___ttl_storage___) {
|
|
112
|
+
if ((options === null || options === void 0 ? void 0 : options.ttl) && !self.___ttl_storage___) {
|
|
113
113
|
self.___ttl_storage___ = new RequestTimes();
|
|
114
114
|
}
|
|
115
115
|
const storage = (_a = options === null || options === void 0 ? void 0 : options.storage) !== null && _a !== void 0 ? _a : self.___storage___;
|
|
116
|
-
const ttlStorage = self.___ttl_storage___;
|
|
117
116
|
let instanceId = '';
|
|
118
|
-
if (
|
|
117
|
+
if (!(options === null || options === void 0 ? void 0 : options.storage)) {
|
|
119
118
|
let id = instanceIds.get(self);
|
|
120
119
|
if (id === undefined) {
|
|
121
120
|
id = ++instanceIdCounter;
|
|
@@ -124,55 +123,71 @@ const HttpRequestCache = (optionsHandler) => {
|
|
|
124
123
|
instanceId = `_${id}`;
|
|
125
124
|
}
|
|
126
125
|
const key = `${cacheKeyPrefix}${instanceId}_${hashArgs(serializeArg(args))}`;
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
// отменяем запланированное удаление
|
|
127
|
+
if (removeTimers[key]) {
|
|
128
|
+
clearTimeout(removeTimers[key]);
|
|
129
|
+
delete removeTimers[key];
|
|
130
|
+
}
|
|
130
131
|
let ttl = undefined;
|
|
131
|
-
if (
|
|
132
|
-
ttl =
|
|
132
|
+
if (options === null || options === void 0 ? void 0 : options.ttl) {
|
|
133
|
+
ttl = self.___ttl_storage___.getItem(key);
|
|
133
134
|
if (!ttl) {
|
|
134
135
|
ttl = {
|
|
135
136
|
requestTime: Date.now(),
|
|
136
137
|
subject: new Subject(),
|
|
137
138
|
};
|
|
138
139
|
}
|
|
139
|
-
else if (ttl.requestTime +
|
|
140
|
+
else if (ttl.requestTime + options.ttl <= Date.now()) {
|
|
141
|
+
working[key] = true;
|
|
140
142
|
ttl.requestTime = Date.now();
|
|
141
143
|
ttl.subject.next();
|
|
142
144
|
}
|
|
143
|
-
|
|
145
|
+
self.___ttl_storage___.setItem(key, ttl);
|
|
144
146
|
}
|
|
145
|
-
const refreshOn = merge((
|
|
147
|
+
const refreshOn = merge((_b = options === null || options === void 0 ? void 0 : options.refreshOn) !== null && _b !== void 0 ? _b : NEVER, (_c = ttl === null || ttl === void 0 ? void 0 : ttl.subject) !== null && _c !== void 0 ? _c : NEVER);
|
|
146
148
|
let observable = storage.getItem(key);
|
|
147
149
|
if (!observable) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
: 0;
|
|
151
|
-
observable = refreshOn.pipe(startWith(true), switchMap(() => originalMethod.apply(latest.self, latest.args)), finalize(() => {
|
|
152
|
-
storage.deleteItem(key);
|
|
153
|
-
ttlStorage === null || ttlStorage === void 0 ? void 0 : ttlStorage.deleteItem(key);
|
|
154
|
-
delete latestCall[key];
|
|
150
|
+
observable = refreshOn.pipe(startWith(true), switchMap(() => originalMethod.apply(this, [...args])), tap(() => {
|
|
151
|
+
delete working[key];
|
|
155
152
|
}), share({
|
|
156
153
|
connector: () => new ReplaySubject(1),
|
|
157
154
|
resetOnComplete: false,
|
|
158
155
|
resetOnError: true,
|
|
159
|
-
resetOnRefCountZero: (options === null || options === void 0 ? void 0 : options.refCount)
|
|
160
|
-
?
|
|
156
|
+
resetOnRefCountZero: !(options === null || options === void 0 ? void 0 : options.refCount)
|
|
157
|
+
? false
|
|
158
|
+
: options.refCountDelay != null
|
|
161
159
|
? () => timer(options.refCountDelay)
|
|
162
|
-
: true
|
|
163
|
-
: ttlRemaining > 0
|
|
164
|
-
? () => timer(ttlRemaining)
|
|
165
160
|
: true,
|
|
161
|
+
}), filter(() => !working[key]), finalize(() => {
|
|
162
|
+
subscribers[key]--;
|
|
163
|
+
if (subscribers[key] <= 0) {
|
|
164
|
+
delete subscribers[key];
|
|
165
|
+
if (options === null || options === void 0 ? void 0 : options.refCount) {
|
|
166
|
+
const unset = () => {
|
|
167
|
+
var _a;
|
|
168
|
+
storage.deleteItem(key);
|
|
169
|
+
(_a = self.___ttl_storage___) === null || _a === void 0 ? void 0 : _a.deleteItem(key);
|
|
170
|
+
delete removeTimers[key];
|
|
171
|
+
};
|
|
172
|
+
if (options.refCountDelay == null) {
|
|
173
|
+
unset();
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
removeTimers[key] = setTimeout(unset, options.refCountDelay);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
166
180
|
}));
|
|
167
181
|
storage.setItem(key, observable);
|
|
168
182
|
if (options === null || options === void 0 ? void 0 : options.windowTime) {
|
|
169
183
|
setTimeout(() => {
|
|
184
|
+
var _a;
|
|
170
185
|
storage.deleteItem(key);
|
|
171
|
-
|
|
172
|
-
delete latestCall[key];
|
|
186
|
+
(_a = self.___ttl_storage___) === null || _a === void 0 ? void 0 : _a.deleteItem(key);
|
|
173
187
|
}, options.windowTime);
|
|
174
188
|
}
|
|
175
189
|
}
|
|
190
|
+
subscribers[key] = ((_d = subscribers[key]) !== null && _d !== void 0 ? _d : 0) + 1;
|
|
176
191
|
return observable;
|
|
177
192
|
};
|
|
178
193
|
return descriptor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kovalenko-http-request-cache.mjs","sources":["../../../projects/http-request-cache/src/lib/default-storage.ts","../../../projects/http-request-cache/src/lib/request-times.ts","../../../projects/http-request-cache/src/lib/http-request-cache.decorator.ts","../../../projects/http-request-cache/src/public-api.ts","../../../projects/http-request-cache/src/kovalenko-http-request-cache.ts"],"sourcesContent":["import {HttpCacheStorage} from './http-cache-storage';\nimport {Observable} from 'rxjs';\n\nexport class DefaultStorage implements HttpCacheStorage {\n private storage = new Map<string, Observable<any>>();\n\n getItem(key: string): Observable<any> | undefined {\n return this.storage.get(key);\n }\n\n setItem(key: string, item: Observable<any>): void {\n this.storage.set(key, item);\n }\n\n deleteItem(key: string): void {\n this.storage.delete(key);\n }\n}\n","import {HttpCacheStorage} from './http-cache-storage';\nimport {Observable} from 'rxjs';\n\nexport class RequestTimes implements HttpCacheStorage {\n private storage = new Map<string, Observable<any>>();\n\n getItem(key: string): Observable<any> | undefined {\n return this.storage.get(key);\n }\n\n setItem(key: string, item: Observable<any>): void {\n this.storage.set(key, item);\n }\n\n deleteItem(key: string): void {\n this.storage.delete(key);\n }\n}\n","import {\n finalize, merge, NEVER, Observable, Subject, startWith, switchMap, share,\n ReplaySubject, timer,\n} from 'rxjs';\n\nimport {DefaultStorage} from './default-storage';\nimport {HttpCacheOptions} from './http-cache-options';\nimport {RequestTimes} from './request-times';\n\ntype HttpRequestCacheMethod = (...args: any[]) => Observable<any>;\n\nconst serializeArg = (value: any): string => {\n const seen = new WeakMap<object, string>();\n let counter = 0;\n\n const serialize = (v: any): string => {\n if (v === null) {\n return 'null';\n }\n const t = typeof v;\n\n if (t === 'number' || t === 'boolean') {\n return String(v);\n }\n if (t === 'bigint') {\n return `${v}n`;\n }\n if (t === 'undefined' || t === 'symbol' || t === 'function') {\n return 'undef';\n }\n if (t === 'string') {\n return `str:${v}`;\n }\n if (t !== 'object') {\n return `${t}:${String(v)}`;\n }\n\n if (v instanceof Date) {\n return `date:${v.toISOString()}`;\n }\n if (v instanceof RegExp) {\n return `regexp:${v.toString()}`;\n }\n\n const path = seen.get(v);\n if (path !== undefined) {\n return `circ:${path}`;\n }\n seen.set(v, `v${counter++}`);\n\n let out: string;\n if (v instanceof Map) {\n out = `map:${serialize(Array.from(v.entries()))}`;\n } else if (v instanceof Set) {\n out = `set:${serialize(Array.from(v.values()))}`;\n } else if (Array.isArray(v)) {\n out = `[${v.map(serialize).join(',')}]`;\n } else {\n out = `{${Object.keys(v).sort().map(k => `${serialize(k)}:${serialize(v[k])}`).join(',')}}`;\n }\n\n seen.delete(v);\n return out;\n };\n\n return serialize(value);\n};\n\nconst hashArgs = (input: string): string => {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(36);\n};\n\nexport const HttpRequestCache = <T extends Record<string, any>>(optionsHandler?: (obj: T, ...args: any[]) => HttpCacheOptions) => {\n return (target: T, methodName: string, descriptor: TypedPropertyDescriptor<HttpRequestCacheMethod>): TypedPropertyDescriptor<HttpRequestCacheMethod> => {\n if (typeof descriptor?.value !== 'function') {\n throw Error(`'@HttpRequestCache' can be applied only to the class method which returns an Observable`);\n }\n\n const cacheKeyPrefix = `${target.constructor.name}_${methodName}`;\n const originalMethod = descriptor.value;\n const latestCall: Record<string, {self: any, args: any[]}> = {};\n\n const instanceIds = new WeakMap<object, number>();\n let instanceIdCounter = 0;\n\n descriptor.value = function(...args: any[]): Observable<any> {\n const self = this as Record<string, any>;\n const options = optionsHandler?.call(self as T, self as T, ...args);\n\n const useDefaultStorage = !options?.storage;\n if (useDefaultStorage && !self.___storage___) {\n self.___storage___ = new DefaultStorage();\n }\n\n const ttlEnabled = options?.ttl != null;\n if (ttlEnabled && !self.___ttl_storage___) {\n self.___ttl_storage___ = new RequestTimes();\n }\n\n const storage = options?.storage ?? self.___storage___;\n const ttlStorage = self.___ttl_storage___;\n\n let instanceId = '';\n if (useDefaultStorage) {\n let id = instanceIds.get(self);\n if (id === undefined) {\n id = ++instanceIdCounter;\n instanceIds.set(self, id);\n }\n instanceId = `_${id}`;\n }\n\n const key = `${cacheKeyPrefix}${instanceId}_${hashArgs(serializeArg(args))}`;\n const latest = latestCall[key] ?? (latestCall[key] = {self, args});\n latest.self = self;\n latest.args = args;\n\n let ttl: {requestTime: number, subject: Subject<void>} = undefined as any;\n\n if (ttlEnabled && ttlStorage) {\n ttl = ttlStorage.getItem(key);\n\n if (!ttl) {\n ttl = {\n requestTime: Date.now(),\n subject: new Subject(),\n };\n } else if (ttl.requestTime + (options?.ttl as number) <= Date.now()) {\n ttl.requestTime = Date.now();\n ttl.subject.next();\n }\n\n ttlStorage.setItem(key, ttl);\n }\n\n const refreshOn = merge(\n options?.refreshOn ?? NEVER as Observable<unknown>,\n ttl?.subject ?? NEVER as Observable<unknown>,\n );\n\n let observable = storage.getItem(key);\n\n if (!observable) {\n const ttlRemaining = ttlEnabled && ttl\n ? ttl.requestTime + (options?.ttl as number) - Date.now()\n : 0;\n\n observable = refreshOn.pipe(\n startWith(true),\n switchMap(() => originalMethod.apply(latest.self, latest.args)),\n finalize(() => {\n storage.deleteItem(key);\n ttlStorage?.deleteItem(key);\n delete latestCall[key];\n }),\n share({\n connector: () => new ReplaySubject(1),\n resetOnComplete: false,\n resetOnError: true,\n resetOnRefCountZero: options?.refCount\n ? options.refCountDelay != null\n ? (): Observable<number> => timer(options.refCountDelay!)\n : true\n : ttlRemaining > 0\n ? (): Observable<number> => timer(ttlRemaining)\n : true,\n }),\n );\n storage.setItem(key, observable);\n\n if (options?.windowTime) {\n setTimeout(\n () => {\n storage.deleteItem(key);\n ttlStorage?.deleteItem(key);\n delete latestCall[key];\n },\n options.windowTime,\n );\n }\n }\n\n return observable;\n };\n\n return descriptor;\n };\n};\n","/*\n * Public API Surface of http-request-cache\n */\n\nexport * from './lib/http-request-cache.decorator';\nexport * from './lib/http-cache-storage';\nexport * from './lib/http-cache-options';\nexport * from './lib/default-storage';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kovalenko-http-request-cache.mjs","sources":["../../../projects/http-request-cache/src/lib/default-storage.ts","../../../projects/http-request-cache/src/lib/request-times.ts","../../../projects/http-request-cache/src/lib/http-request-cache.decorator.ts","../../../projects/http-request-cache/src/public-api.ts","../../../projects/http-request-cache/src/kovalenko-http-request-cache.ts"],"sourcesContent":["import {HttpCacheStorage} from './http-cache-storage';\nimport {Observable} from 'rxjs';\n\nexport class DefaultStorage implements HttpCacheStorage {\n private storage = new Map<string, Observable<any>>();\n\n getItem(key: string): Observable<any> | undefined {\n return this.storage.get(key);\n }\n\n setItem(key: string, item: Observable<any>): void {\n this.storage.set(key, item);\n }\n\n deleteItem(key: string): void {\n this.storage.delete(key);\n }\n}\n","import {HttpCacheStorage} from './http-cache-storage';\nimport {Observable} from 'rxjs';\n\nexport class RequestTimes implements HttpCacheStorage {\n private storage = new Map<string, Observable<any>>();\n\n getItem(key: string): Observable<any> | undefined {\n return this.storage.get(key);\n }\n\n setItem(key: string, item: Observable<any>): void {\n this.storage.set(key, item);\n }\n\n deleteItem(key: string): void {\n this.storage.delete(key);\n }\n}\n","import {\n filter,\n finalize,\n merge,\n NEVER,\n Observable,\n ReplaySubject,\n share,\n startWith,\n Subject,\n switchMap,\n tap,\n timer,\n} from 'rxjs';\n\nimport {DefaultStorage} from './default-storage';\nimport {HttpCacheOptions} from './http-cache-options';\nimport {RequestTimes} from './request-times';\n\ntype HttpRequestCacheMethod = (...args: any[]) => Observable<any>;\n\nconst serializeArg = (value: any): string => {\n const seen = new WeakMap<object, string>();\n let counter = 0;\n\n const serialize = (v: any): string => {\n if (v === null) {\n return 'null';\n }\n const t = typeof v;\n\n if (t === 'number' || t === 'boolean') {\n return String(v);\n }\n if (t === 'bigint') {\n return `${v}n`;\n }\n if (t === 'undefined' || t === 'symbol' || t === 'function') {\n return 'undef';\n }\n if (t === 'string') {\n return `str:${v}`;\n }\n if (t !== 'object') {\n return `${t}:${String(v)}`;\n }\n\n if (v instanceof Date) {\n return `date:${v.toISOString()}`;\n }\n if (v instanceof RegExp) {\n return `regexp:${v.toString()}`;\n }\n\n const path = seen.get(v);\n if (path !== undefined) {\n return `circ:${path}`;\n }\n seen.set(v, `v${counter++}`);\n\n let out: string;\n if (v instanceof Map) {\n out = `map:${serialize(Array.from(v.entries()))}`;\n } else if (v instanceof Set) {\n out = `set:${serialize(Array.from(v.values()))}`;\n } else if (Array.isArray(v)) {\n out = `[${v.map(serialize).join(',')}]`;\n } else {\n out = `{${Object.keys(v).sort().map((k: string): string => `${serialize(k)}:${serialize(v[k])}`).join(',')}}`;\n }\n\n seen.delete(v);\n return out;\n };\n\n return serialize(value);\n};\n\nconst hashArgs = (input: string): string => {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(36);\n};\n\nexport const HttpRequestCache = <T extends Record<string, any>>(optionsHandler?: (obj: T, ...args: any[]) => HttpCacheOptions) => {\n return (\n target: T,\n methodName: string,\n descriptor: TypedPropertyDescriptor<HttpRequestCacheMethod>,\n ): TypedPropertyDescriptor<HttpRequestCacheMethod> => {\n if (!(descriptor?.value instanceof Function)) {\n throw Error(`'@HttpRequestCache' can be applied only to the class method which returns an Observable`);\n }\n\n const cacheKeyPrefix = `${target.constructor.name}_${methodName}`;\n const originalMethod = descriptor.value;\n const working: Record<string, boolean> = {};\n const subscribers: Record<string, number> = {};\n const removeTimers: Record<string, ReturnType<typeof setTimeout>> = {};\n const instanceIds = new WeakMap<object, number>();\n let instanceIdCounter = 0;\n\n descriptor.value = function(...args: any[]): Observable<any> {\n const self = (this as Record<string, any>) ?? target;\n const options = optionsHandler?.call(self as T, self as T, ...args);\n\n if (!options?.storage && !self.___storage___) {\n self.___storage___ = new DefaultStorage();\n }\n\n if (options?.ttl && !self.___ttl_storage___) {\n self.___ttl_storage___ = new RequestTimes();\n }\n\n const storage = options?.storage ?? self.___storage___;\n\n let instanceId = '';\n if (!options?.storage) {\n let id = instanceIds.get(self);\n if (id === undefined) {\n id = ++instanceIdCounter;\n instanceIds.set(self, id);\n }\n instanceId = `_${id}`;\n }\n\n const key = `${cacheKeyPrefix}${instanceId}_${hashArgs(serializeArg(args))}`;\n\n // отменяем запланированное удаление\n if (removeTimers[key]) {\n clearTimeout(removeTimers[key]);\n delete removeTimers[key];\n }\n\n let ttl: {requestTime: number, subject: Subject<void>} = undefined as any;\n\n if (options?.ttl) {\n ttl = self.___ttl_storage___.getItem(key);\n\n if (!ttl) {\n ttl = {\n requestTime: Date.now(),\n subject: new Subject(),\n };\n } else if (ttl.requestTime + options.ttl <= Date.now()) {\n working[key] = true;\n ttl.requestTime = Date.now();\n ttl.subject.next();\n }\n\n self.___ttl_storage___.setItem(key, ttl);\n }\n\n const refreshOn = merge(\n options?.refreshOn ?? NEVER as Observable<unknown>,\n ttl?.subject ?? NEVER as Observable<unknown>,\n );\n\n let observable = storage.getItem(key);\n\n if (!observable) {\n observable = refreshOn.pipe(\n startWith(true),\n switchMap(() => originalMethod.apply(this, [...args])),\n tap(() => {\n delete working[key];\n }),\n share({\n connector: () => new ReplaySubject(1),\n resetOnComplete: false,\n resetOnError: true,\n resetOnRefCountZero: !options?.refCount\n ? false\n : options.refCountDelay != null\n ? (): Observable<number> => timer(options.refCountDelay!)\n : true,\n }),\n filter(() => !working[key]),\n finalize(() => {\n subscribers[key]--;\n\n if (subscribers[key] <= 0) {\n delete subscribers[key];\n\n if (options?.refCount) {\n const unset = (): void => {\n storage.deleteItem(key);\n self.___ttl_storage___?.deleteItem(key);\n\n delete removeTimers[key];\n };\n\n if (options.refCountDelay == null) {\n unset();\n } else {\n removeTimers[key] = setTimeout(unset, options.refCountDelay);\n }\n }\n }\n }),\n );\n storage.setItem(key, observable);\n\n if (options?.windowTime) {\n setTimeout(\n () => {\n storage.deleteItem(key);\n self.___ttl_storage___?.deleteItem(key);\n },\n options.windowTime,\n );\n }\n }\n\n subscribers[key] = (subscribers[key] ?? 0) + 1;\n\n return observable;\n };\n\n return descriptor;\n };\n};\n\n","/*\n * Public API Surface of http-request-cache\n */\n\nexport * from './lib/http-request-cache.decorator';\nexport * from './lib/http-cache-storage';\nexport * from './lib/http-cache-options';\nexport * from './lib/default-storage';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Subject, merge, NEVER, startWith, switchMap,
|
|
1
|
+
import { Subject, merge, NEVER, startWith, switchMap, tap, share, ReplaySubject, timer, filter, finalize } from 'rxjs';
|
|
2
2
|
|
|
3
3
|
class DefaultStorage {
|
|
4
4
|
constructor() {
|
|
@@ -75,7 +75,7 @@ const serializeArg = (value) => {
|
|
|
75
75
|
out = `[${v.map(serialize).join(',')}]`;
|
|
76
76
|
}
|
|
77
77
|
else {
|
|
78
|
-
out = `{${Object.keys(v).sort().map(k => `${serialize(k)}:${serialize(v[k])}`).join(',')}}`;
|
|
78
|
+
out = `{${Object.keys(v).sort().map((k) => `${serialize(k)}:${serialize(v[k])}`).join(',')}}`;
|
|
79
79
|
}
|
|
80
80
|
seen.delete(v);
|
|
81
81
|
return out;
|
|
@@ -92,29 +92,28 @@ const hashArgs = (input) => {
|
|
|
92
92
|
};
|
|
93
93
|
const HttpRequestCache = (optionsHandler) => {
|
|
94
94
|
return (target, methodName, descriptor) => {
|
|
95
|
-
if (
|
|
95
|
+
if (!(descriptor?.value instanceof Function)) {
|
|
96
96
|
throw Error(`'@HttpRequestCache' can be applied only to the class method which returns an Observable`);
|
|
97
97
|
}
|
|
98
98
|
const cacheKeyPrefix = `${target.constructor.name}_${methodName}`;
|
|
99
99
|
const originalMethod = descriptor.value;
|
|
100
|
-
const
|
|
100
|
+
const working = {};
|
|
101
|
+
const subscribers = {};
|
|
102
|
+
const removeTimers = {};
|
|
101
103
|
const instanceIds = new WeakMap();
|
|
102
104
|
let instanceIdCounter = 0;
|
|
103
105
|
descriptor.value = function (...args) {
|
|
104
|
-
const self = this;
|
|
106
|
+
const self = this ?? target;
|
|
105
107
|
const options = optionsHandler?.call(self, self, ...args);
|
|
106
|
-
|
|
107
|
-
if (useDefaultStorage && !self.___storage___) {
|
|
108
|
+
if (!options?.storage && !self.___storage___) {
|
|
108
109
|
self.___storage___ = new DefaultStorage();
|
|
109
110
|
}
|
|
110
|
-
|
|
111
|
-
if (ttlEnabled && !self.___ttl_storage___) {
|
|
111
|
+
if (options?.ttl && !self.___ttl_storage___) {
|
|
112
112
|
self.___ttl_storage___ = new RequestTimes();
|
|
113
113
|
}
|
|
114
114
|
const storage = options?.storage ?? self.___storage___;
|
|
115
|
-
const ttlStorage = self.___ttl_storage___;
|
|
116
115
|
let instanceId = '';
|
|
117
|
-
if (
|
|
116
|
+
if (!options?.storage) {
|
|
118
117
|
let id = instanceIds.get(self);
|
|
119
118
|
if (id === undefined) {
|
|
120
119
|
id = ++instanceIdCounter;
|
|
@@ -123,55 +122,69 @@ const HttpRequestCache = (optionsHandler) => {
|
|
|
123
122
|
instanceId = `_${id}`;
|
|
124
123
|
}
|
|
125
124
|
const key = `${cacheKeyPrefix}${instanceId}_${hashArgs(serializeArg(args))}`;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
125
|
+
// отменяем запланированное удаление
|
|
126
|
+
if (removeTimers[key]) {
|
|
127
|
+
clearTimeout(removeTimers[key]);
|
|
128
|
+
delete removeTimers[key];
|
|
129
|
+
}
|
|
129
130
|
let ttl = undefined;
|
|
130
|
-
if (
|
|
131
|
-
ttl =
|
|
131
|
+
if (options?.ttl) {
|
|
132
|
+
ttl = self.___ttl_storage___.getItem(key);
|
|
132
133
|
if (!ttl) {
|
|
133
134
|
ttl = {
|
|
134
135
|
requestTime: Date.now(),
|
|
135
136
|
subject: new Subject(),
|
|
136
137
|
};
|
|
137
138
|
}
|
|
138
|
-
else if (ttl.requestTime + options
|
|
139
|
+
else if (ttl.requestTime + options.ttl <= Date.now()) {
|
|
140
|
+
working[key] = true;
|
|
139
141
|
ttl.requestTime = Date.now();
|
|
140
142
|
ttl.subject.next();
|
|
141
143
|
}
|
|
142
|
-
|
|
144
|
+
self.___ttl_storage___.setItem(key, ttl);
|
|
143
145
|
}
|
|
144
146
|
const refreshOn = merge(options?.refreshOn ?? NEVER, ttl?.subject ?? NEVER);
|
|
145
147
|
let observable = storage.getItem(key);
|
|
146
148
|
if (!observable) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
: 0;
|
|
150
|
-
observable = refreshOn.pipe(startWith(true), switchMap(() => originalMethod.apply(latest.self, latest.args)), finalize(() => {
|
|
151
|
-
storage.deleteItem(key);
|
|
152
|
-
ttlStorage?.deleteItem(key);
|
|
153
|
-
delete latestCall[key];
|
|
149
|
+
observable = refreshOn.pipe(startWith(true), switchMap(() => originalMethod.apply(this, [...args])), tap(() => {
|
|
150
|
+
delete working[key];
|
|
154
151
|
}), share({
|
|
155
152
|
connector: () => new ReplaySubject(1),
|
|
156
153
|
resetOnComplete: false,
|
|
157
154
|
resetOnError: true,
|
|
158
|
-
resetOnRefCountZero: options?.refCount
|
|
159
|
-
?
|
|
155
|
+
resetOnRefCountZero: !options?.refCount
|
|
156
|
+
? false
|
|
157
|
+
: options.refCountDelay != null
|
|
160
158
|
? () => timer(options.refCountDelay)
|
|
161
|
-
: true
|
|
162
|
-
: ttlRemaining > 0
|
|
163
|
-
? () => timer(ttlRemaining)
|
|
164
159
|
: true,
|
|
160
|
+
}), filter(() => !working[key]), finalize(() => {
|
|
161
|
+
subscribers[key]--;
|
|
162
|
+
if (subscribers[key] <= 0) {
|
|
163
|
+
delete subscribers[key];
|
|
164
|
+
if (options?.refCount) {
|
|
165
|
+
const unset = () => {
|
|
166
|
+
storage.deleteItem(key);
|
|
167
|
+
self.___ttl_storage___?.deleteItem(key);
|
|
168
|
+
delete removeTimers[key];
|
|
169
|
+
};
|
|
170
|
+
if (options.refCountDelay == null) {
|
|
171
|
+
unset();
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
removeTimers[key] = setTimeout(unset, options.refCountDelay);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
165
178
|
}));
|
|
166
179
|
storage.setItem(key, observable);
|
|
167
180
|
if (options?.windowTime) {
|
|
168
181
|
setTimeout(() => {
|
|
169
182
|
storage.deleteItem(key);
|
|
170
|
-
|
|
171
|
-
delete latestCall[key];
|
|
183
|
+
self.___ttl_storage___?.deleteItem(key);
|
|
172
184
|
}, options.windowTime);
|
|
173
185
|
}
|
|
174
186
|
}
|
|
187
|
+
subscribers[key] = (subscribers[key] ?? 0) + 1;
|
|
175
188
|
return observable;
|
|
176
189
|
};
|
|
177
190
|
return descriptor;
|