bhttp-js
Version:
A BHTTP (Binary Representation of HTTP Messages) Encoder and Decoder
2 lines (1 loc) • 9.51 kB
JavaScript
var l=class extends Error{},d=class extends l{},h=class extends l{};var u=class{status;headers;constructor(e){this.status=e,this.headers=new Headers}},p=class{buf;p=0;framingIndicator=0;headers;content;trailers;constructor(e){this.buf=e,this.headers=new Headers,this.content=new Uint8Array(0),this.trailers=new Headers}},L=class extends p{method="";scheme="";authority="";path="";constructor(e){super(e)}createRequest(){let e=this.scheme+"://"+this.authority+this.path,s;return this.method==="GET"||this.method==="HEAD"?s=new Request(e,{method:this.method}):s=new Request(e,{method:this.method,body:this.content}),this.headers.forEach((n,t)=>{s.headers.set(t,n)}),s}},c=class extends p{status=0;informationalResponses;constructor(e){super(e),this.informationalResponses=new Array(0)}createResponse(){return new Response(this.content,{status:this.status,headers:this.headers})}},g=class{_td;constructor(){this._td=new TextDecoder}decodeRequest(e){e instanceof ArrayBuffer&&(e=new Uint8Array(e));let s=new L(e);switch(s.framingIndicator=this.decodeVli(s),s.framingIndicator){case 0:return this.decodeKnownLengthRequest(s);case 2:return this.decodeIndeterminateLengthRequest(s);default:throw new d("Invalid framing indicator.")}}decodeResponse(e){e instanceof ArrayBuffer&&(e=new Uint8Array(e));let s=new c(e);switch(s.framingIndicator=this.decodeVli(s),s.framingIndicator){case 1:return this.decodeKnownLengthResponse(s);case 3:return this.decodeIndeterminateLengthResponse(s);default:throw new d("Invalid framing indicator.")}}decodeKnownLengthRequest(e){return this.decodeRequestControlData(e),this.decodeKnownLengthRequestHeaders(e),this.decodeKnownLengthContent(e),this.decodeKnownLengthTrailers(e),this.checkPadding(e),e.createRequest()}decodeIndeterminateLengthRequest(e){return this.decodeRequestControlData(e),this.decodeIndeterminateLengthRequestHeaders(e),this.decodeIndeterminateLengthContent(e),this.decodeIndeterminateLengthTrailers(e),this.checkPadding(e),e.createRequest()}decodeKnownLengthResponse(e){return this.decodeKnownLengthInformationalResponsesAndHeaders(e),this.decodeKnownLengthContent(e),this.decodeKnownLengthTrailers(e),this.checkPadding(e),e.createResponse()}decodeIndeterminateLengthResponse(e){return this.decodeIndeterminateLengthInformationalResponsesAndHeaders(e),this.decodeIndeterminateLengthContent(e),this.decodeIndeterminateLengthTrailers(e),this.checkPadding(e),e.createResponse()}decodeRequestControlData(e){e.method=this.decodeVliAndValue(e),e.scheme=this.decodeVliAndValue(e),e.authority=this.decodeVliAndValue(e),e.path=this.decodeVliAndValue(e)}decodeKnownLengthInformationalResponsesAndHeaders(e){let s=this.decodeVli(e);for(;s>=100&&s<200;)this.decodeKnownLengthInformationalResponse(e,s),s=this.decodeVli(e);if(s<100&&s>=600)throw new d("Invalid status code.");e.status=s,this.decodeKnownLengthResponseHeaders(e)}decodeIndeterminateLengthInformationalResponsesAndHeaders(e){let s=this.decodeVli(e);for(;s>=100&&s<200;)this.decodeIndeterminateLengthInformationalResponse(e,s),s=this.decodeVli(e);if(s<100&&s>=600)throw new d("Invalid status code.");e.status=s,this.decodeIndeterminateLengthResponseHeaders(e)}decodeKnownLengthInformationalResponse(e,s){let n=new u(s),t=this.decodeVli(e),r="",a="",E=e.p;for(;e.p<E+t;)r=this.decodeVliAndValue(e),a=this.decodeVliAndValue(e),n.headers.set(r,a);e.informationalResponses.push(n)}decodeIndeterminateLengthInformationalResponse(e,s){let n=new u(s),t="",r="",a=this.decodeVli(e);for(;a!==0;)e.p--,t=this.decodeVliAndValue(e),r=this.decodeVliAndValue(e),n.headers.set(t,r),a=this.decodeVli(e);e.informationalResponses.push(n)}decodeKnownLengthRequestHeaders(e){let s="",n="",t=this.decodeVli(e),r=e.p;for(;e.p<r+t;)s=this.decodeVliAndValue(e),n=this.decodeVliAndValue(e),s.localeCompare("host",void 0,{sensitivity:"accent"})===0&&e.authority===""&&(e.authority=n),e.headers.set(s,n)}decodeKnownLengthResponseHeaders(e){let s="",n="",t=e.p,r=this.decodeVli(e);for(;e.p<t+r;)s=this.decodeVliAndValue(e),n=this.decodeVliAndValue(e),e.headers.set(s,n)}decodeIndeterminateLengthRequestHeaders(e){let s="",n="",t=this.decodeVli(e);for(;t!==0;)e.p--,s=this.decodeVliAndValue(e),n=this.decodeVliAndValue(e),s.localeCompare("host",void 0,{sensitivity:"accent"})===0&&e.authority===""&&(e.authority=n),e.headers.set(s,n),t=this.decodeVli(e)}decodeIndeterminateLengthResponseHeaders(e){let s="",n="",t=this.decodeVli(e);for(;t!==0;)e.p--,s=this.decodeVliAndValue(e),n=this.decodeVliAndValue(e),e.headers.set(s,n),t=this.decodeVli(e)}decodeKnownLengthContent(e){let s=this.decodeVli(e);e.content=e.buf.slice(e.p,e.p+s),e.p+=s}decodeIndeterminateLengthContent(e){let s=0,n=e.p,t=this.decodeVli(e);for(;t!==0;)s+=t,e.p+=t,t=this.decodeVli(e);if(s!==0)for(e.p=n,e.content=new Uint8Array(s),s=0,t=this.decodeVli(e);t!==0;)e.content.set(e.buf.slice(e.p,e.p+t),s),s+=t,e.p+=t,t=this.decodeVli(e)}decodeKnownLengthTrailers(e){let s=this.decodeVli(e),n="",t="",r=e.p;for(;e.p<r+s;)n=this.decodeVliAndValue(e),t=this.decodeVliAndValue(e),e.trailers.set(n,t)}decodeIndeterminateLengthTrailers(e){let s="",n="",t=this.decodeVli(e);for(;t!=0;)e.p--,s=this.decodeVliAndValue(e),n=this.decodeVliAndValue(e),e.trailers.set(s,n),t=this.decodeVli(e)}checkPadding(e){for(;e.p<e.buf.byteLength;)if(e.buf[e.p++]!==0)throw new d("Invalid padding data.")}decodeVliAndValue(e){let s=this.decodeVli(e),n=this._td.decode(e.buf.slice(e.p,e.p+s));return e.p+=s,n}decodeVli(e){let s=0;switch(e.buf[e.p]&192){case 0:return e.buf[e.p++]&63;case 64:return s=(e.buf[e.p++]&63)<<8,s+=e.buf[e.p++],s;case 128:return s=(e.buf[e.p++]&63)<<24,s+=e.buf[e.p++]<<16,s+=e.buf[e.p++]<<8,s+=e.buf[e.p++],s;default:if(s=0,e.buf[++e.p]>15)throw new h("Over MAX_SAFE_INTEGER-length value is not supported.");return s+=e.buf[e.p++]<<48,s+=e.buf[e.p++]<<40,s+=e.buf[e.p++]<<32,s+=e.buf[e.p++]<<24,s+=e.buf[e.p++]<<16,s+=e.buf[e.p++]<<8,s+=e.buf[e.p++],s}}};var V=class{buf;p=0;framingIndicator=0;headerSize;body;constructor(){this.buf=new Uint8Array(0),this.headerSize=0,this.body=new Uint8Array(0)}calculateVliSize(e){if(e<64)return 1;if(e<16384)return 2;if(e<1073741824)return 4;if(e<=Number.MAX_SAFE_INTEGER)return 8;throw new h("Over MAX_SAFE_INTEGER length value is not supported.")}},b=class extends V{request;url;constructor(e){super(),this.request=e,this.url=new URL(e.url)}async setup(){this.body=new Uint8Array(await this.request.arrayBuffer()),this.buf=new Uint8Array(this.calculateEncodedRequestSize())}calculateEncodedRequestSize(){let e=1;return e+=1,e+=this.request.method.length,e+=this.calculateVliSize(this.url.protocol.length-1),e+=this.url.protocol.length-1,e+=this.calculateVliSize(this.url.host.length),e+=this.url.host.length,e+=this.calculateVliSize(this.url.pathname.length+this.url.search.length),e+=this.url.pathname.length,e+=this.url.search.length,this.headerSize=0,this.request.headers.forEach((s,n)=>{this.headerSize+=this.calculateVliSize(n.length),this.headerSize+=n.length,this.headerSize+=this.calculateVliSize(s.length),this.headerSize+=s.length}),e+=this.calculateVliSize(this.headerSize),e+=this.headerSize,e+=this.calculateVliSize(this.body.byteLength),e+=this.body.byteLength,e+=1,e}},I=class extends V{response;constructor(e){super(),this.response=e}async setup(){this.body=new Uint8Array(await this.response.arrayBuffer()),this.buf=new Uint8Array(this.calculateEncodedResponseSize())}calculateEncodedResponseSize(){let e=1;return e+=2,this.headerSize=0,this.response.headers.forEach((s,n)=>{this.headerSize+=this.calculateVliSize(n.length),this.headerSize+=n.length,this.headerSize+=this.calculateVliSize(s.length),this.headerSize+=s.length}),e+=this.calculateVliSize(this.headerSize),e+=this.headerSize,e+=this.calculateVliSize(this.body.byteLength),e+=this.body.byteLength,e+=1,e}},_=class{_te;constructor(){this._te=new TextEncoder}async encodeRequest(e){let s=new b(e);return await s.setup(),this.encodeKnownLengthRequest(s)}async encodeResponse(e){let s=new I(e);return await s.setup(),this.encodeKnownLengthResponse(s)}encodeKnownLengthRequest(e){return this.encodeVli(e,0),this.encodeVliAndValue(e,e.request.method),this.encodeVliAndValue(e,e.url.protocol.slice(0,e.url.protocol.length-1)),this.encodeVliAndValue(e,e.url.host),this.encodeVliAndValue(e,e.url.pathname+e.url.search),this.encodeVli(e,e.headerSize),e.request.headers.forEach((s,n)=>{this.encodeVliAndValue(e,n),this.encodeVliAndValue(e,s)}),this.encodeVli(e,e.body.byteLength),e.buf.set(e.body,e.p),e.p+=e.body.byteLength,this.encodeVli(e,0),e.buf}encodeKnownLengthResponse(e){return this.encodeVli(e,1),this.encodeVli(e,e.response.status),this.encodeVli(e,e.headerSize),e.response.headers.forEach((s,n)=>{this.encodeVliAndValue(e,n),this.encodeVliAndValue(e,s)}),this.encodeVli(e,e.body.byteLength),e.buf.set(e.body,e.p),e.p+=e.body.byteLength,this.encodeVli(e,0),e.buf}encodeVliAndValue(e,s){this.encodeVli(e,s.length),e.buf.set(this._te.encode(s),e.p),e.p+=s.length}encodeVli(e,s){if(s<64){e.buf[e.p++]=0+s;return}if(s<16384){e.buf[e.p++]=64+(s>>8),e.buf[e.p++]=255&s;return}if(s<1073741824){e.buf[e.p++]=128+(s>>24),e.buf[e.p++]=255&s>>16,e.buf[e.p++]=255&s>>8,e.buf[e.p++]=255&s;return}if(s<=Number.MAX_SAFE_INTEGER){e.buf[e.p++]=192,e.buf[e.p++]=255&s>>48,e.buf[e.p++]=255&s>>40,e.buf[e.p++]=255&s>>32,e.buf[e.p++]=255&s>>24,e.buf[e.p++]=255&s>>16,e.buf[e.p++]=255&s>>8,e.buf[e.p++]=255&s;return}throw new h("Over MAX_SAFE_INTEGER-length value is not supported.")}};export{g as BHttpDecoder,_ as BHttpEncoder,d as InvalidMessageError,h as NotSupportedError};