UNPKG

eve

Version:

Filesystem-first framework for durable backend AI agents that run anywhere.

1 lines 1.79 kB
import{Readable}from"node:stream";import{toErrorMessage}from"#shared/errors.js";function createPublicRequest(e,t){let n=e.headers.host??`localhost`,r=new URL(e.url??`/`,`http://${n}`),i=new Headers;for(let[t,n]of Object.entries(e.headers))if(Array.isArray(n))for(let e of n)i.append(t,e);else n!==void 0&&i.set(t,n);let a=e.method!==`GET`&&e.method!==`HEAD`;return new Request(r,{body:a?Readable.toWeb(e):void 0,duplex:a?`half`:void 0,headers:i,method:e.method,signal:t})}async function writeResponse(e,t,n){if(e.destroyed){await t.body?.cancel();return}e.statusCode=t.status,e.statusMessage=t.statusText;let r=t.headers.getSetCookie?.call(t.headers)??[];if(t.headers.forEach((t,n)=>{n.toLowerCase()!==`set-cookie`&&e.setHeader(n,t)}),r.length>0&&e.setHeader(`set-cookie`,[...r]),t.body===null){await endResponse(e);return}e.flushHeaders();let i=Readable.fromWeb(t.body),cancelBody=()=>i.destroy(n.reason);n.addEventListener(`abort`,cancelBody,{once:!0});try{await new Promise((t,n)=>{i.once(`error`,n),e.once(`error`,n),e.once(`close`,()=>{e.writableEnded||n(Error(`Development client disconnected.`))}),e.once(`finish`,t),i.pipe(e)})}finally{n.removeEventListener(`abort`,cancelBody),!i.destroyed&&(n.aborted||e.destroyed)&&i.destroy()}}function writeRequestError(e,t){if(e.headersSent){e.destroy();return}e.statusCode=503,e.setHeader(`content-type`,`application/json; charset=utf-8`),!e.writableEnded&&!e.destroyed&&e.end(JSON.stringify({error:toErrorMessage(t)}))}function closeServer(e){if(!e.listening)return Promise.resolve();let t=new Promise((t,n)=>{e.close(e=>{e===void 0?t():n(e)})});return e.closeIdleConnections?.(),t}async function endResponse(e){await new Promise((t,n)=>{e.once(`error`,n),e.end(t)})}export{closeServer,createPublicRequest,writeRequestError,writeResponse};