@mainframework/api-request-worker 1.0.1 → 1.0.3
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 +65 -0
- package/dist/shared/output/react.d.ts +2 -2
- package/dist/shared/output/react.js +93 -79
- package/dist/shared/output/react.js.map +1 -1
- package/dist/shared/output/vanilla.d.ts +1 -1
- package/dist/{types-CTW-HSpg.d.ts → types-LYmxol0c.d.ts} +2 -1
- package/dist/workers/api/api.worker.js +93 -48
- package/dist/workers/api/api.worker.js.map +1 -1
- package/package.json +17 -18
package/README.md
CHANGED
|
@@ -45,6 +45,58 @@ yarn add @mainframework/api-request-worker
|
|
|
45
45
|
|
|
46
46
|
If you use the optional React hook, a peer dependency `react >= 19` is required.
|
|
47
47
|
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Quickstart
|
|
51
|
+
|
|
52
|
+
### React
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
import { useApiWorker } from "@mainframework/api-request-worker/react";
|
|
56
|
+
|
|
57
|
+
export function Todos() {
|
|
58
|
+
const { data, loading, error, refetch } = useApiWorker<{ id: string; title: string }[]>({
|
|
59
|
+
cacheName: "todos",
|
|
60
|
+
request: { url: "https://api.example.com/todos", method: "GET" },
|
|
61
|
+
runMode: "auto",
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
if (loading) return null;
|
|
65
|
+
if (error) return null;
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<div>
|
|
69
|
+
<button onClick={refetch}>Refresh</button>
|
|
70
|
+
<pre>{JSON.stringify(data, null, 2)}</pre>
|
|
71
|
+
</div>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Vanilla JS/TS
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
import { createApiWorker } from "@mainframework/api-request-worker";
|
|
80
|
+
|
|
81
|
+
const worker = createApiWorker();
|
|
82
|
+
const cacheName = "todos";
|
|
83
|
+
|
|
84
|
+
worker.onmessage = (event) => {
|
|
85
|
+
const msg = event.data;
|
|
86
|
+
if (msg.cacheName !== cacheName) return;
|
|
87
|
+
if (msg.error?.message) throw new Error(msg.error.message);
|
|
88
|
+
console.log(msg.data);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
worker.postMessage({
|
|
92
|
+
dataRequest: {
|
|
93
|
+
type: "set",
|
|
94
|
+
cacheName,
|
|
95
|
+
request: { url: "https://api.example.com/todos", method: "GET" },
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
48
100
|
### Public imports only
|
|
49
101
|
|
|
50
102
|
Use only these import paths. Do not import the worker script directly.
|
|
@@ -58,6 +110,18 @@ The worker is not a public entry. Obtain it only by calling `createApiWorker()`
|
|
|
58
110
|
|
|
59
111
|
---
|
|
60
112
|
|
|
113
|
+
## Bundler notes (Vite / Webpack / Next.js)
|
|
114
|
+
|
|
115
|
+
- **Vite**: Works out of the box. The worker is created via `new Worker(new URL(..., import.meta.url), { type: "module" })`.
|
|
116
|
+
|
|
117
|
+
- **Webpack**: Must support ESM module workers. Ensure your build supports `new URL(..., import.meta.url)` for assets and that module workers are enabled.
|
|
118
|
+
|
|
119
|
+
- **Next.js**: Use **client-only** code paths.
|
|
120
|
+
- Add `"use client";` at the top of any file that imports `@mainframework/api-request-worker/react`.
|
|
121
|
+
- Do not call `createApiWorker()` during SSR.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
61
125
|
## Usage with Vanilla TypeScript / JavaScript
|
|
62
126
|
|
|
63
127
|
Import from the main package entry and create the worker with `createApiWorker`. You then talk to the worker via the standard `postMessage` API: send **dataRequests** with `worker.postMessage`, and handle responses in `worker.onmessage`. No framework required.
|
|
@@ -647,6 +711,7 @@ import type {
|
|
|
647
711
|
WorkerDataRequestType,
|
|
648
712
|
WorkerMessageData,
|
|
649
713
|
BinaryParseResult,
|
|
714
|
+
ContentType,
|
|
650
715
|
} from "@mainframework/api-request-worker";
|
|
651
716
|
```
|
|
652
717
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { U as UseApiWorkerConfig,
|
|
2
|
-
export { R as RequestConfig } from '../../types-
|
|
1
|
+
import { U as UseApiWorkerConfig, a as UseApiWorkerReturn } from '../../types-LYmxol0c.js';
|
|
2
|
+
export { R as RequestConfig } from '../../types-LYmxol0c.js';
|
|
3
3
|
|
|
4
4
|
declare const useApiWorker: <T>(config: UseApiWorkerConfig) => UseApiWorkerReturn<T>;
|
|
5
5
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useRef, useState, useCallback
|
|
1
|
+
import { useRef, useState, useCallback } from 'react';
|
|
2
2
|
import { createApiWorker } from './vanilla.js';
|
|
3
3
|
|
|
4
4
|
let idCounter = 0;
|
|
@@ -7,12 +7,12 @@ const uniqueId = () => {
|
|
|
7
7
|
return idCounter.toString();
|
|
8
8
|
};
|
|
9
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,
|
|
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
11
|
|
|
12
12
|
const useCustomCallback = (callback, dependencies) => {
|
|
13
13
|
const refCallback = useRef(callback);
|
|
14
14
|
const refDependencies = useRef(dependencies);
|
|
15
|
-
if (!dependencies.every((dep, index) =>
|
|
15
|
+
if (!dependencies.every((dep, index) => A(dep, refDependencies.current[index]))) {
|
|
16
16
|
refDependencies.current = dependencies;
|
|
17
17
|
refCallback.current = callback;
|
|
18
18
|
}
|
|
@@ -25,7 +25,9 @@ const useCustomCallback = (callback, dependencies) => {
|
|
|
25
25
|
const DEFAULT_CHUNK_BATCH = 5;
|
|
26
26
|
const toNumber = (val, fallback) => typeof val === "number" && Number.isFinite(val) ? val : fallback;
|
|
27
27
|
const toStreamChunks = (val) => val === void 0 || val === null ? void 0 : Array.isArray(val) ? val : void 0;
|
|
28
|
-
|
|
28
|
+
let apiWorker = null;
|
|
29
|
+
let workerInitialized = false;
|
|
30
|
+
let cleanupTimer = null;
|
|
29
31
|
const STALE_ENTRY_MS = 5e3;
|
|
30
32
|
const CLEANUP_INTERVAL_MS = 3e4;
|
|
31
33
|
const normalizeKey = (key) => key.toLocaleLowerCase();
|
|
@@ -74,81 +76,96 @@ const finalizeEntry = (entry) => {
|
|
|
74
76
|
entry.requestId = null;
|
|
75
77
|
entry.setUpdateTrigger?.(updater);
|
|
76
78
|
};
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
79
|
+
const getApiWorker = () => {
|
|
80
|
+
if (apiWorker) return apiWorker;
|
|
81
|
+
apiWorker = createApiWorker();
|
|
82
|
+
return apiWorker;
|
|
83
|
+
};
|
|
84
|
+
const ensureWorkerInitialized = () => {
|
|
85
|
+
const worker = getApiWorker();
|
|
86
|
+
if (workerInitialized) return worker;
|
|
87
|
+
workerInitialized = true;
|
|
88
|
+
if (!cleanupTimer) {
|
|
89
|
+
cleanupTimer = setInterval(() => runStaleEntryCleanup(), CLEANUP_INTERVAL_MS);
|
|
90
|
+
}
|
|
91
|
+
worker.onmessage = (event) => {
|
|
92
|
+
const msg = event.data;
|
|
93
|
+
const cacheName = msg.cacheName;
|
|
94
|
+
const hookId = msg.hookId;
|
|
95
|
+
const error = msg.error;
|
|
96
|
+
const key = cacheName ? normalizeKey(cacheName) : "";
|
|
97
|
+
if ("stream" in msg && msg.stream) {
|
|
98
|
+
const entry2 = findEntry(cacheName, hookId);
|
|
99
|
+
if (!entry2) return;
|
|
100
|
+
const batchSize = toNumber(entry2.streamChunkBatchSize, DEFAULT_CHUNK_BATCH);
|
|
101
|
+
switch (msg.stream) {
|
|
102
|
+
case "start": {
|
|
103
|
+
streamAccumulators[key] = { chunks: [], meta: msg.meta ?? null };
|
|
104
|
+
streamThrottleState[key] = { pendingChunks: [] };
|
|
105
|
+
entry2.streamChunks = [];
|
|
106
|
+
entry2.meta = msg.meta ?? null;
|
|
107
|
+
entry2.setUpdateTrigger?.(updater);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
case "resume":
|
|
111
|
+
if (!streamAccumulators[key]) streamAccumulators[key] = { chunks: [], meta: msg.meta ?? null };
|
|
112
|
+
else if (msg.meta) streamAccumulators[key].meta = msg.meta;
|
|
113
|
+
if (!streamThrottleState[key]) streamThrottleState[key] = { pendingChunks: [] };
|
|
114
|
+
if (msg.meta) entry2.meta = msg.meta ?? null;
|
|
115
|
+
return;
|
|
116
|
+
case "chunk": {
|
|
117
|
+
const acc = streamAccumulators[key];
|
|
118
|
+
const throttle = streamThrottleState[key];
|
|
119
|
+
if (acc && msg.data) acc.chunks.push(msg.data);
|
|
120
|
+
if (throttle && msg.data) {
|
|
121
|
+
throttle.pendingChunks.push(msg.data);
|
|
122
|
+
if (throttle.pendingChunks.length >= batchSize) {
|
|
123
|
+
flushStreamBatch(key, entry2);
|
|
124
|
+
}
|
|
110
125
|
}
|
|
126
|
+
return;
|
|
111
127
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
entry2.
|
|
128
|
+
case "end": {
|
|
129
|
+
const acc = streamAccumulators[key];
|
|
130
|
+
const throttle = streamThrottleState[key];
|
|
131
|
+
if (throttle?.pendingChunks.length) flushStreamBatch(key, entry2);
|
|
132
|
+
delete streamThrottleState[key];
|
|
133
|
+
delete streamAccumulators[key];
|
|
134
|
+
const errMsg = error?.message ?? "";
|
|
135
|
+
if (errMsg !== "") {
|
|
136
|
+
entry2.error = errMsg;
|
|
137
|
+
} else if (acc) {
|
|
138
|
+
entry2.data = new Blob(acc.chunks, acc.meta?.contentType ? { type: acc.meta.contentType } : void 0);
|
|
139
|
+
entry2.meta = acc.meta ?? null;
|
|
140
|
+
entry2.error = null;
|
|
141
|
+
entry2.lastActivityAt = Date.now();
|
|
142
|
+
}
|
|
143
|
+
entry2.loading = false;
|
|
144
|
+
finalizeEntry(entry2);
|
|
145
|
+
return;
|
|
128
146
|
}
|
|
129
|
-
entry2.loading = false;
|
|
130
|
-
finalizeEntry(entry2);
|
|
131
|
-
return;
|
|
132
147
|
}
|
|
133
148
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
+
const entry = findEntry(cacheName, hookId);
|
|
150
|
+
if (!entry) return;
|
|
151
|
+
const message = error?.message ?? "";
|
|
152
|
+
if (message !== "") {
|
|
153
|
+
entry.error = message;
|
|
154
|
+
entry.loading = false;
|
|
155
|
+
} else {
|
|
156
|
+
entry.data = msg.data ?? null;
|
|
157
|
+
entry.meta = msg.meta ?? null;
|
|
158
|
+
entry.lastActivityAt = Date.now();
|
|
159
|
+
entry.error = null;
|
|
160
|
+
entry.loading = false;
|
|
161
|
+
}
|
|
162
|
+
finalizeEntry(entry);
|
|
163
|
+
};
|
|
164
|
+
return worker;
|
|
149
165
|
};
|
|
150
166
|
const useApiWorker = (config) => {
|
|
151
167
|
const { cacheName, request: requestConfig, data: configData, runMode = "auto", enabled = true } = config;
|
|
168
|
+
const worker = ensureWorkerInitialized();
|
|
152
169
|
const hookIdRef = useRef("");
|
|
153
170
|
const queueKey = normalizeKey(cacheName);
|
|
154
171
|
const hasExecutedRef = useRef(false);
|
|
@@ -178,14 +195,11 @@ const useApiWorker = (config) => {
|
|
|
178
195
|
const hookId = hookIdRef.current;
|
|
179
196
|
const deleteCache = useCallback(() => {
|
|
180
197
|
if (cacheName) {
|
|
181
|
-
|
|
198
|
+
worker.postMessage({
|
|
182
199
|
dataRequest: { type: "delete", cacheName, hookId: hookIdRef.current }
|
|
183
200
|
});
|
|
184
201
|
}
|
|
185
|
-
}, [cacheName]);
|
|
186
|
-
useEffect(() => {
|
|
187
|
-
runStaleEntryCleanup();
|
|
188
|
-
});
|
|
202
|
+
}, [cacheName, worker]);
|
|
189
203
|
const doRequest = useCallback(() => {
|
|
190
204
|
const entry2 = responseQueue[queueKey];
|
|
191
205
|
if (!entry2 || entry2.loading) return;
|
|
@@ -201,14 +215,14 @@ const useApiWorker = (config) => {
|
|
|
201
215
|
entry2.streamChunkBatchSize = toNumber(requestConfig.streamChunkBatchSize, DEFAULT_CHUNK_BATCH);
|
|
202
216
|
}
|
|
203
217
|
const request = isStream && requestConfig.retries === void 0 ? { ...requestConfig, retries: 3 } : requestConfig;
|
|
204
|
-
|
|
218
|
+
worker.postMessage({
|
|
205
219
|
dataRequest: { type: "set", cacheName, hookId, requestId, payload: configData, request }
|
|
206
220
|
});
|
|
207
221
|
} else {
|
|
208
|
-
|
|
222
|
+
worker.postMessage({ dataRequest: { type: "get", cacheName, hookId } });
|
|
209
223
|
}
|
|
210
224
|
hasExecutedRef.current = true;
|
|
211
|
-
}, [queueKey, cacheName, hookId, requestConfig, configData]);
|
|
225
|
+
}, [queueKey, cacheName, hookId, requestConfig, configData, worker]);
|
|
212
226
|
const makeRequest = useCustomCallback(() => {
|
|
213
227
|
if (!enabled || runMode === "once" && hasExecutedRef.current) return;
|
|
214
228
|
doRequest();
|
|
@@ -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,a=e=>ArrayBuffer.isView(e)&&!(e instanceof DataView),s=e=>Object.getPrototypeOf(e),u=e=>null==e||\"object\"!=typeof e&&\"function\"!=typeof e,c=(l,y,p=new WeakMap,b={})=>{if(l===y)return!0;if(\"number\"==typeof l&&\"number\"==typeof y&&Number.isNaN(l)&&Number.isNaN(y))return!0;if(b.normalizeBoxedPrimitives&&(i(l)&&(l=l.valueOf()),i(y)&&(y=y.valueOf()),u(l)&&u(y)))return l===y;if(u(l)||u(y))return!1;if(t(l)||t(y))return l===y;if(!e(l)||!e(y))return!1;let g=p.get(l)??(()=>{const e=new WeakMap;return p.set(l,e),e})();const h=g.get(y);if(void 0!==h)return h;g.set(y,!0);const w=s(l),A=s(y);let m;return m=Array.isArray(l)&&Array.isArray(y)?((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(!c(e[o],t[o],r,n))return!1}return!0})(l,y,p,b):!Array.isArray(l)&&!Array.isArray(y)&&(r(l)&&r(y)?((e,t)=>e.getTime()===t.getTime())(l,y):n(l)&&n(y)?((e,t)=>e.source===t.source&&e.flags===t.flags)(l,y):a(l)&&a(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})(l,y):o(l)&&o(y)?((e,t,r,n)=>{if(e.size!==t.size)return!1;const o=Array.from(t),f=new Set;for(const t of e){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)&&c(t,o[e],r,n)){f.add(e),i=!0;break}if(!i)return!1}return!0})(l,y,p,b):f(l)&&f(y)?((e,t,r,n)=>{if(e.size!==t.size)return!1;const o=Array.from(t),f=new Set;for(const[i,a]of e){if(u(i)){const e=t.get(i);if(void 0===e&&!t.has(i))return!1;if(!c(a,e,r,n))return!1;continue}let e=!1;for(let t=0;t<o.length;t++)if(!f.has(t)){const[s,u]=o[t];if(c(i,s,r,n)&&c(a,u,r,n)){f.add(t),e=!0;break}}if(!e)return!1}return!0})(l,y,p,b):!(!b.allowPrototypeMismatch&&w!==A)&&((e,t,r,n)=>{let o=0;for(const f of Reflect.ownKeys(e)){if(!Object.prototype.hasOwnProperty.call(t,f))return!1;if(!c(e[f],t[f],r,n))return!1;o++}return Reflect.ownKeys(t).length===o})(l,y,p,b)),g.set(y,m),m},l=(e,t,r)=>c(e,t,new WeakMap,r);export{l as isEqual};\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, 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\nimport { useCustomCallback } from \"./useCustomCallback\";\r\n\r\n// ============================================================================\r\n// MODULE-LEVEL WORKER & QUEUE\r\n// ============================================================================\r\n\r\nconst apiWorker = createApiWorker();\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\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\napiWorker.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// ============================================================================\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 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 apiWorker.postMessage({\r\n dataRequest: { type: \"delete\", cacheName, hookId: hookIdRef.current },\r\n });\r\n }\r\n }, [cacheName]);\r\n\r\n //This runs on every render, as the cleanup. Look at the function, it's has an early return if cleanup is happening\r\n useEffect(() => {\r\n runStaleEntryCleanup();\r\n });\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 apiWorker.postMessage({\r\n dataRequest: { type: \"set\", cacheName, hookId, requestId, payload: configData, request },\r\n });\r\n } else {\r\n apiWorker.postMessage({ dataRequest: { type: \"get\", cacheName, hookId } as DataRequest<unknown> });\r\n }\r\n hasExecutedRef.current = true;\r\n }, [queueKey, cacheName, hookId, requestConfig, configData]);\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","../../../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,4 +1,4 @@
|
|
|
1
|
-
export { B as BinaryParseResult,
|
|
1
|
+
export { B as BinaryParseResult, b as BinaryResponseMeta, C as ContentType, D as DataRequest, R as RequestConfig, c as ResponseType, d as RunMode, W as WorkerDataRequestType, e as WorkerErrorPayload, f as WorkerMessageData, g as WorkerMessagePayload, h as WorkerResponseMessage } from '../../types-LYmxol0c.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Creates a Worker instance for the API request worker.
|
|
@@ -147,8 +147,9 @@ type WorkerMessagePayload = {
|
|
|
147
147
|
hookId?: string;
|
|
148
148
|
error: WorkerErrorPayload;
|
|
149
149
|
};
|
|
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";
|
|
150
151
|
type WorkerMessageData = {
|
|
151
152
|
dataRequest?: DataRequest<unknown>;
|
|
152
153
|
};
|
|
153
154
|
|
|
154
|
-
export type { BinaryParseResult as B, DataRequest as D, RequestConfig as R, UseApiWorkerConfig as U, WorkerDataRequestType as W,
|
|
155
|
+
export type { BinaryParseResult as B, ContentType as C, DataRequest as D, RequestConfig as R, UseApiWorkerConfig as U, WorkerDataRequestType as W, UseApiWorkerReturn as a, BinaryResponseMeta as b, ResponseType as c, RunMode as d, WorkerErrorPayload as e, WorkerMessageData as f, WorkerMessagePayload as g, WorkerResponseMessage as h };
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
const BINARY_MARKER = /* @__PURE__ */ Symbol.for("WorkerApiBinary");
|
|
2
2
|
const DEFAULT_FILES_FIELD = "Files";
|
|
3
|
+
const EMPTY_BUFFER = new ArrayBuffer(0);
|
|
3
4
|
const NO_ERROR = { message: "" };
|
|
5
|
+
const DEFAULT_ERROR = "An error occurred";
|
|
4
6
|
const callerResponse = (cacheName, data, hookId, httpStatus, error = NO_ERROR) => {
|
|
5
7
|
self.postMessage({
|
|
6
8
|
cacheName,
|
|
@@ -12,18 +14,32 @@ const callerResponse = (cacheName, data, hookId, httpStatus, error = NO_ERROR) =
|
|
|
12
14
|
};
|
|
13
15
|
const makeError = (message) => ({ message });
|
|
14
16
|
const callerResponseBinary = (cacheName, data, meta, hookId, httpStatus, error = NO_ERROR) => {
|
|
15
|
-
const buffer = data
|
|
17
|
+
const buffer = data.byteLength ? data : EMPTY_BUFFER;
|
|
16
18
|
const payload = { cacheName, data: buffer, meta, hookId, httpStatus, error };
|
|
17
19
|
self.postMessage(payload, buffer.byteLength > 0 ? [buffer] : []);
|
|
18
20
|
};
|
|
19
21
|
const callerResponseStreamStart = (cacheName, meta, hookId, httpStatus, error = NO_ERROR) => {
|
|
20
|
-
self.postMessage({
|
|
22
|
+
self.postMessage({
|
|
23
|
+
cacheName,
|
|
24
|
+
stream: "start",
|
|
25
|
+
meta,
|
|
26
|
+
hookId,
|
|
27
|
+
httpStatus,
|
|
28
|
+
error
|
|
29
|
+
});
|
|
21
30
|
};
|
|
22
31
|
const callerResponseStreamResume = (cacheName, meta, hookId, httpStatus, error = NO_ERROR) => {
|
|
23
|
-
self.postMessage({
|
|
32
|
+
self.postMessage({
|
|
33
|
+
cacheName,
|
|
34
|
+
stream: "resume",
|
|
35
|
+
meta,
|
|
36
|
+
hookId,
|
|
37
|
+
httpStatus,
|
|
38
|
+
error
|
|
39
|
+
});
|
|
24
40
|
};
|
|
25
41
|
const callerResponseStreamChunk = (cacheName, data, hookId, error = NO_ERROR) => {
|
|
26
|
-
const buffer = data
|
|
42
|
+
const buffer = data.byteLength ? data : EMPTY_BUFFER;
|
|
27
43
|
const payload = { cacheName, stream: "chunk", data: buffer, hookId, error };
|
|
28
44
|
self.postMessage(payload, buffer.byteLength > 0 ? [buffer] : []);
|
|
29
45
|
};
|
|
@@ -53,7 +69,7 @@ const commit = (cacheName, data, hookId, httpStatus) => {
|
|
|
53
69
|
callerResponse("", null, hookId, void 0, makeError("Invalid commit: cacheName is required"));
|
|
54
70
|
return;
|
|
55
71
|
}
|
|
56
|
-
set(
|
|
72
|
+
set(cacheName, data);
|
|
57
73
|
callerResponse(cacheName, data, hookId, httpStatus);
|
|
58
74
|
};
|
|
59
75
|
const parseResponseByContentType = async (response) => {
|
|
@@ -63,7 +79,11 @@ const parseResponseByContentType = async (response) => {
|
|
|
63
79
|
return null;
|
|
64
80
|
}
|
|
65
81
|
if (contentType.includes("json")) {
|
|
66
|
-
|
|
82
|
+
const text = await response.text();
|
|
83
|
+
if (text.trim() === "") {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
return JSON.parse(text);
|
|
67
87
|
}
|
|
68
88
|
if (contentType.startsWith("text/") || contentType.includes("xml") || contentType.includes("javascript") || contentType.includes("x-www-form-urlencoded")) {
|
|
69
89
|
return await response.text();
|
|
@@ -103,22 +123,20 @@ const appendToFormData = (formData, key, value, fileFieldName = DEFAULT_FILES_FI
|
|
|
103
123
|
let ki = 0;
|
|
104
124
|
while (ki < keys.length) {
|
|
105
125
|
const k = keys[ki];
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
) || hasFile;
|
|
114
|
-
}
|
|
126
|
+
hasFile = appendToFormData(
|
|
127
|
+
formData,
|
|
128
|
+
key ? `${key}.${k}` : k,
|
|
129
|
+
value[k],
|
|
130
|
+
fileFieldName,
|
|
131
|
+
set2
|
|
132
|
+
) || hasFile;
|
|
115
133
|
ki++;
|
|
116
134
|
}
|
|
117
135
|
return hasFile;
|
|
118
136
|
}
|
|
119
137
|
if (value !== void 0 && value !== null) {
|
|
120
138
|
const primitive = value;
|
|
121
|
-
formData.append(key, primitive);
|
|
139
|
+
formData.append(key, String(primitive));
|
|
122
140
|
}
|
|
123
141
|
return false;
|
|
124
142
|
};
|
|
@@ -151,13 +169,32 @@ const getPayloadType = (payload) => {
|
|
|
151
169
|
}
|
|
152
170
|
};
|
|
153
171
|
const buildJsonBody = (payload) => JSON.stringify(payload);
|
|
154
|
-
const buildUrlEncodedBody = (payload) =>
|
|
172
|
+
const buildUrlEncodedBody = (payload) => {
|
|
173
|
+
const params = new URLSearchParams();
|
|
174
|
+
const keys = Object.keys(payload);
|
|
175
|
+
let i = 0;
|
|
176
|
+
while (i < keys.length) {
|
|
177
|
+
const key = keys[i];
|
|
178
|
+
const value = payload[key];
|
|
179
|
+
if (value !== null && value !== void 0) {
|
|
180
|
+
if (typeof value === "object") {
|
|
181
|
+
throw new Error(`Cannot url-encode non-primitive value for key "${key}"`);
|
|
182
|
+
}
|
|
183
|
+
params.append(key, value.toString());
|
|
184
|
+
}
|
|
185
|
+
i++;
|
|
186
|
+
}
|
|
187
|
+
return params.toString();
|
|
188
|
+
};
|
|
155
189
|
const buildTextBody = (payload) => String(payload);
|
|
156
190
|
const prepareRequestBody = (payload, headers, options) => {
|
|
157
191
|
const payloadType = getPayloadType(payload);
|
|
158
192
|
switch (payloadType) {
|
|
159
193
|
case "formdata":
|
|
160
|
-
return {
|
|
194
|
+
return {
|
|
195
|
+
body: payload,
|
|
196
|
+
headers: omitContentType({ ...headers })
|
|
197
|
+
};
|
|
161
198
|
case "blob":
|
|
162
199
|
return { body: payload, headers: { ...headers } };
|
|
163
200
|
case "arraybuffer":
|
|
@@ -165,28 +202,31 @@ const prepareRequestBody = (payload, headers, options) => {
|
|
|
165
202
|
case "arraybufferview":
|
|
166
203
|
return { body: payload, headers: { ...headers } };
|
|
167
204
|
case "stream":
|
|
168
|
-
return {
|
|
205
|
+
return {
|
|
206
|
+
body: payload,
|
|
207
|
+
headers: { ...headers }
|
|
208
|
+
};
|
|
169
209
|
case "string":
|
|
170
210
|
return { body: payload, headers: { ...headers } };
|
|
171
211
|
case "object": {
|
|
172
|
-
const h = { ...headers };
|
|
173
|
-
const contentType = getContentType(h);
|
|
174
212
|
const fileFieldName = options?.formDataFileFieldName ?? DEFAULT_FILES_FIELD;
|
|
175
213
|
const formDataKey = options?.formDataKey ?? DEFAULT_FILES_FIELD;
|
|
214
|
+
const formData = createFormDataIfBlobOrFile(payload, fileFieldName, formDataKey);
|
|
215
|
+
if (formData) {
|
|
216
|
+
return { body: formData, headers: omitContentType({ ...headers }) };
|
|
217
|
+
}
|
|
218
|
+
const h = { ...headers };
|
|
219
|
+
let contentType = getContentType(h);
|
|
220
|
+
if (contentType.includes("multipart/form-data")) {
|
|
221
|
+
contentType = "application/json";
|
|
222
|
+
delete h["Content-Type"];
|
|
223
|
+
delete h["content-type"];
|
|
224
|
+
}
|
|
176
225
|
let body;
|
|
177
|
-
if (contentType.includes("application/
|
|
178
|
-
body = buildJsonBody(payload);
|
|
179
|
-
} else if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
226
|
+
if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
180
227
|
body = buildUrlEncodedBody(payload);
|
|
181
228
|
} else if (contentType.startsWith("text/") || contentType.includes("xml")) {
|
|
182
229
|
body = buildTextBody(payload);
|
|
183
|
-
} else if (contentType.includes("multipart/form-data")) {
|
|
184
|
-
const formData = createFormDataIfBlobOrFile(payload, fileFieldName, formDataKey);
|
|
185
|
-
if (formData) {
|
|
186
|
-
return { body: formData, headers: omitContentType(h) };
|
|
187
|
-
}
|
|
188
|
-
body = buildJsonBody(payload);
|
|
189
|
-
h["Content-Type"] = "application/json";
|
|
190
230
|
} else {
|
|
191
231
|
body = buildJsonBody(payload);
|
|
192
232
|
}
|
|
@@ -242,18 +282,18 @@ const apiRequest = async (cacheName, payload, {
|
|
|
242
282
|
credentials,
|
|
243
283
|
signal: controller.signal
|
|
244
284
|
};
|
|
245
|
-
if (methodLower !== "get" && payload != null) {
|
|
246
|
-
const prepareOptions = {};
|
|
247
|
-
if (formDataFileFieldName != null && formDataFileFieldName !== "")
|
|
248
|
-
prepareOptions.formDataFileFieldName = formDataFileFieldName;
|
|
249
|
-
if (formDataKey != null && formDataKey !== "") prepareOptions.formDataKey = formDataKey;
|
|
250
|
-
const { body, headers: processedHeaders } = prepareRequestBody(payload, headers, prepareOptions);
|
|
251
|
-
if (body !== void 0) fetchOptions.body = body;
|
|
252
|
-
fetchOptions.headers = processedHeaders;
|
|
253
|
-
} else {
|
|
254
|
-
fetchOptions.headers = omitContentType({ ...headers });
|
|
255
|
-
}
|
|
256
285
|
try {
|
|
286
|
+
if (methodLower !== "get" && payload != null) {
|
|
287
|
+
const prepareOptions = {};
|
|
288
|
+
if (formDataFileFieldName != null && formDataFileFieldName !== "")
|
|
289
|
+
prepareOptions.formDataFileFieldName = formDataFileFieldName;
|
|
290
|
+
if (formDataKey != null && formDataKey !== "") prepareOptions.formDataKey = formDataKey;
|
|
291
|
+
const { body, headers: processedHeaders } = prepareRequestBody(payload, headers, prepareOptions);
|
|
292
|
+
if (body !== void 0) fetchOptions.body = body;
|
|
293
|
+
fetchOptions.headers = processedHeaders;
|
|
294
|
+
} else {
|
|
295
|
+
fetchOptions.headers = omitContentType({ ...headers });
|
|
296
|
+
}
|
|
257
297
|
if (responseTypeLower === "stream") {
|
|
258
298
|
const maxRetries = Math.min(retries ?? 3, 5);
|
|
259
299
|
let bytesReceived = 0;
|
|
@@ -261,11 +301,14 @@ const apiRequest = async (cacheName, payload, {
|
|
|
261
301
|
let attempt = 0;
|
|
262
302
|
while (attempt <= maxRetries) {
|
|
263
303
|
try {
|
|
264
|
-
const reqHeaders = methodLower === "get" ? omitContentType({ ...fetchOptions.headers }) : fetchOptions.headers;
|
|
304
|
+
const reqHeaders = methodLower === "get" ? omitContentType({ ...fetchOptions.headers }) : { ...fetchOptions.headers };
|
|
265
305
|
if (bytesReceived > 0) reqHeaders["Range"] = `bytes=${bytesReceived}-`;
|
|
266
|
-
const streamResponse = await fetch(url, {
|
|
306
|
+
const streamResponse = await fetch(url, {
|
|
307
|
+
...fetchOptions,
|
|
308
|
+
headers: reqHeaders
|
|
309
|
+
});
|
|
267
310
|
if (streamResponse.status >= 400) {
|
|
268
|
-
streamError = makeError(streamResponse.statusText);
|
|
311
|
+
streamError = makeError(streamResponse.statusText || DEFAULT_ERROR);
|
|
269
312
|
break;
|
|
270
313
|
}
|
|
271
314
|
if (streamResponse.status === 204) {
|
|
@@ -318,11 +361,11 @@ const apiRequest = async (cacheName, payload, {
|
|
|
318
361
|
}
|
|
319
362
|
const response = await fetch(url, fetchOptions);
|
|
320
363
|
if (response.status >= 400) {
|
|
321
|
-
callerResponse(cacheName, null, hookId, response.status, makeError(response.statusText));
|
|
364
|
+
callerResponse(cacheName, null, hookId, response.status, makeError(response.statusText || DEFAULT_ERROR));
|
|
322
365
|
return;
|
|
323
366
|
}
|
|
324
367
|
if (response.status === 204) {
|
|
325
|
-
set(
|
|
368
|
+
set(cacheName, null);
|
|
326
369
|
callerResponse(cacheName, null, hookId, 204);
|
|
327
370
|
return;
|
|
328
371
|
}
|
|
@@ -356,7 +399,9 @@ const apiRequest = async (cacheName, payload, {
|
|
|
356
399
|
inFlightByCacheName.delete(cacheName);
|
|
357
400
|
}
|
|
358
401
|
})();
|
|
359
|
-
|
|
402
|
+
if (!skipInFlightDedupe) {
|
|
403
|
+
inFlightByCacheName.set(cacheName, promise);
|
|
404
|
+
}
|
|
360
405
|
await promise;
|
|
361
406
|
};
|
|
362
407
|
const onRequest = (dataRequest) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.worker.js","sources":["../../../src/shared/workers/api/api.worker.ts"],"sourcesContent":["/// <reference lib=\"webworker\" />\r\n\r\nimport type {\r\n AbortControllers,\r\n BinaryParseResult,\r\n BinaryResponseMeta,\r\n DataRequest,\r\n WorkerApiRequest,\r\n WorkerErrorPayload,\r\n WorkerMessageData,\r\n} from \"../../types/types\";\r\n\r\nexport const BINARY_MARKER = Symbol.for(\"WorkerApiBinary\");\r\n\r\nconst DEFAULT_FILES_FIELD = \"Files\";\r\n\r\nconst NO_ERROR: WorkerErrorPayload = { message: \"\" };\r\n\r\nconst callerResponse = (\r\n cacheName: string,\r\n data: unknown,\r\n hookId?: string | null,\r\n httpStatus?: number,\r\n error: WorkerErrorPayload = NO_ERROR,\r\n): void => {\r\n self.postMessage({\r\n cacheName,\r\n data: error.message !== \"\" ? null : (data ?? null),\r\n hookId,\r\n httpStatus,\r\n error,\r\n });\r\n};\r\n\r\nconst makeError = (message: string): WorkerErrorPayload => ({ message });\r\n\r\n/**\r\n * Binary response - transferred via postMessage, not stored in cache.\r\n * Client receives ArrayBuffer + meta for reconstruction (e.g. new Blob([data], { type })).\r\n * Always sends a message; empty/zero-length body uses an empty ArrayBuffer so the client does not hang.\r\n */\r\nconst callerResponseBinary = (\r\n cacheName: string,\r\n data: ArrayBuffer,\r\n meta: BinaryResponseMeta,\r\n hookId?: string | null,\r\n httpStatus?: number,\r\n error: WorkerErrorPayload = NO_ERROR,\r\n): void => {\r\n const buffer = data?.byteLength ? data : new ArrayBuffer(0);\r\n const payload = { cacheName, data: buffer, meta, hookId, httpStatus, error };\r\n self.postMessage(payload, buffer.byteLength > 0 ? [buffer] : []);\r\n};\r\n\r\nconst callerResponseStreamStart = (\r\n cacheName: string,\r\n meta: BinaryResponseMeta | null,\r\n hookId?: string | null,\r\n httpStatus?: number,\r\n error: WorkerErrorPayload = NO_ERROR,\r\n): void => {\r\n self.postMessage({ cacheName, stream: \"start\", meta, hookId, httpStatus, error });\r\n};\r\n\r\nconst callerResponseStreamResume = (\r\n cacheName: string,\r\n meta: BinaryResponseMeta | null,\r\n hookId?: string | null,\r\n httpStatus?: number,\r\n error: WorkerErrorPayload = NO_ERROR,\r\n): void => {\r\n self.postMessage({ cacheName, stream: \"resume\", meta, hookId, httpStatus, error });\r\n};\r\n\r\nconst callerResponseStreamChunk = (\r\n cacheName: string,\r\n data: ArrayBuffer,\r\n hookId?: string | null,\r\n error: WorkerErrorPayload = NO_ERROR,\r\n): void => {\r\n const buffer = data?.byteLength ? data : new ArrayBuffer(0);\r\n const payload = { cacheName, stream: \"chunk\", data: buffer, hookId, error };\r\n self.postMessage(payload, buffer.byteLength > 0 ? [buffer] : []);\r\n};\r\n\r\nconst callerResponseStreamEnd = (\r\n cacheName: string,\r\n hookId?: string | null,\r\n error: WorkerErrorPayload = NO_ERROR,\r\n): void => {\r\n self.postMessage({ cacheName, stream: \"end\", hookId, error });\r\n};\r\n\r\nconst transferableBuffer = (view: Uint8Array): ArrayBuffer =>\r\n view.byteOffset === 0 && view.byteLength === view.buffer.byteLength\r\n ? (view.buffer as ArrayBuffer)\r\n : view.slice(0).buffer;\r\n\r\nconst store = Object.create(null) as Record<string, unknown>;\r\nconst normalizeKey = (key: string) => key.toLocaleLowerCase();\r\nconst get = <TData>(key: string): TData | undefined => store[normalizeKey(key)] as TData | undefined;\r\nconst set = <TData>(key: string, value: TData): void => {\r\n store[normalizeKey(key)] = value;\r\n};\r\nconst remove = (key: string): void => {\r\n delete store[normalizeKey(key)];\r\n};\r\n\r\nconst isNonEmptyString = (v: unknown): v is string => typeof v === \"string\" && v.trim() !== \"\";\r\n\r\n/** Returns headers without Content-Type (either casing). Use when FormData sets it automatically. */\r\nconst omitContentType = (headers: Record<string, string>): Record<string, string> => {\r\n const rest = { ...headers };\r\n delete rest[\"Content-Type\"];\r\n delete rest[\"content-type\"];\r\n return rest;\r\n};\r\n\r\nconst isBinaryResponse = (r: unknown): r is BinaryParseResult =>\r\n typeof r === \"object\" &&\r\n r !== null &&\r\n BINARY_MARKER in r &&\r\n (r as unknown as BinaryParseResult).data instanceof ArrayBuffer;\r\n\r\nconst commit = <TData>(cacheName: string, data: TData, hookId?: string | null, httpStatus?: number): void => {\r\n if (!cacheName) {\r\n callerResponse(\"\", null, hookId, undefined, makeError(\"Invalid commit: cacheName is required\"));\r\n return;\r\n }\r\n set(normalizeKey(cacheName), data);\r\n callerResponse(cacheName, data, hookId, httpStatus);\r\n};\r\n\r\n/**\r\n * Parses response based on content-type.\r\n * Returns parsed data for JSON/text, or binary result with BINARY_MARKER, data (ArrayBuffer), contentType, contentDisposition.\r\n */\r\nconst parseResponseByContentType = async (response: Response): Promise<unknown> => {\r\n const contentType = response.headers.get(\"content-type\")?.toLocaleLowerCase() || \"\";\r\n const contentLength = response.headers.get(\"content-length\");\r\n\r\n // No content\r\n if (response.status === 204 || contentLength === \"0\") {\r\n return null;\r\n }\r\n\r\n // JSON types - let it throw if malformed\r\n if (contentType.includes(\"json\")) {\r\n return await response.json();\r\n }\r\n\r\n // Text-based types\r\n if (\r\n contentType.startsWith(\"text/\") ||\r\n contentType.includes(\"xml\") ||\r\n contentType.includes(\"javascript\") ||\r\n contentType.includes(\"x-www-form-urlencoded\")\r\n ) {\r\n return await response.text();\r\n }\r\n\r\n // Binary types (known or fallback) - use arrayBuffer for zero-copy transfer to client\r\n const arrayBuffer = await response.arrayBuffer();\r\n return {\r\n [BINARY_MARKER]: true as const,\r\n data: arrayBuffer,\r\n contentType,\r\n contentDisposition: response.headers.get(\"content-disposition\"),\r\n };\r\n};\r\n\r\n/** File/Blob use fileFieldName (default \"Files\"); all other fields use property name (key). */\r\nconst appendToFormData = (\r\n formData: FormData,\r\n key: string,\r\n value: unknown,\r\n fileFieldName: string = DEFAULT_FILES_FIELD,\r\n visited?: WeakSet<object>,\r\n): boolean => {\r\n if (value instanceof File) {\r\n formData.append(fileFieldName, value, value.name);\r\n return true;\r\n }\r\n\r\n if (value instanceof Blob) {\r\n formData.append(fileFieldName, value, \"blob\");\r\n return true;\r\n }\r\n\r\n if (value !== null && value !== undefined && typeof value === \"object\") {\r\n const set = visited ?? new WeakSet<object>();\r\n if (set.has(value)) return false;\r\n set.add(value);\r\n if (Array.isArray(value)) {\r\n let hasFile = false;\r\n let i = 0;\r\n while (i < value.length) {\r\n hasFile = appendToFormData(formData, key ? `${key}.${i}` : String(i), value[i], fileFieldName, set) || hasFile;\r\n i++;\r\n }\r\n return hasFile;\r\n }\r\n let hasFile = false;\r\n const keys = Object.keys(value);\r\n let ki = 0;\r\n while (ki < keys.length) {\r\n const k = keys[ki] as string;\r\n if (Object.prototype.hasOwnProperty.call(value, k)) {\r\n hasFile =\r\n appendToFormData(\r\n formData,\r\n key ? `${key}.${k}` : k,\r\n (value as Record<string, unknown>)[k],\r\n fileFieldName,\r\n set,\r\n ) || hasFile;\r\n }\r\n ki++;\r\n }\r\n return hasFile;\r\n }\r\n\r\n if (value !== undefined && value !== null) {\r\n const primitive = value as string | number | boolean | bigint | symbol;\r\n formData.append(key, primitive as string | Blob);\r\n }\r\n return false;\r\n};\r\n\r\nconst createFormDataIfBlobOrFile = (\r\n payload: unknown,\r\n fileFieldName: string = DEFAULT_FILES_FIELD,\r\n formDataKey: string = DEFAULT_FILES_FIELD,\r\n): FormData | null => {\r\n if (payload === null || payload === undefined || typeof payload !== \"object\") {\r\n return null;\r\n }\r\n\r\n const formData = new FormData();\r\n const visited = new WeakSet<object>();\r\n const hasFile = appendToFormData(formData, formDataKey, payload, fileFieldName, visited);\r\n return hasFile ? formData : null;\r\n};\r\n\r\nconst getContentType = (headers: Record<string, string> = {}): string =>\r\n headers[\"Content-Type\"] || headers[\"content-type\"] || \"application/json\";\r\n\r\nconst getPayloadType = (payload: unknown): string => {\r\n switch (true) {\r\n case payload instanceof FormData:\r\n return \"formdata\";\r\n case payload instanceof Blob:\r\n return \"blob\";\r\n case payload instanceof ArrayBuffer:\r\n return \"arraybuffer\";\r\n case ArrayBuffer.isView(payload):\r\n return \"arraybufferview\";\r\n case typeof ReadableStream !== \"undefined\" && payload instanceof ReadableStream:\r\n return \"stream\";\r\n case typeof payload === \"string\":\r\n return \"string\";\r\n default:\r\n return \"object\";\r\n }\r\n};\r\n\r\nconst buildJsonBody = (payload: unknown): BodyInit => JSON.stringify(payload);\r\nconst buildUrlEncodedBody = (payload: Record<string, string>): BodyInit => new URLSearchParams(payload).toString();\r\nconst buildTextBody = (payload: unknown): BodyInit => String(payload);\r\n\r\n/**\r\n * Builds body and headers for fetch. Each branch handles one payload type; add new cases here for new body types.\r\n */\r\nconst prepareRequestBody = (\r\n payload: unknown,\r\n headers: Record<string, string>,\r\n options?: { formDataFileFieldName?: string; formDataKey?: string },\r\n): { body?: BodyInit; headers: Record<string, string> } => {\r\n const payloadType = getPayloadType(payload);\r\n\r\n switch (payloadType) {\r\n case \"formdata\":\r\n return { body: payload as FormData, headers: omitContentType({ ...headers }) };\r\n case \"blob\":\r\n return { body: payload as Blob, headers: { ...headers } };\r\n case \"arraybuffer\":\r\n return { body: payload as ArrayBuffer, headers: { ...headers } };\r\n case \"arraybufferview\":\r\n return { body: payload as BodyInit, headers: { ...headers } };\r\n case \"stream\":\r\n return { body: payload as ReadableStream<Uint8Array>, headers: { ...headers } };\r\n case \"string\":\r\n return { body: payload as string, headers: { ...headers } };\r\n case \"object\": {\r\n const h = { ...headers };\r\n const contentType = getContentType(h);\r\n const fileFieldName = options?.formDataFileFieldName ?? DEFAULT_FILES_FIELD;\r\n const formDataKey = options?.formDataKey ?? DEFAULT_FILES_FIELD;\r\n\r\n let body: BodyInit;\r\n if (contentType.includes(\"application/json\")) {\r\n body = buildJsonBody(payload);\r\n } else if (contentType.includes(\"application/x-www-form-urlencoded\")) {\r\n body = buildUrlEncodedBody(payload as Record<string, string>);\r\n } else if (contentType.startsWith(\"text/\") || contentType.includes(\"xml\")) {\r\n body = buildTextBody(payload);\r\n } else if (contentType.includes(\"multipart/form-data\")) {\r\n const formData = createFormDataIfBlobOrFile(payload, fileFieldName, formDataKey);\r\n if (formData) {\r\n return { body: formData, headers: omitContentType(h) };\r\n }\r\n body = buildJsonBody(payload);\r\n h[\"Content-Type\"] = \"application/json\";\r\n } else {\r\n body = buildJsonBody(payload);\r\n }\r\n\r\n if (!h[\"Content-Type\"] && !h[\"content-type\"]) {\r\n h[\"Content-Type\"] = contentType;\r\n }\r\n return { body, headers: h };\r\n }\r\n\r\n default:\r\n return { headers: { ...headers } };\r\n }\r\n};\r\n\r\nconst inFlightControllers: AbortControllers = new Map();\r\nconst inFlightByCacheName = new Map<string, Promise<void>>();\r\n\r\nconst apiRequest = async <TData>(\r\n cacheName: string,\r\n payload: TData | FormData | null,\r\n {\r\n url,\r\n method,\r\n headers = {},\r\n mode = \"cors\",\r\n credentials = \"same-origin\",\r\n responseType,\r\n timeoutMs,\r\n formDataFileFieldName,\r\n formDataKey,\r\n retries,\r\n }: WorkerApiRequest,\r\n requestId?: string | null,\r\n hookId?: string | null,\r\n): Promise<void> => {\r\n const methodLower = method.toLocaleLowerCase();\r\n const responseTypeLower = responseType?.toLocaleLowerCase();\r\n\r\n // Early return (cached then fresh) allowed for any HTTP method, except when response is binary or streaming.\r\n const skipInFlightDedupe = responseTypeLower === \"binary\" || responseTypeLower === \"stream\";\r\n if (!skipInFlightDedupe) {\r\n const existing = inFlightByCacheName.get(cacheName);\r\n if (existing) {\r\n const cached = get(cacheName);\r\n if (cached !== undefined) callerResponse(cacheName, cached, hookId);\r\n await existing;\r\n const fresh = get(cacheName);\r\n if (fresh !== undefined) callerResponse(cacheName, fresh, hookId);\r\n return;\r\n }\r\n }\r\n\r\n const controller = new AbortController();\r\n if (requestId) {\r\n inFlightControllers.set(requestId, controller);\r\n }\r\n\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n if (timeoutMs != null && timeoutMs > 0) {\r\n timeoutId = setTimeout(() => controller.abort(), timeoutMs);\r\n }\r\n\r\n const promise = (async (): Promise<void> => {\r\n const fetchOptions: RequestInit = {\r\n method,\r\n mode,\r\n credentials,\r\n signal: controller.signal,\r\n };\r\n\r\n if (methodLower !== \"get\" && payload != null) {\r\n const prepareOptions: { formDataFileFieldName?: string; formDataKey?: string } = {};\r\n if (formDataFileFieldName != null && formDataFileFieldName !== \"\")\r\n prepareOptions.formDataFileFieldName = formDataFileFieldName;\r\n if (formDataKey != null && formDataKey !== \"\") prepareOptions.formDataKey = formDataKey;\r\n const { body, headers: processedHeaders } = prepareRequestBody(payload, headers, prepareOptions);\r\n if (body !== undefined) fetchOptions.body = body;\r\n fetchOptions.headers = processedHeaders;\r\n } else {\r\n fetchOptions.headers = omitContentType({ ...headers });\r\n }\r\n\r\n try {\r\n if (responseTypeLower === \"stream\") {\r\n const maxRetries = Math.min(retries ?? 3, 5);\r\n let bytesReceived = 0;\r\n let streamError: WorkerErrorPayload = NO_ERROR;\r\n let attempt = 0;\r\n while (attempt <= maxRetries) {\r\n try {\r\n const reqHeaders =\r\n methodLower === \"get\" ? omitContentType({ ...fetchOptions.headers }) : fetchOptions.headers;\r\n if (bytesReceived > 0) reqHeaders[\"Range\"] = `bytes=${bytesReceived}-`;\r\n const streamResponse = await fetch(url, { ...fetchOptions, headers: reqHeaders });\r\n if (streamResponse.status >= 400) {\r\n streamError = makeError(streamResponse.statusText);\r\n break;\r\n }\r\n if (streamResponse.status === 204) {\r\n callerResponseStreamEnd(cacheName, hookId);\r\n return;\r\n }\r\n if (streamResponse.status === 416) break;\r\n const contentType = streamResponse.headers.get(\"content-type\") ?? undefined;\r\n const meta: BinaryResponseMeta = {\r\n contentDisposition: streamResponse.headers.get(\"content-disposition\") ?? null,\r\n ...(contentType !== undefined && { contentType }),\r\n };\r\n if (bytesReceived === 0) callerResponseStreamStart(cacheName, meta, hookId, streamResponse.status);\r\n else callerResponseStreamResume(cacheName, meta, hookId, streamResponse.status);\r\n const body = streamResponse.body;\r\n if (!body) {\r\n callerResponseStreamEnd(cacheName, hookId);\r\n return;\r\n }\r\n const reader = body.getReader();\r\n let skipRemaining = streamResponse.status === 200 && bytesReceived > 0 ? bytesReceived : 0;\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n if (!value || value.byteLength === 0) continue;\r\n if (skipRemaining > 0) {\r\n if (value.byteLength <= skipRemaining) {\r\n skipRemaining -= value.byteLength;\r\n continue;\r\n }\r\n const offset = skipRemaining;\r\n skipRemaining = 0;\r\n const tail = value.subarray(offset);\r\n callerResponseStreamChunk(cacheName, transferableBuffer(tail), hookId);\r\n bytesReceived += tail.byteLength;\r\n } else {\r\n callerResponseStreamChunk(cacheName, transferableBuffer(value), hookId);\r\n bytesReceived += value.byteLength;\r\n }\r\n }\r\n break;\r\n } catch (err) {\r\n streamError =\r\n (err as Error).name === \"AbortError\" ? makeError(\"Request aborted\") : makeError((err as Error).message);\r\n if (attempt === maxRetries) break;\r\n }\r\n attempt++;\r\n }\r\n callerResponseStreamEnd(cacheName, hookId, streamError);\r\n return;\r\n }\r\n\r\n const response = await fetch(url, fetchOptions);\r\n\r\n if (response.status >= 400) {\r\n callerResponse(cacheName, null, hookId, response.status, makeError(response.statusText));\r\n return;\r\n }\r\n\r\n if (response.status === 204) {\r\n set(normalizeKey(cacheName), null);\r\n callerResponse(cacheName, null, hookId, 204);\r\n return;\r\n }\r\n\r\n const responseData = await parseResponseByContentType(response);\r\n\r\n if (isBinaryResponse(responseData)) {\r\n callerResponseBinary(\r\n cacheName,\r\n responseData.data,\r\n {\r\n contentType: responseData.contentType,\r\n contentDisposition: responseData.contentDisposition ?? null,\r\n },\r\n hookId,\r\n response.status,\r\n );\r\n } else {\r\n commit(cacheName, responseData, hookId, response.status);\r\n }\r\n } catch (error) {\r\n if ((error as Error).name === \"AbortError\") {\r\n callerResponse(cacheName, null, hookId, undefined, makeError(\"Request aborted\"));\r\n return;\r\n }\r\n const err = error as Error;\r\n callerResponse(cacheName, null, hookId, undefined, makeError(err.message));\r\n } finally {\r\n if (timeoutId != null) clearTimeout(timeoutId);\r\n if (requestId) {\r\n inFlightControllers.delete(requestId);\r\n }\r\n inFlightByCacheName.delete(cacheName);\r\n }\r\n })();\r\n\r\n inFlightByCacheName.set(cacheName, promise);\r\n await promise;\r\n};\r\n\r\nconst onRequest = <TData>(dataRequest: DataRequest<TData>): void => {\r\n const { cacheName, type, payload, request, requestId, hookId } = dataRequest;\r\n const responseCacheName = dataRequest.cacheName ?? \"\";\r\n\r\n if (!isNonEmptyString(type)) {\r\n callerResponse(responseCacheName, null, hookId, undefined, makeError(\"Invalid request: type is required\"));\r\n return;\r\n }\r\n const lowerType = normalizeKey(type);\r\n\r\n if (lowerType === \"cancel\") {\r\n if (requestId) onCancel(requestId);\r\n return;\r\n }\r\n\r\n if (!isNonEmptyString(cacheName)) {\r\n callerResponse(responseCacheName, null, hookId, undefined, makeError(\"Invalid request: cacheName is required\"));\r\n return;\r\n }\r\n const lowerCacheName = normalizeKey(cacheName);\r\n\r\n if (lowerType === \"get\") {\r\n const requestedData = get(lowerCacheName);\r\n if (requestedData === undefined) {\r\n callerResponse(lowerCacheName, null, hookId, undefined, makeError(\"Cache miss\"));\r\n } else {\r\n callerResponse(lowerCacheName, requestedData, hookId);\r\n }\r\n } else if (lowerType === \"set\") {\r\n if (!request) {\r\n if (payload == null) {\r\n callerResponse(\r\n responseCacheName,\r\n null,\r\n hookId,\r\n undefined,\r\n makeError(\"Invalid request: payload is required for set\"),\r\n );\r\n return;\r\n }\r\n set(lowerCacheName, payload);\r\n } else {\r\n const methodLower = normalizeKey(request.method);\r\n if (methodLower !== \"get\" && payload == null) {\r\n callerResponse(\r\n responseCacheName,\r\n null,\r\n hookId,\r\n undefined,\r\n makeError(\"Invalid request: payload is required for non-GET API request\"),\r\n );\r\n return;\r\n }\r\n void apiRequest(lowerCacheName, payload ?? null, request, requestId, hookId);\r\n }\r\n } else if (lowerType === \"delete\") {\r\n remove(lowerCacheName);\r\n callerResponse(lowerCacheName, { deleted: true }, hookId);\r\n }\r\n};\r\n\r\nconst onCancel = (requestId: string): void => {\r\n const controller = inFlightControllers.get(requestId);\r\n if (controller) {\r\n controller.abort();\r\n inFlightControllers.delete(requestId);\r\n }\r\n};\r\n\r\n/**\r\n * Incoming messages from the main thread. Expects payload shape { dataRequest?: DataRequest }.\r\n * Responses via postMessage: { cacheName, data?, meta?, hookId?, httpStatus?, error }.\r\n * error is always present: { message: \"\" } when no error, { message: \"...\" } when the request failed.\r\n */\r\nonmessage = (event: MessageEvent<WorkerMessageData>): void => {\r\n const payload = event.data;\r\n if (payload === null || typeof payload !== \"object\") return;\r\n const dataRequest = payload.dataRequest;\r\n if (dataRequest !== undefined) onRequest(dataRequest);\r\n};\r\n"],"names":["set","hasFile"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.worker.js","sources":["../../../src/shared/workers/api/api.worker.ts"],"sourcesContent":["/// <reference lib=\"webworker\" />\r\n\r\nimport type {\r\n AbortControllers,\r\n BinaryParseResult,\r\n BinaryResponseMeta,\r\n DataRequest,\r\n WorkerApiRequest,\r\n WorkerErrorPayload,\r\n WorkerMessageData,\r\n} from \"../../types/types\";\r\n\r\nexport const BINARY_MARKER = Symbol.for(\"WorkerApiBinary\");\r\n\r\nconst DEFAULT_FILES_FIELD = \"Files\";\r\nconst EMPTY_BUFFER = new ArrayBuffer(0);\r\nconst NO_ERROR: WorkerErrorPayload = { message: \"\" };\r\nconst DEFAULT_ERROR = \"An error occurred\";\r\n\r\nconst callerResponse = (\r\n cacheName: string,\r\n data: unknown,\r\n hookId?: string | null,\r\n httpStatus?: number,\r\n error: WorkerErrorPayload = NO_ERROR,\r\n): void => {\r\n self.postMessage({\r\n cacheName,\r\n data: error.message !== \"\" ? null : (data ?? null),\r\n hookId,\r\n httpStatus,\r\n error,\r\n });\r\n};\r\n\r\nconst makeError = (message: string): WorkerErrorPayload => ({ message });\r\n\r\n/**\r\n * Binary response - transferred via postMessage, not stored in cache.\r\n * Client receives ArrayBuffer + meta for reconstruction (e.g. new Blob([data], { type })).\r\n * Always sends a message; empty/zero-length body uses an empty ArrayBuffer so the client does not hang.\r\n */\r\nconst callerResponseBinary = (\r\n cacheName: string,\r\n data: ArrayBuffer,\r\n meta: BinaryResponseMeta,\r\n hookId?: string | null,\r\n httpStatus?: number,\r\n error: WorkerErrorPayload = NO_ERROR,\r\n): void => {\r\n const buffer = data.byteLength ? data : EMPTY_BUFFER;\r\n const payload = { cacheName, data: buffer, meta, hookId, httpStatus, error };\r\n self.postMessage(payload, buffer.byteLength > 0 ? [buffer] : []);\r\n};\r\n\r\nconst callerResponseStreamStart = (\r\n cacheName: string,\r\n meta: BinaryResponseMeta | null,\r\n hookId?: string | null,\r\n httpStatus?: number,\r\n error: WorkerErrorPayload = NO_ERROR,\r\n): void => {\r\n self.postMessage({\r\n cacheName,\r\n stream: \"start\",\r\n meta,\r\n hookId,\r\n httpStatus,\r\n error,\r\n });\r\n};\r\n\r\nconst callerResponseStreamResume = (\r\n cacheName: string,\r\n meta: BinaryResponseMeta | null,\r\n hookId?: string | null,\r\n httpStatus?: number,\r\n error: WorkerErrorPayload = NO_ERROR,\r\n): void => {\r\n self.postMessage({\r\n cacheName,\r\n stream: \"resume\",\r\n meta,\r\n hookId,\r\n httpStatus,\r\n error,\r\n });\r\n};\r\n\r\nconst callerResponseStreamChunk = (\r\n cacheName: string,\r\n data: ArrayBuffer,\r\n hookId?: string | null,\r\n error: WorkerErrorPayload = NO_ERROR,\r\n): void => {\r\n const buffer = data.byteLength ? data : EMPTY_BUFFER;\r\n const payload = { cacheName, stream: \"chunk\", data: buffer, hookId, error };\r\n self.postMessage(payload, buffer.byteLength > 0 ? [buffer] : []);\r\n};\r\n\r\nconst callerResponseStreamEnd = (\r\n cacheName: string,\r\n hookId?: string | null,\r\n error: WorkerErrorPayload = NO_ERROR,\r\n): void => {\r\n self.postMessage({ cacheName, stream: \"end\", hookId, error });\r\n};\r\n\r\nconst transferableBuffer = (view: Uint8Array): ArrayBuffer =>\r\n view.byteOffset === 0 && view.byteLength === view.buffer.byteLength\r\n ? (view.buffer as ArrayBuffer)\r\n : view.slice(0).buffer;\r\n\r\nconst store = Object.create(null) as Record<string, unknown>;\r\nconst normalizeKey = (key: string) => key.toLocaleLowerCase();\r\nconst get = <TData>(key: string): TData | undefined => store[normalizeKey(key)] as TData | undefined;\r\nconst set = <TData>(key: string, value: TData): void => {\r\n store[normalizeKey(key)] = value;\r\n};\r\nconst remove = (key: string): void => {\r\n delete store[normalizeKey(key)];\r\n};\r\n\r\nconst isNonEmptyString = (v: unknown): v is string => typeof v === \"string\" && v.trim() !== \"\";\r\n\r\n/** Returns headers without Content-Type (either casing). Use when FormData sets it automatically. */\r\nconst omitContentType = (headers: Record<string, string>): Record<string, string> => {\r\n const rest = { ...headers };\r\n delete rest[\"Content-Type\"];\r\n delete rest[\"content-type\"];\r\n return rest;\r\n};\r\n\r\nconst isBinaryResponse = (r: unknown): r is BinaryParseResult =>\r\n typeof r === \"object\" &&\r\n r !== null &&\r\n BINARY_MARKER in r &&\r\n (r as unknown as BinaryParseResult).data instanceof ArrayBuffer;\r\n\r\nconst commit = <TData>(cacheName: string, data: TData, hookId?: string | null, httpStatus?: number): void => {\r\n if (!cacheName) {\r\n callerResponse(\"\", null, hookId, undefined, makeError(\"Invalid commit: cacheName is required\"));\r\n return;\r\n }\r\n set(cacheName, data); // set() normalizes internally - avoid double-normalizing here\r\n callerResponse(cacheName, data, hookId, httpStatus);\r\n};\r\n\r\n/**\r\n * Parses response based on content-type.\r\n * Returns parsed data for JSON/text, or binary result with BINARY_MARKER, data (ArrayBuffer), contentType, contentDisposition.\r\n */\r\nconst parseResponseByContentType = async (response: Response): Promise<unknown> => {\r\n const contentType = response.headers.get(\"content-type\")?.toLocaleLowerCase() || \"\";\r\n const contentLength = response.headers.get(\"content-length\");\r\n\r\n // No content\r\n if (response.status === 204 || contentLength === \"0\") {\r\n return null;\r\n }\r\n\r\n // JSON types - read as text first since chunked responses (no Content-Length) can still be\r\n // empty; parsing \"\" directly with response.json() throws even though an empty JSON body is\r\n // a legitimate, recoverable case rather than a real parse failure.\r\n if (contentType.includes(\"json\")) {\r\n const text = await response.text();\r\n if (text.trim() === \"\") {\r\n return null;\r\n }\r\n return JSON.parse(text);\r\n }\r\n\r\n // Text-based types\r\n if (\r\n contentType.startsWith(\"text/\") ||\r\n contentType.includes(\"xml\") ||\r\n contentType.includes(\"javascript\") ||\r\n contentType.includes(\"x-www-form-urlencoded\")\r\n ) {\r\n return await response.text();\r\n }\r\n\r\n // Binary types (known or fallback) - use arrayBuffer for zero-copy transfer to client\r\n const arrayBuffer = await response.arrayBuffer();\r\n return {\r\n [BINARY_MARKER]: true as const,\r\n data: arrayBuffer,\r\n contentType,\r\n contentDisposition: response.headers.get(\"content-disposition\"),\r\n };\r\n};\r\n\r\n/** File/Blob use fileFieldName (default \"Files\"); all other fields use property name (key). */\r\nconst appendToFormData = (\r\n formData: FormData,\r\n key: string,\r\n value: unknown,\r\n fileFieldName: string = DEFAULT_FILES_FIELD,\r\n visited?: WeakSet<object>,\r\n): boolean => {\r\n if (value instanceof File) {\r\n formData.append(fileFieldName, value, value.name);\r\n return true;\r\n }\r\n\r\n if (value instanceof Blob) {\r\n formData.append(fileFieldName, value, \"blob\");\r\n return true;\r\n }\r\n\r\n if (value !== null && value !== undefined && typeof value === \"object\") {\r\n const set = visited ?? new WeakSet<object>();\r\n if (set.has(value)) return false;\r\n set.add(value);\r\n if (Array.isArray(value)) {\r\n let hasFile = false;\r\n let i = 0;\r\n while (i < value.length) {\r\n hasFile = appendToFormData(formData, key ? `${key}.${i}` : String(i), value[i], fileFieldName, set) || hasFile;\r\n i++;\r\n }\r\n return hasFile;\r\n }\r\n let hasFile = false;\r\n const keys = Object.keys(value);\r\n let ki = 0;\r\n while (ki < keys.length) {\r\n const k = keys[ki] as string;\r\n hasFile =\r\n appendToFormData(\r\n formData,\r\n key ? `${key}.${k}` : k,\r\n (value as Record<string, unknown>)[k],\r\n fileFieldName,\r\n set,\r\n ) || hasFile;\r\n\r\n ki++;\r\n }\r\n return hasFile;\r\n }\r\n\r\n if (value !== undefined && value !== null) {\r\n const primitive = value as string | number | boolean | bigint;\r\n formData.append(key, String(primitive));\r\n }\r\n return false;\r\n};\r\n\r\nconst createFormDataIfBlobOrFile = (\r\n payload: unknown,\r\n fileFieldName: string = DEFAULT_FILES_FIELD,\r\n formDataKey: string = DEFAULT_FILES_FIELD,\r\n): FormData | null => {\r\n if (payload === null || payload === undefined || typeof payload !== \"object\") {\r\n return null;\r\n }\r\n\r\n const formData = new FormData();\r\n const visited = new WeakSet<object>();\r\n const hasFile = appendToFormData(formData, formDataKey, payload, fileFieldName, visited);\r\n return hasFile ? formData : null;\r\n};\r\n\r\nconst getContentType = (headers: Record<string, string> = {}): string =>\r\n headers[\"Content-Type\"] || headers[\"content-type\"] || \"application/json\";\r\n\r\nconst getPayloadType = (payload: unknown): string => {\r\n switch (true) {\r\n case payload instanceof FormData:\r\n return \"formdata\";\r\n case payload instanceof Blob:\r\n return \"blob\";\r\n case payload instanceof ArrayBuffer:\r\n return \"arraybuffer\";\r\n case ArrayBuffer.isView(payload):\r\n return \"arraybufferview\";\r\n case typeof ReadableStream !== \"undefined\" && payload instanceof ReadableStream:\r\n return \"stream\";\r\n case typeof payload === \"string\":\r\n return \"string\";\r\n default:\r\n return \"object\";\r\n }\r\n};\r\n\r\nconst buildJsonBody = (payload: unknown): BodyInit => JSON.stringify(payload);\r\n\r\n/**\r\n * Builds a URL-encoded body from a flat object. Values must be primitives (string/number/boolean) -\r\n * nested objects/arrays cannot be represented and throw rather than silently serializing to\r\n * \"[object Object]\". null/undefined values are skipped.\r\n */\r\nconst buildUrlEncodedBody = (payload: Record<string, unknown>): BodyInit => {\r\n const params = new URLSearchParams();\r\n const keys = Object.keys(payload);\r\n let i = 0;\r\n while (i < keys.length) {\r\n const key = keys[i] as string;\r\n const value = payload[key];\r\n if (value !== null && value !== undefined) {\r\n if (typeof value === \"object\") {\r\n throw new Error(`Cannot url-encode non-primitive value for key \"${key}\"`);\r\n }\r\n //params.append(key, String(value as string | number | boolean | bigint));\r\n // params.append(key, String(value));\r\n params.append(key, (value as string | number | boolean | bigint).toString());\r\n }\r\n i++;\r\n }\r\n return params.toString();\r\n};\r\n\r\nconst buildTextBody = (payload: unknown): BodyInit => String(payload);\r\n\r\n/**\r\n * Builds body and headers for fetch. Each branch handles one payload type; add new cases here for new body types.\r\n *\r\n * Object payloads are always checked for nested File/Blob values first (createFormDataIfBlobOrFile).\r\n * If any are found, the request is automatically sent as multipart/form-data and any Content-Type\r\n * header the caller passed in is overwritten/omitted - the browser must set its own Content-Type\r\n * (including the multipart boundary) for the body to be parsed correctly server-side. Callers no\r\n * longer need to manually set Content-Type: multipart/form-data to get file uploads to work; it is\r\n * detected automatically, including files nested arbitrarily deep in the payload (e.g.\r\n * { photos: File[], videos: File[] }). Every File/Blob found is appended under the same\r\n * fileFieldName (default \"Files\", override via formDataFileFieldName) regardless of which property\r\n * it came from - this matches the common API convention of collecting all uploaded files under one\r\n * repeated field name. If a caller does pass Content-Type: multipart/form-data but the payload has\r\n * no actual File/Blob in it, we fall back to JSON and correct the header rather than sending a JSON\r\n * body mislabeled as multipart.\r\n */\r\nconst prepareRequestBody = (\r\n payload: unknown,\r\n headers: Record<string, string>,\r\n options?: { formDataFileFieldName?: string; formDataKey?: string },\r\n): { body?: BodyInit; headers: Record<string, string> } => {\r\n const payloadType = getPayloadType(payload);\r\n\r\n switch (payloadType) {\r\n case \"formdata\":\r\n return {\r\n body: payload as FormData,\r\n headers: omitContentType({ ...headers }),\r\n };\r\n case \"blob\":\r\n return { body: payload as Blob, headers: { ...headers } };\r\n case \"arraybuffer\":\r\n return { body: payload as ArrayBuffer, headers: { ...headers } };\r\n case \"arraybufferview\":\r\n return { body: payload as BodyInit, headers: { ...headers } };\r\n case \"stream\":\r\n return {\r\n body: payload as ReadableStream<Uint8Array>,\r\n headers: { ...headers },\r\n };\r\n case \"string\":\r\n return { body: payload as string, headers: { ...headers } };\r\n case \"object\": {\r\n const fileFieldName = options?.formDataFileFieldName ?? DEFAULT_FILES_FIELD;\r\n const formDataKey = options?.formDataKey ?? DEFAULT_FILES_FIELD;\r\n\r\n // Auto-detect File/Blob anywhere in the payload (including nested, e.g. { photos: File[] }).\r\n // If found, always send as multipart/form-data - Content-Type is omitted so the browser\r\n // sets it itself (including the boundary).\r\n const formData = createFormDataIfBlobOrFile(payload, fileFieldName, formDataKey);\r\n if (formData) {\r\n return { body: formData, headers: omitContentType({ ...headers }) };\r\n }\r\n\r\n const h = { ...headers };\r\n let contentType = getContentType(h);\r\n\r\n // No File/Blob found: a declared multipart/form-data would produce an invalid body\r\n // (JSON string labeled as multipart), so fall back to JSON and fix the header.\r\n if (contentType.includes(\"multipart/form-data\")) {\r\n contentType = \"application/json\";\r\n delete h[\"Content-Type\"];\r\n delete h[\"content-type\"];\r\n }\r\n\r\n let body: BodyInit;\r\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\r\n body = buildUrlEncodedBody(payload as Record<string, unknown>);\r\n } else if (contentType.startsWith(\"text/\") || contentType.includes(\"xml\")) {\r\n body = buildTextBody(payload);\r\n } else {\r\n body = buildJsonBody(payload);\r\n }\r\n\r\n if (!h[\"Content-Type\"] && !h[\"content-type\"]) {\r\n h[\"Content-Type\"] = contentType;\r\n }\r\n return { body, headers: h };\r\n }\r\n\r\n default:\r\n return { headers: { ...headers } };\r\n }\r\n};\r\n\r\nconst inFlightControllers: AbortControllers = new Map();\r\nconst inFlightByCacheName = new Map<string, Promise<void>>();\r\n\r\nconst apiRequest = async <TData>(\r\n cacheName: string,\r\n payload: TData | FormData | null,\r\n {\r\n url,\r\n method,\r\n headers = {},\r\n mode = \"cors\",\r\n credentials = \"same-origin\",\r\n responseType,\r\n timeoutMs,\r\n formDataFileFieldName,\r\n formDataKey,\r\n retries,\r\n }: WorkerApiRequest,\r\n requestId?: string | null,\r\n hookId?: string | null,\r\n): Promise<void> => {\r\n const methodLower = method.toLocaleLowerCase();\r\n const responseTypeLower = responseType?.toLocaleLowerCase();\r\n\r\n // Early return (cached then fresh) allowed for any HTTP method, except when response is binary or streaming.\r\n const skipInFlightDedupe = responseTypeLower === \"binary\" || responseTypeLower === \"stream\";\r\n if (!skipInFlightDedupe) {\r\n const existing = inFlightByCacheName.get(cacheName);\r\n if (existing) {\r\n // Joining an in-flight request by cacheName: this caller does not get its own\r\n // AbortController registered (only the original request's requestId is tracked in\r\n // inFlightControllers below), so calling cancel with this caller's requestId is a no-op -\r\n // the original in-flight request keeps running for whoever else is awaiting it too.\r\n const cached = get(cacheName);\r\n if (cached !== undefined) callerResponse(cacheName, cached, hookId);\r\n await existing;\r\n const fresh = get(cacheName);\r\n if (fresh !== undefined) callerResponse(cacheName, fresh, hookId);\r\n return;\r\n }\r\n }\r\n\r\n const controller = new AbortController();\r\n if (requestId) {\r\n inFlightControllers.set(requestId, controller);\r\n }\r\n\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n if (timeoutMs != null && timeoutMs > 0) {\r\n timeoutId = setTimeout(() => controller.abort(), timeoutMs);\r\n }\r\n\r\n const promise = (async (): Promise<void> => {\r\n const fetchOptions: RequestInit = {\r\n method,\r\n mode,\r\n credentials,\r\n signal: controller.signal,\r\n };\r\n\r\n try {\r\n if (methodLower !== \"get\" && payload != null) {\r\n const prepareOptions: {\r\n formDataFileFieldName?: string;\r\n formDataKey?: string;\r\n } = {};\r\n if (formDataFileFieldName != null && formDataFileFieldName !== \"\")\r\n prepareOptions.formDataFileFieldName = formDataFileFieldName;\r\n if (formDataKey != null && formDataKey !== \"\") prepareOptions.formDataKey = formDataKey;\r\n // Body preparation (JSON.stringify, FormData building, url-encoding) can throw\r\n // synchronously (e.g. circular references, non-primitive url-encoded values). This must\r\n // stay inside the try/catch below - a throw here previously rejected this IIFE with no\r\n // handler, left the caller waiting on a postMessage that never arrives, and skipped the\r\n // finally block, permanently leaking this cacheName/requestId from the in-flight maps.\r\n const { body, headers: processedHeaders } = prepareRequestBody(payload, headers, prepareOptions);\r\n if (body !== undefined) fetchOptions.body = body;\r\n fetchOptions.headers = processedHeaders;\r\n } else {\r\n fetchOptions.headers = omitContentType({ ...headers });\r\n }\r\n\r\n if (responseTypeLower === \"stream\") {\r\n const maxRetries = Math.min(retries ?? 3, 5);\r\n let bytesReceived = 0;\r\n let streamError: WorkerErrorPayload = NO_ERROR;\r\n let attempt = 0;\r\n while (attempt <= maxRetries) {\r\n try {\r\n const reqHeaders =\r\n methodLower === \"get\" ? omitContentType({ ...fetchOptions.headers }) : { ...fetchOptions.headers };\r\n if (bytesReceived > 0) reqHeaders[\"Range\"] = `bytes=${bytesReceived}-`;\r\n const streamResponse = await fetch(url, {\r\n ...fetchOptions,\r\n headers: reqHeaders,\r\n });\r\n if (streamResponse.status >= 400) {\r\n streamError = makeError(streamResponse.statusText || DEFAULT_ERROR);\r\n break;\r\n }\r\n if (streamResponse.status === 204) {\r\n callerResponseStreamEnd(cacheName, hookId);\r\n return;\r\n }\r\n if (streamResponse.status === 416) break;\r\n const contentType = streamResponse.headers.get(\"content-type\") ?? undefined;\r\n const meta: BinaryResponseMeta = {\r\n contentDisposition: streamResponse.headers.get(\"content-disposition\") ?? null,\r\n ...(contentType !== undefined && { contentType }),\r\n };\r\n if (bytesReceived === 0) callerResponseStreamStart(cacheName, meta, hookId, streamResponse.status);\r\n else callerResponseStreamResume(cacheName, meta, hookId, streamResponse.status);\r\n const body = streamResponse.body;\r\n if (!body) {\r\n callerResponseStreamEnd(cacheName, hookId);\r\n return;\r\n }\r\n const reader = body.getReader();\r\n let skipRemaining = streamResponse.status === 200 && bytesReceived > 0 ? bytesReceived : 0;\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n if (!value || value.byteLength === 0) continue;\r\n if (skipRemaining > 0) {\r\n if (value.byteLength <= skipRemaining) {\r\n skipRemaining -= value.byteLength;\r\n continue;\r\n }\r\n const offset = skipRemaining;\r\n skipRemaining = 0;\r\n const tail = value.subarray(offset);\r\n callerResponseStreamChunk(cacheName, transferableBuffer(tail), hookId);\r\n bytesReceived += tail.byteLength;\r\n } else {\r\n callerResponseStreamChunk(cacheName, transferableBuffer(value), hookId);\r\n bytesReceived += value.byteLength;\r\n }\r\n }\r\n break;\r\n } catch (err) {\r\n streamError =\r\n (err as Error).name === \"AbortError\" ? makeError(\"Request aborted\") : makeError((err as Error).message);\r\n if (attempt === maxRetries) break;\r\n }\r\n attempt++;\r\n }\r\n callerResponseStreamEnd(cacheName, hookId, streamError);\r\n return;\r\n }\r\n\r\n const response = await fetch(url, fetchOptions);\r\n\r\n if (response.status >= 400) {\r\n callerResponse(cacheName, null, hookId, response.status, makeError(response.statusText || DEFAULT_ERROR));\r\n return;\r\n }\r\n\r\n if (response.status === 204) {\r\n set(cacheName, null); // set() normalizes internally - avoid double-normalizing here\r\n callerResponse(cacheName, null, hookId, 204);\r\n return;\r\n }\r\n\r\n const responseData = await parseResponseByContentType(response);\r\n\r\n if (isBinaryResponse(responseData)) {\r\n callerResponseBinary(\r\n cacheName,\r\n responseData.data,\r\n {\r\n contentType: responseData.contentType,\r\n contentDisposition: responseData.contentDisposition ?? null,\r\n },\r\n hookId,\r\n response.status,\r\n );\r\n } else {\r\n commit(cacheName, responseData, hookId, response.status);\r\n }\r\n } catch (error) {\r\n if ((error as Error).name === \"AbortError\") {\r\n callerResponse(cacheName, null, hookId, undefined, makeError(\"Request aborted\"));\r\n return;\r\n }\r\n const err = error as Error;\r\n callerResponse(cacheName, null, hookId, undefined, makeError(err.message));\r\n } finally {\r\n if (timeoutId != null) clearTimeout(timeoutId);\r\n if (requestId) {\r\n inFlightControllers.delete(requestId);\r\n }\r\n inFlightByCacheName.delete(cacheName);\r\n }\r\n })();\r\n\r\n if (!skipInFlightDedupe) {\r\n inFlightByCacheName.set(cacheName, promise);\r\n }\r\n\r\n await promise;\r\n};\r\n\r\nconst onRequest = <TData>(dataRequest: DataRequest<TData>): void => {\r\n const { cacheName, type, payload, request, requestId, hookId } = dataRequest;\r\n const responseCacheName = dataRequest.cacheName ?? \"\";\r\n\r\n if (!isNonEmptyString(type)) {\r\n callerResponse(responseCacheName, null, hookId, undefined, makeError(\"Invalid request: type is required\"));\r\n return;\r\n }\r\n const lowerType = normalizeKey(type);\r\n\r\n if (lowerType === \"cancel\") {\r\n if (requestId) onCancel(requestId);\r\n return;\r\n }\r\n\r\n if (!isNonEmptyString(cacheName)) {\r\n callerResponse(responseCacheName, null, hookId, undefined, makeError(\"Invalid request: cacheName is required\"));\r\n return;\r\n }\r\n const lowerCacheName = normalizeKey(cacheName);\r\n\r\n if (lowerType === \"get\") {\r\n const requestedData = get(lowerCacheName);\r\n if (requestedData === undefined) {\r\n callerResponse(lowerCacheName, null, hookId, undefined, makeError(\"Cache miss\"));\r\n } else {\r\n callerResponse(lowerCacheName, requestedData, hookId);\r\n }\r\n } else if (lowerType === \"set\") {\r\n if (!request) {\r\n if (payload == null) {\r\n callerResponse(\r\n responseCacheName,\r\n null,\r\n hookId,\r\n undefined,\r\n makeError(\"Invalid request: payload is required for set\"),\r\n );\r\n return;\r\n }\r\n set(lowerCacheName, payload);\r\n } else {\r\n const methodLower = normalizeKey(request.method);\r\n if (methodLower !== \"get\" && payload == null) {\r\n callerResponse(\r\n responseCacheName,\r\n null,\r\n hookId,\r\n undefined,\r\n makeError(\"Invalid request: payload is required for non-GET API request\"),\r\n );\r\n return;\r\n }\r\n void apiRequest(lowerCacheName, payload ?? null, request, requestId, hookId);\r\n }\r\n } else if (lowerType === \"delete\") {\r\n remove(lowerCacheName);\r\n callerResponse(lowerCacheName, { deleted: true }, hookId);\r\n }\r\n};\r\n\r\n/**\r\n * Aborts the in-flight request registered under requestId, if any. Note: if that request was\r\n * joined/deduped by another caller via inFlightByCacheName (same cacheName, request already in\r\n * flight), this only aborts the original request's controller - the joined caller was never\r\n * registered with its own controller/requestId, so it has nothing to cancel independently.\r\n */\r\nconst onCancel = (requestId: string): void => {\r\n const controller = inFlightControllers.get(requestId);\r\n if (controller) {\r\n controller.abort();\r\n inFlightControllers.delete(requestId);\r\n }\r\n};\r\n\r\n/**\r\n * Incoming messages from the main thread. Expects payload shape { dataRequest?: DataRequest }.\r\n * Responses via postMessage: { cacheName, data?, meta?, hookId?, httpStatus?, error }.\r\n * error is always present: { message: \"\" } when no error, { message: \"...\" } when the request failed.\r\n */\r\nonmessage = (event: MessageEvent<WorkerMessageData>): void => {\r\n const payload = event.data;\r\n if (payload === null || typeof payload !== \"object\") return;\r\n const dataRequest = payload.dataRequest;\r\n if (dataRequest !== undefined) onRequest(dataRequest);\r\n};\r\n"],"names":["set","hasFile"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mainframework/api-request-worker",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Offloads API requests and application state to a Web Worker to keep the UI thread fast.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/shared/output/vanilla.js",
|
|
@@ -26,7 +26,6 @@
|
|
|
26
26
|
},
|
|
27
27
|
"homepage": "https://github.com/TerrySlack/mainframework-apiworkere",
|
|
28
28
|
"scripts": {
|
|
29
|
-
"husky-setup": "npx husky init",
|
|
30
29
|
"husky": "husky",
|
|
31
30
|
"prepare": "husky",
|
|
32
31
|
"clean": "rimraf dist tsconfig.tsbuildinfo",
|
|
@@ -66,30 +65,30 @@
|
|
|
66
65
|
"license": "MIT",
|
|
67
66
|
"devDependencies": {
|
|
68
67
|
"@eslint/js": "^10.0.1",
|
|
69
|
-
"@mainframework/is-deep-equal": "^1.0.
|
|
68
|
+
"@mainframework/is-deep-equal": "^1.0.11",
|
|
70
69
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
71
70
|
"@rollup/plugin-replace": "^6.0.3",
|
|
72
71
|
"@testing-library/dom": "^10.4.1",
|
|
73
72
|
"@testing-library/react": "^16.3.2",
|
|
74
|
-
"@types/react": "^19.2.
|
|
75
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
76
|
-
"@typescript-eslint/parser": "^8.
|
|
77
|
-
"esbuild": "^0.
|
|
78
|
-
"eslint": "10.0
|
|
73
|
+
"@types/react": "^19.2.17",
|
|
74
|
+
"@typescript-eslint/eslint-plugin": "^8.62.1",
|
|
75
|
+
"@typescript-eslint/parser": "^8.62.1",
|
|
76
|
+
"esbuild": "^0.28.1",
|
|
77
|
+
"eslint": "10.6.0",
|
|
79
78
|
"eslint-plugin-react": "^7.37.5",
|
|
80
|
-
"eslint-plugin-react-hooks": "^7.
|
|
81
|
-
"globals": "^17.
|
|
79
|
+
"eslint-plugin-react-hooks": "^7.1.1",
|
|
80
|
+
"globals": "^17.7.0",
|
|
82
81
|
"husky": "^9.1.7",
|
|
83
|
-
"lint-staged": "^
|
|
84
|
-
"prettier": "^3.
|
|
85
|
-
"react": "^19.2.
|
|
86
|
-
"react-dom": "^19.2.
|
|
82
|
+
"lint-staged": "^17.0.8",
|
|
83
|
+
"prettier": "^3.9.4",
|
|
84
|
+
"react": "^19.2.7",
|
|
85
|
+
"react-dom": "^19.2.7",
|
|
87
86
|
"rimraf": "^6.1.3",
|
|
88
|
-
"rollup": "^4.
|
|
89
|
-
"rollup-plugin-dts": "^6.
|
|
87
|
+
"rollup": "^4.62.2",
|
|
88
|
+
"rollup-plugin-dts": "^6.4.1",
|
|
90
89
|
"rollup-plugin-esbuild": "^6.2.1",
|
|
91
90
|
"tslib": "^2.8.1",
|
|
92
|
-
"typescript": "^
|
|
93
|
-
"typescript-eslint": "^8.
|
|
91
|
+
"typescript": "^6.0.3",
|
|
92
|
+
"typescript-eslint": "^8.62.1"
|
|
94
93
|
}
|
|
95
94
|
}
|