@longzai-intelligence-transport/http-preset-browser 0.1.0 → 0.1.1
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/dist/index.d.ts +110 -2
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,103 @@
|
|
|
1
|
-
import { CsrfProvider, HttpClient, TokenProvider } from "@longzai-intelligence-transport/http-core";
|
|
1
|
+
import { CreateApiFunction, CsrfProvider, HttpClient, InferRouteParams, InferRouteQuery, RouteDefinition, StreamResponseRoute, TokenProvider } from "@longzai-intelligence-transport/http-core";
|
|
2
2
|
|
|
3
|
+
//#region src/stream-api-client.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* 流式路由响应类型映射(浏览器场景:Blob)
|
|
6
|
+
*
|
|
7
|
+
* 将 core 层的 BinaryStreamMarker 映射为浏览器的 Blob。
|
|
8
|
+
* 非流式路由映射为 never。
|
|
9
|
+
*
|
|
10
|
+
* @typeParam TRoute - 路由定义类型
|
|
11
|
+
*/
|
|
12
|
+
type InferStreamRouteResponse<TRoute extends RouteDefinition> = TRoute extends StreamResponseRoute ? Blob : never;
|
|
13
|
+
/**
|
|
14
|
+
* 流式下载函数签名
|
|
15
|
+
*
|
|
16
|
+
* 参数与 core GET 函数一致(基于 InferRouteParams / InferRouteQuery),
|
|
17
|
+
* 返回 Promise<Blob>。
|
|
18
|
+
*
|
|
19
|
+
* @typeParam TRoute - 路由定义类型
|
|
20
|
+
*/
|
|
21
|
+
type StreamDownloadFunction<TRoute extends RouteDefinition> = InferRouteParams<TRoute> extends undefined ? InferRouteQuery<TRoute> extends undefined ? () => Promise<InferStreamRouteResponse<TRoute>> : (query?: InferRouteQuery<TRoute>) => Promise<InferStreamRouteResponse<TRoute>> : InferRouteQuery<TRoute> extends undefined ? (params: InferRouteParams<TRoute>) => Promise<InferStreamRouteResponse<TRoute>> : (params: InferRouteParams<TRoute>, query?: InferRouteQuery<TRoute>) => Promise<InferStreamRouteResponse<TRoute>>;
|
|
22
|
+
/**
|
|
23
|
+
* 浏览器 API mapped type
|
|
24
|
+
*
|
|
25
|
+
* 流式路由映射为 StreamDownloadFunction,JSON 路由映射为 core CreateApiFunction。
|
|
26
|
+
*
|
|
27
|
+
* @typeParam TRoutes - 路由定义集合类型
|
|
28
|
+
*/
|
|
29
|
+
type BrowserApi<TRoutes extends Record<string, RouteDefinition>> = { [K in keyof TRoutes]: TRoutes[K] extends StreamResponseRoute ? StreamDownloadFunction<TRoutes[K]> : CreateApiFunction<TRoutes[K]> };
|
|
30
|
+
/**
|
|
31
|
+
* 流式 fetch 配置
|
|
32
|
+
*
|
|
33
|
+
* 从 BrowserPresetConfig 提取流式 fetch 所需的配置项。
|
|
34
|
+
*/
|
|
35
|
+
type StreamFetchConfig = {
|
|
36
|
+
/**
|
|
37
|
+
* API 基础 URL
|
|
38
|
+
*/
|
|
39
|
+
baseUrl: string;
|
|
40
|
+
/**
|
|
41
|
+
* 自定义请求头
|
|
42
|
+
*/
|
|
43
|
+
headers?: Record<string, string>;
|
|
44
|
+
/**
|
|
45
|
+
* Token 提供者(用于 Authorization 头)
|
|
46
|
+
*/
|
|
47
|
+
tokenProvider?: TokenProvider;
|
|
48
|
+
/**
|
|
49
|
+
* CSRF 提供者(用于 X-CSRF-Token 头)
|
|
50
|
+
*/
|
|
51
|
+
csrfProvider?: CsrfProvider;
|
|
52
|
+
/**
|
|
53
|
+
* 自定义 fetch 函数(依赖注入,测试时可 mock)
|
|
54
|
+
*
|
|
55
|
+
* 省略时用全局 fetch。
|
|
56
|
+
*/
|
|
57
|
+
fetch?: typeof fetch;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* 创建流式下载函数
|
|
61
|
+
*
|
|
62
|
+
* 工厂模式:创建时绑定路由定义与配置,返回的函数发起 fetch 请求并返回 Blob。
|
|
63
|
+
* 错误路径(4xx/5xx)按 JSON 解析 ApiResponse 错误信封抛出。
|
|
64
|
+
*
|
|
65
|
+
* @typeParam TRoute - 流式路由定义类型
|
|
66
|
+
* @param route - 流式路由定义
|
|
67
|
+
* @param config - 流式 fetch 配置
|
|
68
|
+
* @returns 流式下载函数,返回 Promise<Blob>
|
|
69
|
+
* @throws {@link Error} 类型断言失败时抛出
|
|
70
|
+
*/
|
|
71
|
+
declare function createStreamDownloadFunction<TRoute extends StreamResponseRoute>(route: TRoute, config: StreamFetchConfig): StreamDownloadFunction<TRoute>;
|
|
72
|
+
/**
|
|
73
|
+
* 创建浏览器 API 客户端 factory
|
|
74
|
+
*
|
|
75
|
+
* 返回的 factory 接受 routes 集合,生成 BrowserApi:
|
|
76
|
+
* - JSON 路由:复用 core createApiClientFactory,走 HttpClient.request(JSON 解析 + safeParse)
|
|
77
|
+
* - 流式路由:走独立的 fetch + blob 路径,返回 Promise<Blob>
|
|
78
|
+
*
|
|
79
|
+
* @param client - core HttpClient(用于 JSON 路由)
|
|
80
|
+
* @param streamConfig - 流式 fetch 配置(baseUrl / headers / tokenProvider / csrfProvider)
|
|
81
|
+
* @returns API factory,接受 routes 返回 BrowserApi
|
|
82
|
+
* @throws {@link Error} 类型断言失败时抛出
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const factory = createBrowserApiClientFactory(client, {
|
|
87
|
+
* baseUrl: '/api',
|
|
88
|
+
* tokenProvider: { getToken: () => localStorage.getItem('token') },
|
|
89
|
+
* });
|
|
90
|
+
* const api = factory(orderRoutes);
|
|
91
|
+
*
|
|
92
|
+
* // JSON 路由:Promise<ApiResponse<Order>>
|
|
93
|
+
* const order = await api.detail({ id: '123' });
|
|
94
|
+
*
|
|
95
|
+
* // 流式路由:Promise<Blob>
|
|
96
|
+
* const blob = await api.downloadExport({ taskId: 'abc' });
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
declare function createBrowserApiClientFactory(client: HttpClient, streamConfig: StreamFetchConfig): <TRoutes extends Record<string, RouteDefinition>>(routes: TRoutes) => BrowserApi<TRoutes>;
|
|
100
|
+
//#endregion
|
|
3
101
|
//#region src/index.d.ts
|
|
4
102
|
/**
|
|
5
103
|
* Browser 预设配置
|
|
@@ -65,5 +163,15 @@ type BrowserPresetConfig = {
|
|
|
65
163
|
* @returns HTTP 客户端实例
|
|
66
164
|
*/
|
|
67
165
|
declare function createBrowserHttpClient(config: BrowserPresetConfig): HttpClient;
|
|
166
|
+
/**
|
|
167
|
+
* 从 BrowserPresetConfig 创建 API factory(便捷封装)
|
|
168
|
+
*
|
|
169
|
+
* 内部调用 createBrowserHttpClient + createBrowserApiClientFactory,
|
|
170
|
+
* 对流式路由返回 Promise<Blob>,对 JSON 路由复用 core factory。
|
|
171
|
+
*
|
|
172
|
+
* @param config - 浏览器预设配置
|
|
173
|
+
* @returns API factory,接受 routes 返回 BrowserApi
|
|
174
|
+
*/
|
|
175
|
+
declare function createBrowserApiFactory(config: BrowserPresetConfig): <TRoutes extends Record<string, import("@longzai-intelligence-transport/http-core").RouteDefinition>>(routes: TRoutes) => BrowserApi<TRoutes>;
|
|
68
176
|
//#endregion
|
|
69
|
-
export { type BrowserPresetConfig, createBrowserHttpClient };
|
|
177
|
+
export { type BrowserApi, type BrowserPresetConfig, type InferStreamRouteResponse, type StreamDownloadFunction, type StreamFetchConfig, createBrowserApiClientFactory, createBrowserApiFactory, createBrowserHttpClient, createStreamDownloadFunction };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{buildPath as e,createApiClientFactory as t,createAuthTokenInterceptor as n,createCsrfInterceptor as r,createHttpClient as i,createLoggingInterceptor as a,isStreamRoute as o,isType as s}from"@longzai-intelligence-transport/http-core";function c(t,n){let r=async(r,i)=>{let a=n.baseUrl+e(t.path,r,i),o={...n.headers};if(n.tokenProvider){let e=await n.tokenProvider.getToken();e!==null&&(o.Authorization=`Bearer ${e}`)}if(n.csrfProvider){let e=await n.csrfProvider.getToken();e!==null&&(o[`X-CSRF-Token`]=e)}let s=await(n.fetch??fetch)(a,{headers:o});if(!s.ok)throw await s.json();return s.blob()};if(s(r))return r;throw Error(`流式下载函数构建失败`)}function l(e,n){let r=t(e);return e=>{let t={...r(e)};for(let[r,i]of Object.entries(e))i&&o(i)&&(t[r]=c(i,n));if(s(t))return t;throw Error(`API 客户端构建失败`)}}function u(e){let{baseUrl:t,tokenProvider:o,csrfProvider:s,enableLogging:c=import.meta.env?.DEV??!1,logLevel:l=`debug`,timeout:u,headers:d,onUnauthorized:f}=e,p=[],m=[];if(o&&p.push(n(o)),s&&p.push(r(s)),c){let e=a({level:l});p.push(e.request),m.push(e.response)}return i({baseUrl:t,timeout:u,headers:d,requestInterceptors:p,responseInterceptors:m,onUnauthorized:f})}function d(e){return l(u(e),{baseUrl:e.baseUrl,headers:e.headers,tokenProvider:e.tokenProvider,csrfProvider:e.csrfProvider})}export{l as createBrowserApiClientFactory,d as createBrowserApiFactory,u as createBrowserHttpClient,c as createStreamDownloadFunction};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@longzai-intelligence-transport/http-preset-browser",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"browser",
|
|
6
6
|
"http",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"clean": "rimraf dist out .cache"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@longzai-intelligence-transport/http-core": "0.1.
|
|
39
|
+
"@longzai-intelligence-transport/http-core": "0.1.1"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"zod": "^4.4.3"
|