accessio 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/cjs/accessio.cjs +43 -7
- package/cjs/accessio.cjs.map +1 -1
- package/cjs/core/buildURL.cjs +2 -2
- package/cjs/core/buildURL.cjs.map +1 -1
- package/cjs/core/fetchAdapter.cjs +187 -0
- package/cjs/core/fetchAdapter.cjs.map +1 -0
- package/cjs/core/mergeConfig.cjs +2 -2
- package/cjs/core/mergeConfig.cjs.map +1 -1
- package/cjs/core/request.cjs +23 -171
- package/cjs/core/request.cjs.map +1 -1
- package/cjs/core/retry.cjs +0 -3
- package/cjs/core/retry.cjs.map +1 -1
- package/cjs/defaults/transforms.cjs +8 -1
- package/cjs/defaults/transforms.cjs.map +1 -1
- package/cjs/helpers/auth.cjs +45 -0
- package/cjs/helpers/auth.cjs.map +1 -0
- package/cjs/helpers/flattenHeaders.cjs +78 -0
- package/cjs/helpers/flattenHeaders.cjs.map +1 -0
- package/cjs/helpers/parseHeaders.cjs +16 -4
- package/cjs/helpers/parseHeaders.cjs.map +1 -1
- package/cjs/helpers/rateLimiter.cjs +20 -12
- package/cjs/helpers/rateLimiter.cjs.map +1 -1
- package/cjs/helpers/transformData.cjs +2 -2
- package/cjs/helpers/transformData.cjs.map +1 -1
- package/package.json +3 -3
- package/src/accessio.ts +46 -8
- package/src/core/buildURL.ts +2 -2
- package/src/core/fetchAdapter.ts +184 -0
- package/src/core/mergeConfig.ts +2 -2
- package/src/core/request.ts +28 -193
- package/src/core/retry.ts +0 -4
- package/src/defaults/transforms.ts +12 -2
- package/src/helpers/auth.ts +26 -0
- package/src/helpers/flattenHeaders.ts +59 -0
- package/src/helpers/parseHeaders.ts +19 -6
- package/src/helpers/rateLimiter.ts +20 -12
- package/src/helpers/transformData.ts +4 -4
- package/src/types.ts +9 -5
package/cjs/core/request.cjs
CHANGED
|
@@ -32,95 +32,33 @@ __export(request_exports, {
|
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(request_exports);
|
|
34
34
|
var import_buildURL = __toESM(require("./buildURL"), 1);
|
|
35
|
-
var import_accessioError = __toESM(require("./accessioError"), 1);
|
|
36
|
-
var import_parseHeaders = __toESM(require("../helpers/parseHeaders"), 1);
|
|
37
35
|
var import_transformData = __toESM(require("../helpers/transformData"), 1);
|
|
38
36
|
var import_settle = __toESM(require("../helpers/settle"), 1);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"get",
|
|
43
|
-
"head",
|
|
44
|
-
"options",
|
|
45
|
-
"post",
|
|
46
|
-
"put",
|
|
47
|
-
"patch"
|
|
48
|
-
]);
|
|
49
|
-
function flattenHeaders(headers, method) {
|
|
50
|
-
if (!headers) return {};
|
|
51
|
-
const merged = {};
|
|
52
|
-
const methodLower = (method || "get").toLowerCase();
|
|
53
|
-
if (headers["common"]) {
|
|
54
|
-
Object.assign(merged, headers["common"]);
|
|
55
|
-
}
|
|
56
|
-
if (headers[methodLower]) {
|
|
57
|
-
Object.assign(merged, headers[methodLower]);
|
|
58
|
-
}
|
|
59
|
-
for (const key in headers) {
|
|
60
|
-
if (Object.prototype.hasOwnProperty.call(headers, key) && !METHOD_KEYS.has(key)) {
|
|
61
|
-
merged[key] = headers[key];
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return merged;
|
|
65
|
-
}
|
|
66
|
-
function removeContentType(headers) {
|
|
67
|
-
const key = Object.keys(headers).find((k) => k.toLowerCase() === "content-type");
|
|
68
|
-
if (key) {
|
|
69
|
-
delete headers[key];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
37
|
+
var import_flattenHeaders = require("../helpers/flattenHeaders");
|
|
38
|
+
var import_auth = require("../helpers/auth");
|
|
39
|
+
var import_fetchAdapter = __toESM(require("./fetchAdapter"), 1);
|
|
72
40
|
function buildTransformArray(transform) {
|
|
73
41
|
if (!transform) return [];
|
|
74
42
|
if (Array.isArray(transform)) return transform;
|
|
75
43
|
return [transform];
|
|
76
44
|
}
|
|
77
|
-
function
|
|
78
|
-
if (!config.auth) return;
|
|
79
|
-
const username = config.auth.username || "";
|
|
80
|
-
const password = config.auth.password || "";
|
|
81
|
-
const credentials = `${username}:${password}`;
|
|
82
|
-
let encoded;
|
|
83
|
-
if (typeof Buffer !== "undefined") {
|
|
84
|
-
encoded = Buffer.from(credentials).toString("base64");
|
|
85
|
-
} else {
|
|
86
|
-
const bytes = new TextEncoder().encode(credentials);
|
|
87
|
-
const binString = Array.from(bytes, (x) => String.fromCodePoint(x)).join("");
|
|
88
|
-
encoded = btoa(binString);
|
|
89
|
-
}
|
|
90
|
-
headers["Authorization"] = `Basic ${encoded}`;
|
|
91
|
-
}
|
|
92
|
-
async function readResponseData(fetchResponse, responseType) {
|
|
93
|
-
switch (responseType) {
|
|
94
|
-
case "arraybuffer":
|
|
95
|
-
return await fetchResponse.arrayBuffer();
|
|
96
|
-
case "blob":
|
|
97
|
-
return await fetchResponse.blob();
|
|
98
|
-
case "text":
|
|
99
|
-
return await fetchResponse.text();
|
|
100
|
-
case "stream":
|
|
101
|
-
return fetchResponse.body;
|
|
102
|
-
case "json":
|
|
103
|
-
default:
|
|
104
|
-
return await fetchResponse.text();
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
function dispatchRequest(config) {
|
|
45
|
+
async function dispatchRequest(config) {
|
|
108
46
|
const fullURL = config._builtUrl || (0, import_buildURL.default)(
|
|
109
47
|
config.url ?? "",
|
|
110
48
|
config.baseURL,
|
|
111
49
|
config.params,
|
|
112
50
|
config.paramsSerializer
|
|
113
51
|
);
|
|
114
|
-
const flatHeaders = flattenHeaders(config.headers, config.method);
|
|
52
|
+
const flatHeaders = (0, import_flattenHeaders.flattenHeaders)(config.headers, config.method);
|
|
115
53
|
const requestTransforms = buildTransformArray(config.transformRequest);
|
|
116
|
-
const requestData = (0, import_transformData.default)(requestTransforms, config.data, flatHeaders, config);
|
|
54
|
+
const requestData = await (0, import_transformData.default)(requestTransforms, config.data, flatHeaders, config);
|
|
117
55
|
if (requestData === null || requestData === void 0 || typeof FormData !== "undefined" && requestData instanceof FormData) {
|
|
118
|
-
removeContentType(flatHeaders);
|
|
56
|
+
(0, import_flattenHeaders.removeContentType)(flatHeaders);
|
|
119
57
|
}
|
|
120
|
-
setBasicAuth(config, flatHeaders);
|
|
58
|
+
(0, import_auth.setBasicAuth)(config, flatHeaders);
|
|
121
59
|
const fetchOptions = {
|
|
122
60
|
method: (config.method || "GET").toUpperCase(),
|
|
123
|
-
headers: flatHeaders
|
|
61
|
+
headers: (0, import_flattenHeaders.buildFetchHeaders)(flatHeaders)
|
|
124
62
|
};
|
|
125
63
|
const methodsWithBody = ["POST", "PUT", "PATCH", "DELETE"];
|
|
126
64
|
if (methodsWithBody.includes(fetchOptions.method) && requestData !== void 0 && requestData !== null) {
|
|
@@ -129,109 +67,23 @@ function dispatchRequest(config) {
|
|
|
129
67
|
if (config.withCredentials) {
|
|
130
68
|
fetchOptions.credentials = "include";
|
|
131
69
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
abortController = new AbortController();
|
|
138
|
-
timeoutId = setTimeout(() => {
|
|
139
|
-
isTimedOut = true;
|
|
140
|
-
abortController.abort(
|
|
141
|
-
new import_accessioError.default(
|
|
142
|
-
`timeout of ${config.timeout}ms exceeded`,
|
|
143
|
-
import_accessioError.default.ETIMEDOUT,
|
|
144
|
-
config,
|
|
145
|
-
null,
|
|
146
|
-
null
|
|
147
|
-
)
|
|
148
|
-
);
|
|
149
|
-
}, config.timeout);
|
|
150
|
-
if (config.signal) {
|
|
151
|
-
if (typeof AbortSignal.any === "function") {
|
|
152
|
-
fetchOptions.signal = AbortSignal.any([config.signal, abortController.signal]);
|
|
153
|
-
} else {
|
|
154
|
-
if (config.signal.aborted) {
|
|
155
|
-
abortController.abort(config.signal.reason);
|
|
156
|
-
} else {
|
|
157
|
-
onUserAbort = () => {
|
|
158
|
-
abortController.abort(config.signal.reason);
|
|
159
|
-
};
|
|
160
|
-
config.signal.addEventListener("abort", onUserAbort, {
|
|
161
|
-
once: true
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
fetchOptions.signal = abortController.signal;
|
|
165
|
-
}
|
|
166
|
-
} else {
|
|
167
|
-
fetchOptions.signal = abortController.signal;
|
|
168
|
-
}
|
|
169
|
-
} else if (config.signal) {
|
|
170
|
-
fetchOptions.signal = config.signal;
|
|
70
|
+
if (config.dispatcher) {
|
|
71
|
+
fetchOptions.dispatcher = config.dispatcher;
|
|
72
|
+
}
|
|
73
|
+
if (config.agent) {
|
|
74
|
+
fetchOptions.agent = config.agent;
|
|
171
75
|
}
|
|
172
76
|
const requestStartTime = Date.now();
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
config,
|
|
183
|
-
fetchResponse,
|
|
184
|
-
null
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
const responseHeaders = (0, import_parseHeaders.default)(fetchResponse.headers);
|
|
188
|
-
const responseTransforms = buildTransformArray(config.transformResponse);
|
|
189
|
-
responseData = (0, import_transformData.default)(responseTransforms, responseData, responseHeaders, config);
|
|
190
|
-
const response = {
|
|
191
|
-
data: responseData,
|
|
192
|
-
status: fetchResponse.status,
|
|
193
|
-
statusText: fetchResponse.statusText,
|
|
194
|
-
headers: responseHeaders,
|
|
195
|
-
config,
|
|
196
|
-
request: fetchResponse,
|
|
197
|
-
duration: Date.now() - requestStartTime
|
|
198
|
-
};
|
|
199
|
-
return new Promise((resolve, reject) => {
|
|
200
|
-
(0, import_settle.default)(
|
|
201
|
-
resolve,
|
|
202
|
-
reject,
|
|
203
|
-
response,
|
|
204
|
-
config
|
|
205
|
-
);
|
|
206
|
-
});
|
|
207
|
-
}).catch((error) => {
|
|
208
|
-
if (error instanceof import_accessioError.default) {
|
|
209
|
-
throw error;
|
|
210
|
-
}
|
|
211
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
212
|
-
if (isTimedOut) {
|
|
213
|
-
throw new import_accessioError.default(
|
|
214
|
-
`timeout of ${config.timeout}ms exceeded`,
|
|
215
|
-
import_accessioError.default.ETIMEDOUT,
|
|
216
|
-
config,
|
|
217
|
-
null,
|
|
218
|
-
null
|
|
219
|
-
);
|
|
220
|
-
}
|
|
221
|
-
throw new import_accessioError.default("Request aborted", import_accessioError.default.ERR_CANCELED, config, null, null);
|
|
222
|
-
}
|
|
223
|
-
throw import_accessioError.default.from(
|
|
224
|
-
error instanceof Error ? error : new Error(String(error)),
|
|
225
|
-
import_accessioError.default.ERR_NETWORK,
|
|
226
|
-
config,
|
|
227
|
-
null,
|
|
228
|
-
null
|
|
77
|
+
const response = await (0, import_fetchAdapter.default)(config, fullURL, fetchOptions, requestStartTime);
|
|
78
|
+
const responseTransforms = buildTransformArray(config.transformResponse);
|
|
79
|
+
response.data = await (0, import_transformData.default)(responseTransforms, response.data, response.headers, config);
|
|
80
|
+
return new Promise((resolve, reject) => {
|
|
81
|
+
(0, import_settle.default)(
|
|
82
|
+
resolve,
|
|
83
|
+
reject,
|
|
84
|
+
response,
|
|
85
|
+
config
|
|
229
86
|
);
|
|
230
|
-
}).finally(() => {
|
|
231
|
-
if (timeoutId) clearTimeout(timeoutId);
|
|
232
|
-
if (config.signal && onUserAbort) {
|
|
233
|
-
config.signal.removeEventListener("abort", onUserAbort);
|
|
234
|
-
}
|
|
235
87
|
});
|
|
236
88
|
}
|
|
237
89
|
//# 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 from './accessioError';\nimport parseHeaders from '../helpers/parseHeaders';\nimport transformData from '../helpers/transformData';\nimport settle from '../helpers/settle';\nimport type { AccessioRequestConfig, AccessioResponse, TransformFunction } from '../types';\n\nconst METHOD_KEYS = new Set<string>([\n 'common',\n 'delete',\n 'get',\n 'head',\n 'options',\n 'post',\n 'put',\n 'patch',\n]);\n\ntype HeadersConfig = Record<string, Record<string, string>>;\n\nfunction flattenHeaders(\n headers: HeadersConfig | undefined,\n method?: string,\n): Record<string, string> {\n if (!headers) return {};\n\n const merged: Record<string, string> = {};\n const methodLower = (method || 'get').toLowerCase();\n\n if (headers['common']) {\n Object.assign(merged, headers['common']);\n }\n\n if (headers[methodLower]) {\n Object.assign(merged, headers[methodLower]);\n }\n\n for (const key in headers) {\n if (Object.prototype.hasOwnProperty.call(headers, key) && !METHOD_KEYS.has(key)) {\n merged[key] = headers[key] as unknown as string;\n }\n }\n\n return merged;\n}\n\nfunction removeContentType(headers: Record<string, string>): void {\n const key = Object.keys(headers).find((k) => k.toLowerCase() === 'content-type');\n if (key) {\n delete headers[key];\n }\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\nfunction setBasicAuth(config: AccessioRequestConfig, headers: Record<string, string>): void {\n if (!config.auth) return;\n const username = config.auth.username || '';\n const password = config.auth.password || '';\n const credentials = `${username}:${password}`;\n\n let encoded: string;\n if (typeof Buffer !== 'undefined') {\n encoded = Buffer.from(credentials).toString('base64');\n } else {\n const bytes = new TextEncoder().encode(credentials);\n const binString = Array.from(bytes, (x) => String.fromCodePoint(x)).join('');\n encoded = btoa(binString);\n }\n headers['Authorization'] = `Basic ${encoded}`;\n}\n\nasync function readResponseData(fetchResponse: Response, responseType: string): Promise<unknown> {\n switch (responseType) {\n case 'arraybuffer': return await fetchResponse.arrayBuffer();\n case 'blob': return await fetchResponse.blob();\n case 'text': return await fetchResponse.text();\n case 'stream': return fetchResponse.body;\n case 'json':\n default: return await fetchResponse.text();\n }\n}\n\nexport default function dispatchRequest(config: AccessioRequestConfig): 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 const flatHeaders = flattenHeaders(config.headers as HeadersConfig | undefined, config.method);\n\n const requestTransforms = buildTransformArray(config.transformRequest);\n\n const requestData = 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: 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 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 (config.timeout && config.timeout > 0) {\n abortController = new AbortController();\n\n timeoutId = setTimeout(() => {\n isTimedOut = true;\n abortController!.abort(\n new AccessioError(\n `timeout of ${config.timeout}ms exceeded`,\n AccessioError.ETIMEDOUT,\n config,\n null,\n null,\n ),\n );\n }, config.timeout);\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 abortController!.abort(config.signal!.reason);\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 const requestStartTime = Date.now();\n\n return fetch(fullURL, fetchOptions)\n .then(async (fetchResponse) => {\n let responseData: unknown;\n const responseType = config.responseType || 'json';\n\n try {\n responseData = await readResponseData(fetchResponse, responseType);\n } catch (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 const responseTransforms = buildTransformArray(config.transformResponse);\n\n responseData = transformData(responseTransforms, responseData, responseHeaders, config);\n\n const response: AccessioResponse = {\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\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 .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 throw AccessioError.from(\n error instanceof Error ? error : new Error(String(error)),\n AccessioError.ERR_NETWORK,\n config,\n null,\n null,\n );\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":["buildURL","transformData","AccessioError","parseHeaders","settle"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/request.ts"],"sourcesContent":["import buildURL from './buildURL';\nimport AccessioError from './accessioError';\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 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\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 const flatHeaders = flattenHeaders(config.headers as HeadersConfig | undefined, config.method);\n\n const requestTransforms = buildTransformArray(config.transformRequest);\n\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\n const responseTransforms = buildTransformArray(config.transformResponse);\n\n response.data = await transformData(responseTransforms, response.data, response.headers, config);\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAqB;AAErB,2BAA0B;AAC1B,oBAAmB;AACnB,4BAAqE;AACrE,kBAA6B;AAC7B,0BAAyB;AAKzB,SAAS,oBACP,WACqB;AACrB,MAAI,CAAC,UAAW,QAAO,CAAC;AACxB,MAAI,MAAM,QAAQ,SAAS,EAAG,QAAO;AACrC,SAAO,CAAC,SAAS;AACnB;AAEA,eAAO,gBACL,QAC2B;AAC3B,QAAM,UACJ,OAAO,iBACP,gBAAAA;AAAA,IACE,OAAO,OAAO;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAEF,QAAM,kBAAc,sCAAe,OAAO,SAAsC,OAAO,MAAM;AAE7F,QAAM,oBAAoB,oBAAoB,OAAO,gBAAgB;AAErE,QAAM,cAAc,UAAM,qBAAAC,SAAc,mBAAmB,OAAO,MAAM,aAAa,MAAM;AAE3F,MACE,gBAAgB,QAChB,gBAAgB,UACf,OAAO,aAAa,eAAe,uBAAuB,UAC3D;AACA,iDAAkB,WAAW;AAAA,EAC/B;AAEA,gCAAa,QAAQ,WAAW;AAEhC,QAAM,eAA4B;AAAA,IAChC,SAAS,OAAO,UAAU,OAAO,YAAY;AAAA,IAC7C,aAAS,yCAAkB,WAAW;AAAA,EACxC;AAEA,QAAM,kBAAkB,CAAC,QAAQ,OAAO,SAAS,QAAQ;AACzD,MACE,gBAAgB,SAAS,aAAa,MAAO,KAC7C,gBAAgB,UAChB,gBAAgB,MAChB;AACA,iBAAa,OAAO;AAAA,EACtB;AAEA,MAAI,OAAO,iBAAiB;AAC1B,iBAAa,cAAc;AAAA,EAC7B;AAEA,MAAI,OAAO,YAAY;AACrB,IAAC,aAAqB,aAAa,OAAO;AAAA,EAC5C;AACA,MAAI,OAAO,OAAO;AAChB,IAAC,aAAqB,QAAQ,OAAO;AAAA,EACvC;AAEA,QAAM,mBAAmB,KAAK,IAAI;AAElC,QAAM,WAAW,UAAM,oBAAAC,SAAa,QAAQ,SAAS,cAAc,gBAAgB;AAEnF,QAAM,qBAAqB,oBAAoB,OAAO,iBAAiB;AAEvE,WAAS,OAAO,UAAM,qBAAAD,SAAc,oBAAoB,SAAS,MAAM,SAAS,SAAS,MAAM;AAE/F,SAAO,IAAI,QAA0B,CAAC,SAAS,WAAW;AACxD,sBAAAE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":["buildURL","transformData","fetchAdapter","settle"]}
|
package/cjs/core/retry.cjs
CHANGED
|
@@ -31,9 +31,6 @@ function defaultRetryCondition(error) {
|
|
|
31
31
|
if (error.code === import_errorCodes.ERR_NETWORK) {
|
|
32
32
|
return true;
|
|
33
33
|
}
|
|
34
|
-
if (error.code === import_errorCodes.ETIMEDOUT) {
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
37
34
|
if (error.response && error.response.status >= 500) {
|
|
38
35
|
return true;
|
|
39
36
|
}
|
package/cjs/core/retry.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/retry.ts"],"sourcesContent":["import { ERR_CANCELED, ERR_NETWORK, ETIMEDOUT } from '../constants/errorCodes';\nimport type {\n AccessioRequestConfig,\n AccessioResponse,\n AccessioError,\n RetryConditionFunction,\n OnRetryFunction,\n} from '../types';\n\nfunction defaultRetryCondition(error: any): boolean {\n if (error.code === ERR_CANCELED) {\n return false;\n }\n\n if (error.code === ERR_NETWORK) {\n return true;\n }\n\n if (error.
|
|
1
|
+
{"version":3,"sources":["../../src/core/retry.ts"],"sourcesContent":["import { ERR_CANCELED, ERR_NETWORK, ETIMEDOUT } from '../constants/errorCodes';\nimport type {\n AccessioRequestConfig,\n AccessioResponse,\n AccessioError,\n RetryConditionFunction,\n OnRetryFunction,\n} from '../types';\n\nfunction defaultRetryCondition(error: any): boolean {\n if (error.code === ERR_CANCELED) {\n return false;\n }\n\n if (error.code === ERR_NETWORK) {\n return true;\n }\n\n if (error.response && error.response.status >= 500) {\n return true;\n }\n\n return false;\n}\n\nfunction calculateDelay(attempt: number, baseDelay: number): number {\n const exponentialDelay = baseDelay * Math.pow(2, attempt);\n const jitter = exponentialDelay * 0.25 * (Math.random() * 2 - 1);\n return Math.round(exponentialDelay + jitter);\n}\n\nfunction sleep(ms: number, options?: { signal?: AbortSignal }): Promise<void> {\n return new Promise((resolve, reject) => {\n let onAbort: (() => void) | undefined;\n\n const timeoutId = setTimeout(() => {\n if (options?.signal && onAbort) {\n options.signal.removeEventListener('abort', onAbort);\n }\n resolve();\n }, ms);\n\n if (options?.signal) {\n if (options.signal.aborted) {\n clearTimeout(timeoutId);\n return reject(options.signal.reason || new Error('Sleep aborted'));\n }\n\n onAbort = () => {\n clearTimeout(timeoutId);\n reject(options.signal!.reason || new Error('Sleep aborted'));\n };\n\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n });\n}\n\nasync function retryRequest(\n dispatchFn: (config: AccessioRequestConfig) => Promise<any>,\n config: AccessioRequestConfig,\n): Promise<any> {\n const maxRetries = config.retry ?? 0;\n\n if (maxRetries <= 0) {\n return dispatchFn(config);\n }\n\n const retryDelay = config.retryDelay ?? 1000;\n const retryCondition: RetryConditionFunction = config.retryCondition ?? defaultRetryCondition;\n\n let lastError: any;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const response = await dispatchFn(config);\n return response;\n } catch (error) {\n lastError = error;\n\n const isLastAttempt = attempt >= maxRetries;\n const shouldRetry = !isLastAttempt && retryCondition(error as AccessioError);\n\n if (!shouldRetry) {\n throw error;\n }\n\n const delay = calculateDelay(attempt, retryDelay);\n\n if (typeof config.onRetry === 'function') {\n (config.onRetry as OnRetryFunction)(attempt + 1, error as AccessioError, config);\n }\n\n await sleep(delay, { signal: config.signal });\n }\n }\n\n throw lastError;\n}\n\nexport { defaultRetryCondition, calculateDelay };\nexport default retryRequest;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAqD;AASrD,SAAS,sBAAsB,OAAqB;AAClD,MAAI,MAAM,SAAS,gCAAc;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,+BAAa;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,YAAY,MAAM,SAAS,UAAU,KAAK;AAClD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,SAAiB,WAA2B;AAClE,QAAM,mBAAmB,YAAY,KAAK,IAAI,GAAG,OAAO;AACxD,QAAM,SAAS,mBAAmB,QAAQ,KAAK,OAAO,IAAI,IAAI;AAC9D,SAAO,KAAK,MAAM,mBAAmB,MAAM;AAC7C;AAEA,SAAS,MAAM,IAAY,SAAmD;AAC5E,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI;AAEJ,UAAM,YAAY,WAAW,MAAM;AACjC,UAAI,SAAS,UAAU,SAAS;AAC9B,gBAAQ,OAAO,oBAAoB,SAAS,OAAO;AAAA,MACrD;AACA,cAAQ;AAAA,IACV,GAAG,EAAE;AAEL,QAAI,SAAS,QAAQ;AACnB,UAAI,QAAQ,OAAO,SAAS;AAC1B,qBAAa,SAAS;AACtB,eAAO,OAAO,QAAQ,OAAO,UAAU,IAAI,MAAM,eAAe,CAAC;AAAA,MACnE;AAEA,gBAAU,MAAM;AACd,qBAAa,SAAS;AACtB,eAAO,QAAQ,OAAQ,UAAU,IAAI,MAAM,eAAe,CAAC;AAAA,MAC7D;AAEA,cAAQ,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IAClE;AAAA,EACF,CAAC;AACH;AAEA,eAAe,aACb,YACA,QACc;AACd,QAAM,aAAa,OAAO,SAAS;AAEnC,MAAI,cAAc,GAAG;AACnB,WAAO,WAAW,MAAM;AAAA,EAC1B;AAEA,QAAM,aAAa,OAAO,cAAc;AACxC,QAAM,iBAAyC,OAAO,kBAAkB;AAExE,MAAI;AAEJ,WAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,QAAI;AACF,YAAM,WAAW,MAAM,WAAW,MAAM;AACxC,aAAO;AAAA,IACT,SAAS,OAAO;AACd,kBAAY;AAEZ,YAAM,gBAAgB,WAAW;AACjC,YAAM,cAAc,CAAC,iBAAiB,eAAe,KAAsB;AAE3E,UAAI,CAAC,aAAa;AAChB,cAAM;AAAA,MACR;AAEA,YAAM,QAAQ,eAAe,SAAS,UAAU;AAEhD,UAAI,OAAO,OAAO,YAAY,YAAY;AACxC,QAAC,OAAO,QAA4B,UAAU,GAAG,OAAwB,MAAM;AAAA,MACjF;AAEA,YAAM,MAAM,OAAO,EAAE,QAAQ,OAAO,OAAO,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM;AACR;AAGA,IAAO,gBAAQ;","names":[]}
|
|
@@ -38,7 +38,14 @@ function defaultTransformRequest(data, headers) {
|
|
|
38
38
|
headers["Content-Type"] = "application/json";
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
|
|
41
|
+
try {
|
|
42
|
+
return JSON.stringify(data);
|
|
43
|
+
} catch (e) {
|
|
44
|
+
if (e instanceof TypeError && e.message.toLowerCase().includes("circular")) {
|
|
45
|
+
throw new Error("Accessio: Cannot stringify circular structure in request data");
|
|
46
|
+
}
|
|
47
|
+
throw e;
|
|
48
|
+
}
|
|
42
49
|
}
|
|
43
50
|
return data;
|
|
44
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/defaults/transforms.ts"],"sourcesContent":["export function defaultTransformRequest(data: unknown
|
|
1
|
+
{"version":3,"sources":["../../src/defaults/transforms.ts"],"sourcesContent":["export function defaultTransformRequest(\n data: unknown,\n headers: Record<string, string | string[]>,\n): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (\n typeof data === 'string' ||\n data instanceof ArrayBuffer ||\n (typeof Blob !== 'undefined' && data instanceof Blob) ||\n (typeof FormData !== 'undefined' && data instanceof FormData) ||\n (typeof URLSearchParams !== 'undefined' && data instanceof URLSearchParams) ||\n (typeof ReadableStream !== 'undefined' && data instanceof ReadableStream)\n ) {\n return data;\n }\n\n if (typeof data === 'object') {\n if (headers && typeof headers === 'object') {\n const hasContentType = Object.keys(headers).some(\n (key) => key.toLowerCase() === 'content-type',\n );\n if (!hasContentType) {\n headers['Content-Type'] = 'application/json';\n }\n }\n try {\n return JSON.stringify(data);\n } catch (e: any) {\n if (e instanceof TypeError && e.message.toLowerCase().includes('circular')) {\n throw new Error('Accessio: Cannot stringify circular structure in request data');\n }\n throw e;\n }\n }\n\n return data;\n}\n\nexport function defaultTransformResponse(data: unknown): unknown {\n if (typeof data === 'string') {\n try {\n return JSON.parse(data);\n } catch {\n // Not JSON — return as-is\n }\n }\n return data;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,SAAS,wBACd,MACA,SACS;AACT,MAAI,SAAS,QAAQ,SAAS,QAAW;AACvC,WAAO;AAAA,EACT;AAEA,MACE,OAAO,SAAS,YAChB,gBAAgB,eACf,OAAO,SAAS,eAAe,gBAAgB,QAC/C,OAAO,aAAa,eAAe,gBAAgB,YACnD,OAAO,oBAAoB,eAAe,gBAAgB,mBAC1D,OAAO,mBAAmB,eAAe,gBAAgB,gBAC1D;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,YAAM,iBAAiB,OAAO,KAAK,OAAO,EAAE;AAAA,QAC1C,CAAC,QAAQ,IAAI,YAAY,MAAM;AAAA,MACjC;AACA,UAAI,CAAC,gBAAgB;AACnB,gBAAQ,cAAc,IAAI;AAAA,MAC5B;AAAA,IACF;AACA,QAAI;AACF,aAAO,KAAK,UAAU,IAAI;AAAA,IAC5B,SAAS,GAAQ;AACf,UAAI,aAAa,aAAa,EAAE,QAAQ,YAAY,EAAE,SAAS,UAAU,GAAG;AAC1E,cAAM,IAAI,MAAM,+DAA+D;AAAA,MACjF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,yBAAyB,MAAwB;AAC/D,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var auth_exports = {};
|
|
20
|
+
__export(auth_exports, {
|
|
21
|
+
setBasicAuth: () => setBasicAuth
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(auth_exports);
|
|
24
|
+
function setBasicAuth(config, headers) {
|
|
25
|
+
if (!config.auth) return;
|
|
26
|
+
const username = config.auth.username || "";
|
|
27
|
+
const password = config.auth.password || "";
|
|
28
|
+
const credentials = `${username}:${password}`;
|
|
29
|
+
let encoded;
|
|
30
|
+
if (typeof Buffer !== "undefined") {
|
|
31
|
+
encoded = Buffer.from(credentials).toString("base64");
|
|
32
|
+
} else {
|
|
33
|
+
encoded = btoa(
|
|
34
|
+
encodeURIComponent(credentials).replace(/%([0-9A-F]{2})/g, (match, p1) => {
|
|
35
|
+
return String.fromCharCode(parseInt(p1, 16));
|
|
36
|
+
})
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
headers["Authorization"] = `Basic ${encoded}`;
|
|
40
|
+
}
|
|
41
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
42
|
+
0 && (module.exports = {
|
|
43
|
+
setBasicAuth
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=auth.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/helpers/auth.ts"],"sourcesContent":["import type { AccessioRequestConfig } from '../types';\n\nexport function setBasicAuth(\n config: AccessioRequestConfig,\n headers: Record<string, string | string[]>,\n): void {\n if (!config.auth) return;\n const username = config.auth.username || '';\n const password = config.auth.password || '';\n const credentials = `${username}:${password}`;\n\n let encoded: string;\n if (typeof Buffer !== 'undefined') {\n encoded = Buffer.from(credentials).toString('base64');\n } else {\n // Cryptic but effective UTF-8 to Base64 conversion for browsers lacking Buffer.\n // encodeURIComponent converts non-ASCII to %XX, then we replace %XX with raw bytes\n // before applying btoa.\n encoded = btoa(\n encodeURIComponent(credentials).replace(/%([0-9A-F]{2})/g, (match, p1) => {\n return String.fromCharCode(parseInt(p1, 16));\n }),\n );\n }\n headers['Authorization'] = `Basic ${encoded}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,aACd,QACA,SACM;AACN,MAAI,CAAC,OAAO,KAAM;AAClB,QAAM,WAAW,OAAO,KAAK,YAAY;AACzC,QAAM,WAAW,OAAO,KAAK,YAAY;AACzC,QAAM,cAAc,GAAG,QAAQ,IAAI,QAAQ;AAE3C,MAAI;AACJ,MAAI,OAAO,WAAW,aAAa;AACjC,cAAU,OAAO,KAAK,WAAW,EAAE,SAAS,QAAQ;AAAA,EACtD,OAAO;AAIL,cAAU;AAAA,MACR,mBAAmB,WAAW,EAAE,QAAQ,mBAAmB,CAAC,OAAO,OAAO;AACxE,eAAO,OAAO,aAAa,SAAS,IAAI,EAAE,CAAC;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF;AACA,UAAQ,eAAe,IAAI,SAAS,OAAO;AAC7C;","names":[]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var flattenHeaders_exports = {};
|
|
20
|
+
__export(flattenHeaders_exports, {
|
|
21
|
+
buildFetchHeaders: () => buildFetchHeaders,
|
|
22
|
+
flattenHeaders: () => flattenHeaders,
|
|
23
|
+
removeContentType: () => removeContentType
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(flattenHeaders_exports);
|
|
26
|
+
const METHOD_KEYS = /* @__PURE__ */ new Set([
|
|
27
|
+
"common",
|
|
28
|
+
"delete",
|
|
29
|
+
"get",
|
|
30
|
+
"head",
|
|
31
|
+
"options",
|
|
32
|
+
"post",
|
|
33
|
+
"put",
|
|
34
|
+
"patch"
|
|
35
|
+
]);
|
|
36
|
+
function flattenHeaders(headers, method) {
|
|
37
|
+
if (!headers) return {};
|
|
38
|
+
const merged = {};
|
|
39
|
+
const methodLower = (method || "get").toLowerCase();
|
|
40
|
+
if (headers["common"]) {
|
|
41
|
+
Object.assign(merged, headers["common"]);
|
|
42
|
+
}
|
|
43
|
+
if (headers[methodLower]) {
|
|
44
|
+
Object.assign(merged, headers[methodLower]);
|
|
45
|
+
}
|
|
46
|
+
for (const key in headers) {
|
|
47
|
+
if (Object.prototype.hasOwnProperty.call(headers, key) && !METHOD_KEYS.has(key)) {
|
|
48
|
+
merged[key] = headers[key];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return merged;
|
|
52
|
+
}
|
|
53
|
+
function removeContentType(headers) {
|
|
54
|
+
const keys = Object.keys(headers).filter((k) => k.toLowerCase() === "content-type");
|
|
55
|
+
for (const key of keys) {
|
|
56
|
+
delete headers[key];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function buildFetchHeaders(headers) {
|
|
60
|
+
const fetchHeaders = new Headers();
|
|
61
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
62
|
+
if (Array.isArray(value)) {
|
|
63
|
+
for (const v of value) {
|
|
64
|
+
fetchHeaders.append(key, v);
|
|
65
|
+
}
|
|
66
|
+
} else {
|
|
67
|
+
fetchHeaders.set(key, value);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return fetchHeaders;
|
|
71
|
+
}
|
|
72
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
73
|
+
0 && (module.exports = {
|
|
74
|
+
buildFetchHeaders,
|
|
75
|
+
flattenHeaders,
|
|
76
|
+
removeContentType
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=flattenHeaders.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/helpers/flattenHeaders.ts"],"sourcesContent":["const METHOD_KEYS = new Set<string>([\n 'common',\n 'delete',\n 'get',\n 'head',\n 'options',\n 'post',\n 'put',\n 'patch',\n]);\n\ntype HeadersConfig = Record<string, Record<string, string | string[]>>;\n\nexport function flattenHeaders(\n headers: HeadersConfig | undefined,\n method?: string,\n): Record<string, string | string[]> {\n if (!headers) return {};\n\n const merged: Record<string, string | string[]> = {};\n const methodLower = (method || 'get').toLowerCase();\n\n if (headers['common']) {\n Object.assign(merged, headers['common']);\n }\n\n if (headers[methodLower]) {\n Object.assign(merged, headers[methodLower]);\n }\n\n for (const key in headers) {\n if (Object.prototype.hasOwnProperty.call(headers, key) && !METHOD_KEYS.has(key)) {\n merged[key] = headers[key] as unknown as string | string[];\n }\n }\n\n return merged;\n}\n\nexport function removeContentType(headers: Record<string, string | string[]>): void {\n const keys = Object.keys(headers).filter((k) => k.toLowerCase() === 'content-type');\n for (const key of keys) {\n delete headers[key];\n }\n}\n\nexport function buildFetchHeaders(headers: Record<string, string | string[]>): Headers {\n const fetchHeaders = new Headers();\n for (const [key, value] of Object.entries(headers)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n fetchHeaders.append(key, v);\n }\n } else {\n fetchHeaders.set(key, value);\n }\n }\n return fetchHeaders;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,cAAc,oBAAI,IAAY;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,SAAS,eACd,SACA,QACmC;AACnC,MAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,QAAM,SAA4C,CAAC;AACnD,QAAM,eAAe,UAAU,OAAO,YAAY;AAElD,MAAI,QAAQ,QAAQ,GAAG;AACrB,WAAO,OAAO,QAAQ,QAAQ,QAAQ,CAAC;AAAA,EACzC;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,OAAO,QAAQ,QAAQ,WAAW,CAAC;AAAA,EAC5C;AAEA,aAAW,OAAO,SAAS;AACzB,QAAI,OAAO,UAAU,eAAe,KAAK,SAAS,GAAG,KAAK,CAAC,YAAY,IAAI,GAAG,GAAG;AAC/E,aAAO,GAAG,IAAI,QAAQ,GAAG;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,SAAkD;AAClF,QAAM,OAAO,OAAO,KAAK,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,cAAc;AAClF,aAAW,OAAO,MAAM;AACtB,WAAO,QAAQ,GAAG;AAAA,EACpB;AACF;AAEO,SAAS,kBAAkB,SAAqD;AACrF,QAAM,eAAe,IAAI,QAAQ;AACjC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAW,KAAK,OAAO;AACrB,qBAAa,OAAO,KAAK,CAAC;AAAA,MAC5B;AAAA,IACF,OAAO;AACL,mBAAa,IAAI,KAAK,KAAK;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
|
|
@@ -24,9 +24,21 @@ module.exports = __toCommonJS(parseHeaders_exports);
|
|
|
24
24
|
function parseHeaders(headers) {
|
|
25
25
|
const parsed = {};
|
|
26
26
|
if (!headers) return parsed;
|
|
27
|
+
const addHeader = (key, value) => {
|
|
28
|
+
const k = key.toLowerCase();
|
|
29
|
+
if (parsed[k]) {
|
|
30
|
+
if (Array.isArray(parsed[k])) {
|
|
31
|
+
parsed[k].push(value);
|
|
32
|
+
} else {
|
|
33
|
+
parsed[k] = [parsed[k], value];
|
|
34
|
+
}
|
|
35
|
+
} else {
|
|
36
|
+
parsed[k] = value;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
27
39
|
if (typeof headers.forEach === "function") {
|
|
28
40
|
headers.forEach((value, key) => {
|
|
29
|
-
|
|
41
|
+
addHeader(key, value);
|
|
30
42
|
});
|
|
31
43
|
return parsed;
|
|
32
44
|
}
|
|
@@ -34,16 +46,16 @@ function parseHeaders(headers) {
|
|
|
34
46
|
headers.split("\n").forEach((line) => {
|
|
35
47
|
const index = line.indexOf(":");
|
|
36
48
|
if (index > 0) {
|
|
37
|
-
const key = line.substring(0, index).trim()
|
|
49
|
+
const key = line.substring(0, index).trim();
|
|
38
50
|
const value = line.substring(index + 1).trim();
|
|
39
|
-
|
|
51
|
+
addHeader(key, value);
|
|
40
52
|
}
|
|
41
53
|
});
|
|
42
54
|
return parsed;
|
|
43
55
|
}
|
|
44
56
|
if (typeof headers === "object") {
|
|
45
57
|
Object.keys(headers).forEach((key) => {
|
|
46
|
-
|
|
58
|
+
addHeader(key, headers[key]);
|
|
47
59
|
});
|
|
48
60
|
return parsed;
|
|
49
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/helpers/parseHeaders.ts"],"sourcesContent":["export default function parseHeaders(headers: any): Record<string, string> {\n const parsed: Record<string, string> = {};\n\n if (!headers) return parsed;\n\n if (typeof headers.forEach === 'function') {\n headers.forEach((value: string, key: string) => {\n
|
|
1
|
+
{"version":3,"sources":["../../src/helpers/parseHeaders.ts"],"sourcesContent":["export default function parseHeaders(headers: any): Record<string, string | string[]> {\n const parsed: Record<string, string | string[]> = {};\n\n if (!headers) return parsed;\n\n const addHeader = (key: string, value: string) => {\n const k = key.toLowerCase();\n if (parsed[k]) {\n if (Array.isArray(parsed[k])) {\n (parsed[k] as string[]).push(value);\n } else {\n parsed[k] = [parsed[k] as string, value];\n }\n } else {\n parsed[k] = value;\n }\n };\n\n if (typeof headers.forEach === 'function') {\n headers.forEach((value: string, key: string) => {\n addHeader(key, value);\n });\n return parsed;\n }\n\n if (typeof headers === 'string') {\n headers.split('\\n').forEach((line: string) => {\n const index = line.indexOf(':');\n if (index > 0) {\n const key = line.substring(0, index).trim();\n const value = line.substring(index + 1).trim();\n addHeader(key, value);\n }\n });\n return parsed;\n }\n\n if (typeof headers === 'object') {\n Object.keys(headers).forEach((key) => {\n addHeader(key, headers[key]);\n });\n return parsed;\n }\n\n return parsed;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAe,SAAR,aAA8B,SAAiD;AACpF,QAAM,SAA4C,CAAC;AAEnD,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,YAAY,CAAC,KAAa,UAAkB;AAChD,UAAM,IAAI,IAAI,YAAY;AAC1B,QAAI,OAAO,CAAC,GAAG;AACb,UAAI,MAAM,QAAQ,OAAO,CAAC,CAAC,GAAG;AAC5B,QAAC,OAAO,CAAC,EAAe,KAAK,KAAK;AAAA,MACpC,OAAO;AACL,eAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAa,KAAK;AAAA,MACzC;AAAA,IACF,OAAO;AACL,aAAO,CAAC,IAAI;AAAA,IACd;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,YAAY,YAAY;AACzC,YAAQ,QAAQ,CAAC,OAAe,QAAgB;AAC9C,gBAAU,KAAK,KAAK;AAAA,IACtB,CAAC;AACD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,YAAY,UAAU;AAC/B,YAAQ,MAAM,IAAI,EAAE,QAAQ,CAAC,SAAiB;AAC5C,YAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,UAAI,QAAQ,GAAG;AACb,cAAM,MAAM,KAAK,UAAU,GAAG,KAAK,EAAE,KAAK;AAC1C,cAAM,QAAQ,KAAK,UAAU,QAAQ,CAAC,EAAE,KAAK;AAC7C,kBAAU,KAAK,KAAK;AAAA,MACtB;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,KAAK,OAAO,EAAE,QAAQ,CAAC,QAAQ;AACpC,gBAAU,KAAK,QAAQ,GAAG,CAAC;AAAA,IAC7B,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -36,8 +36,9 @@ function createRateLimiter(maxConcurrent = Infinity, maxQueueSize = Infinity) {
|
|
|
36
36
|
}
|
|
37
37
|
let active = 0;
|
|
38
38
|
let destroyed = false;
|
|
39
|
-
let
|
|
40
|
-
let
|
|
39
|
+
let head = 0;
|
|
40
|
+
let tail = 0;
|
|
41
|
+
let pendingCount = 0;
|
|
41
42
|
const queue = {};
|
|
42
43
|
function acquire() {
|
|
43
44
|
if (destroyed) {
|
|
@@ -47,30 +48,37 @@ function createRateLimiter(maxConcurrent = Infinity, maxQueueSize = Infinity) {
|
|
|
47
48
|
active++;
|
|
48
49
|
return Promise.resolve();
|
|
49
50
|
}
|
|
50
|
-
if (
|
|
51
|
-
return Promise.reject(
|
|
51
|
+
if (pendingCount >= maxQueueSize) {
|
|
52
|
+
return Promise.reject(
|
|
53
|
+
new Error(`[Accessio] Rate limiter queue size exceeded maxQueueSize (${maxQueueSize})`)
|
|
54
|
+
);
|
|
52
55
|
}
|
|
53
56
|
return new Promise((resolve, reject) => {
|
|
54
|
-
queue[
|
|
57
|
+
queue[tail++] = { resolve, reject };
|
|
58
|
+
pendingCount++;
|
|
55
59
|
});
|
|
56
60
|
}
|
|
57
61
|
function release() {
|
|
58
62
|
if (destroyed) return;
|
|
59
63
|
if (active <= 0) return;
|
|
60
64
|
active--;
|
|
61
|
-
if (
|
|
65
|
+
if (pendingCount > 0 && active < maxConcurrent) {
|
|
62
66
|
active++;
|
|
63
|
-
const next = queue[
|
|
64
|
-
delete queue[
|
|
67
|
+
const next = queue[head];
|
|
68
|
+
delete queue[head];
|
|
69
|
+
head++;
|
|
70
|
+
pendingCount--;
|
|
65
71
|
next?.resolve();
|
|
66
72
|
}
|
|
67
73
|
}
|
|
68
74
|
function destroy() {
|
|
69
75
|
destroyed = true;
|
|
70
76
|
const reason = new Error("[Accessio] Rate limiter destroyed \u2014 pending request cancelled");
|
|
71
|
-
while (
|
|
72
|
-
const next = queue[
|
|
73
|
-
delete queue[
|
|
77
|
+
while (pendingCount > 0) {
|
|
78
|
+
const next = queue[head];
|
|
79
|
+
delete queue[head];
|
|
80
|
+
head++;
|
|
81
|
+
pendingCount--;
|
|
74
82
|
next?.reject(reason);
|
|
75
83
|
}
|
|
76
84
|
}
|
|
@@ -79,7 +87,7 @@ function createRateLimiter(maxConcurrent = Infinity, maxQueueSize = Infinity) {
|
|
|
79
87
|
release,
|
|
80
88
|
destroy,
|
|
81
89
|
get pending() {
|
|
82
|
-
return
|
|
90
|
+
return pendingCount;
|
|
83
91
|
},
|
|
84
92
|
get active() {
|
|
85
93
|
return active;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/helpers/rateLimiter.ts"],"sourcesContent":["import type { RateLimiter, AccessioRequestConfig, AccessioResponse } from '../types';\n\ninterface QueueItem {\n resolve: () => void;\n reject: (reason: Error) => void;\n}\n\nexport function createRateLimiter(\n maxConcurrent: number = Infinity,\n maxQueueSize: number = Infinity,\n): RateLimiter {\n if (maxConcurrent !== Infinity && (!Number.isInteger(maxConcurrent) || maxConcurrent < 1)) {\n throw new RangeError(\n `[Accessio] maxConcurrent must be a positive integer or Infinity, got: ${maxConcurrent}`,\n );\n }\n if (maxQueueSize !== Infinity && (!Number.isInteger(maxQueueSize) || maxQueueSize < 1)) {\n throw new RangeError(\n `[Accessio] maxQueueSize must be a positive integer or Infinity, got: ${maxQueueSize}`,\n );\n }\n let active = 0;\n let destroyed = false;\n let
|
|
1
|
+
{"version":3,"sources":["../../src/helpers/rateLimiter.ts"],"sourcesContent":["import type { RateLimiter, AccessioRequestConfig, AccessioResponse } from '../types';\n\ninterface QueueItem {\n resolve: () => void;\n reject: (reason: Error) => void;\n}\n\nexport function createRateLimiter(\n maxConcurrent: number = Infinity,\n maxQueueSize: number = Infinity,\n): RateLimiter {\n if (maxConcurrent !== Infinity && (!Number.isInteger(maxConcurrent) || maxConcurrent < 1)) {\n throw new RangeError(\n `[Accessio] maxConcurrent must be a positive integer or Infinity, got: ${maxConcurrent}`,\n );\n }\n if (maxQueueSize !== Infinity && (!Number.isInteger(maxQueueSize) || maxQueueSize < 1)) {\n throw new RangeError(\n `[Accessio] maxQueueSize must be a positive integer or Infinity, got: ${maxQueueSize}`,\n );\n }\n let active = 0;\n let destroyed = false;\n let head = 0;\n let tail = 0;\n let pendingCount = 0;\n const queue: Record<number, QueueItem> = {};\n\n function acquire(): Promise<void> {\n if (destroyed) {\n return Promise.reject(new Error('[Accessio] Rate limiter has been destroyed'));\n }\n\n if (active < maxConcurrent) {\n active++;\n return Promise.resolve();\n }\n\n if (pendingCount >= maxQueueSize) {\n return Promise.reject(\n new Error(`[Accessio] Rate limiter queue size exceeded maxQueueSize (${maxQueueSize})`),\n );\n }\n\n return new Promise((resolve, reject) => {\n queue[tail++] = { resolve, reject };\n pendingCount++;\n });\n }\n\n function release(): void {\n if (destroyed) return;\n\n if (active <= 0) return;\n\n active--;\n\n if (pendingCount > 0 && active < maxConcurrent) {\n active++;\n const next = queue[head];\n delete queue[head];\n head++;\n pendingCount--;\n next?.resolve();\n }\n }\n\n function destroy(): void {\n destroyed = true;\n const reason = new Error('[Accessio] Rate limiter destroyed — pending request cancelled');\n while (pendingCount > 0) {\n const next = queue[head];\n delete queue[head];\n head++;\n pendingCount--;\n next?.reject(reason);\n }\n }\n\n return {\n acquire,\n release,\n destroy,\n get pending() {\n return pendingCount;\n },\n get active() {\n return active;\n },\n get destroyed() {\n return destroyed;\n },\n };\n}\n\nexport async function rateLimitedRequest<T = unknown>(\n dispatchFn: (config: AccessioRequestConfig) => Promise<AccessioResponse<T>>,\n limiter: RateLimiter,\n config: AccessioRequestConfig,\n): Promise<AccessioResponse<T>> {\n await limiter.acquire();\n try {\n return await dispatchFn(config);\n } finally {\n limiter.release();\n }\n}\n\nexport default createRateLimiter;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,SAAS,kBACd,gBAAwB,UACxB,eAAuB,UACV;AACb,MAAI,kBAAkB,aAAa,CAAC,OAAO,UAAU,aAAa,KAAK,gBAAgB,IAAI;AACzF,UAAM,IAAI;AAAA,MACR,yEAAyE,aAAa;AAAA,IACxF;AAAA,EACF;AACA,MAAI,iBAAiB,aAAa,CAAC,OAAO,UAAU,YAAY,KAAK,eAAe,IAAI;AACtF,UAAM,IAAI;AAAA,MACR,wEAAwE,YAAY;AAAA,IACtF;AAAA,EACF;AACA,MAAI,SAAS;AACb,MAAI,YAAY;AAChB,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,eAAe;AACnB,QAAM,QAAmC,CAAC;AAE1C,WAAS,UAAyB;AAChC,QAAI,WAAW;AACb,aAAO,QAAQ,OAAO,IAAI,MAAM,4CAA4C,CAAC;AAAA,IAC/E;AAEA,QAAI,SAAS,eAAe;AAC1B;AACA,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAEA,QAAI,gBAAgB,cAAc;AAChC,aAAO,QAAQ;AAAA,QACb,IAAI,MAAM,6DAA6D,YAAY,GAAG;AAAA,MACxF;AAAA,IACF;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,MAAM,IAAI,EAAE,SAAS,OAAO;AAClC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,UAAgB;AACvB,QAAI,UAAW;AAEf,QAAI,UAAU,EAAG;AAEjB;AAEA,QAAI,eAAe,KAAK,SAAS,eAAe;AAC9C;AACA,YAAM,OAAO,MAAM,IAAI;AACvB,aAAO,MAAM,IAAI;AACjB;AACA;AACA,YAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AAEA,WAAS,UAAgB;AACvB,gBAAY;AACZ,UAAM,SAAS,IAAI,MAAM,oEAA+D;AACxF,WAAO,eAAe,GAAG;AACvB,YAAM,OAAO,MAAM,IAAI;AACvB,aAAO,MAAM,IAAI;AACjB;AACA;AACA,YAAM,OAAO,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAAA,IACA,IAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,IACA,IAAI,YAAY;AACd,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAsB,mBACpB,YACA,SACA,QAC8B;AAC9B,QAAM,QAAQ,QAAQ;AACtB,MAAI;AACF,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC,UAAE;AACA,YAAQ,QAAQ;AAAA,EAClB;AACF;AAEA,IAAO,sBAAQ;","names":[]}
|
|
@@ -32,7 +32,7 @@ __export(transformData_exports, {
|
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(transformData_exports);
|
|
34
34
|
var import_accessioError = __toESM(require("../core/accessioError"), 1);
|
|
35
|
-
function transformData(transforms, data, headers, config) {
|
|
35
|
+
async function transformData(transforms, data, headers, config) {
|
|
36
36
|
if (!transforms || !Array.isArray(transforms)) {
|
|
37
37
|
return data;
|
|
38
38
|
}
|
|
@@ -40,7 +40,7 @@ function transformData(transforms, data, headers, config) {
|
|
|
40
40
|
for (const transform of transforms) {
|
|
41
41
|
if (typeof transform === "function") {
|
|
42
42
|
try {
|
|
43
|
-
result = transform(result, headers);
|
|
43
|
+
result = await transform(result, headers);
|
|
44
44
|
} catch (err) {
|
|
45
45
|
throw import_accessioError.default.from(
|
|
46
46
|
err instanceof Error ? err : new Error(String(err)),
|