UNPKG

fastify-uws

Version:

A performant HTTP and WebSocket server for Fastify with uWebSockets.

2 lines (1 loc) 3.15 kB
"use strict";var l=Object.defineProperty;var f=(n,r,e)=>r in n?l(n,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[r]=e;var s=(n,r,e)=>f(n,typeof r!="symbol"?r+"":r,e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const k=require("node:http"),b=require("streamx"),o=require("./errors.cjs"),h=require("./symbols.cjs");class y{constructor(r,e){s(this,"isMultiValue");s(this,"name");s(this,"value");this.isMultiValue=Array.isArray(e),this.name=r,this.value=this.isMultiValue?e:String(e)}}const w=Buffer.alloc(0);class u{constructor(r,e=!1){s(this,"chunk");s(this,"end");s(this,"byteLength");this.chunk=r||w,this.empty=!r,this.end=e,this.byteLength=this.empty?1:Buffer.byteLength(this.chunk)}}function E(){this.emit("aborted")}const g=()=>{},H={byteLength(n){return n.byteLength}};var a,c;class S extends(c=b.Writable,a=h.kHeaders,c){constructor(e){super(H);s(this,"socket");s(this,"statusCode");s(this,"statusMessage");s(this,"headersSent");s(this,"chunked");s(this,"contentLength");s(this,"writableEnded");s(this,"firstChunk");s(this,a);this.socket=e,this.statusCode=200,this.headersSent=!1,this.chunked=!1,this.contentLength=null,this.writableEnded=!1,this.firstChunk=!0,this[h.kHeaders]=new Map;const t=this.destroy.bind(this);this.once("error",g),e.once("error",t),e.once("close",t),e.once("aborted",E.bind(this))}get aborted(){return this.socket.aborted}get finished(){return this.socket.writableEnded&&!this.socket.aborted}get status(){return`${this.statusCode} ${this.statusMessage||k.STATUS_CODES[this.statusCode]}`}get bytesWritten(){return this.socket.bytesWritten}hasHeader(e){return this[h.kHeaders].has(e.toLowerCase())}getHeader(e){var t;return(t=this[h.kHeaders].get(e.toLowerCase()))==null?void 0:t.value}getHeaders(){const e={};return this[h.kHeaders].forEach((t,i)=>{e[i]=t.value}),e}setHeader(e,t){if(this.headersSent)throw new o.ERR_HEAD_SET;const i=e.toLowerCase();if(i==="content-length"){this.contentLength=Number(t);return}if(i==="transfer-encoding"){this.chunked=t.includes("chunked");return}this[h.kHeaders].set(i,new y(e,t))}removeHeader(e){if(this.headersSent)throw new o.ERR_HEAD_SET;this[h.kHeaders].delete(e.toLowerCase())}writeHead(e,t,i){if(this.headersSent)throw new o.ERR_HEAD_SET;if(this.statusCode=e,typeof t=="object"?i=t:t&&(this.statusMessage=t),i)for(const d of Object.keys(i))this.setHeader(d,i[d])}end(e){if(!this.aborted){if(this.destroyed)throw new o.ERR_STREAM_DESTROYED;return this.writableEnded=!0,super.end(new u(e,!0))}}destroy(e){this.destroyed||this.destroying||this.aborted||this.socket.destroy(e)}write(e){if(!this.aborted){if(this.destroyed)throw new o.ERR_STREAM_DESTROYED;return e=new u(e),this.firstChunk&&this.contentLength!==null&&this.contentLength===e.byteLength?(e.end=!0,this.writableEnded=!0,super.end(e),!0):(this.firstChunk=!1,super.write(e))}}_write(e,t){if(this.aborted)return t();if(this.headersSent||(this.headersSent=!0,this.socket[h.kHead]={headers:this[h.kHeaders],status:this.status}),e.end){this.socket.end(e,null,t);return}this.socket.write(e,null,t)}_destroy(e){if(this.socket.destroyed)return e();this.socket.once("close",e)}}exports.Response=S;