@aegislog/express 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -20,11 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- aegisExpressMiddleware: () => aegisExpressMiddleware,
24
- audit: () => import_aegislog2.audit,
25
- context: () => import_aegislog2.context,
26
- createLogger: () => import_aegislog2.createLogger,
27
- logger: () => import_aegislog2.logger
23
+ aegisExpressMiddleware: () => aegisExpressMiddleware
28
24
  });
29
25
  module.exports = __toCommonJS(index_exports);
30
26
 
@@ -32,6 +28,7 @@ module.exports = __toCommonJS(index_exports);
32
28
  var import_aegislog = require("aegislog");
33
29
  function aegisExpressMiddleware(options = {}) {
34
30
  const logRequests = options.logRequests ?? true;
31
+ const activeLogger = options.logger ?? import_aegislog.logger;
35
32
  return async (req, res, next) => {
36
33
  const requestId = req.headers["x-request-id"] || `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`;
37
34
  const traceHeader = req.headers["traceparent"] || req.headers["x-trace-id"];
@@ -51,7 +48,7 @@ function aegisExpressMiddleware(options = {}) {
51
48
  () => {
52
49
  const start = performance.now();
53
50
  if (logRequests) {
54
- import_aegislog.logger.debug(`--> ${req.method} ${req.originalUrl || req.url}`);
51
+ activeLogger.debug(`--> ${req.method} ${req.originalUrl || req.url}`);
55
52
  }
56
53
  res.on("finish", () => {
57
54
  if (!logRequests) return;
@@ -60,11 +57,11 @@ function aegisExpressMiddleware(options = {}) {
60
57
  const level = status >= 500 ? "error" : status >= 400 ? "warn" : "info";
61
58
  const msg = `<-- ${req.method} ${req.originalUrl || req.url} ${status} in ${duration}ms`;
62
59
  if (level === "error") {
63
- import_aegislog.logger.error(msg, { status, durationMs: duration });
60
+ activeLogger.error(msg, { status, durationMs: duration });
64
61
  } else if (level === "warn") {
65
- import_aegislog.logger.warn(msg, { status, durationMs: duration });
62
+ activeLogger.warn(msg, { status, durationMs: duration });
66
63
  } else {
67
- import_aegislog.logger.info(msg, { status, durationMs: duration });
64
+ activeLogger.info(msg, { status, durationMs: duration });
68
65
  }
69
66
  });
70
67
  next();
@@ -72,15 +69,8 @@ function aegisExpressMiddleware(options = {}) {
72
69
  );
73
70
  };
74
71
  }
75
-
76
- // src/index.ts
77
- var import_aegislog2 = require("aegislog");
78
72
  // Annotate the CommonJS export names for ESM import in node:
79
73
  0 && (module.exports = {
80
- aegisExpressMiddleware,
81
- audit,
82
- context,
83
- createLogger,
84
- logger
74
+ aegisExpressMiddleware
85
75
  });
86
76
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/middleware.ts"],"sourcesContent":["export * from \"./middleware.js\";\nexport { logger, audit, context, createLogger } from \"aegislog\";\n","import type { Request, Response, NextFunction } from \"express\";\nimport { type ActorContext, type TenantContext, logger, runWithContext } from \"aegislog\";\n\nexport interface ExpressAegisOptions {\n getActor?: (req: Request) => ActorContext | undefined | Promise<ActorContext | undefined>;\n getTenant?: (req: Request) => TenantContext | undefined | Promise<TenantContext | undefined>;\n logRequests?: boolean;\n}\n\nexport function aegisExpressMiddleware(\n options: ExpressAegisOptions = {},\n): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n const logRequests = options.logRequests ?? true;\n\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n const requestId =\n (req.headers[\"x-request-id\"] as string) ||\n `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`;\n\n const traceHeader = (req.headers[\"traceparent\"] || req.headers[\"x-trace-id\"]) as string;\n const traceId = traceHeader ? traceHeader.split(\"-\")[1] || traceHeader : undefined;\n\n const ip =\n (req.headers[\"x-forwarded-for\"] as string)?.split(\",\")[0]?.trim() ||\n (req.headers[\"x-real-ip\"] as string) ||\n req.socket.remoteAddress;\n\n const userAgent = req.headers[\"user-agent\"] as string;\n\n const actor = options.getActor ? await options.getActor(req) : undefined;\n const tenant = options.getTenant ? await options.getTenant(req) : undefined;\n\n runWithContext(\n {\n requestId,\n traceId,\n actor,\n tenant,\n session: { id: requestId, ip, userAgent },\n },\n () => {\n const start = performance.now();\n\n if (logRequests) {\n logger.debug(`--> ${req.method} ${req.originalUrl || req.url}`);\n }\n\n res.on(\"finish\", () => {\n if (!logRequests) return;\n const duration = Number((performance.now() - start).toFixed(2));\n const status = res.statusCode;\n const level = status >= 500 ? \"error\" : status >= 400 ? \"warn\" : \"info\";\n const msg = `<-- ${req.method} ${req.originalUrl || req.url} ${status} in ${duration}ms`;\n\n if (level === \"error\") {\n logger.error(msg, { status, durationMs: duration });\n } else if (level === \"warn\") {\n logger.warn(msg, { status, durationMs: duration });\n } else {\n logger.info(msg, { status, durationMs: duration });\n }\n });\n\n next();\n },\n );\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,sBAA8E;AAQvE,SAAS,uBACd,UAA+B,CAAC,GACoC;AACpE,QAAM,cAAc,QAAQ,eAAe;AAE3C,SAAO,OAAO,KAAc,KAAe,SAAsC;AAC/E,UAAM,YACH,IAAI,QAAQ,cAAc,KAC3B,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAE1E,UAAM,cAAe,IAAI,QAAQ,aAAa,KAAK,IAAI,QAAQ,YAAY;AAC3E,UAAM,UAAU,cAAc,YAAY,MAAM,GAAG,EAAE,CAAC,KAAK,cAAc;AAEzE,UAAM,KACH,IAAI,QAAQ,iBAAiB,GAAc,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,KAC/D,IAAI,QAAQ,WAAW,KACxB,IAAI,OAAO;AAEb,UAAM,YAAY,IAAI,QAAQ,YAAY;AAE1C,UAAM,QAAQ,QAAQ,WAAW,MAAM,QAAQ,SAAS,GAAG,IAAI;AAC/D,UAAM,SAAS,QAAQ,YAAY,MAAM,QAAQ,UAAU,GAAG,IAAI;AAElE;AAAA,MACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,MAC1C;AAAA,MACA,MAAM;AACJ,cAAM,QAAQ,YAAY,IAAI;AAE9B,YAAI,aAAa;AACf,iCAAO,MAAM,OAAO,IAAI,MAAM,IAAI,IAAI,eAAe,IAAI,GAAG,EAAE;AAAA,QAChE;AAEA,YAAI,GAAG,UAAU,MAAM;AACrB,cAAI,CAAC,YAAa;AAClB,gBAAM,WAAW,QAAQ,YAAY,IAAI,IAAI,OAAO,QAAQ,CAAC,CAAC;AAC9D,gBAAM,SAAS,IAAI;AACnB,gBAAM,QAAQ,UAAU,MAAM,UAAU,UAAU,MAAM,SAAS;AACjE,gBAAM,MAAM,OAAO,IAAI,MAAM,IAAI,IAAI,eAAe,IAAI,GAAG,IAAI,MAAM,OAAO,QAAQ;AAEpF,cAAI,UAAU,SAAS;AACrB,mCAAO,MAAM,KAAK,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UACpD,WAAW,UAAU,QAAQ;AAC3B,mCAAO,KAAK,KAAK,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UACnD,OAAO;AACL,mCAAO,KAAK,KAAK,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UACnD;AAAA,QACF,CAAC;AAED,aAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;;;ADlEA,IAAAA,mBAAqD;","names":["import_aegislog"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/middleware.ts"],"sourcesContent":["export * from \"./middleware.js\";\n","import type { NextFunction, Request, Response } from \"express\";\nimport {\n type ActorContext,\n type AegisLogger,\n type TenantContext,\n logger,\n runWithContext,\n} from \"aegislog\";\n\nexport interface ExpressAegisOptions {\n logger?: AegisLogger;\n getActor?: (req: Request) => ActorContext | undefined | Promise<ActorContext | undefined>;\n getTenant?: (req: Request) => TenantContext | undefined | Promise<TenantContext | undefined>;\n logRequests?: boolean;\n}\n\nexport function aegisExpressMiddleware(\n options: ExpressAegisOptions = {},\n): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n const logRequests = options.logRequests ?? true;\n const activeLogger = options.logger ?? logger;\n\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n const requestId =\n (req.headers[\"x-request-id\"] as string) ||\n `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`;\n\n const traceHeader = (req.headers[\"traceparent\"] || req.headers[\"x-trace-id\"]) as string;\n const traceId = traceHeader ? traceHeader.split(\"-\")[1] || traceHeader : undefined;\n\n const ip =\n (req.headers[\"x-forwarded-for\"] as string)?.split(\",\")[0]?.trim() ||\n (req.headers[\"x-real-ip\"] as string) ||\n req.socket.remoteAddress;\n\n const userAgent = req.headers[\"user-agent\"] as string;\n\n const actor = options.getActor ? await options.getActor(req) : undefined;\n const tenant = options.getTenant ? await options.getTenant(req) : undefined;\n\n runWithContext(\n {\n requestId,\n traceId,\n actor,\n tenant,\n session: { id: requestId, ip, userAgent },\n },\n () => {\n const start = performance.now();\n\n if (logRequests) {\n activeLogger.debug(`--> ${req.method} ${req.originalUrl || req.url}`);\n }\n\n res.on(\"finish\", () => {\n if (!logRequests) return;\n const duration = Number((performance.now() - start).toFixed(2));\n const status = res.statusCode;\n const level = status >= 500 ? \"error\" : status >= 400 ? \"warn\" : \"info\";\n const msg = `<-- ${req.method} ${req.originalUrl || req.url} ${status} in ${duration}ms`;\n\n if (level === \"error\") {\n activeLogger.error(msg, { status, durationMs: duration });\n } else if (level === \"warn\") {\n activeLogger.warn(msg, { status, durationMs: duration });\n } else {\n activeLogger.info(msg, { status, durationMs: duration });\n }\n });\n\n next();\n },\n );\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,sBAMO;AASA,SAAS,uBACd,UAA+B,CAAC,GACoC;AACpE,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,eAAe,QAAQ,UAAU;AAEvC,SAAO,OAAO,KAAc,KAAe,SAAsC;AAC/E,UAAM,YACH,IAAI,QAAQ,cAAc,KAC3B,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAE1E,UAAM,cAAe,IAAI,QAAQ,aAAa,KAAK,IAAI,QAAQ,YAAY;AAC3E,UAAM,UAAU,cAAc,YAAY,MAAM,GAAG,EAAE,CAAC,KAAK,cAAc;AAEzE,UAAM,KACH,IAAI,QAAQ,iBAAiB,GAAc,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,KAC/D,IAAI,QAAQ,WAAW,KACxB,IAAI,OAAO;AAEb,UAAM,YAAY,IAAI,QAAQ,YAAY;AAE1C,UAAM,QAAQ,QAAQ,WAAW,MAAM,QAAQ,SAAS,GAAG,IAAI;AAC/D,UAAM,SAAS,QAAQ,YAAY,MAAM,QAAQ,UAAU,GAAG,IAAI;AAElE;AAAA,MACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,MAC1C;AAAA,MACA,MAAM;AACJ,cAAM,QAAQ,YAAY,IAAI;AAE9B,YAAI,aAAa;AACf,uBAAa,MAAM,OAAO,IAAI,MAAM,IAAI,IAAI,eAAe,IAAI,GAAG,EAAE;AAAA,QACtE;AAEA,YAAI,GAAG,UAAU,MAAM;AACrB,cAAI,CAAC,YAAa;AAClB,gBAAM,WAAW,QAAQ,YAAY,IAAI,IAAI,OAAO,QAAQ,CAAC,CAAC;AAC9D,gBAAM,SAAS,IAAI;AACnB,gBAAM,QAAQ,UAAU,MAAM,UAAU,UAAU,MAAM,SAAS;AACjE,gBAAM,MAAM,OAAO,IAAI,MAAM,IAAI,IAAI,eAAe,IAAI,GAAG,IAAI,MAAM,OAAO,QAAQ;AAEpF,cAAI,UAAU,SAAS;AACrB,yBAAa,MAAM,KAAK,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UAC1D,WAAW,UAAU,QAAQ;AAC3B,yBAAa,KAAK,KAAK,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UACzD,OAAO;AACL,yBAAa,KAAK,KAAK,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UACzD;AAAA,QACF,CAAC;AAED,aAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { Request, Response, NextFunction } from 'express';
2
- import { ActorContext, TenantContext } from 'aegislog';
3
- export { audit, context, createLogger, logger } from 'aegislog';
2
+ import { AegisLogger, ActorContext, TenantContext } from 'aegislog';
4
3
 
5
4
  interface ExpressAegisOptions {
5
+ logger?: AegisLogger;
6
6
  getActor?: (req: Request) => ActorContext | undefined | Promise<ActorContext | undefined>;
7
7
  getTenant?: (req: Request) => TenantContext | undefined | Promise<TenantContext | undefined>;
8
8
  logRequests?: boolean;
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { Request, Response, NextFunction } from 'express';
2
- import { ActorContext, TenantContext } from 'aegislog';
3
- export { audit, context, createLogger, logger } from 'aegislog';
2
+ import { AegisLogger, ActorContext, TenantContext } from 'aegislog';
4
3
 
5
4
  interface ExpressAegisOptions {
5
+ logger?: AegisLogger;
6
6
  getActor?: (req: Request) => ActorContext | undefined | Promise<ActorContext | undefined>;
7
7
  getTenant?: (req: Request) => TenantContext | undefined | Promise<TenantContext | undefined>;
8
8
  logRequests?: boolean;
package/dist/index.js CHANGED
@@ -1,7 +1,11 @@
1
1
  // src/middleware.ts
2
- import { logger, runWithContext } from "aegislog";
2
+ import {
3
+ logger,
4
+ runWithContext
5
+ } from "aegislog";
3
6
  function aegisExpressMiddleware(options = {}) {
4
7
  const logRequests = options.logRequests ?? true;
8
+ const activeLogger = options.logger ?? logger;
5
9
  return async (req, res, next) => {
6
10
  const requestId = req.headers["x-request-id"] || `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`;
7
11
  const traceHeader = req.headers["traceparent"] || req.headers["x-trace-id"];
@@ -21,7 +25,7 @@ function aegisExpressMiddleware(options = {}) {
21
25
  () => {
22
26
  const start = performance.now();
23
27
  if (logRequests) {
24
- logger.debug(`--> ${req.method} ${req.originalUrl || req.url}`);
28
+ activeLogger.debug(`--> ${req.method} ${req.originalUrl || req.url}`);
25
29
  }
26
30
  res.on("finish", () => {
27
31
  if (!logRequests) return;
@@ -30,11 +34,11 @@ function aegisExpressMiddleware(options = {}) {
30
34
  const level = status >= 500 ? "error" : status >= 400 ? "warn" : "info";
31
35
  const msg = `<-- ${req.method} ${req.originalUrl || req.url} ${status} in ${duration}ms`;
32
36
  if (level === "error") {
33
- logger.error(msg, { status, durationMs: duration });
37
+ activeLogger.error(msg, { status, durationMs: duration });
34
38
  } else if (level === "warn") {
35
- logger.warn(msg, { status, durationMs: duration });
39
+ activeLogger.warn(msg, { status, durationMs: duration });
36
40
  } else {
37
- logger.info(msg, { status, durationMs: duration });
41
+ activeLogger.info(msg, { status, durationMs: duration });
38
42
  }
39
43
  });
40
44
  next();
@@ -42,14 +46,7 @@ function aegisExpressMiddleware(options = {}) {
42
46
  );
43
47
  };
44
48
  }
45
-
46
- // src/index.ts
47
- import { logger as logger2, audit, context, createLogger } from "aegislog";
48
49
  export {
49
- aegisExpressMiddleware,
50
- audit,
51
- context,
52
- createLogger,
53
- logger2 as logger
50
+ aegisExpressMiddleware
54
51
  };
55
52
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/middleware.ts","../src/index.ts"],"sourcesContent":["import type { Request, Response, NextFunction } from \"express\";\nimport { type ActorContext, type TenantContext, logger, runWithContext } from \"aegislog\";\n\nexport interface ExpressAegisOptions {\n getActor?: (req: Request) => ActorContext | undefined | Promise<ActorContext | undefined>;\n getTenant?: (req: Request) => TenantContext | undefined | Promise<TenantContext | undefined>;\n logRequests?: boolean;\n}\n\nexport function aegisExpressMiddleware(\n options: ExpressAegisOptions = {},\n): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n const logRequests = options.logRequests ?? true;\n\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n const requestId =\n (req.headers[\"x-request-id\"] as string) ||\n `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`;\n\n const traceHeader = (req.headers[\"traceparent\"] || req.headers[\"x-trace-id\"]) as string;\n const traceId = traceHeader ? traceHeader.split(\"-\")[1] || traceHeader : undefined;\n\n const ip =\n (req.headers[\"x-forwarded-for\"] as string)?.split(\",\")[0]?.trim() ||\n (req.headers[\"x-real-ip\"] as string) ||\n req.socket.remoteAddress;\n\n const userAgent = req.headers[\"user-agent\"] as string;\n\n const actor = options.getActor ? await options.getActor(req) : undefined;\n const tenant = options.getTenant ? await options.getTenant(req) : undefined;\n\n runWithContext(\n {\n requestId,\n traceId,\n actor,\n tenant,\n session: { id: requestId, ip, userAgent },\n },\n () => {\n const start = performance.now();\n\n if (logRequests) {\n logger.debug(`--> ${req.method} ${req.originalUrl || req.url}`);\n }\n\n res.on(\"finish\", () => {\n if (!logRequests) return;\n const duration = Number((performance.now() - start).toFixed(2));\n const status = res.statusCode;\n const level = status >= 500 ? \"error\" : status >= 400 ? \"warn\" : \"info\";\n const msg = `<-- ${req.method} ${req.originalUrl || req.url} ${status} in ${duration}ms`;\n\n if (level === \"error\") {\n logger.error(msg, { status, durationMs: duration });\n } else if (level === \"warn\") {\n logger.warn(msg, { status, durationMs: duration });\n } else {\n logger.info(msg, { status, durationMs: duration });\n }\n });\n\n next();\n },\n );\n };\n}\n","export * from \"./middleware.js\";\nexport { logger, audit, context, createLogger } from \"aegislog\";\n"],"mappings":";AACA,SAAgD,QAAQ,sBAAsB;AAQvE,SAAS,uBACd,UAA+B,CAAC,GACoC;AACpE,QAAM,cAAc,QAAQ,eAAe;AAE3C,SAAO,OAAO,KAAc,KAAe,SAAsC;AAC/E,UAAM,YACH,IAAI,QAAQ,cAAc,KAC3B,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAE1E,UAAM,cAAe,IAAI,QAAQ,aAAa,KAAK,IAAI,QAAQ,YAAY;AAC3E,UAAM,UAAU,cAAc,YAAY,MAAM,GAAG,EAAE,CAAC,KAAK,cAAc;AAEzE,UAAM,KACH,IAAI,QAAQ,iBAAiB,GAAc,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,KAC/D,IAAI,QAAQ,WAAW,KACxB,IAAI,OAAO;AAEb,UAAM,YAAY,IAAI,QAAQ,YAAY;AAE1C,UAAM,QAAQ,QAAQ,WAAW,MAAM,QAAQ,SAAS,GAAG,IAAI;AAC/D,UAAM,SAAS,QAAQ,YAAY,MAAM,QAAQ,UAAU,GAAG,IAAI;AAElE;AAAA,MACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,MAC1C;AAAA,MACA,MAAM;AACJ,cAAM,QAAQ,YAAY,IAAI;AAE9B,YAAI,aAAa;AACf,iBAAO,MAAM,OAAO,IAAI,MAAM,IAAI,IAAI,eAAe,IAAI,GAAG,EAAE;AAAA,QAChE;AAEA,YAAI,GAAG,UAAU,MAAM;AACrB,cAAI,CAAC,YAAa;AAClB,gBAAM,WAAW,QAAQ,YAAY,IAAI,IAAI,OAAO,QAAQ,CAAC,CAAC;AAC9D,gBAAM,SAAS,IAAI;AACnB,gBAAM,QAAQ,UAAU,MAAM,UAAU,UAAU,MAAM,SAAS;AACjE,gBAAM,MAAM,OAAO,IAAI,MAAM,IAAI,IAAI,eAAe,IAAI,GAAG,IAAI,MAAM,OAAO,QAAQ;AAEpF,cAAI,UAAU,SAAS;AACrB,mBAAO,MAAM,KAAK,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UACpD,WAAW,UAAU,QAAQ;AAC3B,mBAAO,KAAK,KAAK,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UACnD,OAAO;AACL,mBAAO,KAAK,KAAK,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UACnD;AAAA,QACF,CAAC;AAED,aAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;;;AClEA,SAAS,UAAAA,SAAQ,OAAO,SAAS,oBAAoB;","names":["logger"]}
1
+ {"version":3,"sources":["../src/middleware.ts"],"sourcesContent":["import type { NextFunction, Request, Response } from \"express\";\nimport {\n type ActorContext,\n type AegisLogger,\n type TenantContext,\n logger,\n runWithContext,\n} from \"aegislog\";\n\nexport interface ExpressAegisOptions {\n logger?: AegisLogger;\n getActor?: (req: Request) => ActorContext | undefined | Promise<ActorContext | undefined>;\n getTenant?: (req: Request) => TenantContext | undefined | Promise<TenantContext | undefined>;\n logRequests?: boolean;\n}\n\nexport function aegisExpressMiddleware(\n options: ExpressAegisOptions = {},\n): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n const logRequests = options.logRequests ?? true;\n const activeLogger = options.logger ?? logger;\n\n return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n const requestId =\n (req.headers[\"x-request-id\"] as string) ||\n `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`;\n\n const traceHeader = (req.headers[\"traceparent\"] || req.headers[\"x-trace-id\"]) as string;\n const traceId = traceHeader ? traceHeader.split(\"-\")[1] || traceHeader : undefined;\n\n const ip =\n (req.headers[\"x-forwarded-for\"] as string)?.split(\",\")[0]?.trim() ||\n (req.headers[\"x-real-ip\"] as string) ||\n req.socket.remoteAddress;\n\n const userAgent = req.headers[\"user-agent\"] as string;\n\n const actor = options.getActor ? await options.getActor(req) : undefined;\n const tenant = options.getTenant ? await options.getTenant(req) : undefined;\n\n runWithContext(\n {\n requestId,\n traceId,\n actor,\n tenant,\n session: { id: requestId, ip, userAgent },\n },\n () => {\n const start = performance.now();\n\n if (logRequests) {\n activeLogger.debug(`--> ${req.method} ${req.originalUrl || req.url}`);\n }\n\n res.on(\"finish\", () => {\n if (!logRequests) return;\n const duration = Number((performance.now() - start).toFixed(2));\n const status = res.statusCode;\n const level = status >= 500 ? \"error\" : status >= 400 ? \"warn\" : \"info\";\n const msg = `<-- ${req.method} ${req.originalUrl || req.url} ${status} in ${duration}ms`;\n\n if (level === \"error\") {\n activeLogger.error(msg, { status, durationMs: duration });\n } else if (level === \"warn\") {\n activeLogger.warn(msg, { status, durationMs: duration });\n } else {\n activeLogger.info(msg, { status, durationMs: duration });\n }\n });\n\n next();\n },\n );\n };\n}\n"],"mappings":";AACA;AAAA,EAIE;AAAA,EACA;AAAA,OACK;AASA,SAAS,uBACd,UAA+B,CAAC,GACoC;AACpE,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,eAAe,QAAQ,UAAU;AAEvC,SAAO,OAAO,KAAc,KAAe,SAAsC;AAC/E,UAAM,YACH,IAAI,QAAQ,cAAc,KAC3B,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAE1E,UAAM,cAAe,IAAI,QAAQ,aAAa,KAAK,IAAI,QAAQ,YAAY;AAC3E,UAAM,UAAU,cAAc,YAAY,MAAM,GAAG,EAAE,CAAC,KAAK,cAAc;AAEzE,UAAM,KACH,IAAI,QAAQ,iBAAiB,GAAc,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,KAC/D,IAAI,QAAQ,WAAW,KACxB,IAAI,OAAO;AAEb,UAAM,YAAY,IAAI,QAAQ,YAAY;AAE1C,UAAM,QAAQ,QAAQ,WAAW,MAAM,QAAQ,SAAS,GAAG,IAAI;AAC/D,UAAM,SAAS,QAAQ,YAAY,MAAM,QAAQ,UAAU,GAAG,IAAI;AAElE;AAAA,MACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,EAAE,IAAI,WAAW,IAAI,UAAU;AAAA,MAC1C;AAAA,MACA,MAAM;AACJ,cAAM,QAAQ,YAAY,IAAI;AAE9B,YAAI,aAAa;AACf,uBAAa,MAAM,OAAO,IAAI,MAAM,IAAI,IAAI,eAAe,IAAI,GAAG,EAAE;AAAA,QACtE;AAEA,YAAI,GAAG,UAAU,MAAM;AACrB,cAAI,CAAC,YAAa;AAClB,gBAAM,WAAW,QAAQ,YAAY,IAAI,IAAI,OAAO,QAAQ,CAAC,CAAC;AAC9D,gBAAM,SAAS,IAAI;AACnB,gBAAM,QAAQ,UAAU,MAAM,UAAU,UAAU,MAAM,SAAS;AACjE,gBAAM,MAAM,OAAO,IAAI,MAAM,IAAI,IAAI,eAAe,IAAI,GAAG,IAAI,MAAM,OAAO,QAAQ;AAEpF,cAAI,UAAU,SAAS;AACrB,yBAAa,MAAM,KAAK,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UAC1D,WAAW,UAAU,QAAQ;AAC3B,yBAAa,KAAK,KAAK,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UACzD,OAAO;AACL,yBAAa,KAAK,KAAK,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UACzD;AAAA,QACF,CAAC;AAED,aAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aegislog/express",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Express middleware adapter for AegisLog.",
5
5
  "homepage": "https://github.com/syedmuzamilm/aegislog#readme",
6
6
  "license": "MIT",
@@ -29,7 +29,7 @@
29
29
  "access": "public"
30
30
  },
31
31
  "dependencies": {
32
- "aegislog": "0.1.0"
32
+ "aegislog": "0.2.1"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/express": "^5.0.0",