@kovalenko/http-request-cache 1.3.4 → 1.3.5
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 +7 -0
- package/esm2020/lib/http-request-cache.decorator.mjs +106 -47
- package/fesm2015/kovalenko-http-request-cache.mjs +107 -50
- package/fesm2015/kovalenko-http-request-cache.mjs.map +1 -1
- package/fesm2020/kovalenko-http-request-cache.mjs +105 -46
- package/fesm2020/kovalenko-http-request-cache.mjs.map +1 -1
- package/lib/http-request-cache.decorator.d.ts +1 -1
- package/lib/http-request-cache.decorator.js +106 -48
- package/lib/http-request-cache.decorator.js.map +1 -1
- package/package.json +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Subject, merge, NEVER, startWith, switchMap,
|
|
1
|
+
import { Subject, merge, NEVER, startWith, switchMap, finalize, share, ReplaySubject, timer } from 'rxjs';
|
|
2
2
|
|
|
3
3
|
class DefaultStorage {
|
|
4
4
|
constructor() {
|
|
@@ -30,89 +30,148 @@ class RequestTimes {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
const serializeArg = (value) => {
|
|
34
|
+
const seen = new WeakMap();
|
|
35
|
+
let counter = 0;
|
|
36
|
+
const serialize = (v) => {
|
|
37
|
+
if (v === null) {
|
|
38
|
+
return 'null';
|
|
39
|
+
}
|
|
40
|
+
const t = typeof v;
|
|
41
|
+
if (t === 'number' || t === 'boolean') {
|
|
42
|
+
return String(v);
|
|
43
|
+
}
|
|
44
|
+
if (t === 'bigint') {
|
|
45
|
+
return `${v}n`;
|
|
46
|
+
}
|
|
47
|
+
if (t === 'undefined' || t === 'symbol' || t === 'function') {
|
|
48
|
+
return 'undef';
|
|
49
|
+
}
|
|
50
|
+
if (t === 'string') {
|
|
51
|
+
return `str:${v}`;
|
|
52
|
+
}
|
|
53
|
+
if (t !== 'object') {
|
|
54
|
+
return `${t}:${String(v)}`;
|
|
55
|
+
}
|
|
56
|
+
if (v instanceof Date) {
|
|
57
|
+
return `date:${v.toISOString()}`;
|
|
58
|
+
}
|
|
59
|
+
if (v instanceof RegExp) {
|
|
60
|
+
return `regexp:${v.toString()}`;
|
|
61
|
+
}
|
|
62
|
+
const path = seen.get(v);
|
|
63
|
+
if (path !== undefined) {
|
|
64
|
+
return `circ:${path}`;
|
|
65
|
+
}
|
|
66
|
+
seen.set(v, `v${counter++}`);
|
|
67
|
+
let out;
|
|
68
|
+
if (v instanceof Map) {
|
|
69
|
+
out = `map:${serialize(Array.from(v.entries()))}`;
|
|
70
|
+
}
|
|
71
|
+
else if (v instanceof Set) {
|
|
72
|
+
out = `set:${serialize(Array.from(v.values()))}`;
|
|
73
|
+
}
|
|
74
|
+
else if (Array.isArray(v)) {
|
|
75
|
+
out = `[${v.map(serialize).join(',')}]`;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
out = `{${Object.keys(v).sort().map(k => `${serialize(k)}:${serialize(v[k])}`).join(',')}}`;
|
|
79
|
+
}
|
|
80
|
+
seen.delete(v);
|
|
81
|
+
return out;
|
|
82
|
+
};
|
|
83
|
+
return serialize(value);
|
|
84
|
+
};
|
|
85
|
+
const hashArgs = (input) => {
|
|
86
|
+
let h = 0x811c9dc5;
|
|
87
|
+
for (let i = 0; i < input.length; i++) {
|
|
88
|
+
h ^= input.charCodeAt(i);
|
|
89
|
+
h = Math.imul(h, 0x01000193);
|
|
90
|
+
}
|
|
91
|
+
return (h >>> 0).toString(36);
|
|
92
|
+
};
|
|
33
93
|
const HttpRequestCache = (optionsHandler) => {
|
|
34
94
|
return (target, methodName, descriptor) => {
|
|
35
|
-
if (
|
|
95
|
+
if (typeof descriptor?.value !== 'function') {
|
|
36
96
|
throw Error(`'@HttpRequestCache' can be applied only to the class method which returns an Observable`);
|
|
37
97
|
}
|
|
38
98
|
const cacheKeyPrefix = `${target.constructor.name}_${methodName}`;
|
|
39
99
|
const originalMethod = descriptor.value;
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
|
|
100
|
+
const latestCall = {};
|
|
101
|
+
const instanceIds = new WeakMap();
|
|
102
|
+
let instanceIdCounter = 0;
|
|
43
103
|
descriptor.value = function (...args) {
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
104
|
+
const self = this;
|
|
105
|
+
const options = optionsHandler?.call(self, self, ...args);
|
|
106
|
+
const useDefaultStorage = !options?.storage;
|
|
107
|
+
if (useDefaultStorage && !self.___storage___) {
|
|
108
|
+
self.___storage___ = new DefaultStorage();
|
|
47
109
|
}
|
|
48
|
-
|
|
49
|
-
|
|
110
|
+
const ttlEnabled = options?.ttl != null;
|
|
111
|
+
if (ttlEnabled && !self.___ttl_storage___) {
|
|
112
|
+
self.___ttl_storage___ = new RequestTimes();
|
|
50
113
|
}
|
|
51
|
-
const storage = options?.storage ??
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
if (
|
|
55
|
-
|
|
56
|
-
|
|
114
|
+
const storage = options?.storage ?? self.___storage___;
|
|
115
|
+
const ttlStorage = self.___ttl_storage___;
|
|
116
|
+
let instanceId = '';
|
|
117
|
+
if (useDefaultStorage) {
|
|
118
|
+
let id = instanceIds.get(self);
|
|
119
|
+
if (id === undefined) {
|
|
120
|
+
id = ++instanceIdCounter;
|
|
121
|
+
instanceIds.set(self, id);
|
|
122
|
+
}
|
|
123
|
+
instanceId = `_${id}`;
|
|
57
124
|
}
|
|
125
|
+
const key = `${cacheKeyPrefix}${instanceId}_${hashArgs(serializeArg(args))}`;
|
|
126
|
+
const latest = latestCall[key] ?? (latestCall[key] = { self, args });
|
|
127
|
+
latest.self = self;
|
|
128
|
+
latest.args = args;
|
|
58
129
|
let ttl = undefined;
|
|
59
|
-
if (
|
|
60
|
-
ttl =
|
|
130
|
+
if (ttlEnabled && ttlStorage) {
|
|
131
|
+
ttl = ttlStorage.getItem(key);
|
|
61
132
|
if (!ttl) {
|
|
62
133
|
ttl = {
|
|
63
134
|
requestTime: Date.now(),
|
|
64
135
|
subject: new Subject(),
|
|
65
136
|
};
|
|
66
137
|
}
|
|
67
|
-
else if (ttl.requestTime + options
|
|
68
|
-
working[key] = true;
|
|
138
|
+
else if (ttl.requestTime + options?.ttl <= Date.now()) {
|
|
69
139
|
ttl.requestTime = Date.now();
|
|
70
140
|
ttl.subject.next();
|
|
71
141
|
}
|
|
72
|
-
|
|
142
|
+
ttlStorage.setItem(key, ttl);
|
|
73
143
|
}
|
|
74
144
|
const refreshOn = merge(options?.refreshOn ?? NEVER, ttl?.subject ?? NEVER);
|
|
75
145
|
let observable = storage.getItem(key);
|
|
76
146
|
if (!observable) {
|
|
77
|
-
|
|
78
|
-
|
|
147
|
+
const ttlRemaining = ttlEnabled && ttl
|
|
148
|
+
? ttl.requestTime + options?.ttl - Date.now()
|
|
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];
|
|
79
154
|
}), share({
|
|
80
155
|
connector: () => new ReplaySubject(1),
|
|
81
156
|
resetOnComplete: false,
|
|
82
157
|
resetOnError: true,
|
|
83
|
-
resetOnRefCountZero:
|
|
84
|
-
?
|
|
85
|
-
: options.refCountDelay != null
|
|
158
|
+
resetOnRefCountZero: options?.refCount
|
|
159
|
+
? options.refCountDelay != null
|
|
86
160
|
? () => timer(options.refCountDelay)
|
|
161
|
+
: true
|
|
162
|
+
: ttlRemaining > 0
|
|
163
|
+
? () => timer(ttlRemaining)
|
|
87
164
|
: true,
|
|
88
|
-
}), filter(() => !working[key]), finalize(() => {
|
|
89
|
-
subscribers[key]--;
|
|
90
|
-
if (subscribers[key] <= 0) {
|
|
91
|
-
delete subscribers[key];
|
|
92
|
-
if (options?.refCount) {
|
|
93
|
-
const unset = () => {
|
|
94
|
-
storage.deleteItem(key);
|
|
95
|
-
target._____ttl_storage_____?.deleteItem(key);
|
|
96
|
-
delete removeTimers[key];
|
|
97
|
-
};
|
|
98
|
-
if (options.refCountDelay == null) {
|
|
99
|
-
unset();
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
removeTimers[key] = setTimeout(unset, options.refCountDelay);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
165
|
}));
|
|
107
166
|
storage.setItem(key, observable);
|
|
108
167
|
if (options?.windowTime) {
|
|
109
168
|
setTimeout(() => {
|
|
110
169
|
storage.deleteItem(key);
|
|
111
|
-
|
|
170
|
+
ttlStorage?.deleteItem(key);
|
|
171
|
+
delete latestCall[key];
|
|
112
172
|
}, options.windowTime);
|
|
113
173
|
}
|
|
114
174
|
}
|
|
115
|
-
subscribers[key]++;
|
|
116
175
|
return observable;
|
|
117
176
|
};
|
|
118
177
|
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 {HttpCacheOptions} from './http-cache-options';\nimport {\n filter, finalize, merge, NEVER, Observable, Subject, tap, shareReplay, startWith, switchMap, share,\n ReplaySubject, timer\n} from 'rxjs';\nimport {DefaultStorage} from './default-storage';\nimport {RequestTimes} from './request-times';\n\ntype HttpRequestCacheMethod = (...args: any[]) => Observable<any>;\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 (!(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\n descriptor.value = function(...args: any[]): Observable<any> {\n const options = optionsHandler?.call(this as T, this as T, ...args);\n\n if (!options?.storage && !(target as any)._____storage_____) {\n (target as any)._____storage_____ = new DefaultStorage();\n }\n\n if (options?.ttl && !(target as any)._____ttl_storage_____) {\n (target as any)._____ttl_storage_____ = new RequestTimes();\n }\n\n const storage = options?.storage ?? (target as any)._____storage_____;\n\n const key = `${cacheKeyPrefix}_${JSON.stringify(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 = (target as any)._____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 (target as any)._____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 ? () => 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 = () => {\n storage.deleteItem(key);\n (target as any)._____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 (target as any)._____ttl_storage_____?.deleteItem(key);\n },\n options.windowTime,\n );\n }\n }\n\n subscribers[key]++;\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
|
+
{"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,5 +1,5 @@
|
|
|
1
|
-
import { HttpCacheOptions } from './http-cache-options';
|
|
2
1
|
import { Observable } from 'rxjs';
|
|
2
|
+
import { HttpCacheOptions } from './http-cache-options';
|
|
3
3
|
declare type HttpRequestCacheMethod = (...args: any[]) => Observable<any>;
|
|
4
4
|
export declare const HttpRequestCache: <T extends Record<string, any>>(optionsHandler?: (obj: T, ...args: any[]) => HttpCacheOptions) => (target: T, methodName: string, descriptor: TypedPropertyDescriptor<HttpRequestCacheMethod>) => TypedPropertyDescriptor<HttpRequestCacheMethod>;
|
|
5
5
|
export {};
|
|
@@ -4,91 +4,149 @@ exports.HttpRequestCache = void 0;
|
|
|
4
4
|
const rxjs_1 = require("rxjs");
|
|
5
5
|
const default_storage_1 = require("./default-storage");
|
|
6
6
|
const request_times_1 = require("./request-times");
|
|
7
|
+
const serializeArg = (value) => {
|
|
8
|
+
const seen = new WeakMap();
|
|
9
|
+
let counter = 0;
|
|
10
|
+
const serialize = (v) => {
|
|
11
|
+
if (v === null) {
|
|
12
|
+
return 'null';
|
|
13
|
+
}
|
|
14
|
+
const t = typeof v;
|
|
15
|
+
if (t === 'number' || t === 'boolean') {
|
|
16
|
+
return String(v);
|
|
17
|
+
}
|
|
18
|
+
if (t === 'bigint') {
|
|
19
|
+
return `${v}n`;
|
|
20
|
+
}
|
|
21
|
+
if (t === 'undefined' || t === 'symbol' || t === 'function') {
|
|
22
|
+
return 'undef';
|
|
23
|
+
}
|
|
24
|
+
if (t === 'string') {
|
|
25
|
+
return `str:${v}`;
|
|
26
|
+
}
|
|
27
|
+
if (t !== 'object') {
|
|
28
|
+
return `${t}:${String(v)}`;
|
|
29
|
+
}
|
|
30
|
+
if (v instanceof Date) {
|
|
31
|
+
return `date:${v.toISOString()}`;
|
|
32
|
+
}
|
|
33
|
+
if (v instanceof RegExp) {
|
|
34
|
+
return `regexp:${v.toString()}`;
|
|
35
|
+
}
|
|
36
|
+
const path = seen.get(v);
|
|
37
|
+
if (path !== undefined) {
|
|
38
|
+
return `circ:${path}`;
|
|
39
|
+
}
|
|
40
|
+
seen.set(v, `v${counter++}`);
|
|
41
|
+
let out;
|
|
42
|
+
if (v instanceof Map) {
|
|
43
|
+
out = `map:${serialize(Array.from(v.entries()))}`;
|
|
44
|
+
}
|
|
45
|
+
else if (v instanceof Set) {
|
|
46
|
+
out = `set:${serialize(Array.from(v.values()))}`;
|
|
47
|
+
}
|
|
48
|
+
else if (Array.isArray(v)) {
|
|
49
|
+
out = `[${v.map(serialize).join(',')}]`;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
out = `{${Object.keys(v).sort().map(k => `${serialize(k)}:${serialize(v[k])}`).join(',')}}`;
|
|
53
|
+
}
|
|
54
|
+
seen.delete(v);
|
|
55
|
+
return out;
|
|
56
|
+
};
|
|
57
|
+
return serialize(value);
|
|
58
|
+
};
|
|
59
|
+
const hashArgs = (input) => {
|
|
60
|
+
let h = 0x811c9dc5;
|
|
61
|
+
for (let i = 0; i < input.length; i++) {
|
|
62
|
+
h ^= input.charCodeAt(i);
|
|
63
|
+
h = Math.imul(h, 0x01000193);
|
|
64
|
+
}
|
|
65
|
+
return (h >>> 0).toString(36);
|
|
66
|
+
};
|
|
7
67
|
const HttpRequestCache = (optionsHandler) => {
|
|
8
68
|
return (target, methodName, descriptor) => {
|
|
9
|
-
if (
|
|
69
|
+
if (typeof (descriptor === null || descriptor === void 0 ? void 0 : descriptor.value) !== 'function') {
|
|
10
70
|
throw Error(`'@HttpRequestCache' can be applied only to the class method which returns an Observable`);
|
|
11
71
|
}
|
|
12
72
|
const cacheKeyPrefix = `${target.constructor.name}_${methodName}`;
|
|
13
73
|
const originalMethod = descriptor.value;
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
|
|
74
|
+
const latestCall = {};
|
|
75
|
+
const instanceIds = new WeakMap();
|
|
76
|
+
let instanceIdCounter = 0;
|
|
17
77
|
descriptor.value = function (...args) {
|
|
18
|
-
var _a, _b, _c;
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
78
|
+
var _a, _b, _c, _d;
|
|
79
|
+
const self = this;
|
|
80
|
+
const options = optionsHandler === null || optionsHandler === void 0 ? void 0 : optionsHandler.call(self, self, ...args);
|
|
81
|
+
const useDefaultStorage = !(options === null || options === void 0 ? void 0 : options.storage);
|
|
82
|
+
if (useDefaultStorage && !self.___storage___) {
|
|
83
|
+
self.___storage___ = new default_storage_1.DefaultStorage();
|
|
22
84
|
}
|
|
23
|
-
|
|
24
|
-
|
|
85
|
+
const ttlEnabled = (options === null || options === void 0 ? void 0 : options.ttl) != null;
|
|
86
|
+
if (ttlEnabled && !self.___ttl_storage___) {
|
|
87
|
+
self.___ttl_storage___ = new request_times_1.RequestTimes();
|
|
25
88
|
}
|
|
26
|
-
const storage = (_a = options === null || options === void 0 ? void 0 : options.storage) !== null && _a !== void 0 ? _a :
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
89
|
+
const storage = (_a = options === null || options === void 0 ? void 0 : options.storage) !== null && _a !== void 0 ? _a : self.___storage___;
|
|
90
|
+
const ttlStorage = self.___ttl_storage___;
|
|
91
|
+
let instanceId = '';
|
|
92
|
+
if (useDefaultStorage) {
|
|
93
|
+
let id = instanceIds.get(self);
|
|
94
|
+
if (id === undefined) {
|
|
95
|
+
id = ++instanceIdCounter;
|
|
96
|
+
instanceIds.set(self, id);
|
|
97
|
+
}
|
|
98
|
+
instanceId = `_${id}`;
|
|
31
99
|
}
|
|
100
|
+
const key = `${cacheKeyPrefix}${instanceId}_${hashArgs(serializeArg(args))}`;
|
|
101
|
+
const latest = (_b = latestCall[key]) !== null && _b !== void 0 ? _b : (latestCall[key] = { self, args });
|
|
102
|
+
latest.self = self;
|
|
103
|
+
latest.args = args;
|
|
32
104
|
let ttl = undefined;
|
|
33
|
-
if (
|
|
34
|
-
ttl =
|
|
105
|
+
if (ttlEnabled && ttlStorage) {
|
|
106
|
+
ttl = ttlStorage.getItem(key);
|
|
35
107
|
if (!ttl) {
|
|
36
108
|
ttl = {
|
|
37
109
|
requestTime: Date.now(),
|
|
38
110
|
subject: new rxjs_1.Subject(),
|
|
39
111
|
};
|
|
40
112
|
}
|
|
41
|
-
else if (ttl.requestTime + options.ttl <= Date.now()) {
|
|
42
|
-
working[key] = true;
|
|
113
|
+
else if (ttl.requestTime + (options === null || options === void 0 ? void 0 : options.ttl) <= Date.now()) {
|
|
43
114
|
ttl.requestTime = Date.now();
|
|
44
115
|
ttl.subject.next();
|
|
45
116
|
}
|
|
46
|
-
|
|
117
|
+
ttlStorage.setItem(key, ttl);
|
|
47
118
|
}
|
|
48
|
-
const refreshOn = (0, rxjs_1.merge)((
|
|
119
|
+
const refreshOn = (0, rxjs_1.merge)((_c = options === null || options === void 0 ? void 0 : options.refreshOn) !== null && _c !== void 0 ? _c : rxjs_1.NEVER, (_d = ttl === null || ttl === void 0 ? void 0 : ttl.subject) !== null && _d !== void 0 ? _d : rxjs_1.NEVER);
|
|
49
120
|
let observable = storage.getItem(key);
|
|
50
121
|
if (!observable) {
|
|
51
|
-
|
|
52
|
-
|
|
122
|
+
const ttlRemaining = ttlEnabled && ttl
|
|
123
|
+
? ttl.requestTime + (options === null || options === void 0 ? void 0 : options.ttl) - Date.now()
|
|
124
|
+
: 0;
|
|
125
|
+
observable = refreshOn.pipe((0, rxjs_1.startWith)(true), (0, rxjs_1.switchMap)(() => originalMethod.apply(latest.self, latest.args)), (0, rxjs_1.finalize)(() => {
|
|
126
|
+
storage.deleteItem(key);
|
|
127
|
+
ttlStorage === null || ttlStorage === void 0 ? void 0 : ttlStorage.deleteItem(key);
|
|
128
|
+
delete latestCall[key];
|
|
53
129
|
}), (0, rxjs_1.share)({
|
|
54
130
|
connector: () => new rxjs_1.ReplaySubject(1),
|
|
55
131
|
resetOnComplete: false,
|
|
56
132
|
resetOnError: true,
|
|
57
|
-
resetOnRefCountZero:
|
|
58
|
-
?
|
|
59
|
-
: options.refCountDelay != null
|
|
133
|
+
resetOnRefCountZero: (options === null || options === void 0 ? void 0 : options.refCount)
|
|
134
|
+
? options.refCountDelay != null
|
|
60
135
|
? () => (0, rxjs_1.timer)(options.refCountDelay)
|
|
136
|
+
: true
|
|
137
|
+
: ttlRemaining > 0
|
|
138
|
+
? () => (0, rxjs_1.timer)(ttlRemaining)
|
|
61
139
|
: true,
|
|
62
|
-
}), (0, rxjs_1.filter)(() => !working[key]), (0, rxjs_1.finalize)(() => {
|
|
63
|
-
subscribers[key]--;
|
|
64
|
-
if (subscribers[key] <= 0) {
|
|
65
|
-
delete subscribers[key];
|
|
66
|
-
if (options === null || options === void 0 ? void 0 : options.refCount) {
|
|
67
|
-
const unset = () => {
|
|
68
|
-
var _a;
|
|
69
|
-
storage.deleteItem(key);
|
|
70
|
-
(_a = target._____ttl_storage_____) === null || _a === void 0 ? void 0 : _a.deleteItem(key);
|
|
71
|
-
delete removeTimers[key];
|
|
72
|
-
};
|
|
73
|
-
if (options.refCountDelay == null) {
|
|
74
|
-
unset();
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
removeTimers[key] = setTimeout(unset, options.refCountDelay);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
140
|
}));
|
|
82
141
|
storage.setItem(key, observable);
|
|
83
142
|
if (options === null || options === void 0 ? void 0 : options.windowTime) {
|
|
84
143
|
setTimeout(() => {
|
|
85
|
-
var _a;
|
|
86
144
|
storage.deleteItem(key);
|
|
87
|
-
|
|
145
|
+
ttlStorage === null || ttlStorage === void 0 ? void 0 : ttlStorage.deleteItem(key);
|
|
146
|
+
delete latestCall[key];
|
|
88
147
|
}, options.windowTime);
|
|
89
148
|
}
|
|
90
149
|
}
|
|
91
|
-
subscribers[key]++;
|
|
92
150
|
return observable;
|
|
93
151
|
};
|
|
94
152
|
return descriptor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-request-cache.decorator.js","sourceRoot":"","sources":["../../../projects/http-request-cache/src/lib/http-request-cache.decorator.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"http-request-cache.decorator.js","sourceRoot":"","sources":["../../../projects/http-request-cache/src/lib/http-request-cache.decorator.ts"],"names":[],"mappings":"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"}
|