UNPKG

@apeleghq/multipart-parser

Version:

TypeScript streaming parser for MIME multipart messages

5 lines (4 loc) 3.04 kB
"use strict";var b=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var S=(r,a)=>{for(var e in a)b(r,e,{get:a[e],enumerable:!0})},$=(r,a,e,d)=>{if(a&&typeof a=="object"||typeof a=="function")for(let i of E(a))!R.call(r,i)&&i!==e&&b(r,i,{get:()=>a[i],enumerable:!(d=w(a,i))||d.enumerable});return r};var I=r=>$(b({},"__esModule",{value:!0}),r);var z={};S(z,{default:()=>m,encodeMultipartMessage:()=>m});module.exports=I(z);var h=/;\s*boundary=(?:"([0-9a-zA-Z'()+_,\-./:=? ]{0,69}[0-9a-zA-Z'()+_,\-./:=?])"|([0-9a-zA-Z'+_\-.]{0,69}[0-9a-zA-Z'+_\-.]))/;var q=r=>new ReadableStream({pull(e){if(ArrayBuffer.isView(r))e.enqueue(r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength));else if(r instanceof ArrayBuffer)e.enqueue(r);else throw new TypeError("Expected ArrayBuffer or an ArrayBuffer view.");e.close()}}),y=q;var A=/;\s*boundary=(?:"([^"]+)"|([^;",]+))/,g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_-.",x=()=>{let r=new Uint8Array(24);return globalThis.crypto.getRandomValues(r),Array.from(r).map(a=>g[a%g.length]).join("")},u={preventClose:!0};async function*B(r,a,e){let d=new TextEncoder,i=d.encode(`\r --${r}`);if(Array.isArray(a)&&a.length<1){await e.abort(Error("At least one part is required"));return}let l=0;for await(let t of a){l++;let o,n;if(!t.body&&t.parts)if(n=t.headers.get("content-type"),!n)o=x(),n=`multipart/mixed; boundary="${o}"`;else if(!n.startsWith("multipart/")||!A.test(n)){await e.abort(Error("Invalid multipart content type: "+n));return}else{let s=n.match(h);(!s||!(o=s[1]||s[2]))&&(o=x(),n=n.replace(A,`; boundary="${o}"`))}await y(i).pipeTo(e,u),yield;{let s=[""];if(n){let p=!1;t.headers.forEach((f,c)=>{c!=="content-type"?s.push(`${c}: ${f}`):(p=!0,s.push(`${c}: ${n}`))}),p||s.push(`content-type: ${n}`)}else t.headers.forEach((p,f)=>{s.push(`${f}: ${p}`)});t.parts||!t.body?s.push(""):s.push("","");let M=d.encode(s.join(`\r `));s.length=0,await y(M).pipeTo(e,u),yield}if(t.body){if(t.body instanceof ArrayBuffer||ArrayBuffer.isView(t.body))await y(t.body).pipeTo(e,u);else if(t.body instanceof Blob)await t.body.stream().pipeTo(e,u);else if(t.body instanceof ReadableStream)await t.body.pipeTo(e,u);else{await e.abort(Error("Invalid body type"));return}yield}else if(t.parts){if(!o){await e.abort(Error("Runtime exception: undefined part boundary"));return}yield*B(o,t.parts,e),yield}}if(!l){await e.abort(Error("At least one part is required"));return}let T=d.encode(`\r --${r}--`);await y(T).pipeTo(e,u)}var v=(r,a)=>{let e=new TransformStream,d=B(r,a,e.writable),i=!1,l=e.readable.getReader();return new ReadableStream({start(t){(async()=>{for(;;)try{let o=await l.read();if(o.done){let n=new Uint8Array([13,10]);t.enqueue(n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength)),t.close();return}t.enqueue(o.value)}catch(o){t.error(o);return}})().catch(()=>{})},async pull(){if(i)return;(await d.next()).done&&(i=!0,await e.writable.close())}})},m=v;0&&(module.exports={encodeMultipartMessage});