@volontariapp/auth 2.1.16-snap-a528481 → 3.0.0-snap-4c4f273

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 (43) hide show
  1. package/CHANGELOG.md +5 -3
  2. package/dist/auth.module.d.ts +3 -0
  3. package/dist/auth.module.d.ts.map +1 -1
  4. package/dist/auth.module.js +60 -10
  5. package/dist/auth.module.js.map +1 -1
  6. package/dist/guards/access-token.guard.d.ts.map +1 -1
  7. package/dist/guards/access-token.guard.js +4 -3
  8. package/dist/guards/access-token.guard.js.map +1 -1
  9. package/dist/interceptors/grpc-internal.interceptor.d.ts +3 -3
  10. package/dist/interceptors/grpc-internal.interceptor.d.ts.map +1 -1
  11. package/dist/interceptors/grpc-internal.interceptor.js +10 -7
  12. package/dist/interceptors/grpc-internal.interceptor.js.map +1 -1
  13. package/dist/middlewares/access-token.middleware.d.ts.map +1 -1
  14. package/dist/middlewares/access-token.middleware.js +3 -0
  15. package/dist/middlewares/access-token.middleware.js.map +1 -1
  16. package/dist/middlewares/refresh-token.middleware.d.ts.map +1 -1
  17. package/dist/middlewares/refresh-token.middleware.js +9 -1
  18. package/dist/middlewares/refresh-token.middleware.js.map +1 -1
  19. package/dist/test/integration/full-auth-flow.int.spec.js +31 -10
  20. package/dist/test/integration/full-auth-flow.int.spec.js.map +1 -1
  21. package/dist/test/unit/access-token.guard.unit.spec.d.ts +2 -0
  22. package/dist/test/unit/access-token.guard.unit.spec.d.ts.map +1 -0
  23. package/dist/test/unit/access-token.guard.unit.spec.js +45 -0
  24. package/dist/test/unit/access-token.guard.unit.spec.js.map +1 -0
  25. package/dist/test/unit/access-token.middleware.unit.spec.d.ts +2 -0
  26. package/dist/test/unit/access-token.middleware.unit.spec.d.ts.map +1 -0
  27. package/dist/test/unit/access-token.middleware.unit.spec.js +65 -0
  28. package/dist/test/unit/access-token.middleware.unit.spec.js.map +1 -0
  29. package/dist/test/unit/grpc-internal.interceptor.unit.spec.js +14 -7
  30. package/dist/test/unit/grpc-internal.interceptor.unit.spec.js.map +1 -1
  31. package/dist/test/unit/grpc-metadata.helper.unit.spec.d.ts +2 -0
  32. package/dist/test/unit/grpc-metadata.helper.unit.spec.d.ts.map +1 -0
  33. package/dist/test/unit/grpc-metadata.helper.unit.spec.js +25 -0
  34. package/dist/test/unit/grpc-metadata.helper.unit.spec.js.map +1 -0
  35. package/dist/test/unit/refresh-token.guard.unit.spec.d.ts +2 -0
  36. package/dist/test/unit/refresh-token.guard.unit.spec.d.ts.map +1 -0
  37. package/dist/test/unit/refresh-token.guard.unit.spec.js +43 -0
  38. package/dist/test/unit/refresh-token.guard.unit.spec.js.map +1 -0
  39. package/dist/test/unit/refresh-token.middleware.unit.spec.d.ts +2 -0
  40. package/dist/test/unit/refresh-token.middleware.unit.spec.d.ts.map +1 -0
  41. package/dist/test/unit/refresh-token.middleware.unit.spec.js +44 -0
  42. package/dist/test/unit/refresh-token.middleware.unit.spec.js.map +1 -0
  43. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,10 +1,12 @@
1
1
  # Changelog
2
2
 
3
- ## 2.1.16
3
+ ## 3.0.0
4
4
 
5
- ### Patch Changes
5
+ ### Major Changes
6
6
 
7
- - patch grpc metadata helpers
7
+ - Added support for user roles
8
+ - Added support for grpc internal requests
9
+ - Added support for grpc internal responses
8
10
 
9
11
  ## 2.1.15
10
12
 
@@ -1,6 +1,9 @@
1
1
  import type { DynamicModule } from '@nestjs/common';
2
2
  import type { AuthConfig } from './interfaces/index.js';
3
3
  export declare class AuthModule {
4
+ private static createCommonProviders;
4
5
  static register(options: AuthConfig): DynamicModule;
6
+ static registerGateway(options: AuthConfig): DynamicModule;
7
+ static registerMicroservice(options: AuthConfig): DynamicModule;
5
8
  }
6
9
  //# sourceMappingURL=auth.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.module.d.ts","sourceRoot":"","sources":["../src/auth.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,qBAEa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,aAAa;CAkBpD"}
1
+ {"version":3,"file":"auth.module.d.ts","sourceRoot":"","sources":["../src/auth.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,gBAAgB,CAAC;AAI9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAQxD,qBAEa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAepC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,aAAa;IAuBnD,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,aAAa;IAqB1D,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,UAAU,GAAG,aAAa;CAOhE"}
@@ -9,23 +9,73 @@ import { Module, Global } from '@nestjs/common';
9
9
  import { JwtService } from './services/jwt.service.js';
10
10
  import { AUTH_OPTIONS } from './constants/index.js';
11
11
  import { GrpcMetadataHelper } from './services/grpc-metadata.helper.js';
12
+ import { GrpcInternalInterceptor } from './interceptors/grpc-internal.interceptor.js';
13
+ import { AccessTokenGuard } from './guards/access-token.guard.js';
14
+ import { RefreshTokenGuard } from './guards/refresh-token.guard.js';
15
+ import { RolesGuard } from './guards/roles.guard.js';
16
+ import { GrpcInternalGuard } from './guards/grpc-internal.guard.js';
12
17
  let AuthModule = AuthModule_1 = class AuthModule {
18
+ static createCommonProviders(options) {
19
+ return [
20
+ {
21
+ provide: AUTH_OPTIONS,
22
+ useValue: options,
23
+ },
24
+ {
25
+ provide: JwtService,
26
+ useFactory: (opts) => new JwtService(opts),
27
+ inject: [AUTH_OPTIONS],
28
+ },
29
+ GrpcMetadataHelper,
30
+ ];
31
+ }
13
32
  static register(options) {
14
33
  return {
15
34
  module: AuthModule_1,
16
35
  providers: [
17
- {
18
- provide: AUTH_OPTIONS,
19
- useValue: options,
20
- },
21
- {
22
- provide: JwtService,
23
- useFactory: (opts) => new JwtService(opts),
24
- inject: [AUTH_OPTIONS],
25
- },
36
+ ...this.createCommonProviders(options),
37
+ AccessTokenGuard,
38
+ RefreshTokenGuard,
39
+ RolesGuard,
40
+ GrpcInternalGuard,
41
+ GrpcInternalInterceptor,
42
+ ],
43
+ exports: [
44
+ JwtService,
45
+ GrpcMetadataHelper,
46
+ AccessTokenGuard,
47
+ RefreshTokenGuard,
48
+ RolesGuard,
49
+ GrpcInternalGuard,
50
+ GrpcInternalInterceptor,
51
+ ],
52
+ };
53
+ }
54
+ static registerGateway(options) {
55
+ return {
56
+ module: AuthModule_1,
57
+ providers: [
58
+ ...this.createCommonProviders(options),
59
+ AccessTokenGuard,
60
+ RefreshTokenGuard,
61
+ RolesGuard,
62
+ GrpcInternalInterceptor,
63
+ ],
64
+ exports: [
65
+ JwtService,
26
66
  GrpcMetadataHelper,
67
+ AccessTokenGuard,
68
+ RefreshTokenGuard,
69
+ RolesGuard,
70
+ GrpcInternalInterceptor,
27
71
  ],
28
- exports: [JwtService, GrpcMetadataHelper],
72
+ };
73
+ }
74
+ static registerMicroservice(options) {
75
+ return {
76
+ module: AuthModule_1,
77
+ providers: [...this.createCommonProviders(options), GrpcInternalGuard],
78
+ exports: [JwtService, GrpcMetadataHelper, GrpcInternalGuard],
29
79
  };
30
80
  }
31
81
  };
@@ -1 +1 @@
1
- {"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../src/auth.module.ts"],"names":[],"mappings":";;;;;;;AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAIjE,IAAM,UAAU,kBAAhB,MAAM,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,OAAmB;QACjC,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,YAAY;oBACrB,QAAQ,EAAE,OAAO;iBAClB;gBACD;oBACE,OAAO,EAAE,UAAU;oBACnB,UAAU,EAAE,CAAC,IAAgB,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC;oBACtD,MAAM,EAAE,CAAC,YAAY,CAAC;iBACvB;gBACD,kBAAkB;aACnB;YACD,OAAO,EAAE,CAAC,UAAU,EAAE,kBAAkB,CAAC;SAC1C,CAAC;IACJ,CAAC;CACF,CAAA;AAnBY,UAAU;IAFtB,MAAM,EAAE;IACR,MAAM,CAAC,EAAE,CAAC;GACE,UAAU,CAmBtB"}
1
+ {"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../src/auth.module.ts"],"names":[],"mappings":";;;;;;;AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAI7D,IAAM,UAAU,kBAAhB,MAAM,UAAU;IACb,MAAM,CAAC,qBAAqB,CAAC,OAAmB;QACtD,OAAO;YACL;gBACE,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,OAAO;aAClB;YACD;gBACE,OAAO,EAAE,UAAU;gBACnB,UAAU,EAAE,CAAC,IAAgB,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC;gBACtD,MAAM,EAAE,CAAC,YAAY,CAAC;aACvB;YACD,kBAAkB;SACnB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,OAAmB;QACjC,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,SAAS,EAAE;gBACT,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;gBACtC,gBAAgB;gBAChB,iBAAiB;gBACjB,UAAU;gBACV,iBAAiB;gBACjB,uBAAuB;aACxB;YACD,OAAO,EAAE;gBACP,UAAU;gBACV,kBAAkB;gBAClB,gBAAgB;gBAChB,iBAAiB;gBACjB,UAAU;gBACV,iBAAiB;gBACjB,uBAAuB;aACxB;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,OAAmB;QACxC,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,SAAS,EAAE;gBACT,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;gBACtC,gBAAgB;gBAChB,iBAAiB;gBACjB,UAAU;gBACV,uBAAuB;aACxB;YACD,OAAO,EAAE;gBACP,UAAU;gBACV,kBAAkB;gBAClB,gBAAgB;gBAChB,iBAAiB;gBACjB,UAAU;gBACV,uBAAuB;aACxB;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,oBAAoB,CAAC,OAAmB;QAC7C,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;YACtE,OAAO,EAAE,CAAC,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,CAAC;SAC7D,CAAC;IACJ,CAAC;CACF,CAAA;AAnEY,UAAU;IAFtB,MAAM,EAAE;IACR,MAAM,CAAC,EAAE,CAAC;GACE,UAAU,CAmEtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"access-token.guard.d.ts","sourceRoot":"","sources":["../../src/guards/access-token.guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAIxD,qBACa,gBAAiB,YAAW,WAAW;IAEtC,OAAO,CAAC,QAAQ,CAAC,UAAU;IADvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+D;gBACzD,UAAU,EAAE,UAAU;IAE7C,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;CAmB/D"}
1
+ {"version":3,"file":"access-token.guard.d.ts","sourceRoot":"","sources":["../../src/guards/access-token.guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAIxD,qBACa,gBAAiB,YAAW,WAAW;IAEtC,OAAO,CAAC,QAAQ,CAAC,UAAU;IADvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+D;gBACzD,UAAU,EAAE,UAAU;IAE7C,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;CAoB/D"}
@@ -21,7 +21,7 @@ let AccessTokenGuard = class AccessTokenGuard {
21
21
  const request = context.switchToHttp().getRequest();
22
22
  const token = request['accessToken'];
23
23
  if (typeof token !== 'string') {
24
- this.logger.warn('Access token is missing from request');
24
+ this.logger.warn('Authentication failed: Access token is missing from request');
25
25
  throw MISSING_ACCESS_TOKEN();
26
26
  }
27
27
  try {
@@ -31,8 +31,9 @@ let AccessTokenGuard = class AccessTokenGuard {
31
31
  return true;
32
32
  }
33
33
  catch (error) {
34
- this.logger.error('Access token verification failed', error);
35
- throw INVALID_ACCESS_TOKEN(error instanceof Error ? error.message : undefined);
34
+ const message = error instanceof Error ? error.message : 'Unknown error';
35
+ this.logger.error(`Authentication failed: Access token verification failed - ${message}`);
36
+ throw INVALID_ACCESS_TOKEN(message);
36
37
  }
37
38
  }
38
39
  };
@@ -1 +1 @@
1
- {"version":3,"file":"access-token.guard.js","sourceRoot":"","sources":["../../src/guards/access-token.guard.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGvC,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAEE;IADZ,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtF,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAA2B,CAAC;QAC7E,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QAErC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACzD,MAAM,oBAAoB,EAAE,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC5D,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,kCAAkC,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;YAC7D,MAAM,oBAAoB,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;CACF,CAAA;AAvBY,gBAAgB;IAD5B,UAAU,EAAE;qCAG8B,UAAU;GAFxC,gBAAgB,CAuB5B"}
1
+ {"version":3,"file":"access-token.guard.js","sourceRoot":"","sources":["../../src/guards/access-token.guard.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGvC,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAEE;IADZ,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtF,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAA2B,CAAC;QAC7E,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QAErC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;YAChF,MAAM,oBAAoB,EAAE,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC5D,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,kCAAkC,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6DAA6D,OAAO,EAAE,CAAC,CAAC;YAC1F,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;CACF,CAAA;AAxBY,gBAAgB;IAD5B,UAAU,EAAE;qCAG8B,UAAU;GAFxC,gBAAgB,CAwB5B"}
@@ -1,10 +1,10 @@
1
1
  import type { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
2
  import type { Observable } from 'rxjs';
3
- import { JwtService } from '../services/jwt.service.js';
3
+ import { GrpcMetadataHelper } from '../services/grpc-metadata.helper.js';
4
4
  export declare class GrpcInternalInterceptor implements NestInterceptor {
5
- private readonly jwtService;
5
+ private readonly metadataHelper;
6
6
  private readonly logger;
7
- constructor(jwtService: JwtService);
7
+ constructor(metadataHelper: GrpcMetadataHelper);
8
8
  intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
9
9
  }
10
10
  //# sourceMappingURL=grpc-internal.interceptor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"grpc-internal.interceptor.d.ts","sourceRoot":"","sources":["../../src/interceptors/grpc-internal.interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAErF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAGvC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAIxD,qBACa,uBAAwB,YAAW,eAAe;IAEjD,OAAO,CAAC,QAAQ,CAAC,UAAU;IADvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsE;gBAChE,UAAU,EAAE,UAAU;IAEnD,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;CAiB7E"}
1
+ {"version":3,"file":"grpc-internal.interceptor.d.ts","sourceRoot":"","sources":["../../src/interceptors/grpc-internal.interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAErF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAGvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAKzE,qBACa,uBAAwB,YAAW,eAAe;IAEjD,OAAO,CAAC,QAAQ,CAAC,cAAc;IAD3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsE;gBAChE,cAAc,EAAE,kBAAkB;IAE/D,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;CAmB7E"}
@@ -10,13 +10,14 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  import { Injectable } from '@nestjs/common';
11
11
  import { from } from 'rxjs';
12
12
  import { switchMap } from 'rxjs/operators';
13
- import { JwtService } from '../services/jwt.service.js';
13
+ import { GrpcMetadataHelper } from '../services/grpc-metadata.helper.js';
14
+ import { INTERNAL_TOKEN_METADATA_KEY } from '../constants/index.js';
14
15
  import { Logger } from '@volontariapp/logger';
15
16
  let GrpcInternalInterceptor = class GrpcInternalInterceptor {
16
- jwtService;
17
+ metadataHelper;
17
18
  logger = new Logger({ context: 'GrpcInternalInterceptor', format: 'json' });
18
- constructor(jwtService) {
19
- this.jwtService = jwtService;
19
+ constructor(metadataHelper) {
20
+ this.metadataHelper = metadataHelper;
20
21
  }
21
22
  intercept(context, next) {
22
23
  const httpRequest = context.switchToHttp().getRequest();
@@ -24,17 +25,19 @@ let GrpcInternalInterceptor = class GrpcInternalInterceptor {
24
25
  if (!user) {
25
26
  return next.handle();
26
27
  }
27
- return from(this.jwtService.signInternal(user)).pipe(switchMap((token) => {
28
- this.logger.debug(`Signed internal token for user ${user.id}`);
28
+ return from(this.metadataHelper.createInternalMetadata(user)).pipe(switchMap((metadata) => {
29
+ const token = metadata.get(INTERNAL_TOKEN_METADATA_KEY)[0];
30
+ this.logger.debug(`Transformed Access Token to Internal Token for user ${user.id}`);
29
31
  const req = httpRequest;
30
32
  req['internalToken'] = token;
33
+ req['internalMetadata'] = metadata;
31
34
  return next.handle();
32
35
  }));
33
36
  }
34
37
  };
35
38
  GrpcInternalInterceptor = __decorate([
36
39
  Injectable(),
37
- __metadata("design:paramtypes", [JwtService])
40
+ __metadata("design:paramtypes", [GrpcMetadataHelper])
38
41
  ], GrpcInternalInterceptor);
39
42
  export { GrpcInternalInterceptor };
40
43
  //# sourceMappingURL=grpc-internal.interceptor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"grpc-internal.interceptor.js","sourceRoot":"","sources":["../../src/interceptors/grpc-internal.interceptor.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGvC,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAEL;IADZ,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7F,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD,SAAS,CAAC,OAAyB,EAAE,IAAiB;QACpD,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAuB,CAAC;QAC7E,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;QAE9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAClD,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/D,MAAM,GAAG,GAAG,WAAiD,CAAC;YAC9D,GAAG,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC;YAC7B,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAA;AArBY,uBAAuB;IADnC,UAAU,EAAE;qCAG8B,UAAU;GAFxC,uBAAuB,CAqBnC"}
1
+ {"version":3,"file":"grpc-internal.interceptor.js","sourceRoot":"","sources":["../../src/interceptors/grpc-internal.interceptor.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGvC,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAEL;IADZ,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7F,YAA6B,cAAkC;QAAlC,mBAAc,GAAd,cAAc,CAAoB;IAAG,CAAC;IAEnE,SAAS,CAAC,OAAyB,EAAE,IAAiB;QACpD,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAuB,CAAC;QAC7E,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;QAE9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAChE,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE;YACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAW,CAAC;YACrE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACpF,MAAM,GAAG,GAAG,WAAiD,CAAC;YAC9D,GAAG,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC;YAC7B,GAAG,CAAC,kBAAkB,CAAC,GAAG,QAAQ,CAAC;YACnC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAA;AAvBY,uBAAuB;IADnC,UAAU,EAAE;qCAGkC,kBAAkB;GAFpD,uBAAuB,CAuBnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"access-token.middleware.d.ts","sourceRoot":"","sources":["../../src/middlewares/access-token.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD,qBACa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoE;IAC3F,GAAG,QAAS,OAAO,QAAQ,OAAO,QAAQ,OAAO,KAAG,IAAI,CAuBtD;CACH"}
1
+ {"version":3,"file":"access-token.middleware.d.ts","sourceRoot":"","sources":["../../src/middlewares/access-token.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD,qBACa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoE;IAC3F,GAAG,QAAS,OAAO,QAAQ,OAAO,QAAQ,OAAO,KAAG,IAAI,CAyBtD;CACH"}
@@ -27,6 +27,9 @@ let AccessTokenMiddleware = class AccessTokenMiddleware {
27
27
  request['accessToken'] = token;
28
28
  this.logger.debug('Extracted access token from request');
29
29
  }
30
+ else {
31
+ this.logger.warn('No access token found in headers or cookies');
32
+ }
30
33
  nextFn();
31
34
  };
32
35
  };
@@ -1 +1 @@
1
- {"version":3,"file":"access-token.middleware.js","sourceRoot":"","sources":["../../src/middlewares/access-token.middleware.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGvC,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACf,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3F,GAAG,GAAG,CAAC,GAAY,EAAE,IAAa,EAAE,IAAa,EAAQ,EAAE;QACzD,MAAM,OAAO,GAAG,GAA8B,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAkB,CAAC;QAClC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAA4B,CAAC;QACtE,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;QAC5C,IAAI,KAAyB,CAAC;QAE9B,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;aAAM,IACL,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS;YAChC,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ;YACtC,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,EAC3B,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAuC,CAAC;YACzE,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC9C,OAAO,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,EAAE,CAAC;IACX,CAAC,CAAC;CACH,CAAA;AA1BY,qBAAqB;IADjC,UAAU,EAAE;GACA,qBAAqB,CA0BjC"}
1
+ {"version":3,"file":"access-token.middleware.js","sourceRoot":"","sources":["../../src/middlewares/access-token.middleware.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGvC,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACf,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3F,GAAG,GAAG,CAAC,GAAY,EAAE,IAAa,EAAE,IAAa,EAAQ,EAAE;QACzD,MAAM,OAAO,GAAG,GAA8B,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAkB,CAAC;QAClC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAA4B,CAAC;QACtE,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;QAC5C,IAAI,KAAyB,CAAC;QAE9B,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;aAAM,IACL,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS;YAChC,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ;YACtC,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,EAC3B,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAuC,CAAC;YACzE,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC9C,OAAO,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,EAAE,CAAC;IACX,CAAC,CAAC;CACH,CAAA;AA5BY,qBAAqB;IADjC,UAAU,EAAE;GACA,qBAAqB,CA4BjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"refresh-token.middleware.d.ts","sourceRoot":"","sources":["../../src/middlewares/refresh-token.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD,qBACa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqE;IAC5F,GAAG,QAAS,OAAO,QAAQ,OAAO,QAAQ,OAAO,KAAG,IAAI,CAmBtD;CACH"}
1
+ {"version":3,"file":"refresh-token.middleware.d.ts","sourceRoot":"","sources":["../../src/middlewares/refresh-token.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD,qBACa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqE;IAC5F,GAAG,QAAS,OAAO,QAAQ,OAAO,QAAQ,OAAO,KAAG,IAAI,CAyBtD;CACH"}
@@ -11,8 +11,13 @@ let RefreshTokenMiddleware = class RefreshTokenMiddleware {
11
11
  use = (req, _res, next) => {
12
12
  const request = req;
13
13
  const nextFn = next;
14
+ const headers = (request['headers'] ?? {});
15
+ const authHeader = headers['authorization'];
14
16
  let token;
15
- if (request['cookies'] !== undefined &&
17
+ if (typeof authHeader === 'string' && authHeader.startsWith('Bearer ')) {
18
+ token = authHeader.split(' ')[1];
19
+ }
20
+ else if (request['cookies'] !== undefined &&
16
21
  typeof request['cookies'] === 'object' &&
17
22
  request['cookies'] !== null) {
18
23
  const cookies = request['cookies'];
@@ -22,6 +27,9 @@ let RefreshTokenMiddleware = class RefreshTokenMiddleware {
22
27
  request['refreshToken'] = token;
23
28
  this.logger.debug('Extracted refresh token from request');
24
29
  }
30
+ else {
31
+ this.logger.warn('No refresh token found in headers or cookies');
32
+ }
25
33
  nextFn();
26
34
  };
27
35
  };
@@ -1 +1 @@
1
- {"version":3,"file":"refresh-token.middleware.js","sourceRoot":"","sources":["../../src/middlewares/refresh-token.middleware.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGvC,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAChB,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5F,GAAG,GAAG,CAAC,GAAY,EAAE,IAAa,EAAE,IAAa,EAAQ,EAAE;QACzD,MAAM,OAAO,GAAG,GAA8B,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAkB,CAAC;QAClC,IAAI,KAAyB,CAAC;QAE9B,IACE,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS;YAChC,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ;YACtC,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,EAC3B,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAuC,CAAC;YACzE,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC9C,OAAO,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,EAAE,CAAC;IACX,CAAC,CAAC;CACH,CAAA;AAtBY,sBAAsB;IADlC,UAAU,EAAE;GACA,sBAAsB,CAsBlC"}
1
+ {"version":3,"file":"refresh-token.middleware.js","sourceRoot":"","sources":["../../src/middlewares/refresh-token.middleware.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGvC,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAChB,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5F,GAAG,GAAG,CAAC,GAAY,EAAE,IAAa,EAAE,IAAa,EAAQ,EAAE;QACzD,MAAM,OAAO,GAAG,GAA8B,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAkB,CAAC;QAClC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAA4B,CAAC;QACtE,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;QAC5C,IAAI,KAAyB,CAAC;QAE9B,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACvE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;aAAM,IACL,OAAO,CAAC,SAAS,CAAC,KAAK,SAAS;YAChC,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ;YACtC,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,EAC3B,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAuC,CAAC;YACzE,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC9C,OAAO,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,EAAE,CAAC;IACX,CAAC,CAAC;CACH,CAAA;AA5BY,sBAAsB;IADlC,UAAU,EAAE;GACA,sBAAsB,CA4BlC"}
@@ -4,7 +4,7 @@ import { Logger } from '@volontariapp/logger';
4
4
  import * as jose from 'jose';
5
5
  import { Test } from '@nestjs/testing';
6
6
  import request from 'supertest';
7
- import { JwtService, AccessTokenMiddleware, AccessTokenGuard, RolesGuard, GrpcInternalInterceptor, GrpcInternalGuard, INTERNAL_TOKEN_METADATA_KEY, } from '../../index.js';
7
+ import { JwtService, AccessTokenMiddleware, AccessTokenGuard, RolesGuard, GrpcInternalInterceptor, GrpcInternalGuard, GrpcMetadataHelper, INTERNAL_TOKEN_METADATA_KEY, } from '../../index.js';
8
8
  import { createAuthUser } from '../factories/auth-user.factory.js';
9
9
  import { createMock } from '@golevelup/ts-jest';
10
10
  import { AuthTestController } from '../example/auth-test.controller.js';
@@ -70,6 +70,7 @@ describe('Full Auth Flow (Integration)', () => {
70
70
  AccessTokenGuard,
71
71
  RolesGuard,
72
72
  GrpcInternalGuard,
73
+ GrpcMetadataHelper,
73
74
  GrpcInternalInterceptor,
74
75
  ],
75
76
  }).compile();
@@ -79,32 +80,52 @@ describe('Full Auth Flow (Integration)', () => {
79
80
  jwtService = app.get(JwtService);
80
81
  });
81
82
  afterEach(async () => {
82
- await app.close();
83
+ try {
84
+ await app.close();
85
+ }
86
+ catch {
87
+ }
83
88
  });
84
89
  it('should complete the full auth lifecycle (HTTP AT -> Internal Token -> gRPC Verification)', async () => {
85
- const user = createAuthUser();
90
+ const user = createAuthUser({ id: 'gateway-to-ms-user' });
86
91
  const accessToken = await jwtService.signAccessToken(user);
92
+ const atGuard = app.get(AccessTokenGuard);
93
+ const atGuardSpy = jest.spyOn(atGuard, 'canActivate');
94
+ const interceptor = app.get(GrpcInternalInterceptor);
95
+ const interceptorSpy = jest.spyOn(interceptor, 'intercept');
96
+ const metadataHelper = app.get(GrpcMetadataHelper);
97
+ const metadataHelperSpy = jest.spyOn(metadataHelper, 'createInternalMetadata');
98
+ const msGuard = app.get(GrpcInternalGuard);
99
+ const msGuardSpy = jest.spyOn(msGuard, 'canActivate');
87
100
  const httpResponse = await request(app.getHttpServer())
88
101
  .get('/test/external')
89
102
  .set('Authorization', `Bearer ${accessToken}`);
90
103
  expect(httpResponse.status).toBe(200);
104
+ expect(atGuardSpy).toHaveBeenCalled();
105
+ expect(interceptorSpy).toHaveBeenCalled();
106
+ expect(metadataHelperSpy).toHaveBeenCalled();
91
107
  const body = httpResponse.body;
92
- expect(body.user.id).toBe(user.id);
93
108
  const internalToken = body.internalToken;
94
- expect(typeof internalToken).toBe('string');
95
- const metadataMock = createMock({
109
+ expect(internalToken).toBeDefined();
110
+ const incomingMetadata = createMock({
96
111
  get: jest.fn((key) => (key === INTERNAL_TOKEN_METADATA_KEY ? [internalToken] : [])),
97
112
  });
98
- const executionContext = createMock({
113
+ const rpcContext = createMock({
99
114
  getType: () => 'rpc',
100
115
  switchToRpc: () => ({
101
- getContext: () => metadataMock,
116
+ getContext: () => incomingMetadata,
102
117
  getData: () => ({}),
103
118
  }),
119
+ switchToHttp: () => ({
120
+ getRequest: () => ({}),
121
+ }),
104
122
  });
105
- const guard = app.get(GrpcInternalGuard);
106
- const canActivate = await guard.canActivate(executionContext);
123
+ const canActivate = await msGuard.canActivate(rpcContext);
107
124
  expect(canActivate).toBe(true);
125
+ expect(msGuardSpy).toHaveBeenCalledWith(rpcContext);
126
+ const injectedUser = incomingMetadata.user;
127
+ expect(injectedUser).toBeDefined();
128
+ expect(injectedUser.id).toBe(user.id);
108
129
  });
109
130
  it('should deny access if AT is missing', async () => {
110
131
  const response = await request(app.getHttpServer()).get('/test/external');
@@ -1 +1 @@
1
- {"version":3,"file":"full-auth-flow.int.spec.js","sourceRoot":"","sources":["../../../src/test/integration/full-auth-flow.int.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"full-auth-flow.int.spec.js","sourceRoot":"","sources":["../../../src/test/integration/full-auth-flow.int.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=access-token.guard.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-token.guard.unit.spec.d.ts","sourceRoot":"","sources":["../../../src/test/unit/access-token.guard.unit.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import { describe, it, expect, beforeEach, jest } from '@jest/globals';
2
+ import { AccessTokenGuard } from '../../guards/access-token.guard.js';
3
+ import { createMock } from '@golevelup/ts-jest';
4
+ import { Logger } from '@volontariapp/logger';
5
+ import { createAuthUser } from '../factories/auth-user.factory.js';
6
+ describe('AccessTokenGuard (Unit)', () => {
7
+ let guard;
8
+ let jwtService;
9
+ beforeEach(() => {
10
+ jest.restoreAllMocks();
11
+ jwtService = createMock();
12
+ guard = new AccessTokenGuard(jwtService);
13
+ jest.spyOn(Logger.prototype, 'debug').mockImplementation(() => { });
14
+ jest.spyOn(Logger.prototype, 'warn').mockImplementation(() => { });
15
+ jest.spyOn(Logger.prototype, 'error').mockImplementation(() => { });
16
+ });
17
+ it('should allow access and set user if token is valid', async () => {
18
+ const user = createAuthUser();
19
+ const token = 'valid-token';
20
+ const request = { accessToken: token };
21
+ const context = createMock();
22
+ const spyVerifyAccessToken = jest.spyOn(jwtService, 'verifyAccessToken');
23
+ jest.spyOn(context.switchToHttp(), 'getRequest').mockReturnValue(request);
24
+ spyVerifyAccessToken.mockResolvedValue(user);
25
+ const result = await guard.canActivate(context);
26
+ expect(result).toBe(true);
27
+ expect(request).toHaveProperty('user', user);
28
+ expect(spyVerifyAccessToken).toHaveBeenCalledWith(token);
29
+ });
30
+ it('should throw MISSING_ACCESS_TOKEN if token is missing', async () => {
31
+ const request = {};
32
+ const context = createMock();
33
+ jest.spyOn(context.switchToHttp(), 'getRequest').mockReturnValue(request);
34
+ await expect(guard.canActivate(context)).rejects.toThrow();
35
+ });
36
+ it('should throw INVALID_ACCESS_TOKEN if token verification fails', async () => {
37
+ const token = 'invalid-token';
38
+ const request = { accessToken: token };
39
+ const context = createMock();
40
+ jest.spyOn(context.switchToHttp(), 'getRequest').mockReturnValue(request);
41
+ jest.spyOn(jwtService, 'verifyAccessToken').mockRejectedValue(new Error('Invalid signature'));
42
+ await expect(guard.canActivate(context)).rejects.toThrow();
43
+ });
44
+ });
45
+ //# sourceMappingURL=access-token.guard.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-token.guard.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/access-token.guard.unit.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=access-token.middleware.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-token.middleware.unit.spec.d.ts","sourceRoot":"","sources":["../../../src/test/unit/access-token.middleware.unit.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import { describe, it, expect, beforeEach, jest } from '@jest/globals';
2
+ import { AccessTokenMiddleware } from '../../middlewares/access-token.middleware.js';
3
+ import { Logger } from '@volontariapp/logger';
4
+ describe('AccessTokenMiddleware (Unit)', () => {
5
+ let middleware;
6
+ beforeEach(() => {
7
+ jest.restoreAllMocks();
8
+ middleware = new AccessTokenMiddleware();
9
+ jest.spyOn(Logger.prototype, 'debug').mockImplementation(() => { });
10
+ jest.spyOn(Logger.prototype, 'warn').mockImplementation(() => { });
11
+ });
12
+ it('should extract token from Authorization header', () => {
13
+ const req = {
14
+ headers: {
15
+ authorization: 'Bearer my-token',
16
+ },
17
+ };
18
+ const next = jest.fn();
19
+ middleware.use(req, {}, next);
20
+ expect(req).toHaveProperty('accessToken', 'my-token');
21
+ expect(next).toHaveBeenCalled();
22
+ });
23
+ it('should extract token from cookies (accessToken)', () => {
24
+ const req = {
25
+ headers: {},
26
+ cookies: {
27
+ accessToken: 'cookie-token',
28
+ },
29
+ };
30
+ const next = jest.fn();
31
+ middleware.use(req, {}, next);
32
+ expect(req).toHaveProperty('accessToken', 'cookie-token');
33
+ expect(next).toHaveBeenCalled();
34
+ });
35
+ it('should extract token from cookies (access_token)', () => {
36
+ const req = {
37
+ headers: {},
38
+ cookies: {
39
+ access_token: 'cookie-token-2',
40
+ },
41
+ };
42
+ const next = jest.fn();
43
+ middleware.use(req, {}, next);
44
+ expect(req).toHaveProperty('accessToken', 'cookie-token-2');
45
+ expect(next).toHaveBeenCalled();
46
+ });
47
+ it('should log warning and call next if no token is found', () => {
48
+ const req = {
49
+ headers: {},
50
+ };
51
+ const next = jest.fn();
52
+ const warnSpy = jest.spyOn(Logger.prototype, 'warn');
53
+ middleware.use(req, {}, next);
54
+ expect(req).not.toHaveProperty('accessToken');
55
+ expect(next).toHaveBeenCalled();
56
+ expect(warnSpy).toHaveBeenCalledWith('No access token found in headers or cookies');
57
+ });
58
+ it('should handle missing headers or cookies gracefully', () => {
59
+ const req = {};
60
+ const next = jest.fn();
61
+ middleware.use(req, {}, next);
62
+ expect(next).toHaveBeenCalled();
63
+ });
64
+ });
65
+ //# sourceMappingURL=access-token.middleware.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-token.middleware.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/access-token.middleware.unit.spec.ts"],"names":[],"mappings":"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"}
@@ -3,13 +3,15 @@ import { GrpcInternalInterceptor } from '../../interceptors/grpc-internal.interc
3
3
  import { createAuthUser } from '../factories/auth-user.factory.js';
4
4
  import { createMock } from '@golevelup/ts-jest';
5
5
  import { firstValueFrom, of } from 'rxjs';
6
+ import { Metadata } from '@grpc/grpc-js';
7
+ import { INTERNAL_TOKEN_METADATA_KEY } from '../../constants/index.js';
6
8
  describe('GrpcInternalInterceptor (Unit)', () => {
7
9
  let interceptor;
8
- let jwtService;
10
+ let metadataHelper;
9
11
  beforeEach(() => {
10
12
  jest.restoreAllMocks();
11
- jwtService = createMock();
12
- interceptor = new GrpcInternalInterceptor(jwtService);
13
+ metadataHelper = createMock();
14
+ interceptor = new GrpcInternalInterceptor(metadataHelper);
13
15
  jest.spyOn(interceptor['logger'], 'debug').mockImplementation(() => undefined);
14
16
  });
15
17
  it('should call next.handle() if user is not in request', async () => {
@@ -18,10 +20,10 @@ describe('GrpcInternalInterceptor (Unit)', () => {
18
20
  jest.spyOn(httpHost, 'getRequest').mockReturnValue({});
19
21
  const next = createMock();
20
22
  next.handle.mockReturnValue(of({ success: true }));
21
- const signSpy = jest.spyOn(jwtService, 'signInternal');
23
+ const createSpy = jest.spyOn(metadataHelper, 'createInternalMetadata');
22
24
  const result = await firstValueFrom(interceptor.intercept(context, next));
23
25
  expect(result).toEqual({ success: true });
24
- expect(signSpy).not.toHaveBeenCalled();
26
+ expect(createSpy).not.toHaveBeenCalled();
25
27
  });
26
28
  it('should sign internal token if user is present', async () => {
27
29
  const user = createAuthUser();
@@ -31,11 +33,16 @@ describe('GrpcInternalInterceptor (Unit)', () => {
31
33
  jest.spyOn(httpHost, 'getRequest').mockReturnValue(httpRequest);
32
34
  const next = createMock();
33
35
  next.handle.mockReturnValue(of({ success: true }));
34
- const signSpy = jest.spyOn(jwtService, 'signInternal').mockResolvedValue('signed-token');
36
+ const mockMetadata = new Metadata();
37
+ mockMetadata.set(INTERNAL_TOKEN_METADATA_KEY, 'signed-token');
38
+ const createSpy = jest
39
+ .spyOn(metadataHelper, 'createInternalMetadata')
40
+ .mockResolvedValue(mockMetadata);
35
41
  const result = await firstValueFrom(interceptor.intercept(context, next));
36
42
  expect(result).toEqual({ success: true });
37
- expect(signSpy).toHaveBeenCalledWith(user);
43
+ expect(createSpy).toHaveBeenCalledWith(user);
38
44
  expect(httpRequest).toHaveProperty('internalToken', 'signed-token');
45
+ expect(httpRequest).toHaveProperty('internalMetadata', mockMetadata);
39
46
  });
40
47
  });
41
48
  //# sourceMappingURL=grpc-internal.interceptor.unit.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"grpc-internal.interceptor.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/grpc-internal.interceptor.unit.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grpc-internal.interceptor.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/grpc-internal.interceptor.unit.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=grpc-metadata.helper.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grpc-metadata.helper.unit.spec.d.ts","sourceRoot":"","sources":["../../../src/test/unit/grpc-metadata.helper.unit.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { describe, it, expect, beforeEach, jest } from '@jest/globals';
2
+ import { GrpcMetadataHelper } from '../../services/grpc-metadata.helper.js';
3
+ import { createMock } from '@golevelup/ts-jest';
4
+ import { createAuthUser } from '../factories/auth-user.factory.js';
5
+ import { INTERNAL_TOKEN_METADATA_KEY } from '../../constants/index.js';
6
+ import { Logger } from '@volontariapp/logger';
7
+ describe('GrpcMetadataHelper (Unit)', () => {
8
+ let helper;
9
+ let jwtService;
10
+ beforeEach(() => {
11
+ jest.restoreAllMocks();
12
+ jwtService = createMock();
13
+ helper = new GrpcMetadataHelper(jwtService);
14
+ jest.spyOn(Logger.prototype, 'debug').mockImplementation(() => { });
15
+ });
16
+ it('should create metadata with internal token', async () => {
17
+ const user = createAuthUser();
18
+ const token = 'internal-token-xyz';
19
+ const signSpy = jest.spyOn(jwtService, 'signInternal').mockResolvedValue(token);
20
+ const metadata = await helper.createInternalMetadata(user);
21
+ expect(metadata.get(INTERNAL_TOKEN_METADATA_KEY)).toEqual([token]);
22
+ expect(signSpy).toHaveBeenCalledWith(user);
23
+ });
24
+ });
25
+ //# sourceMappingURL=grpc-metadata.helper.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grpc-metadata.helper.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/grpc-metadata.helper.unit.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,MAA0B,CAAC;IAC/B,IAAI,UAAsB,CAAC;IAE3B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,UAAU,GAAG,UAAU,EAAc,CAAC;QACtC,MAAM,GAAG,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,oBAAoB,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEhF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAE3D,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=refresh-token.guard.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-token.guard.unit.spec.d.ts","sourceRoot":"","sources":["../../../src/test/unit/refresh-token.guard.unit.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import { describe, it, expect, beforeEach, jest } from '@jest/globals';
2
+ import { RefreshTokenGuard } from '../../guards/refresh-token.guard.js';
3
+ import { createMock } from '@golevelup/ts-jest';
4
+ import { Logger } from '@volontariapp/logger';
5
+ import { createAuthUser } from '../factories/auth-user.factory.js';
6
+ describe('RefreshTokenGuard (Unit)', () => {
7
+ let guard;
8
+ let jwtService;
9
+ beforeEach(() => {
10
+ jest.restoreAllMocks();
11
+ jwtService = createMock();
12
+ guard = new RefreshTokenGuard(jwtService);
13
+ jest.spyOn(Logger.prototype, 'debug').mockImplementation(() => { });
14
+ jest.spyOn(Logger.prototype, 'warn').mockImplementation(() => { });
15
+ jest.spyOn(Logger.prototype, 'error').mockImplementation(() => { });
16
+ });
17
+ it('should allow access if refresh token is valid', async () => {
18
+ const user = createAuthUser();
19
+ const token = 'valid-refresh';
20
+ const request = { refreshToken: token };
21
+ const context = createMock();
22
+ jest.spyOn(context.switchToHttp(), 'getRequest').mockReturnValue(request);
23
+ jest.spyOn(jwtService, 'verifyRefreshToken').mockResolvedValue(user);
24
+ const result = await guard.canActivate(context);
25
+ expect(result).toBe(true);
26
+ expect(request).toHaveProperty('user', user);
27
+ });
28
+ it('should throw MISSING_REFRESH_TOKEN if token is missing', async () => {
29
+ const request = {};
30
+ const context = createMock();
31
+ jest.spyOn(context.switchToHttp(), 'getRequest').mockReturnValue(request);
32
+ await expect(guard.canActivate(context)).rejects.toThrow();
33
+ });
34
+ it('should throw INVALID_REFRESH_TOKEN if token verification fails', async () => {
35
+ const token = 'invalid-refresh';
36
+ const request = { refreshToken: token };
37
+ const context = createMock();
38
+ jest.spyOn(context.switchToHttp(), 'getRequest').mockReturnValue(request);
39
+ jest.spyOn(jwtService, 'verifyRefreshToken').mockRejectedValue(new Error('Expired'));
40
+ await expect(guard.canActivate(context)).rejects.toThrow();
41
+ });
42
+ });
43
+ //# sourceMappingURL=refresh-token.guard.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-token.guard.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/refresh-token.guard.unit.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,KAAwB,CAAC;IAC7B,IAAI,UAAsB,CAAC;IAE3B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,UAAU,GAAG,UAAU,EAAc,CAAC;QACtC,KAAK,GAAG,IAAI,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,eAAe,CAAC;QAC9B,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,UAAU,EAAoB,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE1E,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAErE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEhD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,UAAU,EAAoB,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE1E,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,KAAK,GAAG,iBAAiB,CAAC;QAChC,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,UAAU,EAAoB,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE1E,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAErF,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=refresh-token.middleware.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-token.middleware.unit.spec.d.ts","sourceRoot":"","sources":["../../../src/test/unit/refresh-token.middleware.unit.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { describe, it, expect, beforeEach, jest } from '@jest/globals';
2
+ import { RefreshTokenMiddleware } from '../../middlewares/refresh-token.middleware.js';
3
+ import { Logger } from '@volontariapp/logger';
4
+ describe('RefreshTokenMiddleware (Unit)', () => {
5
+ let middleware;
6
+ beforeEach(() => {
7
+ jest.restoreAllMocks();
8
+ middleware = new RefreshTokenMiddleware();
9
+ jest.spyOn(Logger.prototype, 'debug').mockImplementation(() => { });
10
+ jest.spyOn(Logger.prototype, 'warn').mockImplementation(() => { });
11
+ });
12
+ it('should extract token from Authorization header', () => {
13
+ const req = {
14
+ headers: {
15
+ authorization: 'Bearer refresh-token-123',
16
+ },
17
+ };
18
+ const next = jest.fn();
19
+ middleware.use(req, {}, next);
20
+ expect(req).toHaveProperty('refreshToken', 'refresh-token-123');
21
+ expect(next).toHaveBeenCalled();
22
+ });
23
+ it('should extract token from cookies', () => {
24
+ const req = {
25
+ headers: {},
26
+ cookies: {
27
+ refreshToken: 'cookie-refresh-token',
28
+ },
29
+ };
30
+ const next = jest.fn();
31
+ middleware.use(req, {}, next);
32
+ expect(req).toHaveProperty('refreshToken', 'cookie-refresh-token');
33
+ expect(next).toHaveBeenCalled();
34
+ });
35
+ it('should log warning if no refresh token is found', () => {
36
+ const req = { headers: {} };
37
+ const next = jest.fn();
38
+ const warnSpy = jest.spyOn(Logger.prototype, 'warn');
39
+ middleware.use(req, {}, next);
40
+ expect(req).not.toHaveProperty('refreshToken');
41
+ expect(warnSpy).toHaveBeenCalledWith('No refresh token found in headers or cookies');
42
+ });
43
+ });
44
+ //# sourceMappingURL=refresh-token.middleware.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-token.middleware.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/refresh-token.middleware.unit.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAI,UAAkC,CAAC;IAEvC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,UAAU,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,GAAG,GAAG;YACV,OAAO,EAAE;gBACP,aAAa,EAAE,0BAA0B;aAC1C;SACF,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAEvB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAE9B,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG;YACV,OAAO,EAAE,EAAE;YACX,OAAO,EAAE;gBACP,YAAY,EAAE,sBAAsB;aACrC;SACF,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAEvB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAE9B,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAErD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAE9B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,8CAA8C,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volontariapp/auth",
3
- "version": "2.1.16-snap-a528481",
3
+ "version": "3.0.0-snap-4c4f273",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": true