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.
@@ -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) + "\u2026" : text}`,
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
- async function fetchAdapter(config, fullURL, fetchOptions, requestStartTime) {
68
- let abortController = null;
69
- let timeoutId = null;
70
- let isTimedOut = false;
71
- let onUserAbort = null;
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
- if (!isNaN(timeoutValue) && timeoutValue > 0) {
83
- abortController = new AbortController();
84
- timeoutId = setTimeout(() => {
85
- isTimedOut = true;
86
- abortController.abort(
87
- new import_accessioError.default(
88
- `timeout of ${timeoutValue}ms exceeded`,
89
- import_accessioError.default.ETIMEDOUT,
90
- config,
91
- null,
92
- null
93
- )
94
- );
95
- }, timeoutValue);
96
- if (config.signal) {
97
- if (typeof AbortSignal.any === "function") {
98
- fetchOptions.signal = AbortSignal.any([config.signal, abortController.signal]);
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
- if (config.signal.aborted) {
101
- abortController.abort(config.signal.reason);
102
- } else {
103
- onUserAbort = () => {
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 if (config.signal) {
118
- fetchOptions.signal = config.signal;
127
+ } else {
128
+ fetchOptions.signal = abortController.signal;
119
129
  }
120
- try {
121
- const fetchImpl = config.fetch || fetch;
122
- let fetchResponse = await fetchImpl(fullURL, fetchOptions);
123
- if (config.onDownloadProgress && fetchResponse.body && config.responseType !== "stream") {
124
- const contentLength2 = fetchResponse.headers.get("content-length");
125
- const total = contentLength2 ? parseInt(contentLength2, 10) : 0;
126
- let loaded = 0;
127
- const reader = fetchResponse.body.getReader();
128
- const stream = new ReadableStream({
129
- async start(controller) {
130
- try {
131
- while (true) {
132
- const { done, value } = await reader.read();
133
- if (done) {
134
- controller.close();
135
- break;
136
- }
137
- loaded += value.byteLength;
138
- config.onDownloadProgress({ loaded, total });
139
- controller.enqueue(value);
140
- }
141
- } catch (e) {
142
- controller.error(e);
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
- fetchResponse = new Response(stream, {
147
- headers: fetchResponse.headers,
148
- status: fetchResponse.status,
149
- statusText: fetchResponse.statusText
150
- });
161
+ } catch (e) {
162
+ controller.error(e);
163
+ }
151
164
  }
152
- let responseData;
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: responseHeaders,
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
- if (error instanceof import_accessioError.default) {
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
- if (timeoutId) clearTimeout(timeoutId);
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"]}
@@ -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 ? `GET:${fullURL}` : "";
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(cached);
122
+ await config.hooks.onRequestResponse(cachedView);
86
123
  }
87
- return cached;
124
+ return cachedView;
88
125
  }
89
126
  }
90
127
  if (isGet && config.dedupe) {
91
- if (activeRequests.has(cacheKey)) {
92
- return activeRequests.get(cacheKey);
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 new Promise((resolve, reject) => {
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
- activeRequests.set(cacheKey, promise);
171
+ trackActiveRequest(cacheKey, promise);
143
172
  const cleanup = () => {
144
- activeRequests.delete(cacheKey);
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 response = await promise;
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, response, config.cacheTTL);
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(response);
195
+ await config.hooks.onRequestResponse(settled);
156
196
  }
157
- return response;
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
@@ -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"]}
@@ -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
- const preview = JSON.stringify(config.data);
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 const preview = JSON.stringify(config.data);\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;AAGA,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,UAAM,UAAU,KAAK,UAAU,OAAO,IAAI;AAC1C,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":[]}
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":[]}
@@ -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 (!response.status || !validateStatus || validateStatus(response.status)) {
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 (!response.status || !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,SAAS,UAAU,CAAC,kBAAkB,eAAe,SAAS,MAAM,GAAG;AAC1E,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"]}
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"]}