@orion-js/http
Advanced tools
+41
-46
@@ -73,4 +73,4 @@ var __create = Object.create; | ||
| const data = { error: 500, message: "Internal server error", hash }; | ||
| res.writeHead(statusCode); | ||
| res.end(JSON.stringify(data, null, 2)); | ||
| res.status(statusCode); | ||
| res.json(data); | ||
| error.hash = hash; | ||
@@ -82,3 +82,3 @@ import_logger.logger.error("[route/handler] Internal server error", { error, url: req.url, hash }); | ||
| var onError = async (req, res, error) => { | ||
| await onErrorRef(req, res, error); | ||
| return onErrorRef(req, res, error); | ||
| }; | ||
@@ -133,44 +133,31 @@ var setOnError = (onErrorFunc) => { | ||
| // src/routes/executeRequest.ts | ||
| var import_logger2 = require("@orion-js/logger"); | ||
| // src/routes/registerRoute.ts | ||
| var import_body_parser = __toESM(require("body-parser"), 1); | ||
| // ../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/type.js | ||
| function type(input) { | ||
| if (input === null) { | ||
| return "Null"; | ||
| } else if (input === void 0) { | ||
| return "Undefined"; | ||
| } else if (Number.isNaN(input)) { | ||
| return "NaN"; | ||
| } | ||
| const typeResult = Object.prototype.toString.call(input).slice(8, -1); | ||
| return typeResult === "AsyncFunction" ? "Promise" : typeResult; | ||
| } | ||
| // ../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isNil.js | ||
| function isNil(x) { | ||
| return x === void 0 || x === null; | ||
| } | ||
| // src/routes/executeRequest.ts | ||
| var import_env2 = require("@orion-js/env"); | ||
| var import_helpers2 = require("@orion-js/helpers"); | ||
| var import_logger2 = require("@orion-js/logger"); | ||
| var import_schema = require("@orion-js/schema"); | ||
| var simulateLatency = (0, import_env2.internalGetEnv)("simulate_latency", "SIMULATE_LATENCY"); | ||
| var simulateLatencyMs = Number.parseInt(simulateLatency, 10); | ||
| var hasSimulateLatency = Number.isFinite(simulateLatencyMs) && simulateLatencyMs > 0; | ||
| var latencyMinMs = hasSimulateLatency ? Math.floor(simulateLatencyMs * 0.9) : 0; | ||
| var latencyMaxMs = hasSimulateLatency ? Math.ceil(simulateLatencyMs * 1.1) : 0; | ||
| var objectToString = Object.prototype.toString; | ||
| function isPlainObject(value) { | ||
| return objectToString.call(value) === "[object Object]"; | ||
| } | ||
| async function executeRequest(route2, req, res) { | ||
| if (simulateLatency) { | ||
| const time = Number.parseInt(simulateLatency); | ||
| if (time) { | ||
| const min = time * 0.9; | ||
| const max = time * 1.1; | ||
| await (0, import_helpers2.sleep)(Math.floor(Math.random() * (max - min + 1)) + min); | ||
| try { | ||
| if (hasSimulateLatency) { | ||
| const delay = Math.floor(Math.random() * (latencyMaxMs - latencyMinMs + 1)) + latencyMinMs; | ||
| await (0, import_helpers2.sleep)(delay); | ||
| } | ||
| } | ||
| try { | ||
| const viewer = await getViewer(req); | ||
| if (route2.queryParams) { | ||
| req.query = await (0, import_schema.cleanAndValidate)(route2.queryParams ?? {}, req.query); | ||
| req.query = await (0, import_schema.cleanAndValidate)(route2.queryParams, req.query); | ||
| } | ||
| if (route2.bodyParams) { | ||
| req.body = await (0, import_schema.cleanAndValidate)(route2.bodyParams ?? {}, req.body); | ||
| req.body = await (0, import_schema.cleanAndValidate)(route2.bodyParams, req.body); | ||
| } | ||
@@ -188,5 +175,5 @@ const context = { | ||
| }; | ||
| const result = await (0, import_logger2.runWithOrionAsyncContext)(context, async () => { | ||
| const result = await (0, import_logger2.runWithOrionAsyncContext)(context, () => { | ||
| (0, import_logger2.updateOrionAsyncContext)({ viewer }); | ||
| return await route2.resolve(req, res, viewer); | ||
| return route2.resolve(req, res, viewer); | ||
| }); | ||
@@ -198,7 +185,5 @@ if (!result) return; | ||
| if (result.headers) { | ||
| for (const key in result.headers) { | ||
| res.setHeader(key, result.headers[key]); | ||
| } | ||
| res.set(result.headers); | ||
| } | ||
| if (!isNil(result.body)) { | ||
| if (result.body !== null && result.body !== void 0) { | ||
| let body = result.body; | ||
@@ -208,3 +193,3 @@ if (route2.returns) { | ||
| } | ||
| if (type(body) === "Object") { | ||
| if (isPlainObject(body)) { | ||
| res.json(body); | ||
@@ -221,8 +206,18 @@ } else { | ||
| // src/routes/registerRoute.ts | ||
| var import_body_parser = __toESM(require("body-parser"), 1); | ||
| var appRegisteredRoutes = /* @__PURE__ */ new WeakMap(); | ||
| function getRegisteredRoutes(app) { | ||
| if (appRegisteredRoutes.has(app)) { | ||
| return appRegisteredRoutes.get(app); | ||
| } | ||
| const routes = /* @__PURE__ */ new WeakSet(); | ||
| appRegisteredRoutes.set(app, routes); | ||
| return routes; | ||
| } | ||
| function registerRoute(route2) { | ||
| const app = route2.app || getApp(); | ||
| const registeredRoutes = getRegisteredRoutes(app); | ||
| if (registeredRoutes.has(route2)) return; | ||
| const method = route2.method; | ||
| const handler = async (req, res) => { | ||
| executeRequest(route2, req, res); | ||
| const handler = (req, res) => { | ||
| void executeRequest(route2, req, res); | ||
| }; | ||
@@ -242,2 +237,3 @@ const handlers = [handler]; | ||
| app[method](route2.path, ...handlers); | ||
| registeredRoutes.add(route2); | ||
| } | ||
@@ -247,5 +243,4 @@ | ||
| function registerRoutes(routesMap) { | ||
| const routes = Object.values(routesMap); | ||
| for (const route2 of routes) { | ||
| registerRoute(route2); | ||
| for (const routeName in routesMap) { | ||
| registerRoute(routesMap[routeName]); | ||
| } | ||
@@ -252,0 +247,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/viewer.ts","../src/start.ts","../src/routes/executeRequest.ts","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/type.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isNil.js","../src/routes/registerRoute.ts","../src/routes/registerRoutes.ts","../src/routes/route.ts","../src/service/index.ts"],"sourcesContent":["import {setOnError, onError} from './errors'\nimport {getViewer, setGetViewer} from './viewer'\nimport {startServer, getApp, getServer} from './start'\nimport express from 'express'\nimport registerRoute from './routes/registerRoute'\nimport registerRoutes from './routes/registerRoutes'\nimport bodyParserLib from 'body-parser'\nimport {RequestHandler} from 'express'\n\nexport * from './routes/route'\n\nconst {json, raw, text, urlencoded} = bodyParserLib\n\nconst bodyParser: {\n json: () => RequestHandler\n raw: () => RequestHandler\n text: () => RequestHandler\n urlencoded: (options?: {extended: boolean}) => RequestHandler\n} = {json, raw, text, urlencoded}\n\nexport {\n express,\n startServer,\n getApp,\n getServer,\n getViewer,\n setGetViewer,\n setOnError,\n onError,\n registerRoute,\n registerRoutes,\n bodyParser,\n}\n\nexport * from './types'\nexport * from './service'\n","import express from 'express'\nimport crypto from 'node:crypto'\nimport {logger} from '@orion-js/logger'\n\ntype onErrorFunction = (req: express.Request, res: express.Response, error: any) => Promise<void>\n\nconst defaultOnError: onErrorFunction = async (req, res, error) => {\n if (error.isOrionError) {\n let statusCode = 400\n if (error.code === 'AuthError') {\n statusCode = 401\n } else {\n logger.error(`[route/handler] OrionError in ${req.path}:`, {error})\n }\n\n const data = error.getInfo()\n\n res.status(statusCode)\n res.json(data)\n } else if (error.isGraphQLError) {\n res.writeHead(error.statusCode)\n res.end(error.message)\n logger.error(`[route/handler] GraphQLError in ${req.path}:`, {error})\n } else {\n const hash = crypto\n .createHash('sha1')\n .update(error.message, 'utf8')\n .digest('hex')\n .substring(0, 10)\n const statusCode = 500\n const data = {error: 500, message: 'Internal server error', hash}\n\n res.writeHead(statusCode)\n res.end(JSON.stringify(data, null, 2))\n\n error.hash = hash\n logger.error('[route/handler] Internal server error', {error, url: req.url, hash})\n }\n}\n\nlet onErrorRef: onErrorFunction = defaultOnError\n\nexport const onError: onErrorFunction = async (req, res, error) => {\n await onErrorRef(req, res, error)\n}\n\nexport const setOnError = (onErrorFunc: onErrorFunction): void => {\n onErrorRef = onErrorFunc\n}\n","import express from 'express'\nimport {UserError} from '@orion-js/helpers'\n\nglobal.getViewerRef = () => null\n\nexport const getViewer = async (req: express.Request): Promise<any> => {\n try {\n const viewer = await global.getViewerRef(req)\n if (!viewer) return {}\n return viewer\n } catch (err) {\n throw new UserError('AuthError', err.message)\n }\n}\n\nexport const setGetViewer = (getViewerFunc: (req: express.Request) => any): void => {\n global.getViewerRef = getViewerFunc\n}\n","import {internalGetEnv} from '@orion-js/env'\nimport express from 'express'\n\nglobal.appRef = null\nglobal.serverRef = null\n\nexport interface StartOrionOptions {\n keepAliveTimeout?: number\n}\n\nexport const startServer = (\n port: number = Number(internalGetEnv('http_port', 'PORT')),\n otherOptions: StartOrionOptions = {},\n) => {\n const app = getApp()\n\n const server = app.listen(port)\n global.serverRef = server\n\n if (otherOptions.keepAliveTimeout) {\n server.keepAliveTimeout = otherOptions.keepAliveTimeout // Ensure all inactive connections are terminated by the ALB, by setting this a few seconds higher than the ALB idle timeout\n server.headersTimeout = otherOptions.keepAliveTimeout + 1000\n }\n\n return app\n}\n\nexport const getApp = (): express.Express => {\n if (global.appRef) return global.appRef as express.Express\n\n const app = express()\n\n global.appRef = app\n\n return app\n}\n\nexport const getServer = () => {\n return global.serverRef\n}\n","import {OrionRequest, RouteType} from './../types'\nimport {getViewer} from './../viewer'\nimport {runWithOrionAsyncContext, updateOrionAsyncContext} from '@orion-js/logger'\nimport express from 'express'\nimport {isNil, type} from 'rambdax'\nimport {internalGetEnv} from '@orion-js/env'\nimport {sleep} from '@orion-js/helpers'\nimport {cleanAndValidate} from '@orion-js/schema'\nimport {onError} from '../errors'\nconst simulateLatency = internalGetEnv('simulate_latency', 'SIMULATE_LATENCY')\n\nexport async function executeRequest(\n route: RouteType<any>,\n req: OrionRequest,\n res: express.Response,\n) {\n if (simulateLatency) {\n const time = Number.parseInt(simulateLatency)\n if (time) {\n const min = time * 0.9\n const max = time * 1.1\n await sleep(Math.floor(Math.random() * (max - min + 1)) + min)\n }\n }\n\n try {\n const viewer = await getViewer(req)\n\n if (route.queryParams) {\n req.query = await cleanAndValidate(route.queryParams ?? {}, req.query)\n }\n\n if (route.bodyParams) {\n req.body = await cleanAndValidate(route.bodyParams ?? {}, req.body)\n }\n\n const context = {\n controllerType: 'route' as const,\n routeName: route.path,\n pathname: req.path,\n viewer,\n params: {\n body: req.body,\n query: req.query,\n params: req.params,\n },\n }\n\n const result = await runWithOrionAsyncContext(context, async () => {\n updateOrionAsyncContext({viewer})\n return await route.resolve(req, res, viewer)\n })\n if (!result) return\n\n // add status code to response\n if (result.statusCode) {\n res.status(result.statusCode)\n }\n\n // add headers to response\n if (result.headers) {\n for (const key in result.headers) {\n res.setHeader(key, result.headers[key])\n }\n }\n\n // add body to response\n if (!isNil(result.body)) {\n let body = result.body\n\n if (route.returns) {\n body = await cleanAndValidate(route.returns, result.body)\n }\n\n if (type(body) === 'Object') {\n res.json(body)\n } else {\n res.send(body)\n }\n }\n } catch (error) {\n await onError(req, res, error)\n }\n}\n","export function type(input){\n if (input === null){\n return 'Null'\n } else if (input === undefined){\n return 'Undefined'\n } else if (Number.isNaN(input)){\n return 'NaN'\n }\n const typeResult = Object.prototype.toString.call(input).slice(8, -1)\n\n return typeResult === 'AsyncFunction' ? 'Promise' : typeResult\n}\n","export function isNil(x){\n return x === undefined || x === null\n}\n","import {getApp} from './../start'\nimport {RouteType} from '../types'\nimport {executeRequest} from './executeRequest'\nimport express from 'express'\nimport bodyParser from 'body-parser'\n\nexport default function registerRoute(route: RouteType): void {\n const app = route.app || getApp()\n const method = route.method\n\n const handler = async (req, res) => {\n executeRequest(route, req, res)\n }\n\n const handlers: Array<express.RequestHandler> = [handler]\n\n if (route.bodyParser) {\n const parser = bodyParser[route.bodyParser](route.bodyParserOptions)\n handlers.unshift(parser)\n }\n\n if (!route.bodyParser && route.bodyParams) {\n const parser = bodyParser.json(route.bodyParserOptions)\n handlers.unshift(parser)\n }\n\n if (route.middlewares) {\n handlers.unshift(...route.middlewares)\n }\n\n app[method](route.path, ...handlers)\n}\n","import registerRoute from './registerRoute'\nimport {RoutesMap} from '../types'\n\nexport default function registerRoutes(routesMap: RoutesMap): void {\n const routes = Object.values(routesMap)\n\n for (const route of routes) {\n registerRoute(route)\n }\n}\n","import {Schema, SchemaFieldType} from '@orion-js/schema'\nimport {RouteType, OrionRouteOptions} from '../types'\n\nexport function createRoute<\n TPath extends string,\n TQueryParamsSchema extends Schema | undefined,\n TBodyParamsSchema extends Schema | undefined,\n TReturnsSchema extends SchemaFieldType | undefined,\n>(\n options: OrionRouteOptions<TPath, TQueryParamsSchema, TBodyParamsSchema, TReturnsSchema>,\n): RouteType<TPath, TQueryParamsSchema, TBodyParamsSchema, TReturnsSchema> {\n return {\n ...options,\n }\n}\n\n/**\n * @deprecated Use createRoute instead\n */\nexport const route = createRoute\n","import {getInstance, Service} from '@orion-js/services'\nimport {createRoute} from '../routes/route'\nimport {OrionRouteOptions, RoutesMap} from '../types'\n\n// Define metadata storage using WeakMaps\nconst serviceMetadata = new WeakMap<any, {_serviceType: string}>()\nconst routeMetadata = new WeakMap<any, Record<string, any>>()\n\nexport function Routes() {\n return (target: any, context: ClassDecoratorContext<any>) => {\n Service()(target, context)\n\n context.addInitializer(function (this) {\n serviceMetadata.set(this, {_serviceType: 'routes'})\n })\n }\n}\n\nexport function Route(): (method: any, context: ClassFieldDecoratorContext) => any\nexport function Route(\n options?: Omit<OrionRouteOptions<any, any, any, any>, 'resolve'>,\n): (method: any, context: ClassMethodDecoratorContext) => any\nexport function Route(options?: Omit<OrionRouteOptions<any, any, any, any>, 'resolve'>) {\n return (method: any, context: ClassFieldDecoratorContext | ClassMethodDecoratorContext) => {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this) {\n const routes = routeMetadata.get(this) || {}\n\n if (context.kind === 'method') {\n routes[propertyKey] = createRoute({\n ...options,\n resolve: this[propertyKey].bind(this),\n })\n }\n\n if (context.kind === 'field') {\n routes[propertyKey] = this[propertyKey]\n }\n\n routeMetadata.set(this, routes)\n })\n\n return method\n }\n}\n\nexport function getServiceRoutes(target: any): RoutesMap {\n const instance = getInstance(target)\n\n if (!serviceMetadata.has(instance.constructor)) {\n throw new Error('You must pass a class decorated with @Routes to getServiceRoutes')\n }\n\n const instanceMetadata = serviceMetadata.get(instance.constructor)\n if (instanceMetadata._serviceType !== 'routes') {\n throw new Error('You must pass a class decorated with @Routes to getServiceRoutes')\n }\n\n const routesMap = routeMetadata.get(instance) || {}\n\n return routesMap\n}\n"],"mappings":"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","names":["bodyParser","express","crypto","express","import_express","import_logger","import_env","import_helpers","route","route","bodyParser","route","import_body_parser","bodyParserLib","bodyParser"]} | ||
| {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/viewer.ts","../src/start.ts","../src/routes/registerRoute.ts","../src/routes/executeRequest.ts","../src/routes/registerRoutes.ts","../src/routes/route.ts","../src/service/index.ts"],"sourcesContent":["import {setOnError, onError} from './errors'\nimport {getViewer, setGetViewer} from './viewer'\nimport {startServer, getApp, getServer} from './start'\nimport express from 'express'\nimport registerRoute from './routes/registerRoute'\nimport registerRoutes from './routes/registerRoutes'\nimport bodyParserLib from 'body-parser'\nimport {RequestHandler} from 'express'\n\nexport * from './routes/route'\n\nconst {json, raw, text, urlencoded} = bodyParserLib\n\nconst bodyParser: {\n json: () => RequestHandler\n raw: () => RequestHandler\n text: () => RequestHandler\n urlencoded: (options?: {extended: boolean}) => RequestHandler\n} = {json, raw, text, urlencoded}\n\nexport {\n express,\n startServer,\n getApp,\n getServer,\n getViewer,\n setGetViewer,\n setOnError,\n onError,\n registerRoute,\n registerRoutes,\n bodyParser,\n}\n\nexport * from './types'\nexport * from './service'\n","import crypto from 'node:crypto'\nimport {logger} from '@orion-js/logger'\nimport express from 'express'\n\ntype onErrorFunction = (req: express.Request, res: express.Response, error: any) => Promise<void>\n\nconst defaultOnError: onErrorFunction = async (req, res, error) => {\n if (error.isOrionError) {\n let statusCode = 400\n if (error.code === 'AuthError') {\n statusCode = 401\n } else {\n logger.error(`[route/handler] OrionError in ${req.path}:`, {error})\n }\n\n const data = error.getInfo()\n\n res.status(statusCode)\n res.json(data)\n } else if (error.isGraphQLError) {\n res.writeHead(error.statusCode)\n res.end(error.message)\n logger.error(`[route/handler] GraphQLError in ${req.path}:`, {error})\n } else {\n const hash = crypto\n .createHash('sha1')\n .update(error.message, 'utf8')\n .digest('hex')\n .substring(0, 10)\n const statusCode = 500\n const data = {error: 500, message: 'Internal server error', hash}\n\n res.status(statusCode)\n res.json(data)\n\n error.hash = hash\n logger.error('[route/handler] Internal server error', {error, url: req.url, hash})\n }\n}\n\nlet onErrorRef: onErrorFunction = defaultOnError\n\nexport const onError: onErrorFunction = async (req, res, error) => {\n return onErrorRef(req, res, error)\n}\n\nexport const setOnError = (onErrorFunc: onErrorFunction): void => {\n onErrorRef = onErrorFunc\n}\n","import express from 'express'\nimport {UserError} from '@orion-js/helpers'\n\nglobal.getViewerRef = () => null\n\nexport const getViewer = async (req: express.Request): Promise<any> => {\n try {\n const viewer = await global.getViewerRef(req)\n if (!viewer) return {}\n return viewer\n } catch (err) {\n throw new UserError('AuthError', err.message)\n }\n}\n\nexport const setGetViewer = (getViewerFunc: (req: express.Request) => any): void => {\n global.getViewerRef = getViewerFunc\n}\n","import {internalGetEnv} from '@orion-js/env'\nimport express from 'express'\n\nglobal.appRef = null\nglobal.serverRef = null\n\nexport interface StartOrionOptions {\n keepAliveTimeout?: number\n}\n\nexport const startServer = (\n port: number = Number(internalGetEnv('http_port', 'PORT')),\n otherOptions: StartOrionOptions = {},\n) => {\n const app = getApp()\n\n const server = app.listen(port)\n global.serverRef = server\n\n if (otherOptions.keepAliveTimeout) {\n server.keepAliveTimeout = otherOptions.keepAliveTimeout // Ensure all inactive connections are terminated by the ALB, by setting this a few seconds higher than the ALB idle timeout\n server.headersTimeout = otherOptions.keepAliveTimeout + 1000\n }\n\n return app\n}\n\nexport const getApp = (): express.Express => {\n if (global.appRef) return global.appRef as express.Express\n\n const app = express()\n\n global.appRef = app\n\n return app\n}\n\nexport const getServer = () => {\n return global.serverRef\n}\n","import bodyParser from 'body-parser'\nimport express from 'express'\nimport {getApp} from './../start'\nimport {RouteType} from '../types'\nimport {executeRequest} from './executeRequest'\n\nconst appRegisteredRoutes = new WeakMap<express.Application, WeakSet<RouteType>>()\n\nfunction getRegisteredRoutes(app: express.Application) {\n if (appRegisteredRoutes.has(app)) {\n return appRegisteredRoutes.get(app)\n }\n\n const routes = new WeakSet<RouteType>()\n appRegisteredRoutes.set(app, routes)\n return routes\n}\n\nexport default function registerRoute(route: RouteType): void {\n const app = route.app || getApp()\n const registeredRoutes = getRegisteredRoutes(app)\n if (registeredRoutes.has(route)) return\n\n const method = route.method\n\n const handler: express.RequestHandler = (req, res) => {\n void executeRequest(route, req as any, res)\n }\n\n const handlers: Array<express.RequestHandler> = [handler]\n\n if (route.bodyParser) {\n const parser = bodyParser[route.bodyParser](route.bodyParserOptions)\n handlers.unshift(parser)\n }\n\n if (!route.bodyParser && route.bodyParams) {\n const parser = bodyParser.json(route.bodyParserOptions)\n handlers.unshift(parser)\n }\n\n if (route.middlewares) {\n handlers.unshift(...route.middlewares)\n }\n\n app[method](route.path, ...handlers)\n registeredRoutes.add(route)\n}\n","import {internalGetEnv} from '@orion-js/env'\nimport {sleep} from '@orion-js/helpers'\nimport {runWithOrionAsyncContext, updateOrionAsyncContext} from '@orion-js/logger'\nimport {cleanAndValidate} from '@orion-js/schema'\nimport express from 'express'\nimport {onError} from '../errors'\nimport {OrionRequest, RouteType} from './../types'\nimport {getViewer} from './../viewer'\n\nconst simulateLatency = internalGetEnv('simulate_latency', 'SIMULATE_LATENCY')\nconst simulateLatencyMs = Number.parseInt(simulateLatency, 10)\nconst hasSimulateLatency = Number.isFinite(simulateLatencyMs) && simulateLatencyMs > 0\nconst latencyMinMs = hasSimulateLatency ? Math.floor(simulateLatencyMs * 0.9) : 0\nconst latencyMaxMs = hasSimulateLatency ? Math.ceil(simulateLatencyMs * 1.1) : 0\n\nconst objectToString = Object.prototype.toString\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return objectToString.call(value) === '[object Object]'\n}\n\nexport async function executeRequest(\n route: RouteType<any>,\n req: OrionRequest,\n res: express.Response,\n) {\n try {\n if (hasSimulateLatency) {\n const delay = Math.floor(Math.random() * (latencyMaxMs - latencyMinMs + 1)) + latencyMinMs\n await sleep(delay)\n }\n\n const viewer = await getViewer(req)\n\n if (route.queryParams) {\n req.query = await cleanAndValidate(route.queryParams, req.query)\n }\n\n if (route.bodyParams) {\n req.body = await cleanAndValidate(route.bodyParams, req.body)\n }\n\n const context = {\n controllerType: 'route' as const,\n routeName: route.path,\n pathname: req.path,\n viewer,\n params: {\n body: req.body,\n query: req.query,\n params: req.params,\n },\n }\n\n const result = await runWithOrionAsyncContext(context, () => {\n updateOrionAsyncContext({viewer})\n return route.resolve(req, res, viewer)\n })\n if (!result) return\n\n // add status code to response\n if (result.statusCode) {\n res.status(result.statusCode)\n }\n\n // add headers to response\n if (result.headers) {\n res.set(result.headers)\n }\n\n // add body to response\n if (result.body !== null && result.body !== undefined) {\n let body = result.body\n\n if (route.returns) {\n body = await cleanAndValidate(route.returns, result.body)\n }\n\n if (isPlainObject(body)) {\n res.json(body)\n } else {\n res.send(body)\n }\n }\n } catch (error) {\n await onError(req, res, error)\n }\n}\n","import {RoutesMap} from '../types'\nimport registerRoute from './registerRoute'\n\nexport default function registerRoutes(routesMap: RoutesMap): void {\n for (const routeName in routesMap) {\n registerRoute(routesMap[routeName])\n }\n}\n","import {Schema, SchemaFieldType} from '@orion-js/schema'\nimport {RouteType, OrionRouteOptions} from '../types'\n\nexport function createRoute<\n TPath extends string,\n TQueryParamsSchema extends Schema | undefined,\n TBodyParamsSchema extends Schema | undefined,\n TReturnsSchema extends SchemaFieldType | undefined,\n>(\n options: OrionRouteOptions<TPath, TQueryParamsSchema, TBodyParamsSchema, TReturnsSchema>,\n): RouteType<TPath, TQueryParamsSchema, TBodyParamsSchema, TReturnsSchema> {\n return {\n ...options,\n }\n}\n\n/**\n * @deprecated Use createRoute instead\n */\nexport const route = createRoute\n","import {getInstance, Service} from '@orion-js/services'\nimport {createRoute} from '../routes/route'\nimport {OrionRouteOptions, RoutesMap} from '../types'\n\n// Define metadata storage using WeakMaps\nconst serviceMetadata = new WeakMap<any, {_serviceType: string}>()\nconst routeMetadata = new WeakMap<any, Record<string, any>>()\n\nexport function Routes() {\n return (target: any, context: ClassDecoratorContext<any>) => {\n Service()(target, context)\n\n context.addInitializer(function (this) {\n serviceMetadata.set(this, {_serviceType: 'routes'})\n })\n }\n}\n\nexport function Route(): (method: any, context: ClassFieldDecoratorContext) => any\nexport function Route(\n options?: Omit<OrionRouteOptions<any, any, any, any>, 'resolve'>,\n): (method: any, context: ClassMethodDecoratorContext) => any\nexport function Route(options?: Omit<OrionRouteOptions<any, any, any, any>, 'resolve'>) {\n return (method: any, context: ClassFieldDecoratorContext | ClassMethodDecoratorContext) => {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this) {\n const routes = routeMetadata.get(this) || {}\n\n if (context.kind === 'method') {\n routes[propertyKey] = createRoute({\n ...options,\n resolve: this[propertyKey].bind(this),\n })\n }\n\n if (context.kind === 'field') {\n routes[propertyKey] = this[propertyKey]\n }\n\n routeMetadata.set(this, routes)\n })\n\n return method\n }\n}\n\nexport function getServiceRoutes(target: any): RoutesMap {\n const instance = getInstance(target)\n\n if (!serviceMetadata.has(instance.constructor)) {\n throw new Error('You must pass a class decorated with @Routes to getServiceRoutes')\n }\n\n const instanceMetadata = serviceMetadata.get(instance.constructor)\n if (instanceMetadata._serviceType !== 'routes') {\n throw new Error('You must pass a class decorated with @Routes to getServiceRoutes')\n }\n\n const routesMap = routeMetadata.get(instance) || {}\n\n return routesMap\n}\n"],"mappings":"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","names":["bodyParser","express","crypto","express","import_express","import_env","import_helpers","import_logger","route","route","bodyParser","import_body_parser","bodyParserLib","bodyParser"]} |
+41
-46
@@ -23,4 +23,4 @@ // src/errors.ts | ||
| const data = { error: 500, message: "Internal server error", hash }; | ||
| res.writeHead(statusCode); | ||
| res.end(JSON.stringify(data, null, 2)); | ||
| res.status(statusCode); | ||
| res.json(data); | ||
| error.hash = hash; | ||
@@ -32,3 +32,3 @@ logger.error("[route/handler] Internal server error", { error, url: req.url, hash }); | ||
| var onError = async (req, res, error) => { | ||
| await onErrorRef(req, res, error); | ||
| return onErrorRef(req, res, error); | ||
| }; | ||
@@ -83,44 +83,31 @@ var setOnError = (onErrorFunc) => { | ||
| // src/routes/executeRequest.ts | ||
| import { runWithOrionAsyncContext, updateOrionAsyncContext } from "@orion-js/logger"; | ||
| // src/routes/registerRoute.ts | ||
| import bodyParser from "body-parser"; | ||
| // ../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/type.js | ||
| function type(input) { | ||
| if (input === null) { | ||
| return "Null"; | ||
| } else if (input === void 0) { | ||
| return "Undefined"; | ||
| } else if (Number.isNaN(input)) { | ||
| return "NaN"; | ||
| } | ||
| const typeResult = Object.prototype.toString.call(input).slice(8, -1); | ||
| return typeResult === "AsyncFunction" ? "Promise" : typeResult; | ||
| } | ||
| // ../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isNil.js | ||
| function isNil(x) { | ||
| return x === void 0 || x === null; | ||
| } | ||
| // src/routes/executeRequest.ts | ||
| import { internalGetEnv as internalGetEnv2 } from "@orion-js/env"; | ||
| import { sleep } from "@orion-js/helpers"; | ||
| import { runWithOrionAsyncContext, updateOrionAsyncContext } from "@orion-js/logger"; | ||
| import { cleanAndValidate } from "@orion-js/schema"; | ||
| var simulateLatency = internalGetEnv2("simulate_latency", "SIMULATE_LATENCY"); | ||
| var simulateLatencyMs = Number.parseInt(simulateLatency, 10); | ||
| var hasSimulateLatency = Number.isFinite(simulateLatencyMs) && simulateLatencyMs > 0; | ||
| var latencyMinMs = hasSimulateLatency ? Math.floor(simulateLatencyMs * 0.9) : 0; | ||
| var latencyMaxMs = hasSimulateLatency ? Math.ceil(simulateLatencyMs * 1.1) : 0; | ||
| var objectToString = Object.prototype.toString; | ||
| function isPlainObject(value) { | ||
| return objectToString.call(value) === "[object Object]"; | ||
| } | ||
| async function executeRequest(route2, req, res) { | ||
| if (simulateLatency) { | ||
| const time = Number.parseInt(simulateLatency); | ||
| if (time) { | ||
| const min = time * 0.9; | ||
| const max = time * 1.1; | ||
| await sleep(Math.floor(Math.random() * (max - min + 1)) + min); | ||
| try { | ||
| if (hasSimulateLatency) { | ||
| const delay = Math.floor(Math.random() * (latencyMaxMs - latencyMinMs + 1)) + latencyMinMs; | ||
| await sleep(delay); | ||
| } | ||
| } | ||
| try { | ||
| const viewer = await getViewer(req); | ||
| if (route2.queryParams) { | ||
| req.query = await cleanAndValidate(route2.queryParams ?? {}, req.query); | ||
| req.query = await cleanAndValidate(route2.queryParams, req.query); | ||
| } | ||
| if (route2.bodyParams) { | ||
| req.body = await cleanAndValidate(route2.bodyParams ?? {}, req.body); | ||
| req.body = await cleanAndValidate(route2.bodyParams, req.body); | ||
| } | ||
@@ -138,5 +125,5 @@ const context = { | ||
| }; | ||
| const result = await runWithOrionAsyncContext(context, async () => { | ||
| const result = await runWithOrionAsyncContext(context, () => { | ||
| updateOrionAsyncContext({ viewer }); | ||
| return await route2.resolve(req, res, viewer); | ||
| return route2.resolve(req, res, viewer); | ||
| }); | ||
@@ -148,7 +135,5 @@ if (!result) return; | ||
| if (result.headers) { | ||
| for (const key in result.headers) { | ||
| res.setHeader(key, result.headers[key]); | ||
| } | ||
| res.set(result.headers); | ||
| } | ||
| if (!isNil(result.body)) { | ||
| if (result.body !== null && result.body !== void 0) { | ||
| let body = result.body; | ||
@@ -158,3 +143,3 @@ if (route2.returns) { | ||
| } | ||
| if (type(body) === "Object") { | ||
| if (isPlainObject(body)) { | ||
| res.json(body); | ||
@@ -171,8 +156,18 @@ } else { | ||
| // src/routes/registerRoute.ts | ||
| import bodyParser from "body-parser"; | ||
| var appRegisteredRoutes = /* @__PURE__ */ new WeakMap(); | ||
| function getRegisteredRoutes(app) { | ||
| if (appRegisteredRoutes.has(app)) { | ||
| return appRegisteredRoutes.get(app); | ||
| } | ||
| const routes = /* @__PURE__ */ new WeakSet(); | ||
| appRegisteredRoutes.set(app, routes); | ||
| return routes; | ||
| } | ||
| function registerRoute(route2) { | ||
| const app = route2.app || getApp(); | ||
| const registeredRoutes = getRegisteredRoutes(app); | ||
| if (registeredRoutes.has(route2)) return; | ||
| const method = route2.method; | ||
| const handler = async (req, res) => { | ||
| executeRequest(route2, req, res); | ||
| const handler = (req, res) => { | ||
| void executeRequest(route2, req, res); | ||
| }; | ||
@@ -192,2 +187,3 @@ const handlers = [handler]; | ||
| app[method](route2.path, ...handlers); | ||
| registeredRoutes.add(route2); | ||
| } | ||
@@ -197,5 +193,4 @@ | ||
| function registerRoutes(routesMap) { | ||
| const routes = Object.values(routesMap); | ||
| for (const route2 of routes) { | ||
| registerRoute(route2); | ||
| for (const routeName in routesMap) { | ||
| registerRoute(routesMap[routeName]); | ||
| } | ||
@@ -202,0 +197,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/errors.ts","../src/viewer.ts","../src/start.ts","../src/index.ts","../src/routes/executeRequest.ts","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/type.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isNil.js","../src/routes/registerRoute.ts","../src/routes/registerRoutes.ts","../src/routes/route.ts","../src/service/index.ts"],"sourcesContent":["import express from 'express'\nimport crypto from 'node:crypto'\nimport {logger} from '@orion-js/logger'\n\ntype onErrorFunction = (req: express.Request, res: express.Response, error: any) => Promise<void>\n\nconst defaultOnError: onErrorFunction = async (req, res, error) => {\n if (error.isOrionError) {\n let statusCode = 400\n if (error.code === 'AuthError') {\n statusCode = 401\n } else {\n logger.error(`[route/handler] OrionError in ${req.path}:`, {error})\n }\n\n const data = error.getInfo()\n\n res.status(statusCode)\n res.json(data)\n } else if (error.isGraphQLError) {\n res.writeHead(error.statusCode)\n res.end(error.message)\n logger.error(`[route/handler] GraphQLError in ${req.path}:`, {error})\n } else {\n const hash = crypto\n .createHash('sha1')\n .update(error.message, 'utf8')\n .digest('hex')\n .substring(0, 10)\n const statusCode = 500\n const data = {error: 500, message: 'Internal server error', hash}\n\n res.writeHead(statusCode)\n res.end(JSON.stringify(data, null, 2))\n\n error.hash = hash\n logger.error('[route/handler] Internal server error', {error, url: req.url, hash})\n }\n}\n\nlet onErrorRef: onErrorFunction = defaultOnError\n\nexport const onError: onErrorFunction = async (req, res, error) => {\n await onErrorRef(req, res, error)\n}\n\nexport const setOnError = (onErrorFunc: onErrorFunction): void => {\n onErrorRef = onErrorFunc\n}\n","import express from 'express'\nimport {UserError} from '@orion-js/helpers'\n\nglobal.getViewerRef = () => null\n\nexport const getViewer = async (req: express.Request): Promise<any> => {\n try {\n const viewer = await global.getViewerRef(req)\n if (!viewer) return {}\n return viewer\n } catch (err) {\n throw new UserError('AuthError', err.message)\n }\n}\n\nexport const setGetViewer = (getViewerFunc: (req: express.Request) => any): void => {\n global.getViewerRef = getViewerFunc\n}\n","import {internalGetEnv} from '@orion-js/env'\nimport express from 'express'\n\nglobal.appRef = null\nglobal.serverRef = null\n\nexport interface StartOrionOptions {\n keepAliveTimeout?: number\n}\n\nexport const startServer = (\n port: number = Number(internalGetEnv('http_port', 'PORT')),\n otherOptions: StartOrionOptions = {},\n) => {\n const app = getApp()\n\n const server = app.listen(port)\n global.serverRef = server\n\n if (otherOptions.keepAliveTimeout) {\n server.keepAliveTimeout = otherOptions.keepAliveTimeout // Ensure all inactive connections are terminated by the ALB, by setting this a few seconds higher than the ALB idle timeout\n server.headersTimeout = otherOptions.keepAliveTimeout + 1000\n }\n\n return app\n}\n\nexport const getApp = (): express.Express => {\n if (global.appRef) return global.appRef as express.Express\n\n const app = express()\n\n global.appRef = app\n\n return app\n}\n\nexport const getServer = () => {\n return global.serverRef\n}\n","import {setOnError, onError} from './errors'\nimport {getViewer, setGetViewer} from './viewer'\nimport {startServer, getApp, getServer} from './start'\nimport express from 'express'\nimport registerRoute from './routes/registerRoute'\nimport registerRoutes from './routes/registerRoutes'\nimport bodyParserLib from 'body-parser'\nimport {RequestHandler} from 'express'\n\nexport * from './routes/route'\n\nconst {json, raw, text, urlencoded} = bodyParserLib\n\nconst bodyParser: {\n json: () => RequestHandler\n raw: () => RequestHandler\n text: () => RequestHandler\n urlencoded: (options?: {extended: boolean}) => RequestHandler\n} = {json, raw, text, urlencoded}\n\nexport {\n express,\n startServer,\n getApp,\n getServer,\n getViewer,\n setGetViewer,\n setOnError,\n onError,\n registerRoute,\n registerRoutes,\n bodyParser,\n}\n\nexport * from './types'\nexport * from './service'\n","import {OrionRequest, RouteType} from './../types'\nimport {getViewer} from './../viewer'\nimport {runWithOrionAsyncContext, updateOrionAsyncContext} from '@orion-js/logger'\nimport express from 'express'\nimport {isNil, type} from 'rambdax'\nimport {internalGetEnv} from '@orion-js/env'\nimport {sleep} from '@orion-js/helpers'\nimport {cleanAndValidate} from '@orion-js/schema'\nimport {onError} from '../errors'\nconst simulateLatency = internalGetEnv('simulate_latency', 'SIMULATE_LATENCY')\n\nexport async function executeRequest(\n route: RouteType<any>,\n req: OrionRequest,\n res: express.Response,\n) {\n if (simulateLatency) {\n const time = Number.parseInt(simulateLatency)\n if (time) {\n const min = time * 0.9\n const max = time * 1.1\n await sleep(Math.floor(Math.random() * (max - min + 1)) + min)\n }\n }\n\n try {\n const viewer = await getViewer(req)\n\n if (route.queryParams) {\n req.query = await cleanAndValidate(route.queryParams ?? {}, req.query)\n }\n\n if (route.bodyParams) {\n req.body = await cleanAndValidate(route.bodyParams ?? {}, req.body)\n }\n\n const context = {\n controllerType: 'route' as const,\n routeName: route.path,\n pathname: req.path,\n viewer,\n params: {\n body: req.body,\n query: req.query,\n params: req.params,\n },\n }\n\n const result = await runWithOrionAsyncContext(context, async () => {\n updateOrionAsyncContext({viewer})\n return await route.resolve(req, res, viewer)\n })\n if (!result) return\n\n // add status code to response\n if (result.statusCode) {\n res.status(result.statusCode)\n }\n\n // add headers to response\n if (result.headers) {\n for (const key in result.headers) {\n res.setHeader(key, result.headers[key])\n }\n }\n\n // add body to response\n if (!isNil(result.body)) {\n let body = result.body\n\n if (route.returns) {\n body = await cleanAndValidate(route.returns, result.body)\n }\n\n if (type(body) === 'Object') {\n res.json(body)\n } else {\n res.send(body)\n }\n }\n } catch (error) {\n await onError(req, res, error)\n }\n}\n","export function type(input){\n if (input === null){\n return 'Null'\n } else if (input === undefined){\n return 'Undefined'\n } else if (Number.isNaN(input)){\n return 'NaN'\n }\n const typeResult = Object.prototype.toString.call(input).slice(8, -1)\n\n return typeResult === 'AsyncFunction' ? 'Promise' : typeResult\n}\n","export function isNil(x){\n return x === undefined || x === null\n}\n","import {getApp} from './../start'\nimport {RouteType} from '../types'\nimport {executeRequest} from './executeRequest'\nimport express from 'express'\nimport bodyParser from 'body-parser'\n\nexport default function registerRoute(route: RouteType): void {\n const app = route.app || getApp()\n const method = route.method\n\n const handler = async (req, res) => {\n executeRequest(route, req, res)\n }\n\n const handlers: Array<express.RequestHandler> = [handler]\n\n if (route.bodyParser) {\n const parser = bodyParser[route.bodyParser](route.bodyParserOptions)\n handlers.unshift(parser)\n }\n\n if (!route.bodyParser && route.bodyParams) {\n const parser = bodyParser.json(route.bodyParserOptions)\n handlers.unshift(parser)\n }\n\n if (route.middlewares) {\n handlers.unshift(...route.middlewares)\n }\n\n app[method](route.path, ...handlers)\n}\n","import registerRoute from './registerRoute'\nimport {RoutesMap} from '../types'\n\nexport default function registerRoutes(routesMap: RoutesMap): void {\n const routes = Object.values(routesMap)\n\n for (const route of routes) {\n registerRoute(route)\n }\n}\n","import {Schema, SchemaFieldType} from '@orion-js/schema'\nimport {RouteType, OrionRouteOptions} from '../types'\n\nexport function createRoute<\n TPath extends string,\n TQueryParamsSchema extends Schema | undefined,\n TBodyParamsSchema extends Schema | undefined,\n TReturnsSchema extends SchemaFieldType | undefined,\n>(\n options: OrionRouteOptions<TPath, TQueryParamsSchema, TBodyParamsSchema, TReturnsSchema>,\n): RouteType<TPath, TQueryParamsSchema, TBodyParamsSchema, TReturnsSchema> {\n return {\n ...options,\n }\n}\n\n/**\n * @deprecated Use createRoute instead\n */\nexport const route = createRoute\n","import {getInstance, Service} from '@orion-js/services'\nimport {createRoute} from '../routes/route'\nimport {OrionRouteOptions, RoutesMap} from '../types'\n\n// Define metadata storage using WeakMaps\nconst serviceMetadata = new WeakMap<any, {_serviceType: string}>()\nconst routeMetadata = new WeakMap<any, Record<string, any>>()\n\nexport function Routes() {\n return (target: any, context: ClassDecoratorContext<any>) => {\n Service()(target, context)\n\n context.addInitializer(function (this) {\n serviceMetadata.set(this, {_serviceType: 'routes'})\n })\n }\n}\n\nexport function Route(): (method: any, context: ClassFieldDecoratorContext) => any\nexport function Route(\n options?: Omit<OrionRouteOptions<any, any, any, any>, 'resolve'>,\n): (method: any, context: ClassMethodDecoratorContext) => any\nexport function Route(options?: Omit<OrionRouteOptions<any, any, any, any>, 'resolve'>) {\n return (method: any, context: ClassFieldDecoratorContext | ClassMethodDecoratorContext) => {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this) {\n const routes = routeMetadata.get(this) || {}\n\n if (context.kind === 'method') {\n routes[propertyKey] = createRoute({\n ...options,\n resolve: this[propertyKey].bind(this),\n })\n }\n\n if (context.kind === 'field') {\n routes[propertyKey] = this[propertyKey]\n }\n\n routeMetadata.set(this, routes)\n })\n\n return method\n }\n}\n\nexport function getServiceRoutes(target: any): RoutesMap {\n const instance = getInstance(target)\n\n if (!serviceMetadata.has(instance.constructor)) {\n throw new Error('You must pass a class decorated with @Routes to getServiceRoutes')\n }\n\n const instanceMetadata = serviceMetadata.get(instance.constructor)\n if (instanceMetadata._serviceType !== 'routes') {\n throw new Error('You must pass a class decorated with @Routes to getServiceRoutes')\n }\n\n const routesMap = routeMetadata.get(instance) || {}\n\n return routesMap\n}\n"],"mappings":"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","names":["express","internalGetEnv","internalGetEnv","route","route","route","bodyParser"]} | ||
| {"version":3,"sources":["../src/errors.ts","../src/viewer.ts","../src/start.ts","../src/index.ts","../src/routes/registerRoute.ts","../src/routes/executeRequest.ts","../src/routes/registerRoutes.ts","../src/routes/route.ts","../src/service/index.ts"],"sourcesContent":["import crypto from 'node:crypto'\nimport {logger} from '@orion-js/logger'\nimport express from 'express'\n\ntype onErrorFunction = (req: express.Request, res: express.Response, error: any) => Promise<void>\n\nconst defaultOnError: onErrorFunction = async (req, res, error) => {\n if (error.isOrionError) {\n let statusCode = 400\n if (error.code === 'AuthError') {\n statusCode = 401\n } else {\n logger.error(`[route/handler] OrionError in ${req.path}:`, {error})\n }\n\n const data = error.getInfo()\n\n res.status(statusCode)\n res.json(data)\n } else if (error.isGraphQLError) {\n res.writeHead(error.statusCode)\n res.end(error.message)\n logger.error(`[route/handler] GraphQLError in ${req.path}:`, {error})\n } else {\n const hash = crypto\n .createHash('sha1')\n .update(error.message, 'utf8')\n .digest('hex')\n .substring(0, 10)\n const statusCode = 500\n const data = {error: 500, message: 'Internal server error', hash}\n\n res.status(statusCode)\n res.json(data)\n\n error.hash = hash\n logger.error('[route/handler] Internal server error', {error, url: req.url, hash})\n }\n}\n\nlet onErrorRef: onErrorFunction = defaultOnError\n\nexport const onError: onErrorFunction = async (req, res, error) => {\n return onErrorRef(req, res, error)\n}\n\nexport const setOnError = (onErrorFunc: onErrorFunction): void => {\n onErrorRef = onErrorFunc\n}\n","import express from 'express'\nimport {UserError} from '@orion-js/helpers'\n\nglobal.getViewerRef = () => null\n\nexport const getViewer = async (req: express.Request): Promise<any> => {\n try {\n const viewer = await global.getViewerRef(req)\n if (!viewer) return {}\n return viewer\n } catch (err) {\n throw new UserError('AuthError', err.message)\n }\n}\n\nexport const setGetViewer = (getViewerFunc: (req: express.Request) => any): void => {\n global.getViewerRef = getViewerFunc\n}\n","import {internalGetEnv} from '@orion-js/env'\nimport express from 'express'\n\nglobal.appRef = null\nglobal.serverRef = null\n\nexport interface StartOrionOptions {\n keepAliveTimeout?: number\n}\n\nexport const startServer = (\n port: number = Number(internalGetEnv('http_port', 'PORT')),\n otherOptions: StartOrionOptions = {},\n) => {\n const app = getApp()\n\n const server = app.listen(port)\n global.serverRef = server\n\n if (otherOptions.keepAliveTimeout) {\n server.keepAliveTimeout = otherOptions.keepAliveTimeout // Ensure all inactive connections are terminated by the ALB, by setting this a few seconds higher than the ALB idle timeout\n server.headersTimeout = otherOptions.keepAliveTimeout + 1000\n }\n\n return app\n}\n\nexport const getApp = (): express.Express => {\n if (global.appRef) return global.appRef as express.Express\n\n const app = express()\n\n global.appRef = app\n\n return app\n}\n\nexport const getServer = () => {\n return global.serverRef\n}\n","import {setOnError, onError} from './errors'\nimport {getViewer, setGetViewer} from './viewer'\nimport {startServer, getApp, getServer} from './start'\nimport express from 'express'\nimport registerRoute from './routes/registerRoute'\nimport registerRoutes from './routes/registerRoutes'\nimport bodyParserLib from 'body-parser'\nimport {RequestHandler} from 'express'\n\nexport * from './routes/route'\n\nconst {json, raw, text, urlencoded} = bodyParserLib\n\nconst bodyParser: {\n json: () => RequestHandler\n raw: () => RequestHandler\n text: () => RequestHandler\n urlencoded: (options?: {extended: boolean}) => RequestHandler\n} = {json, raw, text, urlencoded}\n\nexport {\n express,\n startServer,\n getApp,\n getServer,\n getViewer,\n setGetViewer,\n setOnError,\n onError,\n registerRoute,\n registerRoutes,\n bodyParser,\n}\n\nexport * from './types'\nexport * from './service'\n","import bodyParser from 'body-parser'\nimport express from 'express'\nimport {getApp} from './../start'\nimport {RouteType} from '../types'\nimport {executeRequest} from './executeRequest'\n\nconst appRegisteredRoutes = new WeakMap<express.Application, WeakSet<RouteType>>()\n\nfunction getRegisteredRoutes(app: express.Application) {\n if (appRegisteredRoutes.has(app)) {\n return appRegisteredRoutes.get(app)\n }\n\n const routes = new WeakSet<RouteType>()\n appRegisteredRoutes.set(app, routes)\n return routes\n}\n\nexport default function registerRoute(route: RouteType): void {\n const app = route.app || getApp()\n const registeredRoutes = getRegisteredRoutes(app)\n if (registeredRoutes.has(route)) return\n\n const method = route.method\n\n const handler: express.RequestHandler = (req, res) => {\n void executeRequest(route, req as any, res)\n }\n\n const handlers: Array<express.RequestHandler> = [handler]\n\n if (route.bodyParser) {\n const parser = bodyParser[route.bodyParser](route.bodyParserOptions)\n handlers.unshift(parser)\n }\n\n if (!route.bodyParser && route.bodyParams) {\n const parser = bodyParser.json(route.bodyParserOptions)\n handlers.unshift(parser)\n }\n\n if (route.middlewares) {\n handlers.unshift(...route.middlewares)\n }\n\n app[method](route.path, ...handlers)\n registeredRoutes.add(route)\n}\n","import {internalGetEnv} from '@orion-js/env'\nimport {sleep} from '@orion-js/helpers'\nimport {runWithOrionAsyncContext, updateOrionAsyncContext} from '@orion-js/logger'\nimport {cleanAndValidate} from '@orion-js/schema'\nimport express from 'express'\nimport {onError} from '../errors'\nimport {OrionRequest, RouteType} from './../types'\nimport {getViewer} from './../viewer'\n\nconst simulateLatency = internalGetEnv('simulate_latency', 'SIMULATE_LATENCY')\nconst simulateLatencyMs = Number.parseInt(simulateLatency, 10)\nconst hasSimulateLatency = Number.isFinite(simulateLatencyMs) && simulateLatencyMs > 0\nconst latencyMinMs = hasSimulateLatency ? Math.floor(simulateLatencyMs * 0.9) : 0\nconst latencyMaxMs = hasSimulateLatency ? Math.ceil(simulateLatencyMs * 1.1) : 0\n\nconst objectToString = Object.prototype.toString\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return objectToString.call(value) === '[object Object]'\n}\n\nexport async function executeRequest(\n route: RouteType<any>,\n req: OrionRequest,\n res: express.Response,\n) {\n try {\n if (hasSimulateLatency) {\n const delay = Math.floor(Math.random() * (latencyMaxMs - latencyMinMs + 1)) + latencyMinMs\n await sleep(delay)\n }\n\n const viewer = await getViewer(req)\n\n if (route.queryParams) {\n req.query = await cleanAndValidate(route.queryParams, req.query)\n }\n\n if (route.bodyParams) {\n req.body = await cleanAndValidate(route.bodyParams, req.body)\n }\n\n const context = {\n controllerType: 'route' as const,\n routeName: route.path,\n pathname: req.path,\n viewer,\n params: {\n body: req.body,\n query: req.query,\n params: req.params,\n },\n }\n\n const result = await runWithOrionAsyncContext(context, () => {\n updateOrionAsyncContext({viewer})\n return route.resolve(req, res, viewer)\n })\n if (!result) return\n\n // add status code to response\n if (result.statusCode) {\n res.status(result.statusCode)\n }\n\n // add headers to response\n if (result.headers) {\n res.set(result.headers)\n }\n\n // add body to response\n if (result.body !== null && result.body !== undefined) {\n let body = result.body\n\n if (route.returns) {\n body = await cleanAndValidate(route.returns, result.body)\n }\n\n if (isPlainObject(body)) {\n res.json(body)\n } else {\n res.send(body)\n }\n }\n } catch (error) {\n await onError(req, res, error)\n }\n}\n","import {RoutesMap} from '../types'\nimport registerRoute from './registerRoute'\n\nexport default function registerRoutes(routesMap: RoutesMap): void {\n for (const routeName in routesMap) {\n registerRoute(routesMap[routeName])\n }\n}\n","import {Schema, SchemaFieldType} from '@orion-js/schema'\nimport {RouteType, OrionRouteOptions} from '../types'\n\nexport function createRoute<\n TPath extends string,\n TQueryParamsSchema extends Schema | undefined,\n TBodyParamsSchema extends Schema | undefined,\n TReturnsSchema extends SchemaFieldType | undefined,\n>(\n options: OrionRouteOptions<TPath, TQueryParamsSchema, TBodyParamsSchema, TReturnsSchema>,\n): RouteType<TPath, TQueryParamsSchema, TBodyParamsSchema, TReturnsSchema> {\n return {\n ...options,\n }\n}\n\n/**\n * @deprecated Use createRoute instead\n */\nexport const route = createRoute\n","import {getInstance, Service} from '@orion-js/services'\nimport {createRoute} from '../routes/route'\nimport {OrionRouteOptions, RoutesMap} from '../types'\n\n// Define metadata storage using WeakMaps\nconst serviceMetadata = new WeakMap<any, {_serviceType: string}>()\nconst routeMetadata = new WeakMap<any, Record<string, any>>()\n\nexport function Routes() {\n return (target: any, context: ClassDecoratorContext<any>) => {\n Service()(target, context)\n\n context.addInitializer(function (this) {\n serviceMetadata.set(this, {_serviceType: 'routes'})\n })\n }\n}\n\nexport function Route(): (method: any, context: ClassFieldDecoratorContext) => any\nexport function Route(\n options?: Omit<OrionRouteOptions<any, any, any, any>, 'resolve'>,\n): (method: any, context: ClassMethodDecoratorContext) => any\nexport function Route(options?: Omit<OrionRouteOptions<any, any, any, any>, 'resolve'>) {\n return (method: any, context: ClassFieldDecoratorContext | ClassMethodDecoratorContext) => {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this) {\n const routes = routeMetadata.get(this) || {}\n\n if (context.kind === 'method') {\n routes[propertyKey] = createRoute({\n ...options,\n resolve: this[propertyKey].bind(this),\n })\n }\n\n if (context.kind === 'field') {\n routes[propertyKey] = this[propertyKey]\n }\n\n routeMetadata.set(this, routes)\n })\n\n return method\n }\n}\n\nexport function getServiceRoutes(target: any): RoutesMap {\n const instance = getInstance(target)\n\n if (!serviceMetadata.has(instance.constructor)) {\n throw new Error('You must pass a class decorated with @Routes to getServiceRoutes')\n }\n\n const instanceMetadata = serviceMetadata.get(instance.constructor)\n if (instanceMetadata._serviceType !== 'routes') {\n throw new Error('You must pass a class decorated with @Routes to getServiceRoutes')\n }\n\n const routesMap = routeMetadata.get(instance) || {}\n\n return routesMap\n}\n"],"mappings":"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","names":["express","internalGetEnv","internalGetEnv","route","route","bodyParser"]} |
+4
-4
| { | ||
| "name": "@orion-js/http", | ||
| "version": "4.2.2", | ||
| "version": "4.2.3", | ||
| "main": "./dist/index.cjs", | ||
@@ -15,6 +15,6 @@ "types": "./dist/index.d.ts", | ||
| "@orion-js/env": "4.2.1", | ||
| "@orion-js/helpers": "4.2.0", | ||
| "@orion-js/schema": "4.2.1", | ||
| "@orion-js/resolvers": "4.2.1", | ||
| "@orion-js/services": "4.2.0", | ||
| "@orion-js/resolvers": "4.2.1", | ||
| "@orion-js/schema": "4.2.1" | ||
| "@orion-js/helpers": "4.2.0" | ||
| }, | ||
@@ -21,0 +21,0 @@ "peerDependencies": { |
65203
1.22%666
-0.89%