90dc-core 1.11.0 → 1.11.2

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.d.ts CHANGED
@@ -26,6 +26,6 @@ export { NotificationClient } from "./lib/utils/NotificationClient.js";
26
26
  export { Log } from "./lib/utils/Logger.js";
27
27
  export { ConfigValidator, BaseConfigSchema, CommonSchemas, createConfig, ConfigurationError, type BaseConfig } from "./lib/config/ConfigValidator.js";
28
28
  export { AppError, ValidationError, AuthenticationError, ForbiddenError, NotFoundError, ConflictError, UnprocessableEntityError, RateLimitError, InternalServerError, ServiceUnavailableError, DatabaseError, ExternalAPIError, isAppError, isOperationalError, toAppError } from "./lib/Errors/AppError.js";
29
- export { createErrorMiddleware, type ErrorMiddlewareConfig } from "./lib/middlewares/ErrorMiddleware.js";
29
+ export { ErrorMiddleware, } from "./lib/middlewares/ErrorMiddleware.js";
30
30
  export { RedisClient } from "./lib/classes/Redis.js";
31
31
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wCAAwC,CAAC;AAGvD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,yBAAyB,CAAA;AACvC,cAAc,mCAAmC,CAAA;AACjD,cAAc,mCAAmC,CAAA;AACjD,cAAc,oCAAoC,CAAA;AAClD,cAAc,0CAA0C,CAAA;AACxD,cAAc,oCAAoC,CAAA;AAClD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,mCAAmC,CAAA;AACjD,cAAc,uDAAuD,CAAA;AACrE,cAAc,2EAA2E,CAAA;AACzF,cAAc,8DAA8D,CAAA;AAC5E,cAAc,iEAAiE,CAAA;AAC/E,cAAc,2DAA2D,CAAA;AAGzE,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAA;AAGzC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,KAAK,UAAU,EAChB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EACL,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,aAAa,EACb,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,UAAU,EACX,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,qBAAqB,EACrB,KAAK,qBAAqB,EAC3B,MAAM,sCAAsC,CAAA;AAG7C,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wCAAwC,CAAC;AAGvD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,+BAA+B,CAAA;AAC7C,cAAc,yBAAyB,CAAA;AACvC,cAAc,mCAAmC,CAAA;AACjD,cAAc,mCAAmC,CAAA;AACjD,cAAc,oCAAoC,CAAA;AAClD,cAAc,0CAA0C,CAAA;AACxD,cAAc,oCAAoC,CAAA;AAClD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,mCAAmC,CAAA;AACjD,cAAc,uDAAuD,CAAA;AACrE,cAAc,2EAA2E,CAAA;AACzF,cAAc,8DAA8D,CAAA;AAC5E,cAAc,iEAAiE,CAAA;AAC/E,cAAc,2DAA2D,CAAA;AAGzE,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAC,GAAG,EAAC,MAAM,uBAAuB,CAAA;AAGzC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,KAAK,UAAU,EAChB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EACL,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,aAAa,EACb,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,UAAU,EACX,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,eAAe,GAChB,MAAM,sCAAsC,CAAA;AAG7C,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA"}
package/dist/index.js CHANGED
@@ -32,7 +32,7 @@ export { ConfigValidator, BaseConfigSchema, CommonSchemas, createConfig, Configu
32
32
  //Errors
33
33
  export { AppError, ValidationError, AuthenticationError, ForbiddenError, NotFoundError, ConflictError, UnprocessableEntityError, RateLimitError, InternalServerError, ServiceUnavailableError, DatabaseError, ExternalAPIError, isAppError, isOperationalError, toAppError } from "./lib/Errors/AppError.js";
34
34
  //Middlewares
35
- export { createErrorMiddleware } from "./lib/middlewares/ErrorMiddleware.js";
35
+ export { ErrorMiddleware } from "./lib/middlewares/ErrorMiddleware.js";
36
36
  export { RedisClient } from "./lib/classes/Redis.js";
37
37
 
38
38
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["//Interfaces\nexport * from \"./lib/models/ProgramInterfaces.js\";\nexport * from \"./lib/models/ExerciseInterfaces.js\";\nexport * from \"./lib/models/WorkoutInterfaces.js\";\nexport * from \"./lib/models/UserInterfaces.js\";\nexport * from \"./lib/models/NotificationInterfaces.js\";\n\n//DB Models\nexport * from \"./lib/dbmodels/UsersFriends.js\"\nexport * from \"./lib/dbmodels/PersistedUser.js\"\nexport * from \"./lib/dbmodels/UserBadges.js\"\nexport * from \"./lib/dbmodels/UserStreaks.js\"\nexport * from \"./lib/dbmodels/Badge.js\"\nexport * from \"./lib/dbmodels/program/Program.js\"\nexport * from \"./lib/dbmodels/program/Workout.js\"\nexport * from \"./lib/dbmodels/program/Exercise.js\"\nexport * from \"./lib/dbmodels/program/ExerciseModels.js\"\nexport * from \"./lib/dbmodels/program/Superset.js\"\nexport * from \"./lib/dbmodels/Subscription.js\"\nexport * from \"./lib/dbmodels/SubscriptionLog.js\"\nexport * from \"./lib/dbmodels/nonconsprogram/NonConsumableProgram.js\"\nexport * from \"./lib/dbmodels/nonconsprogram/TranslatedNonConsumableProgramWebContent.js\"\nexport * from \"./lib/dbmodels/nonconsprogram/TranslatedConsumableProgram.js\"\nexport * from \"./lib/dbmodels/nonconsprogram/NonConsumableProgramWebContent.js\"\nexport * from \"./lib/dbmodels/nonconsprogram/UserNonConsumableProgram.js\"\n\n//Utils\nexport {AuthenticationUtil} from \"./lib/utils/AuthenticationUtil.js\"\nexport {NotificationsUtil} from \"./lib/utils/NotificationsUtil.js\"\nexport {NotificationClient} from \"./lib/utils/NotificationClient.js\"\nexport {Log} from \"./lib/utils/Logger.js\"\n\n//Config\nexport {\n ConfigValidator,\n BaseConfigSchema,\n CommonSchemas,\n createConfig,\n ConfigurationError,\n type BaseConfig\n} from \"./lib/config/ConfigValidator.js\"\n\n//Errors\nexport {\n AppError,\n ValidationError,\n AuthenticationError,\n ForbiddenError,\n NotFoundError,\n ConflictError,\n UnprocessableEntityError,\n RateLimitError,\n InternalServerError,\n ServiceUnavailableError,\n DatabaseError,\n ExternalAPIError,\n isAppError,\n isOperationalError,\n toAppError\n} from \"./lib/Errors/AppError.js\"\n\n//Middlewares\nexport {\n createErrorMiddleware,\n type ErrorMiddlewareConfig\n} from \"./lib/middlewares/ErrorMiddleware.js\"\n\n\nexport {RedisClient} from \"./lib/classes/Redis.js\""],"names":["AuthenticationUtil","NotificationsUtil","NotificationClient","Log","ConfigValidator","BaseConfigSchema","CommonSchemas","createConfig","ConfigurationError","AppError","ValidationError","AuthenticationError","ForbiddenError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","ServiceUnavailableError","DatabaseError","ExternalAPIError","isAppError","isOperationalError","toAppError","createErrorMiddleware","RedisClient"],"mappings":"AAAA,YAAY;AACZ,cAAc,oCAAoC;AAClD,cAAc,qCAAqC;AACnD,cAAc,oCAAoC;AAClD,cAAc,iCAAiC;AAC/C,cAAc,yCAAyC;AAEvD,WAAW;AACX,cAAc,iCAAgC;AAC9C,cAAc,kCAAiC;AAC/C,cAAc,+BAA8B;AAC5C,cAAc,gCAA+B;AAC7C,cAAc,0BAAyB;AACvC,cAAc,oCAAmC;AACjD,cAAc,oCAAmC;AACjD,cAAc,qCAAoC;AAClD,cAAc,2CAA0C;AACxD,cAAc,qCAAoC;AAClD,cAAc,iCAAgC;AAC9C,cAAc,oCAAmC;AACjD,cAAc,wDAAuD;AACrE,cAAc,4EAA2E;AACzF,cAAc,+DAA8D;AAC5E,cAAc,kEAAiE;AAC/E,cAAc,4DAA2D;AAEzE,OAAO;AACP,SAAQA,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,iBAAiB,QAAO,mCAAkC;AAClE,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,GAAG,QAAO,wBAAuB;AAEzC,QAAQ;AACR,SACEC,eAAe,EACfC,gBAAgB,EAChBC,aAAa,EACbC,YAAY,EACZC,kBAAkB,QAEb,kCAAiC;AAExC,QAAQ;AACR,SACEC,QAAQ,EACRC,eAAe,EACfC,mBAAmB,EACnBC,cAAc,EACdC,aAAa,EACbC,aAAa,EACbC,wBAAwB,EACxBC,cAAc,EACdC,mBAAmB,EACnBC,uBAAuB,EACvBC,aAAa,EACbC,gBAAgB,EAChBC,UAAU,EACVC,kBAAkB,EAClBC,UAAU,QACL,2BAA0B;AAEjC,aAAa;AACb,SACEC,qBAAqB,QAEhB,uCAAsC;AAG7C,SAAQC,WAAW,QAAO,yBAAwB"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["//Interfaces\nexport * from \"./lib/models/ProgramInterfaces.js\";\nexport * from \"./lib/models/ExerciseInterfaces.js\";\nexport * from \"./lib/models/WorkoutInterfaces.js\";\nexport * from \"./lib/models/UserInterfaces.js\";\nexport * from \"./lib/models/NotificationInterfaces.js\";\n\n//DB Models\nexport * from \"./lib/dbmodels/UsersFriends.js\"\nexport * from \"./lib/dbmodels/PersistedUser.js\"\nexport * from \"./lib/dbmodels/UserBadges.js\"\nexport * from \"./lib/dbmodels/UserStreaks.js\"\nexport * from \"./lib/dbmodels/Badge.js\"\nexport * from \"./lib/dbmodels/program/Program.js\"\nexport * from \"./lib/dbmodels/program/Workout.js\"\nexport * from \"./lib/dbmodels/program/Exercise.js\"\nexport * from \"./lib/dbmodels/program/ExerciseModels.js\"\nexport * from \"./lib/dbmodels/program/Superset.js\"\nexport * from \"./lib/dbmodels/Subscription.js\"\nexport * from \"./lib/dbmodels/SubscriptionLog.js\"\nexport * from \"./lib/dbmodels/nonconsprogram/NonConsumableProgram.js\"\nexport * from \"./lib/dbmodels/nonconsprogram/TranslatedNonConsumableProgramWebContent.js\"\nexport * from \"./lib/dbmodels/nonconsprogram/TranslatedConsumableProgram.js\"\nexport * from \"./lib/dbmodels/nonconsprogram/NonConsumableProgramWebContent.js\"\nexport * from \"./lib/dbmodels/nonconsprogram/UserNonConsumableProgram.js\"\n\n//Utils\nexport {AuthenticationUtil} from \"./lib/utils/AuthenticationUtil.js\"\nexport {NotificationsUtil} from \"./lib/utils/NotificationsUtil.js\"\nexport {NotificationClient} from \"./lib/utils/NotificationClient.js\"\nexport {Log} from \"./lib/utils/Logger.js\"\n\n//Config\nexport {\n ConfigValidator,\n BaseConfigSchema,\n CommonSchemas,\n createConfig,\n ConfigurationError,\n type BaseConfig\n} from \"./lib/config/ConfigValidator.js\"\n\n//Errors\nexport {\n AppError,\n ValidationError,\n AuthenticationError,\n ForbiddenError,\n NotFoundError,\n ConflictError,\n UnprocessableEntityError,\n RateLimitError,\n InternalServerError,\n ServiceUnavailableError,\n DatabaseError,\n ExternalAPIError,\n isAppError,\n isOperationalError,\n toAppError\n} from \"./lib/Errors/AppError.js\"\n\n//Middlewares\nexport {\n ErrorMiddleware,\n} from \"./lib/middlewares/ErrorMiddleware.js\"\n\n\nexport {RedisClient} from \"./lib/classes/Redis.js\""],"names":["AuthenticationUtil","NotificationsUtil","NotificationClient","Log","ConfigValidator","BaseConfigSchema","CommonSchemas","createConfig","ConfigurationError","AppError","ValidationError","AuthenticationError","ForbiddenError","NotFoundError","ConflictError","UnprocessableEntityError","RateLimitError","InternalServerError","ServiceUnavailableError","DatabaseError","ExternalAPIError","isAppError","isOperationalError","toAppError","ErrorMiddleware","RedisClient"],"mappings":"AAAA,YAAY;AACZ,cAAc,oCAAoC;AAClD,cAAc,qCAAqC;AACnD,cAAc,oCAAoC;AAClD,cAAc,iCAAiC;AAC/C,cAAc,yCAAyC;AAEvD,WAAW;AACX,cAAc,iCAAgC;AAC9C,cAAc,kCAAiC;AAC/C,cAAc,+BAA8B;AAC5C,cAAc,gCAA+B;AAC7C,cAAc,0BAAyB;AACvC,cAAc,oCAAmC;AACjD,cAAc,oCAAmC;AACjD,cAAc,qCAAoC;AAClD,cAAc,2CAA0C;AACxD,cAAc,qCAAoC;AAClD,cAAc,iCAAgC;AAC9C,cAAc,oCAAmC;AACjD,cAAc,wDAAuD;AACrE,cAAc,4EAA2E;AACzF,cAAc,+DAA8D;AAC5E,cAAc,kEAAiE;AAC/E,cAAc,4DAA2D;AAEzE,OAAO;AACP,SAAQA,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,iBAAiB,QAAO,mCAAkC;AAClE,SAAQC,kBAAkB,QAAO,oCAAmC;AACpE,SAAQC,GAAG,QAAO,wBAAuB;AAEzC,QAAQ;AACR,SACEC,eAAe,EACfC,gBAAgB,EAChBC,aAAa,EACbC,YAAY,EACZC,kBAAkB,QAEb,kCAAiC;AAExC,QAAQ;AACR,SACEC,QAAQ,EACRC,eAAe,EACfC,mBAAmB,EACnBC,cAAc,EACdC,aAAa,EACbC,aAAa,EACbC,wBAAwB,EACxBC,cAAc,EACdC,mBAAmB,EACnBC,uBAAuB,EACvBC,aAAa,EACbC,gBAAgB,EAChBC,UAAU,EACVC,kBAAkB,EAClBC,UAAU,QACL,2BAA0B;AAEjC,aAAa;AACb,SACEC,eAAe,QACV,uCAAsC;AAG7C,SAAQC,WAAW,QAAO,yBAAwB"}
@@ -1,5 +1,5 @@
1
- import type { Context, Next } from 'koa';
2
- import { z } from 'zod';
1
+ import type { Context, Next } from "koa";
2
+ import { z } from "zod";
3
3
  import { AppError } from "../Errors/AppError.js";
4
4
  export interface ErrorMiddlewareConfig {
5
5
  exposeErrorDetails?: boolean;
@@ -7,7 +7,7 @@ export interface ErrorMiddlewareConfig {
7
7
  logger?: (error: Error, ctx: Context) => void;
8
8
  formatter?: (error: AppError, ctx: Context) => unknown;
9
9
  }
10
- export declare function createErrorMiddleware(config?: ErrorMiddlewareConfig): (ctx: Context, next: Next) => Promise<void>;
10
+ export declare function ErrorMiddleware(config?: ErrorMiddlewareConfig): (ctx: Context, next: Next) => Promise<void>;
11
11
  export declare function formatZodErrors(error: z.ZodError): {
12
12
  validationErrors: {
13
13
  path: string;
@@ -15,5 +15,4 @@ export declare function formatZodErrors(error: z.ZodError): {
15
15
  code: string;
16
16
  }[];
17
17
  };
18
- export declare function koaErrorMiddleware(config?: ErrorMiddlewareConfig): (ctx: Context, next: Next) => Promise<void>;
19
18
  //# sourceMappingURL=ErrorMiddleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorMiddleware.d.ts","sourceRoot":"","sources":["../../../src/lib/middlewares/ErrorMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAC,QAAQ,EAAa,MAAM,uBAAuB,CAAC;AAG3D,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;CACxD;AAED,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,qBAA0B,IAQxD,KAAK,OAAO,EAAE,MAAM,IAAI,mBAsCvC;AAgED,wBAAgB,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG;IAClD,gBAAgB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACrE,CAQA;AAED,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,qBAA0B,SAlHhD,OAAO,QAAQ,IAAI,mBAoHvC"}
1
+ {"version":3,"file":"ErrorMiddleware.d.ts","sourceRoot":"","sources":["../../../src/lib/middlewares/ErrorMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAc,MAAM,uBAAuB,CAAC;AAE7D,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;CACxD;AAED,wBAAgB,eAAe,CAAC,MAAM,GAAE,qBAA0B,IAQlD,KAAK,OAAO,EAAE,MAAM,IAAI,mBAqCvC;AAgED,wBAAgB,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG;IAClD,gBAAgB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACrE,CAQA"}
@@ -1,16 +1,16 @@
1
1
  import { z } from "zod";
2
2
  import { AppError, toAppError } from "../Errors/AppError.js";
3
- export function createErrorMiddleware(config = {}) {
3
+ export function ErrorMiddleware(config = {}) {
4
4
  const { exposeErrorDetails = false, logErrors = true, logger, formatter } = config;
5
5
  return async (ctx, next)=>{
6
6
  try {
7
7
  await next();
8
- } catch (error) {
8
+ } catch (err) {
9
9
  let appError;
10
- if (error instanceof z.ZodError) {
11
- appError = new AppError('VALIDATION_ERROR', 'Request validation failed', 400, formatZodErrors(error));
10
+ if (err instanceof z.ZodError) {
11
+ appError = new AppError("VALIDATION_ERROR", "Request validation failed", 400, formatZodErrors(err));
12
12
  } else {
13
- appError = toAppError(error);
13
+ appError = toAppError(err);
14
14
  }
15
15
  if (logErrors) {
16
16
  if (logger) {
@@ -20,17 +20,16 @@ export function createErrorMiddleware(config = {}) {
20
20
  }
21
21
  }
22
22
  ctx.status = appError.statusCode;
23
- if (formatter) {
24
- ctx.body = formatter(appError, ctx);
25
- } else {
26
- ctx.body = formatErrorResponse(appError, exposeErrorDetails);
27
- }
28
- ctx.set('X-Error-Code', appError.code);
29
- ctx.app.emit('error', appError, ctx);
23
+ ctx.set("X-Error-Code", appError.code);
24
+ ctx.type = "application/json";
25
+ ctx.body = formatter ? formatter(appError, ctx) : formatErrorResponse(appError, exposeErrorDetails);
26
+ // optional: only emit for 5xx to avoid noisy app-level listeners
27
+ ctx.app.emit("error", appError, ctx);
30
28
  }
31
29
  };
32
30
  }
33
31
  function defaultErrorLogger(error, ctx) {
32
+ const safeEmail = typeof ctx.state.user?.email === "string" ? "***@***" : undefined;
34
33
  const logData = {
35
34
  error: {
36
35
  code: error.code,
@@ -41,28 +40,23 @@ function defaultErrorLogger(error, ctx) {
41
40
  request: {
42
41
  method: ctx.method,
43
42
  path: ctx.path,
44
- query: ctx.query,
45
43
  ip: ctx.ip,
46
- userAgent: ctx.get('user-agent')
44
+ userAgent: ctx.get("user-agent")
47
45
  },
48
46
  user: {
49
47
  id: ctx.state.user?.userUuid,
50
- email: ctx.state.user?.email
48
+ email: safeEmail
51
49
  },
52
50
  traceId: ctx.state.traceId
53
51
  };
54
52
  if (error.statusCode >= 500) {
55
- console.error('❌ Server Error:', JSON.stringify(logData, null, 2));
56
- if (error.stack) {
57
- console.error('Stack trace:', error.stack);
58
- }
53
+ console.error("❌ Server Error:", JSON.stringify(logData, null, 2));
54
+ if (error.stack) console.error("Stack trace:", error.stack);
59
55
  } else {
60
- console.warn('⚠️ Client Error:', JSON.stringify(logData, null, 2));
56
+ console.warn("⚠️ Client Error:", JSON.stringify(logData, null, 2));
61
57
  }
62
58
  }
63
- /**
64
- * Format error for API response
65
- */ function formatErrorResponse(error, exposeDetails) {
59
+ function formatErrorResponse(error, exposeDetails) {
66
60
  const response = {
67
61
  success: false,
68
62
  error: {
@@ -70,13 +64,11 @@ function defaultErrorLogger(error, ctx) {
70
64
  message: error.message
71
65
  }
72
66
  };
73
- // Add details if configured or if client error (4xx)
74
67
  if (exposeDetails || error.statusCode < 500) {
75
- if (error.details) {
68
+ if (error.details !== undefined) {
76
69
  response.error.details = error.details;
77
70
  }
78
71
  }
79
- // Never expose stack traces in production
80
72
  if (exposeDetails && error.stack) {
81
73
  response.error.stack = error.stack;
82
74
  }
@@ -91,8 +83,5 @@ export function formatZodErrors(error) {
91
83
  }))
92
84
  };
93
85
  }
94
- export function koaErrorMiddleware(config = {}) {
95
- return createErrorMiddleware(config);
96
- }
97
86
 
98
87
  //# sourceMappingURL=ErrorMiddleware.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/middlewares/ErrorMiddleware.ts"],"sourcesContent":["import type { Context, Next } from 'koa';\nimport { z } from 'zod';\nimport {AppError, toAppError} from \"../Errors/AppError.js\";\n\n\nexport interface ErrorMiddlewareConfig {\n exposeErrorDetails?: boolean;\n logErrors?: boolean;\n logger?: (error: Error, ctx: Context) => void;\n formatter?: (error: AppError, ctx: Context) => unknown;\n}\n\nexport function createErrorMiddleware(config: ErrorMiddlewareConfig = {}) {\n const {\n exposeErrorDetails = false,\n logErrors = true,\n logger,\n formatter,\n } = config;\n\n return async (ctx: Context, next: Next) => {\n try {\n await next();\n } catch (error) {\n let appError: AppError;\n\n if (error instanceof z.ZodError) {\n appError = new AppError(\n 'VALIDATION_ERROR',\n 'Request validation failed',\n 400,\n formatZodErrors(error)\n );\n } else {\n appError = toAppError(error);\n }\n\n if (logErrors) {\n if (logger) {\n logger(appError, ctx);\n } else {\n defaultErrorLogger(appError, ctx);\n }\n }\n\n ctx.status = appError.statusCode;\n\n if (formatter) {\n ctx.body = formatter(appError, ctx);\n } else {\n ctx.body = formatErrorResponse(appError, exposeErrorDetails);\n }\n\n ctx.set('X-Error-Code', appError.code);\n\n ctx.app.emit('error', appError, ctx);\n }\n };\n}\n\nfunction defaultErrorLogger(error: AppError, ctx: Context): void {\n const logData = {\n error: {\n code: error.code,\n message: error.message,\n statusCode: error.statusCode,\n isOperational: error.isOperational,\n },\n request: {\n method: ctx.method,\n path: ctx.path,\n query: ctx.query,\n ip: ctx.ip,\n userAgent: ctx.get('user-agent'),\n },\n user: {\n id: ctx.state.user?.userUuid,\n email: ctx.state.user?.email,\n },\n traceId: ctx.state.traceId,\n };\n\n if (error.statusCode >= 500) {\n console.error('❌ Server Error:', JSON.stringify(logData, null, 2));\n if (error.stack) {\n console.error('Stack trace:', error.stack);\n }\n } else {\n console.warn('⚠️ Client Error:', JSON.stringify(logData, null, 2));\n }\n}\n\n/**\n * Format error for API response\n */\nfunction formatErrorResponse(\n error: AppError,\n exposeDetails: boolean\n): unknown {\n const response: any = {\n success: false,\n error: {\n code: error.code,\n message: error.message,\n },\n };\n\n // Add details if configured or if client error (4xx)\n if (exposeDetails || error.statusCode < 500) {\n if (error.details) {\n response.error.details = error.details;\n }\n }\n\n // Never expose stack traces in production\n if (exposeDetails && error.stack) {\n response.error.stack = error.stack;\n }\n\n return response;\n}\n\nexport function formatZodErrors(error: z.ZodError): {\n validationErrors: { path: string; message: string; code: string }[];\n} {\n return {\n validationErrors: error.issues.map((issue) => ({\n path: issue.path.join(\".\"),\n message: issue.message,\n code: issue.code,\n })),\n };\n}\n\nexport function koaErrorMiddleware(config: ErrorMiddlewareConfig = {}) {\n return createErrorMiddleware(config);\n}"],"names":["z","AppError","toAppError","createErrorMiddleware","config","exposeErrorDetails","logErrors","logger","formatter","ctx","next","error","appError","ZodError","formatZodErrors","defaultErrorLogger","status","statusCode","body","formatErrorResponse","set","code","app","emit","logData","message","isOperational","request","method","path","query","ip","userAgent","get","user","id","state","userUuid","email","traceId","console","JSON","stringify","stack","warn","exposeDetails","response","success","details","validationErrors","issues","map","issue","join","koaErrorMiddleware"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/middlewares/ErrorMiddleware.ts"],"sourcesContent":["import type { Context, Next } from \"koa\";\nimport { z } from \"zod\";\nimport { AppError, toAppError } from \"../Errors/AppError.js\";\n\nexport interface ErrorMiddlewareConfig {\n exposeErrorDetails?: boolean;\n logErrors?: boolean;\n logger?: (error: Error, ctx: Context) => void;\n formatter?: (error: AppError, ctx: Context) => unknown;\n}\n\nexport function ErrorMiddleware(config: ErrorMiddlewareConfig = {}) {\n const {\n exposeErrorDetails = false,\n logErrors = true,\n logger,\n formatter,\n } = config;\n\n return async (ctx: Context, next: Next) => {\n try {\n await next();\n } catch (err) {\n let appError: AppError;\n\n if (err instanceof z.ZodError) {\n appError = new AppError(\n \"VALIDATION_ERROR\",\n \"Request validation failed\",\n 400,\n formatZodErrors(err)\n );\n } else {\n appError = toAppError(err);\n }\n\n if (logErrors) {\n if (logger) {\n logger(appError, ctx);\n } else {\n defaultErrorLogger(appError, ctx);\n }\n }\n\n ctx.status = appError.statusCode;\n ctx.set(\"X-Error-Code\", appError.code);\n ctx.type = \"application/json\";\n\n ctx.body = formatter\n ? formatter(appError, ctx)\n : formatErrorResponse(appError, exposeErrorDetails);\n\n // optional: only emit for 5xx to avoid noisy app-level listeners\n ctx.app.emit(\"error\", appError, ctx);\n }\n };\n}\n\nfunction defaultErrorLogger(error: AppError, ctx: Context): void {\n const safeEmail =\n typeof ctx.state.user?.email === \"string\" ? \"***@***\" : undefined;\n\n const logData = {\n error: {\n code: error.code,\n message: error.message,\n statusCode: error.statusCode,\n isOperational: error.isOperational,\n },\n request: {\n method: ctx.method,\n path: ctx.path,\n ip: ctx.ip,\n userAgent: ctx.get(\"user-agent\"),\n },\n user: {\n id: ctx.state.user?.userUuid,\n email: safeEmail,\n },\n traceId: ctx.state.traceId,\n };\n\n if (error.statusCode >= 500) {\n console.error(\"❌ Server Error:\", JSON.stringify(logData, null, 2));\n if (error.stack) console.error(\"Stack trace:\", error.stack);\n } else {\n console.warn(\"⚠️ Client Error:\", JSON.stringify(logData, null, 2));\n }\n}\n\nfunction formatErrorResponse(error: AppError, exposeDetails: boolean): unknown {\n const response: {\n success: false;\n error: {\n code: string;\n message: string;\n details?: unknown;\n stack?: string;\n };\n } = {\n success: false,\n error: {\n code: error.code,\n message: error.message,\n },\n };\n\n if (exposeDetails || error.statusCode < 500) {\n if (error.details !== undefined) {\n response.error.details = error.details;\n }\n }\n\n if (exposeDetails && error.stack) {\n response.error.stack = error.stack;\n }\n\n return response;\n}\n\nexport function formatZodErrors(error: z.ZodError): {\n validationErrors: { path: string; message: string; code: string }[];\n} {\n return {\n validationErrors: error.issues.map((issue) => ({\n path: issue.path.join(\".\"),\n message: issue.message,\n code: issue.code,\n })),\n };\n}"],"names":["z","AppError","toAppError","ErrorMiddleware","config","exposeErrorDetails","logErrors","logger","formatter","ctx","next","err","appError","ZodError","formatZodErrors","defaultErrorLogger","status","statusCode","set","code","type","body","formatErrorResponse","app","emit","error","safeEmail","state","user","email","undefined","logData","message","isOperational","request","method","path","ip","userAgent","get","id","userUuid","traceId","console","JSON","stringify","stack","warn","exposeDetails","response","success","details","validationErrors","issues","map","issue","join"],"mappings":"AACA,SAASA,CAAC,QAAQ,MAAM;AACxB,SAASC,QAAQ,EAAEC,UAAU,QAAQ,wBAAwB;AAS7D,OAAO,SAASC,gBAAgBC,SAAgC,CAAC,CAAC;IAChE,MAAM,EACJC,qBAAqB,KAAK,EAC1BC,YAAY,IAAI,EAChBC,MAAM,EACNC,SAAS,EACV,GAAGJ;IAEJ,OAAO,OAAOK,KAAcC;QAC1B,IAAI;YACF,MAAMA;QACR,EAAE,OAAOC,KAAK;YACZ,IAAIC;YAEJ,IAAID,eAAeX,EAAEa,QAAQ,EAAE;gBAC7BD,WAAW,IAAIX,SACX,oBACA,6BACA,KACAa,gBAAgBH;YAEtB,OAAO;gBACLC,WAAWV,WAAWS;YACxB;YAEA,IAAIL,WAAW;gBACb,IAAIC,QAAQ;oBACVA,OAAOK,UAAUH;gBACnB,OAAO;oBACLM,mBAAmBH,UAAUH;gBAC/B;YACF;YAEAA,IAAIO,MAAM,GAAGJ,SAASK,UAAU;YAChCR,IAAIS,GAAG,CAAC,gBAAgBN,SAASO,IAAI;YACrCV,IAAIW,IAAI,GAAG;YAEXX,IAAIY,IAAI,GAAGb,YACLA,UAAUI,UAAUH,OACpBa,oBAAoBV,UAAUP;YAEpC,iEAAiE;YACjEI,IAAIc,GAAG,CAACC,IAAI,CAAC,SAASZ,UAAUH;QAClC;IACF;AACF;AAEA,SAASM,mBAAmBU,KAAe,EAAEhB,GAAY;IACvD,MAAMiB,YACF,OAAOjB,IAAIkB,KAAK,CAACC,IAAI,EAAEC,UAAU,WAAW,YAAYC;IAE5D,MAAMC,UAAU;QACdN,OAAO;YACLN,MAAMM,MAAMN,IAAI;YAChBa,SAASP,MAAMO,OAAO;YACtBf,YAAYQ,MAAMR,UAAU;YAC5BgB,eAAeR,MAAMQ,aAAa;QACpC;QACAC,SAAS;YACPC,QAAQ1B,IAAI0B,MAAM;YAClBC,MAAM3B,IAAI2B,IAAI;YACdC,IAAI5B,IAAI4B,EAAE;YACVC,WAAW7B,IAAI8B,GAAG,CAAC;QACrB;QACAX,MAAM;YACJY,IAAI/B,IAAIkB,KAAK,CAACC,IAAI,EAAEa;YACpBZ,OAAOH;QACT;QACAgB,SAASjC,IAAIkB,KAAK,CAACe,OAAO;IAC5B;IAEA,IAAIjB,MAAMR,UAAU,IAAI,KAAK;QAC3B0B,QAAQlB,KAAK,CAAC,mBAAmBmB,KAAKC,SAAS,CAACd,SAAS,MAAM;QAC/D,IAAIN,MAAMqB,KAAK,EAAEH,QAAQlB,KAAK,CAAC,gBAAgBA,MAAMqB,KAAK;IAC5D,OAAO;QACLH,QAAQI,IAAI,CAAC,qBAAqBH,KAAKC,SAAS,CAACd,SAAS,MAAM;IAClE;AACF;AAEA,SAAST,oBAAoBG,KAAe,EAAEuB,aAAsB;IAClE,MAAMC,WAQF;QACFC,SAAS;QACTzB,OAAO;YACLN,MAAMM,MAAMN,IAAI;YAChBa,SAASP,MAAMO,OAAO;QACxB;IACF;IAEA,IAAIgB,iBAAiBvB,MAAMR,UAAU,GAAG,KAAK;QAC3C,IAAIQ,MAAM0B,OAAO,KAAKrB,WAAW;YAC/BmB,SAASxB,KAAK,CAAC0B,OAAO,GAAG1B,MAAM0B,OAAO;QACxC;IACF;IAEA,IAAIH,iBAAiBvB,MAAMqB,KAAK,EAAE;QAChCG,SAASxB,KAAK,CAACqB,KAAK,GAAGrB,MAAMqB,KAAK;IACpC;IAEA,OAAOG;AACT;AAEA,OAAO,SAASnC,gBAAgBW,KAAiB;IAG/C,OAAO;QACL2B,kBAAkB3B,MAAM4B,MAAM,CAACC,GAAG,CAAC,CAACC,QAAW,CAAA;gBAC7CnB,MAAMmB,MAAMnB,IAAI,CAACoB,IAAI,CAAC;gBACtBxB,SAASuB,MAAMvB,OAAO;gBACtBb,MAAMoC,MAAMpC,IAAI;YAClB,CAAA;IACF;AACF"}
@@ -1,7 +1,7 @@
1
1
  import jwt from "jsonwebtoken";
2
2
  import type { LoginTicket } from "google-auth-library";
3
- import { PersistedUser } from '../dbmodels/PersistedUser.js';
4
3
  import type { Credentials as CredentialsType, SignedTransactions, SubscriptionStatusResult, UserTypes, VerificationStatus } from '../models/UserInterfaces.js';
4
+ import { PersistedUser } from "lib/dbmodels/PersistedUser.js";
5
5
  export declare class AuthenticationUtil {
6
6
  static readonly ACCESS_SECRET: string;
7
7
  static readonly REFRESH_SECRET: string;
@@ -1 +1 @@
1
- {"version":3,"file":"AuthenticationUtil.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/AuthenticationUtil.ts"],"names":[],"mappings":"AACA,OAAO,GAAyC,MAAM,cAAc,CAAC;AAIrE,OAAO,KAAK,EAAC,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAC3D,OAAO,KAAK,EACV,WAAW,IAAI,eAAe,EAC9B,kBAAkB,EAIlB,wBAAwB,EAExB,SAAS,EACT,kBAAkB,EACnB,MAAM,6BAA6B,CAAC;AAsCrC,qBAAa,kBAAkB;IAC7B,gBAAuB,aAAa,EAAsC,MAAM,CAAC;IACjF,gBAAuB,cAAc,EAAuC,MAAM,CAAC;WAG/D,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;WAQ1E,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,GAAG,KAAK,CAAC;IAmC3F;;OAEG;WACW,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAMtD;;OAEG;WACW,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIvD;;OAEG;WACW,kBAAkB,CAAC,YAAY,EAAE,MAAM;IA4BrD;;OAEG;WACiB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAInE;;OAEG;WACiB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAItE,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;WAMzE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;WAiBrE,iBAAiB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;WAUhB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;WAchD,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;WAqB1C,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;WAUtC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;WAW3D,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;WAa7D,oBAAoB,CACpC,qBAAqB,EAAE,MAAM,GAC9B,OAAO,CAAC,kBAAkB,EAAE,CAAC;WAuDZ,6BAA6B,CAC7C,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,wBAAwB,EAAE,CAAC;WAkElB,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WA6BlE,8BAA8B,CAAC,aAAa,EAAE,MAAM;;;WA8CpD,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;WAyBlE,uBAAuB,CACvC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACrB,OAAO,CAAC,GAAG,CAAC;WAkBK,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC;WAYjD,+BAA+B,CAAC,KAAK,EAAE,MAAM;WAiC7C,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAwBlF"}
1
+ {"version":3,"file":"AuthenticationUtil.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/AuthenticationUtil.ts"],"names":[],"mappings":"AACA,OAAO,GAAyC,MAAM,cAAc,CAAC;AAIrE,OAAO,KAAK,EAAC,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EACV,WAAW,IAAI,eAAe,EAC9B,kBAAkB,EAIlB,wBAAwB,EAExB,SAAS,EACT,kBAAkB,EACnB,MAAM,6BAA6B,CAAC;AAIrC,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAmC9D,qBAAa,kBAAkB;IAC7B,gBAAuB,aAAa,EAAsC,MAAM,CAAC;IACjF,gBAAuB,cAAc,EAAuC,MAAM,CAAC;WAG/D,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;WAQ1E,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,GAAG,KAAK,CAAC;IAmC3F;;OAEG;WACW,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAMtD;;OAEG;WACW,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIvD;;OAEG;WACW,kBAAkB,CAAC,YAAY,EAAE,MAAM;IA4BrD;;OAEG;WACiB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAInE;;OAEG;WACiB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAItE,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;WAMzE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;WAiBrE,iBAAiB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;WAUhB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;WAchD,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;WAqB1C,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;WAUtC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;WAW3D,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;WAa7D,oBAAoB,CACpC,qBAAqB,EAAE,MAAM,GAC9B,OAAO,CAAC,kBAAkB,EAAE,CAAC;WAuDZ,6BAA6B,CAC7C,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,wBAAwB,EAAE,CAAC;WAkElB,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WA6BlE,8BAA8B,CAAC,aAAa,EAAE,MAAM;;;WA8CpD,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;WAyBlE,uBAAuB,CACvC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACrB,OAAO,CAAC,GAAG,CAAC;WAkBK,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC;WAYjD,+BAA+B,CAAC,KAAK,EAAE,MAAM;WAiC7C,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAwBlF"}
@@ -5,10 +5,10 @@ import { google } from "googleapis";
5
5
  import * as bcrypt from "bcryptjs";
6
6
  import { OAuth2Client as OAuth2ClientImpl } from "google-auth-library";
7
7
  import jwksClient from "jwks-rsa";
8
- import { PersistedUser } from "../dbmodels/PersistedUser.js";
9
8
  import { AppleTransactionError } from "../Errors/Errors.js";
10
9
  import { SecretManagerServiceClient } from "@google-cloud/secret-manager";
11
10
  import { Log } from "./Logger.js";
11
+ import { PersistedUser } from "../dbmodels/PersistedUser.js";
12
12
  dotenv.config();
13
13
  const logger = Log.getInstance().extend("authentication-util");
14
14
  var TokenExpiration = /*#__PURE__*/ function(TokenExpiration) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/AuthenticationUtil.ts"],"sourcesContent":["import * as dotenv from \"dotenv\";\nimport jwt, {type JwtPayload, type VerifyErrors} from \"jsonwebtoken\";\nimport axios, {type AxiosResponse, isAxiosError} from \"axios\";\nimport {google} from \"googleapis\";\nimport * as bcrypt from \"bcryptjs\";\nimport type {LoginTicket,} from \"google-auth-library\";\nimport {OAuth2Client as OAuth2ClientImpl} from \"google-auth-library\";\nimport jwksClient, {type SigningKey} from \"jwks-rsa\";\nimport {PersistedUser} from '../dbmodels/PersistedUser.js';\nimport type {\n Credentials as CredentialsType,\n SignedTransactions,\n SingleTransactionResponse,\n SubscriptionStatusResponse,\n SubscriptionStatusResponseError,\n SubscriptionStatusResult,\n TransactionsResponse,\n UserTypes,\n VerificationStatus,\n} from '../models/UserInterfaces.js';\nimport {AppleTransactionError} from '../Errors/Errors.js';\nimport {SecretManagerServiceClient} from \"@google-cloud/secret-manager\";\nimport {Log} from \"./Logger.js\";\n\ndotenv.config();\n\nconst logger: Log = Log.getInstance().extend(\"authentication-util\");\n\nenum TokenExpiration {\n ACCESS = 10,\n REFRESH = 356 * 24 * 60 * 60,\n}\n\nconst appleJwksClient = jwksClient({\n jwksUri: \"https://appleid.apple.com/auth/keys\",\n});\n\nasync function loadAndroidServiceAccount(): Promise<{client_email: string; private_key: string}> {\n const sm = new SecretManagerServiceClient();\n const name = \"projects/1033066542238/secrets/ANDROID_SUB_KEY/versions/latest\";\n const [v] = await sm.accessSecretVersion({ name });\n const raw = v.payload?.data?.toString(\"utf8\") ?? \"\";\n\n // Secret should be the full JSON key. Parse and normalize newlines.\n const json = JSON.parse(raw);\n const client_email = json.client_email as string;\n const private_key = String(json.private_key).replace(/\\\\n/g, \"\\n\");\n return { client_email, private_key };\n}\n\nasync function loadAppleSubscriptionkey(): Promise<string> {\n const client = new SecretManagerServiceClient();\n const name = \"projects/1033066542238/secrets/APPLE_SUB_KEY/versions/latest\";\n const [v] = await client.accessSecretVersion({ name });\n return v.payload?.data?.toString(\"utf8\") ?? \"\";\n}\n\nexport class AuthenticationUtil {\n public static readonly ACCESS_SECRET = process.env.ACCESS_TOKEN_SECRET as string;\n public static readonly REFRESH_SECRET = process.env.REFRESH_TOKEN_SECRET as string;\n\n\n public static async fetchUserWithTokenInfo(token: string): Promise<PersistedUser | null> {\n const userInToken = await AuthenticationUtil.verifyTokenAndFetchUser(token);\n if (!userInToken || !userInToken.userUuid) {\n return null;\n }\n return userInToken;\n }\n\n public static verifyTokenAndFetchUser(token: string): Promise<PersistedUser | null | false> {\n return new Promise<PersistedUser | null | false>((resolve, reject) => {\n jwt.verify(\n token,\n this.ACCESS_SECRET,\n (err: VerifyErrors | null, decoded: JwtPayload | string | undefined) => {\n if (err) {\n reject(err);\n return;\n }\n\n if (decoded === undefined) {\n resolve(null);\n return;\n }\n\n const user: UserTypes = <UserTypes>decoded;\n\n if (!user.userUuid) {\n resolve(false);\n return;\n }\n\n PersistedUser.findByPk(user.userUuid)\n .then((persistedUser: PersistedUser | null) => {\n resolve(persistedUser);\n })\n .catch((e: Error) => {\n reject(e);\n });\n }\n );\n });\n }\n\n /**\n * Sign access token\n */\n public static signAccessToken(user: UserTypes): string {\n return jwt.sign(user, this.ACCESS_SECRET, {\n expiresIn: TokenExpiration.ACCESS,\n });\n }\n\n /**\n * Sign refresh token\n */\n public static signRefreshToken(user: UserTypes): string {\n return jwt.sign(user, this.REFRESH_SECRET);\n }\n\n /**\n * Verify refresh token and return new access token\n */\n public static verifyRefreshToken(refreshToken: string) {\n return new Promise<string | null | false>((resolve, reject) => {\n jwt.verify(\n refreshToken,\n this.REFRESH_SECRET,\n async (\n err: VerifyErrors | null,\n user: JwtPayload | string | undefined\n ) => {\n if (err) {\n reject(err);\n }\n\n if (user === undefined) {\n resolve(null);\n return;\n }\n const userTypes = <UserTypes>user;\n const newAccessToken = this.signAccessToken(userTypes);\n\n resolve(newAccessToken);\n }\n );\n });\n }\n\n // ==================== Password Management ====================\n\n /**\n * Hash password using bcrypt\n */\n public static async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, 10);\n }\n\n /**\n * Compare password with hash\n */\n public static async comparePassword(plainPassword: string, hash: string): Promise<boolean> {\n return bcrypt.compare(plainPassword, hash);\n }\n\n public static async checkIfUserAlreadyRegistered(email: string | undefined): Promise<boolean> {\n if (!email) return false;\n const user = await PersistedUser.findOne({ where: { email } });\n return user !== null;\n }\n\n public static async login(email: string, password: string): Promise<PersistedUser | null> {\n const users = await PersistedUser.findAll({ where: { email } });\n\n if (!users || users.length === 0) {\n return null;\n }\n\n for (const user of users) {\n const passwordsMatch = await this.comparePassword(password, user.password);\n if (passwordsMatch) {\n return user;\n }\n }\n\n return null;\n }\n\n public static async verifyGoogleToken(\n idToken: string,\n audience: string\n ): Promise<LoginTicket | null> {\n const client = new OAuth2ClientImpl(audience);\n try {\n return await client.verifyIdToken({ idToken, audience });\n } catch (error) {\n logger.error(\"Google Token Verification Error:\", error);\n return null;\n }\n }\n\n public static getGoogleClientId(platform: string): string | undefined {\n switch (platform) {\n case \"android\":\n return process.env.ANDROID_GOOGLE_CLIENT_ID;\n case \"ios\":\n return process.env.IOS_GOOGLE_CLIENT_ID;\n case \"web\":\n return process.env.WEB_GOOGLE_CLIENT_ID;\n default:\n return undefined;\n }\n }\n\n\n public static async generateAppleJWT(): Promise<string> {\n const privateKey: string = await loadAppleSubscriptionkey()\n\n const header = {\n alg: \"ES256\",\n kid: process.env.APPLE_KID as string,\n typ: \"JWT\",\n };\n\n const payload = {\n iss: process.env.APPLE_ISSUER as string,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 3600,\n aud: \"appstoreconnect-v1\",\n bid: process.env.APPLE_BUNDLE_ID as string,\n };\n\n return jwt.sign(payload, privateKey, { header });\n }\n\n\n public static verifyAppleJwt(userData: string, key: string) {\n try {\n return jwt.verify(userData, key);\n } catch (e) {\n logger.error(e);\n return null;\n }\n }\n\n\n public static async getAppleSignInKey(kid: string): Promise<string | undefined> {\n try {\n const key: SigningKey = await appleJwksClient.getSigningKey(kid);\n return key.getPublicKey();\n } catch (e) {\n logger.error(e);\n return undefined;\n }\n }\n\n\n public static async verifyAppleReceipt(data: string): Promise<VerificationStatus> {\n const response: AxiosResponse = await axios.post(\n \"https://buy.itunes.apple.com/verifyReceipt\",\n {\n \"receipt-data\": data,\n password: process.env.APPLE_SHARED_SECRET as string,\n \"exclude-old-transactions\": true,\n }\n );\n\n return response.data as VerificationStatus;\n }\n\n public static async getAppleTransactions(\n originalTransactionId: string\n ): Promise<SignedTransactions[]> {\n const result: SignedTransactions[] = [];\n\n try {\n const response: AxiosResponse<TransactionsResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/history/${originalTransactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const token of response.data.signedTransactions) {\n result.push(jwt.decode(token) as SignedTransactions);\n }\n\n return result;\n } catch (error) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n\n if (\n isAxiosError(error) &&\n (error.response?.data.errorCode === 4040010 || error.response?.status === 401)\n ) {\n try {\n const response: AxiosResponse<TransactionsResponse> = await axios.get(\n `https://api.storekit-sandbox.itunes.apple.com/inApps/v1/history/${originalTransactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const token of response.data.signedTransactions) {\n result.push(jwt.decode(token) as SignedTransactions);\n }\n\n return result;\n } catch (e) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n }\n throw new AppleTransactionError(\"Transaction was not found in both environments.\");\n }\n throw error;\n }\n }\n\n public static async getAppleSubscriptionsStatuses(\n transactionId: string\n ): Promise<SubscriptionStatusResult[]> {\n const result: SubscriptionStatusResult[] = [];\n\n try {\n const response: AxiosResponse<SubscriptionStatusResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const transaction of response.data.data[0].lastTransactions) {\n result.push({\n originalTransactionId: transaction.originalTransactionId,\n status: transaction.status,\n signedTransactionInfo: jwt.decode(transaction.signedTransactionInfo),\n signedRenewalInfo: jwt.decode(transaction.signedRenewalInfo),\n });\n }\n\n return result;\n } catch (error: unknown) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n\n // Try sandbox\n if (\n isAxiosError(error) &&\n (error.response?.data.errorCode === 4040010 || error.response?.status === 401)\n ) {\n try {\n const response: AxiosResponse<SubscriptionStatusResponse> = await axios.get(\n `https://api.storekit-sandbox.itunes.apple.com/inApps/v1/subscriptions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const transaction of response.data.data[0].lastTransactions) {\n result.push({\n originalTransactionId: transaction.originalTransactionId,\n status: transaction.status,\n signedTransactionInfo: jwt.decode(transaction.signedTransactionInfo),\n signedRenewalInfo: jwt.decode(transaction.signedRenewalInfo),\n });\n }\n\n return result;\n } catch (e) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n }\n throw new AppleTransactionError(\"Transaction was not found in both environments.\");\n }\n throw error;\n }\n }\n\n public static async isAppleSubscriptionActive(transactionId: string): Promise<boolean> {\n try {\n const response: AxiosResponse<SubscriptionStatusResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return (\n response.data.data[0].lastTransactions[0].status === 0 ||\n response.data.data[0].lastTransactions[0].status === 2\n );\n } catch (e) {\n if (\n axios.isAxiosError(e) &&\n e.response &&\n (e.response.data as SubscriptionStatusResponseError)[\"errorMessage\"] ===\n \"Invalid transaction id.\"\n ) {\n return false;\n }\n return false;\n }\n }\n\n public static async getSingleAppleTransactionsInfo(transactionId: string) {\n try {\n const response: AxiosResponse<SingleTransactionResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/transactions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return { signedTransactionInfo: jwt.decode(response.data.signedTransactionInfo) };\n } catch (error) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n\n if (\n isAxiosError(error) &&\n (error.response?.data.errorCode === 4040010 || error.response?.status === 401)\n ) {\n try {\n const response: AxiosResponse<SingleTransactionResponse> = await axios.get(\n `https://api.storekit-sandbox.itunes.apple.com/inApps/v1/transactions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return { signedTransactionInfo: jwt.decode(response.data.signedTransactionInfo) };\n } catch (e) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n }\n throw new AppleTransactionError(\"Transaction was not found in both environments.\");\n }\n throw error;\n }\n }\n\n\n public static async checkIfUserBoughtProgram(transactionId: string): Promise<string[]> {\n try {\n const productIds: string[] = [];\n const url = process.env.PURCHASE_HISTORY_URL || \"https://api.storekit.itunes.apple.com\";\n const response: AxiosResponse = await axios.get(\n `${url}/inApps/v2/history/${transactionId}?productType=NON_CONSUMABLE`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const transaction of response.data.signedTransactions) {\n productIds.push((jwt.decode(transaction) as { productId: string }).productId);\n }\n\n return productIds;\n } catch (e) {\n logger.error((e as Error).message);\n return [];\n }\n }\n\n public static async extendAppleSubscription(\n transactionId: string,\n extendByDays: number\n ): Promise<any> {\n const response: AxiosResponse = await axios.put(\n `https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/extend/${transactionId}`,\n {\n extendByDays,\n extendReasonCode: 1,\n requestIdentifier: require(\"crypto\").randomUUID(),\n },\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n },\n }\n );\n\n return response.data;\n }\n\n public static async getAndroidAccessToken(): Promise<CredentialsType> {\n const { client_email, private_key } = await loadAndroidServiceAccount();\n\n const jwtClient = new google.auth.JWT({\n email: client_email,\n key: private_key, // unesc\n scopes: [\"https://www.googleapis.com/auth/androidpublisher\"],\n });\n\n return await jwtClient.authorize();\n }\n\n public static async getAndroidSubscriptionsStatuses(token: string) {\n try {\n const credentials = await this.getAndroidAccessToken();\n\n const response: AxiosResponse = await axios.get(\n `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${process.env.ANDROID_PACKAGE_NAME || \"nl.browney.nintydayschallenge\"}/purchases/subscriptionsv2/tokens/${token}`,\n {\n headers: {\n Authorization: `Bearer ${credentials.access_token as string}`,\n },\n }\n );\n\n return response.data;\n } catch (error) {\n if (isAxiosError(error) && error.response && error.response.status === 410) {\n // Subscription expired\n return {\n lineItems: [\n {\n expiryTime: new Date(Date.now() - 86400000).toISOString(), // Yesterday\n },\n ],\n };\n } else {\n if (isAxiosError(error)) {\n logger.error(\"Android subscription error:\", error.message);\n return false;\n }\n }\n }\n }\n\n public static async isAndroidSubscriptionsActive(token: string): Promise<boolean> {\n try {\n const credentials = await this.getAndroidAccessToken();\n\n const response: AxiosResponse = await axios.get(\n `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${process.env.ANDROID_PACKAGE_NAME || \"nl.browney.nintydayschallenge\"}/purchases/subscriptionsv2/tokens/${token}`,\n {\n headers: {\n Authorization: `Bearer ${credentials.access_token as string}`,\n },\n }\n );\n\n return (\n (response.data as { subscriptionState: string }).subscriptionState ===\n \"SUBSCRIPTION_STATE_ACTIVE\"\n );\n } catch (error) {\n if (isAxiosError(error)) {\n logger.error(\"An error occurred:\", error.message);\n }\n return false;\n }\n }\n}\n"],"names":["dotenv","jwt","axios","isAxiosError","google","bcrypt","OAuth2Client","OAuth2ClientImpl","jwksClient","PersistedUser","AppleTransactionError","SecretManagerServiceClient","Log","config","logger","getInstance","extend","TokenExpiration","appleJwksClient","jwksUri","loadAndroidServiceAccount","sm","name","v","accessSecretVersion","raw","payload","data","toString","json","JSON","parse","client_email","private_key","String","replace","loadAppleSubscriptionkey","client","AuthenticationUtil","ACCESS_SECRET","process","env","ACCESS_TOKEN_SECRET","REFRESH_SECRET","REFRESH_TOKEN_SECRET","fetchUserWithTokenInfo","token","userInToken","verifyTokenAndFetchUser","userUuid","Promise","resolve","reject","verify","err","decoded","undefined","user","findByPk","then","persistedUser","catch","e","signAccessToken","sign","expiresIn","signRefreshToken","verifyRefreshToken","refreshToken","userTypes","newAccessToken","hashPassword","password","hash","comparePassword","plainPassword","compare","checkIfUserAlreadyRegistered","email","findOne","where","login","users","findAll","length","passwordsMatch","verifyGoogleToken","idToken","audience","verifyIdToken","error","getGoogleClientId","platform","ANDROID_GOOGLE_CLIENT_ID","IOS_GOOGLE_CLIENT_ID","WEB_GOOGLE_CLIENT_ID","generateAppleJWT","privateKey","header","alg","kid","APPLE_KID","typ","iss","APPLE_ISSUER","iat","Math","floor","Date","now","exp","aud","bid","APPLE_BUNDLE_ID","verifyAppleJwt","userData","key","getAppleSignInKey","getSigningKey","getPublicKey","verifyAppleReceipt","response","post","APPLE_SHARED_SECRET","getAppleTransactions","originalTransactionId","result","get","headers","Authorization","signedTransactions","push","decode","status","errorCode","getAppleSubscriptionsStatuses","transactionId","transaction","lastTransactions","signedTransactionInfo","signedRenewalInfo","isAppleSubscriptionActive","getSingleAppleTransactionsInfo","checkIfUserBoughtProgram","productIds","url","PURCHASE_HISTORY_URL","productId","message","extendAppleSubscription","extendByDays","put","extendReasonCode","requestIdentifier","require","randomUUID","getAndroidAccessToken","jwtClient","auth","JWT","scopes","authorize","getAndroidSubscriptionsStatuses","credentials","ANDROID_PACKAGE_NAME","access_token","lineItems","expiryTime","toISOString","isAndroidSubscriptionsActive","subscriptionState"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/utils/AuthenticationUtil.ts"],"sourcesContent":["import * as dotenv from \"dotenv\";\nimport jwt, {type JwtPayload, type VerifyErrors} from \"jsonwebtoken\";\nimport axios, {type AxiosResponse, isAxiosError} from \"axios\";\nimport {google} from \"googleapis\";\nimport * as bcrypt from \"bcryptjs\";\nimport type {LoginTicket,} from \"google-auth-library\";\nimport {OAuth2Client as OAuth2ClientImpl} from \"google-auth-library\";\nimport jwksClient, {type SigningKey} from \"jwks-rsa\";\nimport type {\n Credentials as CredentialsType,\n SignedTransactions,\n SingleTransactionResponse,\n SubscriptionStatusResponse,\n SubscriptionStatusResponseError,\n SubscriptionStatusResult,\n TransactionsResponse,\n UserTypes,\n VerificationStatus,\n} from '../models/UserInterfaces.js';\nimport {AppleTransactionError} from '../Errors/Errors.js';\nimport {SecretManagerServiceClient} from \"@google-cloud/secret-manager\";\nimport {Log} from \"./Logger.js\";\nimport { PersistedUser } from \"lib/dbmodels/PersistedUser.js\";\n\ndotenv.config();\n\nconst logger: Log = Log.getInstance().extend(\"authentication-util\");\n\nenum TokenExpiration {\n ACCESS = 10,\n REFRESH = 356 * 24 * 60 * 60,\n}\n\nconst appleJwksClient = jwksClient({\n jwksUri: \"https://appleid.apple.com/auth/keys\",\n});\n\nasync function loadAndroidServiceAccount(): Promise<{client_email: string; private_key: string}> {\n const sm = new SecretManagerServiceClient();\n const name = \"projects/1033066542238/secrets/ANDROID_SUB_KEY/versions/latest\";\n const [v] = await sm.accessSecretVersion({ name });\n const raw = v.payload?.data?.toString(\"utf8\") ?? \"\";\n\n // Secret should be the full JSON key. Parse and normalize newlines.\n const json = JSON.parse(raw);\n const client_email = json.client_email as string;\n const private_key = String(json.private_key).replace(/\\\\n/g, \"\\n\");\n return { client_email, private_key };\n}\n\nasync function loadAppleSubscriptionkey(): Promise<string> {\n const client = new SecretManagerServiceClient();\n const name = \"projects/1033066542238/secrets/APPLE_SUB_KEY/versions/latest\";\n const [v] = await client.accessSecretVersion({ name });\n return v.payload?.data?.toString(\"utf8\") ?? \"\";\n}\n\nexport class AuthenticationUtil {\n public static readonly ACCESS_SECRET = process.env.ACCESS_TOKEN_SECRET as string;\n public static readonly REFRESH_SECRET = process.env.REFRESH_TOKEN_SECRET as string;\n\n\n public static async fetchUserWithTokenInfo(token: string): Promise<PersistedUser | null> {\n const userInToken = await AuthenticationUtil.verifyTokenAndFetchUser(token);\n if (!userInToken || !userInToken.userUuid) {\n return null;\n }\n return userInToken;\n }\n\n public static verifyTokenAndFetchUser(token: string): Promise<PersistedUser | null | false> {\n return new Promise<PersistedUser | null | false>((resolve, reject) => {\n jwt.verify(\n token,\n this.ACCESS_SECRET,\n (err: VerifyErrors | null, decoded: JwtPayload | string | undefined) => {\n if (err) {\n reject(err);\n return;\n }\n\n if (decoded === undefined) {\n resolve(null);\n return;\n }\n\n const user: UserTypes = <UserTypes>decoded;\n\n if (!user.userUuid) {\n resolve(false);\n return;\n }\n\n PersistedUser.findByPk(user.userUuid)\n .then((persistedUser: PersistedUser | null) => {\n resolve(persistedUser);\n })\n .catch((e: Error) => {\n reject(e);\n });\n }\n );\n });\n }\n\n /**\n * Sign access token\n */\n public static signAccessToken(user: UserTypes): string {\n return jwt.sign(user, this.ACCESS_SECRET, {\n expiresIn: TokenExpiration.ACCESS,\n });\n }\n\n /**\n * Sign refresh token\n */\n public static signRefreshToken(user: UserTypes): string {\n return jwt.sign(user, this.REFRESH_SECRET);\n }\n\n /**\n * Verify refresh token and return new access token\n */\n public static verifyRefreshToken(refreshToken: string) {\n return new Promise<string | null | false>((resolve, reject) => {\n jwt.verify(\n refreshToken,\n this.REFRESH_SECRET,\n async (\n err: VerifyErrors | null,\n user: JwtPayload | string | undefined\n ) => {\n if (err) {\n reject(err);\n }\n\n if (user === undefined) {\n resolve(null);\n return;\n }\n const userTypes = <UserTypes>user;\n const newAccessToken = this.signAccessToken(userTypes);\n\n resolve(newAccessToken);\n }\n );\n });\n }\n\n // ==================== Password Management ====================\n\n /**\n * Hash password using bcrypt\n */\n public static async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, 10);\n }\n\n /**\n * Compare password with hash\n */\n public static async comparePassword(plainPassword: string, hash: string): Promise<boolean> {\n return bcrypt.compare(plainPassword, hash);\n }\n\n public static async checkIfUserAlreadyRegistered(email: string | undefined): Promise<boolean> {\n if (!email) return false;\n const user = await PersistedUser.findOne({ where: { email } });\n return user !== null;\n }\n\n public static async login(email: string, password: string): Promise<PersistedUser | null> {\n const users = await PersistedUser.findAll({ where: { email } });\n\n if (!users || users.length === 0) {\n return null;\n }\n\n for (const user of users) {\n const passwordsMatch = await this.comparePassword(password, user.password);\n if (passwordsMatch) {\n return user;\n }\n }\n\n return null;\n }\n\n public static async verifyGoogleToken(\n idToken: string,\n audience: string\n ): Promise<LoginTicket | null> {\n const client = new OAuth2ClientImpl(audience);\n try {\n return await client.verifyIdToken({ idToken, audience });\n } catch (error) {\n logger.error(\"Google Token Verification Error:\", error);\n return null;\n }\n }\n\n public static getGoogleClientId(platform: string): string | undefined {\n switch (platform) {\n case \"android\":\n return process.env.ANDROID_GOOGLE_CLIENT_ID;\n case \"ios\":\n return process.env.IOS_GOOGLE_CLIENT_ID;\n case \"web\":\n return process.env.WEB_GOOGLE_CLIENT_ID;\n default:\n return undefined;\n }\n }\n\n\n public static async generateAppleJWT(): Promise<string> {\n const privateKey: string = await loadAppleSubscriptionkey()\n\n const header = {\n alg: \"ES256\",\n kid: process.env.APPLE_KID as string,\n typ: \"JWT\",\n };\n\n const payload = {\n iss: process.env.APPLE_ISSUER as string,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 3600,\n aud: \"appstoreconnect-v1\",\n bid: process.env.APPLE_BUNDLE_ID as string,\n };\n\n return jwt.sign(payload, privateKey, { header });\n }\n\n\n public static verifyAppleJwt(userData: string, key: string) {\n try {\n return jwt.verify(userData, key);\n } catch (e) {\n logger.error(e);\n return null;\n }\n }\n\n\n public static async getAppleSignInKey(kid: string): Promise<string | undefined> {\n try {\n const key: SigningKey = await appleJwksClient.getSigningKey(kid);\n return key.getPublicKey();\n } catch (e) {\n logger.error(e);\n return undefined;\n }\n }\n\n\n public static async verifyAppleReceipt(data: string): Promise<VerificationStatus> {\n const response: AxiosResponse = await axios.post(\n \"https://buy.itunes.apple.com/verifyReceipt\",\n {\n \"receipt-data\": data,\n password: process.env.APPLE_SHARED_SECRET as string,\n \"exclude-old-transactions\": true,\n }\n );\n\n return response.data as VerificationStatus;\n }\n\n public static async getAppleTransactions(\n originalTransactionId: string\n ): Promise<SignedTransactions[]> {\n const result: SignedTransactions[] = [];\n\n try {\n const response: AxiosResponse<TransactionsResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/history/${originalTransactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const token of response.data.signedTransactions) {\n result.push(jwt.decode(token) as SignedTransactions);\n }\n\n return result;\n } catch (error) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n\n if (\n isAxiosError(error) &&\n (error.response?.data.errorCode === 4040010 || error.response?.status === 401)\n ) {\n try {\n const response: AxiosResponse<TransactionsResponse> = await axios.get(\n `https://api.storekit-sandbox.itunes.apple.com/inApps/v1/history/${originalTransactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const token of response.data.signedTransactions) {\n result.push(jwt.decode(token) as SignedTransactions);\n }\n\n return result;\n } catch (e) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n }\n throw new AppleTransactionError(\"Transaction was not found in both environments.\");\n }\n throw error;\n }\n }\n\n public static async getAppleSubscriptionsStatuses(\n transactionId: string\n ): Promise<SubscriptionStatusResult[]> {\n const result: SubscriptionStatusResult[] = [];\n\n try {\n const response: AxiosResponse<SubscriptionStatusResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const transaction of response.data.data[0].lastTransactions) {\n result.push({\n originalTransactionId: transaction.originalTransactionId,\n status: transaction.status,\n signedTransactionInfo: jwt.decode(transaction.signedTransactionInfo),\n signedRenewalInfo: jwt.decode(transaction.signedRenewalInfo),\n });\n }\n\n return result;\n } catch (error: unknown) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n\n // Try sandbox\n if (\n isAxiosError(error) &&\n (error.response?.data.errorCode === 4040010 || error.response?.status === 401)\n ) {\n try {\n const response: AxiosResponse<SubscriptionStatusResponse> = await axios.get(\n `https://api.storekit-sandbox.itunes.apple.com/inApps/v1/subscriptions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const transaction of response.data.data[0].lastTransactions) {\n result.push({\n originalTransactionId: transaction.originalTransactionId,\n status: transaction.status,\n signedTransactionInfo: jwt.decode(transaction.signedTransactionInfo),\n signedRenewalInfo: jwt.decode(transaction.signedRenewalInfo),\n });\n }\n\n return result;\n } catch (e) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n }\n throw new AppleTransactionError(\"Transaction was not found in both environments.\");\n }\n throw error;\n }\n }\n\n public static async isAppleSubscriptionActive(transactionId: string): Promise<boolean> {\n try {\n const response: AxiosResponse<SubscriptionStatusResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return (\n response.data.data[0].lastTransactions[0].status === 0 ||\n response.data.data[0].lastTransactions[0].status === 2\n );\n } catch (e) {\n if (\n axios.isAxiosError(e) &&\n e.response &&\n (e.response.data as SubscriptionStatusResponseError)[\"errorMessage\"] ===\n \"Invalid transaction id.\"\n ) {\n return false;\n }\n return false;\n }\n }\n\n public static async getSingleAppleTransactionsInfo(transactionId: string) {\n try {\n const response: AxiosResponse<SingleTransactionResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/transactions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return { signedTransactionInfo: jwt.decode(response.data.signedTransactionInfo) };\n } catch (error) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n\n if (\n isAxiosError(error) &&\n (error.response?.data.errorCode === 4040010 || error.response?.status === 401)\n ) {\n try {\n const response: AxiosResponse<SingleTransactionResponse> = await axios.get(\n `https://api.storekit-sandbox.itunes.apple.com/inApps/v1/transactions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return { signedTransactionInfo: jwt.decode(response.data.signedTransactionInfo) };\n } catch (e) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n }\n throw new AppleTransactionError(\"Transaction was not found in both environments.\");\n }\n throw error;\n }\n }\n\n\n public static async checkIfUserBoughtProgram(transactionId: string): Promise<string[]> {\n try {\n const productIds: string[] = [];\n const url = process.env.PURCHASE_HISTORY_URL || \"https://api.storekit.itunes.apple.com\";\n const response: AxiosResponse = await axios.get(\n `${url}/inApps/v2/history/${transactionId}?productType=NON_CONSUMABLE`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const transaction of response.data.signedTransactions) {\n productIds.push((jwt.decode(transaction) as { productId: string }).productId);\n }\n\n return productIds;\n } catch (e) {\n logger.error((e as Error).message);\n return [];\n }\n }\n\n public static async extendAppleSubscription(\n transactionId: string,\n extendByDays: number\n ): Promise<any> {\n const response: AxiosResponse = await axios.put(\n `https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/extend/${transactionId}`,\n {\n extendByDays,\n extendReasonCode: 1,\n requestIdentifier: require(\"crypto\").randomUUID(),\n },\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n },\n }\n );\n\n return response.data;\n }\n\n public static async getAndroidAccessToken(): Promise<CredentialsType> {\n const { client_email, private_key } = await loadAndroidServiceAccount();\n\n const jwtClient = new google.auth.JWT({\n email: client_email,\n key: private_key, // unesc\n scopes: [\"https://www.googleapis.com/auth/androidpublisher\"],\n });\n\n return await jwtClient.authorize();\n }\n\n public static async getAndroidSubscriptionsStatuses(token: string) {\n try {\n const credentials = await this.getAndroidAccessToken();\n\n const response: AxiosResponse = await axios.get(\n `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${process.env.ANDROID_PACKAGE_NAME || \"nl.browney.nintydayschallenge\"}/purchases/subscriptionsv2/tokens/${token}`,\n {\n headers: {\n Authorization: `Bearer ${credentials.access_token as string}`,\n },\n }\n );\n\n return response.data;\n } catch (error) {\n if (isAxiosError(error) && error.response && error.response.status === 410) {\n // Subscription expired\n return {\n lineItems: [\n {\n expiryTime: new Date(Date.now() - 86400000).toISOString(), // Yesterday\n },\n ],\n };\n } else {\n if (isAxiosError(error)) {\n logger.error(\"Android subscription error:\", error.message);\n return false;\n }\n }\n }\n }\n\n public static async isAndroidSubscriptionsActive(token: string): Promise<boolean> {\n try {\n const credentials = await this.getAndroidAccessToken();\n\n const response: AxiosResponse = await axios.get(\n `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${process.env.ANDROID_PACKAGE_NAME || \"nl.browney.nintydayschallenge\"}/purchases/subscriptionsv2/tokens/${token}`,\n {\n headers: {\n Authorization: `Bearer ${credentials.access_token as string}`,\n },\n }\n );\n\n return (\n (response.data as { subscriptionState: string }).subscriptionState ===\n \"SUBSCRIPTION_STATE_ACTIVE\"\n );\n } catch (error) {\n if (isAxiosError(error)) {\n logger.error(\"An error occurred:\", error.message);\n }\n return false;\n }\n }\n}\n"],"names":["dotenv","jwt","axios","isAxiosError","google","bcrypt","OAuth2Client","OAuth2ClientImpl","jwksClient","AppleTransactionError","SecretManagerServiceClient","Log","PersistedUser","config","logger","getInstance","extend","TokenExpiration","appleJwksClient","jwksUri","loadAndroidServiceAccount","sm","name","v","accessSecretVersion","raw","payload","data","toString","json","JSON","parse","client_email","private_key","String","replace","loadAppleSubscriptionkey","client","AuthenticationUtil","ACCESS_SECRET","process","env","ACCESS_TOKEN_SECRET","REFRESH_SECRET","REFRESH_TOKEN_SECRET","fetchUserWithTokenInfo","token","userInToken","verifyTokenAndFetchUser","userUuid","Promise","resolve","reject","verify","err","decoded","undefined","user","findByPk","then","persistedUser","catch","e","signAccessToken","sign","expiresIn","signRefreshToken","verifyRefreshToken","refreshToken","userTypes","newAccessToken","hashPassword","password","hash","comparePassword","plainPassword","compare","checkIfUserAlreadyRegistered","email","findOne","where","login","users","findAll","length","passwordsMatch","verifyGoogleToken","idToken","audience","verifyIdToken","error","getGoogleClientId","platform","ANDROID_GOOGLE_CLIENT_ID","IOS_GOOGLE_CLIENT_ID","WEB_GOOGLE_CLIENT_ID","generateAppleJWT","privateKey","header","alg","kid","APPLE_KID","typ","iss","APPLE_ISSUER","iat","Math","floor","Date","now","exp","aud","bid","APPLE_BUNDLE_ID","verifyAppleJwt","userData","key","getAppleSignInKey","getSigningKey","getPublicKey","verifyAppleReceipt","response","post","APPLE_SHARED_SECRET","getAppleTransactions","originalTransactionId","result","get","headers","Authorization","signedTransactions","push","decode","status","errorCode","getAppleSubscriptionsStatuses","transactionId","transaction","lastTransactions","signedTransactionInfo","signedRenewalInfo","isAppleSubscriptionActive","getSingleAppleTransactionsInfo","checkIfUserBoughtProgram","productIds","url","PURCHASE_HISTORY_URL","productId","message","extendAppleSubscription","extendByDays","put","extendReasonCode","requestIdentifier","require","randomUUID","getAndroidAccessToken","jwtClient","auth","JWT","scopes","authorize","getAndroidSubscriptionsStatuses","credentials","ANDROID_PACKAGE_NAME","access_token","lineItems","expiryTime","toISOString","isAndroidSubscriptionsActive","subscriptionState"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/Logger.ts"],"names":[],"mappings":"AAGA,qBAAa,GAAG;IACd,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,OAAO;WAoDO,WAAW,IAAI,GAAG;WAUlB,cAAc,CAAC,IAAI,EAAE,MAAM;IAIlC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAO5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAO3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAO3C,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,GAAG,GAAG,IAAI;IAuBjD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IA2DtD,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,mBAAmB;IAapB,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG;CAI1C"}
1
+ {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/Logger.ts"],"names":[],"mappings":"AAyBA,qBAAa,GAAG;IACd,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,OAAO;WAuCO,WAAW,IAAI,GAAG;WAUlB,cAAc,CAAC,IAAI,EAAE,MAAM;IAIlC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAO5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAO3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAO3C,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,GAAG,GAAG,IAAI;IAuBjD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IA2DtD,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,mBAAmB;IAapB,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG;CAI1C"}
@@ -1,5 +1,38 @@
1
1
  import { isAxiosError } from "axios";
2
2
  import { createLogger, format, transports } from "winston";
3
+ function safeStringify(value) {
4
+ const seen = new WeakSet();
5
+ return JSON.stringify(value, (key, val)=>{
6
+ // drop known circular/noisy fields from axios
7
+ if (key === 'request' || key === 'socket' || key === '_httpMessage') return undefined;
8
+ if (key === 'config' && val && typeof val === 'object') {
9
+ // pick only safe axios config fields
10
+ const { url, method, headers, params, data, timeout } = val;
11
+ return {
12
+ url,
13
+ method,
14
+ headers,
15
+ params,
16
+ data,
17
+ timeout
18
+ };
19
+ }
20
+ if (key === 'response' && val && typeof val === 'object') {
21
+ const { status, statusText, headers, data } = val;
22
+ return {
23
+ status,
24
+ statusText,
25
+ headers,
26
+ data
27
+ };
28
+ }
29
+ if (typeof val === 'object' && val !== null) {
30
+ if (seen.has(val)) return '[Circular]';
31
+ seen.add(val);
32
+ }
33
+ return val;
34
+ }, 2);
35
+ }
3
36
  export class Log {
4
37
  static instance = null;
5
38
  logger;
@@ -11,20 +44,13 @@ export class Log {
11
44
  const namespace = isProduction ? this.baseName : level === "error" ? `\x1b[31m${this.baseName}\x1b[39m` : `\x1b[35m${this.baseName}\x1b[39m`;
12
45
  const { namespace: _, level: __, message: ___, timestamp: ____, stack: _____, ...rest } = meta;
13
46
  let output = `${timestamp ? `[${timestamp}] ` : ""}${namespace} ${message}`;
47
+ delete rest.name;
48
+ delete rest.code;
49
+ delete rest.statusCode;
14
50
  if (Object.keys(rest).length > 0) {
15
- const cleanMeta = {
16
- ...rest
17
- };
18
- delete cleanMeta.name;
19
- delete cleanMeta.code;
20
- delete cleanMeta.statusCode;
21
- if (Object.keys(cleanMeta).length > 0) {
22
- output += ` ${JSON.stringify(cleanMeta, null, 2)}`;
23
- }
24
- }
25
- if (stack) {
26
- output += `\n${stack}`;
51
+ output += ` ${safeStringify(rest)}`;
27
52
  }
53
+ if (stack) output += `\n${stack}`;
28
54
  return output;
29
55
  });
30
56
  this.logger = createLogger({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/Logger.ts"],"sourcesContent":["import { isAxiosError } from \"axios\";\nimport { createLogger, format, transports, Logger } from \"winston\";\n\nexport class Log {\n private static instance: Log | null = null;\n private readonly logger: Logger;\n private readonly baseName: string;\n\n private constructor(baseName: string) {\n this.baseName = baseName;\n\n const isProduction = process.env.ENVIRONMENT === \"production\";\n\n const logFormat = format.printf(({ level, message, timestamp, stack, ...meta }) => {\n const namespace = isProduction\n ? this.baseName\n : level === \"error\"\n ? `\\x1b[31m${this.baseName}\\x1b[39m`\n : `\\x1b[35m${this.baseName}\\x1b[39m`;\n\n const {\n namespace: _,\n level: __,\n message: ___,\n timestamp: ____,\n stack: _____,\n ...rest\n } = meta;\n\n let output = `${timestamp ? `[${timestamp}] ` : \"\"}${namespace} ${message}`;\n\n if (Object.keys(rest).length > 0) {\n const cleanMeta = { ...rest };\n delete cleanMeta.name;\n delete cleanMeta.code;\n delete cleanMeta.statusCode;\n\n if (Object.keys(cleanMeta).length > 0) {\n output += ` ${JSON.stringify(cleanMeta, null, 2)}`;\n }\n }\n\n if (stack) {\n output += `\\n${stack}`;\n }\n\n return output;\n });\n\n this.logger = createLogger({\n level: \"debug\",\n format: format.combine(\n format.timestamp({ format: \"YYYY-MM-DD HH:mm:ss\" }),\n format.errors({ stack: true }), // This ensures stack traces are captured\n logFormat,\n ),\n transports: [new transports.Console()],\n });\n }\n\n public static getInstance(): Log {\n if (!Log.instance) {\n const baseName =\n \"@90DC:\" +\n (process.env.npm_package_name || \"package-name-not-specified\");\n Log.instance = new Log(baseName);\n }\n return Log.instance;\n }\n\n public static extendInstance(name: string) {\n return this.getInstance().extend(name);\n }\n\n public debug(message: string, metadata?: any): void {\n this.logger.debug(message, {\n namespace: this.baseName,\n ...metadata,\n });\n }\n\n public info(message: string, metadata?: any): void {\n this.logger.info(message, {\n namespace: this.baseName,\n ...metadata,\n });\n }\n\n public warn(message: string, metadata?: any): void {\n this.logger.warn(message, {\n namespace: `${this.baseName}:warning`,\n ...metadata,\n });\n }\n\n public error(message: unknown, errorContext?: any): void {\n const logNamespace = `${this.baseName}:error`;\n\n if (message instanceof Error) {\n // For Error objects, pass them directly to winston with proper formatting\n this.logger.error(message.message, {\n namespace: logNamespace,\n stack: message.stack,\n name: message.name,\n ...((message as any).code && { code: (message as any).code }),\n ...((message as any).statusCode && { statusCode: (message as any).statusCode }),\n ...errorContext,\n });\n } else {\n // For non-Error objects, convert to string\n const logMessage = typeof message === \"string\" ? message : JSON.stringify(message, null, 2);\n this.logger.error(logMessage, {\n namespace: logNamespace,\n ...errorContext,\n });\n }\n }\n\n public catchError(error: unknown, context?: any): void {\n const logNamespace = `${this.baseName}:error`;\n\n if (isAxiosError(error)) {\n // Enhanced Axios error logging with readable format\n const errorMessage = `Axios Error: ${error.message}`;\n const errorDetails = {\n namespace: logNamespace,\n type: \"AxiosError\",\n url: error.config?.url,\n method: error.config?.method?.toUpperCase(),\n status: error.response?.status,\n statusText: error.response?.statusText,\n code: error.code,\n stack: error.stack,\n responseData: error.response?.data,\n requestHeaders: error.config?.headers,\n ...context,\n };\n\n this.logger.error(errorMessage, errorDetails);\n\n } else if (error instanceof Error) {\n // Enhanced Error object logging with readable stack trace\n const errorDetails = {\n namespace: logNamespace,\n type: error.constructor.name,\n name: error.name,\n stack: error.stack,\n ...((error as any).code && { code: (error as any).code }),\n ...((error as any).statusCode && { statusCode: (error as any).statusCode }),\n ...((error as any).context && { errorContext: (error as any).context }),\n ...context,\n };\n\n this.logger.error(error.message, errorDetails);\n\n } else if (typeof error === \"string\") {\n // String error\n this.logger.error(error, {\n namespace: logNamespace,\n type: \"String\",\n ...context,\n });\n\n } else {\n // Unknown error type\n const errorMessage = \"Unknown error occurred\";\n const serializedError = this.safeStringify(error);\n\n this.logger.error(errorMessage, {\n namespace: logNamespace,\n type: \"Unknown\",\n originalError: serializedError,\n ...context,\n });\n }\n }\n\n private safeStringify(obj: unknown): string {\n try {\n return JSON.stringify(obj, this.getCircularReplacer(), 2);\n } catch (error) {\n return `[Unable to stringify: ${String(obj)}]`;\n }\n }\n\n private getCircularReplacer() {\n const seen = new WeakSet();\n return (_key: string, value: any) => {\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n }\n return value;\n };\n }\n\n public extend(extensionName: string): Log {\n const extendedName = `${this.baseName}:${extensionName}`;\n return new Log(extendedName);\n }\n}"],"names":["isAxiosError","createLogger","format","transports","Log","instance","logger","baseName","isProduction","process","env","ENVIRONMENT","logFormat","printf","level","message","timestamp","stack","meta","namespace","_","__","___","____","_____","rest","output","Object","keys","length","cleanMeta","name","code","statusCode","JSON","stringify","combine","errors","Console","getInstance","npm_package_name","extendInstance","extend","debug","metadata","info","warn","error","errorContext","logNamespace","Error","logMessage","catchError","context","errorMessage","errorDetails","type","url","config","method","toUpperCase","status","response","statusText","responseData","data","requestHeaders","headers","serializedError","safeStringify","originalError","obj","getCircularReplacer","String","seen","WeakSet","_key","value","has","add","extensionName","extendedName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/utils/Logger.ts"],"sourcesContent":["import { isAxiosError } from \"axios\";\nimport { createLogger, format, transports, Logger } from \"winston\";\n\nfunction safeStringify(value: unknown): string {\n const seen = new WeakSet();\n return JSON.stringify(value, (key, val) => {\n // drop known circular/noisy fields from axios\n if (key === 'request' || key === 'socket' || key === '_httpMessage') return undefined;\n if (key === 'config' && val && typeof val === 'object') {\n // pick only safe axios config fields\n const { url, method, headers, params, data, timeout } = val as any;\n return { url, method, headers, params, data, timeout };\n }\n if (key === 'response' && val && typeof val === 'object') {\n const { status, statusText, headers, data } = val as any;\n return { status, statusText, headers, data };\n }\n if (typeof val === 'object' && val !== null) {\n if (seen.has(val)) return '[Circular]';\n seen.add(val);\n }\n return val;\n }, 2);\n}\n\nexport class Log {\n private static instance: Log | null = null;\n private readonly logger: Logger;\n private readonly baseName: string;\n\n private constructor(baseName: string) {\n this.baseName = baseName;\n\n const isProduction = process.env.ENVIRONMENT === \"production\";\n\n const logFormat = format.printf(({ level, message, timestamp, stack, ...meta }) => {\n const namespace = isProduction\n ? this.baseName\n : level === \"error\"\n ? `\\x1b[31m${this.baseName}\\x1b[39m`\n : `\\x1b[35m${this.baseName}\\x1b[39m`;\n\n const { namespace: _, level: __, message: ___, timestamp: ____, stack: _____, ...rest } = meta;\n\n let output = `${timestamp ? `[${timestamp}] ` : \"\"}${namespace} ${message}`;\n\n delete (rest as any).name;\n delete (rest as any).code;\n delete (rest as any).statusCode;\n\n if (Object.keys(rest).length > 0) {\n output += ` ${safeStringify(rest)}`;\n }\n\n if (stack) output += `\\n${stack}`;\n return output;\n });\n\n this.logger = createLogger({\n level: \"debug\",\n format: format.combine(\n format.timestamp({ format: \"YYYY-MM-DD HH:mm:ss\" }),\n format.errors({ stack: true }), // This ensures stack traces are captured\n logFormat,\n ),\n transports: [new transports.Console()],\n });\n }\n\n public static getInstance(): Log {\n if (!Log.instance) {\n const baseName =\n \"@90DC:\" +\n (process.env.npm_package_name || \"package-name-not-specified\");\n Log.instance = new Log(baseName);\n }\n return Log.instance;\n }\n\n public static extendInstance(name: string) {\n return this.getInstance().extend(name);\n }\n\n public debug(message: string, metadata?: any): void {\n this.logger.debug(message, {\n namespace: this.baseName,\n ...metadata,\n });\n }\n\n public info(message: string, metadata?: any): void {\n this.logger.info(message, {\n namespace: this.baseName,\n ...metadata,\n });\n }\n\n public warn(message: string, metadata?: any): void {\n this.logger.warn(message, {\n namespace: `${this.baseName}:warning`,\n ...metadata,\n });\n }\n\n public error(message: unknown, errorContext?: any): void {\n const logNamespace = `${this.baseName}:error`;\n\n if (message instanceof Error) {\n // For Error objects, pass them directly to winston with proper formatting\n this.logger.error(message.message, {\n namespace: logNamespace,\n stack: message.stack,\n name: message.name,\n ...((message as any).code && { code: (message as any).code }),\n ...((message as any).statusCode && { statusCode: (message as any).statusCode }),\n ...errorContext,\n });\n } else {\n // For non-Error objects, convert to string\n const logMessage = typeof message === \"string\" ? message : JSON.stringify(message, null, 2);\n this.logger.error(logMessage, {\n namespace: logNamespace,\n ...errorContext,\n });\n }\n }\n\n public catchError(error: unknown, context?: any): void {\n const logNamespace = `${this.baseName}:error`;\n\n if (isAxiosError(error)) {\n // Enhanced Axios error logging with readable format\n const errorMessage = `Axios Error: ${error.message}`;\n const errorDetails = {\n namespace: logNamespace,\n type: \"AxiosError\",\n url: error.config?.url,\n method: error.config?.method?.toUpperCase(),\n status: error.response?.status,\n statusText: error.response?.statusText,\n code: error.code,\n stack: error.stack,\n responseData: error.response?.data,\n requestHeaders: error.config?.headers,\n ...context,\n };\n\n this.logger.error(errorMessage, errorDetails);\n\n } else if (error instanceof Error) {\n // Enhanced Error object logging with readable stack trace\n const errorDetails = {\n namespace: logNamespace,\n type: error.constructor.name,\n name: error.name,\n stack: error.stack,\n ...((error as any).code && { code: (error as any).code }),\n ...((error as any).statusCode && { statusCode: (error as any).statusCode }),\n ...((error as any).context && { errorContext: (error as any).context }),\n ...context,\n };\n\n this.logger.error(error.message, errorDetails);\n\n } else if (typeof error === \"string\") {\n // String error\n this.logger.error(error, {\n namespace: logNamespace,\n type: \"String\",\n ...context,\n });\n\n } else {\n // Unknown error type\n const errorMessage = \"Unknown error occurred\";\n const serializedError = this.safeStringify(error);\n\n this.logger.error(errorMessage, {\n namespace: logNamespace,\n type: \"Unknown\",\n originalError: serializedError,\n ...context,\n });\n }\n }\n\n private safeStringify(obj: unknown): string {\n try {\n return JSON.stringify(obj, this.getCircularReplacer(), 2);\n } catch (error) {\n return `[Unable to stringify: ${String(obj)}]`;\n }\n }\n\n private getCircularReplacer() {\n const seen = new WeakSet();\n return (_key: string, value: any) => {\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n }\n return value;\n };\n }\n\n public extend(extensionName: string): Log {\n const extendedName = `${this.baseName}:${extensionName}`;\n return new Log(extendedName);\n }\n}"],"names":["isAxiosError","createLogger","format","transports","safeStringify","value","seen","WeakSet","JSON","stringify","key","val","undefined","url","method","headers","params","data","timeout","status","statusText","has","add","Log","instance","logger","baseName","isProduction","process","env","ENVIRONMENT","logFormat","printf","level","message","timestamp","stack","meta","namespace","_","__","___","____","_____","rest","output","name","code","statusCode","Object","keys","length","combine","errors","Console","getInstance","npm_package_name","extendInstance","extend","debug","metadata","info","warn","error","errorContext","logNamespace","Error","logMessage","catchError","context","errorMessage","errorDetails","type","config","toUpperCase","response","responseData","requestHeaders","serializedError","originalError","obj","getCircularReplacer","String","_key","extensionName","extendedName"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "90dc-core",
3
- "version": "1.11.0",
3
+ "version": "1.11.2",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",