@shihengtech/utils 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/sh-utils.js +11 -0
- package/dist/sh-utils.js.map +1 -0
- package/{dist → es}/index.js +81 -42
- package/es/index.js.map +1 -0
- package/{dist → lib}/index.d.ts +3 -3
- package/{dist/index.cjs → lib/index.js} +83 -44
- package/lib/index.js.map +1 -0
- package/package.json +37 -34
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -87
- package/dist/index.js.map +0 -1
package/{dist → es}/index.js
RENAMED
|
@@ -1,6 +1,43 @@
|
|
|
1
1
|
import localforage from 'localforage';
|
|
2
2
|
import { equals } from 'ramda';
|
|
3
3
|
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __spreadValues = (a, b) => {
|
|
10
|
+
for (var prop in b || (b = {}))
|
|
11
|
+
if (__hasOwnProp.call(b, prop))
|
|
12
|
+
__defNormalProp(a, prop, b[prop]);
|
|
13
|
+
if (__getOwnPropSymbols)
|
|
14
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
15
|
+
if (__propIsEnum.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
}
|
|
18
|
+
return a;
|
|
19
|
+
};
|
|
20
|
+
var __async = (__this, __arguments, generator) => {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
var fulfilled = (value) => {
|
|
23
|
+
try {
|
|
24
|
+
step(generator.next(value));
|
|
25
|
+
} catch (e) {
|
|
26
|
+
reject(e);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
var rejected = (value) => {
|
|
30
|
+
try {
|
|
31
|
+
step(generator.throw(value));
|
|
32
|
+
} catch (e) {
|
|
33
|
+
reject(e);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
37
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
|
|
4
41
|
// src/class/ReplaySubject/index.ts
|
|
5
42
|
var ReplaySubject = class {
|
|
6
43
|
constructor(maxBufferSize = 1) {
|
|
@@ -26,23 +63,27 @@ var ReplaySubject = class {
|
|
|
26
63
|
};
|
|
27
64
|
|
|
28
65
|
// src/utils/fnRunner/index.ts
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
66
|
+
function fnRunner(fn, retryTimes = 0) {
|
|
67
|
+
return __async(this, null, function* () {
|
|
68
|
+
const times = (retryTimes || 0) + 1;
|
|
69
|
+
for (let i = 0; i < times; i++) {
|
|
70
|
+
try {
|
|
71
|
+
return yield fn();
|
|
72
|
+
} catch (error) {
|
|
73
|
+
if (i === times - 1) {
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
37
76
|
}
|
|
38
77
|
}
|
|
39
|
-
|
|
40
|
-
|
|
78
|
+
throw new Error("fnRunner: Unexpected error - all retries exhausted.");
|
|
79
|
+
});
|
|
41
80
|
}
|
|
42
81
|
|
|
43
82
|
// src/utils/createQueryWithCache/index.ts
|
|
83
|
+
var DB_NAME = "sh-cache-common";
|
|
44
84
|
var db = localforage.createInstance({
|
|
45
|
-
name:
|
|
85
|
+
name: DB_NAME,
|
|
86
|
+
storeName: "main-store"
|
|
46
87
|
// driver: [localforage.LOCALSTORAGE, localforage.INDEXEDDB, localforage.WEBSQL],
|
|
47
88
|
});
|
|
48
89
|
function createQueryWithCache(key, fn, options) {
|
|
@@ -58,21 +99,20 @@ function createQueryWithCache(key, fn, options) {
|
|
|
58
99
|
onSuccess,
|
|
59
100
|
onError,
|
|
60
101
|
errorHandler
|
|
61
|
-
} = {
|
|
102
|
+
} = __spreadValues({
|
|
62
103
|
equals: (a, b) => a.length === b.length && a.every((item, index) => item === b[index]),
|
|
63
104
|
retry: 0,
|
|
64
105
|
compareBeforeUpdate: equals,
|
|
65
|
-
remoteMemoryCache: false
|
|
66
|
-
|
|
67
|
-
};
|
|
106
|
+
remoteMemoryCache: false
|
|
107
|
+
}, options);
|
|
68
108
|
const cacheUpdateSubject = new ReplaySubject(1);
|
|
69
|
-
const getLocalCache =
|
|
70
|
-
const cache =
|
|
109
|
+
const getLocalCache = (args) => __async(null, null, function* () {
|
|
110
|
+
const cache = yield db.getItem(key);
|
|
71
111
|
if (cache && (!version2 || cache.version === version2) && (!cache.expires || cache.expires > Date.now()) && equals$1(cache.args, args)) {
|
|
72
112
|
return cache.result;
|
|
73
113
|
}
|
|
74
114
|
throw new Error("Cache not found");
|
|
75
|
-
};
|
|
115
|
+
});
|
|
76
116
|
const remoteResultCache = {
|
|
77
117
|
success: false,
|
|
78
118
|
args: [],
|
|
@@ -102,22 +142,20 @@ function createQueryWithCache(key, fn, options) {
|
|
|
102
142
|
}).catch(clearMemoryCache);
|
|
103
143
|
return { type: "remote", promiseResult: result };
|
|
104
144
|
};
|
|
105
|
-
const queryRemote =
|
|
145
|
+
const queryRemote = (args) => __async(null, null, function* () {
|
|
106
146
|
const rs = {
|
|
107
147
|
type: "remote",
|
|
108
148
|
result: null
|
|
109
149
|
};
|
|
110
150
|
try {
|
|
111
151
|
const { type, promiseResult } = queryWithMemoryCache(args);
|
|
112
|
-
const result = rs.result =
|
|
113
|
-
type === "remote" && (!cacheEnabled ||
|
|
114
|
-
const oldCache =
|
|
115
|
-
const cacheData = {
|
|
152
|
+
const result = rs.result = yield promiseResult;
|
|
153
|
+
type === "remote" && (!cacheEnabled || (yield cacheEnabled(args))) && Promise.resolve().then(() => __async(null, null, function* () {
|
|
154
|
+
const oldCache = yield getLocalCache(args).catch(() => null);
|
|
155
|
+
const cacheData = __spreadValues(__spreadValues({
|
|
116
156
|
args,
|
|
117
|
-
result
|
|
118
|
-
|
|
119
|
-
...maxAge && { expires: Date.now() + maxAge }
|
|
120
|
-
};
|
|
157
|
+
result
|
|
158
|
+
}, version2 && { version: version2 }), maxAge && { expires: Date.now() + maxAge });
|
|
121
159
|
db.setItem(key, cacheData);
|
|
122
160
|
if (compareBeforeUpdate && oldCache && compareBeforeUpdate(oldCache.result, result)) {
|
|
123
161
|
return;
|
|
@@ -127,53 +165,54 @@ function createQueryWithCache(key, fn, options) {
|
|
|
127
165
|
cacheData,
|
|
128
166
|
isCacheHit: !!oldCache
|
|
129
167
|
});
|
|
130
|
-
});
|
|
168
|
+
}));
|
|
131
169
|
} catch (error) {
|
|
132
170
|
if (errorHandler) {
|
|
133
|
-
rs.result =
|
|
171
|
+
rs.result = yield errorHandler(error);
|
|
134
172
|
} else {
|
|
135
173
|
throw error;
|
|
136
174
|
}
|
|
137
175
|
}
|
|
138
176
|
return rs.result;
|
|
139
|
-
};
|
|
140
|
-
const _fn =
|
|
141
|
-
|
|
177
|
+
});
|
|
178
|
+
const _fn = (...args) => __async(null, null, function* () {
|
|
179
|
+
yield beforeRequest == null ? void 0 : beforeRequest();
|
|
142
180
|
const [cacheResult, remoteResult] = [
|
|
143
181
|
getLocalCache(args),
|
|
144
182
|
queryRemote(args)
|
|
145
183
|
];
|
|
146
184
|
cacheResult.then(
|
|
147
|
-
(result2) => onSuccess
|
|
185
|
+
(result2) => onSuccess == null ? void 0 : onSuccess({
|
|
148
186
|
type: "local",
|
|
149
187
|
result: result2
|
|
150
188
|
})
|
|
151
189
|
).catch(() => {
|
|
152
190
|
});
|
|
153
191
|
remoteResult.then(
|
|
154
|
-
(result2) => onSuccess
|
|
192
|
+
(result2) => onSuccess == null ? void 0 : onSuccess({
|
|
155
193
|
type: "remote",
|
|
156
194
|
result: result2
|
|
157
195
|
})
|
|
158
|
-
).catch((error) => onError
|
|
196
|
+
).catch((error) => onError == null ? void 0 : onError(error)).catch(() => {
|
|
159
197
|
});
|
|
160
|
-
const result =
|
|
198
|
+
const result = yield Promise.race([
|
|
161
199
|
cacheResult.catch(() => remoteResult),
|
|
162
200
|
remoteResult
|
|
163
201
|
]);
|
|
164
202
|
return result;
|
|
165
|
-
};
|
|
203
|
+
});
|
|
166
204
|
_fn.subscribeCacheUpdate = (fn2) => cacheUpdateSubject.subscribe(fn2);
|
|
167
|
-
_fn.clearCache =
|
|
205
|
+
_fn.clearCache = () => __async(null, null, function* () {
|
|
168
206
|
clearMemoryCache();
|
|
169
|
-
|
|
170
|
-
};
|
|
207
|
+
yield db.removeItem(key);
|
|
208
|
+
});
|
|
171
209
|
return _fn;
|
|
172
210
|
}
|
|
173
211
|
createQueryWithCache.useDb = (newDb) => {
|
|
174
212
|
if (typeof newDb === "string") {
|
|
175
213
|
db = localforage.createInstance({
|
|
176
|
-
name:
|
|
214
|
+
name: DB_NAME,
|
|
215
|
+
storeName: newDb
|
|
177
216
|
});
|
|
178
217
|
} else {
|
|
179
218
|
db = newDb;
|
|
@@ -181,7 +220,7 @@ createQueryWithCache.useDb = (newDb) => {
|
|
|
181
220
|
};
|
|
182
221
|
|
|
183
222
|
// src/index.ts
|
|
184
|
-
var version = "0.0.
|
|
223
|
+
var version = "0.0.3";
|
|
185
224
|
|
|
186
225
|
export { ReplaySubject, createQueryWithCache, fnRunner, version };
|
|
187
226
|
//# sourceMappingURL=index.js.map
|
package/es/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/class/ReplaySubject/index.ts","../src/utils/fnRunner/index.ts","../src/utils/createQueryWithCache/index.ts","../src/index.ts"],"names":["version","equals","deepEquals","result","fn"],"mappings":"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","file":"index.js","sourcesContent":["class ReplaySubject<T> {\n private maxBufferSize: number\n private buffer: T[] = []\n\n private subscriptions: ((data: T) => void)[] = []\n\n constructor(maxBufferSize = 1) {\n this.maxBufferSize = maxBufferSize\n }\n\n subscribe(fn: (data: T) => void) {\n this.subscriptions.push(fn)\n this.buffer.forEach(data => fn(data))\n return () => this.unsubscribe(fn)\n }\n\n unsubscribe(fn: (data: T) => void) {\n this.subscriptions = this.subscriptions.filter(f => f !== fn)\n }\n\n next(data: T) {\n this.subscriptions.forEach(fn => fn(data))\n this.buffer.push(data)\n if (this.buffer.length > this.maxBufferSize) {\n this.buffer = this.buffer.slice(1)\n }\n }\n}\n\nexport { ReplaySubject }\n","export async function fnRunner<T extends (...args: any[]) => Promise<any>>(fn: T, retryTimes: number = 0): Promise<Awaited<ReturnType<T>>> {\n const times = (retryTimes || 0) + 1\n for (let i = 0; i < times; i++) {\n try {\n return await fn()\n }\n catch (error) {\n // Only throw if this was the last attempt\n if (i === times - 1) {\n throw error\n }\n }\n }\n // This line should never be reached, but it's required for type safety.\n throw new Error('fnRunner: Unexpected error - all retries exhausted.')\n}\n","import localforage from 'localforage'\nimport { equals as deepEquals } from 'ramda'\nimport { ReplaySubject } from '../../class'\nimport { fnRunner } from '../fnRunner'\n\ntype DBType = Pick<\n LocalForage,\n 'getItem' | 'setItem' | 'removeItem' | 'clear'\n // 这些可以暂时不考虑\n // | 'clear' | 'keys' | 'length'\n>\n\nconst DB_NAME = 'sh-cache-common'\n\nlet db: DBType = localforage.createInstance({\n name: DB_NAME,\n storeName: 'main-store',\n // driver: [localforage.LOCALSTORAGE, localforage.INDEXEDDB, localforage.WEBSQL],\n})\n\ninterface CacheItem<T extends (...args: any[]) => Promise<any>> {\n /** 缓存参数 */\n args: Parameters<T>\n /** 缓存版本,用于缓存数据结构变更 */\n version?: string\n /** 缓存过期时间,为空表示永不过期 */\n expires?: number\n /** 缓存结果 */\n result: Awaited<ReturnType<T>>\n}\n\ninterface CacheOptions<T extends (...args: any[]) => Promise<any>> {\n /** 缓存过期时间,为空表示永不过期 */\n maxAge?: number\n /** 缓存版本,用于缓存数据结构变更 */\n version?: string\n /**\n * 重试次数,为0表示不重试\n * @default 0\n */\n retry?: number\n /**\n * 是否比较旧缓存与新缓存后再触发 onCacheUpdate\n * 为 true 时,只有当新旧缓存不一致时才触发 onCacheUpdate\n * 为 false 时,总是触发 onCacheUpdate\n * @default R.equals\n */\n compareBeforeUpdate?:\n | ((prev: Awaited<ReturnType<T>>, next: Awaited<ReturnType<T>>) => boolean)\n | false\n /**\n * 是否启用远程内存缓存\n * 为 true 时,启用远程内存缓存\n * 为 false 时,不启用远程内存缓存\n * @default false\n */\n remoteMemoryCache?: boolean\n /** @default (a, b) => a.length === b.length && a.every((item, index) => item === b[index]) */\n equals?: (prev: Parameters<T>, next: Parameters<T>) => boolean\n /**\n * 根据入参决定是否添加缓存\n * 不传的话默认启用缓存\n */\n cacheEnabled?: (args: Parameters<T>) => Promise<boolean>\n /** 请求前回调 */\n beforeRequest?: () => Promise<void> | void\n /** 请求成功回调 */\n onSuccess?: (result: {\n type: 'local' | 'remote'\n result: Awaited<ReturnType<T>>\n }) => void\n /** 请求错误回调 */\n onError?: (error: any) => void\n /** 远程请求错误处理 */\n errorHandler?: (error: any) => any\n // /** 缓存更新回调 */\n // onCacheUpdate?: (\n // result: Awaited<ReturnType<T>>,\n // cacheData: CacheItem<T>,\n // ) => void;\n}\n\ninterface CacheUpdateEvent<T extends (...args: any[]) => Promise<any>> {\n result: Awaited<ReturnType<T>>\n cacheData: CacheItem<T>\n isCacheHit: boolean\n}\n\nfunction createQueryWithCache<T extends (...args: any[]) => Promise<any>>(key: string, fn: T, options?: CacheOptions<T>) {\n const {\n retry,\n maxAge,\n version,\n compareBeforeUpdate,\n remoteMemoryCache,\n equals,\n cacheEnabled,\n beforeRequest,\n onSuccess,\n onError,\n errorHandler,\n } = {\n equals: (a, b) =>\n a.length === b.length && a.every((item, index) => item === b[index]),\n retry: 0,\n compareBeforeUpdate: deepEquals,\n remoteMemoryCache: false,\n ...options,\n } satisfies CacheOptions<T>\n\n const cacheUpdateSubject = new ReplaySubject<CacheUpdateEvent<T>>(1)\n\n const getLocalCache = async (args: Parameters<T>) => {\n const cache = await db.getItem<CacheItem<T>>(key)\n if (\n cache\n && (!version || cache.version === version)\n && (!cache.expires || cache.expires > Date.now())\n && equals(cache.args, args)\n ) {\n return cache.result\n }\n\n throw new Error('Cache not found')\n }\n\n const remoteResultCache: {\n success: boolean\n args: Parameters<T>\n result: ReturnType<T> | null\n } = {\n success: false,\n args: [] as any,\n result: null,\n }\n\n const clearMemoryCache = () => {\n remoteResultCache.success = false\n remoteResultCache.result = null\n remoteResultCache.args = [] as any\n }\n\n const queryWithMemoryCache = (args: Parameters<T>) => {\n if (remoteResultCache.success && equals(remoteResultCache.args, args)) {\n return {\n type: 'memory' as const,\n promiseResult: remoteResultCache.result!,\n }\n }\n\n remoteResultCache.args = args\n remoteResultCache.success = true\n const result = (remoteResultCache.result = fnRunner(\n () => fn(...args),\n retry,\n ) as ReturnType<T>)\n\n Promise.resolve(result)\n .then((result) => {\n !remoteMemoryCache && clearMemoryCache()\n return result\n })\n .catch(clearMemoryCache)\n\n return { type: 'remote' as const, promiseResult: result }\n }\n\n const queryRemote = async (args: Parameters<T>) => {\n const rs = {\n type: 'remote' as const,\n result: null as unknown as Awaited<ReturnType<T>>,\n }\n\n try {\n const { type, promiseResult } = queryWithMemoryCache(args)\n const result = (rs.result = await promiseResult)\n\n // 设置缓存\n type === 'remote'\n && (!cacheEnabled || (await cacheEnabled(args)))\n && Promise.resolve().then(async () => {\n const oldCache = await getLocalCache(args).catch(() => null)\n\n const cacheData = {\n args,\n result,\n ...(version && { version }),\n ...(maxAge && { expires: Date.now() + maxAge }),\n }\n db.setItem(key, cacheData)\n\n // 如果配置了比较,且旧缓存存在且与新结果相等,则不触发 onCacheUpdate\n if (\n compareBeforeUpdate\n && oldCache\n && compareBeforeUpdate(oldCache.result, result)\n ) {\n return\n }\n cacheUpdateSubject.next({\n result,\n cacheData,\n isCacheHit: !!oldCache,\n })\n })\n }\n catch (error) {\n if (errorHandler) {\n rs.result = (await errorHandler(error)) as Awaited<ReturnType<T>>\n }\n else {\n throw error\n }\n }\n\n return rs.result\n }\n\n const _fn = async (...args: Parameters<T>) => {\n await beforeRequest?.()\n\n const [cacheResult, remoteResult] = [\n getLocalCache(args),\n queryRemote(args),\n ]\n cacheResult\n .then(result =>\n onSuccess?.({\n type: 'local' as const,\n result: result as Awaited<ReturnType<T>>,\n }),\n )\n .catch(() => {})\n remoteResult\n .then(result =>\n onSuccess?.({\n type: 'remote' as const,\n result: result as Awaited<ReturnType<T>>,\n }),\n )\n .catch(error => onError?.(error))\n .catch(() => {})\n const result = await Promise.race([\n cacheResult.catch(() => remoteResult),\n remoteResult,\n ])\n\n return result\n }\n\n _fn.subscribeCacheUpdate = (fn: (data: CacheUpdateEvent<T>) => void) =>\n cacheUpdateSubject.subscribe(fn)\n\n _fn.clearCache = async () => {\n clearMemoryCache()\n await db.removeItem(key)\n }\n\n return _fn\n}\n\n/**\n * 使用自定义数据库实例\n * @param newDb 数据库实例或 storeName,如果为字符串,则使用 localforage 创建一个实例\n */\ncreateQueryWithCache.useDb = <T extends string>(newDb: DBType | (T extends 'main-store' ? never : T)) => {\n if (typeof newDb === 'string') {\n db = localforage.createInstance({\n name: DB_NAME,\n storeName: newDb,\n })\n }\n else {\n db = newDb\n }\n}\n\nexport { createQueryWithCache }\n","/**\n * @shihengtech/utils - A collection of utility functions\n */\n\n// Type checking utilities\nexport * from './class'\nexport * from './utils'\n// Version\nexport const version = '0.0.3'\n"]}
|
package/{dist → lib}/index.d.ts
RENAMED
|
@@ -73,15 +73,15 @@ declare function createQueryWithCache<T extends (...args: any[]) => Promise<any>
|
|
|
73
73
|
clearCache(): Promise<void>;
|
|
74
74
|
};
|
|
75
75
|
declare namespace createQueryWithCache {
|
|
76
|
-
var useDb: (newDb: DBType |
|
|
76
|
+
var useDb: <T extends string>(newDb: DBType | (T extends "main-store" ? never : T)) => void;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
declare function fnRunner<T
|
|
79
|
+
declare function fnRunner<T extends (...args: any[]) => Promise<any>>(fn: T, retryTimes?: number): Promise<Awaited<ReturnType<T>>>;
|
|
80
80
|
|
|
81
81
|
/**
|
|
82
82
|
* @shihengtech/utils - A collection of utility functions
|
|
83
83
|
*/
|
|
84
84
|
|
|
85
|
-
declare const version = "0.0.
|
|
85
|
+
declare const version = "0.0.3";
|
|
86
86
|
|
|
87
87
|
export { ReplaySubject, createQueryWithCache, fnRunner, version };
|
|
@@ -7,6 +7,43 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
7
7
|
|
|
8
8
|
var localforage__default = /*#__PURE__*/_interopDefault(localforage);
|
|
9
9
|
|
|
10
|
+
var __defProp = Object.defineProperty;
|
|
11
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
12
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
13
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
14
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
15
|
+
var __spreadValues = (a, b) => {
|
|
16
|
+
for (var prop in b || (b = {}))
|
|
17
|
+
if (__hasOwnProp.call(b, prop))
|
|
18
|
+
__defNormalProp(a, prop, b[prop]);
|
|
19
|
+
if (__getOwnPropSymbols)
|
|
20
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
21
|
+
if (__propIsEnum.call(b, prop))
|
|
22
|
+
__defNormalProp(a, prop, b[prop]);
|
|
23
|
+
}
|
|
24
|
+
return a;
|
|
25
|
+
};
|
|
26
|
+
var __async = (__this, __arguments, generator) => {
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
var fulfilled = (value) => {
|
|
29
|
+
try {
|
|
30
|
+
step(generator.next(value));
|
|
31
|
+
} catch (e) {
|
|
32
|
+
reject(e);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
var rejected = (value) => {
|
|
36
|
+
try {
|
|
37
|
+
step(generator.throw(value));
|
|
38
|
+
} catch (e) {
|
|
39
|
+
reject(e);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
43
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
|
|
10
47
|
// src/class/ReplaySubject/index.ts
|
|
11
48
|
var ReplaySubject = class {
|
|
12
49
|
constructor(maxBufferSize = 1) {
|
|
@@ -32,23 +69,27 @@ var ReplaySubject = class {
|
|
|
32
69
|
};
|
|
33
70
|
|
|
34
71
|
// src/utils/fnRunner/index.ts
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
72
|
+
function fnRunner(fn, retryTimes = 0) {
|
|
73
|
+
return __async(this, null, function* () {
|
|
74
|
+
const times = (retryTimes || 0) + 1;
|
|
75
|
+
for (let i = 0; i < times; i++) {
|
|
76
|
+
try {
|
|
77
|
+
return yield fn();
|
|
78
|
+
} catch (error) {
|
|
79
|
+
if (i === times - 1) {
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
43
82
|
}
|
|
44
83
|
}
|
|
45
|
-
|
|
46
|
-
|
|
84
|
+
throw new Error("fnRunner: Unexpected error - all retries exhausted.");
|
|
85
|
+
});
|
|
47
86
|
}
|
|
48
87
|
|
|
49
88
|
// src/utils/createQueryWithCache/index.ts
|
|
89
|
+
var DB_NAME = "sh-cache-common";
|
|
50
90
|
var db = localforage__default.default.createInstance({
|
|
51
|
-
name:
|
|
91
|
+
name: DB_NAME,
|
|
92
|
+
storeName: "main-store"
|
|
52
93
|
// driver: [localforage.LOCALSTORAGE, localforage.INDEXEDDB, localforage.WEBSQL],
|
|
53
94
|
});
|
|
54
95
|
function createQueryWithCache(key, fn, options) {
|
|
@@ -64,21 +105,20 @@ function createQueryWithCache(key, fn, options) {
|
|
|
64
105
|
onSuccess,
|
|
65
106
|
onError,
|
|
66
107
|
errorHandler
|
|
67
|
-
} = {
|
|
108
|
+
} = __spreadValues({
|
|
68
109
|
equals: (a, b) => a.length === b.length && a.every((item, index) => item === b[index]),
|
|
69
110
|
retry: 0,
|
|
70
111
|
compareBeforeUpdate: ramda.equals,
|
|
71
|
-
remoteMemoryCache: false
|
|
72
|
-
|
|
73
|
-
};
|
|
112
|
+
remoteMemoryCache: false
|
|
113
|
+
}, options);
|
|
74
114
|
const cacheUpdateSubject = new ReplaySubject(1);
|
|
75
|
-
const getLocalCache =
|
|
76
|
-
const cache =
|
|
115
|
+
const getLocalCache = (args) => __async(null, null, function* () {
|
|
116
|
+
const cache = yield db.getItem(key);
|
|
77
117
|
if (cache && (!version2 || cache.version === version2) && (!cache.expires || cache.expires > Date.now()) && equals(cache.args, args)) {
|
|
78
118
|
return cache.result;
|
|
79
119
|
}
|
|
80
120
|
throw new Error("Cache not found");
|
|
81
|
-
};
|
|
121
|
+
});
|
|
82
122
|
const remoteResultCache = {
|
|
83
123
|
success: false,
|
|
84
124
|
args: [],
|
|
@@ -108,22 +148,20 @@ function createQueryWithCache(key, fn, options) {
|
|
|
108
148
|
}).catch(clearMemoryCache);
|
|
109
149
|
return { type: "remote", promiseResult: result };
|
|
110
150
|
};
|
|
111
|
-
const queryRemote =
|
|
151
|
+
const queryRemote = (args) => __async(null, null, function* () {
|
|
112
152
|
const rs = {
|
|
113
153
|
type: "remote",
|
|
114
154
|
result: null
|
|
115
155
|
};
|
|
116
156
|
try {
|
|
117
157
|
const { type, promiseResult } = queryWithMemoryCache(args);
|
|
118
|
-
const result = rs.result =
|
|
119
|
-
type === "remote" && (!cacheEnabled ||
|
|
120
|
-
const oldCache =
|
|
121
|
-
const cacheData = {
|
|
158
|
+
const result = rs.result = yield promiseResult;
|
|
159
|
+
type === "remote" && (!cacheEnabled || (yield cacheEnabled(args))) && Promise.resolve().then(() => __async(null, null, function* () {
|
|
160
|
+
const oldCache = yield getLocalCache(args).catch(() => null);
|
|
161
|
+
const cacheData = __spreadValues(__spreadValues({
|
|
122
162
|
args,
|
|
123
|
-
result
|
|
124
|
-
|
|
125
|
-
...maxAge && { expires: Date.now() + maxAge }
|
|
126
|
-
};
|
|
163
|
+
result
|
|
164
|
+
}, version2 && { version: version2 }), maxAge && { expires: Date.now() + maxAge });
|
|
127
165
|
db.setItem(key, cacheData);
|
|
128
166
|
if (compareBeforeUpdate && oldCache && compareBeforeUpdate(oldCache.result, result)) {
|
|
129
167
|
return;
|
|
@@ -133,53 +171,54 @@ function createQueryWithCache(key, fn, options) {
|
|
|
133
171
|
cacheData,
|
|
134
172
|
isCacheHit: !!oldCache
|
|
135
173
|
});
|
|
136
|
-
});
|
|
174
|
+
}));
|
|
137
175
|
} catch (error) {
|
|
138
176
|
if (errorHandler) {
|
|
139
|
-
rs.result =
|
|
177
|
+
rs.result = yield errorHandler(error);
|
|
140
178
|
} else {
|
|
141
179
|
throw error;
|
|
142
180
|
}
|
|
143
181
|
}
|
|
144
182
|
return rs.result;
|
|
145
|
-
};
|
|
146
|
-
const _fn =
|
|
147
|
-
|
|
183
|
+
});
|
|
184
|
+
const _fn = (...args) => __async(null, null, function* () {
|
|
185
|
+
yield beforeRequest == null ? void 0 : beforeRequest();
|
|
148
186
|
const [cacheResult, remoteResult] = [
|
|
149
187
|
getLocalCache(args),
|
|
150
188
|
queryRemote(args)
|
|
151
189
|
];
|
|
152
190
|
cacheResult.then(
|
|
153
|
-
(result2) => onSuccess
|
|
191
|
+
(result2) => onSuccess == null ? void 0 : onSuccess({
|
|
154
192
|
type: "local",
|
|
155
193
|
result: result2
|
|
156
194
|
})
|
|
157
195
|
).catch(() => {
|
|
158
196
|
});
|
|
159
197
|
remoteResult.then(
|
|
160
|
-
(result2) => onSuccess
|
|
198
|
+
(result2) => onSuccess == null ? void 0 : onSuccess({
|
|
161
199
|
type: "remote",
|
|
162
200
|
result: result2
|
|
163
201
|
})
|
|
164
|
-
).catch((error) => onError
|
|
202
|
+
).catch((error) => onError == null ? void 0 : onError(error)).catch(() => {
|
|
165
203
|
});
|
|
166
|
-
const result =
|
|
204
|
+
const result = yield Promise.race([
|
|
167
205
|
cacheResult.catch(() => remoteResult),
|
|
168
206
|
remoteResult
|
|
169
207
|
]);
|
|
170
208
|
return result;
|
|
171
|
-
};
|
|
209
|
+
});
|
|
172
210
|
_fn.subscribeCacheUpdate = (fn2) => cacheUpdateSubject.subscribe(fn2);
|
|
173
|
-
_fn.clearCache =
|
|
211
|
+
_fn.clearCache = () => __async(null, null, function* () {
|
|
174
212
|
clearMemoryCache();
|
|
175
|
-
|
|
176
|
-
};
|
|
213
|
+
yield db.removeItem(key);
|
|
214
|
+
});
|
|
177
215
|
return _fn;
|
|
178
216
|
}
|
|
179
217
|
createQueryWithCache.useDb = (newDb) => {
|
|
180
218
|
if (typeof newDb === "string") {
|
|
181
219
|
db = localforage__default.default.createInstance({
|
|
182
|
-
name:
|
|
220
|
+
name: DB_NAME,
|
|
221
|
+
storeName: newDb
|
|
183
222
|
});
|
|
184
223
|
} else {
|
|
185
224
|
db = newDb;
|
|
@@ -187,11 +226,11 @@ createQueryWithCache.useDb = (newDb) => {
|
|
|
187
226
|
};
|
|
188
227
|
|
|
189
228
|
// src/index.ts
|
|
190
|
-
var version = "0.0.
|
|
229
|
+
var version = "0.0.3";
|
|
191
230
|
|
|
192
231
|
exports.ReplaySubject = ReplaySubject;
|
|
193
232
|
exports.createQueryWithCache = createQueryWithCache;
|
|
194
233
|
exports.fnRunner = fnRunner;
|
|
195
234
|
exports.version = version;
|
|
196
|
-
//# sourceMappingURL=index.
|
|
197
|
-
//# sourceMappingURL=index.
|
|
235
|
+
//# sourceMappingURL=index.js.map
|
|
236
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/class/ReplaySubject/index.ts","../src/utils/fnRunner/index.ts","../src/utils/createQueryWithCache/index.ts","../src/index.ts"],"names":["localforage","version","deepEquals","result","fn"],"mappings":"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","file":"index.js","sourcesContent":["class ReplaySubject<T> {\n private maxBufferSize: number\n private buffer: T[] = []\n\n private subscriptions: ((data: T) => void)[] = []\n\n constructor(maxBufferSize = 1) {\n this.maxBufferSize = maxBufferSize\n }\n\n subscribe(fn: (data: T) => void) {\n this.subscriptions.push(fn)\n this.buffer.forEach(data => fn(data))\n return () => this.unsubscribe(fn)\n }\n\n unsubscribe(fn: (data: T) => void) {\n this.subscriptions = this.subscriptions.filter(f => f !== fn)\n }\n\n next(data: T) {\n this.subscriptions.forEach(fn => fn(data))\n this.buffer.push(data)\n if (this.buffer.length > this.maxBufferSize) {\n this.buffer = this.buffer.slice(1)\n }\n }\n}\n\nexport { ReplaySubject }\n","export async function fnRunner<T extends (...args: any[]) => Promise<any>>(fn: T, retryTimes: number = 0): Promise<Awaited<ReturnType<T>>> {\n const times = (retryTimes || 0) + 1\n for (let i = 0; i < times; i++) {\n try {\n return await fn()\n }\n catch (error) {\n // Only throw if this was the last attempt\n if (i === times - 1) {\n throw error\n }\n }\n }\n // This line should never be reached, but it's required for type safety.\n throw new Error('fnRunner: Unexpected error - all retries exhausted.')\n}\n","import localforage from 'localforage'\nimport { equals as deepEquals } from 'ramda'\nimport { ReplaySubject } from '../../class'\nimport { fnRunner } from '../fnRunner'\n\ntype DBType = Pick<\n LocalForage,\n 'getItem' | 'setItem' | 'removeItem' | 'clear'\n // 这些可以暂时不考虑\n // | 'clear' | 'keys' | 'length'\n>\n\nconst DB_NAME = 'sh-cache-common'\n\nlet db: DBType = localforage.createInstance({\n name: DB_NAME,\n storeName: 'main-store',\n // driver: [localforage.LOCALSTORAGE, localforage.INDEXEDDB, localforage.WEBSQL],\n})\n\ninterface CacheItem<T extends (...args: any[]) => Promise<any>> {\n /** 缓存参数 */\n args: Parameters<T>\n /** 缓存版本,用于缓存数据结构变更 */\n version?: string\n /** 缓存过期时间,为空表示永不过期 */\n expires?: number\n /** 缓存结果 */\n result: Awaited<ReturnType<T>>\n}\n\ninterface CacheOptions<T extends (...args: any[]) => Promise<any>> {\n /** 缓存过期时间,为空表示永不过期 */\n maxAge?: number\n /** 缓存版本,用于缓存数据结构变更 */\n version?: string\n /**\n * 重试次数,为0表示不重试\n * @default 0\n */\n retry?: number\n /**\n * 是否比较旧缓存与新缓存后再触发 onCacheUpdate\n * 为 true 时,只有当新旧缓存不一致时才触发 onCacheUpdate\n * 为 false 时,总是触发 onCacheUpdate\n * @default R.equals\n */\n compareBeforeUpdate?:\n | ((prev: Awaited<ReturnType<T>>, next: Awaited<ReturnType<T>>) => boolean)\n | false\n /**\n * 是否启用远程内存缓存\n * 为 true 时,启用远程内存缓存\n * 为 false 时,不启用远程内存缓存\n * @default false\n */\n remoteMemoryCache?: boolean\n /** @default (a, b) => a.length === b.length && a.every((item, index) => item === b[index]) */\n equals?: (prev: Parameters<T>, next: Parameters<T>) => boolean\n /**\n * 根据入参决定是否添加缓存\n * 不传的话默认启用缓存\n */\n cacheEnabled?: (args: Parameters<T>) => Promise<boolean>\n /** 请求前回调 */\n beforeRequest?: () => Promise<void> | void\n /** 请求成功回调 */\n onSuccess?: (result: {\n type: 'local' | 'remote'\n result: Awaited<ReturnType<T>>\n }) => void\n /** 请求错误回调 */\n onError?: (error: any) => void\n /** 远程请求错误处理 */\n errorHandler?: (error: any) => any\n // /** 缓存更新回调 */\n // onCacheUpdate?: (\n // result: Awaited<ReturnType<T>>,\n // cacheData: CacheItem<T>,\n // ) => void;\n}\n\ninterface CacheUpdateEvent<T extends (...args: any[]) => Promise<any>> {\n result: Awaited<ReturnType<T>>\n cacheData: CacheItem<T>\n isCacheHit: boolean\n}\n\nfunction createQueryWithCache<T extends (...args: any[]) => Promise<any>>(key: string, fn: T, options?: CacheOptions<T>) {\n const {\n retry,\n maxAge,\n version,\n compareBeforeUpdate,\n remoteMemoryCache,\n equals,\n cacheEnabled,\n beforeRequest,\n onSuccess,\n onError,\n errorHandler,\n } = {\n equals: (a, b) =>\n a.length === b.length && a.every((item, index) => item === b[index]),\n retry: 0,\n compareBeforeUpdate: deepEquals,\n remoteMemoryCache: false,\n ...options,\n } satisfies CacheOptions<T>\n\n const cacheUpdateSubject = new ReplaySubject<CacheUpdateEvent<T>>(1)\n\n const getLocalCache = async (args: Parameters<T>) => {\n const cache = await db.getItem<CacheItem<T>>(key)\n if (\n cache\n && (!version || cache.version === version)\n && (!cache.expires || cache.expires > Date.now())\n && equals(cache.args, args)\n ) {\n return cache.result\n }\n\n throw new Error('Cache not found')\n }\n\n const remoteResultCache: {\n success: boolean\n args: Parameters<T>\n result: ReturnType<T> | null\n } = {\n success: false,\n args: [] as any,\n result: null,\n }\n\n const clearMemoryCache = () => {\n remoteResultCache.success = false\n remoteResultCache.result = null\n remoteResultCache.args = [] as any\n }\n\n const queryWithMemoryCache = (args: Parameters<T>) => {\n if (remoteResultCache.success && equals(remoteResultCache.args, args)) {\n return {\n type: 'memory' as const,\n promiseResult: remoteResultCache.result!,\n }\n }\n\n remoteResultCache.args = args\n remoteResultCache.success = true\n const result = (remoteResultCache.result = fnRunner(\n () => fn(...args),\n retry,\n ) as ReturnType<T>)\n\n Promise.resolve(result)\n .then((result) => {\n !remoteMemoryCache && clearMemoryCache()\n return result\n })\n .catch(clearMemoryCache)\n\n return { type: 'remote' as const, promiseResult: result }\n }\n\n const queryRemote = async (args: Parameters<T>) => {\n const rs = {\n type: 'remote' as const,\n result: null as unknown as Awaited<ReturnType<T>>,\n }\n\n try {\n const { type, promiseResult } = queryWithMemoryCache(args)\n const result = (rs.result = await promiseResult)\n\n // 设置缓存\n type === 'remote'\n && (!cacheEnabled || (await cacheEnabled(args)))\n && Promise.resolve().then(async () => {\n const oldCache = await getLocalCache(args).catch(() => null)\n\n const cacheData = {\n args,\n result,\n ...(version && { version }),\n ...(maxAge && { expires: Date.now() + maxAge }),\n }\n db.setItem(key, cacheData)\n\n // 如果配置了比较,且旧缓存存在且与新结果相等,则不触发 onCacheUpdate\n if (\n compareBeforeUpdate\n && oldCache\n && compareBeforeUpdate(oldCache.result, result)\n ) {\n return\n }\n cacheUpdateSubject.next({\n result,\n cacheData,\n isCacheHit: !!oldCache,\n })\n })\n }\n catch (error) {\n if (errorHandler) {\n rs.result = (await errorHandler(error)) as Awaited<ReturnType<T>>\n }\n else {\n throw error\n }\n }\n\n return rs.result\n }\n\n const _fn = async (...args: Parameters<T>) => {\n await beforeRequest?.()\n\n const [cacheResult, remoteResult] = [\n getLocalCache(args),\n queryRemote(args),\n ]\n cacheResult\n .then(result =>\n onSuccess?.({\n type: 'local' as const,\n result: result as Awaited<ReturnType<T>>,\n }),\n )\n .catch(() => {})\n remoteResult\n .then(result =>\n onSuccess?.({\n type: 'remote' as const,\n result: result as Awaited<ReturnType<T>>,\n }),\n )\n .catch(error => onError?.(error))\n .catch(() => {})\n const result = await Promise.race([\n cacheResult.catch(() => remoteResult),\n remoteResult,\n ])\n\n return result\n }\n\n _fn.subscribeCacheUpdate = (fn: (data: CacheUpdateEvent<T>) => void) =>\n cacheUpdateSubject.subscribe(fn)\n\n _fn.clearCache = async () => {\n clearMemoryCache()\n await db.removeItem(key)\n }\n\n return _fn\n}\n\n/**\n * 使用自定义数据库实例\n * @param newDb 数据库实例或 storeName,如果为字符串,则使用 localforage 创建一个实例\n */\ncreateQueryWithCache.useDb = <T extends string>(newDb: DBType | (T extends 'main-store' ? never : T)) => {\n if (typeof newDb === 'string') {\n db = localforage.createInstance({\n name: DB_NAME,\n storeName: newDb,\n })\n }\n else {\n db = newDb\n }\n}\n\nexport { createQueryWithCache }\n","/**\n * @shihengtech/utils - A collection of utility functions\n */\n\n// Type checking utilities\nexport * from './class'\nexport * from './utils'\n// Version\nexport const version = '0.0.3'\n"]}
|
package/package.json
CHANGED
|
@@ -1,36 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shihengtech/utils",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.0.4",
|
|
4
|
+
"description": "A collection of utility tools for frontend projects",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "asakura",
|
|
7
|
+
"email": "csh572078151@gmail.com"
|
|
8
|
+
},
|
|
7
9
|
"license": "MIT",
|
|
8
10
|
"repository": {
|
|
9
11
|
"type": "git",
|
|
10
12
|
"url": ""
|
|
11
13
|
},
|
|
12
14
|
"keywords": [
|
|
13
|
-
"tools",
|
|
14
15
|
"utils",
|
|
15
|
-
"utilities"
|
|
16
|
+
"utilities",
|
|
17
|
+
"tools",
|
|
18
|
+
"shihengtech"
|
|
16
19
|
],
|
|
20
|
+
"sideEffects": false,
|
|
17
21
|
"exports": {
|
|
18
22
|
".": {
|
|
19
|
-
"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"types": "./dist/index.d.cts",
|
|
25
|
-
"default": "./dist/index.cjs"
|
|
26
|
-
}
|
|
27
|
-
}
|
|
23
|
+
"types": "./lib/index.d.ts",
|
|
24
|
+
"import": "./es/index.js",
|
|
25
|
+
"require": "./lib/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./package.json": "./package.json"
|
|
28
28
|
},
|
|
29
|
-
"main": "./
|
|
30
|
-
"module": "./
|
|
31
|
-
"
|
|
29
|
+
"main": "./lib/index.js",
|
|
30
|
+
"module": "./es/index.js",
|
|
31
|
+
"unpkg": "dist/sh-utils.js",
|
|
32
|
+
"types": "./lib/index.d.ts",
|
|
32
33
|
"files": [
|
|
33
|
-
"dist"
|
|
34
|
+
"dist",
|
|
35
|
+
"es",
|
|
36
|
+
"lib"
|
|
34
37
|
],
|
|
35
38
|
"engines": {
|
|
36
39
|
"node": ">=16.0.0"
|
|
@@ -39,22 +42,10 @@
|
|
|
39
42
|
"access": "public",
|
|
40
43
|
"registry": "https://registry.npmjs.org/"
|
|
41
44
|
},
|
|
42
|
-
"scripts": {
|
|
43
|
-
"dev": "tsup --watch",
|
|
44
|
-
"build": "tsup",
|
|
45
|
-
"test": "vitest",
|
|
46
|
-
"test:run": "vitest run",
|
|
47
|
-
"test:coverage": "vitest run --coverage",
|
|
48
|
-
"docs:dev": "vitepress dev docs",
|
|
49
|
-
"docs:build": "vitepress build docs",
|
|
50
|
-
"docs:preview": "vitepress preview docs",
|
|
51
|
-
"lint": "eslint .",
|
|
52
|
-
"lint:fix": "eslint . --fix",
|
|
53
|
-
"prepublishOnly": "npm run build"
|
|
54
|
-
},
|
|
55
45
|
"dependencies": {
|
|
56
46
|
"localforage": "^1.10.0",
|
|
57
|
-
"ramda": "^0.32.0"
|
|
47
|
+
"ramda": "^0.32.0",
|
|
48
|
+
"tslib": "^2.8.1"
|
|
58
49
|
},
|
|
59
50
|
"devDependencies": {
|
|
60
51
|
"@antfu/eslint-config": "^4.13.0",
|
|
@@ -67,5 +58,17 @@
|
|
|
67
58
|
"typescript": "^5.3.2",
|
|
68
59
|
"vitepress": "^1.0.0-rc.31",
|
|
69
60
|
"vitest": "^1.0.0"
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"dev": "tsup --watch",
|
|
64
|
+
"build": "tsup",
|
|
65
|
+
"test": "vitest",
|
|
66
|
+
"test:run": "vitest run",
|
|
67
|
+
"test:coverage": "vitest run --coverage",
|
|
68
|
+
"docs:dev": "vitepress dev docs",
|
|
69
|
+
"docs:build": "vitepress build docs",
|
|
70
|
+
"docs:preview": "vitepress preview docs",
|
|
71
|
+
"lint": "eslint .",
|
|
72
|
+
"lint:fix": "eslint . --fix"
|
|
70
73
|
}
|
|
71
|
-
}
|
|
74
|
+
}
|