UNPKG

@apeleghq/multipart-parser

Version:

TypeScript streaming parser for MIME multipart messages

4 lines (3 loc) 3.34 kB
"use strict";var E=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var G=(e,t)=>{for(var r in t)E(e,r,{get:t[r],enumerable:!0})},j=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of _(t))!k.call(e,o)&&o!==r&&E(e,o,{get:()=>t[o],enumerable:!(n=N(t,o))||n.enumerable});return e};var D=e=>j(E({},"__esModule",{value:!0}),e);var W={};G(W,{default:()=>b,parseMultipartMessage:()=>b});module.exports=D(W);var L=/^[0-9a-zA-Z'()+_,\-./:=? ]{0,69}[0-9a-zA-Z'()+_,\-./:=?]$/,P=/;\s*boundary=(?:"([0-9a-zA-Z'()+_,\-./:=? ]{0,69}[0-9a-zA-Z'()+_,\-./:=?])"|([0-9a-zA-Z'+_\-.]{0,69}[0-9a-zA-Z'+_\-.]))/;var z=e=>new ReadableStream({pull(r){if(ArrayBuffer.isView(e))r.enqueue(e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength));else if(e instanceof ArrayBuffer)r.enqueue(e);else throw new TypeError("Expected ArrayBuffer or an ArrayBuffer view.");r.close()}}),B=z;var Z=(e,t)=>{e:for(let r=0;r<=e.length-t.length;r++){for(let n=0;n<t.length;n++)if(e[r+n]!==t[n])continue e;return r}return-1},c=Z;var $=(e,...t)=>{let r=t.reduce((s,l)=>s+l.byteLength,e.length),n=new(Object(t[0])).constructor(r);n.set(e);let o=e.length;return t.forEach(s=>{n.set(s,o),o+=s.byteLength}),n},S=$;var O=new TextDecoder,H=new TextEncoder,g=H.encode(`\r `),C=[9,32],Y=(e,t)=>{let r=0,n=[];for(;(r=c(e,g))!==-1&&r!==0;){let s=e.indexOf(58);if(s===-1)throw new Error("Invalid header");let l=O.decode(e.subarray(0,s));for(;C.includes(e[r+2]);){let i=c(e.subarray(r+2),g);if(i<1)break;r+=2+i}let a=O.decode(e.subarray(s+1,r)).replace(/\r\n/g,"");n.push([l,a]),e=e.subarray(r+g.length)}return{headers:t?t(n):(()=>{let s=new Headers(n);return s.has("content-transfer-encoding")||s.set("content-transfer-encoding","7bit"),s.has("content-type")||s.set("content-type","text/plain; charset=us-ascii"),s})(),body:r===-1?null:e.subarray(r+g.length)}},R=Y;async function*U(e,t,r){var I;if(!L.test(t))throw new Error("Invalid boundary delimiter");let n=new TextEncoder,o=[9,32],s=new Uint8Array([13,10]),l=n.encode(`\r --${t}`),a=new Uint8Array,i=0,w=!1,M=e.getReader();try{for(;i!==3;){let{done:A,value:u}=await M.read();if(A){if(a.length===0||w)throw new Error("Invalid message");w=!0}else a=S(a,ArrayBuffer.isView(u)?new Uint8Array(u.buffer,u.byteOffset,u.byteLength):new Uint8Array(u));for(;a.length>0;){let y=NaN;if(i===0&&(y=c(a,l.slice(2))-2,y===-3)||(y!==-2&&(y=c(a,l)),y===-1))break;let d=y+l.length,p=A?0:c(a.subarray(d,d+32),s);if(p===-1&&a.length-d<32)break;if(p===-1||!Array.from(a.subarray(d+Math.min(2,p),d+p)).every(T=>o.includes(T)))throw new Error(`Invalid boundary at index ${y}`);if(A||p>=2){if([1,2].includes(i)&&a[d+0]===a[d+1]&&a[d+0]===45)i=3;else if(!o.includes(a[d+0])||!o.includes(a[d+1]))throw new Error(`Invalid boundary at index ${y} (${t}): ${(I=a[d+1])==null?void 0:I.toString(16)}`)}switch(i){case 0:i=1;break;case 1:i=2;case 2:case 3:if(a.subarray(y,d).length>0){let T=a.subarray(0,y),f=R(T,r),h=f.headers.get("content-type"),x;if(f.body&&(h!=null&&h.startsWith("multipart/"))){let m=h.match(P);if(m){let v=m[1]||m[2];x=U(B(f.body),v)}else x=null}yield{headers:f.headers,body:f.body,...x!==void 0&&{parts:x}}}break}if(i===3){a=a.subarray(a.length);break}a=a.subarray(p+d+2)}}}finally{M.releaseLock()}}var b=U;0&&(module.exports={parseMultipartMessage});