{"owner":"derrick-torkornoo","slug":"uws-boost","channel":"derrick-torkornoo/uws-boost","version":"1.0.0","artifact_sha256":"a3d8eab13ee22ef1c37169fcb696649f9f7f31ffe7ed5b9ad08e55620bd29992","published_at":"2026-11-02T09:33:41.585Z","price_micro":"9000000","update_price_micro":"5000000","resource_endpoint":"https://x402git.com/api/r/derrick-torkornoo/uws-boost","version_url":"https://x402git.com/api/v/derrick-torkornoo/uws-boost","computed":{"artifact_class":"Pack","component_inventory":[{"kind":"source","count":42},{"kind":"tests","count":63},{"kind":"examples","count":19},{"kind":"docs","count":4},{"kind":"ci","count":3},{"kind":"config","count":5},{"kind":"assets","count":2},{"kind":"other","count":1}],"file_count":139,"dir_depth":2,"bytes_text":584950,"bytes_binary":491,"languages":{"JavaScript":723,"TypeScript":332141},"tree":[{"path":".devcontainer/devcontainer.json","size":362,"binary":false},{"path":".github/dependabot.yml","size":837,"binary":false},{"path":".github/workflows/ci.yml","size":3403,"binary":false},{"path":".github/workflows/release.yml","size":1961,"binary":false},{"path":".gitignore","size":96,"binary":false},{"path":".npmignore","size":72,"binary":true},{"path":".prettierignore","size":45,"binary":true},{"path":".prettierrc.json","size":74,"binary":false},{"path":"CHANGELOG.md","size":8163,"binary":false},{"path":"CONTRIBUTING.md","size":2101,"binary":false},{"path":"LICENSE","size":1081,"binary":false},{"path":"README.md","size":19900,"binary":false},{"path":"eslint.config.js","size":723,"binary":false},{"path":"examples/.env.example","size":309,"binary":true},{"path":"examples/auth-basic.ts","size":1609,"binary":false},{"path":"examples/auth-cache.ts","size":1423,"binary":false},{"path":"examples/auth-mixed.ts","size":3192,"binary":false},{"path":"examples/auth-policies.ts","size":2184,"binary":false},{"path":"examples/auth-token-schemes.ts","size":4190,"binary":false},{"path":"examples/body_parser.ts","size":1523,"binary":false},{"path":"examples/cookies.ts","size":3081,"binary":false},{"path":"examples/cors-global.ts","size":1636,"binary":false},{"path":"examples/cors-variant.ts","size":4201,"binary":false},{"path":"examples/docker/Dockerfile","size":798,"binary":false},{"path":"examples/docker/Dockerfile.dockerignore","size":65,"binary":true},{"path":"examples/docker/README.md","size":634,"binary":false},{"path":"examples/docker/docker-compose.yml","size":809,"binary":false},{"path":"examples/env.ts","size":556,"binary":false},{"path":"examples/http-codes.ts","size":3168,"binary":false},{"path":"examples/router-app.ts","size":4928,"binary":false},{"path":"examples/server.ts","size":6729,"binary":false},{"path":"examples/upload_multipart.ts","size":3520,"binary":false},{"path":"package-lock.json","size":162812,"binary":false},{"path":"package.json","size":6652,"binary":false},{"path":"src/auth-register.ts","size":9807,"binary":false},{"path":"src/auth/cache.ts","size":1214,"binary":false},{"path":"src/auth/rules.ts","size":3519,"binary":false},{"path":"src/auth/strategies.ts","size":5247,"binary":false},{"path":"src/auth/types.ts","size":2484,"binary":false},{"path":"src/body.ts","size":7253,"binary":false},{"path":"src/cookies.ts","size":4118,"binary":false},{"path":"src/cors-register.ts","size":3421,"binary":false},{"path":"src/cors.ts","size":2888,"binary":false},{"path":"src/csrf.ts","size":574,"binary":false},{"path":"src/errors.ts","size":2615,"binary":false},{"path":"src/http.ts","size":2667,"binary":false},{"path":"src/index.ts","size":4020,"binary":false},{"path":"src/lifecycle.ts","size":4839,"binary":false},{"path":"src/multipart.ts","size":16282,"binary":false},{"path":"src/multipart/file-sink.ts","size":2002,"binary":false},{"path":"src/multipart/helpers.ts","size":1563,"binary":false},{"path":"src/multipart/parsing.ts","size":2405,"binary":false},{"path":"src/multipart/types.ts","size":3303,"binary":false},{"path":"src/query.ts","size":3162,"binary":false},{"path":"src/rate-limit.ts","size":4608,"binary":false},{"path":"src/request-log.ts","size":5606,"binary":false},{"path":"src/responder.ts","size":13007,"binary":false},{"path":"src/router.ts","size":8406,"binary":false},{"path":"src/router/middleware.ts","size":5107,"binary":false},{"path":"src/security-headers.ts","size":2395,"binary":false},{"path":"src/signed-cookies.ts","size":1671,"binary":false},{"path":"src/static.ts","size":7935,"binary":false},{"path":"src/types.ts","size":3376,"binary":false},{"path":"src/utils/abort.ts","size":1606,"binary":false},{"path":"src/utils/client-ip.ts","size":3782,"binary":false},{"path":"src/utils/compression.ts","size":1831,"binary":false},{"path":"src/utils/defer-body.ts","size":1630,"binary":false},{"path":"src/utils/mime.ts","size":1269,"binary":false},{"path":"src/utils/normalizer.ts","size":409,"binary":false},{"path":"src/utils/opt-files.ts","size":3865,"binary":false},{"path":"src/utils/range.ts","size":1059,"binary":false},{"path":"src/utils/request-snapshot.ts","size":2457,"binary":false},{"path":"src/websocket.ts","size":3358,"binary":false},{"path":"tests/auth/cache.test.ts","size":1737,"binary":false},{"path":"tests/auth/csrf.test.ts","size":840,"binary":false},{"path":"tests/auth/registerGlobalAuth.test.ts","size":11762,"binary":false},{"path":"tests/auth/rules.test.ts","size":3021,"binary":false},{"path":"tests/auth/strategies.test.ts","size":3931,"binary":false},{"path":"tests/body/abort.test.ts","size":3255,"binary":false},{"path":"tests/body/deferBody.test.ts","size":2130,"binary":false},{"path":"tests/body/errors.test.ts","size":2506,"binary":false},{"path":"tests/body/readJson.flow.test.ts","size":3416,"binary":false},{"path":"tests/body/readText.test.ts","size":1954,"binary":false},{"path":"tests/body/urlencoded.test.ts","size":1631,"binary":false},{"path":"tests/body/validate.test.ts","size":2744,"binary":false},{"path":"tests/cookies/buildCookieHeaders.test.ts","size":1954,"binary":false},{"path":"tests/cookies/cookies.test.ts","size":921,"binary":false},{"path":"tests/cookies/parseCookieHeader.test.ts","size":1469,"binary":false},{"path":"tests/cookies/serializeCookie.test.ts","size":1796,"binary":false},{"path":"tests/cookies/signedCookies.test.ts","size":1456,"binary":false},{"path":"tests/cors/createCors.test.ts","size":1635,"binary":false},{"path":"tests/cors/preflight.test.ts","size":3575,"binary":false},{"path":"tests/cors/registerGlobalCors.test.ts","size":4622,"binary":false},{"path":"tests/exports.test.ts","size":985,"binary":false},{"path":"tests/file-ops/opt-files.test.ts","size":5168,"binary":false},{"path":"tests/http/errors.test.ts","size":1913,"binary":false},{"path":"tests/http/lifecycle.test.ts","size":1561,"binary":false},{"path":"tests/http/query.test.ts","size":1696,"binary":false},{"path":"tests/http/range.test.ts","size":1660,"binary":false},{"path":"tests/http/reasonPhrase.test.ts","size":1170,"binary":false},{"path":"tests/http/requestLog.test.ts","size":3081,"binary":false},{"path":"tests/http/requestSnapshot.test.ts","size":2107,"binary":false},{"path":"tests/http/resolveSafePath.test.ts","size":1464,"binary":false},{"path":"tests/http/securityHeaders.test.ts","size":2071,"binary":false},{"path":"tests/http/structuredLogger.test.ts","size":1712,"binary":false},{"path":"tests/http/websocket.test.ts","size":2836,"binary":false},{"path":"tests/integration/auth.int.test.ts","size":3212,"binary":false},{"path":"tests/integration/body.int.test.ts","size":2063,"binary":false},{"path":"tests/integration/lifecycle.int.test.ts","size":2668,"binary":false},{"path":"tests/integration/multipart.int.test.ts","size":2418,"binary":false},{"path":"tests/integration/rateLimit.int.test.ts","size":711,"binary":false},{"path":"tests/integration/requestLog.int.test.ts","size":1754,"binary":false},{"path":"tests/integration/responder.int.test.ts","size":3106,"binary":false},{"path":"tests/integration/router.int.test.ts","size":4412,"binary":false},{"path":"tests/integration/routerMiddleware.int.test.ts","size":3621,"binary":false},{"path":"tests/integration/routerObservability.int.test.ts","size":3556,"binary":false},{"path":"tests/integration/static.int.test.ts","size":5114,"binary":false},{"path":"tests/integration/websocket.int.test.ts","size":1904,"binary":false},{"path":"tests/multipart/fileSink.test.ts","size":2402,"binary":false},{"path":"tests/multipart/parseMultipart.test.ts","size":12506,"binary":false},{"path":"tests/multipart/parsing.test.ts","size":3542,"binary":false},{"path":"tests/rate-limit/rateLimit.test.ts","size":6432,"binary":false},{"path":"tests/responder/asyncSafety.test.ts","size":1497,"binary":false},{"path":"tests/responder/compression.test.ts","size":4048,"binary":false},{"path":"tests/responder/createResponder.test.ts","size":4770,"binary":false},{"path":"tests/responder/etag.test.ts","size":2063,"binary":false},{"path":"tests/responder/handlerErrors.test.ts","size":3693,"binary":false},{"path":"tests/responder/moreResponses.test.ts","size":2650,"binary":false},{"path":"tests/responder/withResponder.integration.test.ts","size":1843,"binary":false},{"path":"tests/router/compose.test.ts","size":2012,"binary":false},{"path":"tests/utils/mock-app.ts","size":905,"binary":false},{"path":"tests/utils/multipart.ts","size":1215,"binary":false},{"path":"tests/utils/server.ts","size":625,"binary":false},{"path":"tests/utils/strict-req.ts","size":1020,"binary":false},{"path":"tests/utils/uws-mocks-2.ts","size":2374,"binary":false},{"path":"tests/utils/uws-mocks.ts","size":1835,"binary":false},{"path":"tsconfig.json","size":463,"binary":false},{"path":"tsup.config.ts","size":1179,"binary":false},{"path":"vitest.config.ts","size":452,"binary":false}],"readme_html":"<h2>uws-akwaaba</h2>\n<p><a href=\"https://github.com/DERRICK-TORKORNOO/uws-akwaaba/actions/workflows/ci.yml\" rel=\"nofollow noopener ugc\" target=\"_blank\"><img src=\"https://github.com/DERRICK-TORKORNOO/uws-akwaaba/actions/workflows/ci.yml/badge.svg\" alt=\"CI\" loading=\"lazy\" decoding=\"async\" /></a></p>\n<blockquote><p><strong>Project type:</strong> TypeScript library, published as an npm package that you import into your own uWebSockets.js server. Runnable example servers live in <code>examples/</code>.</p></blockquote>\n<p>A lightweight, dependency-free web framework and toolkit for building HTTP APIs on <a href=\"https://github.com/uNetworking/uWebSockets.js\" rel=\"nofollow noopener ugc\" target=\"_blank\">uWebSockets.js</a>:</p>\n<ul><li>a <strong>router</strong> with Koa-style middleware, params, typed query access and central error handling</li><li><strong>response helpers</strong> (<code>json</code>, <code>text</code>, <code>html</code>, <code>send</code>, <code>redirect</code>, <code>empty</code>, <code>error</code>) with compression and ETags</li><li><strong>body readers</strong> for JSON (with schema validation), text, urlencoded and raw bytes, readable even after <code>await</code></li><li>a streaming <strong>multipart/form-data</strong> parser (memory, disk or spill-over) with size, count and type limits</li><li><strong>static files</strong> with ETag/304, byte ranges, HEAD and backpressure-aware streaming</li><li><strong>authentication</strong> (bearer, API key, session + CSRF, roles and scopes), <strong>rate limiting</strong>, <strong>CSRF</strong> middleware</li><li><strong>CORS</strong>, <strong>cookies</strong> (including HMAC-signed values), <strong>security headers</strong></li><li><strong>request ids and structured access logs</strong>, <strong>graceful shutdown</strong>, <strong>JSON WebSockets</strong></li><li>typed <strong>HTTP errors</strong> that map straight to responses</li></ul>\n<p>uWS is fast because it is low-level: the request object dies as soon as your handler returns or awaits, the body is lost unless you subscribe to it immediately, aborted responses must never be written, and the status line must come before every header. This library handles those rules for you, and its test suite checks them against a real uWS server.</p>\n<h3>Install</h3>\n<pre><code class=\"language-bash\">npm install uws-akwaaba uNetworking/uWebSockets.js#v20.52.0\n</code></pre>\n<p><code>uWebSockets.js</code> is a peer dependency. Node.js 20 or newer is required (uWebSockets.js v20.52 ships no Node 18 binary). uWebSockets.js ships glibc builds only, so Alpine (musl) based environments are not supported.</p>\n<h3>Quick start</h3>\n<pre><code class=\"language-ts\">import uWS from &quot;uWebSockets.js&quot;;\nimport pino from &quot;pino&quot;;\nimport { createRouter, authenticate, bearerAuth, readJson, HttpError, structuredLogger } from &quot;uws-akwaaba&quot;;\n\nconst app = uWS.App();\nconst logger = pino();\nconst api = createRouter(app, {\n  prefix: &quot;/api&quot;,\n  compress: true,\n  // one JSON line per request: id, method, url, status, durationMs, bytes\n  requestLog: { log: structuredLogger(logger) },\n  // unexpected errors (not 4xx HttpErrors), e.g. for Sentry.captureException\n  onException: (err, ctx) =&gt; logger.error({ err, route: ctx.route, requestId: ctx.state.requestId }),\n});\n\napi.get(&quot;/users/:id&quot;, async (ctx) =&gt; {\n  const user = await db.findUser(ctx.params.id);\n  if (!user) throw new HttpError(404, &quot;No such user&quot;);\n  ctx.respond.json(user, { etag: true });\n});\n\napi.post(&quot;/users&quot;, authenticate({ strategies: [bearerAuth({ verify: verifyJwt })] }), async (ctx) =&gt; {\n  // The body is captured at request start, so reading it after awaits is fine.\n  const input = await readJson(ctx.res, ctx.req, { validate: (v) =&gt; UserSchema.parse(v) });\n  ctx.respond.json(await db.createUser(input), { status: 201 });\n});\n\napp.listen(3000, (token) =&gt; token &amp;&amp; logger.info({ port: 3000 }, &quot;listening&quot;));\n</code></pre>\n<p>Errors thrown anywhere in the chain are rendered for you: an <code>HttpError</code> (or a body reader&#39;s 400/413/415/422) becomes its status and a JSON body; anything else becomes a 500 without leaking the message. A route that finishes without responding gets a 404.</p>\n<p>Prefer plain uWS handlers? Every helper also works without the router; see Without the router.</p>\n<p><code>examples/router-app.ts</code> (<code>npm run dev:example-router</code>) is a complete small API using most of the features below.</p>\n<h3>Modules</h3>\n<p>Each module is its own build entry, so importing a subpath pulls in only that code.</p>\n<table><thead><tr><th scope=\"col\">Import path</th><th scope=\"col\">What it provides</th></tr></thead><tbody><tr><td><code>uws-akwaaba</code></td><td>everything below</td></tr><tr><td><code>uws-akwaaba/router</code></td><td><code>createRouter</code>, <code>compose</code>, <code>timeout</code>, <code>authenticate</code>, <code>limit</code>, <code>csrf</code></td></tr><tr><td><code>uws-akwaaba/responder</code></td><td><code>createResponder</code>, <code>withResponder</code>, <code>withSafeResponder</code></td></tr><tr><td><code>uws-akwaaba/body</code></td><td><code>readJson</code>, <code>readText</code>, <code>readUrlencoded</code>, <code>readBuffer</code>, <code>readRawBody</code>, <code>parseUrlencoded</code>, <code>decodeText</code></td></tr><tr><td><code>uws-akwaaba/multipart</code></td><td><code>parseMultipart</code>, <code>parseContentDisposition</code>, <code>getBoundary</code></td></tr><tr><td><code>uws-akwaaba/static</code></td><td><code>serveStatic</code>, <code>resolveSafePath</code></td></tr><tr><td><code>uws-akwaaba/auth-register</code></td><td><code>registerGlobalAuth</code>, <code>bearerAuth</code>, <code>apiKeyAuth</code>, <code>sessionAuth</code>, <code>getAuth</code>, <code>TinyTTLCache</code></td></tr><tr><td><code>uws-akwaaba/rate-limit</code></td><td><code>rateLimit</code>, <code>createRateLimiter</code>, <code>MemoryRateLimitStore</code></td></tr><tr><td><code>uws-akwaaba/cors</code></td><td><code>createCors(config)</code> → <code>{ applyHeaders, preflight }</code></td></tr><tr><td><code>uws-akwaaba/cors-register</code></td><td><code>registerGlobalCors(app, config, opts)</code></td></tr><tr><td><code>uws-akwaaba/cookies</code></td><td><code>parseCookieHeader</code>, <code>serializeCookie</code>, <code>buildCookieHeaders</code>, <code>clearCookie</code>, <code>createCookieSigner</code></td></tr><tr><td><code>uws-akwaaba/security-headers</code></td><td><code>securityHeaders(opts)</code></td></tr><tr><td><code>uws-akwaaba/request-log</code></td><td><code>withRequestLog</code>, <code>getRequestId</code>, <code>jsonLineLogger</code></td></tr><tr><td><code>uws-akwaaba/lifecycle</code></td><td><code>createLifecycle</code> (graceful shutdown)</td></tr><tr><td><code>uws-akwaaba/websocket</code></td><td><code>jsonWebSocket</code>, <code>sendJson</code>, <code>publishJson</code></td></tr><tr><td><code>uws-akwaaba/query</code></td><td><code>parseQuery</code>, <code>queryReader</code></td></tr><tr><td><code>uws-akwaaba/errors</code></td><td><code>HttpError</code>, <code>BadRequestError</code>, <code>PayloadTooLargeError</code>, <code>UnsupportedMediaTypeError</code>, <code>UnprocessableEntityError</code></td></tr><tr><td><code>uws-akwaaba/http</code></td><td><code>Status</code>, <code>reasonPhrase</code>, <code>statusLine</code></td></tr><tr><td><code>uws-akwaaba/file-ops</code></td><td><code>ensureDir</code>, <code>moveFile</code>, <code>copyFile</code>, <code>removeFile</code>, <code>fileHash</code>, <code>hashBuffer</code>, <code>detectMimeFromBytes</code>, <code>safeFilename</code></td></tr></tbody></table>\n<h3>Router and middleware</h3>\n<pre><code class=\"language-ts\">const router = createRouter(app, { prefix: &quot;/api&quot;, trustProxy: false });\nrouter.use(timeout(5_000)); // 503 if nothing responded in time\nrouter.use(limit({ max: 100, windowMs: 60_000 })); // RateLimit-* headers, 429 + Retry-After\nrouter.post(&quot;/transfer&quot;, csrf(), authenticate({ strategies, require: { roles: [&quot;admin&quot;] } }), handler);\n</code></pre>\n<p>Each handler receives a <code>Context</code>:</p>\n<table><thead><tr><th scope=\"col\">Field</th><th scope=\"col\">Description</th></tr></thead><tbody><tr><td><code>ctx.res</code></td><td>the live uWS response (for body readers and streaming)</td></tr><tr><td><code>ctx.req</code></td><td>a snapshot of the request that stays valid after <code>await</code></td></tr><tr><td><code>ctx.respond</code></td><td>the responder (below)</td></tr><tr><td><code>ctx.params</code></td><td>named route parameters, <code>{ id: &quot;42&quot; }</code> for <code>/users/:id</code></td></tr><tr><td><code>ctx.query</code></td><td><code>string/list/number/int/bool</code> accessors over the query string</td></tr><tr><td><code>ctx.state</code></td><td>per-request storage for middleware; starts with <code>ip</code></td></tr></tbody></table>\n<p>Middleware runs onion-style (<code>await next()</code>); calling <code>next()</code> twice is an error. <code>onError</code> and <code>onUnhandled</code> options customise error and 404 responses.</p>\n<h3>Responses</h3>\n<pre><code class=\"language-ts\">const respond = createResponder(res, req, {\n  cors: { origin: [&quot;https://app.example.com&quot;], credentials: true },\n  defaultHeaders: securityHeaders(),\n  compress: true, // brotli/gzip for text-like bodies over 1 KB\n  etag: true, // weak ETag + 304 on If-None-Match\n});\n\nrespond.json({ ok: true }); // 200 application/json\nrespond.text(&quot;pong&quot;, { status: 201 });\nrespond.html(&quot;&lt;h1&gt;Hi&lt;/h1&gt;&quot;);\nrespond.send(pngBytes, &quot;image/png&quot;);\nrespond.redirect(&quot;/login&quot;, 303); // refuses //host, javascript: and CR/LF\nrespond.empty(); // 204\nrespond.error(&quot;Bad input&quot;); // 400 { &quot;error&quot;: &quot;Bad input&quot; }\nrespond.header(&quot;Server-Timing&quot;, &quot;db;dur=12&quot;); // queue a header for whatever is sent later\nrespond.json(data, {\n  cookies: [{ name: &quot;sid&quot;, value: token, options: { httpOnly: true, secure: true, sameSite: &quot;Lax&quot; } }],\n  cors: false, // skip CORS for this response only\n});\nrespond.sent; // true once a response went out; later calls are ignored\n</code></pre>\n<p>The status line is always written first (uWS fixes it at 200 as soon as any header is written), a second response is dropped instead of throwing, and nothing is written to a client that has disconnected.</p>\n<h3>Request bodies</h3>\n<p>All readers enforce <code>maxBytes</code> (default 1 MB), copy uWS&#39;s short-lived buffers, and reject with typed errors (413 too large, 400 malformed, 415 wrong type with <code>strictContentType</code>, 422 failed validation).</p>\n<pre><code class=\"language-ts\">const user = await readJson(res, req, { validate: (v) =&gt; UserSchema.parse(v) }); // zod, valibot, ajv...\nconst form = await readUrlencoded(res, req, { strictContentType: true });\nconst text = await readText(res, req); // any WHATWG charset, e.g. ISO-8859-1\nconst raw = await readBuffer(res, req, { maxBytes: 10 * 1024 * 1024 });\n</code></pre>\n<p>uWS only delivers the body to a handler subscribed during the request callback. The router does this for you; in plain handlers call <code>deferBody(res)</code> first if you need to <code>await</code> before reading.</p>\n<h3>Multipart uploads</h3>\n<pre><code class=\"language-ts\">const { fields, files } = await parseMultipart(res, req, {\n  fileStrategy: &quot;auto&quot;, // &quot;buffer&quot; | &quot;file&quot; | &quot;auto&quot; (spill to disk above bufferFileThreshold)\n  tempDir: &quot;/var/tmp/uploads&quot;,\n  maxBytes: 50 * 1024 * 1024,\n  maxFileSize: 20 * 1024 * 1024,\n  maxFileCount: 5,\n  maxFieldSize: 64 * 1024,\n  allowedMimeTypes: [&quot;image/*&quot;, &quot;application/pdf&quot;],\n});\n// files[i]: { fieldName, filename, mime, size, buffer? , path? }\n</code></pre>\n<p>The parser streams with disk backpressure, enforces every limit as data arrives, sanitises file names (including Windows <code>..\\</code> traversal), resolves only after files are flushed to disk, and deletes the temp files it created when anything fails. It never deletes a file it did not create.</p>\n<h3>Static files</h3>\n<pre><code class=\"language-ts\">const assets = serveStatic(&quot;./public&quot;, { prefix: &quot;/assets&quot;, maxAgeSeconds: 3600, immutable: true });\napp.get(&quot;/assets/*&quot;, assets);\napp.head(&quot;/assets/*&quot;, assets);\n</code></pre>\n<p>Weak ETag + Last-Modified with 304, single byte ranges (206/416, If-Range), HEAD, index files, and streaming through <code>tryEnd</code>/<code>onWritable</code> so slow clients do not buffer whole files in memory. Encoded, backslash and <code>..</code> traversal, NUL bytes and dotfiles are refused.</p>\n<h3>Authentication</h3>\n<p>Inside the router use <code>authenticate(...)</code>. For plain handlers, register rules once for the whole app:</p>\n<pre><code class=\"language-ts\">registerGlobalAuth(app, {\n  default: { handlers: [bearerAuth({ verify: verifyJwt })] },\n  rules: [\n    { match: { prefix: &quot;/public&quot; }, skip: true },\n    { match: { prefix: &quot;/admin&quot; }, require: { roles: [&quot;admin&quot;] } },\n    { match: { prefix: &quot;/ingest&quot; }, handlers: [apiKeyAuth({ lookup: findKey })] },\n  ],\n  cache: { enabled: true, ttlMs: 5000 },\n});\n\napp.get(&quot;/me&quot;, (res) =&gt; {\n  const auth = getAuth(res); // { user, claims, token }\n});\n</code></pre>\n<p>Rules match exact path first, then longest prefix, then regex. Strategies may be async; the registrar keeps the request usable for your handler and turns a throwing strategy into a 500. Role and scope policies apply to cached tokens too.</p>\n<h3>Rate limiting, CSRF, cookies and headers</h3>\n<pre><code class=\"language-ts\">app.post(&quot;/login&quot;, rateLimit(loginHandler, { max: 5, windowMs: 60_000 }));\n\nconst signer = createCookieSigner([process.env.COOKIE_SECRET!, process.env.OLD_COOKIE_SECRET!]);\nconst value = signer.sign(&quot;user:42&quot;); // &quot;user:42.&lt;hmac&gt;&quot;\nsigner.unsign(value); // &quot;user:42&quot;, or undefined if tampered\n\nbuildCookieHeaders([{ name: &quot;sid&quot;, value, options: { httpOnly: true, csrfToken: createCsrfToken() } }]);\n\nsecurityHeaders({ strictTransportSecurity: { maxAgeSeconds: 31_536_000 } });\n</code></pre>\n<p><code>clientIp(res, req, { trustProxy })</code> uses the socket address unless you explicitly trust <code>X-Forwarded-For</code>. Set <code>trustProxy: true</code> behind one reverse proxy you control, or the number of chained proxies (<code>trustProxy: 2</code>); the client address is read that many entries from the right, so values a client puts in the header itself are ignored.</p>\n<h3>Logging, error tracking and shutdown</h3>\n<p>The library writes no logs of its own; you choose where entries go. With the router, pass <code>requestLog</code> and every route gets an access log and a request id (echoed as <code>X-Request-Id</code>, available as <code>ctx.state.requestId</code>). <code>onException</code> receives unexpected errors (not 4xx <code>HttpError</code>s, not client aborts) before they are rendered, which is where an error tracker belongs.</p>\n<pre><code class=\"language-ts\">import pino from &quot;pino&quot;;\nimport * as Sentry from &quot;@sentry/node&quot;;\n\nconst logger = pino();\ncreateRouter(app, {\n  requestLog: { log: structuredLogger(logger) }, // 5xx/aborted -&gt; error, 4xx -&gt; warn, else info\n  onException: (err, ctx) =&gt; Sentry.captureException(err, { tags: { route: ctx.route } }),\n});\n</code></pre>\n<p><code>structuredLogger</code> accepts anything with pino-style <code>info/warn/error(object, message)</code> methods; <code>jsonLineLogger</code> writes JSON lines to stdout with no dependency. Outside the router, wrap individual handlers:</p>\n<pre><code class=\"language-ts\">app.get(&quot;/files/*&quot;, withRequestLog(serveStatic(&quot;./files&quot;, { prefix: &quot;/files&quot; }), { log: jsonLineLogger }));\n// {&quot;time&quot;:&quot;…&quot;,&quot;id&quot;:&quot;3f7d…&quot;,&quot;method&quot;:&quot;GET&quot;,&quot;url&quot;:&quot;/files/a.pdf&quot;,&quot;status&quot;:200,&quot;durationMs&quot;:5.3,&quot;bytes&quot;:35,&quot;aborted&quot;:false}\n\nconst life = createLifecycle();\napp.get(&quot;/work&quot;, life.track(handler));\nawait life.listen(app, 3000);\nprocess.once(&quot;SIGTERM&quot;, async () =&gt; {\n  await life.shutdown({ timeoutMs: 15_000 }); // stop accepting, drain in-flight, then close\n  process.exit(0);\n});\n</code></pre>\n<h4>Error tracking</h4>\n<p><code>onException(err, ctx)</code> is the contract for error trackers. It is called once per request, with the original error, for anything that is not a 4xx <code>HttpError</code> or a client abort, and before the response is rendered; <code>ctx.route</code> and <code>ctx.state.requestId</code> identify the request. The client still gets the generic 500 body (the message is never leaked), and an exception thrown by the reporter itself is ignored. These guarantees are covered by <code>tests/integration/routerObservability.int.test.ts</code>.</p>\n<pre><code class=\"language-ts\">createRouter(app, {\n  requestLog: { log: structuredLogger(logger) },\n  onException: (err, ctx) =&gt;\n    Sentry.captureException(err, { tags: { route: ctx.route }, extra: { requestId: ctx.state.requestId } }),\n});\n</code></pre>\n<h3>Production notes</h3>\n<ul><li><strong>Graceful shutdown.</strong> Wrap routes with <code>createLifecycle().track(...)</code> and call <code>shutdown({ timeoutMs })</code> on <code>SIGTERM</code>, so in-flight requests finish before the process exits.</li><li><strong>Health route.</strong> A cheap route such as <code>api.get(&quot;/health&quot;, ...)</code> (see <code>examples/router-app.ts</code>) gives monitoring something to call.</li><li><strong>Client addresses.</strong> Set <code>trustProxy</code> to the number of trusted proxies in front of the app (<code>true</code> for one) so <code>ctx.state.ip</code> and <code>rateLimit</code> see the real client; leave it off otherwise.</li><li><strong>Logs and errors.</strong> Pass <code>requestLog</code> (with <code>jsonLineLogger</code> or <code>structuredLogger(pino())</code>) and <code>onException</code> to the router.</li><li><strong>Configuration.</strong> The library reads no environment variables; you pass every option in code.</li></ul>\n<h3>WebSockets</h3>\n<pre><code class=\"language-ts\">app.ws(\n  &quot;/chat&quot;,\n  jsonWebSocket&lt;{ name: string }, { text: string }&gt;({\n    validate: (v) =&gt; MessageSchema.parse(v),\n    open: (ws) =&gt; ws.subscribe(&quot;room&quot;),\n    onMessage: (ws, msg) =&gt; publishJson(app, &quot;room&quot;, { text: msg.text }),\n  }),\n);\n</code></pre>\n<p>Invalid JSON, binary frames and handler errors are reported to the client (or your <code>onError</code>) instead of crashing.</p>\n<h3>Without the router</h3>\n<pre><code class=\"language-ts\">app.post(\n  &quot;/echo&quot;,\n  withResponder(async (respond, req, res) =&gt; {\n    const body = await readJson(res, req, { maxBytes: 64 * 1024 });\n    respond.json(body, { status: 201 });\n  }),\n);\n</code></pre>\n<p><code>withResponder</code> installs the abort guard, reads the headers it needs up front, and renders thrown errors like the router does (<code>onError</code> to customise). <code>registerGlobalCors(app, config)</code> applies CORS to every route registered after it.</p>\n<h3>Architecture</h3>\n<p>uws-akwaaba is a library: every module is a function or factory that you call from your own uWebSockets.js app, and nothing runs on import. The layout:</p>\n<pre><code>src/\n  index.ts             public entry: re-exports only\n  router.ts            createRouter, compose, Context\n  router/middleware.ts timeout, authenticate, limit, csrf\n  responder.ts         createResponder, withResponder, withSafeResponder\n  body.ts              body readers with limits, validation and typed errors\n  multipart.ts         streaming multipart/form-data state machine\n  multipart/           header parsing, FileSink (disk writes), public types\n  static.ts            serveStatic with conditional/range requests\n  auth-register.ts     rule-based auth registrar\n  auth/                types, TTL cache, rule matching, strategies\n  rate-limit.ts        fixed-window limiter, store, route wrapper\n  request-log.ts       request ids and access logging\n  lifecycle.ts         graceful shutdown\n  websocket.ts         JSON WebSocket behaviour\n  errors.ts            HttpError and friends\n  cors.ts, cors-register.ts, cookies.ts, signed-cookies.ts, csrf.ts,\n  security-headers.ts, query.ts, http.ts, types.ts\n  utils/               abort fan-out, request snapshots, deferBody, client IP,\n                       compression, range parsing, MIME types, file helpers\nexamples/              runnable servers, one per feature (not part of the package)\n  docker/              optional isolated environment for the checks and examples\ntests/                 unit suites mirroring src/, plus tests/integration which\n                       runs everything against a real uWS server on a random port\n</code></pre>\n<p>Three small mechanisms carry most of the uWS-specific safety:</p>\n<ul><li><code>utils/abort.ts</code> owns the single <code>onAborted</code> registration uWS allows per response and fans it out, so readers, the responder and the parser never displace each other.</li><li><code>utils/request-snapshot.ts</code> copies a request (all headers, URL, method, query, params) so it can be used after <code>await</code>.</li><li><code>utils/defer-body.ts</code> captures the body at request start and pauses the socket until a reader asks for it.</li></ul>\n<h3>Development</h3>\n<pre><code class=\"language-bash\">git clone https://github.com/DERRICK-TORKORNOO/uws-akwaaba.git\ncd uws-akwaaba\nnpm ci\nnpm test               # unit + integration tests\nnpm run test:coverage  # with coverage thresholds (what CI runs)\nnpm run lint           # eslint\nnpm run format:check   # prettier\nnpm run typecheck      # tsc\nnpm run build          # ESM + CJS + .d.ts into dist/\n</code></pre>\n<p>Run an example (see <code>package.json</code> for the full list; set <code>PORT</code> or <code>TEMP_DIR</code> to change the port or upload directory, as listed in <code>examples/.env.example</code>):</p>\n<pre><code class=\"language-bash\">npm run dev:example-router\n</code></pre>\n<p>A devcontainer configuration is included for VS Code and Codespaces, and <code>examples/docker</code> can run the checks and examples in an isolated environment.</p>\n<p>See CONTRIBUTING.md for the workflow and CHANGELOG.md for release notes.</p>\n<h3>License</h3>\n<p>MIT © Derrick Mensah Torkornoo</p>","dependencies":[],"licence":{"spdx":"MIT","verdict":"pass"},"scan":{"verdict":"pass","scanner_version":"2026.10.1","at":"2026-11-02T09:33:44.898Z","checks":[{"id":"secrets","tool":"x402git/secrets","tool_version":"2026.10.1","status":"pass","at":"2026-11-02T09:33:44.898Z","findings":0},{"id":"limits","tool":"x402git/limits","tool_version":"2026.10.1","status":"pass","at":"2026-11-02T09:33:44.898Z","findings":0},{"id":"known_vulns","tool":"osv.dev","tool_version":"2026-11-07","status":"findings","at":"2026-11-07T04:00:55.394Z","findings":2,"packages":317},{"id":"known_malware","tool":"osv.dev/MAL","tool_version":"2026-11-07","status":"pass","at":"2026-11-07T04:00:55.394Z","findings":0,"packages":317},{"id":"dep_behaviour","tool":"socket.dev","tool_version":"2026-11-02","status":"findings","at":"2026-11-02T09:33:44.898Z","findings":549,"packages":317},{"id":"capabilities","tool":"x402git/caps","tool_version":"2026.09.1","status":"findings","at":"2026-11-02T09:33:44.898Z","findings":30},{"id":"injection","tool":"x402git/inject","tool_version":"2026.10.1","status":"pass","at":"2026-11-02T09:33:44.898Z","findings":0}],"findings":[{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"workflow","severity":"MODERATE","description":"A GitHub Actions workflow runs on push, pull_request, workflow_dispatch","path":".github/workflows/ci.yml"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"workflow","severity":"MODERATE","description":"A GitHub Actions workflow runs on push","path":".github/workflows/release.yml"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to a","path":"tests/multipart/parsing.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to a.com","path":"tests/cors/preflight.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to allowed.com","path":"tests/responder/createResponder.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to app.akwaabahr.com","path":"examples/cors-variant.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to app.com","path":"tests/cors/registerGlobalCors.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to app.example.com","path":"tests/responder/asyncSafety.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to b.com","path":"tests/cors/preflight.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to eslint.org","path":"package-lock.json"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to evil.com","path":"tests/cors/createCors.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to example.com","path":"tests/responder/moreResponses.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to facial.akwaabahr.com","path":"tests/cors/createCors.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to foo.com","path":"tests/responder/createResponder.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to github.com","path":"package-lock.json"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to given.example.com","path":"tests/responder/asyncSafety.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to header.example.com","path":"tests/responder/asyncSafety.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to opencollective.com","path":"package-lock.json"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to paulmillr.com","path":"package-lock.json"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to registry.npmjs.org","path":"package-lock.json"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to tidelift.com","path":"package-lock.json"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"host","severity":"LOW","description":"Talks to x.com","path":"tests/integration/responder.int.test.ts"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"env","severity":"LOW","description":"Reads the environment variable COMPOSE_FILE","path":".github/workflows/ci.yml"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"env","severity":"LOW","description":"Reads the environment variable COOKIE_SECRET","path":"README.md"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"env","severity":"LOW","description":"Reads the environment variable GH_TOKEN","path":".github/workflows/release.yml"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"env","severity":"LOW","description":"Reads the environment variable GITHUB_REF_NAME","path":".github/workflows/release.yml"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"env","severity":"LOW","description":"Reads the environment variable GITHUB_TOKEN","path":".github/workflows/release.yml"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"env","severity":"LOW","description":"Reads the environment variable OLD_COOKIE_SECRET","path":"README.md"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"env","severity":"LOW","description":"Reads the environment variable PORT","path":"examples/docker/docker-compose.yml"},{"kind":"capability","check":"capabilities","tier":"disclosed","rule_id":"env","severity":"LOW","description":"Reads the environment variable TEMP_DIR","path":"examples/env.ts"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"@vitest/coverage-istanbul 5.0.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"@vitest/coverage-istanbul","version":"5.0.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"@vitest/coverage-istanbul 5.0.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"@vitest/coverage-istanbul","version":"5.0.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"@vitest/coverage-istanbul 5.0.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"@vitest/coverage-istanbul","version":"5.0.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"@vitest/coverage-istanbul 5.0.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"@vitest/coverage-istanbul","version":"5.0.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"deprecated","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — deprecated by its author","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"dynamicRequire","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — loads modules by a computed name","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"dynamicRequire","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — loads modules by a computed name","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"dynamicRequire","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — loads modules by a computed name","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"urlStrings","severity":"LOW","description":"eslint 9.39.5 (direct, dev only) — contains hard-coded URLs","package":{"ecosystem":"npm","name":"eslint","version":"9.39.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"eslint-config-prettier 10.1.8 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"eslint-config-prettier","version":"10.1.8","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"urlStrings","severity":"LOW","description":"eslint-config-prettier 10.1.8 (direct, dev only) — contains hard-coded URLs","package":{"ecosystem":"npm","name":"eslint-config-prettier","version":"10.1.8","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"review","rule_id":"gptAnomaly","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — flagged for review by Socket's classifier as anomalous","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — ships minified code with no source","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — ships minified code with no source","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — ships minified code with no source","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — ships minified code with no source","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — ships minified code with no source","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — ships minified code with no source","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — ships minified code with no source","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — ships minified code with no source","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — ships minified code with no source","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — ships minified code with no source","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — ships minified code with no source","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — ships minified code with no source","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"urlStrings","severity":"LOW","description":"prettier 3.9.10 (direct, dev only) — contains hard-coded URLs","package":{"ecosystem":"npm","name":"prettier","version":"3.9.10","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"review","rule_id":"gptAnomaly","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — flagged for review by Socket's classifier as anomalous","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"review","rule_id":"gptAnomaly","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — flagged for review by Socket's classifier as anomalous","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — can attach a debugger","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"dynamicRequire","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — loads modules by a computed name","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"dynamicRequire","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — loads modules by a computed name","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"dynamicRequire","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — loads modules by a computed name","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"urlStrings","severity":"LOW","description":"ts-node 10.9.2 (direct, dev only) — contains hard-coded URLs","package":{"ecosystem":"npm","name":"ts-node","version":"10.9.2","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"review","rule_id":"gptAnomaly","severity":"LOW","description":"tsup 8.5.1 (direct, dev only) — flagged for review by Socket's classifier as anomalous","package":{"ecosystem":"npm","name":"tsup","version":"8.5.1","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"review","rule_id":"gptAnomaly","severity":"LOW","description":"tsup 8.5.1 (direct, dev only) — flagged for review by Socket's classifier as anomalous","package":{"ecosystem":"npm","name":"tsup","version":"8.5.1","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"tsup 8.5.1 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"tsup","version":"8.5.1","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"tsup 8.5.1 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"tsup","version":"8.5.1","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"tsup 8.5.1 (direct, dev only) — reads or writes files","package":{"ecosystem":"npm","name":"tsup","version":"8.5.1","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"usesEval","severity":"MODERATE","description":"tsup 8.5.1 (direct, dev only) — evaluates code at runtime","package":{"ecosystem":"npm","name":"tsup","version":"8.5.1","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"urlStrings","severity":"LOW","description":"tsup 8.5.1 (direct, dev only) — contains hard-coded URLs","package":{"ecosystem":"npm","name":"tsup","version":"8.5.1","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"urlStrings","severity":"LOW","description":"typescript-eslint 8.72.1 (direct, dev only) — contains hard-coded URLs","package":{"ecosystem":"npm","name":"typescript-eslint","version":"8.72.1","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"vitest 5.0.5 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"vitest","version":"5.0.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"vitest 5.0.5 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"vitest","version":"5.0.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"vitest 5.0.5 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"vitest","version":"5.0.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"vitest 5.0.5 (direct, dev only) — reads environment variables","package":{"ecosystem":"npm","name":"vitest","version":"5.0.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"networkAccess","severity":"MODERATE","description":"vitest 5.0.5 (direct, dev only) — makes network requests at runtime","package":{"ecosystem":"npm","name":"vitest","version":"5.0.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"urlStrings","severity":"LOW","description":"vitest 5.0.5 (direct, dev only) — contains hard-coded URLs","package":{"ecosystem":"npm","name":"vitest","version":"5.0.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"usesEval","severity":"MODERATE","description":"vitest 5.0.5 (direct, dev only) — evaluates code at runtime","package":{"ecosystem":"npm","name":"vitest","version":"5.0.5","direct":true,"dev":true},"source":"socket.dev"},{"kind":"vulnerability","check":"known_vulns","tier":"disclosed","rule_id":"GHSA-g7r4-m6w7-qqqr","severity":"LOW","description":"esbuild@0.27.7 (npm): esbuild allows arbitrary file read when running the development server on Windows","package":{"ecosystem":"npm","name":"esbuild","version":"0.27.7"},"advisory_ids":["GHSA-g7r4-m6w7-qqqr"],"source":"osv.dev"},{"kind":"vulnerability","check":"known_vulns","tier":"disclosed","rule_id":"GHSA-g3hv-75wg-m249","severity":"MODERATE","description":"minimatch@10.2.6 (npm): minimatch has potential denial of service via globparts amplification","package":{"ecosystem":"npm","name":"minimatch","version":"10.2.6"},"advisory_ids":["GHSA-g3hv-75wg-m249","CVE-2026-118764"],"source":"osv.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"newAuthor","severity":"LOW","description":"convert-source-map 2.0.0 (transitive, dev only) — published by an author new to this package","package":{"ecosystem":"npm","name":"convert-source-map","version":"2.0.0","direct":false,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"review","rule_id":"potentialVulnerability","severity":"MODERATE","description":"es-module-lexer 2.3.2 (transitive, dev only) — flagged for review as a possible vulnerability","package":{"ecosystem":"npm","name":"es-module-lexer","version":"2.3.2","direct":false,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"installScripts","severity":"MODERATE","description":"esbuild 0.27.7 (transitive, dev only) — install scripts run when installed","package":{"ecosystem":"npm","name":"esbuild","version":"0.27.7","direct":false,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"review","rule_id":"gptSecurity","severity":"MODERATE","description":"load-tsconfig 0.2.5 (transitive, dev only) — flagged for review by Socket's classifier as a security risk","package":{"ecosystem":"npm","name":"load-tsconfig","version":"0.2.5","direct":false,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"review","rule_id":"gptSecurity","severity":"MODERATE","description":"load-tsconfig 0.2.5 (transitive, dev only) — flagged for review by Socket's classifier as a security risk","package":{"ecosystem":"npm","name":"load-tsconfig","version":"0.2.5","direct":false,"dev":true},"source":"socket.dev"},{"kind":"behaviour","check":"dep_behaviour","tier":"review","rule_id":"gptDidYouMean","severity":"MODERATE","description":"flagged for review by Socket's classifier in 2 transitive packages","source":"socket.dev","aggregate":{"packages":2,"examples":["obug@2.2.1","obug@3.0.0"]}},{"kind":"behaviour","check":"dep_behaviour","tier":"review","rule_id":"gptAnomaly","severity":"LOW","description":"flagged for review by Socket's classifier in 18 transitive packages","source":"socket.dev","aggregate":{"packages":18,"examples":["@cspotcode/source-map-support@0.8.1","ajv@6.15.0","any-promise@1.3.0"]}},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"shellAccess","severity":"MODERATE","description":"shellAccess in 10 transitive packages","source":"socket.dev","aggregate":{"packages":10,"examples":["commander@4.1.1","cross-spawn@7.0.6","detect-libc@2.1.2"]}},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"usesEval","severity":"MODERATE","description":"usesEval in 5 transitive packages","source":"socket.dev","aggregate":{"packages":5,"examples":["@babel/traverse@8.0.10","ajv@6.15.0","lodash.merge@4.6.2"]}},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"networkAccess","severity":"MODERATE","description":"networkAccess in 3 transitive packages","source":"socket.dev","aggregate":{"packages":3,"examples":["esbuild@0.27.7","mz@2.7.0","rollup@4.66.0"]}},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"unmaintained","severity":"LOW","description":"unmaintained in 40 transitive packages","source":"socket.dev","aggregate":{"packages":40,"examples":["acorn-jsx@5.3.2","any-promise@1.3.0","create-require@1.1.1"]}},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"filesystemAccess","severity":"LOW","description":"filesystemAccess in 38 transitive packages","source":"socket.dev","aggregate":{"packages":38,"examples":["@cspotcode/source-map-support@0.8.1","@eslint/eslintrc@3.3.7","argparse@2.0.1"]}},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"envVars","severity":"LOW","description":"envVars in 29 transitive packages","source":"socket.dev","aggregate":{"packages":29,"examples":["@babel/core@8.0.10","@babel/helper-compilation-targets@8.0.7","minimatch@10.2.6"]}},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"urlStrings","severity":"LOW","description":"urlStrings in 25 transitive packages","source":"socket.dev","aggregate":{"packages":25,"examples":["@babel/core@8.0.10","@babel/helpers@8.0.10","@eslint/eslintrc@3.3.7"]}},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"debugAccess","severity":"LOW","description":"debugAccess in 16 transitive packages","source":"socket.dev","aggregate":{"packages":16,"examples":["@eslint/eslintrc@3.3.7","@humanwhocodes/module-importer@1.0.1","bundle-require@5.1.0"]}},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"dynamicRequire","severity":"LOW","description":"dynamicRequire in 10 transitive packages","source":"socket.dev","aggregate":{"packages":10,"examples":["@cspotcode/source-map-support@0.8.1","browserslist@4.29.5","esbuild@0.27.7"]}},{"kind":"behaviour","check":"dep_behaviour","tier":"disclosed","rule_id":"minifiedFile","severity":"LOW","description":"minifiedFile in 6 transitive packages","source":"socket.dev","aggregate":{"packages":6,"examples":["baseline-browser-mapping@2.11.34","confbox@0.1.8","es-module-lexer@2.3.2"]}}],"capabilities":{"tools":[],"runs":[{"path":".github/workflows/ci.yml","kind":"workflow","detail":"push, pull_request, workflow_dispatch"},{"path":".github/workflows/release.yml","kind":"workflow","detail":"push"}],"hosts":[{"host":"127.0.0.1","local":true,"from":"code","paths":["examples/docker/docker-compose.yml","tests/integration/lifecycle.int.test.ts","tests/utils/server.ts"]},{"host":"a","local":false,"from":"code","paths":["tests/multipart/parsing.test.ts"]},{"host":"a.com","local":false,"from":"code","paths":["tests/cors/preflight.test.ts","tests/responder/createResponder.test.ts"]},{"host":"allowed.com","local":false,"from":"code","paths":["tests/responder/createResponder.test.ts"]},{"host":"app.akwaabahr.com","local":false,"from":"code","paths":["examples/cors-variant.ts","tests/body/readJson.flow.test.ts","tests/cors/createCors.test.ts"]},{"host":"app.com","local":false,"from":"code","paths":["tests/cors/registerGlobalCors.test.ts"]},{"host":"app.example.com","local":false,"from":"code","paths":["tests/responder/asyncSafety.test.ts"]},{"host":"b.com","local":false,"from":"code","paths":["tests/cors/preflight.test.ts"]},{"host":"eslint.org","local":false,"from":"code","paths":["package-lock.json"]},{"host":"evil.com","local":false,"from":"code","paths":["tests/cors/createCors.test.ts","tests/cors/preflight.test.ts","tests/cors/registerGlobalCors.test.ts"]},{"host":"example.com","local":false,"from":"code","paths":["tests/responder/moreResponses.test.ts"]},{"host":"facial.akwaabahr.com","local":false,"from":"code","paths":["tests/cors/createCors.test.ts","tests/responder/withResponder.integration.test.ts"]},{"host":"foo.com","local":false,"from":"code","paths":["tests/responder/createResponder.test.ts"]},{"host":"github.com","local":false,"from":"code","paths":["package-lock.json","package.json"]},{"host":"given.example.com","local":false,"from":"code","paths":["tests/responder/asyncSafety.test.ts"]},{"host":"header.example.com","local":false,"from":"code","paths":["tests/responder/asyncSafety.test.ts"]},{"host":"localhost","local":true,"from":"code","paths":["examples/auth-basic.ts","examples/auth-cache.ts","examples/auth-mixed.ts","examples/auth-policies.ts","examples/auth-token-schemes.ts"]},{"host":"localhost:3000","local":true,"from":"code","paths":[".github/workflows/ci.yml","examples/cors-global.ts","examples/cors-variant.ts","examples/docker/docker-compose.yml","examples/server.ts"]},{"host":"localhost:3009","local":true,"from":"code","paths":["examples/auth-token-schemes.ts"]},{"host":"localhost:3010","local":true,"from":"code","paths":["examples/router-app.ts"]},{"host":"localhost:5173","local":true,"from":"code","paths":["examples/cors-global.ts","examples/cors-variant.ts","examples/server.ts"]},{"host":"opencollective.com","local":false,"from":"code","paths":["package-lock.json"]},{"host":"paulmillr.com","local":false,"from":"code","paths":["package-lock.json"]},{"host":"registry.npmjs.org","local":false,"from":"code","paths":["package-lock.json"]},{"host":"tidelift.com","local":false,"from":"code","paths":["package-lock.json"]},{"host":"x.com","local":false,"from":"code","paths":["tests/integration/responder.int.test.ts"]},{"host":"app.example.com","local":false,"from":"docs","paths":["README.md"]},{"host":"github.com","local":false,"from":"docs","paths":["README.md"]},{"host":"keepachangelog.com","local":false,"from":"docs","paths":["CHANGELOG.md"]},{"host":"localhost:3000","local":true,"from":"docs","paths":["examples/docker/README.md"]},{"host":"semver.org","local":false,"from":"docs","paths":["CHANGELOG.md"]},{"host":"www.conventionalcommits.org","local":false,"from":"docs","paths":["CONTRIBUTING.md"]}],"env":[{"name":"COMPOSE_FILE","paths":[".github/workflows/ci.yml"]},{"name":"COOKIE_SECRET","paths":["README.md"]},{"name":"GH_TOKEN","paths":[".github/workflows/release.yml"]},{"name":"GITHUB_REF_NAME","paths":[".github/workflows/release.yml"]},{"name":"GITHUB_TOKEN","paths":[".github/workflows/release.yml"]},{"name":"OLD_COOKIE_SECRET","paths":["README.md"]},{"name":"PORT","paths":["examples/docker/docker-compose.yml","examples/env.ts"]},{"name":"TEMP_DIR","paths":["examples/env.ts"]}],"install_runs":false,"summary":"runs 2 workflows · talks to 26 hosts · links to 6 hosts in its docs · reads 8 environment variables · nothing runs at install"},"counts":{"blocking":0,"disclosed":547,"review":34},"advisories_refreshed_at":"2026-11-07T04:00:55.394Z"},"cadence_sentence":"One release so far.","originality":{"blob_overlap_ratio":0,"blobs_seen_elsewhere":0,"blobs_total":138,"nearest_listing":null,"derivative_of":null},"engineering":{"unique_5gram_ratio":0.444,"type_token_ratio":0.297,"effective_code_lines":4156,"effective_doc_words":3665,"code_files":119,"test_files":63,"padding_suspected":true,"class_note":"Capped at Pack: unique 5-gram ratio 0.444 is below the 0.6 guard."},"cadence":{"releases":1,"median_days_between_releases":null,"on_time_fraction":null,"days_since_last":0,"score":null,"finished":false},"inventory_sentence":"42 source files · 63 test files · 19 examples · 4 docs","extensions":{"js":1,"md":4,"ts":118,"yml":4,"json":5,"(none)":5,"example":1,"dockerignore":1},"lines_of_code":9365,"warnings":["sbom_unavailable"],"repo_meta":{"repo_id":1442761169,"name":"uws-boost","full_name":"DERRICK-TORKORNOO/uws-boost","description":"Lightweight TypeScript web framework and toolkit for building HTTP APIs on uWebSockets.js","homepage":null,"topics":[],"language":"TypeScript","default_branch":"main","size_kb":0,"created_at":"2026-11-02T09:29:28Z","pushed_at":"2026-11-02T09:31:26Z","licence_spdx":"MIT","open_issues":null,"stars":null,"forks":null,"watchers":null,"archived":false,"private":true,"html_url":null},"owner":{"login":"DERRICK-TORKORNOO","name":"MENSAH TORKORNOO DERRICK","avatar_url":"https://avatars.githubusercontent.com/u/116164431?v=4","bio":"I AM A FULL STACK WEB DEVELOPER","blog":null,"company":null,"location":null,"twitter_username":null,"followers":2,"public_repos":4,"created_at":"2022-10-19T10:30:05Z","html_url":"https://github.com/DERRICK-TORKORNOO"},"computed_at":"2026-11-02T09:34:01.734Z","analyzer_version":"0.1.0"},"self_reported":{"description":"Zero-dependency, high-performance HTTP toolkit and router for uWebSockets.js with native TypeScript support, validation, and request parsing.","trigger_hint":"When building lightning-fast Node.js microservices or APIs requiring maximum throughput and minimal overhead."}}