fastify-uws
Version:
A performant HTTP and WebSocket server for Fastify with uWebSockets.
2 lines (1 loc) • 2.8 kB
JavaScript
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("node:http"),u=require("streamx"),n=require("./errors.cjs"),r=require("./symbols.cjs");class a{isMultiValue;name;value;constructor(e,t){this.isMultiValue=Array.isArray(t),this.name=e,this.value=this.isMultiValue?t:String(t)}}const c=Buffer.alloc(0);class o{chunk;end;byteLength;constructor(e,t=!1){this.chunk=e||c,this.empty=!e,this.end=t,this.byteLength=this.empty?1:Buffer.byteLength(this.chunk)}}function l(){this.emit("aborted")}const f=()=>{},k={byteLength(i){return i.byteLength}};class b extends u.Writable{socket;statusCode;statusMessage;headersSent;chunked;contentLength;writableEnded;firstChunk;[r.kHeaders];constructor(e){super(k),this.socket=e,this.statusCode=200,this.headersSent=!1,this.chunked=!1,this.contentLength=null,this.writableEnded=!1,this.firstChunk=!0,this[r.kHeaders]=new Map;const t=this.destroy.bind(this);this.once("error",f),e.once("error",t),e.once("close",t),e.once("aborted",l.bind(this))}get aborted(){return this.socket.aborted}get finished(){return this.socket.writableEnded&&!this.socket.aborted}get status(){return`${this.statusCode} ${this.statusMessage||d.STATUS_CODES[this.statusCode]}`}get bytesWritten(){return this.socket.bytesWritten}hasHeader(e){return this[r.kHeaders].has(e.toLowerCase())}getHeader(e){return this[r.kHeaders].get(e.toLowerCase())?.value}getHeaders(){const e={};return this[r.kHeaders].forEach((t,s)=>{e[s]=t.value}),e}setHeader(e,t){if(this.headersSent)throw new n.ERR_HEAD_SET;const s=e.toLowerCase();if(s==="content-length"){this.contentLength=Number(t);return}if(s==="transfer-encoding"){this.chunked=t.includes("chunked");return}this[r.kHeaders].set(s,new a(e,t))}removeHeader(e){if(this.headersSent)throw new n.ERR_HEAD_SET;this[r.kHeaders].delete(e.toLowerCase())}writeHead(e,t,s){if(this.headersSent)throw new n.ERR_HEAD_SET;if(this.statusCode=e,typeof t=="object"?s=t:t&&(this.statusMessage=t),s)for(const h of Object.keys(s))this.setHeader(h,s[h])}end(e){if(!this.aborted){if(this.destroyed)throw new n.ERR_STREAM_DESTROYED;return this.writableEnded=!0,super.end(new o(e,!0))}}destroy(e){this.destroyed||this.destroying||this.aborted||this.socket.destroy(e)}write(e){if(!this.aborted){if(this.destroyed)throw new n.ERR_STREAM_DESTROYED;return e=new o(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[r.kHead]={headers:this[r.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=b;