web-access-cli 0.5.0 → 0.7.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.
Files changed (50) hide show
  1. package/README.md +104 -207
  2. package/README_CN.md +106 -209
  3. package/THIRD_PARTY_NOTICES.md +0 -13
  4. package/dist/config/config.js +10 -2
  5. package/dist/config/config.js.map +1 -1
  6. package/dist/core/router.js +4 -2
  7. package/dist/core/router.js.map +1 -1
  8. package/dist/core/schema.js +1 -1
  9. package/dist/core/types.js +1 -0
  10. package/dist/core/types.js.map +1 -1
  11. package/dist/gateway/admin.js +670 -0
  12. package/dist/gateway/admin.js.map +1 -0
  13. package/dist/gateway/panel.js +2405 -0
  14. package/dist/gateway/panel.js.map +1 -0
  15. package/dist/gateway/records.js +464 -0
  16. package/dist/gateway/records.js.map +1 -0
  17. package/dist/gateway/schema.js +115 -0
  18. package/dist/gateway/schema.js.map +1 -0
  19. package/dist/gateway/server.js +663 -0
  20. package/dist/gateway/server.js.map +1 -0
  21. package/dist/gateway/service.js +607 -0
  22. package/dist/gateway/service.js.map +1 -0
  23. package/dist/providers/anysearch.js +5 -3
  24. package/dist/providers/anysearch.js.map +1 -1
  25. package/dist/providers/deepseek.js +173 -106
  26. package/dist/providers/deepseek.js.map +1 -1
  27. package/dist/providers/registry.js +2 -0
  28. package/dist/providers/registry.js.map +1 -1
  29. package/dist/providers/search.js +4 -2
  30. package/dist/providers/search.js.map +1 -1
  31. package/dist/providers/xai.js +16 -8
  32. package/dist/providers/xai.js.map +1 -1
  33. package/dist/providers/xcrawl.js +1 -1
  34. package/dist/providers/xcrawl.js.map +1 -1
  35. package/dist/providers/yuanbao.js +214 -0
  36. package/dist/providers/yuanbao.js.map +1 -0
  37. package/dist/server.js +127 -0
  38. package/dist/server.js.map +1 -0
  39. package/dist/transport/http.js +8 -0
  40. package/dist/transport/http.js.map +1 -1
  41. package/dist/version.js +1 -1
  42. package/package.json +4 -2
  43. package/schemas/config.schema.json +4 -0
  44. package/schemas/gatewayError.schema.json +33 -0
  45. package/schemas/gatewayFetchRequest.schema.json +13 -0
  46. package/schemas/gatewayFetchResponse.schema.json +16 -0
  47. package/schemas/gatewaySearchRequest.schema.json +37 -0
  48. package/schemas/gatewaySearchResponse.schema.json +81 -0
  49. package/schemas/output.schema.json +52 -0
  50. package/schemas/searchRequest.schema.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/gateway/panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,464 @@
1
+ export const GATEWAY_RECORD_RETENTION = 500;
2
+ export const GATEWAY_RECORD_MAX_RESULTS = 50;
3
+ export const GATEWAY_RECORD_MAX_ATTEMPTS = 32;
4
+ export const GATEWAY_RECORD_SEARCH_PREVIEW_CHARS = 2_000;
5
+ export const GATEWAY_RECORD_FETCH_PREVIEW_CHARS = 4_000;
6
+ function truncate(value, max) {
7
+ const characters = Array.from(value);
8
+ if (characters.length <= max)
9
+ return value;
10
+ return `${characters.slice(0, max).join("")}…`;
11
+ }
12
+ export function truncatePreview(value, maxChars) {
13
+ const characters = Array.from(value);
14
+ const chars = characters.length;
15
+ if (chars <= maxChars) {
16
+ return { preview: value, chars, truncated: false };
17
+ }
18
+ return {
19
+ preview: `${characters.slice(0, maxChars).join("")}…`,
20
+ chars,
21
+ truncated: true,
22
+ };
23
+ }
24
+ function optionalString(value, max) {
25
+ return typeof value === "string" && value.length > 0
26
+ ? truncate(value, max)
27
+ : undefined;
28
+ }
29
+ function sanitizeAttempts(value) {
30
+ if (!Array.isArray(value))
31
+ return undefined;
32
+ const attempts = [];
33
+ for (const item of value) {
34
+ if (attempts.length >= GATEWAY_RECORD_MAX_ATTEMPTS)
35
+ break;
36
+ if (!item || typeof item !== "object")
37
+ continue;
38
+ const candidate = item;
39
+ if (typeof candidate.provider !== "string")
40
+ continue;
41
+ const status = candidate.status === "ok" ||
42
+ candidate.status === "failed" ||
43
+ candidate.status === "skipped"
44
+ ? candidate.status
45
+ : undefined;
46
+ if (!status)
47
+ continue;
48
+ const attempt = {
49
+ provider: truncate(candidate.provider, 64),
50
+ status,
51
+ durationMs: typeof candidate.durationMs === "number" &&
52
+ Number.isFinite(candidate.durationMs)
53
+ ? Math.max(0, Math.round(candidate.durationMs))
54
+ : 0,
55
+ };
56
+ const providerType = optionalString(candidate.providerType, 32);
57
+ if (providerType)
58
+ attempt.providerType = providerType;
59
+ const errorCode = optionalString(candidate.errorCode, 64);
60
+ if (errorCode)
61
+ attempt.errorCode = errorCode;
62
+ const errorMessage = optionalString(candidate.errorMessage, 240);
63
+ if (errorMessage)
64
+ attempt.errorMessage = errorMessage;
65
+ if (typeof candidate.httpStatus === "number" &&
66
+ Number.isInteger(candidate.httpStatus)) {
67
+ attempt.httpStatus = candidate.httpStatus;
68
+ }
69
+ attempts.push(attempt);
70
+ }
71
+ return attempts.length > 0 ? attempts : undefined;
72
+ }
73
+ function sanitizeBackfill(value) {
74
+ if (!value || typeof value !== "object")
75
+ return undefined;
76
+ const candidate = value;
77
+ if (!Array.isArray(candidate.items))
78
+ return undefined;
79
+ const items = [];
80
+ for (const rawItem of candidate.items) {
81
+ if (items.length >= GATEWAY_RECORD_MAX_RESULTS)
82
+ break;
83
+ if (!rawItem || typeof rawItem !== "object")
84
+ continue;
85
+ const entry = rawItem;
86
+ if (typeof entry.url !== "string")
87
+ continue;
88
+ const status = entry.status === "ok" ||
89
+ entry.status === "failed" ||
90
+ entry.status === "skipped"
91
+ ? entry.status
92
+ : "failed";
93
+ const item = {
94
+ rank: typeof entry.rank === "number" && Number.isFinite(entry.rank)
95
+ ? Math.max(1, Math.floor(entry.rank))
96
+ : items.length + 1,
97
+ url: truncate(entry.url, 400),
98
+ status,
99
+ durationMs: typeof entry.durationMs === "number" &&
100
+ Number.isFinite(entry.durationMs)
101
+ ? Math.max(0, Math.round(entry.durationMs))
102
+ : 0,
103
+ };
104
+ const provider = optionalString(entry.provider, 64);
105
+ if (provider)
106
+ item.provider = provider;
107
+ if (typeof entry.contentChars === "number" &&
108
+ Number.isFinite(entry.contentChars)) {
109
+ item.contentChars = Math.max(0, Math.floor(entry.contentChars));
110
+ }
111
+ const errorCode = optionalString(entry.errorCode, 64);
112
+ if (errorCode)
113
+ item.errorCode = errorCode;
114
+ const attempts = sanitizeAttempts(entry.attempts);
115
+ if (attempts)
116
+ item.attempts = attempts;
117
+ items.push(item);
118
+ }
119
+ const num = (v) => typeof v === "number" && Number.isFinite(v)
120
+ ? Math.max(0, Math.floor(v))
121
+ : 0;
122
+ return {
123
+ requestedCount: num(candidate.requestedCount),
124
+ attemptedCount: num(candidate.attemptedCount),
125
+ succeededCount: num(candidate.succeededCount),
126
+ failedCount: num(candidate.failedCount),
127
+ skippedCount: num(candidate.skippedCount),
128
+ durationMs: num(candidate.durationMs),
129
+ items,
130
+ };
131
+ }
132
+ function sanitizeResults(value) {
133
+ if (!Array.isArray(value))
134
+ return undefined;
135
+ const results = [];
136
+ for (const item of value) {
137
+ if (results.length >= GATEWAY_RECORD_MAX_RESULTS)
138
+ break;
139
+ if (!item || typeof item !== "object")
140
+ continue;
141
+ const candidate = item;
142
+ if (typeof candidate.title !== "string" ||
143
+ typeof candidate.url !== "string")
144
+ continue;
145
+ const result = {
146
+ title: truncate(candidate.title, 160),
147
+ url: truncate(candidate.url, 400),
148
+ };
149
+ if (typeof candidate.rank === "number" && Number.isFinite(candidate.rank)) {
150
+ result.rank = Math.max(1, Math.floor(candidate.rank));
151
+ }
152
+ const snippet = optionalString(candidate.snippet, 600);
153
+ if (snippet)
154
+ result.snippet = snippet;
155
+ if (typeof candidate.contentPreview === "string" &&
156
+ candidate.contentPreview.length > 0) {
157
+ const preview = truncatePreview(candidate.contentPreview, GATEWAY_RECORD_SEARCH_PREVIEW_CHARS);
158
+ result.contentPreview = preview.preview;
159
+ result.contentChars =
160
+ typeof candidate.contentChars === "number" &&
161
+ Number.isFinite(candidate.contentChars)
162
+ ? Math.max(preview.chars, Math.floor(candidate.contentChars))
163
+ : preview.chars;
164
+ result.contentTruncated =
165
+ typeof candidate.contentTruncated === "boolean"
166
+ ? candidate.contentTruncated || preview.truncated
167
+ : preview.truncated;
168
+ }
169
+ results.push(result);
170
+ }
171
+ return results.length > 0 ? results : undefined;
172
+ }
173
+ function sanitizeRecord(record) {
174
+ const sanitized = {
175
+ id: truncate(record.id, 128),
176
+ at: record.at,
177
+ route: record.route,
178
+ status: record.status,
179
+ durationMs: record.durationMs,
180
+ };
181
+ const code = optionalString(record.code, 64);
182
+ if (code)
183
+ sanitized.code = code;
184
+ const provider = optionalString(record.provider, 64);
185
+ if (provider)
186
+ sanitized.provider = provider;
187
+ const query = optionalString(record.query, 200);
188
+ if (query)
189
+ sanitized.query = query;
190
+ const url = optionalString(record.url, 500);
191
+ if (url)
192
+ sanitized.url = url;
193
+ if (typeof record.count === "number")
194
+ sanitized.count = record.count;
195
+ if (typeof record.needContent === "boolean")
196
+ sanitized.needContent = record.needContent;
197
+ const title = optionalString(record.title, 200);
198
+ if (title)
199
+ sanitized.title = title;
200
+ if (typeof record.resultCount === "number")
201
+ sanitized.resultCount = record.resultCount;
202
+ const results = sanitizeResults(record.results);
203
+ if (results)
204
+ sanitized.results = results;
205
+ if (typeof record.contentPreview === "string" &&
206
+ record.contentPreview.length > 0) {
207
+ const preview = truncatePreview(record.contentPreview, GATEWAY_RECORD_FETCH_PREVIEW_CHARS);
208
+ sanitized.contentPreview = preview.preview;
209
+ sanitized.contentChars =
210
+ typeof record.contentChars === "number" &&
211
+ Number.isFinite(record.contentChars)
212
+ ? Math.max(preview.chars, Math.floor(record.contentChars))
213
+ : preview.chars;
214
+ sanitized.contentTruncated =
215
+ typeof record.contentTruncated === "boolean"
216
+ ? record.contentTruncated || preview.truncated
217
+ : preview.truncated;
218
+ }
219
+ const attempts = sanitizeAttempts(record.attempts);
220
+ if (attempts)
221
+ sanitized.attempts = attempts;
222
+ const contentBackfill = sanitizeBackfill(record.contentBackfill);
223
+ if (contentBackfill)
224
+ sanitized.contentBackfill = contentBackfill;
225
+ return sanitized;
226
+ }
227
+ function matchesFilter(record, filter) {
228
+ if (filter.route && record.route !== filter.route)
229
+ return false;
230
+ if (filter.status === "ok" && (record.status < 200 || record.status >= 300))
231
+ return false;
232
+ if (filter.status === "error" && record.status >= 200 && record.status < 300)
233
+ return false;
234
+ if (filter.provider) {
235
+ const target = filter.provider.toLowerCase();
236
+ const matchedPrimary = record.provider?.toLowerCase() === target;
237
+ const matchedAttempt = record.attempts?.some((attempt) => attempt.provider.toLowerCase() === target);
238
+ const matchedBackfill = record.contentBackfill?.items.some((item) => item.provider?.toLowerCase() === target);
239
+ if (!matchedPrimary && !matchedAttempt && !matchedBackfill)
240
+ return false;
241
+ }
242
+ if (filter.q) {
243
+ const needle = filter.q.trim().toLowerCase();
244
+ if (needle.length > 0) {
245
+ const haystacks = [
246
+ record.id,
247
+ record.query,
248
+ record.url,
249
+ record.title,
250
+ record.code,
251
+ record.provider,
252
+ ];
253
+ const matchedField = haystacks.some((field) => typeof field === "string" && field.toLowerCase().includes(needle));
254
+ const matchedResult = record.results?.some((item) => item.title.toLowerCase().includes(needle) ||
255
+ item.url.toLowerCase().includes(needle) ||
256
+ (item.snippet ? item.snippet.toLowerCase().includes(needle) : false));
257
+ if (!matchedField && !matchedResult)
258
+ return false;
259
+ }
260
+ }
261
+ return true;
262
+ }
263
+ export function createGatewayRecordStore(retention = GATEWAY_RECORD_RETENTION) {
264
+ const capacity = Math.max(1, Math.floor(retention));
265
+ const records = [];
266
+ return {
267
+ get retention() {
268
+ return capacity;
269
+ },
270
+ get size() {
271
+ return records.length;
272
+ },
273
+ add(record) {
274
+ records.push(sanitizeRecord(record));
275
+ if (records.length > capacity)
276
+ records.splice(0, records.length - capacity);
277
+ },
278
+ list(limitOrFilter) {
279
+ const filter = typeof limitOrFilter === "number"
280
+ ? { limit: limitOrFilter }
281
+ : (limitOrFilter ?? {});
282
+ const bounded = Math.min(Math.max(1, Math.floor(filter.limit ?? capacity)), capacity);
283
+ const hasCriteria = Boolean(filter.route || filter.status || filter.provider || filter.q?.trim());
284
+ if (!hasCriteria) {
285
+ return records.slice(-bounded).reverse();
286
+ }
287
+ const matched = [];
288
+ for (let index = records.length - 1; index >= 0; index--) {
289
+ const item = records[index];
290
+ if (!item)
291
+ continue;
292
+ if (matchesFilter(item, filter)) {
293
+ matched.push(item);
294
+ if (matched.length >= bounded)
295
+ break;
296
+ }
297
+ }
298
+ return matched;
299
+ },
300
+ get(id) {
301
+ for (let index = records.length - 1; index >= 0; index--) {
302
+ const item = records[index];
303
+ if (item && item.id === id)
304
+ return item;
305
+ }
306
+ return undefined;
307
+ },
308
+ clear() {
309
+ const cleared = records.length;
310
+ records.length = 0;
311
+ return cleared;
312
+ },
313
+ };
314
+ }
315
+ function emptyCapabilityStats() {
316
+ return {
317
+ attempts: 0,
318
+ successes: 0,
319
+ failures: 0,
320
+ skipped: 0,
321
+ totalDurationMs: 0,
322
+ avgDurationMs: 0,
323
+ errorCodes: {},
324
+ };
325
+ }
326
+ function applyAttemptToCapabilityStats(stats, attempt, at) {
327
+ if (attempt.status === "skipped") {
328
+ stats.skipped += 1;
329
+ return;
330
+ }
331
+ stats.attempts += 1;
332
+ stats.totalDurationMs += Math.max(0, attempt.durationMs);
333
+ stats.avgDurationMs = Math.round(stats.totalDurationMs / stats.attempts);
334
+ stats.lastUsedAt = at;
335
+ stats.lastStatus = attempt.status;
336
+ if (attempt.status === "ok") {
337
+ stats.successes += 1;
338
+ }
339
+ else {
340
+ stats.failures += 1;
341
+ const code = attempt.errorCode ?? "unknown";
342
+ stats.lastErrorCode = code;
343
+ stats.errorCodes[code] = (stats.errorCodes[code] ?? 0) + 1;
344
+ }
345
+ }
346
+ export function createGatewayStatsTracker(startedAt = Date.now()) {
347
+ let resetAt = startedAt;
348
+ let totalRequests = 0;
349
+ let searchRequests = 0;
350
+ let searchSuccesses = 0;
351
+ let fetchRequests = 0;
352
+ let fetchSuccesses = 0;
353
+ let successCount = 0;
354
+ let errorCount = 0;
355
+ let backfillRequests = 0;
356
+ let backfillItemsSucceeded = 0;
357
+ let backfillItemsFailed = 0;
358
+ const providers = new Map();
359
+ function ensureProvider(id) {
360
+ let entry = providers.get(id);
361
+ if (!entry) {
362
+ entry = {
363
+ search: emptyCapabilityStats(),
364
+ extract: emptyCapabilityStats(),
365
+ };
366
+ providers.set(id, entry);
367
+ }
368
+ return entry;
369
+ }
370
+ return {
371
+ recordRequest(info) {
372
+ totalRequests += 1;
373
+ if (info.route === "search") {
374
+ searchRequests += 1;
375
+ if (info.ok)
376
+ searchSuccesses += 1;
377
+ }
378
+ else {
379
+ fetchRequests += 1;
380
+ if (info.ok)
381
+ fetchSuccesses += 1;
382
+ }
383
+ if (info.ok) {
384
+ successCount += 1;
385
+ }
386
+ else {
387
+ errorCount += 1;
388
+ }
389
+ const capability = info.route === "search" ? "search" : "extract";
390
+ for (const attempt of info.attempts ?? []) {
391
+ const providerStats = ensureProvider(attempt.provider);
392
+ applyAttemptToCapabilityStats(providerStats[capability], attempt, info.at);
393
+ }
394
+ if (info.contentBackfill) {
395
+ backfillRequests += 1;
396
+ backfillItemsSucceeded += info.contentBackfill.succeededCount;
397
+ backfillItemsFailed += info.contentBackfill.failedCount;
398
+ for (const item of info.contentBackfill.items) {
399
+ if (item.attempts && item.attempts.length > 0) {
400
+ for (const attempt of item.attempts) {
401
+ const providerStats = ensureProvider(attempt.provider);
402
+ applyAttemptToCapabilityStats(providerStats.extract, attempt, info.at);
403
+ }
404
+ }
405
+ else if (item.provider &&
406
+ (item.status === "ok" || item.status === "failed")) {
407
+ const providerStats = ensureProvider(item.provider);
408
+ applyAttemptToCapabilityStats(providerStats.extract, {
409
+ provider: item.provider,
410
+ status: item.status,
411
+ durationMs: item.durationMs,
412
+ ...(item.errorCode ? { errorCode: item.errorCode } : {}),
413
+ }, info.at);
414
+ }
415
+ }
416
+ }
417
+ },
418
+ snapshot() {
419
+ const providerOut = {};
420
+ for (const [id, entry] of providers.entries()) {
421
+ providerOut[id] = {
422
+ search: {
423
+ ...entry.search,
424
+ errorCodes: { ...entry.search.errorCodes },
425
+ },
426
+ extract: {
427
+ ...entry.extract,
428
+ errorCodes: { ...entry.extract.errorCodes },
429
+ },
430
+ };
431
+ }
432
+ return {
433
+ startedAt,
434
+ resetAt,
435
+ totalRequests,
436
+ searchRequests,
437
+ searchSuccesses,
438
+ fetchRequests,
439
+ fetchSuccesses,
440
+ successCount,
441
+ errorCount,
442
+ backfillRequests,
443
+ backfillItemsSucceeded,
444
+ backfillItemsFailed,
445
+ providers: providerOut,
446
+ };
447
+ },
448
+ reset(now = Date.now()) {
449
+ resetAt = now;
450
+ totalRequests = 0;
451
+ searchRequests = 0;
452
+ searchSuccesses = 0;
453
+ fetchRequests = 0;
454
+ fetchSuccesses = 0;
455
+ successCount = 0;
456
+ errorCount = 0;
457
+ backfillRequests = 0;
458
+ backfillItemsSucceeded = 0;
459
+ backfillItemsFailed = 0;
460
+ providers.clear();
461
+ },
462
+ };
463
+ }
464
+ //# sourceMappingURL=records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/gateway/records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import { isIP } from "node:net";
2
+ import { Type } from "typebox";
3
+ import { Check } from "typebox/value";
4
+ export const GATEWAY_SEARCH_MAX_COUNT = 50;
5
+ export const GATEWAY_SEARCH_DEFAULT_COUNT = 10;
6
+ export const GATEWAY_QUERY_MAX_CHARACTERS = 128;
7
+ export const GATEWAY_URL_MAX_CHARACTERS = 8192;
8
+ /**
9
+ * Unknown request fields are ignored, matching the official API contract. Only
10
+ * known fields are read below, so unknown keys cannot select a provider,
11
+ * credential, timeout, or configuration override.
12
+ */
13
+ export const GatewaySearchRequestSchema = Type.Object({
14
+ query: Type.String({
15
+ minLength: 1,
16
+ maxLength: GATEWAY_QUERY_MAX_CHARACTERS,
17
+ pattern: "\\S",
18
+ }),
19
+ count: Type.Optional(Type.Integer({ minimum: 1, maximum: GATEWAY_SEARCH_MAX_COUNT })),
20
+ ori_question: Type.Optional(Type.Union([
21
+ Type.String({ minLength: 1, maxLength: GATEWAY_QUERY_MAX_CHARACTERS }),
22
+ Type.Null(),
23
+ ])),
24
+ localization: Type.Optional(Type.String()),
25
+ need_content: Type.Optional(Type.Boolean()),
26
+ });
27
+ export const GatewayFetchRequestSchema = Type.Object({
28
+ url: Type.String({ minLength: 1, maxLength: GATEWAY_URL_MAX_CHARACTERS }),
29
+ });
30
+ const GatewaySearchResultSchema = Type.Object({
31
+ rerank_score: Type.Number(),
32
+ title: Type.String(),
33
+ url: Type.String(),
34
+ snippet: Type.String(),
35
+ summary: Type.String(),
36
+ content: Type.String(),
37
+ site_name: Type.Union([Type.String(), Type.Null()]),
38
+ site_icon: Type.Union([Type.String(), Type.Null()]),
39
+ date: Type.Union([Type.String(), Type.Null()]),
40
+ authority: Type.Number(),
41
+ }, { additionalProperties: false });
42
+ export const GatewaySearchResponseSchema = Type.Object({ results: Type.Array(GatewaySearchResultSchema) }, { additionalProperties: false });
43
+ export const GatewayFetchResponseSchema = Type.Object({ title: Type.String(), content: Type.String() }, { additionalProperties: false });
44
+ export const GatewayErrorSchema = Type.Object({
45
+ error: Type.Object({
46
+ message: Type.String(),
47
+ type: Type.String(),
48
+ param: Type.Null(),
49
+ code: Type.String(),
50
+ }, { additionalProperties: false }),
51
+ }, { additionalProperties: false });
52
+ export const GatewaySchemaDocuments = {
53
+ gatewaySearchRequest: GatewaySearchRequestSchema,
54
+ gatewaySearchResponse: GatewaySearchResponseSchema,
55
+ gatewayFetchRequest: GatewayFetchRequestSchema,
56
+ gatewayFetchResponse: GatewayFetchResponseSchema,
57
+ gatewayError: GatewayErrorSchema,
58
+ };
59
+ /** A fixed, non-leaking validation failure. */
60
+ export class GatewayValidationError extends Error {
61
+ constructor(message) {
62
+ super(message);
63
+ this.name = "GatewayValidationError";
64
+ }
65
+ }
66
+ function invalid(message) {
67
+ throw new GatewayValidationError(message);
68
+ }
69
+ export function parseGatewaySearchRequest(value) {
70
+ if (!Check(GatewaySearchRequestSchema, value))
71
+ invalid("请求体不符合 Search API:query 必须为 1–128 个非空白字符,count 必须为 1–50 的整数,ori_question 必须为 1–128 个字符或 null,localization 必须为字符串,need_content 必须为布尔值");
72
+ const request = value;
73
+ const localization = request.localization ?? "";
74
+ if (localization !== "" && isIP(localization) === 0)
75
+ invalid("localization 必须为 IP 地址或空字符串");
76
+ return {
77
+ query: request.query,
78
+ count: request.count ?? GATEWAY_SEARCH_DEFAULT_COUNT,
79
+ ori_question: request.ori_question ?? null,
80
+ localization,
81
+ need_content: request.need_content ?? false,
82
+ };
83
+ }
84
+ export function parseGatewayFetchRequest(value) {
85
+ if (!Check(GatewayFetchRequestSchema, value))
86
+ invalid("请求体不符合 Fetch API:url 必须为 1–8192 个字符的字符串");
87
+ return { url: parseGatewayFetchUrl(value.url) };
88
+ }
89
+ function hasControlCharacters(value) {
90
+ for (const character of value) {
91
+ const code = character.codePointAt(0) ?? 0;
92
+ if (code < 0x20 || code === 0x7f)
93
+ return true;
94
+ }
95
+ return false;
96
+ }
97
+ export function parseGatewayFetchUrl(raw) {
98
+ if (hasControlCharacters(raw))
99
+ invalid("url 不能包含控制字符");
100
+ let url;
101
+ try {
102
+ url = new URL(raw);
103
+ }
104
+ catch {
105
+ invalid("url 必须是合法的绝对 URL");
106
+ }
107
+ if (url.protocol !== "http:" && url.protocol !== "https:")
108
+ invalid("url 必须使用 http 或 https");
109
+ if (!url.hostname)
110
+ invalid("url 必须包含主机名");
111
+ if (url.username || url.password)
112
+ invalid("url 不能包含用户名或密码");
113
+ return url.toString();
114
+ }
115
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/gateway/schema.ts"],"names":[],"mappings":"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"}