@mainframework/api-request-worker 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -50
- package/dist/shared/output/react.d.ts +3 -3
- package/dist/shared/output/react.js +132 -67
- package/dist/shared/output/react.js.map +1 -1
- package/dist/shared/output/vanilla.d.ts +1 -1
- package/dist/shared/output/vanilla.js +1 -1
- package/dist/shared/output/vanilla.js.map +1 -1
- package/dist/{types-LYmxol0c.d.ts → types-C6nnvGO7.d.ts} +23 -49
- package/dist/workers/api/api.worker.js +202 -64
- package/dist/workers/api/api.worker.js.map +1 -1
- package/package.json +12 -9
|
@@ -1 +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\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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"}
|
|
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 BinaryParseResult,\r\n BinaryResponseMeta,\r\n DataRequest,\r\n WorkerApiRequest,\r\n WorkerErrorCode,\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 type: \"result\" | \"delete\" = \"result\",\r\n requestId?: string | null,\r\n): void => {\r\n self.postMessage({\r\n type,\r\n ...(requestId != null && requestId !== \"\" && { requestId }),\r\n cacheName,\r\n data: type === \"delete\" ? null : 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, code?: WorkerErrorCode): WorkerErrorPayload =>\r\n code !== undefined ? { message, code } : { 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 requestId?: string | null,\r\n): void => {\r\n const buffer = data.byteLength ? data : EMPTY_BUFFER;\r\n const payload = {\r\n type: \"result\" as const,\r\n ...(requestId != null && requestId !== \"\" && { requestId }),\r\n cacheName,\r\n data: buffer,\r\n meta,\r\n hookId,\r\n httpStatus,\r\n error,\r\n };\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 requestId?: string | null,\r\n): void => {\r\n self.postMessage({\r\n type: \"stream\" as const,\r\n ...(requestId != null && requestId !== \"\" && { requestId }),\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 requestId?: string | null,\r\n): void => {\r\n self.postMessage({\r\n type: \"stream\" as const,\r\n ...(requestId != null && requestId !== \"\" && { requestId }),\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 requestId?: string | null,\r\n): void => {\r\n const buffer = data.byteLength ? data : EMPTY_BUFFER;\r\n const payload = {\r\n type: \"stream\" as const,\r\n ...(requestId != null && requestId !== \"\" && { requestId }),\r\n cacheName,\r\n stream: \"chunk\" as const,\r\n data: buffer,\r\n hookId,\r\n error,\r\n };\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 requestId?: string | null,\r\n): void => {\r\n self.postMessage({\r\n type: \"stream\" as const,\r\n ...(requestId != null && requestId !== \"\" && { requestId }),\r\n cacheName,\r\n stream: \"end\",\r\n hookId,\r\n error,\r\n });\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 storeActivity = new Map<string, number>();\r\nconst STALE_ENTRY_MS = 5000;\r\nconst CLEANUP_INTERVAL_MS = 30000;\r\n\r\nconst normalizeKey = (key: string) => key.toLocaleLowerCase();\r\nconst touchActivity = (key: string): void => {\r\n storeActivity.set(normalizeKey(key), Date.now());\r\n};\r\nconst get = <TData>(key: string): TData | undefined => {\r\n const nk = normalizeKey(key);\r\n touchActivity(nk);\r\n return store[nk] as TData | undefined;\r\n};\r\nconst set = <TData>(key: string, value: TData): void => {\r\n const nk = normalizeKey(key);\r\n store[nk] = value;\r\n touchActivity(nk);\r\n};\r\nconst remove = (key: string): void => {\r\n const nk = normalizeKey(key);\r\n delete store[nk];\r\n storeActivity.delete(nk);\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>(\r\n cacheName: string,\r\n data: TData,\r\n hookId?: string | null,\r\n httpStatus?: number,\r\n requestId?: string | null,\r\n): void => {\r\n if (!cacheName) {\r\n callerResponse(\r\n \"\",\r\n null,\r\n hookId,\r\n undefined,\r\n makeError(\"Invalid commit: cacheName is required\", \"validation\"),\r\n \"result\",\r\n requestId,\r\n );\r\n return;\r\n }\r\n set(cacheName, data); // set() normalizes internally - avoid double-normalizing here\r\n touchActivity(cacheName);\r\n callerResponse(cacheName, data, hookId, httpStatus, NO_ERROR, \"result\", requestId);\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 visitedSet = visited ?? new WeakSet<object>();\r\n if (visitedSet.has(value)) return false;\r\n visitedSet.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 =\r\n appendToFormData(formData, key ? `${key}.${i}` : String(i), value[i], fileFieldName, visitedSet) || 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 visitedSet,\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, (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\ntype InFlightEntry = {\r\n promise: Promise<void>;\r\n controller: AbortController;\r\n requestIds: Set<string>;\r\n};\r\nconst inFlightByCacheName = new Map<string, InFlightEntry>();\r\nconst requestIdToCacheName = new Map<string, string>();\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 if (requestId) {\r\n existing.requestIds.add(requestId);\r\n requestIdToCacheName.set(requestId, cacheName);\r\n }\r\n const cached = get(cacheName);\r\n if (cached !== undefined) callerResponse(cacheName, cached, hookId, undefined, NO_ERROR, \"result\", requestId);\r\n await existing.promise;\r\n const fresh = get(cacheName);\r\n if (fresh !== undefined) callerResponse(cacheName, fresh, hookId, undefined, NO_ERROR, \"result\", requestId);\r\n return;\r\n }\r\n }\r\n\r\n const controller = new AbortController();\r\n const requestIds = new Set<string>();\r\n const inflightKey = skipInFlightDedupe && requestId ? requestId : cacheName;\r\n if (requestId) {\r\n requestIds.add(requestId);\r\n requestIdToCacheName.set(requestId, inflightKey);\r\n }\r\n\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n let abortedByTimeout = false;\r\n if (timeoutMs != null && timeoutMs > 0) {\r\n timeoutId = setTimeout(() => {\r\n abortedByTimeout = true;\r\n controller.abort();\r\n }, 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 let isPermanentError = false;\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, \"http\");\r\n isPermanentError = true;\r\n break;\r\n }\r\n if (streamResponse.status === 204) {\r\n callerResponseStreamEnd(cacheName, hookId, NO_ERROR, requestId);\r\n return;\r\n }\r\n if (streamResponse.status === 416) {\r\n streamError = makeError(\"Range Not Satisfiable\", \"http\");\r\n isPermanentError = true;\r\n break;\r\n }\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)\r\n callerResponseStreamStart(cacheName, meta, hookId, streamResponse.status, NO_ERROR, requestId);\r\n else callerResponseStreamResume(cacheName, meta, hookId, streamResponse.status, NO_ERROR, requestId);\r\n const body = streamResponse.body;\r\n if (!body) {\r\n callerResponseStreamEnd(cacheName, hookId, NO_ERROR, requestId);\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, NO_ERROR, requestId);\r\n bytesReceived += tail.byteLength;\r\n } else {\r\n callerResponseStreamChunk(cacheName, transferableBuffer(value), hookId, NO_ERROR, requestId);\r\n bytesReceived += value.byteLength;\r\n }\r\n }\r\n break;\r\n } catch (err) {\r\n if ((err as Error).name === \"AbortError\") {\r\n streamError = makeError(\"Request aborted\", abortedByTimeout ? \"timeout\" : \"aborted\");\r\n isPermanentError = true;\r\n break;\r\n }\r\n streamError = makeError((err as Error).message, \"network\");\r\n if (attempt === maxRetries) break;\r\n }\r\n if (isPermanentError) break;\r\n attempt++;\r\n }\r\n callerResponseStreamEnd(cacheName, hookId, streamError, requestId);\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(\r\n cacheName,\r\n null,\r\n hookId,\r\n response.status,\r\n makeError(response.statusText || DEFAULT_ERROR, \"http\"),\r\n \"result\",\r\n requestId,\r\n );\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, NO_ERROR, \"result\", requestId);\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 NO_ERROR,\r\n requestId,\r\n );\r\n } else {\r\n commit(cacheName, responseData, hookId, response.status, requestId);\r\n }\r\n } catch (error) {\r\n if ((error as Error).name === \"AbortError\") {\r\n callerResponse(\r\n cacheName,\r\n null,\r\n hookId,\r\n undefined,\r\n makeError(\"Request aborted\", abortedByTimeout ? \"timeout\" : \"aborted\"),\r\n \"result\",\r\n requestId,\r\n );\r\n return;\r\n }\r\n const err = error as Error;\r\n callerResponse(cacheName, null, hookId, undefined, makeError(err.message, \"network\"), \"result\", requestId);\r\n } finally {\r\n if (timeoutId != null) clearTimeout(timeoutId);\r\n for (const id of requestIds) {\r\n requestIdToCacheName.delete(id);\r\n }\r\n inFlightByCacheName.delete(inflightKey);\r\n }\r\n })();\r\n\r\n const entry: InFlightEntry = { promise, controller, requestIds };\r\n inFlightByCacheName.set(inflightKey, entry);\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\r\n if (!isNonEmptyString(type)) {\r\n callerResponse(\r\n cacheName ?? \"\",\r\n null,\r\n hookId,\r\n undefined,\r\n makeError(\"Invalid request: type is required\", \"validation\"),\r\n \"result\",\r\n requestId,\r\n );\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(\r\n cacheName ?? \"\",\r\n null,\r\n hookId,\r\n undefined,\r\n makeError(\"Invalid request: cacheName is required\", \"validation\"),\r\n \"result\",\r\n requestId,\r\n );\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(\r\n lowerCacheName,\r\n null,\r\n hookId,\r\n undefined,\r\n makeError(\"Cache miss\", \"validation\"),\r\n \"result\",\r\n requestId,\r\n );\r\n } else {\r\n callerResponse(lowerCacheName, requestedData, hookId, undefined, NO_ERROR, \"result\", requestId);\r\n }\r\n } else if (lowerType === \"set\") {\r\n if (!request) {\r\n if (payload == null) {\r\n callerResponse(\r\n cacheName ?? \"\",\r\n null,\r\n hookId,\r\n undefined,\r\n makeError(\"Invalid request: payload is required for set\", \"validation\"),\r\n \"result\",\r\n requestId,\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 cacheName ?? \"\",\r\n null,\r\n hookId,\r\n undefined,\r\n makeError(\"Invalid request: payload is required for non-GET API request\", \"validation\"),\r\n \"result\",\r\n requestId,\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, null, hookId, undefined, NO_ERROR, \"delete\", requestId);\r\n }\r\n};\r\n\r\nconst onCancel = (requestId: string): void => {\r\n const inflightKey = requestIdToCacheName.get(requestId);\r\n if (!inflightKey) return;\r\n\r\n const entry = inFlightByCacheName.get(inflightKey);\r\n if (!entry) {\r\n requestIdToCacheName.delete(requestId);\r\n return;\r\n }\r\n\r\n entry.requestIds.delete(requestId);\r\n requestIdToCacheName.delete(requestId);\r\n\r\n if (entry.requestIds.size === 0) {\r\n entry.controller.abort();\r\n }\r\n};\r\n\r\nconst runStaleStoreCleanup = (): void => {\r\n const now = Date.now();\r\n for (const [key, lastAccessAt] of storeActivity) {\r\n if (now - lastAccessAt < STALE_ENTRY_MS) continue;\r\n if (inFlightByCacheName.has(key)) continue;\r\n delete store[key];\r\n storeActivity.delete(key);\r\n }\r\n};\r\n\r\nsetInterval(runStaleStoreCleanup, CLEANUP_INTERVAL_MS);\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":["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.4",
|
|
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",
|
|
@@ -24,14 +24,14 @@
|
|
|
24
24
|
"bugs": {
|
|
25
25
|
"url": "https://github.com/TerrySlack/mainframework-apiworker/issues"
|
|
26
26
|
},
|
|
27
|
-
"homepage": "https://github.com/TerrySlack/mainframework-
|
|
27
|
+
"homepage": "https://github.com/TerrySlack/mainframework-apiworker",
|
|
28
28
|
"scripts": {
|
|
29
29
|
"husky": "husky",
|
|
30
30
|
"prepare": "husky",
|
|
31
31
|
"clean": "rimraf dist tsconfig.tsbuildinfo",
|
|
32
32
|
"lint-staged": "lint-staged",
|
|
33
33
|
"prebuild": "yarn husky && yarn clean",
|
|
34
|
-
"build": "
|
|
34
|
+
"build": "rollup -c",
|
|
35
35
|
"tscheck": "tsc"
|
|
36
36
|
},
|
|
37
37
|
"lint-staged": {
|
|
@@ -64,23 +64,26 @@
|
|
|
64
64
|
"author": "Terry Slack",
|
|
65
65
|
"license": "MIT",
|
|
66
66
|
"devDependencies": {
|
|
67
|
+
"@babel/core": "8",
|
|
68
|
+
"@babel/plugin-syntax-typescript": "8",
|
|
67
69
|
"@eslint/js": "^10.0.1",
|
|
68
|
-
"@
|
|
70
|
+
"@rollup/plugin-babel": "^7.1.0",
|
|
69
71
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
70
72
|
"@rollup/plugin-replace": "^6.0.3",
|
|
71
73
|
"@testing-library/dom": "^10.4.1",
|
|
72
74
|
"@testing-library/react": "^16.3.2",
|
|
73
75
|
"@types/react": "^19.2.17",
|
|
74
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
75
|
-
"@typescript-eslint/parser": "^8.
|
|
76
|
+
"@typescript-eslint/eslint-plugin": "^8.63.0",
|
|
77
|
+
"@typescript-eslint/parser": "^8.63.0",
|
|
78
|
+
"babel-plugin-react-compiler": "^1.0.0",
|
|
76
79
|
"esbuild": "^0.28.1",
|
|
77
|
-
"eslint": "10.
|
|
80
|
+
"eslint": "10.7.0",
|
|
78
81
|
"eslint-plugin-react": "^7.37.5",
|
|
79
82
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
80
83
|
"globals": "^17.7.0",
|
|
81
84
|
"husky": "^9.1.7",
|
|
82
85
|
"lint-staged": "^17.0.8",
|
|
83
|
-
"prettier": "^3.9.
|
|
86
|
+
"prettier": "^3.9.5",
|
|
84
87
|
"react": "^19.2.7",
|
|
85
88
|
"react-dom": "^19.2.7",
|
|
86
89
|
"rimraf": "^6.1.3",
|
|
@@ -89,6 +92,6 @@
|
|
|
89
92
|
"rollup-plugin-esbuild": "^6.2.1",
|
|
90
93
|
"tslib": "^2.8.1",
|
|
91
94
|
"typescript": "^6.0.3",
|
|
92
|
-
"typescript-eslint": "^8.
|
|
95
|
+
"typescript-eslint": "^8.63.0"
|
|
93
96
|
}
|
|
94
97
|
}
|