@prosopo/api-express-router 3.0.40 → 3.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +11 -7
  2. package/.turbo/turbo-build$colon$tsc.log +62 -0
  3. package/.turbo/turbo-build.log +16 -8
  4. package/CHANGELOG.md +389 -0
  5. package/dist/apiExpressRouterFactory.d.ts +9 -0
  6. package/dist/apiExpressRouterFactory.d.ts.map +1 -0
  7. package/dist/apiExpressRouterFactory.js.map +1 -0
  8. package/dist/cjs/endpointAdapter/apiExpressDefaultEndpointAdapter.cjs +2 -1
  9. package/dist/cjs/middlewares/authMiddleware.cjs +18 -41
  10. package/dist/cjs/middlewares/requestLoggerMiddleware.cjs +14 -4
  11. package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.d.ts +13 -0
  12. package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.d.ts.map +1 -0
  13. package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.js +2 -1
  14. package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.js.map +1 -0
  15. package/dist/endpointAdapter/apiExpressEndpointAdapter.d.ts +8 -0
  16. package/dist/endpointAdapter/apiExpressEndpointAdapter.d.ts.map +1 -0
  17. package/dist/endpointAdapter/apiExpressEndpointAdapter.js +2 -0
  18. package/dist/endpointAdapter/apiExpressEndpointAdapter.js.map +1 -0
  19. package/dist/errorHandler.d.ts +5 -0
  20. package/dist/errorHandler.d.ts.map +1 -0
  21. package/dist/errorHandler.js.map +1 -0
  22. package/dist/index.d.ts +10 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/middlewares/authMiddleware.d.ts +5 -0
  26. package/dist/middlewares/authMiddleware.d.ts.map +1 -0
  27. package/dist/middlewares/authMiddleware.js +19 -42
  28. package/dist/middlewares/authMiddleware.js.map +1 -0
  29. package/dist/middlewares/requestLoggerMiddleware.d.ts +4 -0
  30. package/dist/middlewares/requestLoggerMiddleware.d.ts.map +1 -0
  31. package/dist/middlewares/requestLoggerMiddleware.js +11 -1
  32. package/dist/middlewares/requestLoggerMiddleware.js.map +1 -0
  33. package/dist/tests/unit/errorHandler.unit.test.d.ts +2 -0
  34. package/dist/tests/unit/errorHandler.unit.test.d.ts.map +1 -0
  35. package/dist/tests/unit/errorHandler.unit.test.js +140 -0
  36. package/dist/tests/unit/errorHandler.unit.test.js.map +1 -0
  37. package/dist/tests/unit/middlewares/authMiddleware.unit.test.d.ts +2 -0
  38. package/dist/tests/unit/middlewares/authMiddleware.unit.test.d.ts.map +1 -0
  39. package/dist/tests/unit/middlewares/authMiddleware.unit.test.js +144 -0
  40. package/dist/tests/unit/middlewares/authMiddleware.unit.test.js.map +1 -0
  41. package/express.d.ts +4 -2
  42. package/package.json +17 -9
  43. package/src/apiExpressRouterFactory.ts +68 -0
  44. package/src/endpointAdapter/apiExpressDefaultEndpointAdapter.ts +65 -0
  45. package/src/endpointAdapter/apiExpressEndpointAdapter.ts +28 -0
  46. package/src/errorHandler.ts +33 -0
  47. package/src/index.ts +37 -0
  48. package/src/middlewares/authMiddleware.ts +93 -0
  49. package/src/middlewares/requestLoggerMiddleware.ts +55 -0
  50. package/src/tests/unit/errorHandler.unit.test.ts +190 -0
  51. package/src/tests/unit/middlewares/authMiddleware.unit.test.ts +183 -0
  52. package/tsconfig.cjs.json +34 -0
  53. package/tsconfig.json +41 -0
  54. package/tsconfig.tsbuildinfo +1 -0
  55. package/tsconfig.types.json +9 -0
  56. package/vite.cjs.config.ts +1 -1
  57. package/vite.esm.config.ts +1 -1
  58. package/vite.test.config.ts +1 -1
@@ -1,19 +1,29 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const common = require("@prosopo/common");
3
+ const logger = require("@prosopo/logger");
4
4
  const uuid = require("uuid");
5
+ const getHeaderValue = (req, headerName) => {
6
+ if (headerName in req.headers && req.headers[headerName]) {
7
+ return req.headers[headerName].toString();
8
+ }
9
+ return void 0;
10
+ };
5
11
  function requestLoggerMiddleware(env) {
6
12
  return (req, res, next) => {
7
13
  const requestId = req.headers["x-request-id"] || `e-${uuid.v4()}`;
14
+ const user = getHeaderValue(req, "prosopo-user");
15
+ const siteKey = getHeaderValue(req, "prosopo-site-key");
8
16
  const sessionId = req.body?.sessionId ? req.body.sessionId : null;
9
- const logger = common.getLogger(
10
- common.parseLogLevel(env.config.logLevel),
17
+ const logger$1 = logger.getLogger(
18
+ logger.parseLogLevel(env.config.logLevel),
11
19
  "request-logger"
12
20
  ).with({
13
21
  requestId,
22
+ ...user ? { user } : {},
23
+ ...siteKey ? { siteKey } : {},
14
24
  ...sessionId ? { sessionId } : {}
15
25
  });
16
- req.logger = logger;
26
+ req.logger = logger$1;
17
27
  req.requestId = requestId;
18
28
  next();
19
29
  };
@@ -0,0 +1,13 @@
1
+ import type { ApiEndpoint } from "@prosopo/api-route";
2
+ import { type LogLevel } from "@prosopo/logger";
3
+ import type { NextFunction, Request, Response } from "express";
4
+ import type { ZodType } from "zod";
5
+ import type { ApiExpressEndpointAdapter } from "./apiExpressEndpointAdapter.js";
6
+ declare class ApiExpressDefaultEndpointAdapter implements ApiExpressEndpointAdapter {
7
+ private readonly logLevel;
8
+ private readonly errorStatusCode;
9
+ constructor(logLevel: LogLevel, errorStatusCode: number);
10
+ handleRequest(endpoint: ApiEndpoint<ZodType | undefined>, request: Request, response: Response, next: NextFunction): Promise<void>;
11
+ }
12
+ export { ApiExpressDefaultEndpointAdapter };
13
+ //# sourceMappingURL=apiExpressDefaultEndpointAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiExpressDefaultEndpointAdapter.d.ts","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressDefaultEndpointAdapter.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,KAAK,QAAQ,EAAoB,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAEhF,cAAM,gCAAiC,YAAW,yBAAyB;IAEzE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,eAAe;gBADf,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,MAAM;IAG5B,aAAa,CACzB,QAAQ,EAAE,WAAW,CAAC,OAAO,GAAG,SAAS,CAAC,EAC1C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC;CA8BhB;AAED,OAAO,EAAE,gCAAgC,EAAE,CAAC"}
@@ -1,4 +1,5 @@
1
- import { ProsopoApiError, stringifyBigInts } from "@prosopo/common";
1
+ import { ProsopoApiError } from "@prosopo/common";
2
+ import { stringifyBigInts } from "@prosopo/logger";
2
3
  class ApiExpressDefaultEndpointAdapter {
3
4
  constructor(logLevel, errorStatusCode) {
4
5
  this.logLevel = logLevel;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiExpressDefaultEndpointAdapter.js","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressDefaultEndpointAdapter.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAiB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKlE,MAAM,gCAAgC;IACrC,YACkB,QAAkB,EAClB,eAAuB;QADvB,aAAQ,GAAR,QAAQ,CAAU;QAClB,oBAAe,GAAf,eAAe,CAAQ;IACtC,CAAC;IAEG,KAAK,CAAC,aAAa,CACzB,QAA0C,EAC1C,OAAgB,EAChB,QAAkB,EAClB,IAAkB;QAElB,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACJ,IAAI,GAAG,QAAQ,CAAC,oBAAoB,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,IAAI,CACV,IAAI,eAAe,CAAC,iBAAiB,EAAE;gBACtC,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;aACpC,CAAC,CACF,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,mBAAmB,GAAG,MAAM,QAAQ,CAAC,cAAc,CACxD,IAAI,EACJ,OAAO,CAAC,MAAM,CACd,CAAC;YAGF,MAAM,cAAc,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;YAE7D,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC3B,GAAG,EAAE,KAAK;aACV,CAAC,CAAC,CAAC;YAEJ,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjE,CAAC;IACF,CAAC;CACD;AAED,OAAO,EAAE,gCAAgC,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ApiEndpoint } from "@prosopo/api-route";
2
+ import type { NextFunction, Request, Response } from "express";
3
+ import type { ZodType } from "zod";
4
+ interface ApiExpressEndpointAdapter {
5
+ handleRequest(endpoint: ApiEndpoint<ZodType | undefined>, request: Request, response: Response, next: NextFunction): Promise<void>;
6
+ }
7
+ export type { ApiExpressEndpointAdapter };
8
+ //# sourceMappingURL=apiExpressEndpointAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiExpressEndpointAdapter.d.ts","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressEndpointAdapter.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAEnC,UAAU,yBAAyB;IAClC,aAAa,CACZ,QAAQ,EAAE,WAAW,CAAC,OAAO,GAAG,SAAS,CAAC,EAC1C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC;CACjB;AAED,YAAY,EAAE,yBAAyB,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=apiExpressEndpointAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiExpressEndpointAdapter.js","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressEndpointAdapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { type ProsopoApiError } from "@prosopo/common";
2
+ import type { NextFunction, Request, Response } from "express";
3
+ import type { ZodError } from "zod";
4
+ export declare const handleErrors: (err: ProsopoApiError | SyntaxError | ZodError, request: Request, response: Response, next: NextFunction) => void;
5
+ //# sourceMappingURL=errorHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../src/errorHandler.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,iBAAiB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAEpC,eAAO,MAAM,YAAY,QACnB,eAAe,GAAG,WAAW,GAAG,QAAQ,WACpC,OAAO,YACN,QAAQ,QACZ,YAAY,SAQlB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../src/errorHandler.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAwB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAIpE,MAAM,CAAC,MAAM,YAAY,GAAG,CAC3B,GAA6C,EAC7C,OAAgB,EAChB,QAAkB,EAClB,IAAkB,EACjB,EAAE;IACH,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,QAAQ,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IACjD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { LogLevel } from "@prosopo/logger";
2
+ import { ApiExpressRouterFactory } from "./apiExpressRouterFactory.js";
3
+ import type { ApiExpressEndpointAdapter } from "./endpointAdapter/apiExpressEndpointAdapter.js";
4
+ declare const apiExpressRouterFactory: ApiExpressRouterFactory;
5
+ declare const createApiExpressDefaultEndpointAdapter: (logLevel: LogLevel, errorStatusCode?: number) => ApiExpressEndpointAdapter;
6
+ export { apiExpressRouterFactory, createApiExpressDefaultEndpointAdapter, type ApiExpressEndpointAdapter, };
7
+ export * from "./errorHandler.js";
8
+ export * from "./middlewares/authMiddleware.js";
9
+ export * from "./middlewares/requestLoggerMiddleware.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAEhG,QAAA,MAAM,uBAAuB,yBAAgC,CAAC;AAE9D,QAAA,MAAM,sCAAsC,aACjC,QAAQ,+BAEhB,yBAEF,CAAC;AAEF,OAAO,EACN,uBAAuB,EACvB,sCAAsC,EACtC,KAAK,yBAAyB,GAC9B,CAAC;AAEF,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,0CAA0C,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AAGzG,MAAM,uBAAuB,GAAG,IAAI,uBAAuB,EAAE,CAAC;AAE9D,MAAM,sCAAsC,GAAG,CAC9C,QAAkB,EAClB,eAAe,GAAG,GAAG,EACO,EAAE;IAC9B,OAAO,IAAI,gCAAgC,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF,OAAO,EACN,uBAAuB,EACvB,sCAAsC,GAEtC,CAAC;AAEF,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,0CAA0C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { KeyringPair } from "@prosopo/types";
2
+ import type { NextFunction, Request, Response } from "express";
3
+ export declare const authMiddleware: (pair: KeyringPair | undefined, authAccount?: KeyringPair | undefined) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
4
+ export declare const verifySignature: (signature: string, message: string, pair: KeyringPair) => void;
5
+ //# sourceMappingURL=authMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authMiddleware.d.ts","sourceRoot":"","sources":["../../src/middlewares/authMiddleware.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,eAAO,MAAM,cAAc,SACpB,WAAW,GAAG,SAAS,gBACf,WAAW,GAAG,SAAS,WAElB,OAAO,OAAO,QAAQ,QAAQ,YAAY,kBA4B7D,CAAC;AAsBF,eAAO,MAAM,eAAe,cAChB,MAAM,WACR,MAAM,QACT,WAAW,SAejB,CAAC"}
@@ -1,33 +1,22 @@
1
- import { isHex, hexToU8a } from "@polkadot/util";
1
+ import { hexToU8a } from "@polkadot/util";
2
2
  import { ProsopoEnvError, ProsopoApiError } from "@prosopo/common";
3
3
  const authMiddleware = (pair, authAccount) => {
4
4
  return async (req, res, next) => {
5
5
  try {
6
- const { signature, timestamp } = extractHeaders(req);
6
+ const jwt = extractJWT(req);
7
7
  let error;
8
- if (authAccount) {
9
- try {
10
- verifySignature(signature, timestamp, authAccount);
11
- next();
12
- return;
13
- } catch (e) {
14
- req.logger.warn(() => ({
15
- err: e,
16
- data: {
17
- account: authAccount?.address
18
- }
19
- }));
20
- error = e;
21
- }
8
+ if (authAccount?.jwtVerify(jwt).isValid) {
9
+ next();
10
+ return;
22
11
  }
23
- if (pair) {
24
- verifySignature(signature, timestamp, pair);
12
+ if (pair?.jwtVerify(jwt).isValid) {
25
13
  next();
26
14
  return;
27
15
  }
28
16
  res.status(401).json({
29
- error: "Unauthorized",
30
- message: new ProsopoEnvError(error || "CONTRACT.CANNOT_FIND_KEYPAIR")
17
+ error: new ProsopoEnvError(error || "API.UNAUTHORIZED", {
18
+ context: { i18n: req.i18n, code: 401 }
19
+ })
31
20
  });
32
21
  return;
33
22
  } catch (err) {
@@ -37,32 +26,20 @@ const authMiddleware = (pair, authAccount) => {
37
26
  }
38
27
  };
39
28
  };
40
- const extractHeaders = (req) => {
41
- const signature = req.headers.signature;
42
- const timestamp = req.headers.timestamp;
43
- if (!timestamp) {
44
- throw new ProsopoApiError("GENERAL.INVALID_TIMESTAMP", {
45
- context: { error: "Missing timestamp", code: 400 }
46
- });
47
- }
48
- if (!signature) {
49
- throw new ProsopoApiError("GENERAL.INVALID_SIGNATURE", {
50
- context: { error: "Missing signature", code: 400 }
51
- });
52
- }
53
- if (Array.isArray(signature) || Array.isArray(timestamp) || !isHex(signature)) {
54
- throw new ProsopoApiError("CONTRACT.INVALID_DATA_FORMAT", {
55
- context: { error: "Invalid header format", code: 400 }
29
+ const extractJWT = (req) => {
30
+ const authHeader = req.headers.Authorization || req.headers.authorization;
31
+ if (!authHeader || typeof authHeader !== "string") {
32
+ throw new ProsopoApiError("GENERAL.MISSING_AUTH_HEADER", {
33
+ context: { error: "Missing Authorization header", code: 401 }
56
34
  });
57
35
  }
58
- const now = (/* @__PURE__ */ new Date()).getTime();
59
- const ts = Number.parseInt(timestamp);
60
- if (now - ts > 3e5) {
61
- throw new ProsopoApiError("GENERAL.INVALID_TIMESTAMP", {
62
- context: { error: "Timestamp is too old", code: 400 }
36
+ const jwt = authHeader.replace("Bearer ", "");
37
+ if (!jwt) {
38
+ throw new ProsopoApiError("GENERAL.INVALID_JWT", {
39
+ context: { error: "Missing JWT", code: 400 }
63
40
  });
64
41
  }
65
- return { signature, timestamp };
42
+ return jwt;
66
43
  };
67
44
  const verifySignature = (signature, message, pair) => {
68
45
  const u8Sig = hexToU8a(signature);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authMiddleware.js","sourceRoot":"","sources":["../../src/middlewares/authMiddleware.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKnE,MAAM,CAAC,MAAM,cAAc,GAAG,CAC7B,IAA6B,EAC7B,WAAqC,EACpC,EAAE;IACH,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAChE,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAE5B,IAAI,KAAkC,CAAC;YAEvC,IAAI,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;gBACzC,IAAI,EAAE,CAAC;gBACP,OAAO;YACR,CAAC;YAED,IAAI,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,EAAE,CAAC;gBACP,OAAO;YACR,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACpB,KAAK,EAAE,IAAI,eAAe,CAAC,KAAK,IAAI,kBAAkB,EAAE;oBACvD,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;iBACtC,CAAC;aACF,CAAC,CAAC;YACH,OAAO;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;YAChE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9D,OAAO;QACR,CAAC;IACF,CAAC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,EAAE;IACnC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAE1E,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnD,MAAM,IAAI,eAAe,CAAC,6BAA6B,EAAE;YACxD,OAAO,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,IAAI,EAAE,GAAG,EAAE;SAC7D,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAE9C,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,MAAM,IAAI,eAAe,CAAC,qBAAqB,EAAE;YAChD,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE;SAC5C,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,GAAU,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,SAAiB,EACjB,OAAe,EACf,IAAiB,EAChB,EAAE;IACH,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAElC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE;YACtD,OAAO,EAAE;gBACR,KAAK,EAAE,+BAA+B;gBACtC,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO;gBACP,SAAS;aACT;SACD,CAAC,CAAC;IACJ,CAAC;AACF,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ProviderEnvironment } from "@prosopo/env";
2
+ import type { NextFunction, Request, Response } from "express";
3
+ export declare function requestLoggerMiddleware(env: ProviderEnvironment): (req: Request, res: Response, next: NextFunction) => void;
4
+ //# sourceMappingURL=requestLoggerMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestLoggerMiddleware.d.ts","sourceRoot":"","sources":["../../src/middlewares/requestLoggerMiddleware.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAa/D,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,mBAAmB,SAClD,OAAO,OAAO,QAAQ,QAAQ,YAAY,UAwBvD"}
@@ -1,14 +1,24 @@
1
- import { getLogger, parseLogLevel } from "@prosopo/common";
1
+ import { getLogger, parseLogLevel } from "@prosopo/logger";
2
2
  import { v4 } from "uuid";
3
+ const getHeaderValue = (req, headerName) => {
4
+ if (headerName in req.headers && req.headers[headerName]) {
5
+ return req.headers[headerName].toString();
6
+ }
7
+ return void 0;
8
+ };
3
9
  function requestLoggerMiddleware(env) {
4
10
  return (req, res, next) => {
5
11
  const requestId = req.headers["x-request-id"] || `e-${v4()}`;
12
+ const user = getHeaderValue(req, "prosopo-user");
13
+ const siteKey = getHeaderValue(req, "prosopo-site-key");
6
14
  const sessionId = req.body?.sessionId ? req.body.sessionId : null;
7
15
  const logger = getLogger(
8
16
  parseLogLevel(env.config.logLevel),
9
17
  "request-logger"
10
18
  ).with({
11
19
  requestId,
20
+ ...user ? { user } : {},
21
+ ...siteKey ? { siteKey } : {},
12
22
  ...sessionId ? { sessionId } : {}
13
23
  });
14
24
  req.logger = logger;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestLoggerMiddleware.js","sourceRoot":"","sources":["../../src/middlewares/requestLoggerMiddleware.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC,MAAM,cAAc,GAAG,CACtB,GAAY,EACZ,UAAkB,EACG,EAAE;IACvB,IAAI,UAAU,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1D,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,GAAwB;IAC/D,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC1D,MAAM,SAAS,GACb,GAAG,CAAC,OAAO,CAAC,cAAc,CAAY,IAAI,KAAK,MAAM,EAAE,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QAElE,MAAM,MAAM,GAAG,SAAS,CACvB,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAClC,gBAAgB,CAChB,CAAC,IAAI,CAAC;YACN,SAAS;YACT,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnC,CAAC,CAAC;QAGH,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QACpB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;QAG1B,IAAI,EAAE,CAAC;IACR,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=errorHandler.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.unit.test.d.ts","sourceRoot":"","sources":["../../../src/tests/unit/errorHandler.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,140 @@
1
+ import { ProsopoApiError, ProsopoEnvError } from "@prosopo/common";
2
+ import { loadI18next } from "@prosopo/locale";
3
+ import { describe, expect, it, vi } from "vitest";
4
+ import { ZodError } from "zod";
5
+ import { handleErrors } from "../../errorHandler.js";
6
+ describe("handleErrors", async () => {
7
+ const i18n = await loadI18next(true);
8
+ await i18n.changeLanguage("en");
9
+ it("should handle ProsopoApiError", async () => {
10
+ const mockRequest = { i18n };
11
+ const mockResponse = {
12
+ writeHead: vi.fn().mockReturnThis(),
13
+ set: vi.fn().mockReturnThis(),
14
+ status: vi.fn().mockReturnThis(),
15
+ send: vi.fn(),
16
+ end: vi.fn(),
17
+ };
18
+ const mockNext = vi.fn();
19
+ const error = new ProsopoApiError("CONTRACT.INVALID_DATA_FORMAT", {
20
+ context: { code: 400 },
21
+ i18n,
22
+ });
23
+ console.log(error);
24
+ handleErrors(error, mockRequest, mockResponse, mockNext);
25
+ expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
26
+ expect(mockResponse.send).toHaveBeenCalledWith({
27
+ error: {
28
+ code: 400,
29
+ key: "CONTRACT.INVALID_DATA_FORMAT",
30
+ message: "Invalid data format",
31
+ },
32
+ });
33
+ expect(mockResponse.status).toHaveBeenCalledWith(400);
34
+ expect(mockResponse.end).toHaveBeenCalled();
35
+ });
36
+ it("should not return SyntaxError", async () => {
37
+ const mockRequest = { i18n };
38
+ const mockResponse = {
39
+ writeHead: vi.fn().mockReturnThis(),
40
+ set: vi.fn().mockReturnThis(),
41
+ status: vi.fn().mockReturnThis(),
42
+ send: vi.fn(),
43
+ end: vi.fn(),
44
+ };
45
+ const mockNext = vi.fn();
46
+ const message = "Unknown API error";
47
+ const error = new SyntaxError(message);
48
+ handleErrors(error, mockRequest, mockResponse, mockNext);
49
+ expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
50
+ expect(mockResponse.status).toHaveBeenCalledWith(400);
51
+ expect(mockResponse.send).toHaveBeenCalledWith({
52
+ error: {
53
+ message,
54
+ key: "API.UNKNOWN",
55
+ code: 400,
56
+ },
57
+ });
58
+ expect(mockResponse.end).toHaveBeenCalled();
59
+ });
60
+ it("should handle ZodError", () => {
61
+ const mockRequest = { i18n };
62
+ const mockResponse = {
63
+ writeHead: vi.fn().mockReturnThis(),
64
+ set: vi.fn().mockReturnThis(),
65
+ status: vi.fn().mockReturnThis(),
66
+ send: vi.fn(),
67
+ end: vi.fn(),
68
+ };
69
+ const mockNext = vi.fn();
70
+ const zodError = {
71
+ code: "custom",
72
+ message: "Invalid input",
73
+ path: ["some", "variable"],
74
+ };
75
+ const error = new ZodError([zodError]);
76
+ handleErrors(error, mockRequest, mockResponse, mockNext);
77
+ expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
78
+ expect(mockResponse.status).toHaveBeenCalledWith(400);
79
+ expect(mockResponse.send).toHaveBeenCalledWith({
80
+ error: { code: 400, key: "API.INVALID_BODY", message: [zodError] },
81
+ });
82
+ expect(mockResponse.end).toHaveBeenCalled();
83
+ });
84
+ it("should unwrap nested ProsopoBaseError", async () => {
85
+ const mockRequest = { i18n };
86
+ const mockResponse = {
87
+ writeHead: vi.fn().mockReturnThis(),
88
+ set: vi.fn().mockReturnThis(),
89
+ status: vi.fn().mockReturnThis(),
90
+ send: vi.fn(),
91
+ end: vi.fn(),
92
+ };
93
+ const mockNext = vi.fn();
94
+ const envError = new ProsopoEnvError("GENERAL.ENVIRONMENT_NOT_READY", {
95
+ i18n,
96
+ });
97
+ const apiError = new ProsopoApiError(envError);
98
+ handleErrors(apiError, mockRequest, mockResponse, mockNext);
99
+ expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
100
+ expect(mockResponse.status).toHaveBeenCalledWith(500);
101
+ expect(mockResponse.send).toHaveBeenCalledWith({
102
+ error: {
103
+ code: 500,
104
+ key: "GENERAL.ENVIRONMENT_NOT_READY",
105
+ message: "Environment not ready",
106
+ },
107
+ });
108
+ expect(mockResponse.end).toHaveBeenCalled();
109
+ });
110
+ it("should unwrap nested ProsopoBaseErrors but not an Error that is nested inside them", async () => {
111
+ const mockRequest = { i18n };
112
+ const mockResponse = {
113
+ writeHead: vi.fn().mockReturnThis(),
114
+ set: vi.fn().mockReturnThis(),
115
+ status: vi.fn().mockReturnThis(),
116
+ send: vi.fn(),
117
+ end: vi.fn(),
118
+ };
119
+ const mockNext = vi.fn();
120
+ const code = 400;
121
+ const key = "API.UNKNOWN";
122
+ const error = new Error("Some error");
123
+ const apiError = new ProsopoApiError(key, {
124
+ context: { code, error },
125
+ i18n,
126
+ });
127
+ handleErrors(apiError, mockRequest, mockResponse, mockNext);
128
+ expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
129
+ expect(mockResponse.status).toHaveBeenCalledWith(code);
130
+ expect(mockResponse.send).toHaveBeenCalledWith({
131
+ error: {
132
+ code,
133
+ key,
134
+ message: "Unknown API error",
135
+ },
136
+ });
137
+ expect(mockResponse.end).toHaveBeenCalled();
138
+ });
139
+ });
140
+ //# sourceMappingURL=errorHandler.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.unit.test.js","sourceRoot":"","sources":["../../../src/tests/unit/errorHandler.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=authMiddleware.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authMiddleware.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/unit/middlewares/authMiddleware.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,144 @@
1
+ import { hexToU8a, isHex } from "@polkadot/util";
2
+ import { ProsopoEnvError } from "@prosopo/common";
3
+ import { getLogger } from "@prosopo/logger";
4
+ import { describe, expect, it, vi } from "vitest";
5
+ import { authMiddleware } from "../../../middlewares/authMiddleware.js";
6
+ const loggerOuter = getLogger("info", import.meta.url);
7
+ const mockLogger = {
8
+ debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
9
+ log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
10
+ info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
11
+ error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
12
+ trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
13
+ fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
14
+ warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
15
+ };
16
+ vi.mock("@polkadot/util", async (importOriginal) => {
17
+ const actual = await importOriginal();
18
+ return {
19
+ ...actual,
20
+ hexToU8a: vi.fn(),
21
+ isHex: vi.fn(),
22
+ };
23
+ });
24
+ const mockPair = {
25
+ publicKey: "mockPublicKey",
26
+ verify: vi.fn(),
27
+ jwtVerify: vi.fn(),
28
+ };
29
+ const mockEnv = {
30
+ pair: mockPair,
31
+ authAccount: mockPair,
32
+ logger: mockLogger,
33
+ jwtVerify: vi.fn(),
34
+ };
35
+ describe("authMiddleware", () => {
36
+ it("should call next() if signature is valid", async () => {
37
+ const mockLogger = {
38
+ debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
39
+ log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
40
+ info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
41
+ error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
42
+ trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
43
+ fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
44
+ warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
45
+ };
46
+ const mockReq = {
47
+ url: "/v1/prosopo/provider/captcha/image",
48
+ originalUrl: "/v1/prosopo/provider/captcha/image",
49
+ headers: {
50
+ Authorization: "Bearer mockToken",
51
+ },
52
+ logger: mockLogger,
53
+ };
54
+ const mockRes = {
55
+ status: vi.fn().mockReturnThis(),
56
+ json: vi.fn(),
57
+ };
58
+ const mockNext = vi.fn();
59
+ vi.mocked(isHex).mockReturnValue(true);
60
+ vi.mocked(hexToU8a).mockReturnValue(new Uint8Array());
61
+ vi.mocked(mockPair.jwtVerify).mockReturnValue({
62
+ isValid: true,
63
+ });
64
+ const middleware = authMiddleware(mockEnv.pair, mockEnv.authAccount);
65
+ await middleware(mockReq, mockRes, mockNext);
66
+ expect(mockNext).toHaveBeenCalled();
67
+ expect(mockRes.status).not.toHaveBeenCalled();
68
+ });
69
+ it("should return 401 if jwt is invalid", async () => {
70
+ const mockLogger = {
71
+ debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
72
+ log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
73
+ info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
74
+ error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
75
+ trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
76
+ fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
77
+ warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
78
+ };
79
+ const mockReq = {
80
+ url: "/v1/prosopo/provider/captcha/image",
81
+ originalUrl: "/v1/prosopo/provider/captcha/image",
82
+ headers: {
83
+ Authorization: "Bearer mockToken",
84
+ },
85
+ logger: mockLogger,
86
+ i18n: vi.fn().mockReturnValue({
87
+ t: (key) => key,
88
+ }),
89
+ };
90
+ const mockRes = {
91
+ status: vi.fn().mockReturnThis(),
92
+ json: vi.fn(),
93
+ };
94
+ const mockNext = vi.fn();
95
+ vi.mocked(isHex).mockReturnValue(true);
96
+ vi.mocked(hexToU8a).mockReturnValue(new Uint8Array());
97
+ vi.mocked(mockPair.jwtVerify).mockReturnValue({
98
+ isValid: false,
99
+ });
100
+ const middleware = authMiddleware(mockEnv.pair, mockEnv.authAccount);
101
+ await middleware(mockReq, mockRes, mockNext);
102
+ expect(mockNext).not.toHaveBeenCalled();
103
+ expect(mockRes.status).toHaveBeenCalledWith(401);
104
+ expect(mockRes.json).toHaveBeenCalledWith({
105
+ error: new ProsopoEnvError("API.UNAUTHORIZED", {
106
+ context: { i18n: mockReq.i18n, code: 401 },
107
+ }),
108
+ });
109
+ });
110
+ it("should return 401 if key pair is missing", async () => {
111
+ const mockLogger = {
112
+ debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
113
+ log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
114
+ info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
115
+ error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
116
+ trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
117
+ fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
118
+ warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
119
+ };
120
+ const mockReq = {
121
+ url: "/v1/prosopo/provider/captcha/image",
122
+ originalUrl: "/v1/prosopo/provider/captcha/image",
123
+ headers: {
124
+ Authorization: "Bearer mockToken",
125
+ },
126
+ logger: mockLogger,
127
+ };
128
+ const mockRes = {
129
+ status: vi.fn().mockReturnThis(),
130
+ json: vi.fn(),
131
+ };
132
+ const mockNext = vi.fn();
133
+ const middleware = authMiddleware(undefined, undefined);
134
+ await middleware(mockReq, mockRes, mockNext);
135
+ expect(mockNext).not.toHaveBeenCalled();
136
+ expect(mockRes.status).toHaveBeenCalledWith(401);
137
+ expect(mockRes.json).toHaveBeenCalledWith({
138
+ error: new ProsopoEnvError("API.UNAUTHORIZED", {
139
+ context: { i18n: mockReq.i18n, code: 401 },
140
+ }),
141
+ });
142
+ });
143
+ });
144
+ //# sourceMappingURL=authMiddleware.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authMiddleware.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/middlewares/authMiddleware.unit.test.ts"],"names":[],"mappings":"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"}
package/express.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- // Copyright 2021-2025 Prosopo (UK) Ltd.
1
+ // Copyright 2021-2026 Prosopo (UK) Ltd.
2
2
  //
3
3
  // Licensed under the Apache License, Version 2.0 (the "License");
4
4
  // you may not use this file except in compliance with the License.
@@ -12,7 +12,8 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
 
15
- import type { Logger } from "@prosopo/common";
15
+ import type { Logger } from "@prosopo/logger";
16
+ import type { IPInfoResponse } from "@prosopo/types";
16
17
  import type { TFunction } from "i18next";
17
18
 
18
19
  declare global {
@@ -27,6 +28,7 @@ declare global {
27
28
  ja4: string;
28
29
  logger: Logger;
29
30
  requestId?: string;
31
+ ipInfo?: IPInfoResponse;
30
32
  }
31
33
  }
32
34
  }