accessio 1.3.0 → 1.4.0
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/cjs/accessio.cjs +68 -84
- package/cjs/accessio.cjs.map +1 -1
- package/cjs/core/accessioError.cjs +23 -1
- package/cjs/core/accessioError.cjs.map +1 -1
- package/cjs/core/buildURL.cjs +10 -4
- package/cjs/core/buildURL.cjs.map +1 -1
- package/cjs/core/fetchAdapter.cjs +122 -106
- package/cjs/core/fetchAdapter.cjs.map +1 -1
- package/cjs/core/request.cjs +73 -23
- package/cjs/core/request.cjs.map +1 -1
- package/cjs/helpers/debug.cjs +7 -1
- package/cjs/helpers/debug.cjs.map +1 -1
- package/cjs/helpers/settle.cjs +1 -1
- package/cjs/helpers/settle.cjs.map +1 -1
- package/cjs/interceptors/interceptorManager.cjs +25 -18
- package/cjs/interceptors/interceptorManager.cjs.map +1 -1
- package/index.d.ts +82 -21
- package/package.json +2 -2
- package/src/accessio.ts +104 -98
- package/src/core/accessioError.ts +26 -1
- package/src/core/buildURL.ts +14 -4
- package/src/core/fetchAdapter.ts +152 -125
- package/src/core/request.ts +85 -27
- package/src/helpers/debug.ts +7 -2
- package/src/helpers/settle.ts +1 -1
- package/src/interceptors/interceptorManager.ts +26 -19
|
@@ -52,7 +52,7 @@ async function readResponseData(fetchResponse, config) {
|
|
|
52
52
|
return JSON.parse(text);
|
|
53
53
|
} catch (err) {
|
|
54
54
|
throw new import_accessioError.default(
|
|
55
|
-
`Failed to parse JSON response: ${err.message}. Raw body: ${text.length > 500 ? text.slice(0, 500)
|
|
55
|
+
`Failed to parse JSON response: ${err.message}. Raw body: ${text.length > 500 ? `${text.slice(0, 500)}\u2026` : text}`,
|
|
56
56
|
import_accessioError.default.ERR_BAD_RESPONSE,
|
|
57
57
|
config,
|
|
58
58
|
fetchResponse,
|
|
@@ -64,11 +64,21 @@ async function readResponseData(fetchResponse, config) {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
function assertValidURL(fullURL, config) {
|
|
68
|
+
if (!fullURL || !/^[a-z][a-z\d+\-.]*:/i.test(fullURL)) return;
|
|
69
|
+
try {
|
|
70
|
+
new URL(fullURL);
|
|
71
|
+
} catch {
|
|
72
|
+
throw new import_accessioError.default(
|
|
73
|
+
`Invalid URL: ${fullURL}`,
|
|
74
|
+
import_accessioError.default.ERR_INVALID_URL,
|
|
75
|
+
config,
|
|
76
|
+
null,
|
|
77
|
+
null
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function setupAbort(config, fetchOptions) {
|
|
72
82
|
if (config.timeout !== void 0 && (typeof config.timeout !== "number" || isNaN(config.timeout) || config.timeout < 0)) {
|
|
73
83
|
throw new import_accessioError.default(
|
|
74
84
|
`Invalid timeout value: ${config.timeout}`,
|
|
@@ -79,77 +89,116 @@ async function fetchAdapter(config, fullURL, fetchOptions, requestStartTime) {
|
|
|
79
89
|
);
|
|
80
90
|
}
|
|
81
91
|
const timeoutValue = Number(config.timeout);
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
92
|
+
const hasTimeout = !isNaN(timeoutValue) && timeoutValue > 0;
|
|
93
|
+
if (!hasTimeout) {
|
|
94
|
+
if (config.signal) fetchOptions.signal = config.signal;
|
|
95
|
+
return { isTimedOut: () => false, cleanup: () => {
|
|
96
|
+
} };
|
|
97
|
+
}
|
|
98
|
+
let timedOut = false;
|
|
99
|
+
const abortController = new AbortController();
|
|
100
|
+
const timeoutId = setTimeout(() => {
|
|
101
|
+
timedOut = true;
|
|
102
|
+
abortController.abort(
|
|
103
|
+
new import_accessioError.default(
|
|
104
|
+
`timeout of ${timeoutValue}ms exceeded`,
|
|
105
|
+
import_accessioError.default.ETIMEDOUT,
|
|
106
|
+
config,
|
|
107
|
+
null,
|
|
108
|
+
null
|
|
109
|
+
)
|
|
110
|
+
);
|
|
111
|
+
}, timeoutValue);
|
|
112
|
+
let onUserAbort = null;
|
|
113
|
+
if (config.signal) {
|
|
114
|
+
if (typeof AbortSignal.any === "function") {
|
|
115
|
+
fetchOptions.signal = AbortSignal.any([config.signal, abortController.signal]);
|
|
116
|
+
} else {
|
|
117
|
+
if (config.signal.aborted) {
|
|
118
|
+
abortController.abort(config.signal.reason);
|
|
99
119
|
} else {
|
|
100
|
-
|
|
101
|
-
abortController.abort(config.signal.reason);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (!isTimedOut && abortController) {
|
|
105
|
-
abortController.abort(config.signal.reason);
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
config.signal.addEventListener("abort", onUserAbort, {
|
|
109
|
-
once: true
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
fetchOptions.signal = abortController.signal;
|
|
120
|
+
onUserAbort = () => {
|
|
121
|
+
if (!timedOut) abortController.abort(config.signal.reason);
|
|
122
|
+
};
|
|
123
|
+
config.signal.addEventListener("abort", onUserAbort, { once: true });
|
|
113
124
|
}
|
|
114
|
-
} else {
|
|
115
125
|
fetchOptions.signal = abortController.signal;
|
|
116
126
|
}
|
|
117
|
-
} else
|
|
118
|
-
fetchOptions.signal =
|
|
127
|
+
} else {
|
|
128
|
+
fetchOptions.signal = abortController.signal;
|
|
119
129
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
130
|
+
return {
|
|
131
|
+
isTimedOut: () => timedOut,
|
|
132
|
+
cleanup: () => {
|
|
133
|
+
clearTimeout(timeoutId);
|
|
134
|
+
if (onUserAbort && config.signal) {
|
|
135
|
+
config.signal.removeEventListener("abort", onUserAbort);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function wrapDownloadProgress(fetchResponse, config) {
|
|
141
|
+
if (!config.onDownloadProgress || !fetchResponse.body || config.responseType === "stream") {
|
|
142
|
+
return fetchResponse;
|
|
143
|
+
}
|
|
144
|
+
const contentLength = fetchResponse.headers.get("content-length");
|
|
145
|
+
const total = contentLength ? parseInt(contentLength, 10) : 0;
|
|
146
|
+
let loaded = 0;
|
|
147
|
+
const reader = fetchResponse.body.getReader();
|
|
148
|
+
const stream = new ReadableStream({
|
|
149
|
+
async start(controller) {
|
|
150
|
+
try {
|
|
151
|
+
while (true) {
|
|
152
|
+
const { done, value } = await reader.read();
|
|
153
|
+
if (done) {
|
|
154
|
+
controller.close();
|
|
155
|
+
break;
|
|
143
156
|
}
|
|
157
|
+
loaded += value.byteLength;
|
|
158
|
+
config.onDownloadProgress({ loaded, total });
|
|
159
|
+
controller.enqueue(value);
|
|
144
160
|
}
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
status: fetchResponse.status,
|
|
149
|
-
statusText: fetchResponse.statusText
|
|
150
|
-
});
|
|
161
|
+
} catch (e) {
|
|
162
|
+
controller.error(e);
|
|
163
|
+
}
|
|
151
164
|
}
|
|
152
|
-
|
|
165
|
+
});
|
|
166
|
+
return new Response(stream, {
|
|
167
|
+
headers: fetchResponse.headers,
|
|
168
|
+
status: fetchResponse.status,
|
|
169
|
+
statusText: fetchResponse.statusText
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
function classifyFetchError(error, config, isTimedOut) {
|
|
173
|
+
if (error instanceof import_accessioError.default) return error;
|
|
174
|
+
if (isTimedOut) {
|
|
175
|
+
return new import_accessioError.default(
|
|
176
|
+
`timeout of ${config.timeout}ms exceeded`,
|
|
177
|
+
import_accessioError.default.ETIMEDOUT,
|
|
178
|
+
config,
|
|
179
|
+
null,
|
|
180
|
+
null
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
const isAbort = error instanceof Error && error.name === "AbortError" || !!config.signal?.aborted;
|
|
184
|
+
if (isAbort) {
|
|
185
|
+
return new import_accessioError.default("Request aborted", import_accessioError.default.ERR_CANCELED, config, null, null);
|
|
186
|
+
}
|
|
187
|
+
return import_accessioError.default.from(
|
|
188
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
189
|
+
import_accessioError.default.ERR_NETWORK,
|
|
190
|
+
config,
|
|
191
|
+
null,
|
|
192
|
+
null
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
async function fetchAdapter(config, fullURL, fetchOptions, requestStartTime) {
|
|
196
|
+
assertValidURL(fullURL, config);
|
|
197
|
+
const abort = setupAbort(config, fetchOptions);
|
|
198
|
+
try {
|
|
199
|
+
const fetchImpl = config.fetch || fetch;
|
|
200
|
+
const rawResponse = await fetchImpl(fullURL, fetchOptions);
|
|
201
|
+
const fetchResponse = wrapDownloadProgress(rawResponse, config);
|
|
153
202
|
const contentLength = fetchResponse.headers.get("content-length");
|
|
154
203
|
if (contentLength && config.maxContentLength && parseInt(contentLength, 10) > config.maxContentLength) {
|
|
155
204
|
throw new import_accessioError.default(
|
|
@@ -160,6 +209,7 @@ async function fetchAdapter(config, fullURL, fetchOptions, requestStartTime) {
|
|
|
160
209
|
null
|
|
161
210
|
);
|
|
162
211
|
}
|
|
212
|
+
let responseData;
|
|
163
213
|
try {
|
|
164
214
|
responseData = await readResponseData(fetchResponse, config);
|
|
165
215
|
if (config.schema) {
|
|
@@ -179,53 +229,19 @@ async function fetchAdapter(config, fullURL, fetchOptions, requestStartTime) {
|
|
|
179
229
|
null
|
|
180
230
|
);
|
|
181
231
|
}
|
|
182
|
-
const responseHeaders = (0, import_parseHeaders.default)(fetchResponse.headers);
|
|
183
232
|
return {
|
|
184
233
|
data: responseData,
|
|
185
234
|
status: fetchResponse.status,
|
|
186
235
|
statusText: fetchResponse.statusText,
|
|
187
|
-
headers:
|
|
236
|
+
headers: (0, import_parseHeaders.default)(fetchResponse.headers),
|
|
188
237
|
config,
|
|
189
238
|
request: fetchResponse,
|
|
190
239
|
duration: Date.now() - requestStartTime
|
|
191
240
|
};
|
|
192
241
|
} catch (error) {
|
|
193
|
-
|
|
194
|
-
throw error;
|
|
195
|
-
}
|
|
196
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
197
|
-
if (isTimedOut) {
|
|
198
|
-
throw new import_accessioError.default(
|
|
199
|
-
`timeout of ${config.timeout}ms exceeded`,
|
|
200
|
-
import_accessioError.default.ETIMEDOUT,
|
|
201
|
-
config,
|
|
202
|
-
null,
|
|
203
|
-
null
|
|
204
|
-
);
|
|
205
|
-
}
|
|
206
|
-
throw new import_accessioError.default("Request aborted", import_accessioError.default.ERR_CANCELED, config, null, null);
|
|
207
|
-
}
|
|
208
|
-
if (error instanceof TypeError && (error.message.toLowerCase().includes("url") || error.message.toLowerCase().includes("fetch"))) {
|
|
209
|
-
throw new import_accessioError.default(
|
|
210
|
-
`Invalid URL: ${fullURL}`,
|
|
211
|
-
import_accessioError.default.ERR_INVALID_URL,
|
|
212
|
-
config,
|
|
213
|
-
null,
|
|
214
|
-
null
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
throw import_accessioError.default.from(
|
|
218
|
-
error instanceof Error ? error : new Error(String(error)),
|
|
219
|
-
import_accessioError.default.ERR_NETWORK,
|
|
220
|
-
config,
|
|
221
|
-
null,
|
|
222
|
-
null
|
|
223
|
-
);
|
|
242
|
+
throw classifyFetchError(error, config, abort.isTimedOut());
|
|
224
243
|
} finally {
|
|
225
|
-
|
|
226
|
-
if (config.signal && onUserAbort) {
|
|
227
|
-
config.signal.removeEventListener("abort", onUserAbort);
|
|
228
|
-
}
|
|
244
|
+
abort.cleanup();
|
|
229
245
|
}
|
|
230
246
|
}
|
|
231
247
|
//# sourceMappingURL=fetchAdapter.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/fetchAdapter.ts"],"sourcesContent":["import AccessioError from './accessioError';\nimport parseHeaders from '../helpers/parseHeaders';\nimport type { AccessioRequestConfig, AccessioResponse } from '../types';\n\nasync function readResponseData(\n fetchResponse: Response,\n config: AccessioRequestConfig,\n): Promise<unknown> {\n const responseType = config.responseType || 'json';\n switch (responseType) {\n case 'arraybuffer':\n return await fetchResponse.arrayBuffer();\n case 'blob':\n return await fetchResponse.blob();\n case 'stream':\n return fetchResponse.body;\n case 'json':\n default: {\n const contentType = fetchResponse.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n const text = await fetchResponse.text();\n if (!text) return '';\n try {\n return JSON.parse(text);\n } catch (err) {\n throw new AccessioError(\n `Failed to parse JSON response: ${(err as Error).message}. Raw body: ${\n text.length > 500 ? text.slice(0, 500) + '…' : text\n }`,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n }\n return await fetchResponse.text();\n }\n }\n}\n\nexport default async function fetchAdapter(\n config: AccessioRequestConfig,\n fullURL: string,\n fetchOptions: RequestInit,\n requestStartTime: number,\n): Promise<AccessioResponse> {\n let abortController: AbortController | null = null;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n let isTimedOut = false;\n let onUserAbort: (() => void) | null = null;\n\n if (\n config.timeout !== undefined &&\n (typeof config.timeout !== 'number' || isNaN(config.timeout) || config.timeout < 0)\n ) {\n throw new AccessioError(\n `Invalid timeout value: ${config.timeout}`,\n AccessioError.ERR_BAD_OPTION_VALUE,\n config,\n null,\n null,\n );\n }\n\n const timeoutValue = Number(config.timeout);\n if (!isNaN(timeoutValue) && timeoutValue > 0) {\n abortController = new AbortController();\n\n timeoutId = setTimeout(() => {\n isTimedOut = true;\n abortController!.abort(\n new AccessioError(\n `timeout of ${timeoutValue}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n ),\n );\n }, timeoutValue);\n\n if (config.signal) {\n if (typeof AbortSignal.any === 'function') {\n fetchOptions.signal = AbortSignal.any([config.signal, abortController.signal]);\n } else {\n if (config.signal.aborted) {\n abortController.abort(config.signal.reason);\n } else {\n onUserAbort = () => {\n if (!isTimedOut && abortController) {\n abortController.abort(config.signal!.reason);\n }\n };\n config.signal.addEventListener('abort', onUserAbort, {\n once: true,\n });\n }\n fetchOptions.signal = abortController.signal;\n }\n } else {\n fetchOptions.signal = abortController.signal;\n }\n } else if (config.signal) {\n fetchOptions.signal = config.signal;\n }\n\n try {\n const fetchImpl = config.fetch || fetch;\n let fetchResponse = await fetchImpl(fullURL, fetchOptions);\n\n if (config.onDownloadProgress && fetchResponse.body && config.responseType !== 'stream') {\n const contentLength = fetchResponse.headers.get('content-length');\n const total = contentLength ? parseInt(contentLength, 10) : 0;\n let loaded = 0;\n\n const reader = fetchResponse.body.getReader();\n const stream = new ReadableStream({\n async start(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n break;\n }\n loaded += value.byteLength;\n config.onDownloadProgress!({ loaded, total });\n controller.enqueue(value);\n }\n } catch (e) {\n controller.error(e);\n }\n },\n });\n\n fetchResponse = new Response(stream, {\n headers: fetchResponse.headers,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n });\n }\n\n let responseData: unknown;\n\n const contentLength = fetchResponse.headers.get('content-length');\n if (\n contentLength &&\n config.maxContentLength &&\n parseInt(contentLength, 10) > config.maxContentLength\n ) {\n throw new AccessioError(\n `maxContentLength size of ${config.maxContentLength} exceeded`,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n\n try {\n responseData = await readResponseData(fetchResponse, config);\n if (config.schema) {\n if (typeof config.schema.parseAsync === 'function') {\n responseData = await config.schema.parseAsync(responseData);\n } else {\n responseData = config.schema.parse(responseData);\n }\n }\n } catch (readError) {\n if (readError instanceof AccessioError) throw readError;\n throw AccessioError.from(\n readError as Error,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n\n const responseHeaders = parseHeaders(fetchResponse.headers);\n\n return {\n data: responseData,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n headers: responseHeaders,\n config: config,\n request: fetchResponse,\n duration: Date.now() - requestStartTime,\n };\n } catch (error) {\n if (error instanceof AccessioError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n if (isTimedOut) {\n throw new AccessioError(\n `timeout of ${config.timeout}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n );\n }\n throw new AccessioError('Request aborted', AccessioError.ERR_CANCELED, config, null, null);\n }\n\n if (\n error instanceof TypeError &&\n (error.message.toLowerCase().includes('url') || error.message.toLowerCase().includes('fetch'))\n ) {\n throw new AccessioError(\n `Invalid URL: ${fullURL}`,\n AccessioError.ERR_INVALID_URL,\n config,\n null,\n null,\n );\n }\n\n throw AccessioError.from(\n error instanceof Error ? error : new Error(String(error)),\n AccessioError.ERR_NETWORK,\n config,\n null,\n null,\n );\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n if (config.signal && onUserAbort) {\n config.signal.removeEventListener('abort', onUserAbort);\n }\n }\n}\n"],"mappings":"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","names":["AccessioError","contentLength","parseHeaders"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/fetchAdapter.ts"],"sourcesContent":["import AccessioError from './accessioError';\nimport parseHeaders from '../helpers/parseHeaders';\nimport type { AccessioRequestConfig, AccessioResponse } from '../types';\n\nasync function readResponseData(\n fetchResponse: Response,\n config: AccessioRequestConfig,\n): Promise<unknown> {\n const responseType = config.responseType || 'json';\n switch (responseType) {\n case 'arraybuffer':\n return await fetchResponse.arrayBuffer();\n case 'blob':\n return await fetchResponse.blob();\n case 'stream':\n return fetchResponse.body;\n case 'json':\n default: {\n const contentType = fetchResponse.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n const text = await fetchResponse.text();\n if (!text) return '';\n try {\n return JSON.parse(text);\n } catch (err) {\n throw new AccessioError(\n `Failed to parse JSON response: ${(err as Error).message}. Raw body: ${\n text.length > 500 ? `${text.slice(0, 500)}…` : text\n }`,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n }\n return await fetchResponse.text();\n }\n }\n}\n\nfunction assertValidURL(fullURL: string, config: AccessioRequestConfig): void {\n if (!fullURL || !/^[a-z][a-z\\d+\\-.]*:/i.test(fullURL)) return;\n try {\n new URL(fullURL);\n } catch {\n throw new AccessioError(\n `Invalid URL: ${fullURL}`,\n AccessioError.ERR_INVALID_URL,\n config,\n null,\n null,\n );\n }\n}\n\ninterface AbortWiring {\n isTimedOut: () => boolean;\n cleanup: () => void;\n}\n\nfunction setupAbort(config: AccessioRequestConfig, fetchOptions: RequestInit): AbortWiring {\n if (\n config.timeout !== undefined &&\n (typeof config.timeout !== 'number' || isNaN(config.timeout) || config.timeout < 0)\n ) {\n throw new AccessioError(\n `Invalid timeout value: ${config.timeout}`,\n AccessioError.ERR_BAD_OPTION_VALUE,\n config,\n null,\n null,\n );\n }\n\n const timeoutValue = Number(config.timeout);\n const hasTimeout = !isNaN(timeoutValue) && timeoutValue > 0;\n\n if (!hasTimeout) {\n if (config.signal) fetchOptions.signal = config.signal;\n return { isTimedOut: () => false, cleanup: () => {} };\n }\n\n let timedOut = false;\n const abortController = new AbortController();\n const timeoutId = setTimeout(() => {\n timedOut = true;\n abortController.abort(\n new AccessioError(\n `timeout of ${timeoutValue}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n ),\n );\n }, timeoutValue);\n\n let onUserAbort: (() => void) | null = null;\n\n if (config.signal) {\n if (typeof AbortSignal.any === 'function') {\n fetchOptions.signal = AbortSignal.any([config.signal, abortController.signal]);\n } else {\n if (config.signal.aborted) {\n abortController.abort(config.signal.reason);\n } else {\n onUserAbort = () => {\n if (!timedOut) abortController.abort(config.signal!.reason);\n };\n config.signal.addEventListener('abort', onUserAbort, { once: true });\n }\n fetchOptions.signal = abortController.signal;\n }\n } else {\n fetchOptions.signal = abortController.signal;\n }\n\n return {\n isTimedOut: () => timedOut,\n cleanup: () => {\n clearTimeout(timeoutId);\n if (onUserAbort && config.signal) {\n config.signal.removeEventListener('abort', onUserAbort);\n }\n },\n };\n}\n\nfunction wrapDownloadProgress(fetchResponse: Response, config: AccessioRequestConfig): Response {\n if (!config.onDownloadProgress || !fetchResponse.body || config.responseType === 'stream') {\n return fetchResponse;\n }\n\n const contentLength = fetchResponse.headers.get('content-length');\n const total = contentLength ? parseInt(contentLength, 10) : 0;\n let loaded = 0;\n\n const reader = fetchResponse.body.getReader();\n const stream = new ReadableStream({\n async start(controller) {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n break;\n }\n loaded += value.byteLength;\n config.onDownloadProgress!({ loaded, total });\n controller.enqueue(value);\n }\n } catch (e) {\n controller.error(e);\n }\n },\n });\n\n return new Response(stream, {\n headers: fetchResponse.headers,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n });\n}\n\nfunction classifyFetchError(\n error: unknown,\n config: AccessioRequestConfig,\n isTimedOut: boolean,\n): AccessioError {\n if (error instanceof AccessioError) return error;\n\n if (isTimedOut) {\n return new AccessioError(\n `timeout of ${config.timeout}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n );\n }\n\n const isAbort =\n (error instanceof Error && error.name === 'AbortError') || !!config.signal?.aborted;\n if (isAbort) {\n return new AccessioError('Request aborted', AccessioError.ERR_CANCELED, config, null, null);\n }\n\n return AccessioError.from(\n error instanceof Error ? error : new Error(String(error)),\n AccessioError.ERR_NETWORK,\n config,\n null,\n null,\n );\n}\n\nexport default async function fetchAdapter(\n config: AccessioRequestConfig,\n fullURL: string,\n fetchOptions: RequestInit,\n requestStartTime: number,\n): Promise<AccessioResponse> {\n assertValidURL(fullURL, config);\n\n const abort = setupAbort(config, fetchOptions);\n\n try {\n const fetchImpl = config.fetch || fetch;\n const rawResponse = await fetchImpl(fullURL, fetchOptions);\n const fetchResponse = wrapDownloadProgress(rawResponse, config);\n\n const contentLength = fetchResponse.headers.get('content-length');\n if (\n contentLength &&\n config.maxContentLength &&\n parseInt(contentLength, 10) > config.maxContentLength\n ) {\n throw new AccessioError(\n `maxContentLength size of ${config.maxContentLength} exceeded`,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n\n let responseData: unknown;\n try {\n responseData = await readResponseData(fetchResponse, config);\n if (config.schema) {\n if (typeof config.schema.parseAsync === 'function') {\n responseData = await config.schema.parseAsync(responseData);\n } else {\n responseData = config.schema.parse(responseData);\n }\n }\n } catch (readError) {\n if (readError instanceof AccessioError) throw readError;\n throw AccessioError.from(\n readError as Error,\n AccessioError.ERR_BAD_RESPONSE,\n config,\n fetchResponse,\n null,\n );\n }\n\n return {\n data: responseData,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n headers: parseHeaders(fetchResponse.headers),\n config,\n request: fetchResponse,\n duration: Date.now() - requestStartTime,\n };\n } catch (error) {\n throw classifyFetchError(error, config, abort.isTimedOut());\n } finally {\n abort.cleanup();\n }\n}\n"],"mappings":"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","names":["AccessioError","parseHeaders"]}
|
package/cjs/core/request.cjs
CHANGED
|
@@ -28,6 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
var request_exports = {};
|
|
30
30
|
__export(request_exports, {
|
|
31
|
+
__activeRequestsSize: () => __activeRequestsSize,
|
|
31
32
|
default: () => dispatchRequest
|
|
32
33
|
});
|
|
33
34
|
module.exports = __toCommonJS(request_exports);
|
|
@@ -40,6 +41,24 @@ var import_flattenHeaders = require("../helpers/flattenHeaders");
|
|
|
40
41
|
var import_auth = require("../helpers/auth");
|
|
41
42
|
var import_fetchAdapter = __toESM(require("./fetchAdapter"), 1);
|
|
42
43
|
var import_memoryCache = require("../helpers/memoryCache");
|
|
44
|
+
function lookupHeader(headers, name) {
|
|
45
|
+
const target = name.toLowerCase();
|
|
46
|
+
for (const k of Object.keys(headers)) {
|
|
47
|
+
if (k.toLowerCase() === target) {
|
|
48
|
+
const v = headers[k];
|
|
49
|
+
return Array.isArray(v) ? v.join(",") : v ?? "";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return "";
|
|
53
|
+
}
|
|
54
|
+
function buildCacheKey(config, fullURL, flatHeaders) {
|
|
55
|
+
const method = (config.method || "GET").toUpperCase();
|
|
56
|
+
const auth = lookupHeader(flatHeaders, "authorization");
|
|
57
|
+
const accept = lookupHeader(flatHeaders, "accept");
|
|
58
|
+
const withCreds = config.withCredentials ? "1" : "0";
|
|
59
|
+
const respType = config.responseType || "json";
|
|
60
|
+
return `${method}:${fullURL}|a=${auth}|x=${accept}|c=${withCreds}|t=${respType}`;
|
|
61
|
+
}
|
|
43
62
|
function buildTransformArray(transform) {
|
|
44
63
|
if (!transform) return [];
|
|
45
64
|
if (Array.isArray(transform)) return transform;
|
|
@@ -51,7 +70,7 @@ function assertAllowedProtocol(fullURL, config) {
|
|
|
51
70
|
const allowed = config.allowedProtocols ?? DEFAULT_ALLOWED_PROTOCOLS;
|
|
52
71
|
let scheme = null;
|
|
53
72
|
const match = /^([a-z][a-z\d+\-.]*):/i.exec(fullURL);
|
|
54
|
-
if (match) scheme = match[1].toLowerCase()
|
|
73
|
+
if (match) scheme = `${match[1].toLowerCase()}:`;
|
|
55
74
|
if (!scheme) return;
|
|
56
75
|
if (!allowed.includes(scheme)) {
|
|
57
76
|
throw new import_accessioError.default(
|
|
@@ -64,6 +83,18 @@ function assertAllowedProtocol(fullURL, config) {
|
|
|
64
83
|
}
|
|
65
84
|
}
|
|
66
85
|
const activeRequests = /* @__PURE__ */ new Map();
|
|
86
|
+
const MAX_ACTIVE_REQUESTS = 1024;
|
|
87
|
+
function __activeRequestsSize() {
|
|
88
|
+
return activeRequests.size;
|
|
89
|
+
}
|
|
90
|
+
function trackActiveRequest(key, promise) {
|
|
91
|
+
activeRequests.set(key, promise);
|
|
92
|
+
while (activeRequests.size > MAX_ACTIVE_REQUESTS) {
|
|
93
|
+
const oldest = activeRequests.keys().next().value;
|
|
94
|
+
if (oldest === void 0 || oldest === key) break;
|
|
95
|
+
activeRequests.delete(oldest);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
67
98
|
async function dispatchRequest(config) {
|
|
68
99
|
const fullURL = config._builtUrl || (0, import_buildURL.default)(
|
|
69
100
|
config.url ?? "",
|
|
@@ -75,31 +106,37 @@ async function dispatchRequest(config) {
|
|
|
75
106
|
if (config.hooks?.onBeforeRequest) {
|
|
76
107
|
await config.hooks.onBeforeRequest(config);
|
|
77
108
|
}
|
|
109
|
+
const flatHeaders = (0, import_flattenHeaders.flattenHeaders)(config.headers, config.method);
|
|
110
|
+
(0, import_auth.setBasicAuth)(config, flatHeaders);
|
|
78
111
|
const isGet = (config.method || "GET").toUpperCase() === "GET";
|
|
79
|
-
const cacheKey = isGet ?
|
|
112
|
+
const cacheKey = isGet ? buildCacheKey(config, fullURL, flatHeaders) : "";
|
|
80
113
|
if (isGet && config.cache) {
|
|
81
114
|
const cacheProvider = typeof config.cache === "object" ? config.cache : import_memoryCache.defaultMemoryCache;
|
|
82
115
|
const cached = await cacheProvider.get(cacheKey);
|
|
83
116
|
if (cached) {
|
|
117
|
+
const cachedView = {
|
|
118
|
+
...cached,
|
|
119
|
+
config: (0, import_accessioError.redactConfig)(config)
|
|
120
|
+
};
|
|
84
121
|
if (config.hooks?.onRequestResponse) {
|
|
85
|
-
await config.hooks.onRequestResponse(
|
|
122
|
+
await config.hooks.onRequestResponse(cachedView);
|
|
86
123
|
}
|
|
87
|
-
return
|
|
124
|
+
return cachedView;
|
|
88
125
|
}
|
|
89
126
|
}
|
|
90
127
|
if (isGet && config.dedupe) {
|
|
91
|
-
|
|
92
|
-
|
|
128
|
+
const inflight = activeRequests.get(cacheKey);
|
|
129
|
+
if (inflight) {
|
|
130
|
+
const shared = await inflight;
|
|
131
|
+
return finalizeResponse(shared, config);
|
|
93
132
|
}
|
|
94
133
|
}
|
|
95
134
|
const performRequest = async () => {
|
|
96
|
-
const flatHeaders = (0, import_flattenHeaders.flattenHeaders)(config.headers, config.method);
|
|
97
135
|
const requestTransforms = buildTransformArray(config.transformRequest);
|
|
98
136
|
const requestData = await (0, import_transformData.default)(requestTransforms, config.data, flatHeaders, config);
|
|
99
137
|
if (requestData === null || requestData === void 0 || typeof FormData !== "undefined" && requestData instanceof FormData) {
|
|
100
138
|
(0, import_flattenHeaders.removeContentType)(flatHeaders);
|
|
101
139
|
}
|
|
102
|
-
(0, import_auth.setBasicAuth)(config, flatHeaders);
|
|
103
140
|
const fetchOptions = {
|
|
104
141
|
method: (config.method || "GET").toUpperCase(),
|
|
105
142
|
headers: (0, import_flattenHeaders.buildFetchHeaders)(flatHeaders)
|
|
@@ -119,7 +156,6 @@ async function dispatchRequest(config) {
|
|
|
119
156
|
}
|
|
120
157
|
const requestStartTime = Date.now();
|
|
121
158
|
const response = await (0, import_fetchAdapter.default)(config, fullURL, fetchOptions, requestStartTime);
|
|
122
|
-
response.config = (0, import_accessioError.redactConfig)(response.config);
|
|
123
159
|
const responseTransforms = buildTransformArray(config.transformResponse);
|
|
124
160
|
response.data = await (0, import_transformData.default)(
|
|
125
161
|
responseTransforms,
|
|
@@ -128,33 +164,37 @@ async function dispatchRequest(config) {
|
|
|
128
164
|
config,
|
|
129
165
|
"response"
|
|
130
166
|
);
|
|
131
|
-
return
|
|
132
|
-
(0, import_settle.default)(
|
|
133
|
-
resolve,
|
|
134
|
-
reject,
|
|
135
|
-
response,
|
|
136
|
-
config
|
|
137
|
-
);
|
|
138
|
-
});
|
|
167
|
+
return response;
|
|
139
168
|
};
|
|
140
169
|
const promise = performRequest();
|
|
141
170
|
if (isGet && config.dedupe) {
|
|
142
|
-
|
|
171
|
+
trackActiveRequest(cacheKey, promise);
|
|
143
172
|
const cleanup = () => {
|
|
144
|
-
activeRequests.
|
|
173
|
+
if (activeRequests.get(cacheKey) === promise) {
|
|
174
|
+
activeRequests.delete(cacheKey);
|
|
175
|
+
}
|
|
145
176
|
};
|
|
146
177
|
promise.then(cleanup, cleanup);
|
|
147
178
|
}
|
|
148
179
|
try {
|
|
149
|
-
const
|
|
180
|
+
const shared = await promise;
|
|
181
|
+
const response = finalizeResponse(shared, config);
|
|
150
182
|
if (isGet && config.cache) {
|
|
151
183
|
const cacheProvider = typeof config.cache === "object" ? config.cache : import_memoryCache.defaultMemoryCache;
|
|
152
|
-
await cacheProvider.set(cacheKey,
|
|
184
|
+
await cacheProvider.set(cacheKey, shared, config.cacheTTL);
|
|
153
185
|
}
|
|
186
|
+
const settled = await new Promise((resolve, reject) => {
|
|
187
|
+
(0, import_settle.default)(
|
|
188
|
+
resolve,
|
|
189
|
+
reject,
|
|
190
|
+
response,
|
|
191
|
+
config
|
|
192
|
+
);
|
|
193
|
+
});
|
|
154
194
|
if (config.hooks?.onRequestResponse) {
|
|
155
|
-
await config.hooks.onRequestResponse(
|
|
195
|
+
await config.hooks.onRequestResponse(settled);
|
|
156
196
|
}
|
|
157
|
-
return
|
|
197
|
+
return settled;
|
|
158
198
|
} catch (error) {
|
|
159
199
|
if (config.hooks?.onRequestError && error instanceof import_accessioError.default) {
|
|
160
200
|
await config.hooks.onRequestError(error);
|
|
@@ -162,4 +202,14 @@ async function dispatchRequest(config) {
|
|
|
162
202
|
throw error;
|
|
163
203
|
}
|
|
164
204
|
}
|
|
205
|
+
function finalizeResponse(shared, config) {
|
|
206
|
+
return {
|
|
207
|
+
...shared,
|
|
208
|
+
config: (0, import_accessioError.redactConfig)(config)
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
212
|
+
0 && (module.exports = {
|
|
213
|
+
__activeRequestsSize
|
|
214
|
+
});
|
|
165
215
|
//# sourceMappingURL=request.cjs.map
|
package/cjs/core/request.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/request.ts"],"sourcesContent":["import buildURL from './buildURL';\nimport AccessioError, { redactConfig } from './accessioError';\nimport { ERR_BAD_OPTION } from '../constants/errorCodes';\nimport transformData from '../helpers/transformData';\nimport settle from '../helpers/settle';\nimport { flattenHeaders, removeContentType, buildFetchHeaders } from '../helpers/flattenHeaders';\nimport { setBasicAuth } from '../helpers/auth';\nimport fetchAdapter from './fetchAdapter';\nimport { defaultMemoryCache } from '../helpers/memoryCache';\nimport type { AccessioRequestConfig, AccessioResponse, TransformFunction } from '../types';\n\ntype HeadersConfig = Record<string, Record<string, string | string[]>>;\n\nfunction buildTransformArray(\n transform: TransformFunction | TransformFunction[] | undefined,\n): TransformFunction[] {\n if (!transform) return [];\n if (Array.isArray(transform)) return transform;\n return [transform];\n}\n\nconst DEFAULT_ALLOWED_PROTOCOLS = ['http:', 'https:'];\n\nfunction assertAllowedProtocol(fullURL: string, config: AccessioRequestConfig): void {\n if (config.allowedProtocols === null) return;\n const allowed = config.allowedProtocols ?? DEFAULT_ALLOWED_PROTOCOLS;\n\n let scheme: string | null = null;\n const match = /^([a-z][a-z\\d+\\-.]*):/i.exec(fullURL);\n if (match) scheme = match[1].toLowerCase() + ':';\n if (!scheme) return;\n\n if (!allowed.includes(scheme)) {\n throw new AccessioError(\n `URL protocol \"${scheme}\" is not allowed. Allowed: ${allowed.join(', ')}. ` +\n 'Set config.allowedProtocols to extend, or null to disable the check.',\n ERR_BAD_OPTION,\n config,\n null,\n null,\n );\n }\n}\n\nconst activeRequests = new Map<string, Promise<AccessioResponse>>();\n\nexport default async function dispatchRequest(\n config: AccessioRequestConfig,\n): Promise<AccessioResponse> {\n const fullURL =\n config._builtUrl ||\n buildURL(\n config.url ?? '',\n config.baseURL,\n config.params as Record<string, unknown> | undefined,\n config.paramsSerializer,\n );\n\n assertAllowedProtocol(fullURL, config);\n\n if (config.hooks?.onBeforeRequest) {\n await config.hooks.onBeforeRequest(config);\n }\n\n const isGet = (config.method || 'GET').toUpperCase() === 'GET';\n const cacheKey = isGet ? `GET:${fullURL}` : '';\n\n if (isGet && config.cache) {\n const cacheProvider = typeof config.cache === 'object' ? config.cache : defaultMemoryCache;\n const cached = await cacheProvider.get(cacheKey);\n if (cached) {\n if (config.hooks?.onRequestResponse) {\n await config.hooks.onRequestResponse(cached);\n }\n return cached;\n }\n }\n\n if (isGet && config.dedupe) {\n if (activeRequests.has(cacheKey)) {\n return activeRequests.get(cacheKey)!;\n }\n }\n\n const performRequest = async () => {\n const flatHeaders = flattenHeaders(config.headers as HeadersConfig | undefined, config.method);\n const requestTransforms = buildTransformArray(config.transformRequest);\n const requestData = await transformData(requestTransforms, config.data, flatHeaders, config);\n\n if (\n requestData === null ||\n requestData === undefined ||\n (typeof FormData !== 'undefined' && requestData instanceof FormData)\n ) {\n removeContentType(flatHeaders);\n }\n\n setBasicAuth(config, flatHeaders);\n\n const fetchOptions: RequestInit = {\n method: (config.method || 'GET').toUpperCase(),\n headers: buildFetchHeaders(flatHeaders),\n };\n\n const methodsWithBody = ['POST', 'PUT', 'PATCH', 'DELETE'];\n if (\n methodsWithBody.includes(fetchOptions.method!) &&\n requestData !== undefined &&\n requestData !== null\n ) {\n fetchOptions.body = requestData as BodyInit;\n }\n\n if (config.withCredentials) {\n fetchOptions.credentials = 'include';\n }\n\n if (config.dispatcher) {\n (fetchOptions as any).dispatcher = config.dispatcher;\n }\n if (config.agent) {\n (fetchOptions as any).agent = config.agent;\n }\n\n const requestStartTime = Date.now();\n\n const response = await fetchAdapter(config, fullURL, fetchOptions, requestStartTime);\n response.config = redactConfig(response.config) as typeof response.config;\n\n const responseTransforms = buildTransformArray(config.transformResponse);\n\n response.data = await transformData(\n responseTransforms,\n response.data,\n response.headers,\n config,\n 'response',\n );\n\n return new Promise<AccessioResponse>((resolve, reject) => {\n settle(\n resolve as (value: AccessioResponse) => void,\n reject as (reason: AccessioError) => void,\n response,\n config,\n );\n });\n };\n\n const promise = performRequest();\n\n if (isGet && config.dedupe) {\n activeRequests.set(cacheKey, promise);\n const cleanup = () => {\n activeRequests.delete(cacheKey);\n };\n promise.then(cleanup, cleanup);\n }\n\n try {\n const response = await promise;\n\n if (isGet && config.cache) {\n const cacheProvider = typeof config.cache === 'object' ? config.cache : defaultMemoryCache;\n await cacheProvider.set(cacheKey, response, config.cacheTTL);\n }\n\n if (config.hooks?.onRequestResponse) {\n await config.hooks.onRequestResponse(response);\n }\n\n return response;\n } catch (error) {\n if (config.hooks?.onRequestError && error instanceof AccessioError) {\n await config.hooks.onRequestError(error);\n }\n throw error;\n }\n}\n"],"mappings":"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","names":["AccessioError","buildURL","transformData","fetchAdapter","settle"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/request.ts"],"sourcesContent":["import buildURL from './buildURL';\nimport AccessioError, { redactConfig } from './accessioError';\nimport { ERR_BAD_OPTION } from '../constants/errorCodes';\nimport transformData from '../helpers/transformData';\nimport settle from '../helpers/settle';\nimport { flattenHeaders, removeContentType, buildFetchHeaders } from '../helpers/flattenHeaders';\nimport { setBasicAuth } from '../helpers/auth';\nimport fetchAdapter from './fetchAdapter';\nimport { defaultMemoryCache } from '../helpers/memoryCache';\nimport type { AccessioRequestConfig, AccessioResponse, TransformFunction } from '../types';\n\ntype HeadersConfig = Record<string, Record<string, string | string[]>>;\ntype FlatHeaders = Record<string, string | string[]>;\n\nfunction lookupHeader(headers: FlatHeaders, name: string): string {\n const target = name.toLowerCase();\n for (const k of Object.keys(headers)) {\n if (k.toLowerCase() === target) {\n const v = headers[k];\n return Array.isArray(v) ? v.join(',') : (v ?? '');\n }\n }\n return '';\n}\n\nfunction buildCacheKey(\n config: AccessioRequestConfig,\n fullURL: string,\n flatHeaders: FlatHeaders,\n): string {\n const method = (config.method || 'GET').toUpperCase();\n const auth = lookupHeader(flatHeaders, 'authorization');\n const accept = lookupHeader(flatHeaders, 'accept');\n const withCreds = config.withCredentials ? '1' : '0';\n const respType = config.responseType || 'json';\n return `${method}:${fullURL}|a=${auth}|x=${accept}|c=${withCreds}|t=${respType}`;\n}\n\nfunction buildTransformArray(\n transform: TransformFunction | TransformFunction[] | undefined,\n): TransformFunction[] {\n if (!transform) return [];\n if (Array.isArray(transform)) return transform;\n return [transform];\n}\n\nconst DEFAULT_ALLOWED_PROTOCOLS = ['http:', 'https:'];\n\nfunction assertAllowedProtocol(fullURL: string, config: AccessioRequestConfig): void {\n if (config.allowedProtocols === null) return;\n const allowed = config.allowedProtocols ?? DEFAULT_ALLOWED_PROTOCOLS;\n\n let scheme: string | null = null;\n const match = /^([a-z][a-z\\d+\\-.]*):/i.exec(fullURL);\n if (match) scheme = `${match[1].toLowerCase()}:`;\n if (!scheme) return;\n\n if (!allowed.includes(scheme)) {\n throw new AccessioError(\n `URL protocol \"${scheme}\" is not allowed. Allowed: ${allowed.join(', ')}. ` +\n 'Set config.allowedProtocols to extend, or null to disable the check.',\n ERR_BAD_OPTION,\n config,\n null,\n null,\n );\n }\n}\n\nconst activeRequests = new Map<string, Promise<AccessioResponse>>();\nconst MAX_ACTIVE_REQUESTS = 1024;\n\nexport function __activeRequestsSize(): number {\n return activeRequests.size;\n}\n\nfunction trackActiveRequest(key: string, promise: Promise<AccessioResponse>): void {\n activeRequests.set(key, promise);\n // Evict the oldest entry if we've grown past the cap. Map preserves insertion order.\n while (activeRequests.size > MAX_ACTIVE_REQUESTS) {\n const oldest = activeRequests.keys().next().value;\n if (oldest === undefined || oldest === key) break;\n activeRequests.delete(oldest);\n }\n}\n\nexport default async function dispatchRequest(\n config: AccessioRequestConfig,\n): Promise<AccessioResponse> {\n const fullURL =\n config._builtUrl ||\n buildURL(\n config.url ?? '',\n config.baseURL,\n config.params as Record<string, unknown> | undefined,\n config.paramsSerializer,\n );\n\n assertAllowedProtocol(fullURL, config);\n\n if (config.hooks?.onBeforeRequest) {\n await config.hooks.onBeforeRequest(config);\n }\n\n const flatHeaders = flattenHeaders(config.headers as HeadersConfig | undefined, config.method);\n setBasicAuth(config, flatHeaders);\n\n const isGet = (config.method || 'GET').toUpperCase() === 'GET';\n const cacheKey = isGet ? buildCacheKey(config, fullURL, flatHeaders) : '';\n\n if (isGet && config.cache) {\n const cacheProvider = typeof config.cache === 'object' ? config.cache : defaultMemoryCache;\n const cached = await cacheProvider.get(cacheKey);\n if (cached) {\n const cachedView: AccessioResponse = {\n ...cached,\n config: redactConfig(config) as typeof cached.config,\n };\n if (config.hooks?.onRequestResponse) {\n await config.hooks.onRequestResponse(cachedView);\n }\n return cachedView;\n }\n }\n\n if (isGet && config.dedupe) {\n const inflight = activeRequests.get(cacheKey);\n if (inflight) {\n const shared = await inflight;\n return finalizeResponse(shared, config);\n }\n }\n\n const performRequest = async (): Promise<AccessioResponse> => {\n const requestTransforms = buildTransformArray(config.transformRequest);\n const requestData = await transformData(requestTransforms, config.data, flatHeaders, config);\n\n if (\n requestData === null ||\n requestData === undefined ||\n (typeof FormData !== 'undefined' && requestData instanceof FormData)\n ) {\n removeContentType(flatHeaders);\n }\n\n const fetchOptions: RequestInit = {\n method: (config.method || 'GET').toUpperCase(),\n headers: buildFetchHeaders(flatHeaders),\n };\n\n const methodsWithBody = ['POST', 'PUT', 'PATCH', 'DELETE'];\n if (\n methodsWithBody.includes(fetchOptions.method!) &&\n requestData !== undefined &&\n requestData !== null\n ) {\n fetchOptions.body = requestData as BodyInit;\n }\n\n if (config.withCredentials) {\n fetchOptions.credentials = 'include';\n }\n\n if (config.dispatcher) {\n (fetchOptions as any).dispatcher = config.dispatcher;\n }\n if (config.agent) {\n (fetchOptions as any).agent = config.agent;\n }\n\n const requestStartTime = Date.now();\n const response = await fetchAdapter(config, fullURL, fetchOptions, requestStartTime);\n\n const responseTransforms = buildTransformArray(config.transformResponse);\n response.data = await transformData(\n responseTransforms,\n response.data,\n response.headers,\n config,\n 'response',\n );\n\n return response;\n };\n\n const promise = performRequest();\n\n if (isGet && config.dedupe) {\n trackActiveRequest(cacheKey, promise);\n const cleanup = () => {\n if (activeRequests.get(cacheKey) === promise) {\n activeRequests.delete(cacheKey);\n }\n };\n promise.then(cleanup, cleanup);\n }\n\n try {\n const shared = await promise;\n const response = finalizeResponse(shared, config);\n\n if (isGet && config.cache) {\n const cacheProvider = typeof config.cache === 'object' ? config.cache : defaultMemoryCache;\n await cacheProvider.set(cacheKey, shared, config.cacheTTL);\n }\n\n const settled = await new Promise<AccessioResponse>((resolve, reject) => {\n settle(\n resolve as (value: AccessioResponse) => void,\n reject as (reason: AccessioError) => void,\n response,\n config,\n );\n });\n\n if (config.hooks?.onRequestResponse) {\n await config.hooks.onRequestResponse(settled);\n }\n\n return settled;\n } catch (error) {\n if (config.hooks?.onRequestError && error instanceof AccessioError) {\n await config.hooks.onRequestError(error);\n }\n throw error;\n }\n}\n\nfunction finalizeResponse(\n shared: AccessioResponse,\n config: AccessioRequestConfig,\n): AccessioResponse {\n return {\n ...shared,\n config: redactConfig(config) as typeof shared.config,\n };\n}\n"],"mappings":"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","names":["AccessioError","buildURL","transformData","fetchAdapter","settle"]}
|
package/cjs/helpers/debug.cjs
CHANGED
|
@@ -23,6 +23,7 @@ __export(debug_exports, {
|
|
|
23
23
|
logResponse: () => logResponse
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(debug_exports);
|
|
26
|
+
var import_accessioError = require("../core/accessioError");
|
|
26
27
|
function formatBytes(bytes) {
|
|
27
28
|
if (bytes === 0) return "0 B";
|
|
28
29
|
const sizes = ["B", "KB", "MB", "GB"];
|
|
@@ -46,7 +47,12 @@ function logRequest(config, fullUrl) {
|
|
|
46
47
|
parts.push(` Params: ${JSON.stringify(safe.params)}`);
|
|
47
48
|
}
|
|
48
49
|
if (config.data && typeof config.data === "object") {
|
|
49
|
-
|
|
50
|
+
let preview;
|
|
51
|
+
try {
|
|
52
|
+
preview = JSON.stringify((0, import_accessioError.redactBody)(config.data));
|
|
53
|
+
} catch {
|
|
54
|
+
preview = "[unserializable body]";
|
|
55
|
+
}
|
|
50
56
|
const truncated = preview.length > 200 ? `${preview.substring(0, 200)}...` : preview;
|
|
51
57
|
parts.push(` Body: ${truncated}`);
|
|
52
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/helpers/debug.ts"],"sourcesContent":["import type { AccessioRequestConfig, AccessioResponse } from '../types';\nimport AccessioError from '../core/accessioError';\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${sizes[i]}`;\n}\n\nfunction sanitizeConfigForLog(config: AccessioRequestConfig): {\n params: Record<string, unknown> | undefined;\n timeout: number | undefined;\n retry: number | undefined;\n} {\n return {\n params: config.params,\n timeout: config.timeout,\n retry: config.retry,\n };\n}\n\nexport function logRequest(config: AccessioRequestConfig, fullUrl: string): void {\n if (!config.debug) return;\n\n const safe = sanitizeConfigForLog(config);\n\n const method = (config.method || 'GET').toUpperCase();\n const url = fullUrl || config.url || '';\n\n const parts: string[] = [`🐦⬛ [Accessio] → ${method} ${url}`];\n\n if (safe.params && Object.keys(safe.params).length > 0) {\n parts.push(` Params: ${JSON.stringify(safe.params)}`);\n }\n\n if (config.data && typeof config.data === 'object') {\n
|
|
1
|
+
{"version":3,"sources":["../../src/helpers/debug.ts"],"sourcesContent":["import type { AccessioRequestConfig, AccessioResponse } from '../types';\nimport AccessioError, { redactBody } from '../core/accessioError';\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\n return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${sizes[i]}`;\n}\n\nfunction sanitizeConfigForLog(config: AccessioRequestConfig): {\n params: Record<string, unknown> | undefined;\n timeout: number | undefined;\n retry: number | undefined;\n} {\n return {\n params: config.params,\n timeout: config.timeout,\n retry: config.retry,\n };\n}\n\nexport function logRequest(config: AccessioRequestConfig, fullUrl: string): void {\n if (!config.debug) return;\n\n const safe = sanitizeConfigForLog(config);\n\n const method = (config.method || 'GET').toUpperCase();\n const url = fullUrl || config.url || '';\n\n const parts: string[] = [`🐦⬛ [Accessio] → ${method} ${url}`];\n\n if (safe.params && Object.keys(safe.params).length > 0) {\n parts.push(` Params: ${JSON.stringify(safe.params)}`);\n }\n\n if (config.data && typeof config.data === 'object') {\n let preview: string;\n try {\n preview = JSON.stringify(redactBody(config.data));\n } catch {\n preview = '[unserializable body]';\n }\n const truncated = preview.length > 200 ? `${preview.substring(0, 200)}...` : preview;\n parts.push(` Body: ${truncated}`);\n }\n\n if (safe.timeout) {\n parts.push(` Timeout: ${safe.timeout}ms`);\n }\n\n if (safe.retry) {\n parts.push(` Retry: ${safe.retry}x`);\n }\n\n console.log(parts.join('\\n'));\n}\n\nexport function logResponse(response: AccessioResponse): void {\n if (!response.config || !response.config.debug) return;\n const status = response.status;\n const statusText = response.statusText || '';\n const duration = response.duration != null ? `${response.duration}ms` : '??';\n\n const statusIcon = status >= 200 && status < 300 ? '✅' : status >= 400 ? '❌' : '⚠️';\n\n const parts: string[] = [`🐦⬛ [Accessio] ← ${statusIcon} ${status} ${statusText} (${duration})`];\n\n if (response.data) {\n try {\n const size =\n typeof response.data === 'string'\n ? response.data.length\n : JSON.stringify(response.data).length;\n parts.push(` Size: ~${formatBytes(size)}`);\n } catch {\n // ignore\n }\n }\n\n console.log(parts.join('\\n'));\n}\n\nexport function logError(error: AccessioError, config?: AccessioRequestConfig): void {\n if (!config || !config.debug) return;\n\n const parts: string[] = [`🐦⬛ [Accessio] ← ❌ ERROR: ${error.message}`];\n\n if (error.code) {\n parts.push(` Code: ${error.code}`);\n }\n\n if (error.response) {\n parts.push(` Status: ${error.response.status}`);\n }\n\n console.log(parts.join('\\n'));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,2BAA0C;AAE1C,SAAS,YAAY,OAAuB;AAC1C,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;AACrD,SAAO,IAAI,QAAQ,KAAK,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAC9D;AAEA,SAAS,qBAAqB,QAI5B;AACA,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,SAAS,OAAO;AAAA,IAChB,OAAO,OAAO;AAAA,EAChB;AACF;AAEO,SAAS,WAAW,QAA+B,SAAuB;AAC/E,MAAI,CAAC,OAAO,MAAO;AAEnB,QAAM,OAAO,qBAAqB,MAAM;AAExC,QAAM,UAAU,OAAO,UAAU,OAAO,YAAY;AACpD,QAAM,MAAM,WAAW,OAAO,OAAO;AAErC,QAAM,QAAkB,CAAC,2CAAqB,MAAM,IAAI,GAAG,EAAE;AAE7D,MAAI,KAAK,UAAU,OAAO,KAAK,KAAK,MAAM,EAAE,SAAS,GAAG;AACtD,UAAM,KAAK,cAAc,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE;AAAA,EACxD;AAEA,MAAI,OAAO,QAAQ,OAAO,OAAO,SAAS,UAAU;AAClD,QAAI;AACJ,QAAI;AACF,gBAAU,KAAK,cAAU,iCAAW,OAAO,IAAI,CAAC;AAAA,IAClD,QAAQ;AACN,gBAAU;AAAA,IACZ;AACA,UAAM,YAAY,QAAQ,SAAS,MAAM,GAAG,QAAQ,UAAU,GAAG,GAAG,CAAC,QAAQ;AAC7E,UAAM,KAAK,YAAY,SAAS,EAAE;AAAA,EACpC;AAEA,MAAI,KAAK,SAAS;AAChB,UAAM,KAAK,eAAe,KAAK,OAAO,IAAI;AAAA,EAC5C;AAEA,MAAI,KAAK,OAAO;AACd,UAAM,KAAK,aAAa,KAAK,KAAK,GAAG;AAAA,EACvC;AAEA,UAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AAC9B;AAEO,SAAS,YAAY,UAAkC;AAC5D,MAAI,CAAC,SAAS,UAAU,CAAC,SAAS,OAAO,MAAO;AAChD,QAAM,SAAS,SAAS;AACxB,QAAM,aAAa,SAAS,cAAc;AAC1C,QAAM,WAAW,SAAS,YAAY,OAAO,GAAG,SAAS,QAAQ,OAAO;AAExE,QAAM,aAAa,UAAU,OAAO,SAAS,MAAM,WAAM,UAAU,MAAM,WAAM;AAE/E,QAAM,QAAkB,CAAC,2CAAqB,UAAU,IAAI,MAAM,IAAI,UAAU,KAAK,QAAQ,GAAG;AAEhG,MAAI,SAAS,MAAM;AACjB,QAAI;AACF,YAAM,OACJ,OAAO,SAAS,SAAS,WACrB,SAAS,KAAK,SACd,KAAK,UAAU,SAAS,IAAI,EAAE;AACpC,YAAM,KAAK,aAAa,YAAY,IAAI,CAAC,EAAE;AAAA,IAC7C,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,UAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AAC9B;AAEO,SAAS,SAAS,OAAsB,QAAsC;AACnF,MAAI,CAAC,UAAU,CAAC,OAAO,MAAO;AAE9B,QAAM,QAAkB,CAAC,yDAA8B,MAAM,OAAO,EAAE;AAEtE,MAAI,MAAM,MAAM;AACd,UAAM,KAAK,YAAY,MAAM,IAAI,EAAE;AAAA,EACrC;AAEA,MAAI,MAAM,UAAU;AAClB,UAAM,KAAK,cAAc,MAAM,SAAS,MAAM,EAAE;AAAA,EAClD;AAEA,UAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AAC9B;","names":[]}
|
package/cjs/helpers/settle.cjs
CHANGED
|
@@ -34,7 +34,7 @@ module.exports = __toCommonJS(settle_exports);
|
|
|
34
34
|
var import_accessioError = __toESM(require("../core/accessioError"), 1);
|
|
35
35
|
function settle(resolve, reject, response, config) {
|
|
36
36
|
const validateStatus = config.validateStatus;
|
|
37
|
-
if (!
|
|
37
|
+
if (!validateStatus || validateStatus(response.status)) {
|
|
38
38
|
resolve(response);
|
|
39
39
|
} else {
|
|
40
40
|
const error = new import_accessioError.default(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/helpers/settle.ts"],"sourcesContent":["import AccessioError from '../core/accessioError';\nimport type { AccessioResponse, AccessioRequestConfig } from '../types';\n\nexport default function settle(\n resolve: (value: AccessioResponse) => void,\n reject: (reason: AccessioError) => void,\n response: AccessioResponse,\n config: AccessioRequestConfig,\n): void {\n const validateStatus = config.validateStatus;\n\n if (!
|
|
1
|
+
{"version":3,"sources":["../../src/helpers/settle.ts"],"sourcesContent":["import AccessioError from '../core/accessioError';\nimport type { AccessioResponse, AccessioRequestConfig } from '../types';\n\nexport default function settle(\n resolve: (value: AccessioResponse) => void,\n reject: (reason: AccessioError) => void,\n response: AccessioResponse,\n config: AccessioRequestConfig,\n): void {\n const validateStatus = config.validateStatus;\n\n if (!validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n const error = new AccessioError(\n `Request failed with status code ${response.status}`,\n response.status >= 400 && response.status < 500\n ? AccessioError.ERR_BAD_REQUEST\n : AccessioError.ERR_BAD_RESPONSE,\n config,\n response.request,\n response,\n );\n reject(error);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAA0B;AAGX,SAAR,OACL,SACA,QACA,UACA,QACM;AACN,QAAM,iBAAiB,OAAO;AAE9B,MAAI,CAAC,kBAAkB,eAAe,SAAS,MAAM,GAAG;AACtD,YAAQ,QAAQ;AAAA,EAClB,OAAO;AACL,UAAM,QAAQ,IAAI,qBAAAA;AAAA,MAChB,mCAAmC,SAAS,MAAM;AAAA,MAClD,SAAS,UAAU,OAAO,SAAS,SAAS,MACxC,qBAAAA,QAAc,kBACd,qBAAAA,QAAc;AAAA,MAClB;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AACF;","names":["AccessioError"]}
|