Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@orion-js/http

Package Overview
Dependencies
Maintainers
1
Versions
132
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@orion-js/http - npm Package Compare versions

Comparing version
4.2.2
to
4.2.3
+41
-46
dist/index.cjs

@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAAA;AAAA,EAAA;AAAA,iCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,yBAAmB;AACnB,oBAAqB;AAKrB,IAAM,iBAAkC,OAAO,KAAK,KAAK,UAAU;AACjE,MAAI,MAAM,cAAc;AACtB,QAAI,aAAa;AACjB,QAAI,MAAM,SAAS,aAAa;AAC9B,mBAAa;AAAA,IACf,OAAO;AACL,2BAAO,MAAM,iCAAiC,IAAI,IAAI,KAAK,EAAC,MAAK,CAAC;AAAA,IACpE;AAEA,UAAM,OAAO,MAAM,QAAQ;AAE3B,QAAI,OAAO,UAAU;AACrB,QAAI,KAAK,IAAI;AAAA,EACf,WAAW,MAAM,gBAAgB;AAC/B,QAAI,UAAU,MAAM,UAAU;AAC9B,QAAI,IAAI,MAAM,OAAO;AACrB,yBAAO,MAAM,mCAAmC,IAAI,IAAI,KAAK,EAAC,MAAK,CAAC;AAAA,EACtE,OAAO;AACL,UAAM,OAAO,mBAAAC,QACV,WAAW,MAAM,EACjB,OAAO,MAAM,SAAS,MAAM,EAC5B,OAAO,KAAK,EACZ,UAAU,GAAG,EAAE;AAClB,UAAM,aAAa;AACnB,UAAM,OAAO,EAAC,OAAO,KAAK,SAAS,yBAAyB,KAAI;AAEhE,QAAI,OAAO,UAAU;AACrB,QAAI,KAAK,IAAI;AAEb,UAAM,OAAO;AACb,yBAAO,MAAM,yCAAyC,EAAC,OAAO,KAAK,IAAI,KAAK,KAAI,CAAC;AAAA,EACnF;AACF;AAEA,IAAI,aAA8B;AAE3B,IAAM,UAA2B,OAAO,KAAK,KAAK,UAAU;AACjE,SAAO,WAAW,KAAK,KAAK,KAAK;AACnC;AAEO,IAAM,aAAa,CAAC,gBAAuC;AAChE,eAAa;AACf;;;AC/CA,qBAAwB;AAExB,OAAO,eAAe,MAAM;AAErB,IAAM,YAAY,OAAO,QAAuC;AACrE,MAAI;AACF,UAAM,SAAS,MAAM,OAAO,aAAa,GAAG;AAC5C,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,UAAM,IAAI,yBAAU,aAAa,IAAI,OAAO;AAAA,EAC9C;AACF;AAEO,IAAM,eAAe,CAAC,kBAAuD;AAClF,SAAO,eAAe;AACxB;;;ACjBA,iBAA6B;AAC7B,qBAAoB;AAEpB,OAAO,SAAS;AAChB,OAAO,YAAY;AAMZ,IAAM,cAAc,CACzB,OAAe,WAAO,2BAAe,aAAa,MAAM,CAAC,GACzD,eAAkC,CAAC,MAChC;AACH,QAAM,MAAM,OAAO;AAEnB,QAAM,SAAS,IAAI,OAAO,IAAI;AAC9B,SAAO,YAAY;AAEnB,MAAI,aAAa,kBAAkB;AACjC,WAAO,mBAAmB,aAAa;AACvC,WAAO,iBAAiB,aAAa,mBAAmB;AAAA,EAC1D;AAEA,SAAO;AACT;AAEO,IAAM,SAAS,MAAuB;AAC3C,MAAI,OAAO,OAAQ,QAAO,OAAO;AAEjC,QAAM,UAAM,eAAAC,SAAQ;AAEpB,SAAO,SAAS;AAEhB,SAAO;AACT;AAEO,IAAM,YAAY,MAAM;AAC7B,SAAO,OAAO;AAChB;;;AHpCA,IAAAC,kBAAoB;;;AIHpB,yBAAuB;;;ACAvB,IAAAC,cAA6B;AAC7B,IAAAC,kBAAoB;AACpB,IAAAC,iBAAgE;AAChE,oBAA+B;AAM/B,IAAM,sBAAkB,4BAAe,oBAAoB,kBAAkB;AAC7E,IAAM,oBAAoB,OAAO,SAAS,iBAAiB,EAAE;AAC7D,IAAM,qBAAqB,OAAO,SAAS,iBAAiB,KAAK,oBAAoB;AACrF,IAAM,eAAe,qBAAqB,KAAK,MAAM,oBAAoB,GAAG,IAAI;AAChF,IAAM,eAAe,qBAAqB,KAAK,KAAK,oBAAoB,GAAG,IAAI;AAE/E,IAAM,iBAAiB,OAAO,UAAU;AACxC,SAAS,cAAc,OAAkD;AACvE,SAAO,eAAe,KAAK,KAAK,MAAM;AACxC;AAEA,eAAsB,eACpBC,QACA,KACA,KACA;AACA,MAAI;AACF,QAAI,oBAAoB;AACtB,YAAM,QAAQ,KAAK,MAAM,KAAK,OAAO,KAAK,eAAe,eAAe,EAAE,IAAI;AAC9E,gBAAM,uBAAM,KAAK;AAAA,IACnB;AAEA,UAAM,SAAS,MAAM,UAAU,GAAG;AAElC,QAAIA,OAAM,aAAa;AACrB,UAAI,QAAQ,UAAM,gCAAiBA,OAAM,aAAa,IAAI,KAAK;AAAA,IACjE;AAEA,QAAIA,OAAM,YAAY;AACpB,UAAI,OAAO,UAAM,gCAAiBA,OAAM,YAAY,IAAI,IAAI;AAAA,IAC9D;AAEA,UAAM,UAAU;AAAA,MACd,gBAAgB;AAAA,MAChB,WAAWA,OAAM;AAAA,MACjB,UAAU,IAAI;AAAA,MACd;AAAA,MACA,QAAQ;AAAA,QACN,MAAM,IAAI;AAAA,QACV,OAAO,IAAI;AAAA,QACX,QAAQ,IAAI;AAAA,MACd;AAAA,IACF;AAEA,UAAM,SAAS,UAAM,yCAAyB,SAAS,MAAM;AAC3D,kDAAwB,EAAC,OAAM,CAAC;AAChC,aAAOA,OAAM,QAAQ,KAAK,KAAK,MAAM;AAAA,IACvC,CAAC;AACD,QAAI,CAAC,OAAQ;AAGb,QAAI,OAAO,YAAY;AACrB,UAAI,OAAO,OAAO,UAAU;AAAA,IAC9B;AAGA,QAAI,OAAO,SAAS;AAClB,UAAI,IAAI,OAAO,OAAO;AAAA,IACxB;AAGA,QAAI,OAAO,SAAS,QAAQ,OAAO,SAAS,QAAW;AACrD,UAAI,OAAO,OAAO;AAElB,UAAIA,OAAM,SAAS;AACjB,eAAO,UAAM,gCAAiBA,OAAM,SAAS,OAAO,IAAI;AAAA,MAC1D;AAEA,UAAI,cAAc,IAAI,GAAG;AACvB,YAAI,KAAK,IAAI;AAAA,MACf,OAAO;AACL,YAAI,KAAK,IAAI;AAAA,MACf;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,QAAQ,KAAK,KAAK,KAAK;AAAA,EAC/B;AACF;;;ADhFA,IAAM,sBAAsB,oBAAI,QAAiD;AAEjF,SAAS,oBAAoB,KAA0B;AACrD,MAAI,oBAAoB,IAAI,GAAG,GAAG;AAChC,WAAO,oBAAoB,IAAI,GAAG;AAAA,EACpC;AAEA,QAAM,SAAS,oBAAI,QAAmB;AACtC,sBAAoB,IAAI,KAAK,MAAM;AACnC,SAAO;AACT;AAEe,SAAR,cAA+BC,QAAwB;AAC5D,QAAM,MAAMA,OAAM,OAAO,OAAO;AAChC,QAAM,mBAAmB,oBAAoB,GAAG;AAChD,MAAI,iBAAiB,IAAIA,MAAK,EAAG;AAEjC,QAAM,SAASA,OAAM;AAErB,QAAM,UAAkC,CAAC,KAAK,QAAQ;AACpD,SAAK,eAAeA,QAAO,KAAY,GAAG;AAAA,EAC5C;AAEA,QAAM,WAA0C,CAAC,OAAO;AAExD,MAAIA,OAAM,YAAY;AACpB,UAAM,SAAS,mBAAAC,QAAWD,OAAM,UAAU,EAAEA,OAAM,iBAAiB;AACnE,aAAS,QAAQ,MAAM;AAAA,EACzB;AAEA,MAAI,CAACA,OAAM,cAAcA,OAAM,YAAY;AACzC,UAAM,SAAS,mBAAAC,QAAW,KAAKD,OAAM,iBAAiB;AACtD,aAAS,QAAQ,MAAM;AAAA,EACzB;AAEA,MAAIA,OAAM,aAAa;AACrB,aAAS,QAAQ,GAAGA,OAAM,WAAW;AAAA,EACvC;AAEA,MAAI,MAAM,EAAEA,OAAM,MAAM,GAAG,QAAQ;AACnC,mBAAiB,IAAIA,MAAK;AAC5B;;;AE5Ce,SAAR,eAAgC,WAA4B;AACjE,aAAW,aAAa,WAAW;AACjC,kBAAc,UAAU,SAAS,CAAC;AAAA,EACpC;AACF;;;ANDA,IAAAE,sBAA0B;;;AOHnB,SAAS,YAMd,SACyE;AACzE,SAAO;AAAA,IACL,GAAG;AAAA,EACL;AACF;AAKO,IAAM,QAAQ;;;ACnBrB,sBAAmC;AAKnC,IAAM,kBAAkB,oBAAI,QAAqC;AACjE,IAAM,gBAAgB,oBAAI,QAAkC;AAErD,SAAS,SAAS;AACvB,SAAO,CAAC,QAAa,YAAwC;AAC3D,iCAAQ,EAAE,QAAQ,OAAO;AAEzB,YAAQ,eAAe,WAAgB;AACrC,sBAAgB,IAAI,MAAM,EAAC,cAAc,SAAQ,CAAC;AAAA,IACpD,CAAC;AAAA,EACH;AACF;AAMO,SAAS,MAAM,SAAkE;AACtF,SAAO,CAAC,QAAa,YAAsE;AACzF,UAAM,cAAc,OAAO,QAAQ,IAAI;AAEvC,YAAQ,eAAe,WAAgB;AACrC,YAAM,SAAS,cAAc,IAAI,IAAI,KAAK,CAAC;AAE3C,UAAI,QAAQ,SAAS,UAAU;AAC7B,eAAO,WAAW,IAAI,YAAY;AAAA,UAChC,GAAG;AAAA,UACH,SAAS,KAAK,WAAW,EAAE,KAAK,IAAI;AAAA,QACtC,CAAC;AAAA,MACH;AAEA,UAAI,QAAQ,SAAS,SAAS;AAC5B,eAAO,WAAW,IAAI,KAAK,WAAW;AAAA,MACxC;AAEA,oBAAc,IAAI,MAAM,MAAM;AAAA,IAChC,CAAC;AAED,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iBAAiB,QAAwB;AACvD,QAAM,eAAW,6BAAY,MAAM;AAEnC,MAAI,CAAC,gBAAgB,IAAI,SAAS,WAAW,GAAG;AAC9C,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AAEA,QAAM,mBAAmB,gBAAgB,IAAI,SAAS,WAAW;AACjE,MAAI,iBAAiB,iBAAiB,UAAU;AAC9C,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AAEA,QAAM,YAAY,cAAc,IAAI,QAAQ,KAAK,CAAC;AAElD,SAAO;AACT;;;ARnDA,IAAM,EAAC,MAAM,KAAK,MAAM,WAAU,IAAI,oBAAAC;AAEtC,IAAMC,cAKF,EAAC,MAAM,KAAK,MAAM,WAAU;","names":["bodyParser","express","crypto","express","import_express","import_env","import_helpers","import_logger","route","route","bodyParser","import_body_parser","bodyParserLib","bodyParser"]}

@@ -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"]}
{
"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": {