@niledatabase/express 5.0.0-alpha.16 → 5.0.0-alpha.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,13 +1,13 @@
1
- import * as _niledatabase_server from '@niledatabase/server';
2
- import { Server } from '@niledatabase/server';
3
- import { Request, Response, NextFunction } from 'express';
1
+ import { Server, ExtensionState } from '@niledatabase/server';
2
+ import { Express, Request, Response, NextFunction } from 'express';
4
3
 
5
4
  declare function cleaner(val: string): string;
6
- declare const express: (instance: Server) => {
5
+ declare function express(app?: Express): (instance: Server) => {
7
6
  id: string;
8
- onSetContext: (req: Request, res: Response, next: NextFunction) => void;
7
+ onSetContext: (req: unknown, _res: unknown, next: unknown) => void;
8
+ onGetContext: () => {};
9
9
  onConfigure: () => void;
10
- onHandleRequest: (req: Request, res: Response) => Promise<_niledatabase_server.RouteReturn>;
10
+ onHandleRequest: (req: Request, res: Response, next: NextFunction) => Promise<void | ExtensionState.onHandleRequest>;
11
11
  };
12
12
 
13
13
  export { cleaner, express };
package/dist/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- import * as _niledatabase_server from '@niledatabase/server';
2
- import { Server } from '@niledatabase/server';
3
- import { Request, Response, NextFunction } from 'express';
1
+ import { Server, ExtensionState } from '@niledatabase/server';
2
+ import { Express, Request, Response, NextFunction } from 'express';
4
3
 
5
4
  declare function cleaner(val: string): string;
6
- declare const express: (instance: Server) => {
5
+ declare function express(app?: Express): (instance: Server) => {
7
6
  id: string;
8
- onSetContext: (req: Request, res: Response, next: NextFunction) => void;
7
+ onSetContext: (req: unknown, _res: unknown, next: unknown) => void;
8
+ onGetContext: () => {};
9
9
  onConfigure: () => void;
10
- onHandleRequest: (req: Request, res: Response) => Promise<_niledatabase_server.RouteReturn>;
10
+ onHandleRequest: (req: Request, res: Response, next: NextFunction) => Promise<void | ExtensionState.onHandleRequest>;
11
11
  };
12
12
 
13
13
  export { cleaner, express };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var x=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var m=(s,n)=>{for(var o in n)x(s,o,{get:n[o],enumerable:!0})},S=(s,n,o,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of y(n))!w.call(s,t)&&t!==o&&x(s,t,{get:()=>n[t],enumerable:!(e=R(n,t))||e.enumerable});return s};var T=s=>S(x({},"__esModule",{value:!0}),s);var C={};m(C,{cleaner:()=>h,express:()=>b});module.exports=T(C);var g=require("@niledatabase/server");function h(s){return s.replaceAll(/\{([^}]+)\}/g,":$1")}var b=s=>{let{error:n,debug:o}=s.logger("[EXTENSION][express]");return{id:"express",onSetContext:(e,t,a)=>{e.params.tenantId&&s.setContext({tenantId:e.params.tenantId}),e.headers&&s.setContext(e.headers),e instanceof Headers&&s.setContext(e),typeof a=="function"&&a()},onConfigure:()=>{let{paths:e}=s,t={get:e.get.map(h),post:e.post.map(h),put:e.put.map(h),delete:e.delete.map(h)};o(`paths configured ${JSON.stringify(t)}`),s.paths=t},onHandleRequest:async(e,t)=>{if(e instanceof Request)return o("using default response"),await s.handlers[e.method](e,{disableExtensions:["express"]});o("handling response"),s.setContext(e.headers);let a=e.protocol+"://"+e.get("host")+e.originalUrl;try{new URL(a)}catch{throw new Error("Invalid URL sent for handle request. Are you running express?")}let{method:f}=e,u={method:f,headers:new Headers};"headers"in e&&typeof e.headers=="object"&&e.headers&&"cookie"in e.headers&&typeof e.headers.cookie=="string"&&u.headers.set("cookie",e.headers.cookie),"body"in e&&(f==="POST"||f==="PUT")&&(u.body=JSON.stringify(e.body));let E=new Request(a,u);o(`[${f.toUpperCase()}]proxy request converted to ${a} with ${JSON.stringify(u)}`);let d=null;try{d=await s.handlers[e.method](E,{disableExtensions:["express"]})}catch(r){n(r)}let c;try{c=await(await d.clone()).json()}catch{c=await d.text()}let i={};return d.headers.forEach((r,p)=>{if(!["content-length","transfer-encoding"].includes(p.toLowerCase()))if(i[p]){let l=i[p];Array.isArray(l)?i[p]=[...l,r]:i[p]=[l,r]}else i[p]=r}),t.headersSent||(o("sending response"),t.status(d.status).set(i),typeof c=="string"?t.send(c):t.json(c??{})),g.ExtensionState.onHandleRequest}}};0&&(module.exports={cleaner,express});
1
+ "use strict";var y=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var O=(s,o)=>{for(var r in o)y(s,r,{get:o[r],enumerable:!0})},U=(s,o,r,E)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of P(o))!b.call(s,t)&&t!==r&&y(s,t,{get:()=>o[t],enumerable:!(E=N(o,t))||E.enumerable});return s};var C=s=>U(y({},"__esModule",{value:!0}),s);var L={};O(L,{cleaner:()=>h,express:()=>I});module.exports=C(L);var m=require("async_hooks"),S=require("@niledatabase/server");function h(s){return s.replaceAll(/\{([^}]+)\}/g,":$1")}var w=new m.AsyncLocalStorage;function I(s){let o=!1;return r=>{let{error:E,debug:t}=r.logger("[EXTENSION][express]"),p=e=>{w.getStore()?.set("context",e),r.setContext(e)};function T(e){s&&(t("routes configured"),s.get(e.paths.get,e.handlers.GET),s.post(e.paths.post,e.handlers.POST),s.put(e.paths.put,e.handlers.PUT),s.delete(e.paths.delete,e.handlers.DELETE))}return!o&&s&&(t("initializing express extension with middleware"),s.use((e,a,i)=>{w.run(new Map,()=>i())}),s.param("tenantId",(e,a,i,n)=>{t(`tenantId param set: ${n}`),p({tenantId:n}),i()}),s.use((e,a,i)=>{let n=typeof e=="object"&&"headers"in e&&e.headers||{};p(n),i()})),o=!0,{id:"express",onSetContext:(e,a,i)=>{let n=e;n?.params?.tenantId&&p({tenantId:n.params.tenantId}),n?.headers&&p(n.headers),e instanceof Headers&&p(e),typeof i=="function"&&i()},onGetContext:()=>w.getStore()?.get("context")??{},onConfigure:()=>{let{paths:e}=r,a={get:e.get.map(h),post:e.post.map(h),put:e.put.map(h),delete:e.delete.map(h)};t(`paths configured ${JSON.stringify(a)}`),r.paths=a,T(r)},onHandleRequest:async(e,a,i)=>{t("handling response");let n=e.protocol+"://"+e.get("host")+e.originalUrl;try{new URL(n)}catch{throw new Error("Invalid URL \u2014 are you running Express?")}let g=e.method,f={method:g,headers:new Headers};e.headers?.cookie&&f.headers.set("cookie",e.headers.cookie),["POST","PUT"].includes(g)&&e.body&&(f.body=JSON.stringify(e.body));let H=new Request(n,f);t(`[${g}] proxy: ${n} ${JSON.stringify(f)}`);let d;try{d=await r.handlers[g](H,{disableExtensions:["express"]})}catch(x){return E(x),i()}let u;try{u=await d.clone().json()}catch{u=await d.text()}let c={};return d.headers.forEach((x,l)=>{if(!["content-length","transfer-encoding"].includes(l.toLowerCase()))if(c[l]){let R=c[l];c[l]=Array.isArray(R)?[...R,x]:[R,x]}else c[l]=x}),a.headersSent||(t("sending response"),a.status(d.status).set(c),typeof u=="string"?a.send(u):a.json(u??{})),S.ExtensionState.onHandleRequest}}}}0&&(module.exports={cleaner,express});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { ExtensionState, Server } from '@niledatabase/server';\nimport type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n NextFunction,\n} from 'express';\n\nexport function cleaner(val: string) {\n return val.replaceAll(/\\{([^}]+)\\}/g, ':$1');\n}\n\nexport const express = (instance: Server) => {\n const { error, debug } = instance.logger('[EXTENSION][express]');\n return {\n id: 'express',\n onSetContext: (\n req: ExpressRequest,\n res: ExpressResponse,\n next: NextFunction\n ) => {\n // do this first, since `cookies` does not persist across context set\n if (req.params.tenantId) {\n instance.setContext({ tenantId: req.params.tenantId });\n }\n\n if (req.headers) {\n instance.setContext(req.headers);\n }\n if (req instanceof Headers) {\n instance.setContext(req);\n }\n\n if (typeof next === 'function') {\n next();\n }\n },\n onConfigure: () => {\n const { paths: nilePaths } = instance;\n const paths = {\n get: nilePaths.get.map(cleaner),\n post: nilePaths.post.map(cleaner),\n put: nilePaths.put.map(cleaner),\n delete: nilePaths.delete.map(cleaner),\n };\n debug(`paths configured ${JSON.stringify(paths)}`);\n instance.paths = paths;\n },\n onHandleRequest: async (req: ExpressRequest, res: ExpressResponse) => {\n // handle standard request objects\n if (req instanceof Request) {\n debug('using default response');\n const response = await instance.handlers[\n req.method as 'GET' | 'POST' | 'PUT' | 'DELETE'\n // disable the extension so we don't re-handle\n ](req, { disableExtensions: ['express'] });\n return response;\n }\n\n debug('handling response');\n instance.setContext(req.headers);\n\n const reqUrl = req.protocol + '://' + req.get('host') + req.originalUrl;\n\n // be sure its a valid url\n try {\n new URL(reqUrl);\n } catch (e) {\n throw new Error(\n 'Invalid URL sent for handle request. Are you running express?'\n );\n }\n const { method } = req;\n const init: RequestInit = { method, headers: new Headers() };\n // seems like this should work without this, since `get/set context should do the things we think it should.\n if (\n 'headers' in req &&\n typeof req.headers === 'object' &&\n req.headers &&\n 'cookie' in req.headers &&\n typeof req.headers.cookie === 'string'\n ) {\n (init.headers as Headers).set('cookie', req.headers.cookie);\n }\n\n if ('body' in req) {\n if (method === 'POST' || method === 'PUT') {\n init.body = JSON.stringify(req.body);\n }\n }\n\n const proxyRequest = new Request(reqUrl, init);\n debug(\n `[${method.toUpperCase()}]proxy request converted to ${reqUrl} with ${JSON.stringify(\n init\n )}`\n );\n\n let response: Response = null as unknown as Response;\n\n try {\n response = (await instance.handlers[\n req.method as 'GET' | 'POST' | 'PUT' | 'DELETE'\n ](proxyRequest, { disableExtensions: ['express'] })) as Response;\n } catch (e) {\n error(e);\n }\n\n let body;\n try {\n const tryJson = await response.clone();\n body = await tryJson.json();\n } catch (e) {\n body = await response.text();\n }\n\n const newHeaders: Record<string, string | string[]> = {};\n response.headers.forEach((value, key) => {\n if (\n !['content-length', 'transfer-encoding'].includes(key.toLowerCase())\n ) {\n if (newHeaders[key]) {\n const prev = newHeaders[key];\n if (Array.isArray(prev)) {\n newHeaders[key] = [...prev, value];\n } else {\n newHeaders[key] = [prev, value];\n }\n } else {\n newHeaders[key] = value;\n }\n }\n });\n\n if (!res.headersSent) {\n debug('sending response');\n res.status(response.status).set(newHeaders);\n if (typeof body === 'string') {\n res.send(body);\n } else {\n res.json(body ?? {});\n }\n }\n // always return to prevent infinite loop\n return ExtensionState.onHandleRequest;\n },\n };\n};\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAAuC,gCAOhC,SAASH,EAAQI,EAAa,CACnC,OAAOA,EAAI,WAAW,eAAgB,KAAK,CAC7C,CAEO,IAAMH,EAAWI,GAAqB,CAC3C,GAAM,CAAE,MAAAC,EAAO,MAAAC,CAAM,EAAIF,EAAS,OAAO,sBAAsB,EAC/D,MAAO,CACL,GAAI,UACJ,aAAc,CACZG,EACAC,EACAC,IACG,CAECF,EAAI,OAAO,UACbH,EAAS,WAAW,CAAE,SAAUG,EAAI,OAAO,QAAS,CAAC,EAGnDA,EAAI,SACNH,EAAS,WAAWG,EAAI,OAAO,EAE7BA,aAAe,SACjBH,EAAS,WAAWG,CAAG,EAGrB,OAAOE,GAAS,YAClBA,EAAK,CAET,EACA,YAAa,IAAM,CACjB,GAAM,CAAE,MAAOC,CAAU,EAAIN,EACvBO,EAAQ,CACZ,IAAKD,EAAU,IAAI,IAAIX,CAAO,EAC9B,KAAMW,EAAU,KAAK,IAAIX,CAAO,EAChC,IAAKW,EAAU,IAAI,IAAIX,CAAO,EAC9B,OAAQW,EAAU,OAAO,IAAIX,CAAO,CACtC,EACAO,EAAM,oBAAoB,KAAK,UAAUK,CAAK,CAAC,EAAE,EACjDP,EAAS,MAAQO,CACnB,EACA,gBAAiB,MAAOJ,EAAqBC,IAAyB,CAEpE,GAAID,aAAe,QACjB,OAAAD,EAAM,wBAAwB,EACb,MAAMF,EAAS,SAC9BG,EAAI,MAEN,EAAEA,EAAK,CAAE,kBAAmB,CAAC,SAAS,CAAE,CAAC,EAI3CD,EAAM,mBAAmB,EACzBF,EAAS,WAAWG,EAAI,OAAO,EAE/B,IAAMK,EAASL,EAAI,SAAW,MAAQA,EAAI,IAAI,MAAM,EAAIA,EAAI,YAG5D,GAAI,CACF,IAAI,IAAIK,CAAM,CAChB,MAAY,CACV,MAAM,IAAI,MACR,+DACF,CACF,CACA,GAAM,CAAE,OAAAC,CAAO,EAAIN,EACbO,EAAoB,CAAE,OAAAD,EAAQ,QAAS,IAAI,OAAU,EAGzD,YAAaN,GACb,OAAOA,EAAI,SAAY,UACvBA,EAAI,SACJ,WAAYA,EAAI,SAChB,OAAOA,EAAI,QAAQ,QAAW,UAE7BO,EAAK,QAAoB,IAAI,SAAUP,EAAI,QAAQ,MAAM,EAGxD,SAAUA,IACRM,IAAW,QAAUA,IAAW,SAClCC,EAAK,KAAO,KAAK,UAAUP,EAAI,IAAI,GAIvC,IAAMQ,EAAe,IAAI,QAAQH,EAAQE,CAAI,EAC7CR,EACE,IAAIO,EAAO,YAAY,CAAC,+BAA+BD,CAAM,SAAS,KAAK,UACzEE,CACF,CAAC,EACH,EAEA,IAAIE,EAAqB,KAEzB,GAAI,CACFA,EAAY,MAAMZ,EAAS,SACzBG,EAAI,MACN,EAAEQ,EAAc,CAAE,kBAAmB,CAAC,SAAS,CAAE,CAAC,CACpD,OAASE,EAAG,CACVZ,EAAMY,CAAC,CACT,CAEA,IAAIC,EACJ,GAAI,CAEFA,EAAO,MADS,MAAMF,EAAS,MAAM,GAChB,KAAK,CAC5B,MAAY,CACVE,EAAO,MAAMF,EAAS,KAAK,CAC7B,CAEA,IAAMG,EAAgD,CAAC,EACvD,OAAAH,EAAS,QAAQ,QAAQ,CAACI,EAAOC,IAAQ,CACvC,GACE,CAAC,CAAC,iBAAkB,mBAAmB,EAAE,SAASA,EAAI,YAAY,CAAC,EAEnE,GAAIF,EAAWE,CAAG,EAAG,CACnB,IAAMC,EAAOH,EAAWE,CAAG,EACvB,MAAM,QAAQC,CAAI,EACpBH,EAAWE,CAAG,EAAI,CAAC,GAAGC,EAAMF,CAAK,EAEjCD,EAAWE,CAAG,EAAI,CAACC,EAAMF,CAAK,CAElC,MACED,EAAWE,CAAG,EAAID,CAGxB,CAAC,EAEIZ,EAAI,cACPF,EAAM,kBAAkB,EACxBE,EAAI,OAAOQ,EAAS,MAAM,EAAE,IAAIG,CAAU,EACtC,OAAOD,GAAS,SAClBV,EAAI,KAAKU,CAAI,EAEbV,EAAI,KAAKU,GAAQ,CAAC,CAAC,GAIhB,iBAAe,eACxB,CACF,CACF","names":["index_exports","__export","cleaner","express","__toCommonJS","import_server","val","instance","error","debug","req","res","next","nilePaths","paths","reqUrl","method","init","proxyRequest","response","e","body","newHeaders","value","key","prev"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'async_hooks';\n\nimport { ExtensionState, Server } from '@niledatabase/server';\nimport type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n NextFunction,\n Express,\n} from 'express';\n\nexport function cleaner(val: string) {\n return val.replaceAll(/\\{([^}]+)\\}/g, ':$1');\n}\n\ntype ExpressRouteHandler = (\n req: ExpressRequest,\n res: ExpressResponse,\n next: NextFunction\n) => void | Promise<void>;\n\ntype ExpressRouteFunctions = {\n GET: ExpressRouteHandler;\n POST: ExpressRouteHandler;\n PUT: ExpressRouteHandler;\n DELETE: ExpressRouteHandler;\n};\n\ntype NileWithExpress = Server & {\n handlers: ExpressRouteFunctions;\n};\n\n// AsyncLocalStorage to persist context per request\nconst contextStore = new AsyncLocalStorage<Map<string, unknown>>();\n\n// Express extension factory\nexport function express(app?: Express) {\n let init = false;\n\n return (instance: Server) => {\n const { error, debug } = instance.logger('[EXTENSION][express]');\n\n // Internal context helpers\n const setRequestContext = (context: unknown) => {\n contextStore.getStore()?.set('context', context);\n instance.setContext(context);\n };\n\n function doConfigure(server: NileWithExpress) {\n if (app) {\n debug('routes configured');\n app.get(server.paths.get, server.handlers.GET);\n app.post(server.paths.post, server.handlers.POST);\n app.put(server.paths.put, server.handlers.PUT);\n app.delete(server.paths.delete, server.handlers.DELETE);\n }\n }\n\n if (!init && app) {\n debug('initializing express extension with middleware');\n\n app.use((req, res, next) => {\n contextStore.run(new Map(), () => next());\n });\n\n app.param('tenantId', (req, res, next, tenantId) => {\n debug(`tenantId param set: ${tenantId}`);\n setRequestContext({ tenantId });\n next();\n });\n\n app.use((req, res, next) => {\n const headers =\n (typeof req === 'object' && 'headers' in req && req.headers) || {};\n setRequestContext(headers);\n next();\n });\n }\n\n init = true;\n\n return {\n id: 'express',\n\n onSetContext: (req: unknown, _res: unknown, next: unknown) => {\n const maybeReq = req as ExpressRequest;\n\n if (maybeReq?.params?.tenantId) {\n setRequestContext({ tenantId: maybeReq.params.tenantId });\n }\n\n if (maybeReq?.headers) {\n setRequestContext(maybeReq.headers);\n }\n\n if (req instanceof Headers) {\n setRequestContext(req);\n }\n\n if (typeof next === 'function') next();\n },\n\n onGetContext: () => {\n return contextStore.getStore()?.get('context') ?? {};\n },\n\n onConfigure: () => {\n const { paths: rawPaths } = instance;\n const paths = {\n get: rawPaths.get.map(cleaner),\n post: rawPaths.post.map(cleaner),\n put: rawPaths.put.map(cleaner),\n delete: rawPaths.delete.map(cleaner),\n };\n debug(`paths configured ${JSON.stringify(paths)}`);\n instance.paths = paths;\n doConfigure(instance as NileWithExpress);\n },\n\n onHandleRequest: async (\n req: ExpressRequest,\n res: ExpressResponse,\n next: NextFunction\n ) => {\n debug('handling response');\n\n const reqUrl = req.protocol + '://' + req.get('host') + req.originalUrl;\n\n try {\n new URL(reqUrl);\n } catch {\n throw new Error('Invalid URL are you running Express?');\n }\n\n const method = req.method;\n const init: RequestInit = { method, headers: new Headers() };\n\n if (req.headers?.cookie) {\n (init.headers as Headers).set('cookie', req.headers.cookie);\n }\n\n if (['POST', 'PUT'].includes(method) && req.body) {\n init.body = JSON.stringify(req.body);\n }\n\n const proxyRequest = new Request(reqUrl, init);\n debug(`[${method}] proxy: ${reqUrl} ${JSON.stringify(init)}`);\n\n let response: Response;\n try {\n response = (await instance.handlers[\n method as 'GET' | 'POST' | 'PUT' | 'DELETE'\n ](proxyRequest, { disableExtensions: ['express'] })) as Response;\n } catch (e) {\n error(e);\n return next();\n }\n\n let body;\n try {\n body = await response.clone().json();\n } catch {\n body = await response.text();\n }\n\n const newHeaders: Record<string, string | string[]> = {};\n response.headers.forEach((value, key) => {\n if (\n !['content-length', 'transfer-encoding'].includes(key.toLowerCase())\n ) {\n if (newHeaders[key]) {\n const prev = newHeaders[key];\n newHeaders[key] = Array.isArray(prev)\n ? [...prev, value]\n : [prev, value];\n } else {\n newHeaders[key] = value;\n }\n }\n });\n if (!res.headersSent) {\n debug('sending response');\n res.status(response.status).set(newHeaders);\n typeof body === 'string' ? res.send(body) : res.json(body ?? {});\n }\n\n return ExtensionState.onHandleRequest;\n },\n };\n };\n}\n"],"mappings":"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","names":["index_exports","__export","cleaner","express","__toCommonJS","import_async_hooks","import_server","val","contextStore","app","init","instance","error","debug","setRequestContext","context","doConfigure","server","req","res","next","tenantId","headers","_res","maybeReq","rawPaths","paths","reqUrl","method","proxyRequest","response","e","body","newHeaders","value","key","prev"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{ExtensionState as g}from"@niledatabase/server";function f(s){return s.replaceAll(/\{([^}]+)\}/g,":$1")}var y=s=>{let{error:l,debug:i}=s.logger("[EXTENSION][express]");return{id:"express",onSetContext:(e,n,o)=>{e.params.tenantId&&s.setContext({tenantId:e.params.tenantId}),e.headers&&s.setContext(e.headers),e instanceof Headers&&s.setContext(e),typeof o=="function"&&o()},onConfigure:()=>{let{paths:e}=s,n={get:e.get.map(f),post:e.post.map(f),put:e.put.map(f),delete:e.delete.map(f)};i(`paths configured ${JSON.stringify(n)}`),s.paths=n},onHandleRequest:async(e,n)=>{if(e instanceof Request)return i("using default response"),await s.handlers[e.method](e,{disableExtensions:["express"]});i("handling response"),s.setContext(e.headers);let o=e.protocol+"://"+e.get("host")+e.originalUrl;try{new URL(o)}catch{throw new Error("Invalid URL sent for handle request. Are you running express?")}let{method:c}=e,h={method:c,headers:new Headers};"headers"in e&&typeof e.headers=="object"&&e.headers&&"cookie"in e.headers&&typeof e.headers.cookie=="string"&&h.headers.set("cookie",e.headers.cookie),"body"in e&&(c==="POST"||c==="PUT")&&(h.body=JSON.stringify(e.body));let x=new Request(o,h);i(`[${c.toUpperCase()}]proxy request converted to ${o} with ${JSON.stringify(h)}`);let p=null;try{p=await s.handlers[e.method](x,{disableExtensions:["express"]})}catch(t){l(t)}let d;try{d=await(await p.clone()).json()}catch{d=await p.text()}let r={};return p.headers.forEach((t,a)=>{if(!["content-length","transfer-encoding"].includes(a.toLowerCase()))if(r[a]){let u=r[a];Array.isArray(u)?r[a]=[...u,t]:r[a]=[u,t]}else r[a]=t}),n.headersSent||(i("sending response"),n.status(p.status).set(r),typeof d=="string"?n.send(d):n.json(d??{})),g.onHandleRequest}}};export{f as cleaner,y as express};
1
+ import{AsyncLocalStorage as S}from"async_hooks";import{ExtensionState as T}from"@niledatabase/server";function E(t){return t.replaceAll(/\{([^}]+)\}/g,":$1")}var f=new S;function b(t){let R=!1;return a=>{let{error:y,debug:r}=a.logger("[EXTENSION][express]"),i=e=>{f.getStore()?.set("context",e),a.setContext(e)};function w(e){t&&(r("routes configured"),t.get(e.paths.get,e.handlers.GET),t.post(e.paths.post,e.handlers.POST),t.put(e.paths.put,e.handlers.PUT),t.delete(e.paths.delete,e.handlers.DELETE))}return!R&&t&&(r("initializing express extension with middleware"),t.use((e,n,o)=>{f.run(new Map,()=>o())}),t.param("tenantId",(e,n,o,s)=>{r(`tenantId param set: ${s}`),i({tenantId:s}),o()}),t.use((e,n,o)=>{let s=typeof e=="object"&&"headers"in e&&e.headers||{};i(s),o()})),R=!0,{id:"express",onSetContext:(e,n,o)=>{let s=e;s?.params?.tenantId&&i({tenantId:s.params.tenantId}),s?.headers&&i(s.headers),e instanceof Headers&&i(e),typeof o=="function"&&o()},onGetContext:()=>f.getStore()?.get("context")??{},onConfigure:()=>{let{paths:e}=a,n={get:e.get.map(E),post:e.post.map(E),put:e.put.map(E),delete:e.delete.map(E)};r(`paths configured ${JSON.stringify(n)}`),a.paths=n,w(a)},onHandleRequest:async(e,n,o)=>{r("handling response");let s=e.protocol+"://"+e.get("host")+e.originalUrl;try{new URL(s)}catch{throw new Error("Invalid URL \u2014 are you running Express?")}let l=e.method,h={method:l,headers:new Headers};e.headers?.cookie&&h.headers.set("cookie",e.headers.cookie),["POST","PUT"].includes(l)&&e.body&&(h.body=JSON.stringify(e.body));let m=new Request(s,h);r(`[${l}] proxy: ${s} ${JSON.stringify(h)}`);let p;try{p=await a.handlers[l](m,{disableExtensions:["express"]})}catch(c){return y(c),o()}let d;try{d=await p.clone().json()}catch{d=await p.text()}let u={};return p.headers.forEach((c,x)=>{if(!["content-length","transfer-encoding"].includes(x.toLowerCase()))if(u[x]){let g=u[x];u[x]=Array.isArray(g)?[...g,c]:[g,c]}else u[x]=c}),n.headersSent||(r("sending response"),n.status(p.status).set(u),typeof d=="string"?n.send(d):n.json(d??{})),T.onHandleRequest}}}}export{E as cleaner,b as express};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { ExtensionState, Server } from '@niledatabase/server';\nimport type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n NextFunction,\n} from 'express';\n\nexport function cleaner(val: string) {\n return val.replaceAll(/\\{([^}]+)\\}/g, ':$1');\n}\n\nexport const express = (instance: Server) => {\n const { error, debug } = instance.logger('[EXTENSION][express]');\n return {\n id: 'express',\n onSetContext: (\n req: ExpressRequest,\n res: ExpressResponse,\n next: NextFunction\n ) => {\n // do this first, since `cookies` does not persist across context set\n if (req.params.tenantId) {\n instance.setContext({ tenantId: req.params.tenantId });\n }\n\n if (req.headers) {\n instance.setContext(req.headers);\n }\n if (req instanceof Headers) {\n instance.setContext(req);\n }\n\n if (typeof next === 'function') {\n next();\n }\n },\n onConfigure: () => {\n const { paths: nilePaths } = instance;\n const paths = {\n get: nilePaths.get.map(cleaner),\n post: nilePaths.post.map(cleaner),\n put: nilePaths.put.map(cleaner),\n delete: nilePaths.delete.map(cleaner),\n };\n debug(`paths configured ${JSON.stringify(paths)}`);\n instance.paths = paths;\n },\n onHandleRequest: async (req: ExpressRequest, res: ExpressResponse) => {\n // handle standard request objects\n if (req instanceof Request) {\n debug('using default response');\n const response = await instance.handlers[\n req.method as 'GET' | 'POST' | 'PUT' | 'DELETE'\n // disable the extension so we don't re-handle\n ](req, { disableExtensions: ['express'] });\n return response;\n }\n\n debug('handling response');\n instance.setContext(req.headers);\n\n const reqUrl = req.protocol + '://' + req.get('host') + req.originalUrl;\n\n // be sure its a valid url\n try {\n new URL(reqUrl);\n } catch (e) {\n throw new Error(\n 'Invalid URL sent for handle request. Are you running express?'\n );\n }\n const { method } = req;\n const init: RequestInit = { method, headers: new Headers() };\n // seems like this should work without this, since `get/set context should do the things we think it should.\n if (\n 'headers' in req &&\n typeof req.headers === 'object' &&\n req.headers &&\n 'cookie' in req.headers &&\n typeof req.headers.cookie === 'string'\n ) {\n (init.headers as Headers).set('cookie', req.headers.cookie);\n }\n\n if ('body' in req) {\n if (method === 'POST' || method === 'PUT') {\n init.body = JSON.stringify(req.body);\n }\n }\n\n const proxyRequest = new Request(reqUrl, init);\n debug(\n `[${method.toUpperCase()}]proxy request converted to ${reqUrl} with ${JSON.stringify(\n init\n )}`\n );\n\n let response: Response = null as unknown as Response;\n\n try {\n response = (await instance.handlers[\n req.method as 'GET' | 'POST' | 'PUT' | 'DELETE'\n ](proxyRequest, { disableExtensions: ['express'] })) as Response;\n } catch (e) {\n error(e);\n }\n\n let body;\n try {\n const tryJson = await response.clone();\n body = await tryJson.json();\n } catch (e) {\n body = await response.text();\n }\n\n const newHeaders: Record<string, string | string[]> = {};\n response.headers.forEach((value, key) => {\n if (\n !['content-length', 'transfer-encoding'].includes(key.toLowerCase())\n ) {\n if (newHeaders[key]) {\n const prev = newHeaders[key];\n if (Array.isArray(prev)) {\n newHeaders[key] = [...prev, value];\n } else {\n newHeaders[key] = [prev, value];\n }\n } else {\n newHeaders[key] = value;\n }\n }\n });\n\n if (!res.headersSent) {\n debug('sending response');\n res.status(response.status).set(newHeaders);\n if (typeof body === 'string') {\n res.send(body);\n } else {\n res.json(body ?? {});\n }\n }\n // always return to prevent infinite loop\n return ExtensionState.onHandleRequest;\n },\n };\n};\n"],"mappings":"AAAA,OAAS,kBAAAA,MAA8B,uBAOhC,SAASC,EAAQC,EAAa,CACnC,OAAOA,EAAI,WAAW,eAAgB,KAAK,CAC7C,CAEO,IAAMC,EAAWC,GAAqB,CAC3C,GAAM,CAAE,MAAAC,EAAO,MAAAC,CAAM,EAAIF,EAAS,OAAO,sBAAsB,EAC/D,MAAO,CACL,GAAI,UACJ,aAAc,CACZG,EACAC,EACAC,IACG,CAECF,EAAI,OAAO,UACbH,EAAS,WAAW,CAAE,SAAUG,EAAI,OAAO,QAAS,CAAC,EAGnDA,EAAI,SACNH,EAAS,WAAWG,EAAI,OAAO,EAE7BA,aAAe,SACjBH,EAAS,WAAWG,CAAG,EAGrB,OAAOE,GAAS,YAClBA,EAAK,CAET,EACA,YAAa,IAAM,CACjB,GAAM,CAAE,MAAOC,CAAU,EAAIN,EACvBO,EAAQ,CACZ,IAAKD,EAAU,IAAI,IAAIT,CAAO,EAC9B,KAAMS,EAAU,KAAK,IAAIT,CAAO,EAChC,IAAKS,EAAU,IAAI,IAAIT,CAAO,EAC9B,OAAQS,EAAU,OAAO,IAAIT,CAAO,CACtC,EACAK,EAAM,oBAAoB,KAAK,UAAUK,CAAK,CAAC,EAAE,EACjDP,EAAS,MAAQO,CACnB,EACA,gBAAiB,MAAOJ,EAAqBC,IAAyB,CAEpE,GAAID,aAAe,QACjB,OAAAD,EAAM,wBAAwB,EACb,MAAMF,EAAS,SAC9BG,EAAI,MAEN,EAAEA,EAAK,CAAE,kBAAmB,CAAC,SAAS,CAAE,CAAC,EAI3CD,EAAM,mBAAmB,EACzBF,EAAS,WAAWG,EAAI,OAAO,EAE/B,IAAMK,EAASL,EAAI,SAAW,MAAQA,EAAI,IAAI,MAAM,EAAIA,EAAI,YAG5D,GAAI,CACF,IAAI,IAAIK,CAAM,CAChB,MAAY,CACV,MAAM,IAAI,MACR,+DACF,CACF,CACA,GAAM,CAAE,OAAAC,CAAO,EAAIN,EACbO,EAAoB,CAAE,OAAAD,EAAQ,QAAS,IAAI,OAAU,EAGzD,YAAaN,GACb,OAAOA,EAAI,SAAY,UACvBA,EAAI,SACJ,WAAYA,EAAI,SAChB,OAAOA,EAAI,QAAQ,QAAW,UAE7BO,EAAK,QAAoB,IAAI,SAAUP,EAAI,QAAQ,MAAM,EAGxD,SAAUA,IACRM,IAAW,QAAUA,IAAW,SAClCC,EAAK,KAAO,KAAK,UAAUP,EAAI,IAAI,GAIvC,IAAMQ,EAAe,IAAI,QAAQH,EAAQE,CAAI,EAC7CR,EACE,IAAIO,EAAO,YAAY,CAAC,+BAA+BD,CAAM,SAAS,KAAK,UACzEE,CACF,CAAC,EACH,EAEA,IAAIE,EAAqB,KAEzB,GAAI,CACFA,EAAY,MAAMZ,EAAS,SACzBG,EAAI,MACN,EAAEQ,EAAc,CAAE,kBAAmB,CAAC,SAAS,CAAE,CAAC,CACpD,OAASE,EAAG,CACVZ,EAAMY,CAAC,CACT,CAEA,IAAIC,EACJ,GAAI,CAEFA,EAAO,MADS,MAAMF,EAAS,MAAM,GAChB,KAAK,CAC5B,MAAY,CACVE,EAAO,MAAMF,EAAS,KAAK,CAC7B,CAEA,IAAMG,EAAgD,CAAC,EACvD,OAAAH,EAAS,QAAQ,QAAQ,CAACI,EAAOC,IAAQ,CACvC,GACE,CAAC,CAAC,iBAAkB,mBAAmB,EAAE,SAASA,EAAI,YAAY,CAAC,EAEnE,GAAIF,EAAWE,CAAG,EAAG,CACnB,IAAMC,EAAOH,EAAWE,CAAG,EACvB,MAAM,QAAQC,CAAI,EACpBH,EAAWE,CAAG,EAAI,CAAC,GAAGC,EAAMF,CAAK,EAEjCD,EAAWE,CAAG,EAAI,CAACC,EAAMF,CAAK,CAElC,MACED,EAAWE,CAAG,EAAID,CAGxB,CAAC,EAEIZ,EAAI,cACPF,EAAM,kBAAkB,EACxBE,EAAI,OAAOQ,EAAS,MAAM,EAAE,IAAIG,CAAU,EACtC,OAAOD,GAAS,SAClBV,EAAI,KAAKU,CAAI,EAEbV,EAAI,KAAKU,GAAQ,CAAC,CAAC,GAIhBlB,EAAe,eACxB,CACF,CACF","names":["ExtensionState","cleaner","val","express","instance","error","debug","req","res","next","nilePaths","paths","reqUrl","method","init","proxyRequest","response","e","body","newHeaders","value","key","prev"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'async_hooks';\n\nimport { ExtensionState, Server } from '@niledatabase/server';\nimport type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n NextFunction,\n Express,\n} from 'express';\n\nexport function cleaner(val: string) {\n return val.replaceAll(/\\{([^}]+)\\}/g, ':$1');\n}\n\ntype ExpressRouteHandler = (\n req: ExpressRequest,\n res: ExpressResponse,\n next: NextFunction\n) => void | Promise<void>;\n\ntype ExpressRouteFunctions = {\n GET: ExpressRouteHandler;\n POST: ExpressRouteHandler;\n PUT: ExpressRouteHandler;\n DELETE: ExpressRouteHandler;\n};\n\ntype NileWithExpress = Server & {\n handlers: ExpressRouteFunctions;\n};\n\n// AsyncLocalStorage to persist context per request\nconst contextStore = new AsyncLocalStorage<Map<string, unknown>>();\n\n// Express extension factory\nexport function express(app?: Express) {\n let init = false;\n\n return (instance: Server) => {\n const { error, debug } = instance.logger('[EXTENSION][express]');\n\n // Internal context helpers\n const setRequestContext = (context: unknown) => {\n contextStore.getStore()?.set('context', context);\n instance.setContext(context);\n };\n\n function doConfigure(server: NileWithExpress) {\n if (app) {\n debug('routes configured');\n app.get(server.paths.get, server.handlers.GET);\n app.post(server.paths.post, server.handlers.POST);\n app.put(server.paths.put, server.handlers.PUT);\n app.delete(server.paths.delete, server.handlers.DELETE);\n }\n }\n\n if (!init && app) {\n debug('initializing express extension with middleware');\n\n app.use((req, res, next) => {\n contextStore.run(new Map(), () => next());\n });\n\n app.param('tenantId', (req, res, next, tenantId) => {\n debug(`tenantId param set: ${tenantId}`);\n setRequestContext({ tenantId });\n next();\n });\n\n app.use((req, res, next) => {\n const headers =\n (typeof req === 'object' && 'headers' in req && req.headers) || {};\n setRequestContext(headers);\n next();\n });\n }\n\n init = true;\n\n return {\n id: 'express',\n\n onSetContext: (req: unknown, _res: unknown, next: unknown) => {\n const maybeReq = req as ExpressRequest;\n\n if (maybeReq?.params?.tenantId) {\n setRequestContext({ tenantId: maybeReq.params.tenantId });\n }\n\n if (maybeReq?.headers) {\n setRequestContext(maybeReq.headers);\n }\n\n if (req instanceof Headers) {\n setRequestContext(req);\n }\n\n if (typeof next === 'function') next();\n },\n\n onGetContext: () => {\n return contextStore.getStore()?.get('context') ?? {};\n },\n\n onConfigure: () => {\n const { paths: rawPaths } = instance;\n const paths = {\n get: rawPaths.get.map(cleaner),\n post: rawPaths.post.map(cleaner),\n put: rawPaths.put.map(cleaner),\n delete: rawPaths.delete.map(cleaner),\n };\n debug(`paths configured ${JSON.stringify(paths)}`);\n instance.paths = paths;\n doConfigure(instance as NileWithExpress);\n },\n\n onHandleRequest: async (\n req: ExpressRequest,\n res: ExpressResponse,\n next: NextFunction\n ) => {\n debug('handling response');\n\n const reqUrl = req.protocol + '://' + req.get('host') + req.originalUrl;\n\n try {\n new URL(reqUrl);\n } catch {\n throw new Error('Invalid URL are you running Express?');\n }\n\n const method = req.method;\n const init: RequestInit = { method, headers: new Headers() };\n\n if (req.headers?.cookie) {\n (init.headers as Headers).set('cookie', req.headers.cookie);\n }\n\n if (['POST', 'PUT'].includes(method) && req.body) {\n init.body = JSON.stringify(req.body);\n }\n\n const proxyRequest = new Request(reqUrl, init);\n debug(`[${method}] proxy: ${reqUrl} ${JSON.stringify(init)}`);\n\n let response: Response;\n try {\n response = (await instance.handlers[\n method as 'GET' | 'POST' | 'PUT' | 'DELETE'\n ](proxyRequest, { disableExtensions: ['express'] })) as Response;\n } catch (e) {\n error(e);\n return next();\n }\n\n let body;\n try {\n body = await response.clone().json();\n } catch {\n body = await response.text();\n }\n\n const newHeaders: Record<string, string | string[]> = {};\n response.headers.forEach((value, key) => {\n if (\n !['content-length', 'transfer-encoding'].includes(key.toLowerCase())\n ) {\n if (newHeaders[key]) {\n const prev = newHeaders[key];\n newHeaders[key] = Array.isArray(prev)\n ? [...prev, value]\n : [prev, value];\n } else {\n newHeaders[key] = value;\n }\n }\n });\n if (!res.headersSent) {\n debug('sending response');\n res.status(response.status).set(newHeaders);\n typeof body === 'string' ? res.send(body) : res.json(body ?? {});\n }\n\n return ExtensionState.onHandleRequest;\n },\n };\n };\n}\n"],"mappings":"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","names":["AsyncLocalStorage","ExtensionState","cleaner","val","contextStore","express","app","init","instance","error","debug","setRequestContext","context","doConfigure","server","req","res","next","tenantId","headers","_res","maybeReq","rawPaths","paths","reqUrl","method","proxyRequest","response","e","body","newHeaders","value","key","prev"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@niledatabase/express",
3
- "version": "5.0.0-alpha.16",
3
+ "version": "5.0.0-alpha.17",
4
4
  "license": "MIT",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -34,7 +34,8 @@
34
34
  "access": "public"
35
35
  },
36
36
  "peerDependencies": {
37
- "@niledatabase/server": "*"
37
+ "@niledatabase/server": "*",
38
+ "express": "^5.0.0 || ^4.0.0"
38
39
  },
39
40
  "devDependencies": {
40
41
  "@types/express": "^5",
@@ -43,5 +44,5 @@
43
44
  "ts-jest": "^29.3.4",
44
45
  "tsup": "^8.5.0"
45
46
  },
46
- "gitHead": "b96e22d67b78a2a0d6d8027dea4973272a1ce94e"
47
+ "gitHead": "45a166b3318215178a1dd15110aa580402691422"
47
48
  }