@yh-ui/request 0.1.21

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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +274 -0
  3. package/dist/adapters/fetch.cjs +157 -0
  4. package/dist/adapters/fetch.d.ts +25 -0
  5. package/dist/adapters/fetch.mjs +148 -0
  6. package/dist/adapters/index.cjs +27 -0
  7. package/dist/adapters/index.d.ts +5 -0
  8. package/dist/adapters/index.mjs +2 -0
  9. package/dist/adapters/platform.cjs +394 -0
  10. package/dist/adapters/platform.d.ts +72 -0
  11. package/dist/adapters/platform.mjs +369 -0
  12. package/dist/cache/index.cjs +56 -0
  13. package/dist/cache/index.d.ts +21 -0
  14. package/dist/cache/index.mjs +14 -0
  15. package/dist/cache/indexedDB.cjs +188 -0
  16. package/dist/cache/indexedDB.d.ts +58 -0
  17. package/dist/cache/indexedDB.mjs +176 -0
  18. package/dist/cache/localStorage.cjs +158 -0
  19. package/dist/cache/localStorage.d.ts +58 -0
  20. package/dist/cache/localStorage.mjs +153 -0
  21. package/dist/cache/memory.cjs +112 -0
  22. package/dist/cache/memory.d.ts +71 -0
  23. package/dist/cache/memory.mjs +103 -0
  24. package/dist/graphql.cjs +255 -0
  25. package/dist/graphql.d.ts +192 -0
  26. package/dist/graphql.mjs +235 -0
  27. package/dist/http-cache.cjs +248 -0
  28. package/dist/http-cache.d.ts +156 -0
  29. package/dist/http-cache.mjs +233 -0
  30. package/dist/index.cjs +181 -0
  31. package/dist/index.d.ts +23 -0
  32. package/dist/index.mjs +16 -0
  33. package/dist/interceptors/debug.cjs +139 -0
  34. package/dist/interceptors/debug.d.ts +92 -0
  35. package/dist/interceptors/debug.mjs +130 -0
  36. package/dist/interceptors/index.cjs +38 -0
  37. package/dist/interceptors/index.d.ts +6 -0
  38. package/dist/interceptors/index.mjs +3 -0
  39. package/dist/interceptors/progress.cjs +185 -0
  40. package/dist/interceptors/progress.d.ts +97 -0
  41. package/dist/interceptors/progress.mjs +177 -0
  42. package/dist/interceptors/security.cjs +154 -0
  43. package/dist/interceptors/security.d.ts +83 -0
  44. package/dist/interceptors/security.mjs +134 -0
  45. package/dist/plugin.cjs +166 -0
  46. package/dist/plugin.d.ts +106 -0
  47. package/dist/plugin.mjs +163 -0
  48. package/dist/request.cjs +396 -0
  49. package/dist/request.d.ts +111 -0
  50. package/dist/request.mjs +339 -0
  51. package/dist/types.cjs +13 -0
  52. package/dist/types.d.ts +157 -0
  53. package/dist/types.mjs +7 -0
  54. package/dist/useAIStream.cjs +125 -0
  55. package/dist/useAIStream.d.ts +89 -0
  56. package/dist/useAIStream.mjs +108 -0
  57. package/dist/useLoadMore.cjs +136 -0
  58. package/dist/useLoadMore.d.ts +84 -0
  59. package/dist/useLoadMore.mjs +134 -0
  60. package/dist/usePagination.cjs +141 -0
  61. package/dist/usePagination.d.ts +89 -0
  62. package/dist/usePagination.mjs +132 -0
  63. package/dist/useQueue.cjs +243 -0
  64. package/dist/useQueue.d.ts +118 -0
  65. package/dist/useQueue.mjs +239 -0
  66. package/dist/useRequest.cjs +325 -0
  67. package/dist/useRequest.d.ts +126 -0
  68. package/dist/useRequest.mjs +329 -0
  69. package/dist/useRequestQueue.cjs +36 -0
  70. package/dist/useRequestQueue.d.ts +52 -0
  71. package/dist/useRequestQueue.mjs +27 -0
  72. package/dist/useSSE.cjs +241 -0
  73. package/dist/useSSE.d.ts +74 -0
  74. package/dist/useSSE.mjs +226 -0
  75. package/dist/websocket.cjs +325 -0
  76. package/dist/websocket.d.ts +163 -0
  77. package/dist/websocket.mjs +316 -0
  78. package/package.json +61 -0
@@ -0,0 +1,394 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NodeHttpAdapter = exports.EdgeAdapter = exports.DenoAdapter = exports.BunAdapter = void 0;
7
+ exports.detectPlatform = detectPlatform;
8
+ exports.getAdapter = getAdapter;
9
+ exports.getBestAdapter = getBestAdapter;
10
+ exports.platform = void 0;
11
+ function detectPlatform() {
12
+ const globalObj = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : {};
13
+ if (typeof Deno !== "undefined") {
14
+ return {
15
+ environment: "deno",
16
+ supportsFetch: true,
17
+ supportsFormData: true,
18
+ supportsAbortController: true
19
+ };
20
+ }
21
+ if (typeof Bun !== "undefined") {
22
+ return {
23
+ environment: "bun",
24
+ supportsFetch: true,
25
+ supportsFormData: true,
26
+ supportsAbortController: true
27
+ };
28
+ }
29
+ if (globalObj.edgeRuntime !== void 0 || typeof navigator !== "undefined" && navigator.userAgent.includes("Cloudflare") || globalObj.caches !== void 0) {
30
+ return {
31
+ environment: "edge",
32
+ supportsFetch: true,
33
+ supportsFormData: true,
34
+ supportsAbortController: true
35
+ };
36
+ }
37
+ if (typeof process !== "undefined" && process.versions?.node) {
38
+ return {
39
+ environment: "node",
40
+ supportsFetch: typeof fetch !== "undefined",
41
+ supportsFormData: typeof FormData !== "undefined",
42
+ supportsAbortController: typeof AbortController !== "undefined"
43
+ };
44
+ }
45
+ return {
46
+ environment: "browser",
47
+ supportsFetch: typeof fetch !== "undefined",
48
+ supportsFormData: typeof FormData !== "undefined",
49
+ supportsAbortController: typeof AbortController !== "undefined"
50
+ };
51
+ }
52
+ const platform = exports.platform = detectPlatform();
53
+ class NodeHttpAdapter {
54
+ name = "node-http";
55
+ http = NodeHttpAdapter.getHttpModule();
56
+ static getHttpModule() {
57
+ try {
58
+ return require("http");
59
+ } catch {
60
+ throw new Error("Node.js http module is not available");
61
+ }
62
+ }
63
+ isSupported() {
64
+ return typeof process !== "undefined" && !!process.versions?.node;
65
+ }
66
+ async request(config) {
67
+ const {
68
+ fullPath,
69
+ method = "GET",
70
+ headers = {},
71
+ data,
72
+ signal,
73
+ credentials
74
+ } = config;
75
+ return new Promise((resolve, reject) => {
76
+ const urlObj = new URL(fullPath);
77
+ const isHttps = urlObj.protocol === "https:";
78
+ const httpModule = isHttps ? require("https") : this.http;
79
+ const options = {
80
+ hostname: urlObj.hostname,
81
+ port: urlObj.port || (isHttps ? 443 : 80),
82
+ path: urlObj.pathname + urlObj.search,
83
+ method,
84
+ headers: {
85
+ ...headers,
86
+ // 处理凭证
87
+ ...(credentials === "include" ? {
88
+ Cookie: ""
89
+ } : {})
90
+ },
91
+ timeout: config.timeout || 3e4
92
+ };
93
+ if (isHttps) {
94
+ Object.assign(options, {
95
+ rejectUnauthorized: false
96
+ // 允许自签名证书(可选配置)
97
+ });
98
+ }
99
+ const req = httpModule.request(options, res => {
100
+ const chunks = [];
101
+ res.on("data", chunk => {
102
+ chunks.push(chunk);
103
+ });
104
+ res.on("end", () => {
105
+ const body = Buffer.concat(chunks).toString("utf-8");
106
+ let responseData;
107
+ if (config.responseType === "text") {
108
+ responseData = body;
109
+ } else if (config.responseType === "arraybuffer") {
110
+ responseData = Buffer.from(body).buffer;
111
+ } else if (config.responseType === "blob") {
112
+ responseData = Buffer.from(body);
113
+ } else {
114
+ try {
115
+ responseData = body ? JSON.parse(body) : null;
116
+ } catch {
117
+ responseData = body;
118
+ }
119
+ }
120
+ const mockResponse = {
121
+ ok: (res.statusCode || 200) >= 200 && (res.statusCode || 200) < 300,
122
+ status: res.statusCode || 200,
123
+ statusText: res.statusMessage || "",
124
+ headers: res.headers,
125
+ text: () => Promise.resolve(body),
126
+ json: () => Promise.resolve(responseData),
127
+ blob: () => Promise.resolve(Buffer.from(body)),
128
+ arrayBuffer: () => Promise.resolve(Buffer.from(body).buffer),
129
+ formData: () => Promise.resolve(new URLSearchParams(body))
130
+ };
131
+ resolve({
132
+ data: responseData,
133
+ response: mockResponse,
134
+ config,
135
+ requestId: config.requestId
136
+ });
137
+ });
138
+ });
139
+ req.on("timeout", () => {
140
+ req.destroy();
141
+ reject(new Error("Request timeout"));
142
+ });
143
+ req.on("error", error => {
144
+ reject(error);
145
+ });
146
+ if (signal) {
147
+ signal.addEventListener("abort", () => {
148
+ req.destroy();
149
+ reject(new DOMException("Aborted", "AbortError"));
150
+ });
151
+ }
152
+ if (data && method !== "GET") {
153
+ const body = typeof data === "string" ? data : JSON.stringify(data);
154
+ req.write(body);
155
+ }
156
+ req.end();
157
+ });
158
+ }
159
+ }
160
+ exports.NodeHttpAdapter = NodeHttpAdapter;
161
+ class DenoAdapter {
162
+ name = "deno";
163
+ isSupported() {
164
+ return typeof globalThis.Deno !== "undefined";
165
+ }
166
+ async request(config) {
167
+ const {
168
+ fullPath,
169
+ method = "GET",
170
+ headers = {},
171
+ data,
172
+ signal,
173
+ credentials,
174
+ responseType,
175
+ timeout
176
+ } = config;
177
+ const fetchOptions = {
178
+ method,
179
+ headers,
180
+ credentials
181
+ };
182
+ if (data && method !== "GET") {
183
+ if (data instanceof FormData) {
184
+ fetchOptions.body = data;
185
+ } else {
186
+ fetchOptions.body = JSON.stringify(data);
187
+ if (!headers["Content-Type"]) {
188
+ ;
189
+ fetchOptions.headers["Content-Type"] = "application/json";
190
+ }
191
+ }
192
+ }
193
+ const controller = new AbortController();
194
+ fetchOptions.signal = controller.signal;
195
+ if (timeout) {
196
+ setTimeout(() => controller.abort(), timeout).unref?.();
197
+ }
198
+ if (signal) {
199
+ signal.addEventListener("abort", () => controller.abort());
200
+ }
201
+ const response = await fetch(fullPath, fetchOptions);
202
+ let responseData;
203
+ switch (responseType) {
204
+ case "text":
205
+ responseData = await response.text();
206
+ break;
207
+ case "blob":
208
+ responseData = await response.blob();
209
+ break;
210
+ case "arraybuffer":
211
+ responseData = await response.arrayBuffer();
212
+ break;
213
+ case "formdata":
214
+ responseData = await response.formData();
215
+ break;
216
+ default:
217
+ const text = await response.text();
218
+ responseData = text ? JSON.parse(text) : null;
219
+ }
220
+ return {
221
+ data: responseData,
222
+ response,
223
+ config,
224
+ requestId: config.requestId
225
+ };
226
+ }
227
+ }
228
+ exports.DenoAdapter = DenoAdapter;
229
+ class BunAdapter {
230
+ name = "bun";
231
+ isSupported() {
232
+ return typeof globalThis.Bun !== "undefined";
233
+ }
234
+ // Bun 直接使用 fetch,与 FetchAdapter 相同
235
+ // 但保留此类以便未来可能的 Bun 特定优化
236
+ async request(config) {
237
+ const {
238
+ fullPath,
239
+ method = "GET",
240
+ headers = {},
241
+ data,
242
+ signal,
243
+ credentials,
244
+ responseType,
245
+ timeout
246
+ } = config;
247
+ const fetchOptions = {
248
+ method,
249
+ headers,
250
+ credentials
251
+ };
252
+ if (data && method !== "GET") {
253
+ if (data instanceof FormData) {
254
+ fetchOptions.body = data;
255
+ } else {
256
+ fetchOptions.body = JSON.stringify(data);
257
+ if (!headers["Content-Type"]) {
258
+ ;
259
+ fetchOptions.headers["Content-Type"] = "application/json";
260
+ }
261
+ }
262
+ }
263
+ if (timeout) {
264
+ const controller = new AbortController();
265
+ fetchOptions.signal = controller.signal;
266
+ setTimeout(() => controller.abort(), timeout);
267
+ } else if (signal) {
268
+ fetchOptions.signal = signal;
269
+ }
270
+ const response = await fetch(fullPath, fetchOptions);
271
+ let responseData;
272
+ switch (responseType) {
273
+ case "text":
274
+ responseData = await response.text();
275
+ break;
276
+ case "blob":
277
+ responseData = await response.blob();
278
+ break;
279
+ case "arraybuffer":
280
+ responseData = await response.arrayBuffer();
281
+ break;
282
+ case "formdata":
283
+ responseData = await response.formData();
284
+ break;
285
+ default:
286
+ const text = await response.text();
287
+ responseData = text ? JSON.parse(text) : null;
288
+ }
289
+ return {
290
+ data: responseData,
291
+ response,
292
+ config,
293
+ requestId: config.requestId
294
+ };
295
+ }
296
+ }
297
+ exports.BunAdapter = BunAdapter;
298
+ class EdgeAdapter {
299
+ name = "edge";
300
+ isSupported() {
301
+ return platform.environment === "edge";
302
+ }
303
+ async request(config) {
304
+ const {
305
+ fullPath,
306
+ method = "GET",
307
+ headers = {},
308
+ data,
309
+ signal,
310
+ credentials,
311
+ responseType,
312
+ timeout
313
+ } = config;
314
+ const fetchOptions = {
315
+ method,
316
+ headers,
317
+ credentials
318
+ };
319
+ if (data && method !== "GET") {
320
+ if (data instanceof URLSearchParams) {
321
+ fetchOptions.body = data;
322
+ } else {
323
+ fetchOptions.body = JSON.stringify(data);
324
+ if (!headers["Content-Type"]) {
325
+ ;
326
+ fetchOptions.headers["Content-Type"] = "application/json";
327
+ }
328
+ }
329
+ }
330
+ if (timeout) {
331
+ const controller = new AbortController();
332
+ fetchOptions.signal = controller.signal;
333
+ setTimeout(() => controller.abort(), timeout);
334
+ } else if (signal) {
335
+ fetchOptions.signal = signal;
336
+ }
337
+ const response = await fetch(fullPath, fetchOptions);
338
+ let responseData;
339
+ switch (responseType) {
340
+ case "text":
341
+ responseData = await response.text();
342
+ break;
343
+ case "blob":
344
+ responseData = await response.blob();
345
+ break;
346
+ case "arraybuffer":
347
+ responseData = await response.arrayBuffer();
348
+ break;
349
+ default:
350
+ const text = await response.text();
351
+ responseData = text ? JSON.parse(text) : null;
352
+ }
353
+ return {
354
+ data: responseData,
355
+ response,
356
+ config,
357
+ requestId: config.requestId
358
+ };
359
+ }
360
+ }
361
+ exports.EdgeAdapter = EdgeAdapter;
362
+ function getBestAdapter() {
363
+ const {
364
+ environment
365
+ } = platform;
366
+ switch (environment) {
367
+ case "deno":
368
+ return new DenoAdapter();
369
+ case "bun":
370
+ return new BunAdapter();
371
+ case "edge":
372
+ return new EdgeAdapter();
373
+ case "node":
374
+ return new NodeHttpAdapter();
375
+ case "browser":
376
+ default:
377
+ return new (require("./fetch.cjs").FetchAdapter)();
378
+ }
379
+ }
380
+ function getAdapter(environment) {
381
+ switch (environment) {
382
+ case "deno":
383
+ return new DenoAdapter();
384
+ case "bun":
385
+ return new BunAdapter();
386
+ case "edge":
387
+ return new EdgeAdapter();
388
+ case "node":
389
+ return new NodeHttpAdapter();
390
+ case "browser":
391
+ default:
392
+ return new (require("./fetch.cjs").FetchAdapter)();
393
+ }
394
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * 跨平台适配器
3
+ * 支持 Node.js、Deno、Bun、边缘计算环境
4
+ */
5
+ import type { InternalRequestOptions, RequestResponse, HttpAdapter } from '../types';
6
+ /** 环境类型 */
7
+ export type RuntimeEnvironment = 'browser' | 'node' | 'deno' | 'bun' | 'edge';
8
+ /** 平台检测结果 */
9
+ export interface PlatformInfo {
10
+ /** 当前环境 */
11
+ environment: RuntimeEnvironment;
12
+ /** 是否支持 fetch */
13
+ supportsFetch: boolean;
14
+ /** 是否支持 FormData */
15
+ supportsFormData: boolean;
16
+ /** 是否支持 AbortController */
17
+ supportsAbortController: boolean;
18
+ }
19
+ /**
20
+ * 检测当前运行环境
21
+ */
22
+ export declare function detectPlatform(): PlatformInfo;
23
+ /**
24
+ * 获取当前平台信息
25
+ */
26
+ export declare const platform: PlatformInfo;
27
+ /**
28
+ * Node.js HTTP 适配器
29
+ * 使用原生 http/https 模块,无需额外依赖
30
+ */
31
+ export declare class NodeHttpAdapter implements HttpAdapter {
32
+ name: string;
33
+ private http;
34
+ private static getHttpModule;
35
+ isSupported(): boolean;
36
+ request<T>(config: InternalRequestOptions): Promise<RequestResponse<T>>;
37
+ }
38
+ /**
39
+ * Deno 适配器
40
+ * 使用 Deno 标准库 fetch
41
+ */
42
+ export declare class DenoAdapter implements HttpAdapter {
43
+ name: string;
44
+ isSupported(): boolean;
45
+ request<T>(config: InternalRequestOptions): Promise<RequestResponse<T>>;
46
+ }
47
+ /**
48
+ * Bun 适配器
49
+ * 使用 Bun 原生 fetch 和 FormData
50
+ */
51
+ export declare class BunAdapter implements HttpAdapter {
52
+ name: string;
53
+ isSupported(): boolean;
54
+ request<T>(config: InternalRequestOptions): Promise<RequestResponse<T>>;
55
+ }
56
+ /**
57
+ * 边缘计算适配器
58
+ * 针对 Cloudflare Workers、Vercel Edge 等环境优化
59
+ */
60
+ export declare class EdgeAdapter implements HttpAdapter {
61
+ name: string;
62
+ isSupported(): boolean;
63
+ request<T>(config: InternalRequestOptions): Promise<RequestResponse<T>>;
64
+ }
65
+ /**
66
+ * 自动选择最佳适配器
67
+ */
68
+ export declare function getBestAdapter(): HttpAdapter;
69
+ /**
70
+ * 根据环境名称获取适配器
71
+ */
72
+ export declare function getAdapter(environment: RuntimeEnvironment): HttpAdapter;