@unifyport/sdk-node 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/core/errors.d.ts +54 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +54 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/pagination.d.ts +13 -0
- package/dist/core/pagination.d.ts.map +1 -0
- package/dist/core/pagination.js +65 -0
- package/dist/core/pagination.js.map +1 -0
- package/dist/core/runtime.d.ts +5 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +570 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/types.d.ts +82 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/device/index.d.ts +9 -0
- package/dist/device/index.d.ts.map +1 -0
- package/dist/device/index.js +6 -0
- package/dist/device/index.js.map +1 -0
- package/dist/generated/device/client.d.ts +140 -0
- package/dist/generated/device/client.d.ts.map +1 -0
- package/dist/generated/device/client.js +724 -0
- package/dist/generated/device/client.js.map +1 -0
- package/dist/generated/device/operation-catalog.d.ts +8333 -0
- package/dist/generated/device/operation-catalog.d.ts.map +1 -0
- package/dist/generated/device/operation-catalog.js +10144 -0
- package/dist/generated/device/operation-catalog.js.map +1 -0
- package/dist/generated/device/schema.d.ts +3300 -0
- package/dist/generated/device/schema.d.ts.map +1 -0
- package/dist/generated/device/schema.js +2 -0
- package/dist/generated/device/schema.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
import { UnifyPortAbortError, UnifyPortApiError, UnifyPortConfigurationError, UnifyPortError, UnifyPortNetworkError, UnifyPortResponseParseError, UnifyPortTimeoutError } from "./errors.js";
|
|
2
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
3
|
+
const DEFAULT_MAX_RETRIES = 2;
|
|
4
|
+
const DEFAULT_BASE_DELAY_MS = 200;
|
|
5
|
+
const DEFAULT_MAX_DELAY_MS = 5_000;
|
|
6
|
+
const DEFAULT_MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
|
|
7
|
+
const MAX_RESPONSE_BYTES = 64 * 1024 * 1024;
|
|
8
|
+
const MAX_CANONICAL_INTEGER_DIGITS = 1024;
|
|
9
|
+
const MAX_RETRIES = 10;
|
|
10
|
+
const MAX_TIMER_MS = 2_147_483_647;
|
|
11
|
+
const RETRYABLE_STATUSES = new Set([408, 429, 502, 503, 504]);
|
|
12
|
+
function isRecord(value) {
|
|
13
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
14
|
+
}
|
|
15
|
+
function assertPositiveInteger(value, name, allowZero = false) {
|
|
16
|
+
const valid = Number.isInteger(value) && (allowZero ? value >= 0 : value > 0);
|
|
17
|
+
if (!valid) {
|
|
18
|
+
throw new UnifyPortConfigurationError(`${name} 必须是${allowZero ? "非负" : "正"}整数`);
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
function assertTimerMilliseconds(value, name) {
|
|
23
|
+
const normalized = assertPositiveInteger(value, name);
|
|
24
|
+
if (normalized > MAX_TIMER_MS) {
|
|
25
|
+
// Node 会把超出 32-bit timer 上限的值压缩到约 1ms,必须在进入 setTimeout 前拒绝。
|
|
26
|
+
throw new UnifyPortConfigurationError(`${name} 不能超过 ${String(MAX_TIMER_MS)}`);
|
|
27
|
+
}
|
|
28
|
+
return normalized;
|
|
29
|
+
}
|
|
30
|
+
function normalizeRetry(config) {
|
|
31
|
+
const maxRetries = assertPositiveInteger(config?.maxRetries ?? DEFAULT_MAX_RETRIES, "retry.maxRetries", true);
|
|
32
|
+
if (maxRetries > MAX_RETRIES) {
|
|
33
|
+
throw new UnifyPortConfigurationError(`retry.maxRetries 不能超过 ${String(MAX_RETRIES)}`);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
maxRetries,
|
|
37
|
+
baseDelayMs: assertTimerMilliseconds(config?.baseDelayMs ?? DEFAULT_BASE_DELAY_MS, "retry.baseDelayMs"),
|
|
38
|
+
maxDelayMs: assertTimerMilliseconds(config?.maxDelayMs ?? DEFAULT_MAX_DELAY_MS, "retry.maxDelayMs")
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function normalizeMaxResponseBytes(value) {
|
|
42
|
+
const normalized = assertPositiveInteger(value ?? DEFAULT_MAX_RESPONSE_BYTES, "maxResponseBytes");
|
|
43
|
+
if (normalized > MAX_RESPONSE_BYTES) {
|
|
44
|
+
throw new UnifyPortConfigurationError(`maxResponseBytes 不能超过 ${String(MAX_RESPONSE_BYTES)}`);
|
|
45
|
+
}
|
|
46
|
+
return normalized;
|
|
47
|
+
}
|
|
48
|
+
function isLoopback(hostname) {
|
|
49
|
+
const normalized = hostname.replace(/^\[|\]$/g, "").toLowerCase();
|
|
50
|
+
if (normalized === "localhost" || normalized === "::1")
|
|
51
|
+
return true;
|
|
52
|
+
const octets = normalized.split(".").map(Number);
|
|
53
|
+
return octets.length === 4 && octets[0] === 127 && octets.every(Number.isInteger);
|
|
54
|
+
}
|
|
55
|
+
function normalizeBaseUrl(value, allowInsecureHttp) {
|
|
56
|
+
let url;
|
|
57
|
+
try {
|
|
58
|
+
url = new URL(value);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// URL parser 的原始异常可能包含完整输入,因此配置错误只返回稳定说明。
|
|
62
|
+
throw new UnifyPortConfigurationError("baseUrl 必须是绝对 URL");
|
|
63
|
+
}
|
|
64
|
+
if (url.username !== "" || url.password !== "") {
|
|
65
|
+
throw new UnifyPortConfigurationError("baseUrl 不能包含 username 或 password");
|
|
66
|
+
}
|
|
67
|
+
if (url.search !== "" || url.hash !== "") {
|
|
68
|
+
throw new UnifyPortConfigurationError("baseUrl 不能包含 query 或 fragment");
|
|
69
|
+
}
|
|
70
|
+
if (url.protocol !== "https:") {
|
|
71
|
+
const allowedLoopback = url.protocol === "http:" && allowInsecureHttp && isLoopback(url.hostname);
|
|
72
|
+
if (!allowedLoopback) {
|
|
73
|
+
throw new UnifyPortConfigurationError("baseUrl 默认必须使用 HTTPS;loopback HTTP 需要 allowInsecureHttp: true");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return url.toString().replace(/\/$/, "");
|
|
77
|
+
}
|
|
78
|
+
async function resolveSecret(source, name) {
|
|
79
|
+
const value = typeof source === "function" ? await source() : source;
|
|
80
|
+
if (value === undefined || value.trim() === "") {
|
|
81
|
+
throw new UnifyPortConfigurationError(`${name} 不能为空`);
|
|
82
|
+
}
|
|
83
|
+
// CRLF 会改变 header 边界,因此在进入 fetch 前拒绝而不是尝试转义。
|
|
84
|
+
if (/[\r\n]/.test(value)) {
|
|
85
|
+
throw new UnifyPortConfigurationError(`${name} 包含不允许的 header 字符`);
|
|
86
|
+
}
|
|
87
|
+
return value;
|
|
88
|
+
}
|
|
89
|
+
function targetIsInsideBase(requestUrl, baseUrl) {
|
|
90
|
+
if (requestUrl.origin !== baseUrl.origin)
|
|
91
|
+
return false;
|
|
92
|
+
const prefix = baseUrl.pathname.replace(/\/$/, "");
|
|
93
|
+
return prefix === "" || prefix === "/" || requestUrl.pathname.startsWith(`${prefix}/`);
|
|
94
|
+
}
|
|
95
|
+
function ensureSafeTarget(request, baseUrl) {
|
|
96
|
+
const requestUrl = new URL(request.url);
|
|
97
|
+
const expected = new URL(baseUrl);
|
|
98
|
+
if (!targetIsInsideBase(requestUrl, expected)) {
|
|
99
|
+
throw new UnifyPortConfigurationError(`拒绝向配置 baseUrl 之外发送 credential: ${requestUrl.origin}${requestUrl.pathname}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function effectiveRetries(operation, configured, execution) {
|
|
103
|
+
if (!operation.retryable || execution.retry === false)
|
|
104
|
+
return 0;
|
|
105
|
+
const requested = execution.retry?.maxRetries;
|
|
106
|
+
if (requested === undefined)
|
|
107
|
+
return configured.maxRetries;
|
|
108
|
+
const normalized = assertPositiveInteger(requested, "execution.retry.maxRetries", true);
|
|
109
|
+
// 单次 operation 只允许收紧全局预算,避免调用点意外制造重试风暴。
|
|
110
|
+
return Math.min(normalized, configured.maxRetries);
|
|
111
|
+
}
|
|
112
|
+
function parseRetryAfter(value, now = Date.now()) {
|
|
113
|
+
if (value === null)
|
|
114
|
+
return undefined;
|
|
115
|
+
const seconds = Number(value);
|
|
116
|
+
if (Number.isFinite(seconds) && seconds >= 0)
|
|
117
|
+
return seconds * 1_000;
|
|
118
|
+
const date = Date.parse(value);
|
|
119
|
+
return Number.isNaN(date) ? undefined : Math.max(0, date - now);
|
|
120
|
+
}
|
|
121
|
+
function retryDelay(response, attempt, retry) {
|
|
122
|
+
const exponentialCap = Math.min(retry.maxDelayMs, retry.baseDelayMs * 2 ** attempt);
|
|
123
|
+
const jitter = Math.random() * exponentialCap;
|
|
124
|
+
const retryAfter = parseRetryAfter(response?.headers.get("retry-after") ?? null);
|
|
125
|
+
return Math.min(retry.maxDelayMs, Math.max(jitter, retryAfter ?? 0));
|
|
126
|
+
}
|
|
127
|
+
function abortReason() {
|
|
128
|
+
return new DOMException("The operation was aborted", "AbortError");
|
|
129
|
+
}
|
|
130
|
+
async function abortable(promise, signal) {
|
|
131
|
+
if (signal.aborted)
|
|
132
|
+
throw abortReason();
|
|
133
|
+
let onAbort;
|
|
134
|
+
const aborted = new Promise((_resolve, reject) => {
|
|
135
|
+
onAbort = () => {
|
|
136
|
+
reject(abortReason());
|
|
137
|
+
};
|
|
138
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
139
|
+
});
|
|
140
|
+
try {
|
|
141
|
+
// custom fetch/credential provider 不一定主动监听 signal;竞速保证调用方仍能按时返回。
|
|
142
|
+
return await Promise.race([promise, aborted]);
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
if (onAbort !== undefined)
|
|
146
|
+
signal.removeEventListener("abort", onAbort);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function safeRequestUrl(value) {
|
|
150
|
+
const url = new URL(value);
|
|
151
|
+
// query/fragment 可能携带敏感输入,公开错误对象只保留定位 endpoint 所需部分。
|
|
152
|
+
return `${url.origin}${url.pathname}`;
|
|
153
|
+
}
|
|
154
|
+
async function bufferedResponse(response, signal, maximumBytes, operation) {
|
|
155
|
+
if (response.body === null) {
|
|
156
|
+
return new Response(null, {
|
|
157
|
+
status: response.status,
|
|
158
|
+
statusText: response.statusText,
|
|
159
|
+
headers: response.headers
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
const reader = response.body.getReader();
|
|
163
|
+
const chunks = [];
|
|
164
|
+
let length = 0;
|
|
165
|
+
try {
|
|
166
|
+
for (;;) {
|
|
167
|
+
const { done, value } = await abortable(reader.read(), signal);
|
|
168
|
+
if (done)
|
|
169
|
+
break;
|
|
170
|
+
length += value.byteLength;
|
|
171
|
+
if (length > maximumBytes) {
|
|
172
|
+
const requestId = requestIdFrom(undefined, response);
|
|
173
|
+
throw new UnifyPortResponseParseError(`UnifyPort 响应体超过 ${String(maximumBytes)} bytes`, {
|
|
174
|
+
api: operation.api,
|
|
175
|
+
operationId: operation.operationId,
|
|
176
|
+
status: response.status,
|
|
177
|
+
...(requestId === undefined ? {} : { requestId })
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
chunks.push(value);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
// 读取失败后取消源 stream,避免连接继续接收不会再被消费的数据。
|
|
185
|
+
void reader.cancel().catch(() => undefined);
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
reader.releaseLock();
|
|
190
|
+
}
|
|
191
|
+
const body = new Uint8Array(length);
|
|
192
|
+
let offset = 0;
|
|
193
|
+
for (const chunk of chunks) {
|
|
194
|
+
body.set(chunk, offset);
|
|
195
|
+
offset += chunk.byteLength;
|
|
196
|
+
}
|
|
197
|
+
// 重建 Response 会有意移除原始 URL,避免敏感 query 通过 response.url 泄漏。
|
|
198
|
+
return new Response(body, {
|
|
199
|
+
status: response.status,
|
|
200
|
+
statusText: response.statusText,
|
|
201
|
+
headers: response.headers
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
/** @internal 仅供同仓库验证 retry listener 生命周期;package exports 不公开 runtime 子路径。 */
|
|
205
|
+
export async function waitForRetryDelay(milliseconds, signal) {
|
|
206
|
+
if (milliseconds <= 0)
|
|
207
|
+
return;
|
|
208
|
+
await new Promise((resolve, reject) => {
|
|
209
|
+
if (signal.aborted) {
|
|
210
|
+
reject(abortReason());
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const cleanup = () => {
|
|
214
|
+
clearTimeout(timer);
|
|
215
|
+
signal.removeEventListener("abort", onAbort);
|
|
216
|
+
};
|
|
217
|
+
const onAbort = () => {
|
|
218
|
+
cleanup();
|
|
219
|
+
reject(abortReason());
|
|
220
|
+
};
|
|
221
|
+
const timer = setTimeout(() => {
|
|
222
|
+
// 正常 backoff 完成也要移除 listener,避免组合 signal 持有已结束请求的闭包。
|
|
223
|
+
cleanup();
|
|
224
|
+
resolve();
|
|
225
|
+
}, milliseconds);
|
|
226
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
function isAbort(error) {
|
|
230
|
+
return error instanceof DOMException && error.name === "AbortError";
|
|
231
|
+
}
|
|
232
|
+
function createTransport(runtime) {
|
|
233
|
+
return (operation, execution) => {
|
|
234
|
+
return async (request) => {
|
|
235
|
+
ensureSafeTarget(request, runtime.baseUrl);
|
|
236
|
+
const requestUrl = safeRequestUrl(request.url);
|
|
237
|
+
const timeoutMs = assertTimerMilliseconds(execution.timeoutMs ?? runtime.timeoutMs, "execution.timeoutMs");
|
|
238
|
+
const timeoutController = new AbortController();
|
|
239
|
+
const timer = setTimeout(() => {
|
|
240
|
+
timeoutController.abort();
|
|
241
|
+
}, timeoutMs);
|
|
242
|
+
const signals = [request.signal, timeoutController.signal];
|
|
243
|
+
if (execution.signal !== undefined)
|
|
244
|
+
signals.push(execution.signal);
|
|
245
|
+
const signal = AbortSignal.any(signals);
|
|
246
|
+
try {
|
|
247
|
+
const credentialRequest = await abortable(runtime.injectCredential(request), signal);
|
|
248
|
+
const prepared = new Request(credentialRequest, {
|
|
249
|
+
// SDK 不承载浏览器跳转流程,任何 redirect 都交给调用方显式处理。
|
|
250
|
+
redirect: "error",
|
|
251
|
+
signal
|
|
252
|
+
});
|
|
253
|
+
const maxRetries = effectiveRetries(operation, runtime.retry, execution);
|
|
254
|
+
for (let attempt = 0; attempt <= maxRetries; attempt += 1) {
|
|
255
|
+
try {
|
|
256
|
+
const response = await abortable(runtime.fetch(prepared.clone()), signal);
|
|
257
|
+
if (!RETRYABLE_STATUSES.has(response.status) || attempt === maxRetries) {
|
|
258
|
+
// 在 transport 内读完 body,让 timeout 覆盖 headers 到完整 body 的整个周期。
|
|
259
|
+
return await bufferedResponse(response, signal, runtime.maxResponseBytes, operation);
|
|
260
|
+
}
|
|
261
|
+
// 放弃的响应体必须主动取消,避免 keep-alive 连接和 stream 长时间占用资源。
|
|
262
|
+
if (response.body !== null)
|
|
263
|
+
await abortable(response.body.cancel(), signal);
|
|
264
|
+
await waitForRetryDelay(retryDelay(response, attempt, runtime.retry), signal);
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
if (error instanceof UnifyPortError)
|
|
268
|
+
throw error;
|
|
269
|
+
if (isAbort(error) || signal.aborted)
|
|
270
|
+
throw error;
|
|
271
|
+
if (attempt === maxRetries) {
|
|
272
|
+
if (maxRetries === 0)
|
|
273
|
+
throw error;
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
await waitForRetryDelay(retryDelay(undefined, attempt, runtime.retry), signal);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
throw new UnifyPortNetworkError("UnifyPort 请求在重试后仍失败", {
|
|
280
|
+
api: operation.api,
|
|
281
|
+
operationId: operation.operationId,
|
|
282
|
+
url: requestUrl
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
if (error instanceof UnifyPortError)
|
|
287
|
+
throw error;
|
|
288
|
+
if (timeoutController.signal.aborted) {
|
|
289
|
+
throw new UnifyPortTimeoutError(`UnifyPort 请求超过 ${String(timeoutMs)}ms`, {
|
|
290
|
+
api: operation.api,
|
|
291
|
+
operationId: operation.operationId,
|
|
292
|
+
url: requestUrl,
|
|
293
|
+
timeoutMs
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
if (signal.aborted || isAbort(error)) {
|
|
297
|
+
throw new UnifyPortAbortError("UnifyPort 请求已取消", {
|
|
298
|
+
api: operation.api,
|
|
299
|
+
operationId: operation.operationId,
|
|
300
|
+
url: requestUrl
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
throw new UnifyPortNetworkError("UnifyPort 网络请求失败", {
|
|
304
|
+
api: operation.api,
|
|
305
|
+
operationId: operation.operationId,
|
|
306
|
+
url: requestUrl
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
finally {
|
|
310
|
+
clearTimeout(timer);
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
function readDiagnostic(record, key, maximumLength) {
|
|
316
|
+
const value = record[key];
|
|
317
|
+
return typeof value === "string" &&
|
|
318
|
+
value.length > 0 &&
|
|
319
|
+
value.length <= maximumLength &&
|
|
320
|
+
/^[A-Za-z0-9_.:/-]+$/u.test(value)
|
|
321
|
+
? value
|
|
322
|
+
: undefined;
|
|
323
|
+
}
|
|
324
|
+
function requestIdFrom(value, response) {
|
|
325
|
+
if (isRecord(value)) {
|
|
326
|
+
const requestId = readDiagnostic(value, "request_id", 128) ?? readDiagnostic(value, "requestId", 128);
|
|
327
|
+
if (requestId !== undefined)
|
|
328
|
+
return requestId;
|
|
329
|
+
}
|
|
330
|
+
const header = response.headers.get("x-request-id");
|
|
331
|
+
if (header === null)
|
|
332
|
+
return undefined;
|
|
333
|
+
return header.length <= 128 && /^[A-Za-z0-9_.:/-]+$/u.test(header) ? header : undefined;
|
|
334
|
+
}
|
|
335
|
+
function parseErrorPayload(value, response) {
|
|
336
|
+
const fallback = {
|
|
337
|
+
code: `HTTP_${String(response.status)}`,
|
|
338
|
+
message: `UnifyPort API 返回 HTTP ${String(response.status)}`,
|
|
339
|
+
requestId: requestIdFrom(value, response),
|
|
340
|
+
details: undefined
|
|
341
|
+
};
|
|
342
|
+
if (!isRecord(value))
|
|
343
|
+
return fallback;
|
|
344
|
+
const nested = isRecord(value["error"]) ? value["error"] : value;
|
|
345
|
+
const code = readDiagnostic(nested, "code", 64) ?? fallback.code;
|
|
346
|
+
return {
|
|
347
|
+
code,
|
|
348
|
+
// 上游 message/details 可能回显请求参数;错误对象只公开稳定 code/status/request ID。
|
|
349
|
+
message: `UnifyPort API 返回 ${code} (HTTP ${String(response.status)})`,
|
|
350
|
+
requestId: requestIdFrom(value, response),
|
|
351
|
+
details: undefined
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
function canonicalUnsafeIntegerToken(token) {
|
|
355
|
+
const maximum = BigInt(Number.MAX_SAFE_INTEGER);
|
|
356
|
+
const minimum = BigInt(Number.MIN_SAFE_INTEGER);
|
|
357
|
+
const parts = /^(-?)([0-9]+)(?:\.([0-9]+))?(?:[eE]([+-]?[0-9]+))?$/u.exec(token);
|
|
358
|
+
if (parts === null)
|
|
359
|
+
return undefined;
|
|
360
|
+
const sign = parts[1] ?? "";
|
|
361
|
+
const whole = parts[2] ?? "0";
|
|
362
|
+
const fraction = parts[3] ?? "";
|
|
363
|
+
const coefficient = `${whole}${fraction}`;
|
|
364
|
+
if (/^0+$/u.test(coefficient))
|
|
365
|
+
return undefined;
|
|
366
|
+
const numeric = Number(token);
|
|
367
|
+
if (!Number.isFinite(numeric) || numeric === 0) {
|
|
368
|
+
// 极端 exponent 会溢出或下溢;直接拒绝比返回错误的 Infinity/0 或放大字符串更安全。
|
|
369
|
+
throw new SyntaxError("JSON number magnitude exceeds the supported range");
|
|
370
|
+
}
|
|
371
|
+
const exponentText = parts[4] ?? "0";
|
|
372
|
+
const exponentMagnitude = exponentText.replace(/^[+-]?0*/u, "");
|
|
373
|
+
if (exponentMagnitude.length > 6) {
|
|
374
|
+
throw new SyntaxError("JSON number exponent exceeds the supported range");
|
|
375
|
+
}
|
|
376
|
+
const exponent = Number(exponentText);
|
|
377
|
+
if (!Number.isSafeInteger(exponent)) {
|
|
378
|
+
throw new SyntaxError("JSON number exponent exceeds the supported range");
|
|
379
|
+
}
|
|
380
|
+
const scale = fraction.length - exponent;
|
|
381
|
+
let integerDigits;
|
|
382
|
+
if (scale > 0) {
|
|
383
|
+
if (scale >= coefficient.length)
|
|
384
|
+
return undefined;
|
|
385
|
+
const split = coefficient.length - scale;
|
|
386
|
+
if (!/^0*$/u.test(coefficient.slice(split)))
|
|
387
|
+
return undefined;
|
|
388
|
+
integerDigits = coefficient.slice(0, split);
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
const significant = coefficient.replace(/^0+/u, "");
|
|
392
|
+
const appendedZeroes = -scale;
|
|
393
|
+
if (significant.length + appendedZeroes > MAX_CANONICAL_INTEGER_DIGITS) {
|
|
394
|
+
throw new SyntaxError("JSON integer exceeds the supported digit limit");
|
|
395
|
+
}
|
|
396
|
+
integerDigits = `${significant}${"0".repeat(appendedZeroes)}`;
|
|
397
|
+
}
|
|
398
|
+
const normalized = integerDigits.replace(/^0+/u, "") || "0";
|
|
399
|
+
if (normalized.length > MAX_CANONICAL_INTEGER_DIGITS) {
|
|
400
|
+
throw new SyntaxError("JSON integer exceeds the supported digit limit");
|
|
401
|
+
}
|
|
402
|
+
const canonical = sign === "-" ? `-${normalized}` : normalized;
|
|
403
|
+
if (normalized.length > 16)
|
|
404
|
+
return canonical;
|
|
405
|
+
const integer = BigInt(sign === "-" ? `-${normalized}` : normalized);
|
|
406
|
+
return integer > maximum || integer < minimum ? canonical : undefined;
|
|
407
|
+
}
|
|
408
|
+
function preserveUnsafeIntegerTokens(json, maximumBytes) {
|
|
409
|
+
const output = [];
|
|
410
|
+
let outputBytes = 0;
|
|
411
|
+
let index = 0;
|
|
412
|
+
let rawStart = 0;
|
|
413
|
+
// sticky regex 直接在原字符串游标匹配,避免大量小数字时反复 slice 剩余正文形成平方级复制。
|
|
414
|
+
const numberToken = /-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?/y;
|
|
415
|
+
const append = (value) => {
|
|
416
|
+
outputBytes += Buffer.byteLength(value, "utf8");
|
|
417
|
+
if (outputBytes > maximumBytes) {
|
|
418
|
+
// 数字规范化可能放大短 exponent;派生 JSON 仍受与 wire body 相同的硬上限约束。
|
|
419
|
+
throw new SyntaxError("Normalized JSON exceeds the configured response limit");
|
|
420
|
+
}
|
|
421
|
+
output.push(value);
|
|
422
|
+
};
|
|
423
|
+
while (index < json.length) {
|
|
424
|
+
const character = json[index];
|
|
425
|
+
if (character === undefined)
|
|
426
|
+
break;
|
|
427
|
+
if (character === '"') {
|
|
428
|
+
index += 1;
|
|
429
|
+
while (index < json.length) {
|
|
430
|
+
if (json[index] === "\\") {
|
|
431
|
+
index += 2;
|
|
432
|
+
}
|
|
433
|
+
else if (json[index] === '"') {
|
|
434
|
+
index += 1;
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
index += 1;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
if (character === "-" || /[0-9]/.test(character)) {
|
|
444
|
+
numberToken.lastIndex = index;
|
|
445
|
+
const token = numberToken.exec(json)?.[0];
|
|
446
|
+
if (token !== undefined) {
|
|
447
|
+
const canonical = canonicalUnsafeIntegerToken(token);
|
|
448
|
+
if (canonical !== undefined) {
|
|
449
|
+
// 统一成十进制整数串,使 SDK 类型、MCP schema 与不同 JSON 数字拼写保持同一语义。
|
|
450
|
+
append(json.slice(rawStart, index));
|
|
451
|
+
append(JSON.stringify(canonical));
|
|
452
|
+
index += token.length;
|
|
453
|
+
rawStart = index;
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
index += token.length;
|
|
457
|
+
continue;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
index += 1;
|
|
461
|
+
}
|
|
462
|
+
append(json.slice(rawStart));
|
|
463
|
+
return output.join("");
|
|
464
|
+
}
|
|
465
|
+
// 泛型只表达 OpenAPI operation 的返回契约;运行时校验由生成 schema 与测试共同保证。
|
|
466
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
|
|
467
|
+
function parseSuccessData(value, maximumBytes) {
|
|
468
|
+
const parsed = value === undefined ? undefined : JSON.parse(preserveUnsafeIntegerTokens(value, maximumBytes));
|
|
469
|
+
// OpenAPI 类型与 text parser 在生成器中成对维护;此断言只跨越 JSON.parse 无法表达的契约边界。
|
|
470
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
471
|
+
return parsed;
|
|
472
|
+
}
|
|
473
|
+
function unwrap(outcome, operation, maximumBytes) {
|
|
474
|
+
if ("data" in outcome && outcome.response.ok) {
|
|
475
|
+
let data;
|
|
476
|
+
try {
|
|
477
|
+
data = parseSuccessData(outcome.data, maximumBytes);
|
|
478
|
+
}
|
|
479
|
+
catch {
|
|
480
|
+
// JSON.parse 的原始 SyntaxError 可能包含响应片段,公开错误只携带稳定说明与筛选后元数据。
|
|
481
|
+
const requestId = requestIdFrom(undefined, outcome.response);
|
|
482
|
+
throw new UnifyPortResponseParseError("无法解析 UnifyPort API 响应", {
|
|
483
|
+
api: operation.api,
|
|
484
|
+
operationId: operation.operationId,
|
|
485
|
+
status: outcome.response.status,
|
|
486
|
+
...(requestId === undefined ? {} : { requestId })
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
const requestId = requestIdFrom(data, outcome.response);
|
|
490
|
+
return {
|
|
491
|
+
data,
|
|
492
|
+
response: outcome.response,
|
|
493
|
+
status: outcome.response.status,
|
|
494
|
+
...(requestId === undefined ? {} : { requestId })
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
const errorValue = "error" in outcome ? outcome.error : undefined;
|
|
498
|
+
const parsed = parseErrorPayload(errorValue, outcome.response);
|
|
499
|
+
throw new UnifyPortApiError(parsed.message, {
|
|
500
|
+
api: operation.api,
|
|
501
|
+
operationId: operation.operationId,
|
|
502
|
+
status: outcome.response.status,
|
|
503
|
+
code: parsed.code,
|
|
504
|
+
requestId: parsed.requestId,
|
|
505
|
+
details: parsed.details
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
function createRuntime(config) {
|
|
509
|
+
const transport = createTransport(config);
|
|
510
|
+
const rawOperation = {
|
|
511
|
+
api: "device",
|
|
512
|
+
operationId: "raw",
|
|
513
|
+
method: "RAW",
|
|
514
|
+
path: "*",
|
|
515
|
+
tag: "Raw",
|
|
516
|
+
summary: "Raw typed OpenAPI request",
|
|
517
|
+
description: "",
|
|
518
|
+
authRequired: true,
|
|
519
|
+
toolName: "",
|
|
520
|
+
mutability: "write",
|
|
521
|
+
retryable: false,
|
|
522
|
+
secretInput: false,
|
|
523
|
+
secretOutput: false,
|
|
524
|
+
mcpExposure: "never",
|
|
525
|
+
inputSchema: {},
|
|
526
|
+
outputSchema: {}
|
|
527
|
+
};
|
|
528
|
+
return {
|
|
529
|
+
baseUrl: config.baseUrl,
|
|
530
|
+
rawFetch: transport(rawOperation, {}),
|
|
531
|
+
createFetch: transport,
|
|
532
|
+
execute: async (operation, request) => {
|
|
533
|
+
try {
|
|
534
|
+
return unwrap(await request(), operation, config.maxResponseBytes);
|
|
535
|
+
}
|
|
536
|
+
catch (error) {
|
|
537
|
+
if (error instanceof UnifyPortError)
|
|
538
|
+
throw error;
|
|
539
|
+
throw new UnifyPortResponseParseError("无法解析 UnifyPort API 响应", {
|
|
540
|
+
api: operation.api,
|
|
541
|
+
operationId: operation.operationId
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
function baseRuntimeConfig(config, injectCredential) {
|
|
548
|
+
return {
|
|
549
|
+
baseUrl: normalizeBaseUrl(config.baseUrl, config.allowInsecureHttp === true),
|
|
550
|
+
fetch: config.fetch ??
|
|
551
|
+
(async (request) => await globalThis.fetch(request)),
|
|
552
|
+
timeoutMs: assertTimerMilliseconds(config.timeoutMs ?? DEFAULT_TIMEOUT_MS, "timeoutMs"),
|
|
553
|
+
maxResponseBytes: normalizeMaxResponseBytes(config.maxResponseBytes),
|
|
554
|
+
retry: normalizeRetry(config.retry),
|
|
555
|
+
injectCredential
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
export function createDeviceRuntime(config) {
|
|
559
|
+
const runtimeConfig = baseRuntimeConfig(config, async (request) => {
|
|
560
|
+
const headers = new Headers(request.headers);
|
|
561
|
+
// Device client 只允许自身注入认证,调用参数中的通用 credential header 一律丢弃。
|
|
562
|
+
headers.delete("authorization");
|
|
563
|
+
headers.delete("cookie");
|
|
564
|
+
headers.set("x-api-key", await resolveSecret(config.apiKey, "apiKey"));
|
|
565
|
+
return new Request(request, { headers });
|
|
566
|
+
});
|
|
567
|
+
// 闭包只保存 provider/string 的引用,不把解析出的 secret 持久化到 client 可枚举字段。
|
|
568
|
+
return createRuntime(runtimeConfig);
|
|
569
|
+
}
|
|
570
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"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"}
|