@mainframework/api-request-worker 1.0.3 → 1.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 +114 -50
- package/dist/shared/output/react.d.ts +3 -3
- package/dist/shared/output/react.js +132 -67
- package/dist/shared/output/react.js.map +1 -1
- package/dist/shared/output/vanilla.d.ts +1 -1
- package/dist/shared/output/vanilla.js +1 -1
- package/dist/shared/output/vanilla.js.map +1 -1
- package/dist/{types-LYmxol0c.d.ts → types-C6nnvGO7.d.ts} +23 -49
- package/dist/workers/api/api.worker.js +202 -64
- package/dist/workers/api/api.worker.js.map +1 -1
- package/package.json +12 -9
|
@@ -1,26 +1,7 @@
|
|
|
1
|
-
import { useRef, useState,
|
|
1
|
+
import { useRef, useState, useEffect } from 'react';
|
|
2
2
|
import { createApiWorker } from './vanilla.js';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
const uniqueId = () => {
|
|
6
|
-
idCounter += 1;
|
|
7
|
-
return idCounter.toString();
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
const e=e=>"object"==typeof e&&null!==e,t=e=>"function"==typeof e,r=e=>e instanceof Date,n=e=>e instanceof RegExp,o=e=>e instanceof Set,f=e=>e instanceof Map,i=e=>e instanceof String||e instanceof Number||e instanceof Boolean,s=e=>ArrayBuffer.isView(e)&&!(e instanceof DataView),a=e=>Object.getPrototypeOf(e),u=e=>null==e||"object"!=typeof e&&"function"!=typeof e,c=(e,t)=>e.getTime()===t.getTime(),l=(e,t)=>e.source===t.source&&e.flags===t.flags,y=(e,t)=>{if(e.constructor!==t.constructor||e.byteLength!==t.byteLength)return false;const r=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);for(let e=0;e<r.length;e++)if(r[e]!==n[e])return false;return true},p=(e,t,r,n)=>{if(e.size!==t.size)return false;for(const r of e)if(u(r)&&!t.has(r))return false;const o=Array.from(t),f=new Set;for(const t of e){if(u(t))continue;const e=o.findIndex((e,r)=>!f.has(r)&&t===e);if(-1!==e){f.add(e);continue}let i=false;for(let e=0;e<o.length;e++)if(!f.has(e)&&w(t,o[e],r,n)){f.add(e),i=true;break}if(!i)return false}return true},g=(e,t,r,n)=>{if(e.size!==t.size)return false;const o=Array.from(t),f=new Set;for(const[i,s]of e){if(u(i)){const e=t.get(i);if(void 0===e&&!t.has(i))return false;if(!w(s,e,r,n))return false;continue}let e=false;for(let t=0;t<o.length;t++)if(!f.has(t)){const[a,u]=o[t];if(w(i,a,r,n)&&w(s,u,r,n)){f.add(t),e=true;break}}if(!e)return false}return true},b=(e,t,r,n)=>{if(e.length!==t.length)return false;for(let o=0;o<e.length;o++){if(n.strictSparseArrays){const r=Object.prototype.hasOwnProperty.call(e,o),n=Object.prototype.hasOwnProperty.call(t,o);if(r!==n)return false;if(!r&&!n)continue}if(!w(e[o],t[o],r,n))return false}return true},h=(e,t,r,n)=>{const o=Reflect.ownKeys(e),f=Reflect.ownKeys(t);if(o.length!==f.length)return false;for(const f of o){if(!Object.prototype.hasOwnProperty.call(t,f))return false;if(!w(e[f],t[f],r,n))return false}return true},w=(w,A,m=new WeakMap,O={})=>{if(w===A)return true;if("number"==typeof w&&"number"==typeof A&&Number.isNaN(w)&&Number.isNaN(A))return true;if(O.normalizeBoxedPrimitives&&(i(w)&&(w=w.valueOf()),i(A)&&(A=A.valueOf()),u(w)&&u(A)))return w===A;if(u(w)||u(A))return false;if(t(w)||t(A))return w===A;if(!e(w)||!e(A))return false;let d=m.get(w)??(()=>{const e=new WeakMap;return m.set(w,e),e})();const N=d.get(A);if(void 0!==N)return N;d.set(A,true);const j=a(w),P=a(A);let k;return k=Array.isArray(w)&&Array.isArray(A)?b(w,A,m,O):!Array.isArray(w)&&!Array.isArray(A)&&(r(w)&&r(A)?c(w,A):n(w)&&n(A)?l(w,A):s(w)&&s(A)?y(w,A):o(w)&&o(A)?p(w,A,m,O):f(w)&&f(A)?g(w,A,m,O):!(!O.allowPrototypeMismatch&&j!==P)&&h(w,A,m,O)),d.set(A,k),k},A=(e,t,r)=>w(e,t,new WeakMap,r);
|
|
11
|
-
|
|
12
|
-
const useCustomCallback = (callback, dependencies) => {
|
|
13
|
-
const refCallback = useRef(callback);
|
|
14
|
-
const refDependencies = useRef(dependencies);
|
|
15
|
-
if (!dependencies.every((dep, index) => A(dep, refDependencies.current[index]))) {
|
|
16
|
-
refDependencies.current = dependencies;
|
|
17
|
-
refCallback.current = callback;
|
|
18
|
-
}
|
|
19
|
-
const stableCallback = useRef(
|
|
20
|
-
(...args) => refCallback.current(...args)
|
|
21
|
-
).current;
|
|
22
|
-
return stableCallback;
|
|
23
|
-
};
|
|
4
|
+
const uniqueId = () => typeof crypto !== "undefined" && typeof crypto.randomUUID === "function" ? crypto.randomUUID() : Math.random().toString(36).slice(2) + Date.now().toString(36);
|
|
24
5
|
|
|
25
6
|
const DEFAULT_CHUNK_BATCH = 5;
|
|
26
7
|
const toNumber = (val, fallback) => typeof val === "number" && Number.isFinite(val) ? val : fallback;
|
|
@@ -31,7 +12,10 @@ let cleanupTimer = null;
|
|
|
31
12
|
const STALE_ENTRY_MS = 5e3;
|
|
32
13
|
const CLEANUP_INTERVAL_MS = 3e4;
|
|
33
14
|
const normalizeKey = (key) => key.toLocaleLowerCase();
|
|
34
|
-
const cleanupState = {
|
|
15
|
+
const cleanupState = {
|
|
16
|
+
isDeleting: false,
|
|
17
|
+
lastRun: 0
|
|
18
|
+
};
|
|
35
19
|
const runStaleEntryCleanup = () => {
|
|
36
20
|
const now = Date.now();
|
|
37
21
|
if (cleanupState.isDeleting || now < cleanupState.lastRun + CLEANUP_INTERVAL_MS) return;
|
|
@@ -43,15 +27,21 @@ const runStaleEntryCleanup = () => {
|
|
|
43
27
|
const key = keys[i];
|
|
44
28
|
const entry = responseQueue[key];
|
|
45
29
|
const streamInProgress = streamThrottleState[key] != null || streamAccumulators[key] != null;
|
|
46
|
-
if (entry && !streamInProgress && entry.
|
|
47
|
-
entry.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
entry.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
30
|
+
if (entry && !streamInProgress && entry.lastActivityAt != null && now - entry.lastActivityAt >= STALE_ENTRY_MS) {
|
|
31
|
+
if (entry.setUpdateTriggers.size === 0) {
|
|
32
|
+
delete responseQueue[key];
|
|
33
|
+
delete streamThrottleState[key];
|
|
34
|
+
delete streamAccumulators[key];
|
|
35
|
+
} else if (entry.data != null) {
|
|
36
|
+
entry.loading = null;
|
|
37
|
+
entry.data = null;
|
|
38
|
+
entry.meta = null;
|
|
39
|
+
entry.error = null;
|
|
40
|
+
entry.errorCode = null;
|
|
41
|
+
entry.requestId = null;
|
|
42
|
+
delete entry.streamChunks;
|
|
43
|
+
delete streamThrottleState[key];
|
|
44
|
+
}
|
|
55
45
|
}
|
|
56
46
|
i++;
|
|
57
47
|
}
|
|
@@ -69,12 +59,12 @@ const flushStreamBatch = (key, entry) => {
|
|
|
69
59
|
if (!state || state.pendingChunks.length === 0) return;
|
|
70
60
|
entry.streamChunks = state.pendingChunks.slice();
|
|
71
61
|
state.pendingChunks.length = 0;
|
|
72
|
-
entry.
|
|
62
|
+
entry.setUpdateTriggers.forEach((fn) => fn(updater));
|
|
73
63
|
};
|
|
74
64
|
const findEntry = (cacheName, hookId) => cacheName ? responseQueue[normalizeKey(cacheName)] : hookId ? Object.values(responseQueue).find((e) => e.hookId === hookId) ?? null : null;
|
|
75
65
|
const finalizeEntry = (entry) => {
|
|
76
66
|
entry.requestId = null;
|
|
77
|
-
entry.
|
|
67
|
+
entry.setUpdateTriggers.forEach((fn) => fn(updater));
|
|
78
68
|
};
|
|
79
69
|
const getApiWorker = () => {
|
|
80
70
|
if (apiWorker) return apiWorker;
|
|
@@ -97,20 +87,31 @@ const ensureWorkerInitialized = () => {
|
|
|
97
87
|
if ("stream" in msg && msg.stream) {
|
|
98
88
|
const entry2 = findEntry(cacheName, hookId);
|
|
99
89
|
if (!entry2) return;
|
|
90
|
+
if (msg.requestId != null && msg.requestId !== "" && entry2.requestId !== msg.requestId) return;
|
|
100
91
|
const batchSize = toNumber(entry2.streamChunkBatchSize, DEFAULT_CHUNK_BATCH);
|
|
101
92
|
switch (msg.stream) {
|
|
102
93
|
case "start": {
|
|
103
|
-
streamAccumulators[key] = {
|
|
104
|
-
|
|
94
|
+
streamAccumulators[key] = {
|
|
95
|
+
chunks: [],
|
|
96
|
+
meta: msg.meta ?? null
|
|
97
|
+
};
|
|
98
|
+
streamThrottleState[key] = {
|
|
99
|
+
pendingChunks: []
|
|
100
|
+
};
|
|
105
101
|
entry2.streamChunks = [];
|
|
106
102
|
entry2.meta = msg.meta ?? null;
|
|
107
|
-
entry2.
|
|
103
|
+
entry2.setUpdateTriggers.forEach((fn) => fn(updater));
|
|
108
104
|
return;
|
|
109
105
|
}
|
|
110
106
|
case "resume":
|
|
111
|
-
if (!streamAccumulators[key]) streamAccumulators[key] = {
|
|
107
|
+
if (!streamAccumulators[key]) streamAccumulators[key] = {
|
|
108
|
+
chunks: [],
|
|
109
|
+
meta: msg.meta ?? null
|
|
110
|
+
};
|
|
112
111
|
else if (msg.meta) streamAccumulators[key].meta = msg.meta;
|
|
113
|
-
if (!streamThrottleState[key]) streamThrottleState[key] = {
|
|
112
|
+
if (!streamThrottleState[key]) streamThrottleState[key] = {
|
|
113
|
+
pendingChunks: []
|
|
114
|
+
};
|
|
114
115
|
if (msg.meta) entry2.meta = msg.meta ?? null;
|
|
115
116
|
return;
|
|
116
117
|
case "chunk": {
|
|
@@ -134,10 +135,14 @@ const ensureWorkerInitialized = () => {
|
|
|
134
135
|
const errMsg = error?.message ?? "";
|
|
135
136
|
if (errMsg !== "") {
|
|
136
137
|
entry2.error = errMsg;
|
|
138
|
+
entry2.errorCode = error?.code ?? null;
|
|
137
139
|
} else if (acc) {
|
|
138
|
-
entry2.data = new Blob(acc.chunks, acc.meta?.contentType ? {
|
|
140
|
+
entry2.data = new Blob(acc.chunks, acc.meta?.contentType ? {
|
|
141
|
+
type: acc.meta.contentType
|
|
142
|
+
} : void 0);
|
|
139
143
|
entry2.meta = acc.meta ?? null;
|
|
140
144
|
entry2.error = null;
|
|
145
|
+
entry2.errorCode = null;
|
|
141
146
|
entry2.lastActivityAt = Date.now();
|
|
142
147
|
}
|
|
143
148
|
entry2.loading = false;
|
|
@@ -148,15 +153,27 @@ const ensureWorkerInitialized = () => {
|
|
|
148
153
|
}
|
|
149
154
|
const entry = findEntry(cacheName, hookId);
|
|
150
155
|
if (!entry) return;
|
|
156
|
+
if (msg.requestId != null && msg.requestId !== "" && entry.requestId !== msg.requestId) return;
|
|
157
|
+
if (msg.type === "delete") {
|
|
158
|
+
entry.data = null;
|
|
159
|
+
entry.meta = null;
|
|
160
|
+
entry.error = null;
|
|
161
|
+
entry.errorCode = null;
|
|
162
|
+
entry.loading = false;
|
|
163
|
+
finalizeEntry(entry);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
151
166
|
const message = error?.message ?? "";
|
|
152
167
|
if (message !== "") {
|
|
153
168
|
entry.error = message;
|
|
169
|
+
entry.errorCode = error?.code ?? null;
|
|
154
170
|
entry.loading = false;
|
|
155
171
|
} else {
|
|
156
172
|
entry.data = msg.data ?? null;
|
|
157
173
|
entry.meta = msg.meta ?? null;
|
|
158
174
|
entry.lastActivityAt = Date.now();
|
|
159
175
|
entry.error = null;
|
|
176
|
+
entry.errorCode = null;
|
|
160
177
|
entry.loading = false;
|
|
161
178
|
}
|
|
162
179
|
finalizeEntry(entry);
|
|
@@ -164,7 +181,14 @@ const ensureWorkerInitialized = () => {
|
|
|
164
181
|
return worker;
|
|
165
182
|
};
|
|
166
183
|
const useApiWorker = (config) => {
|
|
167
|
-
|
|
184
|
+
if (!window) return null;
|
|
185
|
+
const {
|
|
186
|
+
cacheName,
|
|
187
|
+
request: requestConfig,
|
|
188
|
+
data: configData,
|
|
189
|
+
runMode = "auto",
|
|
190
|
+
enabled = true
|
|
191
|
+
} = config;
|
|
168
192
|
const worker = ensureWorkerInitialized();
|
|
169
193
|
const hookIdRef = useRef("");
|
|
170
194
|
const queueKey = normalizeKey(cacheName);
|
|
@@ -172,61 +196,101 @@ const useApiWorker = (config) => {
|
|
|
172
196
|
const [, setUpdateTrigger] = useState(0);
|
|
173
197
|
let storeEntry = responseQueue[queueKey];
|
|
174
198
|
if (!storeEntry) {
|
|
175
|
-
const
|
|
199
|
+
const hookId = uniqueId();
|
|
176
200
|
storeEntry = responseQueue[queueKey] = {
|
|
177
|
-
hookId
|
|
201
|
+
hookId,
|
|
178
202
|
cacheName,
|
|
179
203
|
data: null,
|
|
180
204
|
loading: false,
|
|
181
205
|
error: null,
|
|
182
|
-
|
|
183
|
-
|
|
206
|
+
errorCode: null,
|
|
207
|
+
setUpdateTriggers: /* @__PURE__ */ new Set(),
|
|
184
208
|
requestId: null,
|
|
185
209
|
meta: null,
|
|
186
210
|
lastActivityAt: null
|
|
187
211
|
};
|
|
188
|
-
hookIdRef.current =
|
|
212
|
+
hookIdRef.current = hookId;
|
|
189
213
|
} else {
|
|
190
214
|
hookIdRef.current = storeEntry.hookId;
|
|
191
215
|
storeEntry.lastActivityAt = Date.now();
|
|
192
216
|
}
|
|
193
217
|
const entry = storeEntry;
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
218
|
+
const hookId_0 = hookIdRef.current;
|
|
219
|
+
useEffect(() => {
|
|
220
|
+
responseQueue[queueKey]?.setUpdateTriggers.add(setUpdateTrigger);
|
|
221
|
+
return () => {
|
|
222
|
+
const storeEntry_0 = responseQueue[queueKey];
|
|
223
|
+
if (!storeEntry_0) return;
|
|
224
|
+
storeEntry_0.setUpdateTriggers.delete(setUpdateTrigger);
|
|
225
|
+
if (storeEntry_0.setUpdateTriggers.size === 0) {
|
|
226
|
+
const requestId = storeEntry_0.requestId;
|
|
227
|
+
if (requestId) {
|
|
228
|
+
worker.postMessage({
|
|
229
|
+
dataRequest: {
|
|
230
|
+
type: "cancel",
|
|
231
|
+
cacheName,
|
|
232
|
+
requestId
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
}, [queueKey, cacheName, worker]);
|
|
239
|
+
const deleteCache = () => {
|
|
197
240
|
if (cacheName) {
|
|
198
241
|
worker.postMessage({
|
|
199
|
-
dataRequest: {
|
|
242
|
+
dataRequest: {
|
|
243
|
+
type: "delete",
|
|
244
|
+
cacheName,
|
|
245
|
+
hookId: hookIdRef.current
|
|
246
|
+
}
|
|
200
247
|
});
|
|
201
248
|
}
|
|
202
|
-
}
|
|
203
|
-
const doRequest =
|
|
204
|
-
const
|
|
205
|
-
if (!
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
249
|
+
};
|
|
250
|
+
const doRequest = () => {
|
|
251
|
+
const entry_0 = responseQueue[queueKey];
|
|
252
|
+
if (!entry_0 || entry_0.loading) return;
|
|
253
|
+
entry_0.loading = true;
|
|
254
|
+
entry_0.error = null;
|
|
255
|
+
entry_0.errorCode = null;
|
|
256
|
+
entry_0.lastActivityAt = Date.now();
|
|
257
|
+
entry_0.setUpdateTriggers.forEach((fn) => fn(updater));
|
|
210
258
|
if (requestConfig) {
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
const isStream = requestConfig.responseType?.
|
|
259
|
+
const requestId_0 = uniqueId();
|
|
260
|
+
entry_0.requestId = requestId_0;
|
|
261
|
+
const isStream = requestConfig.responseType?.toLocaleLowerCase() === "stream";
|
|
214
262
|
if (isStream) {
|
|
215
|
-
|
|
263
|
+
entry_0.streamChunkBatchSize = toNumber(requestConfig.streamChunkBatchSize, DEFAULT_CHUNK_BATCH);
|
|
216
264
|
}
|
|
217
|
-
const request = isStream && requestConfig.retries === void 0 ? {
|
|
265
|
+
const request = isStream && requestConfig.retries === void 0 ? {
|
|
266
|
+
...requestConfig,
|
|
267
|
+
retries: 3
|
|
268
|
+
} : requestConfig;
|
|
218
269
|
worker.postMessage({
|
|
219
|
-
dataRequest: {
|
|
270
|
+
dataRequest: {
|
|
271
|
+
type: "set",
|
|
272
|
+
cacheName,
|
|
273
|
+
hookId: hookId_0,
|
|
274
|
+
requestId: requestId_0,
|
|
275
|
+
payload: configData,
|
|
276
|
+
request
|
|
277
|
+
}
|
|
220
278
|
});
|
|
221
279
|
} else {
|
|
222
|
-
worker.postMessage({
|
|
280
|
+
worker.postMessage({
|
|
281
|
+
dataRequest: {
|
|
282
|
+
type: "get",
|
|
283
|
+
cacheName,
|
|
284
|
+
hookId: hookId_0
|
|
285
|
+
}
|
|
286
|
+
});
|
|
223
287
|
}
|
|
224
288
|
hasExecutedRef.current = true;
|
|
225
|
-
}
|
|
226
|
-
const makeRequest =
|
|
289
|
+
};
|
|
290
|
+
const makeRequest = () => {
|
|
227
291
|
if (!enabled || runMode === "once" && hasExecutedRef.current) return;
|
|
228
292
|
doRequest();
|
|
229
|
-
}
|
|
293
|
+
};
|
|
230
294
|
const hasAlreadyRunOnce = runMode === "once" && hasExecutedRef.current;
|
|
231
295
|
const shouldRun = (runMode === "auto" || runMode === "once") && enabled && (requestConfig || cacheName);
|
|
232
296
|
if (shouldRun && !hasAlreadyRunOnce && !entry.loading) {
|
|
@@ -237,6 +301,7 @@ const useApiWorker = (config) => {
|
|
|
237
301
|
meta: entry.meta ?? null,
|
|
238
302
|
loading: entry.loading ?? false,
|
|
239
303
|
error: entry.error ?? null,
|
|
304
|
+
errorCode: entry.errorCode ?? null,
|
|
240
305
|
refetch: makeRequest,
|
|
241
306
|
deleteCache,
|
|
242
307
|
streamChunks: toStreamChunks(entry.streamChunks)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sources":["../../../src/shared/utils/uniqueId.ts","../../../node_modules/@mainframework/is-deep-equal/dist/index.mjs","../../../src/shared/hooks/useCustomCallback.ts","../../../src/shared/hooks/useApiWorker.ts"],"sourcesContent":["// utils/uniqueId.ts\r\nlet idCounter = 0;\r\n\r\n/**\r\n * Generates a stable, unique string ID.\r\n * SSR-safe and works in any environment.\r\n */\r\nexport const uniqueId = (): string => {\r\n idCounter += 1;\r\n return idCounter.toString();\r\n};\r\n","const e=e=>\"object\"==typeof e&&null!==e,t=e=>\"function\"==typeof e,r=e=>e instanceof Date,n=e=>e instanceof RegExp,o=e=>e instanceof Set,f=e=>e instanceof Map,i=e=>e instanceof String||e instanceof Number||e instanceof Boolean,s=e=>ArrayBuffer.isView(e)&&!(e instanceof DataView),a=e=>Object.getPrototypeOf(e),u=e=>null==e||\"object\"!=typeof e&&\"function\"!=typeof e,c=(e,t)=>e.getTime()===t.getTime(),l=(e,t)=>e.source===t.source&&e.flags===t.flags,y=(e,t)=>{if(e.constructor!==t.constructor||e.byteLength!==t.byteLength)return!1;const r=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);for(let e=0;e<r.length;e++)if(r[e]!==n[e])return!1;return!0},p=(e,t,r,n)=>{if(e.size!==t.size)return!1;for(const r of e)if(u(r)&&!t.has(r))return!1;const o=Array.from(t),f=new Set;for(const t of e){if(u(t))continue;const e=o.findIndex((e,r)=>!f.has(r)&&t===e);if(-1!==e){f.add(e);continue}let i=!1;for(let e=0;e<o.length;e++)if(!f.has(e)&&w(t,o[e],r,n)){f.add(e),i=!0;break}if(!i)return!1}return!0},g=(e,t,r,n)=>{if(e.size!==t.size)return!1;const o=Array.from(t),f=new Set;for(const[i,s]of e){if(u(i)){const e=t.get(i);if(void 0===e&&!t.has(i))return!1;if(!w(s,e,r,n))return!1;continue}let e=!1;for(let t=0;t<o.length;t++)if(!f.has(t)){const[a,u]=o[t];if(w(i,a,r,n)&&w(s,u,r,n)){f.add(t),e=!0;break}}if(!e)return!1}return!0},b=(e,t,r,n)=>{if(e.length!==t.length)return!1;for(let o=0;o<e.length;o++){if(n.strictSparseArrays){const r=Object.prototype.hasOwnProperty.call(e,o),n=Object.prototype.hasOwnProperty.call(t,o);if(r!==n)return!1;if(!r&&!n)continue}if(!w(e[o],t[o],r,n))return!1}return!0},h=(e,t,r,n)=>{const o=Reflect.ownKeys(e),f=Reflect.ownKeys(t);if(o.length!==f.length)return!1;for(const f of o){if(!Object.prototype.hasOwnProperty.call(t,f))return!1;if(!w(e[f],t[f],r,n))return!1}return!0},w=(w,A,m=new WeakMap,O={})=>{if(w===A)return!0;if(\"number\"==typeof w&&\"number\"==typeof A&&Number.isNaN(w)&&Number.isNaN(A))return!0;if(O.normalizeBoxedPrimitives&&(i(w)&&(w=w.valueOf()),i(A)&&(A=A.valueOf()),u(w)&&u(A)))return w===A;if(u(w)||u(A))return!1;if(t(w)||t(A))return w===A;if(!e(w)||!e(A))return!1;let d=m.get(w)??(()=>{const e=new WeakMap;return m.set(w,e),e})();const N=d.get(A);if(void 0!==N)return N;d.set(A,!0);const j=a(w),P=a(A);let k;return k=Array.isArray(w)&&Array.isArray(A)?b(w,A,m,O):!Array.isArray(w)&&!Array.isArray(A)&&(r(w)&&r(A)?c(w,A):n(w)&&n(A)?l(w,A):s(w)&&s(A)?y(w,A):o(w)&&o(A)?p(w,A,m,O):f(w)&&f(A)?g(w,A,m,O):!(!O.allowPrototypeMismatch&&j!==P)&&h(w,A,m,O)),d.set(A,k),k},A=(e,t,r)=>w(e,t,new WeakMap,r),m=(e,t,r,n)=>w(e,t,r,n);export{b as compareArray,c as compareDate,g as compareMap,h as compareObject,l as compareRegExp,p as compareSet,y as compareTypedArray,a as getPrototypeOf,i as isBoxedPrimitive,r as isDate,A as isEqual,m as isEqualWithSharedMemo,t as isFunction,f as isMap,e as isObject,u as isPrimitive,n as isRegExp,o as isSet,s as isTypedArray};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\r\nimport { useRef } from \"react\";\r\nimport { isEqual } from \"@mainframework/is-deep-equal\";\r\n\r\nexport const useCustomCallback = <T extends (...args: unknown[]) => unknown>(\r\n callback: T,\r\n dependencies: unknown[],\r\n): T => {\r\n const refCallback = useRef<T>(callback);\r\n const refDependencies = useRef<unknown[]>(dependencies);\r\n\r\n // Update refs synchronously during render\r\n if (!dependencies.every((dep, index) => isEqual(dep, refDependencies.current[index]))) {\r\n refDependencies.current = dependencies;\r\n refCallback.current = callback;\r\n }\r\n\r\n // Stable callback, always calls latest callback\r\n const stableCallback = useRef(\r\n (...args: Parameters<T>): ReturnType<T> => refCallback.current(...args) as ReturnType<T>,\r\n ).current;\r\n\r\n return stableCallback as T;\r\n};\r\n","// useApiWorker.ts\r\nimport { useRef, useState, useCallback } from \"react\";\r\nimport { createApiWorker } from \"../utils/createApiWorker\";\r\nimport { uniqueId } from \"../utils/uniqueId\";\r\nimport type {\r\n BinaryResponseMeta,\r\n DataRequest,\r\n QueueEntry,\r\n UseApiWorkerConfig,\r\n UseApiWorkerReturn,\r\n WorkerMessagePayload,\r\n} from \"../types/types\";\r\n\r\ntype StreamAccumulator = { chunks: ArrayBuffer[]; meta: BinaryResponseMeta | null };\r\n\r\ntype StreamThrottleState = {\r\n pendingChunks: ArrayBuffer[];\r\n};\r\n\r\nconst DEFAULT_CHUNK_BATCH = 5;\r\n\r\nconst toNumber = (val: unknown, fallback: number): number =>\r\n typeof val === \"number\" && Number.isFinite(val) ? val : fallback;\r\n\r\nconst toStreamChunks = (val: unknown): ArrayBuffer[] | undefined =>\r\n val === undefined || val === null ? undefined : Array.isArray(val) ? (val as ArrayBuffer[]) : undefined;\r\n\r\nimport { useCustomCallback } from \"./useCustomCallback\";\r\n\r\n// ============================================================================\r\n// MODULE-LEVEL WORKER & QUEUE\r\n// ============================================================================\r\n\r\nlet apiWorker: Worker | null = null;\r\nlet workerInitialized = false;\r\nlet cleanupTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\nconst STALE_ENTRY_MS = 5000;\r\nconst CLEANUP_INTERVAL_MS = 30000;\r\n\r\nconst normalizeKey = (key: string) => key.toLocaleLowerCase();\r\n\r\nconst cleanupState = { isDeleting: false, lastRun: 0 };\r\n\r\nconst runStaleEntryCleanup = (): void => {\r\n const now = Date.now();\r\n if (cleanupState.isDeleting || now < cleanupState.lastRun + CLEANUP_INTERVAL_MS) return;\r\n\r\n cleanupState.isDeleting = true;\r\n\r\n try {\r\n const keys = Object.keys(responseQueue);\r\n let i = 0;\r\n while (i < keys.length) {\r\n const key = keys[i] as string;\r\n const entry = responseQueue[key];\r\n const streamInProgress = streamThrottleState[key] != null || streamAccumulators[key] != null;\r\n if (\r\n entry &&\r\n !streamInProgress &&\r\n entry.data != null &&\r\n entry.lastActivityAt != null &&\r\n now - entry.lastActivityAt >= STALE_ENTRY_MS\r\n ) {\r\n entry.loading = null;\r\n entry.data = null;\r\n entry.meta = null;\r\n entry.error = null;\r\n entry.setUpdateTrigger = null;\r\n entry.requestId = null;\r\n delete entry.streamChunks;\r\n delete streamThrottleState[key];\r\n }\r\n i++;\r\n }\r\n } finally {\r\n cleanupState.isDeleting = false;\r\n cleanupState.lastRun = now;\r\n }\r\n};\r\n\r\nconst responseQueue: Record<string, QueueEntry<unknown>> = {};\r\n\r\nconst streamAccumulators: Record<string, StreamAccumulator> = {};\r\nconst streamThrottleState: Record<string, StreamThrottleState> = {};\r\n\r\nconst updater = (n: number) => n + 1;\r\n\r\nconst flushStreamBatch = (key: string, entry: QueueEntry<unknown>): void => {\r\n const state = streamThrottleState[key];\r\n if (!state || state.pendingChunks.length === 0) return;\r\n entry.streamChunks = state.pendingChunks.slice();\r\n state.pendingChunks.length = 0;\r\n entry.setUpdateTrigger?.(updater);\r\n};\r\n\r\nconst findEntry = (cacheName: string | undefined, hookId: string | undefined) =>\r\n cacheName\r\n ? responseQueue[normalizeKey(cacheName)]\r\n : hookId\r\n ? (Object.values(responseQueue).find((e) => e.hookId === hookId) ?? null)\r\n : null;\r\n\r\nconst finalizeEntry = (entry: QueueEntry<unknown>): void => {\r\n entry.requestId = null;\r\n entry.setUpdateTrigger?.(updater);\r\n};\r\n\r\nconst getApiWorker = (): Worker => {\r\n if (apiWorker) return apiWorker;\r\n apiWorker = createApiWorker();\r\n return apiWorker;\r\n};\r\n\r\nconst ensureWorkerInitialized = (): Worker => {\r\n const worker = getApiWorker();\r\n if (workerInitialized) return worker;\r\n workerInitialized = true;\r\n\r\n if (!cleanupTimer) {\r\n cleanupTimer = setInterval(() => runStaleEntryCleanup(), CLEANUP_INTERVAL_MS);\r\n }\r\n\r\n // Worker always sends error ({ message: string }). Entry is found by cacheName or hookId.\r\n // Stream responses: start → chunk(s) → end; we accumulate chunks then set data = new Blob(chunks) on end.\r\n worker.onmessage = (event: MessageEvent<WorkerMessagePayload>) => {\r\n const msg = event.data;\r\n const cacheName = msg.cacheName;\r\n const hookId = msg.hookId;\r\n const error = msg.error;\r\n const key = cacheName ? normalizeKey(cacheName) : \"\";\r\n\r\n if (\"stream\" in msg && msg.stream) {\r\n const entry = findEntry(cacheName, hookId);\r\n if (!entry) return;\r\n const batchSize = toNumber(entry.streamChunkBatchSize, DEFAULT_CHUNK_BATCH);\r\n switch (msg.stream) {\r\n case \"start\": {\r\n streamAccumulators[key] = { chunks: [], meta: msg.meta ?? null };\r\n streamThrottleState[key] = { pendingChunks: [] };\r\n entry.streamChunks = [];\r\n entry.meta = msg.meta ?? null;\r\n entry.setUpdateTrigger?.(updater);\r\n return;\r\n }\r\n case \"resume\":\r\n if (!streamAccumulators[key]) streamAccumulators[key] = { chunks: [], meta: msg.meta ?? null };\r\n else if (msg.meta) streamAccumulators[key].meta = msg.meta;\r\n if (!streamThrottleState[key]) streamThrottleState[key] = { pendingChunks: [] };\r\n if (msg.meta) entry.meta = msg.meta ?? null;\r\n return;\r\n case \"chunk\": {\r\n const acc = streamAccumulators[key];\r\n const throttle = streamThrottleState[key];\r\n if (acc && msg.data) acc.chunks.push(msg.data);\r\n if (throttle && msg.data) {\r\n throttle.pendingChunks.push(msg.data);\r\n if (throttle.pendingChunks.length >= batchSize) {\r\n flushStreamBatch(key, entry);\r\n }\r\n }\r\n return;\r\n }\r\n case \"end\": {\r\n const acc = streamAccumulators[key];\r\n const throttle = streamThrottleState[key];\r\n if (throttle?.pendingChunks.length) flushStreamBatch(key, entry);\r\n delete streamThrottleState[key];\r\n delete streamAccumulators[key];\r\n const errMsg = error?.message ?? \"\";\r\n if (errMsg !== \"\") {\r\n entry.error = errMsg;\r\n } else if (acc) {\r\n entry.data = new Blob(acc.chunks, acc.meta?.contentType ? { type: acc.meta.contentType } : undefined);\r\n entry.meta = acc.meta ?? null;\r\n entry.error = null;\r\n entry.lastActivityAt = Date.now();\r\n }\r\n entry.loading = false;\r\n finalizeEntry(entry);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n const entry = findEntry(cacheName, hookId);\r\n if (!entry) return;\r\n\r\n const message = error?.message ?? \"\";\r\n if (message !== \"\") {\r\n entry.error = message;\r\n entry.loading = false;\r\n } else {\r\n entry.data = msg.data ?? null;\r\n entry.meta = msg.meta ?? null;\r\n entry.lastActivityAt = Date.now();\r\n entry.error = null;\r\n entry.loading = false;\r\n }\r\n finalizeEntry(entry);\r\n };\r\n\r\n return worker;\r\n};\r\n\r\n// ============================================================================\r\n// HOOK\r\n// ============================================================================\r\n\r\nexport type { RequestConfig, UseApiWorkerConfig, UseApiWorkerReturn } from \"../types/types\";\r\n\r\nexport const useApiWorker = <T>(config: UseApiWorkerConfig): UseApiWorkerReturn<T> => {\r\n const { cacheName, request: requestConfig, data: configData, runMode = \"auto\", enabled = true } = config;\r\n\r\n const worker = ensureWorkerInitialized();\r\n\r\n const hookIdRef = useRef<string>(\"\");\r\n const queueKey = normalizeKey(cacheName);\r\n\r\n const hasExecutedRef = useRef(false);\r\n const [, setUpdateTrigger] = useState(0);\r\n\r\n let storeEntry = responseQueue[queueKey];\r\n\r\n if (!storeEntry) {\r\n const hookId = uniqueId();\r\n storeEntry = responseQueue[queueKey] = {\r\n hookId,\r\n cacheName,\r\n data: null,\r\n loading: false,\r\n error: null,\r\n setUpdateTrigger: () => {},\r\n requestId: null,\r\n meta: null,\r\n lastActivityAt: null,\r\n };\r\n hookIdRef.current = hookId;\r\n } else {\r\n hookIdRef.current = storeEntry.hookId;\r\n storeEntry.lastActivityAt = Date.now();\r\n }\r\n const entry = storeEntry;\r\n entry.setUpdateTrigger = setUpdateTrigger;\r\n\r\n const hookId = hookIdRef.current;\r\n\r\n const deleteCache = useCallback(() => {\r\n if (cacheName) {\r\n worker.postMessage({\r\n dataRequest: { type: \"delete\", cacheName, hookId: hookIdRef.current },\r\n });\r\n }\r\n }, [cacheName, worker]);\r\n\r\n const doRequest = useCallback(() => {\r\n const entry = responseQueue[queueKey];\r\n if (!entry || entry.loading) return;\r\n entry.loading = true;\r\n entry.error = null;\r\n entry.lastActivityAt = Date.now();\r\n entry.setUpdateTrigger?.(updater);\r\n if (requestConfig) {\r\n const requestId = uniqueId();\r\n entry.requestId = requestId;\r\n const isStream = requestConfig.responseType?.toLowerCase() === \"stream\";\r\n if (isStream) {\r\n entry.streamChunkBatchSize = toNumber(requestConfig.streamChunkBatchSize, DEFAULT_CHUNK_BATCH);\r\n }\r\n const request =\r\n isStream && requestConfig.retries === undefined ? { ...requestConfig, retries: 3 } : requestConfig;\r\n worker.postMessage({\r\n dataRequest: { type: \"set\", cacheName, hookId, requestId, payload: configData, request },\r\n });\r\n } else {\r\n worker.postMessage({ dataRequest: { type: \"get\", cacheName, hookId } as DataRequest<unknown> });\r\n }\r\n hasExecutedRef.current = true;\r\n }, [queueKey, cacheName, hookId, requestConfig, configData, worker]);\r\n\r\n const makeRequest = useCustomCallback(() => {\r\n if (!enabled || (runMode === \"once\" && hasExecutedRef.current)) return;\r\n doRequest();\r\n }, [enabled, runMode, doRequest]);\r\n\r\n const hasAlreadyRunOnce = runMode === \"once\" && hasExecutedRef.current;\r\n const shouldRun = (runMode === \"auto\" || runMode === \"once\") && enabled && (requestConfig || cacheName);\r\n if (shouldRun && !hasAlreadyRunOnce && !entry.loading) {\r\n doRequest();\r\n }\r\n return {\r\n data: (entry.data as T) ?? null,\r\n meta: entry.meta ?? null,\r\n loading: entry.loading ?? false,\r\n error: entry.error ?? null,\r\n refetch: makeRequest,\r\n deleteCache,\r\n streamChunks: toStreamChunks(entry.streamChunks),\r\n };\r\n};\r\n"],"names":["isEqual","entry","hookId"],"mappings":"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","x_google_ignoreList":[1]}
|
|
1
|
+
{"version":3,"file":"react.js","sources":["../../../src/shared/utils/uniqueId.ts","../../../src/shared/hooks/useApiWorker.ts"],"sourcesContent":["// utils/uniqueId.ts\r\n\r\n/**\r\n * Generates a stable, unique string ID.\r\n * Uses crypto.randomUUID() when available (all modern browsers and Node 15+).\r\n * Falls back to a Math.random + timestamp combination for environments without crypto.\r\n */\r\nexport const uniqueId = (): string =>\r\n typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\"\r\n ? crypto.randomUUID()\r\n : Math.random().toString(36).slice(2) + Date.now().toString(36);\r\n","// useApiWorker.ts\r\nimport { useRef, useState, useEffect } from \"react\";\r\nimport { createApiWorker } from \"../utils/createApiWorker\";\r\nimport { uniqueId } from \"../utils/uniqueId\";\r\nimport type {\r\n BinaryResponseMeta,\r\n DataRequest,\r\n QueueEntry,\r\n UseApiWorkerConfig,\r\n UseApiWorkerReturn,\r\n WorkerMessagePayload,\r\n} from \"../types/types\";\r\n\r\ntype StreamAccumulator = { chunks: ArrayBuffer[]; meta: BinaryResponseMeta | null };\r\n\r\ntype StreamThrottleState = {\r\n pendingChunks: ArrayBuffer[];\r\n};\r\n\r\nconst DEFAULT_CHUNK_BATCH = 5;\r\n\r\nconst toNumber = (val: unknown, fallback: number): number =>\r\n typeof val === \"number\" && Number.isFinite(val) ? val : fallback;\r\n\r\nconst toStreamChunks = (val: unknown): ArrayBuffer[] | undefined =>\r\n val === undefined || val === null ? undefined : Array.isArray(val) ? (val as ArrayBuffer[]) : undefined;\r\n\r\n// ============================================================================\r\n// MODULE-LEVEL WORKER & QUEUE\r\n// ============================================================================\r\n\r\nlet apiWorker: Worker | null = null;\r\nlet workerInitialized = false;\r\nlet cleanupTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\nconst STALE_ENTRY_MS = 5000;\r\nconst CLEANUP_INTERVAL_MS = 30000;\r\n\r\nconst normalizeKey = (key: string) => key.toLocaleLowerCase();\r\n\r\nconst cleanupState = { isDeleting: false, lastRun: 0 };\r\n\r\nconst runStaleEntryCleanup = (): void => {\r\n const now = Date.now();\r\n if (cleanupState.isDeleting || now < cleanupState.lastRun + CLEANUP_INTERVAL_MS) return;\r\n\r\n cleanupState.isDeleting = true;\r\n\r\n try {\r\n const keys = Object.keys(responseQueue);\r\n let i = 0;\r\n while (i < keys.length) {\r\n const key = keys[i] as string;\r\n const entry = responseQueue[key];\r\n const streamInProgress = streamThrottleState[key] != null || streamAccumulators[key] != null;\r\n if (entry && !streamInProgress && entry.lastActivityAt != null && now - entry.lastActivityAt >= STALE_ENTRY_MS) {\r\n if (entry.setUpdateTriggers.size === 0) {\r\n delete responseQueue[key];\r\n delete streamThrottleState[key];\r\n delete streamAccumulators[key];\r\n } else if (entry.data != null) {\r\n entry.loading = null;\r\n entry.data = null;\r\n entry.meta = null;\r\n entry.error = null;\r\n entry.errorCode = null;\r\n entry.requestId = null;\r\n delete entry.streamChunks;\r\n delete streamThrottleState[key];\r\n }\r\n }\r\n i++;\r\n }\r\n } finally {\r\n cleanupState.isDeleting = false;\r\n cleanupState.lastRun = now;\r\n }\r\n};\r\n\r\nconst responseQueue: Record<string, QueueEntry<unknown>> = {};\r\n\r\nconst streamAccumulators: Record<string, StreamAccumulator> = {};\r\nconst streamThrottleState: Record<string, StreamThrottleState> = {};\r\n\r\nconst updater = (n: number) => n + 1;\r\n\r\nconst flushStreamBatch = (key: string, entry: QueueEntry<unknown>): void => {\r\n const state = streamThrottleState[key];\r\n if (!state || state.pendingChunks.length === 0) return;\r\n entry.streamChunks = state.pendingChunks.slice();\r\n state.pendingChunks.length = 0;\r\n entry.setUpdateTriggers.forEach((fn) => fn(updater));\r\n};\r\n\r\nconst findEntry = (cacheName: string | undefined, hookId: string | undefined) =>\r\n cacheName\r\n ? responseQueue[normalizeKey(cacheName)]\r\n : hookId\r\n ? (Object.values(responseQueue).find((e) => e.hookId === hookId) ?? null)\r\n : null;\r\n\r\nconst finalizeEntry = (entry: QueueEntry<unknown>): void => {\r\n entry.requestId = null;\r\n entry.setUpdateTriggers.forEach((fn) => fn(updater));\r\n};\r\n\r\nconst getApiWorker = (): Worker => {\r\n if (apiWorker) return apiWorker;\r\n apiWorker = createApiWorker();\r\n return apiWorker;\r\n};\r\n\r\nconst ensureWorkerInitialized = (): Worker => {\r\n const worker = getApiWorker();\r\n if (workerInitialized) return worker;\r\n workerInitialized = true;\r\n\r\n if (!cleanupTimer) {\r\n cleanupTimer = setInterval(() => runStaleEntryCleanup(), CLEANUP_INTERVAL_MS);\r\n }\r\n\r\n // Worker always sends error ({ message: string }). Entry is found by cacheName or hookId.\r\n // Stream responses: start → chunk(s) → end; we accumulate chunks then set data = new Blob(chunks) on end.\r\n worker.onmessage = (event: MessageEvent<WorkerMessagePayload>) => {\r\n const msg = event.data;\r\n const cacheName = msg.cacheName;\r\n const hookId = msg.hookId;\r\n const error = msg.error;\r\n const key = cacheName ? normalizeKey(cacheName) : \"\";\r\n\r\n if (\"stream\" in msg && msg.stream) {\r\n const entry = findEntry(cacheName, hookId);\r\n if (!entry) return;\r\n if (msg.requestId != null && msg.requestId !== \"\" && entry.requestId !== msg.requestId) return;\r\n const batchSize = toNumber(entry.streamChunkBatchSize, DEFAULT_CHUNK_BATCH);\r\n switch (msg.stream) {\r\n case \"start\": {\r\n streamAccumulators[key] = { chunks: [], meta: msg.meta ?? null };\r\n streamThrottleState[key] = { pendingChunks: [] };\r\n entry.streamChunks = [];\r\n entry.meta = msg.meta ?? null;\r\n entry.setUpdateTriggers.forEach((fn) => fn(updater));\r\n return;\r\n }\r\n case \"resume\":\r\n if (!streamAccumulators[key]) streamAccumulators[key] = { chunks: [], meta: msg.meta ?? null };\r\n else if (msg.meta) streamAccumulators[key].meta = msg.meta;\r\n if (!streamThrottleState[key]) streamThrottleState[key] = { pendingChunks: [] };\r\n if (msg.meta) entry.meta = msg.meta ?? null;\r\n return;\r\n case \"chunk\": {\r\n const acc = streamAccumulators[key];\r\n const throttle = streamThrottleState[key];\r\n if (acc && msg.data) acc.chunks.push(msg.data);\r\n if (throttle && msg.data) {\r\n throttle.pendingChunks.push(msg.data);\r\n if (throttle.pendingChunks.length >= batchSize) {\r\n flushStreamBatch(key, entry);\r\n }\r\n }\r\n return;\r\n }\r\n case \"end\": {\r\n const acc = streamAccumulators[key];\r\n const throttle = streamThrottleState[key];\r\n if (throttle?.pendingChunks.length) flushStreamBatch(key, entry);\r\n delete streamThrottleState[key];\r\n delete streamAccumulators[key];\r\n const errMsg = error?.message ?? \"\";\r\n if (errMsg !== \"\") {\r\n entry.error = errMsg;\r\n entry.errorCode = error?.code ?? null;\r\n } else if (acc) {\r\n entry.data = new Blob(acc.chunks, acc.meta?.contentType ? { type: acc.meta.contentType } : undefined);\r\n entry.meta = acc.meta ?? null;\r\n entry.error = null;\r\n entry.errorCode = null;\r\n entry.lastActivityAt = Date.now();\r\n }\r\n entry.loading = false;\r\n finalizeEntry(entry);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n const entry = findEntry(cacheName, hookId);\r\n if (!entry) return;\r\n if (msg.requestId != null && msg.requestId !== \"\" && entry.requestId !== msg.requestId) return;\r\n\r\n if (msg.type === \"delete\") {\r\n entry.data = null;\r\n entry.meta = null;\r\n entry.error = null;\r\n entry.errorCode = null;\r\n entry.loading = false;\r\n finalizeEntry(entry);\r\n return;\r\n }\r\n\r\n const message = error?.message ?? \"\";\r\n if (message !== \"\") {\r\n entry.error = message;\r\n entry.errorCode = error?.code ?? null;\r\n entry.loading = false;\r\n } else {\r\n entry.data = msg.data ?? null;\r\n entry.meta = msg.meta ?? null;\r\n entry.lastActivityAt = Date.now();\r\n entry.error = null;\r\n entry.errorCode = null;\r\n entry.loading = false;\r\n }\r\n finalizeEntry(entry);\r\n };\r\n\r\n return worker;\r\n};\r\n\r\n// ============================================================================\r\n// HOOK\r\n// ============================================================================\r\n\r\nexport type { RequestConfig, UseApiWorkerConfig, UseApiWorkerReturn } from \"../types/types\";\r\n\r\nexport const useApiWorker = <T>(config: UseApiWorkerConfig): UseApiWorkerReturn<T> | null => {\r\n if (!window) return null;\r\n const { cacheName, request: requestConfig, data: configData, runMode = \"auto\", enabled = true } = config;\r\n\r\n const worker = ensureWorkerInitialized();\r\n\r\n const hookIdRef = useRef<string>(\"\");\r\n const queueKey = normalizeKey(cacheName);\r\n\r\n const hasExecutedRef = useRef(false);\r\n const [, setUpdateTrigger] = useState(0);\r\n\r\n let storeEntry = responseQueue[queueKey];\r\n\r\n if (!storeEntry) {\r\n const hookId = uniqueId();\r\n storeEntry = responseQueue[queueKey] = {\r\n hookId,\r\n cacheName,\r\n data: null,\r\n loading: false,\r\n error: null,\r\n errorCode: null,\r\n setUpdateTriggers: new Set(),\r\n requestId: null,\r\n meta: null,\r\n lastActivityAt: null,\r\n };\r\n hookIdRef.current = hookId;\r\n } else {\r\n hookIdRef.current = storeEntry.hookId;\r\n storeEntry.lastActivityAt = Date.now();\r\n }\r\n const entry = storeEntry;\r\n\r\n const hookId = hookIdRef.current;\r\n\r\n useEffect(() => {\r\n responseQueue[queueKey]?.setUpdateTriggers.add(setUpdateTrigger);\r\n return () => {\r\n const storeEntry = responseQueue[queueKey];\r\n if (!storeEntry) return;\r\n storeEntry.setUpdateTriggers.delete(setUpdateTrigger);\r\n if (storeEntry.setUpdateTriggers.size === 0) {\r\n const requestId = storeEntry.requestId;\r\n if (requestId) {\r\n worker.postMessage({ dataRequest: { type: \"cancel\", cacheName, requestId } });\r\n }\r\n }\r\n };\r\n }, [queueKey, cacheName, worker]);\r\n\r\n const deleteCache = () => {\r\n if (cacheName) {\r\n worker.postMessage({\r\n dataRequest: { type: \"delete\", cacheName, hookId: hookIdRef.current },\r\n });\r\n }\r\n };\r\n\r\n const doRequest = () => {\r\n const entry = responseQueue[queueKey];\r\n if (!entry || entry.loading) return;\r\n entry.loading = true;\r\n entry.error = null;\r\n entry.errorCode = null;\r\n entry.lastActivityAt = Date.now();\r\n entry.setUpdateTriggers.forEach((fn) => fn(updater));\r\n if (requestConfig) {\r\n const requestId = uniqueId();\r\n entry.requestId = requestId;\r\n const isStream = requestConfig.responseType?.toLocaleLowerCase() === \"stream\";\r\n if (isStream) {\r\n entry.streamChunkBatchSize = toNumber(requestConfig.streamChunkBatchSize, DEFAULT_CHUNK_BATCH);\r\n }\r\n const request =\r\n isStream && requestConfig.retries === undefined ? { ...requestConfig, retries: 3 } : requestConfig;\r\n worker.postMessage({\r\n dataRequest: { type: \"set\", cacheName, hookId, requestId, payload: configData, request },\r\n });\r\n } else {\r\n worker.postMessage({ dataRequest: { type: \"get\", cacheName, hookId } as DataRequest<unknown> });\r\n }\r\n hasExecutedRef.current = true;\r\n };\r\n\r\n const makeRequest = () => {\r\n if (!enabled || (runMode === \"once\" && hasExecutedRef.current)) return;\r\n doRequest();\r\n };\r\n\r\n const hasAlreadyRunOnce = runMode === \"once\" && hasExecutedRef.current;\r\n const shouldRun = (runMode === \"auto\" || runMode === \"once\") && enabled && (requestConfig || cacheName);\r\n if (shouldRun && !hasAlreadyRunOnce && !entry.loading) {\r\n doRequest();\r\n }\r\n return {\r\n data: (entry.data as T) ?? null,\r\n meta: entry.meta ?? null,\r\n loading: entry.loading ?? false,\r\n error: entry.error ?? null,\r\n errorCode: entry.errorCode ?? null,\r\n refetch: makeRequest,\r\n deleteCache,\r\n streamChunks: toStreamChunks(entry.streamChunks),\r\n };\r\n};\r\n"],"names":["entry","hookId","storeEntry","requestId"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { B as BinaryParseResult, b as BinaryResponseMeta,
|
|
1
|
+
export { B as BinaryParseResult, b as BinaryResponseMeta, D as DataRequest, R as RequestConfig, c as ResponseType, d as RunMode, W as WorkerDataRequestType, e as WorkerErrorCode, f as WorkerErrorPayload, g as WorkerMessageData, h as WorkerMessagePayload, i as WorkerResponseMessage, j as WorkerResponseType } from '../../types-C6nnvGO7.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Creates a Worker instance for the API request worker.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const createApiWorker = () => new Worker(new URL("
|
|
1
|
+
const createApiWorker = () => new Worker(new URL("../workers/api/api.worker.js", import.meta.url), { type: "module" });
|
|
2
2
|
|
|
3
3
|
export { createApiWorker };
|
|
4
4
|
//# sourceMappingURL=vanilla.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vanilla.js","sources":["../../../src/shared/utils/createApiWorker.ts"],"sourcesContent":["/**\r\n * Creates a Worker instance for the API request worker.\r\n * Use this for vanilla JS/TS or to build your own framework integration.\r\n */\r\nexport const createApiWorker = (): Worker =>\r\n new Worker(new URL(\"
|
|
1
|
+
{"version":3,"file":"vanilla.js","sources":["../../../src/shared/utils/createApiWorker.ts"],"sourcesContent":["/**\r\n * Creates a Worker instance for the API request worker.\r\n * Use this for vanilla JS/TS or to build your own framework integration.\r\n */\r\nexport const createApiWorker = (): Worker =>\r\n new Worker(new URL(\"../workers/api/api.worker.js\", import.meta.url), { type: \"module\" });\r\n"],"names":[],"mappings":"AAIO,MAAM,eAAA,GAAkB,MAC7B,IAAI,MAAA,CAAO,IAAI,GAAA,CAAI,8BAAA,EAAgC,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAU;;;;"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* When "binary" or "stream", in-flight dedupe is skipped so we always run the request and return real response (no stale).
|
|
3
|
+
* Note: does not affect response parsing — Content-Type always governs the parse path.
|
|
4
|
+
*/
|
|
2
5
|
type ResponseType = "json" | "binary" | "stream";
|
|
3
6
|
interface RequestConfig {
|
|
4
7
|
url: string;
|
|
@@ -6,7 +9,7 @@ interface RequestConfig {
|
|
|
6
9
|
mode?: "cors" | "no-cors" | "navigate" | "same-origin";
|
|
7
10
|
headers?: Record<string, string>;
|
|
8
11
|
credentials?: "include" | "same-origin" | "omit";
|
|
9
|
-
/** Omit or "json": allow in-flight dedupe. "binary" or "stream": no early return, always process request. */
|
|
12
|
+
/** Omit or "json": allow in-flight dedupe. "binary" or "stream": no early return, always process request. Does not affect response parsing — Content-Type always governs the parse path. */
|
|
10
13
|
responseType?: ResponseType;
|
|
11
14
|
/** Abort request after this many milliseconds. */
|
|
12
15
|
timeoutMs?: number;
|
|
@@ -49,72 +52,36 @@ type BinaryParseResult = {
|
|
|
49
52
|
data: ArrayBuffer;
|
|
50
53
|
contentType: string;
|
|
51
54
|
} & Pick<BinaryResponseMeta, "contentDisposition">;
|
|
55
|
+
type WorkerResponseType = "result" | "delete" | "stream";
|
|
56
|
+
type WorkerErrorCode = "aborted" | "timeout" | "http" | "network" | "validation";
|
|
52
57
|
/** Worker always sends this shape; no error = { message: "" }. */
|
|
53
58
|
interface WorkerErrorPayload {
|
|
54
59
|
message: string;
|
|
60
|
+
code?: WorkerErrorCode;
|
|
55
61
|
}
|
|
56
62
|
interface UseApiWorkerReturn<T> {
|
|
57
63
|
data: T | null;
|
|
58
64
|
meta: BinaryResponseMeta | null;
|
|
59
65
|
loading: boolean;
|
|
60
66
|
error: string | null;
|
|
67
|
+
errorCode: WorkerErrorCode | null;
|
|
61
68
|
refetch: () => void;
|
|
62
69
|
deleteCache: () => void;
|
|
63
70
|
/** For responseType "stream": batch of chunks since last flush. Undefined for non-stream. */
|
|
64
71
|
streamChunks?: ArrayBuffer[] | undefined;
|
|
65
72
|
}
|
|
66
|
-
/**
|
|
67
|
-
|
|
68
|
-
* - data + meta: binary response (data is ArrayBuffer). Reconstruct: new Blob([data], { type: meta?.contentType })
|
|
69
|
-
* - data only: JSON/text response
|
|
70
|
-
* - stream: "start" | "chunk" | "end" — client handles chunk sequence then finalizes
|
|
71
|
-
* - error: error response with message and code
|
|
72
|
-
*/
|
|
73
|
-
type WorkerResponseMessage = {
|
|
74
|
-
cacheName: string;
|
|
75
|
-
data: unknown;
|
|
76
|
-
error: WorkerErrorPayload;
|
|
77
|
-
} | {
|
|
78
|
-
cacheName: string;
|
|
79
|
-
data: ArrayBuffer;
|
|
80
|
-
meta: BinaryResponseMeta;
|
|
81
|
-
error: WorkerErrorPayload;
|
|
82
|
-
} | {
|
|
83
|
-
cacheName: string;
|
|
84
|
-
error: WorkerErrorPayload;
|
|
85
|
-
} | {
|
|
86
|
-
cacheName: string;
|
|
87
|
-
stream: "start";
|
|
88
|
-
meta: BinaryResponseMeta | null;
|
|
89
|
-
hookId?: string;
|
|
90
|
-
httpStatus?: number;
|
|
91
|
-
error: WorkerErrorPayload;
|
|
92
|
-
} | {
|
|
93
|
-
cacheName: string;
|
|
94
|
-
stream: "resume";
|
|
95
|
-
meta: BinaryResponseMeta | null;
|
|
96
|
-
hookId?: string;
|
|
97
|
-
httpStatus?: number;
|
|
98
|
-
error: WorkerErrorPayload;
|
|
99
|
-
} | {
|
|
100
|
-
cacheName: string;
|
|
101
|
-
stream: "chunk";
|
|
102
|
-
data: ArrayBuffer;
|
|
103
|
-
hookId?: string;
|
|
104
|
-
error: WorkerErrorPayload;
|
|
105
|
-
} | {
|
|
106
|
-
cacheName: string;
|
|
107
|
-
stream: "end";
|
|
108
|
-
hookId?: string;
|
|
109
|
-
error: WorkerErrorPayload;
|
|
110
|
-
};
|
|
73
|
+
/** @deprecated Use WorkerMessagePayload. */
|
|
74
|
+
type WorkerResponseMessage = WorkerMessagePayload;
|
|
111
75
|
/**
|
|
112
76
|
* Payload shape for worker postMessage. Use for client onmessage:
|
|
113
77
|
* MessageEvent<WorkerMessagePayload>. The worker always sends error (same shape: { message: string }).
|
|
114
78
|
* No error = { message: "" }. With error = { message: "..." }.
|
|
79
|
+
* `type` disambiguates result, delete-ack, and stream messages. `requestId` echoes the originating request.
|
|
115
80
|
* When stream is present, client receives start → chunk(s) → end; cancel via existing requestId/cancel.
|
|
116
81
|
*/
|
|
117
82
|
type WorkerMessagePayload = {
|
|
83
|
+
type: "result" | "delete";
|
|
84
|
+
requestId?: string;
|
|
118
85
|
cacheName?: string;
|
|
119
86
|
data?: unknown;
|
|
120
87
|
meta?: BinaryResponseMeta;
|
|
@@ -122,6 +89,8 @@ type WorkerMessagePayload = {
|
|
|
122
89
|
hookId?: string;
|
|
123
90
|
httpStatus?: number;
|
|
124
91
|
} | {
|
|
92
|
+
type: "stream";
|
|
93
|
+
requestId?: string;
|
|
125
94
|
cacheName: string;
|
|
126
95
|
stream: "start";
|
|
127
96
|
meta: BinaryResponseMeta | null;
|
|
@@ -129,6 +98,8 @@ type WorkerMessagePayload = {
|
|
|
129
98
|
httpStatus?: number;
|
|
130
99
|
error: WorkerErrorPayload;
|
|
131
100
|
} | {
|
|
101
|
+
type: "stream";
|
|
102
|
+
requestId?: string;
|
|
132
103
|
cacheName: string;
|
|
133
104
|
stream: "resume";
|
|
134
105
|
meta: BinaryResponseMeta | null;
|
|
@@ -136,20 +107,23 @@ type WorkerMessagePayload = {
|
|
|
136
107
|
httpStatus?: number;
|
|
137
108
|
error: WorkerErrorPayload;
|
|
138
109
|
} | {
|
|
110
|
+
type: "stream";
|
|
111
|
+
requestId?: string;
|
|
139
112
|
cacheName: string;
|
|
140
113
|
stream: "chunk";
|
|
141
114
|
data: ArrayBuffer;
|
|
142
115
|
hookId?: string;
|
|
143
116
|
error: WorkerErrorPayload;
|
|
144
117
|
} | {
|
|
118
|
+
type: "stream";
|
|
119
|
+
requestId?: string;
|
|
145
120
|
cacheName: string;
|
|
146
121
|
stream: "end";
|
|
147
122
|
hookId?: string;
|
|
148
123
|
error: WorkerErrorPayload;
|
|
149
124
|
};
|
|
150
|
-
type ContentType = "application/json" | "application/xml" | "application/x-www-form-urlencoded" | "application/pdf" | "application/zip" | "application/gzip" | "application/octet-stream" | "application/javascript" | "application/ld+json" | "application/vnd.api+json" | "application/vnd.ms-excel" | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" | "application/vnd.openxmlformats-officedocument.wordprocessingml.document" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "text/plain" | "text/html" | "text/css" | "text/csv" | "text/javascript" | "text/xml" | "image/jpeg" | "image/png" | "image/gif" | "image/svg+xml" | "image/webp" | "image/bmp" | "image/tiff" | "image/x-icon" | "image/avif" | "audio/mpeg" | "audio/ogg" | "audio/wav" | "audio/webm" | "audio/aac" | "audio/midi" | "video/mp4" | "video/mpeg" | "video/webm" | "video/ogg" | "video/quicktime" | "video/x-msvideo" | "multipart/form-data" | "multipart/mixed" | "multipart/alternative" | "font/woff" | "font/woff2" | "font/ttf" | "font/otf";
|
|
151
125
|
type WorkerMessageData = {
|
|
152
126
|
dataRequest?: DataRequest<unknown>;
|
|
153
127
|
};
|
|
154
128
|
|
|
155
|
-
export type { BinaryParseResult as B,
|
|
129
|
+
export type { BinaryParseResult as B, DataRequest as D, RequestConfig as R, UseApiWorkerConfig as U, WorkerDataRequestType as W, UseApiWorkerReturn as a, BinaryResponseMeta as b, ResponseType as c, RunMode as d, WorkerErrorCode as e, WorkerErrorPayload as f, WorkerMessageData as g, WorkerMessagePayload as h, WorkerResponseMessage as i, WorkerResponseType as j };
|