{"_id":"mixpart","_rev":"18-22c7f3a64df4137bfae7069cc4bfd64d","name":"mixpart","dist-tags":{"alpha":"0.0.5-alpha.1","latest":"0.0.6"},"versions":{"0.0.1":{"name":"mixpart","version":"0.0.1","keywords":["multipart","mixed","parser","streaming","node","typescript","performance"],"author":{"name":"Timer","email":"timer@vercel.com"},"license":"MIT","_id":"mixpart@0.0.1","maintainers":[{"name":"timer","email":"timer150@gmail.com"}],"dist":{"shasum":"12975a6975257a50e55ab8ef37e13c7051a83d3e","tarball":"https://registry.npmjs.org/mixpart/-/mixpart-0.0.1.tgz","fileCount":8,"integrity":"sha512-uZRpQxxYwnuIGIAqqt+/wOkhEKkj/jGhBXyobQ1PXxxWnGUiDccfXyiUp7a9EZKxvEr6rfHaibrGRLzQDosIZA==","signatures":[{"sig":"MEUCIQCzb6eg/E7PJWG36rLYaQ6UOI7/mvH9qP093Tdz1XjfwQIgIKPB62CDt7HYZnJeUGRhCxth8PVFz/oHZcGhwS11W/Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73237},"main":"dist/index.js","_from":"file:mixpart-0.0.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"timer","email":"timer150@gmail.com"},"_resolved":"/private/var/folders/v6/6p_6_dv52477_svxpzcbzsnr0000gn/T/942b18a4bd9253bf87b0bae7669361de/mixpart-0.0.1.tgz","_integrity":"sha512-uZRpQxxYwnuIGIAqqt+/wOkhEKkj/jGhBXyobQ1PXxxWnGUiDccfXyiUp7a9EZKxvEr6rfHaibrGRLzQDosIZA==","_npmVersion":"10.9.2","description":"High-performance streaming multipart/mixed parser for Node.js","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.1.4","@vitest/ui":"^3.1.4","typescript":"^5.0.0","@types/node":"^22.15.24","@vitest/coverage-v8":"3.1.4"},"_npmOperationalInternal":{"tmp":"tmp/mixpart_0.0.1_1748549390068_0.4842371541683317","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"mixpart","version":"0.0.2","keywords":["multipart","mixed","parser","streaming","node","typescript","performance"],"author":{"name":"Timer","email":"timer@vercel.com"},"license":"MIT","_id":"mixpart@0.0.2","maintainers":[{"name":"timer","email":"timer150@gmail.com"}],"dist":{"shasum":"c4131364711d190d8d5d86e0bfd198ac542e55b1","tarball":"https://registry.npmjs.org/mixpart/-/mixpart-0.0.2.tgz","fileCount":8,"integrity":"sha512-zlj/5noaupEY6wO2kPwiijB1Ggt8TQI6IsG3H7+9wHXdk2v2+Qi67CQLi8oGvD6kUPhO9Oa3luafwmAYU2ebmQ==","signatures":[{"sig":"MEYCIQCSe8ijgU9s0WTf0BsEs1OcUlxdWBMEUfijGdUc8SbDCAIhAOJpYXd0AVwVDvuy6ErvRc7abfzteJ6LeIZritywV9vb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76565},"main":"dist/index.js","_from":"file:mixpart-0.0.2.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"timer","email":"timer150@gmail.com"},"_resolved":"/private/var/folders/v6/6p_6_dv52477_svxpzcbzsnr0000gn/T/0a470874ca4efc4b6078b09e19f084a8/mixpart-0.0.2.tgz","_integrity":"sha512-zlj/5noaupEY6wO2kPwiijB1Ggt8TQI6IsG3H7+9wHXdk2v2+Qi67CQLi8oGvD6kUPhO9Oa3luafwmAYU2ebmQ==","_npmVersion":"10.9.2","description":"High-performance streaming multipart/mixed parser for Node.js","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.1.4","@vitest/ui":"^3.1.4","typescript":"^5.0.0","@types/node":"^22.15.24","@vitest/coverage-v8":"3.1.4"},"_npmOperationalInternal":{"tmp":"tmp/mixpart_0.0.2_1748663412970_0.1720514545178804","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"mixpart","version":"0.0.3","keywords":["multipart","mixed","parser","streaming","node","typescript","performance"],"author":{"name":"Timer","email":"timer@vercel.com"},"license":"MIT","_id":"mixpart@0.0.3","maintainers":[{"name":"timer","email":"timer150@gmail.com"}],"dist":{"shasum":"9811efec3e0272f44400c9d288347e778e626cac","tarball":"https://registry.npmjs.org/mixpart/-/mixpart-0.0.3.tgz","fileCount":8,"integrity":"sha512-udgWmJXkwH5a/QeagGU56sI7jiEymSJCW9oVJgI6I04w+hdA6HEL8gXAOTcoS6ViTKgOpcU0RTk75GY/Vgbh8Q==","signatures":[{"sig":"MEYCIQDzFFNZBJ1Of1DSDWlM8layN6D7er+Lx/xp9CZsGViLvAIhAOWZoEfloat51Bh4UbcAXN0XvRKNTAev37eyBjwMNA3Y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84985},"main":"dist/index.js","_from":"file:mixpart-0.0.3.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"timer","email":"timer150@gmail.com"},"_resolved":"/private/var/folders/v6/6p_6_dv52477_svxpzcbzsnr0000gn/T/34d9a7d209c8c06786845f4c9cd70c80/mixpart-0.0.3.tgz","_integrity":"sha512-udgWmJXkwH5a/QeagGU56sI7jiEymSJCW9oVJgI6I04w+hdA6HEL8gXAOTcoS6ViTKgOpcU0RTk75GY/Vgbh8Q==","_npmVersion":"10.9.2","description":"High-performance streaming multipart/mixed parser for Node.js","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.1.4","@vitest/ui":"^3.1.4","typescript":"^5.0.0","@types/node":"^22.15.24","@vitest/coverage-v8":"3.1.4"},"_npmOperationalInternal":{"tmp":"tmp/mixpart_0.0.3_1748893720984_0.9367317960137986","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"mixpart","version":"0.0.4","keywords":["multipart","mixed","parser","streaming","node","typescript","performance"],"author":{"name":"Timer","email":"timer@vercel.com"},"license":"MIT","_id":"mixpart@0.0.4","maintainers":[{"name":"timer","email":"timer150@gmail.com"}],"dist":{"shasum":"55d1b35b701d233f9d2fa6e326611ad9cd7c2611","tarball":"https://registry.npmjs.org/mixpart/-/mixpart-0.0.4.tgz","fileCount":8,"integrity":"sha512-RAoaOSXnMLrfUfmFbNynRYjeMru/bhgAYRy/GQVI8gmRq7vm9V9c2gGVYnYoQ008X6YTmRIu5b0397U7vb0bIA==","signatures":[{"sig":"MEUCIQDqJbT3dD1/54vahHm5d9LPc66/OHwGubVoDDIOmVtEyAIgJbbQXrfLxMJomnp6OhhT0lK2d1eblcLBPY7U6hATrfU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104077},"main":"dist/index.js","_from":"file:mixpart-0.0.4.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","clean":"rm -rf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"timer","email":"timer150@gmail.com"},"_resolved":"/private/var/folders/v6/6p_6_dv52477_svxpzcbzsnr0000gn/T/03f2897c2c532661c61a526e2b9534aa/mixpart-0.0.4.tgz","_integrity":"sha512-RAoaOSXnMLrfUfmFbNynRYjeMru/bhgAYRy/GQVI8gmRq7vm9V9c2gGVYnYoQ008X6YTmRIu5b0397U7vb0bIA==","_npmVersion":"10.9.2","description":"High-performance streaming multipart/mixed parser for Node.js","directories":{},"_nodeVersion":"22.13.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.1.4","@vitest/ui":"^3.1.4","typescript":"^5.0.0","@types/node":"^22.15.24","@vitest/coverage-v8":"3.1.4"},"_npmOperationalInternal":{"tmp":"tmp/mixpart_0.0.4_1748919353181_0.7236777668208385","host":"s3://npm-registry-packages-npm-production"}},"0.0.5-alpha.0":{"name":"mixpart","version":"0.0.5-alpha.0","keywords":["multipart","mixed","parser","streaming","node","typescript","performance"],"author":{"name":"Timer","email":"timer@vercel.com"},"license":"MIT","_id":"mixpart@0.0.5-alpha.0","maintainers":[{"name":"timer","email":"timer150@gmail.com"},{"name":"vercel-release-bot","email":"infra+release@vercel.com"}],"dist":{"shasum":"cdc9a0283ce4f8cf9d22644d429f9c3c61124a73","tarball":"https://registry.npmjs.org/mixpart/-/mixpart-0.0.5-alpha.0.tgz","fileCount":8,"integrity":"sha512-XS3bfxqdHsxqLoK0DnkGiM++KZGhXFj8KrzfNND/4d0DDBkbVdmlEajIAOQ+2+tHVw2zFI1ng8SnJSOfVZg0HA==","signatures":[{"sig":"MEUCIQDhQL63AOifLCRApsUN40RQNE3jaWoHX1yWjMZ7BmR44gIgeD+Pt6UqA+JET4BAVSErylZpzYUioOFsbfrWYNtopO4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104166},"main":"dist/index.js","_from":"file:mixpart-0.0.5-alpha.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vercel-release-bot","email":"infra+release@vercel.com"},"_resolved":"/tmp/1806039097ea0c21158f3dc59d723cbf/mixpart-0.0.5-alpha.0.tgz","_integrity":"sha512-XS3bfxqdHsxqLoK0DnkGiM++KZGhXFj8KrzfNND/4d0DDBkbVdmlEajIAOQ+2+tHVw2zFI1ng8SnJSOfVZg0HA==","_npmVersion":"10.8.1","description":"High-performance streaming multipart/mixed parser for Node.js","directories":{},"_nodeVersion":"20.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsup":"^8.5.0","vitest":"^3.1.4","@vitest/ui":"^3.1.4","typescript":"^5.0.0","@types/node":"^22.15.24","@vitest/coverage-v8":"3.1.4"},"_npmOperationalInternal":{"tmp":"tmp/mixpart_0.0.5-alpha.0_1753908073908_0.9947995404749153","host":"s3://npm-registry-packages-npm-production"}},"0.0.5-alpha.1":{"name":"mixpart","version":"0.0.5-alpha.1","keywords":["multipart","mixed","parser","streaming","node","typescript","performance"],"author":{"name":"Timer","email":"timer@vercel.com"},"license":"MIT","_id":"mixpart@0.0.5-alpha.1","maintainers":[{"name":"timer","email":"timer150@gmail.com"},{"name":"nick.tracey","email":"nick.tracey@vercel.com"},{"name":"matt.straka","email":"matt.j.straka@gmail.com"},{"name":"vercel-release-bot","email":"infra+release@vercel.com"},{"name":"zeit-bot","email":"team@zeit.co"}],"dist":{"shasum":"f8931a0e9a2ec5f9f1d69326a7772baad060d48e","tarball":"https://registry.npmjs.org/mixpart/-/mixpart-0.0.5-alpha.1.tgz","fileCount":8,"integrity":"sha512-2ZfG/NO2SVE9HLk1/W+yOrIOA0d674ljZExLdievZQpYjbJYQjIdye8vNMR63yF7nN/NbO9q8mp16JUEYBCilg==","signatures":[{"sig":"MEYCIQDrZn2Gp/9BBcpvY+RtC6cC/66UUKc4IWlwoR10L9k2EgIhALusN02LzZTBK25swmptp+03+sM4WqvkV+mK3Pdh0Dyf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104166},"main":"dist/index.js","_from":"file:mixpart-0.0.5-alpha.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vercel-release-bot","email":"infra+release@vercel.com"},"_resolved":"/tmp/9a613ce833045e455d297cec8c094354/mixpart-0.0.5-alpha.1.tgz","_integrity":"sha512-2ZfG/NO2SVE9HLk1/W+yOrIOA0d674ljZExLdievZQpYjbJYQjIdye8vNMR63yF7nN/NbO9q8mp16JUEYBCilg==","_npmVersion":"10.8.1","description":"High-performance streaming multipart/mixed parser for Node.js","directories":{},"_nodeVersion":"20.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsup":"^8.5.0","vitest":"^3.1.4","@vitest/ui":"^3.1.4","typescript":"^5.0.0","@types/node":"^22.15.24","@vitest/coverage-v8":"3.1.4"},"_npmOperationalInternal":{"tmp":"tmp/mixpart_0.0.5-alpha.1_1761767197688_0.023230225998430276","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"mixpart","version":"0.0.5","keywords":["multipart","mixed","parser","streaming","node","typescript","performance"],"author":{"name":"Timer","email":"timer@vercel.com"},"license":"MIT","_id":"mixpart@0.0.5","maintainers":[{"name":"timer","email":"timer150@gmail.com"},{"name":"vercel-release-bot","email":"infra+release@vercel.com"},{"name":"zeit-bot","email":"team@zeit.co"}],"dist":{"shasum":"0c9161b6de571afc9a39dd103241d54f317e15d8","tarball":"https://registry.npmjs.org/mixpart/-/mixpart-0.0.5.tgz","fileCount":8,"integrity":"sha512-TpWi9/2UIr7VWCVAM7NB4WR4yOglAetBkuKfxs3K0vFcUukqAaW1xsgX0v1gNGiDKzYhPHFcHgarC7jmnaOy4w==","signatures":[{"sig":"MEUCIQCopaIGiqbFYDObb4o3z5rQvRuttqTKD8tRH/LLdpzdmQIgW76RUPKAex678JfVoRT+D1Phzb4zMyj+lkygPfeuizY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101633},"main":"dist/index.js","_from":"file:mixpart-0.0.5.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"vercel-release-bot","email":"infra+release@vercel.com"},"_resolved":"/tmp/f312dfd7d10cb5b8392494978002b9db/mixpart-0.0.5.tgz","_integrity":"sha512-TpWi9/2UIr7VWCVAM7NB4WR4yOglAetBkuKfxs3K0vFcUukqAaW1xsgX0v1gNGiDKzYhPHFcHgarC7jmnaOy4w==","_npmVersion":"10.8.1","description":"High-performance streaming multipart/mixed parser for Node.js","directories":{},"_nodeVersion":"20.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.1.4","@vitest/ui":"^3.1.4","typescript":"^5.0.0","@types/node":"^22.15.24","@vitest/coverage-v8":"3.1.4"},"_npmOperationalInternal":{"tmp":"tmp/mixpart_0.0.5_1772113557542_0.0014145622266401592","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"mixpart","version":"0.0.6","keywords":["multipart","mixed","parser","streaming","node","typescript","performance"],"author":{"name":"Timer","email":"timer@vercel.com"},"license":"MIT","_id":"mixpart@0.0.6","maintainers":[{"name":"timer","email":"timer150@gmail.com"},{"name":"matt.straka","email":"matt.j.straka@gmail.com"},{"name":"vercel-release-bot","email":"infra+release@vercel.com"},{"name":"zeit-bot","email":"team@zeit.co"}],"dist":{"shasum":"85f8e7da8d058ade73a4243eea4b87e7908314dd","tarball":"https://registry.npmjs.org/mixpart/-/mixpart-0.0.6.tgz","fileCount":8,"integrity":"sha512-CRdXtgfQH2jARmtNmPR0Q7jL20fiESbaYk1b0KvLD0jCdUuemepREtsbd8nbiY6BHV9OGGddAZITNXklupUPUQ==","signatures":[{"sig":"MEQCIDwQCabjI9Mrxr2v5YdtgF2yXwtmCSu51TEIUzjWf+vOAiBwtr/563cZV1shsvfM4gH9nPbxAXkyrLOaHPB05b7afg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102501},"main":"dist/index.js","_from":"file:mixpart-0.0.6.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","clean":"rm -rf dist","test:ui":"vitest --ui","test:run":"vitest run","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8d5c88f1-eb40-4b93-888f-41efae92f98b"}},"_resolved":"/tmp/1c10d4c1c751af773091e3d2eefcea93/mixpart-0.0.6.tgz","_integrity":"sha512-CRdXtgfQH2jARmtNmPR0Q7jL20fiESbaYk1b0KvLD0jCdUuemepREtsbd8nbiY6BHV9OGGddAZITNXklupUPUQ==","_npmVersion":"11.11.0","description":"High-performance streaming multipart/mixed parser for Node.js","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.1.4","@vitest/ui":"^3.1.4","typescript":"^5.0.0","@types/node":"^22.15.24","@vitest/coverage-v8":"3.1.4"},"_npmOperationalInternal":{"tmp":"tmp/mixpart_0.0.6_1778682444588_0.717087653962059","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-05-29T20:09:49.987Z","modified":"2026-05-18T21:05:03.414Z","0.0.1":"2025-05-29T20:09:50.286Z","0.0.2":"2025-05-31T03:50:13.173Z","0.0.3":"2025-06-02T19:48:41.191Z","0.0.4":"2025-06-03T02:55:53.383Z","0.0.5-alpha.0":"2025-07-30T20:41:14.122Z","0.0.5-alpha.1":"2025-10-29T19:46:37.925Z","0.0.5":"2026-02-26T13:45:57.701Z","0.0.6":"2026-05-13T14:27:24.748Z"},"author":{"name":"Timer","email":"timer@vercel.com"},"license":"MIT","keywords":["multipart","mixed","parser","streaming","node","typescript","performance"],"description":"High-performance streaming multipart/mixed parser for Node.js","maintainers":[{"email":"timer150@gmail.com","name":"timer"},{"email":"matheus.frndes@gmail.com","name":"matheuss"},{"email":"matt.j.straka@gmail.com","name":"matt.straka"},{"email":"infra+release@vercel.com","name":"vercel-release-bot"},{"email":"team@zeit.co","name":"zeit-bot"}],"readme":"# mixpart\n\nHigh-performance streaming multipart/mixed parser for Node.js applications.\n\n## Features\n\n- **True Streaming Processing**: Parses multipart messages as they arrive and yields them immediately\n- **Zero Memory Buffering**: Each message payload is a ReadableStream - no buffering of entire responses\n- **Memory Safety**: Built-in protection against unbounded memory growth from malformed data\n- **Memory Efficient**: Uses async generators and streams for optimal memory usage even with large payloads\n- **High Performance**: Optimized search algorithms using Node.js Buffer.indexOf for fast boundary detection\n- **Robust Error Handling**: Graceful handling of malformed parts and network errors\n- **HTTP-Compliant Headers**: Proper ISO-8859-1 header decoding per HTTP standards\n- **Generic API**: Returns all headers and streaming payload without assumptions about content\n- **TypeScript Support**: Full TypeScript support with comprehensive type definitions\n\n## Installation\n\nThis is a private workspace package used internally by other packages in this monorepo.\n\n## Usage\n\n### Basic Usage\n\n```typescript\nimport { parseMultipartStream, MultipartMessage } from \"mixpart\";\n\n// Parse a multipart/mixed response\nconst response = await fetch(\"https://api.example.com/multipart-endpoint\");\n\nfor await (const message of parseMultipartStream(response)) {\n  console.log(\"Headers:\", Array.from(message.headers.entries()));\n\n  // Access specific headers\n  const contentType = message.headers.get(\"content-type\");\n  const customHeader = message.headers.get(\"x-custom-header\");\n\n  console.log(\"Content-Type:\", contentType);\n\n  // Stream the payload - no buffering in memory\n  const reader = message.payload.getReader();\n\n  while (true) {\n    const { done, value } = await reader.read();\n    if (done) break;\n\n    console.log(\"Received chunk:\", value.length, \"bytes\");\n    // Process each chunk immediately without buffering\n  }\n}\n```\n\n### Memory Safety Configuration\n\nThe parser includes configurable safety limits to prevent unbounded memory growth:\n\n```typescript\nimport { parseMultipartStream, ParserOptions } from \"mixpart\";\n\nconst options: ParserOptions = {\n  maxHeaderSize: 128000, // 128KB header limit (default: 64KB)\n  maxBoundaryBuffer: 16384, // 16KB boundary buffer (default: 8KB)\n};\n\nfor await (const message of parseMultipartStream(response, options)) {\n  // Process messages safely\n}\n```\n\n**Safety Limits:**\n\n- **Header Limit**: Prevents malformed headers from consuming unlimited memory\n- **Boundary Buffer Limit**: Prevents fake partial boundaries from accumulating\n- **Automatic Detection**: Throws descriptive errors when limits are exceeded\n\n### Processing Text/JSON Payloads\n\nFor convenience when you need the complete payload:\n\n```typescript\nimport { parseMultipartStream } from \"mixpart\";\n\nasync function readStreamToText(\n  stream: ReadableStream<Uint8Array>,\n): Promise<string> {\n  const reader = stream.getReader();\n  const chunks: Uint8Array[] = [];\n\n  while (true) {\n    const { done, value } = await reader.read();\n    if (done) break;\n    chunks.push(value);\n  }\n\n  const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n  const result = new Uint8Array(totalLength);\n  let offset = 0;\n\n  for (const chunk of chunks) {\n    result.set(chunk, offset);\n    offset += chunk.length;\n  }\n\n  return new TextDecoder().decode(result);\n}\n\nfor await (const message of parseMultipartStream(response)) {\n  if (message.headers.get(\"content-type\") === \"application/json\") {\n    const jsonText = await readStreamToText(message.payload);\n    const data = JSON.parse(jsonText);\n    console.log(\"JSON data:\", data);\n  }\n}\n```\n\n### Header Encoding Support\n\nThe parser properly handles **HTTP-compliant** header encoding using ISO-8859-1, which is the standard encoding for HTTP headers.\n\n**Features:**\n\n- **ISO-8859-1 Decoding**: Headers are decoded using ISO-8859-1 for proper HTTP compliance\n- **Full Byte Range Support**: Can handle any byte sequence (0-255) in header values\n- **Standards Compliant**: Follows HTTP/1.1 specification for header encoding\n- **Backwards Compatibility**: ASCII headers continue to work exactly as before\n\n**Example:**\n\n```typescript\nimport { parseMultipartStream } from \"mixpart\";\n\n// ISO-8859-1 headers are automatically decoded\nfor await (const message of parseMultipartStream(response)) {\n  // Headers with accented characters work properly\n  const subject = message.headers.get(\"subject\"); // \"Hello World\"\n  const name = message.headers.get(\"x-name\"); // \"José\" or \"Café\"\n\n  console.log(\"Subject:\", subject);\n  console.log(\"Name:\", name);\n}\n```\n\n**Standards Compliance:**\nPer RFC 7230, HTTP header values should use ISO-8859-1 encoding:\n\n1. Headers are decoded using ISO-8859-1 for proper byte-to-character mapping\n2. Any byte sequence (0-255) is valid and will decode properly\n3. Maintains compatibility with the Headers Web API requirements\n4. Never fails due to encoding issues\n\nThis ensures robust parsing of all HTTP-compliant multipart content.\n\n### Application-Specific Usage\n\nSince this is a generic parser, applications can extract their own specific headers:\n\n```typescript\nimport { parseMultipartStream } from \"mixpart\";\n\nconst response = await fetch(\"https://api.example.com/messages\", {\n  headers: {\n    Accept: \"multipart/mixed\",\n    Authorization: \"Bearer TOKEN\",\n  },\n});\n\nfor await (const part of parseMultipartStream(response)) {\n  // Extract application-specific headers using Headers API\n  const messageId = part.headers.get(\"x-message-id\");\n  const timestamp = part.headers.get(\"x-timestamp\");\n  const contentType = part.headers.get(\"content-type\");\n\n  if (messageId && timestamp) {\n    console.log(\"Message:\", {\n      id: messageId,\n      timestamp: timestamp,\n      contentType: contentType,\n    });\n\n    // Stream process the payload without loading it all into memory\n    const reader = part.payload.getReader();\n    const chunks: Uint8Array[] = [];\n\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) break;\n      chunks.push(value);\n    }\n\n    // Only combine chunks when ready to process\n    const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n    const fullPayload = new Uint8Array(totalLength);\n    let offset = 0;\n    for (const chunk of chunks) {\n      fullPayload.set(chunk, offset);\n      offset += chunk.length;\n    }\n\n    if (contentType === \"application/json\") {\n      const messageData = JSON.parse(new TextDecoder().decode(fullPayload));\n      console.log(\"JSON data:\", messageData);\n    }\n  }\n}\n```\n\n## API Reference\n\n### `parseMultipartStream(response: Response, options?: ParserOptions)`\n\nReturns an async generator that yields `MultipartMessage` objects as they are parsed from the stream.\n\n**Parameters:**\n\n- `response`: A `Response` object with a multipart/mixed body\n- `options`: Optional configuration for memory safety limits\n\n**Returns:**\n\n- `AsyncGenerator<MultipartMessage, void, unknown>`\n\n### `ParserOptions`\n\nConfiguration interface for memory safety:\n\n```typescript\ninterface ParserOptions {\n  maxHeaderSize?: number; // Maximum header buffer size (default: 64KB)\n  maxBoundaryBuffer?: number; // Maximum boundary buffer size (default: 8KB)\n}\n```\n\n### `MultipartMessage`\n\nInterface representing a parsed multipart message:\n\n```typescript\ninterface MultipartMessage {\n  headers: Headers; // Proper Headers object with get(), has(), etc.\n  payload: ReadableStream<Uint8Array>; // Streaming payload - no buffering\n}\n```\n\n**Key Benefits:**\n\n- **No Memory Buffering**: The payload is streamed, not loaded into memory\n- **Immediate Processing**: Messages are yielded as soon as headers are parsed\n- **Scalable**: Can handle arbitrarily large payloads without memory issues\n- **Memory Safe**: Protected against malformed data attacks\n\n### `extractBoundary(contentType: string)`\n\nUtility function to extract the boundary parameter from a Content-Type header.\n\n**Parameters:**\n\n- `contentType`: Content-Type header value\n\n**Returns:**\n\n- `string`: The boundary string\n\n### `MultipartParseError`\n\nError class thrown when multipart parsing fails:\n\n```typescript\nclass MultipartParseError extends Error {\n  name: \"MultipartParseError\";\n}\n```\n\n## Performance Characteristics\n\n- **Memory Usage**: O(boundary_length + chunk_size) - only buffers incomplete boundaries/headers\n- **Throughput**: Handles high-volume message streams with minimal latency\n- **Streaming**: True streaming - messages yielded immediately, payloads never buffered\n- **Memory Safety**: Protected against unbounded growth with configurable limits\n\n## Streaming Behavior\n\n- Messages are yielded as soon as headers are parsed\n- Each message payload is a `ReadableStream<Uint8Array>` (zero buffering)\n- Headers limited to 64KB by default (configurable via `maxHeaderSize`)\n- Boundary buffers limited to 8KB by default (configurable via `maxBoundaryBuffer`)\n\nThis design allows processing of arbitrarily large multipart responses without memory constraints.\n\n## Requirements\n\n- Node.js >= 22.0.0\n- TypeScript >= 5.0.0 (for development)\n\n## License\n\nMIT\n","readmeFilename":"README.md"}