🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@sebspark/openapi-express

Package Overview
Dependencies
Maintainers
3
Versions
72
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@sebspark/openapi-express - npm Package Compare versions

Comparing version
5.4.5
to
5.4.6
+1
-1
dist/index.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.mjs","names":["pkg.name"],"sources":["../package.json","../src/router.ts"],"sourcesContent":["","import {\n ATTR_CLIENT_ADDRESS,\n ATTR_ERROR_TYPE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_NETWORK_PROTOCOL_VERSION,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_PATH,\n ATTR_URL_QUERY,\n ATTR_URL_SCHEME,\n ATTR_USER_AGENT_ORIGINAL,\n METRIC_HTTP_SERVER_REQUEST_DURATION,\n} from '@opentelemetry/semantic-conventions'\nimport {\n type APIResponse,\n type APIServerDefinition,\n type APIServerOptions,\n createHttpError,\n type HttpError,\n type Verb,\n} from '@sebspark/openapi-core'\nimport { getLogger, getTracer, SpanStatusCode } from '@sebspark/otel'\nimport {\n type ErrorRequestHandler,\n json,\n type NextFunction,\n type Request,\n type RequestHandler,\n type Response,\n Router,\n} from 'express'\nimport pkg from '../package.json' with { type: 'json' }\n\nexport const TypedRouter = (\n api: APIServerDefinition,\n options: APIServerOptions = {}\n): Router => {\n const logger = getLogger(pkg.name)\n const tracer = getTracer(pkg.name)\n const router = Router()\n\n router.use(json() as unknown as RequestHandler)\n\n // Add global pre to router\n const preUsings = Array.isArray(options.pre)\n ? options.pre\n : options.pre\n ? [options.pre]\n : []\n for (const pre of preUsings) {\n router.use(pre)\n }\n\n // loop through urls on server definition\n for (const [url, methods] of Object.entries(api)) {\n // loop through methods on url\n for (const [method, route] of Object.entries(methods)) {\n // Build handler for url/method\n const handler = async (\n req: Request,\n res: Response,\n next: NextFunction\n ) => {\n const startTime = performance.now()\n const span = tracer.startSpan(`${method.toUpperCase()} ${url}`)\n const query = req.url.split('?')[1]\n const port = req.socket.localPort\n const ip = req.ip\n const userAgent = req.get('user-agent')\n const requestAttributes = {\n [ATTR_HTTP_REQUEST_METHOD]: req.method,\n [ATTR_HTTP_ROUTE]: url,\n [ATTR_URL_PATH]: req.path,\n ...(query && { [ATTR_URL_QUERY]: query }),\n [ATTR_URL_SCHEME]: req.protocol,\n [ATTR_SERVER_ADDRESS]: req.hostname,\n ...(port && { [ATTR_SERVER_PORT]: port }),\n [ATTR_NETWORK_PROTOCOL_VERSION]: req.httpVersion,\n ...(ip && { [ATTR_CLIENT_ADDRESS]: ip }),\n ...(userAgent && { [ATTR_USER_AGENT_ORIGINAL]: userAgent }),\n }\n span.setAttributes(requestAttributes)\n\n try {\n const [status, response] = await route.handler(req)\n res.status(status)\n\n span.setAttributes({ [ATTR_HTTP_RESPONSE_STATUS_CODE]: status })\n span.setStatus({ code: SpanStatusCode.OK })\n\n if (!response) {\n res.end()\n return\n }\n\n const { headers, data } = response as APIResponse<\n unknown,\n Record<string, string>\n >\n\n if (headers) {\n for (const [name, value] of Object.entries(headers)) {\n res.setHeader(name, value)\n }\n }\n\n if (data) {\n res.send(data)\n } else {\n res.end()\n }\n\n logger.info(`${method.toUpperCase()} ${url} ${status}`, {\n ...requestAttributes,\n [METRIC_HTTP_SERVER_REQUEST_DURATION]:\n (performance.now() - startTime) / 1000,\n })\n } catch (error) {\n const err = (\n error instanceof Error ? error : new Error(String(error))\n ) as HttpError\n span.recordException(err)\n span.setStatus({ code: SpanStatusCode.ERROR, message: err.message })\n span.setAttribute(ATTR_ERROR_TYPE, err.constructor.name)\n\n if (err.statusCode) {\n span.setAttributes({\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: err.statusCode,\n })\n }\n\n logger.error(`${method.toUpperCase()} ${url}`, err, {\n ...requestAttributes,\n [METRIC_HTTP_SERVER_REQUEST_DURATION]:\n (performance.now() - startTime) / 1000,\n })\n\n next(error)\n } finally {\n span.setAttribute(\n METRIC_HTTP_SERVER_REQUEST_DURATION,\n (performance.now() - startTime) / 1000\n )\n span.end()\n }\n }\n\n const pre = Array.isArray(route.pre)\n ? route.pre\n : route.pre\n ? [route.pre]\n : []\n const handlers = pre.concat(handler as RequestHandler)\n\n router[method as Verb](url, ...handlers)\n }\n }\n\n router.use(errorHandler)\n\n return router\n}\n\nconst errorHandler: ErrorRequestHandler = (err, _req, res, next) => {\n let error: HttpError = err\n\n if (!error.message || !error.statusCode) {\n let internal: Error\n if (err instanceof Error) {\n internal = err\n } else {\n /* istanbul ignore else */\n if (typeof err === 'string') {\n internal = new Error(err)\n } else {\n internal = new Error(JSON.stringify(err || ''))\n }\n }\n error = createHttpError(500, undefined, internal)\n }\n\n const showStack = process.env.NODE_ENV !== 'production'\n res.status(error.statusCode).send(error.toJSON(showStack))\n next(error)\n}\n"],"mappings":"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"}
{"version":3,"file":"index.mjs","names":["pkg.name"],"sources":["../package.json","../src/router.ts"],"sourcesContent":["","import {\n ATTR_CLIENT_ADDRESS,\n ATTR_ERROR_TYPE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_NETWORK_PROTOCOL_VERSION,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_PATH,\n ATTR_URL_QUERY,\n ATTR_URL_SCHEME,\n ATTR_USER_AGENT_ORIGINAL,\n METRIC_HTTP_SERVER_REQUEST_DURATION,\n} from '@opentelemetry/semantic-conventions'\nimport {\n type APIResponse,\n type APIServerDefinition,\n type APIServerOptions,\n createHttpError,\n type HttpError,\n type Verb,\n} from '@sebspark/openapi-core'\nimport { getLogger, getTracer, SpanStatusCode } from '@sebspark/otel'\nimport {\n type ErrorRequestHandler,\n json,\n type NextFunction,\n type Request,\n type RequestHandler,\n type Response,\n Router,\n} from 'express'\nimport pkg from '../package.json' with { type: 'json' }\n\nexport const TypedRouter = (\n api: APIServerDefinition,\n options: APIServerOptions = {}\n): Router => {\n const logger = getLogger(pkg.name)\n const tracer = getTracer(pkg.name)\n const router = Router()\n\n router.use(json() as unknown as RequestHandler)\n\n // Add global pre to router\n const preUsings = Array.isArray(options.pre)\n ? options.pre\n : options.pre\n ? [options.pre]\n : []\n for (const pre of preUsings) {\n router.use(pre)\n }\n\n // loop through urls on server definition\n for (const [url, methods] of Object.entries(api)) {\n // loop through methods on url\n for (const [method, route] of Object.entries(methods)) {\n // Build handler for url/method\n const handler = async (\n req: Request,\n res: Response,\n next: NextFunction\n ) => {\n const startTime = performance.now()\n const span = tracer.startSpan(`${method.toUpperCase()} ${url}`)\n const query = req.url.split('?')[1]\n const port = req.socket.localPort\n const ip = req.ip\n const userAgent = req.get('user-agent')\n const requestAttributes = {\n [ATTR_HTTP_REQUEST_METHOD]: req.method,\n [ATTR_HTTP_ROUTE]: url,\n [ATTR_URL_PATH]: req.path,\n ...(query && { [ATTR_URL_QUERY]: query }),\n [ATTR_URL_SCHEME]: req.protocol,\n [ATTR_SERVER_ADDRESS]: req.hostname,\n ...(port && { [ATTR_SERVER_PORT]: port }),\n [ATTR_NETWORK_PROTOCOL_VERSION]: req.httpVersion,\n ...(ip && { [ATTR_CLIENT_ADDRESS]: ip }),\n ...(userAgent && { [ATTR_USER_AGENT_ORIGINAL]: userAgent }),\n }\n span.setAttributes(requestAttributes)\n\n try {\n const [status, response] = await route.handler(req)\n res.status(status)\n\n span.setAttributes({ [ATTR_HTTP_RESPONSE_STATUS_CODE]: status })\n span.setStatus({ code: SpanStatusCode.OK })\n\n if (!response) {\n res.end()\n return\n }\n\n const { headers, data } = response as APIResponse<\n unknown,\n Record<string, string>\n >\n\n if (headers) {\n for (const [name, value] of Object.entries(headers)) {\n res.setHeader(name, value)\n }\n }\n\n if (data) {\n res.send(data)\n } else {\n res.end()\n }\n\n logger.info(`${method.toUpperCase()} ${url} ${status}`, {\n ...requestAttributes,\n [METRIC_HTTP_SERVER_REQUEST_DURATION]:\n (performance.now() - startTime) / 1000,\n })\n } catch (error) {\n const err = (\n error instanceof Error ? error : new Error(String(error))\n ) as HttpError\n span.recordException(err)\n span.setStatus({ code: SpanStatusCode.ERROR, message: err.message })\n span.setAttribute(ATTR_ERROR_TYPE, err.constructor.name)\n\n if (err.statusCode) {\n span.setAttributes({\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: err.statusCode,\n })\n }\n\n logger.error(`${method.toUpperCase()} ${url}`, err, {\n ...requestAttributes,\n [METRIC_HTTP_SERVER_REQUEST_DURATION]:\n (performance.now() - startTime) / 1000,\n })\n\n next(error)\n } finally {\n span.setAttribute(\n METRIC_HTTP_SERVER_REQUEST_DURATION,\n (performance.now() - startTime) / 1000\n )\n span.end()\n }\n }\n\n const pre = Array.isArray(route.pre)\n ? route.pre\n : route.pre\n ? [route.pre]\n : []\n const handlers = pre.concat(handler as RequestHandler)\n\n router[method as Verb](url, ...handlers)\n }\n }\n\n router.use(errorHandler)\n\n return router\n}\n\nconst errorHandler: ErrorRequestHandler = (err, _req, res, next) => {\n let error: HttpError = err\n\n if (!error.message || !error.statusCode) {\n let internal: Error\n if (err instanceof Error) {\n internal = err\n } else {\n /* istanbul ignore else */\n if (typeof err === 'string') {\n internal = new Error(err)\n } else {\n internal = new Error(JSON.stringify(err || ''))\n }\n }\n error = createHttpError(500, undefined, internal)\n }\n\n const showStack = process.env.NODE_ENV !== 'production'\n res.status(error.statusCode).send(error.toJSON(showStack))\n next(error)\n}\n"],"mappings":"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"}
{
"name": "@sebspark/openapi-express",
"version": "5.4.5",
"version": "5.4.6",
"license": "Apache-2.0",

@@ -33,3 +33,3 @@ "type": "module",

"@sebspark/openapi-core": "4.1.15",
"@sebspark/otel": "4.1.4"
"@sebspark/otel": "4.1.5"
},

@@ -36,0 +36,0 @@ "peerDependencies": {