{"_id":"@ahadpvt.v3/reqex","_rev":"6-61aa5bfa9336079b02e17b6d4acc06c9","name":"@ahadpvt.v3/reqex","dist-tags":{"latest":"2.0.2"},"versions":{"1.0.0":{"name":"@ahadpvt.v3/reqex","version":"1.0.0","keywords":["http","request","parser","body","query","cookies","headers","multipart","form","edge","lambda","cloudflare","workers","middleware"],"author":{"name":"Abdul Ahad"},"license":"MIT","_id":"@ahadpvt.v3/reqex@1.0.0","maintainers":[{"name":"ahadpvt.v3","email":"ahadpvt.v3@gmail.com"}],"homepage":"https://github.com/ahadpvt.v3/reqex#readme","bugs":{"url":"https://github.com/ahadpvt.v3/reqex/issues"},"dist":{"shasum":"4fe28b445fba8297f862153ee57daf31c82c422c","tarball":"https://registry.npmjs.org/@ahadpvt.v3/reqex/-/reqex-1.0.0.tgz","fileCount":6,"integrity":"sha512-SUyqUCqVUD0ThP1KLS0k8t3qiKXyZ6PnhxjOZEKxblX5n/Ak0lYQNUvC0GoVc6Urz+iq9jdxgQxLxeTXjqb9eA==","signatures":[{"sig":"MEYCIQCZTWYdKAfqHpC+Pz/tekymf+8hzwL2EkiB5PnDLHzzBQIhANa3zZtED1taua75HqadrIoeEXbrIpTMa9L7oBaLrxtL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52645},"main":"index.js","types":"index.d.ts","engines":{"node":">=14"},"exports":{".":{"import":"./index.mjs","require":"./index.js"}},"scripts":{"test":"node test.js"},"_npmUser":{"name":"ahadpvt.v3","email":"ahadpvt.v3@gmail.com"},"repository":{"url":"git+https://github.com/ahadpvt.v3/reqex.git","type":"git"},"_npmVersion":"9.2.0","description":"Zero-dependency, CPU-optimised, environment-aware HTTP request parser for Node.js, Edge, Cloudflare Workers and AWS Lambda","directories":{},"_nodeVersion":"18.19.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/reqex_1.0.0_1773439381066_0.5464881025284436","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Deprecated. Use @qezor/reqex instead."},"1.0.1":{"name":"@ahadpvt.v3/reqex","version":"1.0.1","keywords":["http","request","parser","body","query","cookies","headers","multipart","form","edge","lambda","cloudflare","workers","middleware"],"author":{"name":"Abdul Ahad"},"license":"MIT","_id":"@ahadpvt.v3/reqex@1.0.1","maintainers":[{"name":"ahadpvt.v3","email":"ahadpvt.v3@gmail.com"}],"homepage":"https://github.com/ahadpvt.v3/reqex#readme","bugs":{"url":"https://github.com/ahadpvt.v3/reqex/issues"},"dist":{"shasum":"54a449e9042ef2b9409048caea927f463351ec1d","tarball":"https://registry.npmjs.org/@ahadpvt.v3/reqex/-/reqex-1.0.1.tgz","fileCount":6,"integrity":"sha512-Ew1pVk1z7IMHmFKVWDa0u8OJ+zc7CA4KhmPRG2Al4QauG+hQ+FF92hXx9TXjWavaeci7aZnwWpY2vDicQ67r1A==","signatures":[{"sig":"MEUCIQCiw3HxOyZ8sZede6A8Nx0L4pzOOw/sWdme8xStP6FAzQIgKlorwV+HBVJr82AnR/JetwCgeyjuVVHkt03zV0UylwA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58059},"main":"index.js","types":"index.d.ts","engines":{"node":">=14"},"exports":{".":{"import":"./index.mjs","require":"./index.js"}},"scripts":{"test":"node test.js"},"_npmUser":{"name":"ahadpvt.v3","email":"ahadpvt.v3@gmail.com"},"repository":{"url":"git+https://github.com/ahadpvt.v3/reqex.git","type":"git"},"_npmVersion":"9.2.0","description":"Zero-dependency, CPU-optimised, environment-aware HTTP request parser for Node.js, Edge, Cloudflare Workers and AWS Lambda","directories":{},"_nodeVersion":"18.19.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/reqex_1.0.1_1773441830130_0.9019082283287168","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Deprecated. Use @qezor/reqex instead."},"2.0.0":{"name":"@ahadpvt.v3/reqex","version":"2.0.0","keywords":["http","request","parser","body","query","cookies","headers","multipart","stream","tcp","udp","edge","lambda","cloudflare","workers","middleware"],"author":{"name":"Abdul Ahad"},"license":"MIT","_id":"@ahadpvt.v3/reqex@2.0.0","maintainers":[{"name":"ahadpvt.v3","email":"ahadpvt.v3@gmail.com"}],"dist":{"shasum":"e15f367fd09932eae62577c71e7478d5d7c86f7e","tarball":"https://registry.npmjs.org/@ahadpvt.v3/reqex/-/reqex-2.0.0.tgz","fileCount":6,"integrity":"sha512-rPR0OxEPTozKbpfAyxdt/PrMItxdKow1jBa2aLhnRPmShTbSCtsw8EQeIDE74yxJkqsbRBDPmwGR/dgW/sCZmw==","signatures":[{"sig":"MEQCIDEjcMN1QEia+KpbMYTzfDvz9nB8PeDIqqdB0ASwg1tMAiBsnN7KSwqVELDRT30WG/z2Ix9L9a0QVQ2uyPHHOWn4Mw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55333},"main":"index.js","types":"index.d.ts","engines":{"node":">=14"},"exports":{".":{"import":"./index.mjs","require":"./index.js"}},"scripts":{"test":"node test.js"},"_npmUser":{"name":"ahadpvt.v3","email":"ahadpvt.v3@gmail.com"},"_npmVersion":"9.2.0","description":"Zero-dependency, CPU-optimised, environment-aware HTTP request parser for Node.js, Edge Runtime, Cloudflare Workers, AWS Lambda, TCP and UDP","directories":{},"_nodeVersion":"18.19.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/reqex_2.0.0_1773527713436_0.4492958501123834","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Deprecated. Use @qezor/reqex instead."},"2.0.1":{"name":"@ahadpvt.v3/reqex","version":"2.0.1","keywords":["http","request","parser","body","query","cookies","headers","multipart","stream","tcp","udp","edge","lambda","cloudflare","workers","middleware"],"author":{"name":"Abdul Ahad"},"license":"MIT","_id":"@ahadpvt.v3/reqex@2.0.1","maintainers":[{"name":"ahadpvt.v3","email":"ahadpvt.v3@gmail.com"}],"dist":{"shasum":"ac533f23811419ea9c7352c5958e51c0ac7dd509","tarball":"https://registry.npmjs.org/@ahadpvt.v3/reqex/-/reqex-2.0.1.tgz","fileCount":6,"integrity":"sha512-8avomIwhpqMyjD1EO4Ve5s1ZMDho+1Y1hQwi6irI2oxWe5mzAgIJcRtjLWVriZGInSOJbQd7Cviunt4Gx/KnLw==","signatures":[{"sig":"MEUCICmWdcY4o8StQWyQRXLSGVpreFgIasgzQmsdDqxQwOcDAiEAh5wiSoSVC2YTI847x2lsmkrt4j2T/EoZLdtgz/Mjoig=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55532},"main":"index.js","types":"index.d.ts","engines":{"node":">=14"},"exports":{".":{"import":"./index.mjs","require":"./index.js"}},"scripts":{"test":"node test.js"},"_npmUser":{"name":"ahadpvt.v3","email":"ahadpvt.v3@gmail.com"},"_npmVersion":"10.9.4","description":"Zero-dependency, CPU-optimised, environment-aware HTTP request parser for Node.js, Edge Runtime, Cloudflare Workers, AWS Lambda, TCP and UDP","directories":{},"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/reqex_2.0.1_1774159477271_0.8435553777226821","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Deprecated. Use @qezor/reqex instead."},"2.0.2":{"name":"@ahadpvt.v3/reqex","version":"2.0.2","keywords":["http","request","parser","body","query","cookies","headers","multipart","stream","tcp","udp","edge","lambda","cloudflare","workers","middleware"],"author":{"name":"Abdul Ahad"},"license":"MIT","_id":"@ahadpvt.v3/reqex@2.0.2","maintainers":[{"name":"ahadpvt.v3","email":"ahadpvt.v3@gmail.com"}],"dist":{"shasum":"a44d79eefd73193902f468848051e22e4febc2c9","tarball":"https://registry.npmjs.org/@ahadpvt.v3/reqex/-/reqex-2.0.2.tgz","fileCount":6,"integrity":"sha512-2LmX39WKH7KPI+U+dojc+HAKPP5KzmNDiC4U52fpZfoh+kr/llxXOJEg+ciOvY0UWBVQpG1q4z442d3WJGcR+g==","signatures":[{"sig":"MEUCIGx3C1zE8HajMDXNN27ygL4dHXG2YxcVYXdDlOL7xqzpAiEA8feEbiY7dqSYcqp/1RrBwYLG8AaJFHPotkDRxg+katk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59292},"main":"index.js","type":"commonjs","types":"index.d.ts","engines":{"node":">=14"},"exports":{".":{"types":"./index.d.ts","import":"./index.mjs","default":"./index.js","require":"./index.js"}},"scripts":{"test":"node test.js"},"_npmUser":{"name":"ahadpvt.v3","email":"ahadpvt.v3@gmail.com"},"_npmVersion":"10.9.4","description":"Zero-dependency, CPU-optimised, environment-aware HTTP request parser for Node.js, Edge Runtime, Cloudflare Workers, AWS Lambda, TCP and UDP","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/reqex_2.0.2_1774167055041_0.643619675608945","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Deprecated. Use @qezor/reqex instead."}},"time":{"created":"2026-03-13T22:03:01.000Z","modified":"2026-04-01T21:12:08.486Z","1.0.0":"2026-03-13T22:03:01.224Z","1.0.1":"2026-03-13T22:43:50.295Z","2.0.0":"2026-03-14T22:35:13.612Z","2.0.1":"2026-03-22T06:04:37.413Z","2.0.2":"2026-03-22T08:10:55.230Z"},"author":{"name":"Abdul Ahad"},"license":"MIT","keywords":["http","request","parser","body","query","cookies","headers","multipart","stream","tcp","udp","edge","lambda","cloudflare","workers","middleware"],"description":"Zero-dependency, CPU-optimised, environment-aware HTTP request parser for Node.js, Edge Runtime, Cloudflare Workers, AWS Lambda, TCP and UDP","maintainers":[{"name":"ahadpvt.v3","email":"ahadpvt.v3@gmail.com"}],"readme":"# @ahadpvt.v3/reqex\n\nA **zero-dependency, CPU-optimised, environment-aware HTTP request parser** — and now also a TCP and UDP context builder — built as the request layer beneath a universal route dispatcher.\n\nParses body, query, cookies, and headers on demand. Two explicit body reading paths — buffered for small payloads, streaming for large ones. TCP and UDP connections get the same ergonomic `ctx` shape as HTTP so shared middleware works across all protocols without branching.\n\n---\n\n## Installation\n\n```bash\nnpm install @ahadpvt.v3/reqex\n```\n\n---\n\n## Import / Require\n\n```js\nconst { normalize, context, presets, adapters, adaptTcp, adaptUdp } = require(\"@ahadpvt.v3/reqex\")\n```\n\n---\n\n## Quick Start\n\n```js\nconst { parse } = require(\"@ahadpvt.v3/reqex\")\n\nconst ctx = await parse(req)\n\nconsole.log(ctx.method)       // \"POST\"\nconsole.log(ctx.path)         // \"/users/42\"\nconsole.log(ctx.query)        // { page: \"1\" }\nconsole.log(await ctx.body()) // { name: \"Abdul\" }\n```\n\n---\n\n## How It Works\n\n```\nraw request (any env)\n      ↓\n  normalize()     — detects env, produces NormalizedRequest\n      ↓\n  preset / parsers — parse only what you need\n      ↓\n  context         — rich object passed to your route handler\n```\n\nFor a dispatcher, use `normalize()` + preset directly:\n\n```js\nconst nr  = normalize(req)\nconst ctx = await presets.api(nr)\n\nconsole.log(ctx.query)\nconsole.log(await ctx.body())\n```\n\n---\n\n## Body Reading — Two Paths\n\nTwo explicit, mutually exclusive paths. Once one is used the other throws clearly.\n\n### Buffered — small payloads\n\n```js\nconst body = await ctx.body()                          // auto detect\nconst body = await ctx.body({ type: \"json\" })          // override\nconst body = await ctx.body({ limit: 512 * 1024 })     // 512kb limit\nconst buf  = await ctx.rawBody()                       // raw Buffer\n```\n\n### Streaming — large payloads\n\n```js\nconst stream = ctx.bodyStream()          // raw Readable — zero buffering\nstream.pipe(destination)\n\nfor await (const part of ctx.parts()) { // streaming multipart\n  if (part.file) part.stream.pipe(fs.createWriteStream(`/uploads/${part.filename}`))\n  else console.log(part.name, part.value)\n}\n```\n\n### Consumption guard\n\n```js\nawait ctx.body()\nctx.bodyStream()   // throws BODY_ALREADY_CONSUMED\n\nctx.bodyConsumed   // boolean\nctx.bodyMode       // \"buffered\" | \"streaming\" | \"streaming-multipart\" | null\n```\n\n---\n\n## Presets\n\n| Preset | Body | Pre-warms | Best for |\n|---|---|---|---|\n| `minimal` | not touched | query, cookies, headers | routing, redirects |\n| `api` | buffered json | query, headers | REST, GraphQL |\n| `auth` | buffered json | query, cookies, headers, auth() | login, OAuth |\n| `form` | buffered form/multipart | query, cookies, headers | HTML forms |\n| `upload` | not pre-consumed | headers | file uploads — use `ctx.parts()` |\n| `proxy` | not pre-consumed | headers | proxies — use `ctx.bodyStream()` |\n| `webhook` | buffered raw + signature | headers | Stripe, GitHub, Twilio |\n| `full` | buffered auto | everything | catch-all, debugging |\n\n---\n\n## Context Object\n\n```js\nctx.method        // \"POST\"\nctx.url           // \"https://example.com/api/users?page=1\"\nctx.path          // \"/api/users\"\nctx.host          // \"example.com\"\nctx.subdomain     // \"api\" or null\nctx.ip            // real IP — CF > X-Real-IP > X-Forwarded-For > socket\nctx.env           // \"node\" | \"edge\" | \"lambda\" | \"express\"\nctx.raw           // original request, untouched\nctx.query         // { page: \"1\" } — lazy, cached\nctx.cookies       // { session: \"abc\" } — lazy, cached\nctx.headers       // enriched headers — lazy, cached\nctx.bodyConsumed  // boolean\nctx.bodyMode      // string | null\n\nctx.get(\"x-request-id\")   // header, case-insensitive\nctx.is(\"json\")            // content-type check\nctx.hasBody()             // true for POST/PUT/PATCH or content-length > 0\nctx.isPreflight()         // CORS preflight\nctx.isUpgrade()           // WebSocket upgrade\nctx.auth()                // { type: \"Bearer\", token: \"...\" } | null\n\nawait ctx.body(opts)      // buffered + parsed\nawait ctx.rawBody(opts)   // buffered raw Buffer\nctx.bodyStream()          // raw Readable\nctx.parts()               // async iterator — streaming multipart\n```\n\n---\n\n## TCP Context\n\nFor raw TCP, TLS, and Unix socket connections. Produced by `adaptTcp(socket, data)`.\n\nHas the same shape as HTTP `ctx` where safe — all HTTP-style accessors return safe empty values so shared middleware works across HTTP and TCP without branching.\n\n```js\nconst { adaptTcp } = require(\"@ahadpvt.v3/reqex\")\n\nnet.createServer(socket => {\n  socket.on(\"data\", chunk => {\n    const ctx = adaptTcp(socket, chunk)\n\n    console.log(ctx.ip)     // \"192.168.1.1\"\n    console.log(ctx.port)   // 54321\n    console.log(ctx.id)     // \"192.168.1.1:54321:1712345678000\"\n    console.log(ctx.env)    // \"tcp\"\n    console.log(ctx.data)   // Buffer — raw chunk or decoded frame\n    console.log(ctx.socket) // net.Socket\n  })\n})\n```\n\nUsed internally by `dispex.tcp()`, `dispex.tls()`, and `dispex.unix()`.\n\n---\n\n## UDP Context\n\nFor UDP messages. Produced by `adaptUdp(msg, rinfo, socket)`.\n\n```js\nconst { adaptUdp } = require(\"@ahadpvt.v3/reqex\")\n\nconst server = dgram.createSocket(\"udp4\")\nserver.on(\"message\", (msg, rinfo) => {\n  const ctx = adaptUdp(msg, rinfo, server)\n\n  console.log(ctx.ip)     // sender IP\n  console.log(ctx.port)   // sender port\n  console.log(ctx.data)   // raw Buffer\n  console.log(ctx.env)    // \"udp\"\n})\n```\n\nUsed internally by `dispex.udp()`.\n\n---\n\n## Environments\n\n```js\nadapters.detect(req)       // auto\nadapters.node(req)         // http.IncomingMessage\nadapters.express(req)      // Express / Fastify\nadapters.edge(req)         // Edge Runtime / CF Workers\nadapters.lambda(event)     // AWS Lambda\n```\n\n---\n\n## Error Handling\n\n```js\ntry {\n  const body = await ctx.body()\n} catch (err) {\n  if (err.isReqex) {\n    switch (err.code) {\n      case \"BODY_TOO_LARGE\":\n      case \"BODY_ALREADY_CONSUMED\":\n      case \"INVALID_JSON\":\n      case \"NO_BOUNDARY\":\n      case \"STREAM_ERROR\":\n      case \"REQUEST_ABORTED\":\n      case \"INVALID_REQUEST\":\n      case \"UNKNOWN_PRESET\":\n    }\n  }\n}\n```\n\n---\n\n## Constants\n\n```js\nconst { CONTENT_TYPE, DEFAULT_BODY_LIMIT, DEFAULT_UPLOAD_LIMIT } = require(\"@ahadpvt.v3/reqex\")\n\nCONTENT_TYPE.JSON    // \"application/json\"\nCONTENT_TYPE.GRPC    // \"application/grpc\"\n\nDEFAULT_BODY_LIMIT   // 1048576  (1mb)\nDEFAULT_UPLOAD_LIMIT // 52428800 (50mb)\n```\n\n---\n\n## Runtime Adapter (Advanced)\n\nYou can inject runtime capabilities explicitly when running in constrained environments.\n\n```js\nconst { setRuntimeAdapter } = require(\"@ahadpvt.v3/reqex\")\n\nsetRuntimeAdapter({\n  Buffer,\n  Readable,\n  nextTick: (fn) => queueMicrotask(fn),\n  reportError: (err, meta) => console.error(\"reqex runtime error\", err, meta),\n})\n```\n\nIf a required capability is missing, reqex throws `UNSUPPORTED_RUNTIME` with an explicit message.\n\n---\n\n## Testing\n\n```bash\nnpm test\n```\n\n```\n54 passed, 0 failed\n```\n\n---\n\n## License\n\nMIT © Abdul Ahad\n","readmeFilename":"README.md"}