@longzai-intelligence-transport/http-adapter-bun 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 CHANGED
@@ -1,4 +1,4 @@
1
- import { ApiResponse, InferRouteBody, InferRouteParams, InferRouteQuery, InferRouteResponse, RouteDefinition } from "@longzai-intelligence-transport/http-core";
1
+ import { ApiResponse, InferRouteBody, InferRouteParams, InferRouteQuery, InferRouteResponse, RouteDefinition, StreamResponseRoute } from "@longzai-intelligence-transport/http-core";
2
2
 
3
3
  //#region src/index.d.ts
4
4
  /**
@@ -152,7 +152,32 @@ type ValidatedRouteContext<TRoute extends RouteDefinition, TContext = unknown> =
152
152
  * @typeParam TContext - 自定义上下文类型
153
153
  * @param ctx - 请求上下文,包含已验证的参数数据
154
154
  */
155
- type RouteHandlerFn<TRoute extends RouteDefinition, TContext = unknown> = (ctx: BunRequestContext<TContext>) => Promise<ApiResponse<InferRouteResponse<TRoute>>> | ApiResponse<InferRouteResponse<TRoute>>;
155
+ /**
156
+ * 路由处理器返回值类型
157
+ *
158
+ * 流式路由返回 ReadableStream,JSON 路由返回 ApiResponse。
159
+ *
160
+ * @typeParam TRoute - 路由定义类型
161
+ */
162
+ type RouteHandlerResult<TRoute extends RouteDefinition> = TRoute extends StreamResponseRoute ? ReadableStream : ApiResponse<InferRouteResponse<TRoute>>;
163
+ /**
164
+ * 流式路由响应类型映射(Bun adapter:ReadableStream)
165
+ *
166
+ * 将 core 层 BinaryStreamMarker 映射为 Bun 的 ReadableStream。
167
+ *
168
+ * @typeParam TRoute - 路由定义类型
169
+ */
170
+ type InferStreamRouteResponse<TRoute extends RouteDefinition> = TRoute extends StreamResponseRoute ? ReadableStream : never;
171
+ /**
172
+ * 路由处理器函数类型
173
+ *
174
+ * 用户实现的具体业务逻辑处理函数
175
+ *
176
+ * @typeParam TRoute - 路由定义类型
177
+ * @typeParam TContext - 自定义上下文类型
178
+ * @param ctx - 请求上下文,包含已验证的参数数据
179
+ */
180
+ type RouteHandlerFn<TRoute extends RouteDefinition, TContext = unknown> = (ctx: BunRequestContext<TContext>) => Promise<RouteHandlerResult<TRoute>> | RouteHandlerResult<TRoute>;
156
181
  /**
157
182
  * 路径转正则表达式结果
158
183
  *
@@ -354,4 +379,4 @@ declare function createRouteMap<TRoutes extends Record<string, RouteDefinition>,
354
379
  */
355
380
  declare function createFetchHandler<TContext = unknown>(routeMap: Record<string, Record<string, BunRouteHandler<TContext>>>, options?: FetchHandlerOptions): FetchHandlerFn;
356
381
  //#endregion
357
- export { type BunRequestContext, type BunRouteHandler, type BunRouteHandlerOptions, type FetchHandlerFn, type FetchHandlerOptions, type PathToRegexResult, type RouteHandlerFn, type RouteMapEntry, type RoutesMap, type ValidatedRouteContext, type ValidationErrorData, type ValidationErrorDetail, createFetchHandler, createRouteHandler, createRouteMap, extractPathParams, extractQueryParams, parseRequestBody, pathToRegex };
382
+ export { type BunRequestContext, type BunRouteHandler, type BunRouteHandlerOptions, type FetchHandlerFn, type FetchHandlerOptions, type InferStreamRouteResponse, type PathToRegexResult, type RouteHandlerFn, type RouteHandlerResult, type RouteMapEntry, type RoutesMap, type ValidatedRouteContext, type ValidationErrorData, type ValidationErrorDetail, createFetchHandler, createRouteHandler, createRouteMap, extractPathParams, extractQueryParams, parseRequestBody, pathToRegex };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{createValidationErrorResponseFromError as e,validateRequest as t}from"@longzai-intelligence-transport/http-core";function n(e){let t=[],n=/:([^/]+)/g,r=n.exec(e);for(;r!==null;)r[1]&&t.push(r[1]),r=n.exec(e);return t}function r(e){let t=n(e),r=e.replace(/:([^/]+)/g,`(?<$1>[^/]+)`);return{regex:RegExp(`^${r}$`),paramNames:t}}function i(e,t){let{regex:n}=r(t),i=new URL(e).pathname,a=n.exec(i);return!a||!a.groups?{}:a.groups}function a(e){let t=new URL(e.url),n={};return t.searchParams.forEach((e,t)=>{let r=n[t];r===void 0?n[t]=e:typeof r==`string`?n[t]=[r,e]:r.push(e)}),n}async function o(e){let t=e.headers.get(`content-type`);if(t){if(t.includes(`application/json`))try{return await e.json()}catch{return}if(t.includes(`multipart/form-data`)){let t=await e.formData(),n={};return t.forEach((e,t)=>{n[t]=e}),n}if(t.includes(`application/x-www-form-urlencoded`)){let t=await e.formData(),n={};return t.forEach((e,t)=>{n[t]=e}),n}if(t.includes(`text/`))return await e.text()}}function s(e){let t=e instanceof Error?e.message:`服务器内部错误`;return new Response(JSON.stringify({success:!1,error:{code:`INTERNAL_ERROR`,message:t},message:t,timestamp:Date.now()}),{status:500,headers:{"Content-Type":`application/json`}})}async function c(e,t,n,r,i,a){let o={request:t,params:n,query:r,body:i};a?.createContext&&(o.context=await a.createContext(o));let s=await e(o);return new Response(JSON.stringify(s),{status:200,headers:{"Content-Type":`application/json`}})}function l(n,r,l){return async u=>{try{let d=t(n,{params:i(u.url,n.path),query:a(u),body:await o(u)});if(!d.success){if(!d.error)return s(Error(`验证失败但未提供错误详情`));if(l?.onValidationError)return await l.onValidationError(d.error,u);let t=e(d.error);return new Response(JSON.stringify(t),{status:400,headers:{"Content-Type":`application/json`}})}return await c(r,u,d.params??{},d.query??{},d.body,l)}catch(e){return l?.onError?l.onError(e,u):s(e)}}}function u(e,t,n){let r={};for(let[i,a]of Object.entries(e)){let e=t[i];if(e){let t=l(a,e,n),i=a.path;r[i]||(r[i]={}),r[i][a.method]=t}}return r}function d(e,t){return async n=>{let r=e[new URL(n.url).pathname];if(!r)return t?.onNotFound?t.onNotFound(n):new Response(JSON.stringify({success:!1,error:{code:`NOT_FOUND`,message:`资源不存在`},message:`资源不存在`,timestamp:Date.now()}),{status:404,headers:{"Content-Type":`application/json`}});let i=r[n.method];return i?i(n):t?.onMethodNotAllowed?t.onMethodNotAllowed(n):new Response(JSON.stringify({success:!1,error:{code:`METHOD_NOT_ALLOWED`,message:`方法不允许`},message:`方法不允许`,timestamp:Date.now()}),{status:405,headers:{"Content-Type":`application/json`}})}}export{d as createFetchHandler,l as createRouteHandler,u as createRouteMap,i as extractPathParams,a as extractQueryParams,o as parseRequestBody,r as pathToRegex};
1
+ import{createValidationErrorResponseFromError as e,validateRequest as t}from"@longzai-intelligence-transport/http-core";function n(e){let t=[],n=/:([^/]+)/g,r=n.exec(e);for(;r!==null;)r[1]&&t.push(r[1]),r=n.exec(e);return t}function r(e){let t=n(e),r=e.replace(/:([^/]+)/g,`(?<$1>[^/]+)`);return{regex:RegExp(`^${r}$`),paramNames:t}}function i(e,t){let{regex:n}=r(t),i=new URL(e).pathname,a=n.exec(i);return!a||!a.groups?{}:a.groups}function a(e){let t=new URL(e.url),n={};return t.searchParams.forEach((e,t)=>{let r=n[t];r===void 0?n[t]=e:typeof r==`string`?n[t]=[r,e]:r.push(e)}),n}async function o(e){let t=e.headers.get(`content-type`);if(t){if(t.includes(`application/json`))try{return await e.json()}catch{return}if(t.includes(`multipart/form-data`)){let t=await e.formData(),n={};return t.forEach((e,t)=>{n[t]=e}),n}if(t.includes(`application/x-www-form-urlencoded`)){let t=await e.formData(),n={};return t.forEach((e,t)=>{n[t]=e}),n}if(t.includes(`text/`))return await e.text()}}function s(e){let t=e instanceof Error?e.message:`服务器内部错误`;return new Response(JSON.stringify({success:!1,error:{code:`INTERNAL_ERROR`,message:t},message:t,timestamp:Date.now()}),{status:500,headers:{"Content-Type":`application/json`}})}async function c(e,t,n,r,i,a){let o={request:t,params:n,query:r,body:i};a?.createContext&&(o.context=await a.createContext(o));let s=await e(o);return s instanceof ReadableStream?new Response(s,{status:200,headers:{"Content-Type":`application/octet-stream`}}):new Response(JSON.stringify(s),{status:200,headers:{"Content-Type":`application/json`}})}function l(n,r,l){return async u=>{try{let d=t(n,{params:i(u.url,n.path),query:a(u),body:await o(u)});if(!d.success){if(!d.error)return s(Error(`验证失败但未提供错误详情`));if(l?.onValidationError)return await l.onValidationError(d.error,u);let t=e(d.error);return new Response(JSON.stringify(t),{status:400,headers:{"Content-Type":`application/json`}})}return await c(r,u,d.params??{},d.query??{},d.body,l)}catch(e){return l?.onError?l.onError(e,u):s(e)}}}function u(e,t,n){let r={};for(let[i,a]of Object.entries(e)){let e=t[i];if(e){let t=l(a,e,n),i=a.path;r[i]||(r[i]={}),r[i][a.method]=t}}return r}function d(e,t){return async n=>{let r=e[new URL(n.url).pathname];if(!r)return t?.onNotFound?t.onNotFound(n):new Response(JSON.stringify({success:!1,error:{code:`NOT_FOUND`,message:`资源不存在`},message:`资源不存在`,timestamp:Date.now()}),{status:404,headers:{"Content-Type":`application/json`}});let i=r[n.method];return i?i(n):t?.onMethodNotAllowed?t.onMethodNotAllowed(n):new Response(JSON.stringify({success:!1,error:{code:`METHOD_NOT_ALLOWED`,message:`方法不允许`},message:`方法不允许`,timestamp:Date.now()}),{status:405,headers:{"Content-Type":`application/json`}})}}export{d as createFetchHandler,l as createRouteHandler,u as createRouteMap,i as extractPathParams,a as extractQueryParams,o as parseRequestBody,r as pathToRegex};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-transport/http-adapter-bun",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "keywords": [
5
5
  "adapter",
6
6
  "bun",
@@ -38,7 +38,7 @@
38
38
  "clean": "rimraf dist out .cache"
39
39
  },
40
40
  "dependencies": {
41
- "@longzai-intelligence-transport/http-core": "0.1.0"
41
+ "@longzai-intelligence-transport/http-core": "0.1.1"
42
42
  },
43
43
  "devDependencies": {
44
44
  "zod": "^4.4.3"