@generazioneai/authz 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/codegen/authz-check.d.ts +3 -0
  2. package/dist/codegen/authz-check.d.ts.map +1 -0
  3. package/dist/codegen/authz-check.js +76 -0
  4. package/dist/codegen/authz-check.js.map +1 -0
  5. package/dist/codegen/check-rules.d.ts +73 -0
  6. package/dist/codegen/check-rules.d.ts.map +1 -0
  7. package/dist/codegen/check-rules.js +387 -0
  8. package/dist/codegen/check-rules.js.map +1 -0
  9. package/dist/codegen/effective-actions.d.ts +13 -0
  10. package/dist/codegen/effective-actions.d.ts.map +1 -0
  11. package/dist/codegen/effective-actions.js +44 -0
  12. package/dist/codegen/effective-actions.js.map +1 -0
  13. package/dist/codegen/generate-types.d.ts +8 -0
  14. package/dist/codegen/generate-types.d.ts.map +1 -0
  15. package/dist/codegen/generate-types.js +121 -0
  16. package/dist/codegen/generate-types.js.map +1 -0
  17. package/dist/codegen/index.d.ts +3 -0
  18. package/dist/codegen/index.d.ts.map +1 -0
  19. package/dist/codegen/index.js +74 -0
  20. package/dist/codegen/index.js.map +1 -0
  21. package/dist/codegen/manifest-io.d.ts +19 -0
  22. package/dist/codegen/manifest-io.d.ts.map +1 -0
  23. package/dist/codegen/manifest-io.js +59 -0
  24. package/dist/codegen/manifest-io.js.map +1 -0
  25. package/dist/context/als.d.ts +14 -0
  26. package/dist/context/als.d.ts.map +1 -0
  27. package/dist/context/als.js +30 -0
  28. package/dist/context/als.js.map +1 -0
  29. package/dist/context/authz-context.d.ts +54 -0
  30. package/dist/context/authz-context.d.ts.map +1 -0
  31. package/dist/context/authz-context.js +24 -0
  32. package/dist/context/authz-context.js.map +1 -0
  33. package/dist/define-resource.d.ts +150 -0
  34. package/dist/define-resource.d.ts.map +1 -0
  35. package/dist/define-resource.js +26 -0
  36. package/dist/define-resource.js.map +1 -0
  37. package/dist/index.d.ts +7 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +23 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/nats/canonical-hash.d.ts +5 -0
  42. package/dist/nats/canonical-hash.d.ts.map +1 -0
  43. package/dist/nats/canonical-hash.js +24 -0
  44. package/dist/nats/canonical-hash.js.map +1 -0
  45. package/dist/nats/index.d.ts +7 -0
  46. package/dist/nats/index.d.ts.map +1 -0
  47. package/dist/nats/index.js +27 -0
  48. package/dist/nats/index.js.map +1 -0
  49. package/dist/nats/internal-token.d.ts +56 -0
  50. package/dist/nats/internal-token.d.ts.map +1 -0
  51. package/dist/nats/internal-token.js +93 -0
  52. package/dist/nats/internal-token.js.map +1 -0
  53. package/dist/nats/internal-token.signer.d.ts +21 -0
  54. package/dist/nats/internal-token.signer.d.ts.map +1 -0
  55. package/dist/nats/internal-token.signer.js +48 -0
  56. package/dist/nats/internal-token.signer.js.map +1 -0
  57. package/dist/nats/jwks-client.d.ts +10 -0
  58. package/dist/nats/jwks-client.d.ts.map +1 -0
  59. package/dist/nats/jwks-client.js +14 -0
  60. package/dist/nats/jwks-client.js.map +1 -0
  61. package/dist/nats/key-loader.d.ts +24 -0
  62. package/dist/nats/key-loader.d.ts.map +1 -0
  63. package/dist/nats/key-loader.js +65 -0
  64. package/dist/nats/key-loader.js.map +1 -0
  65. package/dist/nats/replay-cache.d.ts +14 -0
  66. package/dist/nats/replay-cache.d.ts.map +1 -0
  67. package/dist/nats/replay-cache.js +23 -0
  68. package/dist/nats/replay-cache.js.map +1 -0
  69. package/dist/nest/authz-context.interceptor.d.ts +6 -0
  70. package/dist/nest/authz-context.interceptor.d.ts.map +1 -0
  71. package/dist/nest/authz-context.interceptor.js +47 -0
  72. package/dist/nest/authz-context.interceptor.js.map +1 -0
  73. package/dist/nest/authz-context.middleware.d.ts +15 -0
  74. package/dist/nest/authz-context.middleware.d.ts.map +1 -0
  75. package/dist/nest/authz-context.middleware.js +40 -0
  76. package/dist/nest/authz-context.middleware.js.map +1 -0
  77. package/dist/nest/index.d.ts +6 -0
  78. package/dist/nest/index.d.ts.map +1 -0
  79. package/dist/nest/index.js +25 -0
  80. package/dist/nest/index.js.map +1 -0
  81. package/dist/nest/internal-auth.interceptor.d.ts +29 -0
  82. package/dist/nest/internal-auth.interceptor.d.ts.map +1 -0
  83. package/dist/nest/internal-auth.interceptor.js +140 -0
  84. package/dist/nest/internal-auth.interceptor.js.map +1 -0
  85. package/dist/nest/nats-scoped-client.proxy.d.ts +23 -0
  86. package/dist/nest/nats-scoped-client.proxy.d.ts.map +1 -0
  87. package/dist/nest/nats-scoped-client.proxy.js +50 -0
  88. package/dist/nest/nats-scoped-client.proxy.js.map +1 -0
  89. package/dist/nest/skip-internal-auth.decorator.d.ts +4 -0
  90. package/dist/nest/skip-internal-auth.decorator.d.ts.map +1 -0
  91. package/dist/nest/skip-internal-auth.decorator.js +13 -0
  92. package/dist/nest/skip-internal-auth.decorator.js.map +1 -0
  93. package/dist/resource-registry.d.ts +31 -0
  94. package/dist/resource-registry.d.ts.map +1 -0
  95. package/dist/resource-registry.js +64 -0
  96. package/dist/resource-registry.js.map +1 -0
  97. package/dist/resource-registry.module.d.ts +25 -0
  98. package/dist/resource-registry.module.d.ts.map +1 -0
  99. package/dist/resource-registry.module.js +67 -0
  100. package/dist/resource-registry.module.js.map +1 -0
  101. package/dist/scope-substitute.d.ts +20 -0
  102. package/dist/scope-substitute.d.ts.map +1 -0
  103. package/dist/scope-substitute.js +58 -0
  104. package/dist/scope-substitute.js.map +1 -0
  105. package/package.json +94 -0
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AuthzContextInterceptor = void 0;
10
+ // Step 2 DEC-S2.17 (corrected) — gateway-side ALS populator.
11
+ //
12
+ // NestJS middleware runs BEFORE guards, so it can't see req.userId (set by JwtAuthGuard).
13
+ // An interceptor runs AFTER guards, so it can read the authenticated request and run the
14
+ // handler — including any downstream NATS .send() made by the NatsScopedClientProxy signer —
15
+ // inside authzAls.run(). Register globally at the gateway (only needed when signing is on).
16
+ const common_1 = require("@nestjs/common");
17
+ const rxjs_1 = require("rxjs");
18
+ const als_1 = require("../context/als");
19
+ let AuthzContextInterceptor = class AuthzContextInterceptor {
20
+ intercept(context, next) {
21
+ if (context.getType() !== 'http')
22
+ return next.handle();
23
+ const req = context.switchToHttp().getRequest();
24
+ if (!req?.userId)
25
+ return next.handle(); // public/unauthenticated route → no context
26
+ const ctx = {
27
+ userId: req.userId,
28
+ individualId: req.individualId,
29
+ juridicalIndividualId: req.juridicalIndividualId,
30
+ tenantId: req.tenantId ?? req.actingJuridicalId,
31
+ snapId: req.snapId,
32
+ permHash: req.permHash,
33
+ connected: { studentsOfTeacher: [], reportsOfManager: [], pendingApprovalResourceIds: {} },
34
+ accreditedAs: {
35
+ provider: { accreditationIds: [], customerJuridicalIds: [] },
36
+ customer: { accreditationIds: [], providerJuridicalIds: [] },
37
+ },
38
+ ability: null,
39
+ };
40
+ return new rxjs_1.Observable((subscriber) => als_1.authzAls.run(ctx, () => next.handle().subscribe(subscriber)));
41
+ }
42
+ };
43
+ exports.AuthzContextInterceptor = AuthzContextInterceptor;
44
+ exports.AuthzContextInterceptor = AuthzContextInterceptor = __decorate([
45
+ (0, common_1.Injectable)()
46
+ ], AuthzContextInterceptor);
47
+ //# sourceMappingURL=authz-context.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authz-context.interceptor.js","sourceRoot":"","sources":["../../src/nest/authz-context.interceptor.ts"],"names":[],"mappings":";;;;;;;;;AAAA,6DAA6D;AAC7D,EAAE;AACF,0FAA0F;AAC1F,yFAAyF;AACzF,6FAA6F;AAC7F,4FAA4F;AAC5F,2CAKwB;AACxB,+BAAkC;AAClC,wCAA0C;AAKnC,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAClC,SAAS,CAAC,OAAyB,EAAE,IAAiB;QACpD,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QAEvD,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAsB,CAAC;QACpE,IAAI,CAAC,GAAG,EAAE,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,4CAA4C;QAEpF,MAAM,GAAG,GAAiB;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;YAChD,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,iBAAiB;YAC/C,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,SAAS,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,0BAA0B,EAAE,EAAE,EAAE;YAC1F,YAAY,EAAE;gBACZ,QAAQ,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE;gBAC5D,QAAQ,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE;aAC7D;YACD,OAAO,EAAE,IAA0C;SACpD,CAAC;QAEF,OAAO,IAAI,iBAAU,CAAC,CAAC,UAAU,EAAE,EAAE,CACnC,cAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAC7D,CAAC;IACJ,CAAC;CACF,CAAA;AA1BY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;GACA,uBAAuB,CA0BnC"}
@@ -0,0 +1,15 @@
1
+ import { type NestMiddleware } from '@nestjs/common';
2
+ /** Shape of the request fields the upstream auth guards populate. */
3
+ export interface AuthzRequestFields {
4
+ userId?: string;
5
+ individualId?: string;
6
+ juridicalIndividualId?: string;
7
+ tenantId?: string;
8
+ actingJuridicalId?: string;
9
+ snapId?: string;
10
+ permHash?: string;
11
+ }
12
+ export declare class AuthzContextMiddleware implements NestMiddleware {
13
+ use(req: AuthzRequestFields, _res: unknown, next: () => void): void;
14
+ }
15
+ //# sourceMappingURL=authz-context.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authz-context.middleware.d.ts","sourceRoot":"","sources":["../../src/nest/authz-context.middleware.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIjE,qEAAqE;AACrE,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBACa,sBAAuB,YAAW,cAAc;IAC3D,GAAG,CAAC,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,IAAI;CAiBpE"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AuthzContextMiddleware = void 0;
10
+ // Step 2 DEC-S2.17 — gateway middleware that seeds the authz ALS from the HTTP request.
11
+ //
12
+ // Runs after the auth guards (which set req.userId / req.actingJuridicalId / etc.), so the
13
+ // NatsScopedClientProxy signer (and Step 3 ScopedRepository) can read the context via ALS
14
+ // for any downstream NATS call made during the request — including outside the controller.
15
+ const common_1 = require("@nestjs/common");
16
+ const als_1 = require("../context/als");
17
+ let AuthzContextMiddleware = class AuthzContextMiddleware {
18
+ use(req, _res, next) {
19
+ const ctx = {
20
+ userId: req.userId,
21
+ individualId: req.individualId,
22
+ juridicalIndividualId: req.juridicalIndividualId,
23
+ tenantId: req.tenantId ?? req.actingJuridicalId,
24
+ snapId: req.snapId,
25
+ permHash: req.permHash,
26
+ connected: { studentsOfTeacher: [], reportsOfManager: [], pendingApprovalResourceIds: {} },
27
+ accreditedAs: {
28
+ provider: { accreditationIds: [], customerJuridicalIds: [] },
29
+ customer: { accreditationIds: [], providerJuridicalIds: [] },
30
+ },
31
+ ability: null,
32
+ };
33
+ als_1.authzAls.run(ctx, () => next());
34
+ }
35
+ };
36
+ exports.AuthzContextMiddleware = AuthzContextMiddleware;
37
+ exports.AuthzContextMiddleware = AuthzContextMiddleware = __decorate([
38
+ (0, common_1.Injectable)()
39
+ ], AuthzContextMiddleware);
40
+ //# sourceMappingURL=authz-context.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authz-context.middleware.js","sourceRoot":"","sources":["../../src/nest/authz-context.middleware.ts"],"names":[],"mappings":";;;;;;;;;AAAA,wFAAwF;AACxF,EAAE;AACF,2FAA2F;AAC3F,0FAA0F;AAC1F,2FAA2F;AAC3F,2CAAiE;AACjE,wCAA0C;AAenC,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,GAAG,CAAC,GAAuB,EAAE,IAAa,EAAE,IAAgB;QAC1D,MAAM,GAAG,GAAiB;YACxB,MAAM,EAAE,GAAG,CAAC,MAAgB;YAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;YAChD,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,iBAAiB;YAC/C,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,SAAS,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,0BAA0B,EAAE,EAAE,EAAE;YAC1F,YAAY,EAAE;gBACZ,QAAQ,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE;gBAC5D,QAAQ,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE;aAC7D;YACD,OAAO,EAAE,IAA0C;SACpD,CAAC;QACF,cAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;CACF,CAAA;AAlBY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;GACA,sBAAsB,CAkBlC"}
@@ -0,0 +1,6 @@
1
+ export * from './skip-internal-auth.decorator';
2
+ export * from './nats-scoped-client.proxy';
3
+ export * from './internal-auth.interceptor';
4
+ export * from './authz-context.middleware';
5
+ export * from './authz-context.interceptor';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nest/index.ts"],"names":[],"mappings":"AAGA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ // @generazioneai/authz/nest — Step 2 NestJS integration (imports the @nestjs/* runtime).
18
+ // Kept out of the main barrel + ./nats so Step-1-only consumers and the jest tests
19
+ // don't pull the NestJS runtime.
20
+ __exportStar(require("./skip-internal-auth.decorator"), exports);
21
+ __exportStar(require("./nats-scoped-client.proxy"), exports);
22
+ __exportStar(require("./internal-auth.interceptor"), exports);
23
+ __exportStar(require("./authz-context.middleware"), exports);
24
+ __exportStar(require("./authz-context.interceptor"), exports);
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nest/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yFAAyF;AACzF,mFAAmF;AACnF,iCAAiC;AACjC,iEAA+C;AAC/C,6DAA2C;AAC3C,8DAA4C;AAC5C,6DAA2C;AAC3C,8DAA4C"}
@@ -0,0 +1,29 @@
1
+ import { type CallHandler, type ExecutionContext, type NestInterceptor } from '@nestjs/common';
2
+ import type { Reflector } from '@nestjs/core';
3
+ import { Observable } from 'rxjs';
4
+ import { type VerificationKey } from '../nats/internal-token';
5
+ import type { ReplayCache } from '../nats/replay-cache';
6
+ export type InternalAuthMode = 'off' | 'shadow' | 'enforce';
7
+ export interface InternalAuthOptions {
8
+ jwks: VerificationKey;
9
+ replay: ReplayCache;
10
+ /** This service's audience: 'skillID' | 'skillCertet'. */
11
+ serviceName: string;
12
+ reflector: Reflector;
13
+ /** Default reads AUTHZ_INTERNAL_AUTH_MODE, falling back to 'off'. */
14
+ mode?: InternalAuthMode;
15
+ /** Compare the token cmd against the NATS subject. Default true. */
16
+ strictCmd?: boolean;
17
+ }
18
+ export declare class InternalAuthInterceptor implements NestInterceptor {
19
+ private readonly opts;
20
+ private readonly logger;
21
+ private readonly mode;
22
+ constructor(opts: InternalAuthOptions);
23
+ intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
24
+ /** Returns the ALS context on success; in shadow mode returns null on failure (pass). */
25
+ private verify;
26
+ private stripToken;
27
+ private tryGetSubject;
28
+ }
29
+ //# sourceMappingURL=internal-auth.interceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-auth.interceptor.d.ts","sourceRoot":"","sources":["../../src/nest/internal-auth.interceptor.ts"],"names":[],"mappings":"AAcA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAQ,MAAM,MAAM,CAAC;AAIxC,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,qEAAqE;IACrE,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AA8BD,qBACa,uBAAwB,YAAW,eAAe;IAIjD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;gBAEX,IAAI,EAAE,mBAAmB;IAKtD,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;IA8B5E,yFAAyF;YAC3E,MAAM;IAmCpB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,aAAa;CAItB"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ // Step 2 DEC-S2.22/23/25 + Step 6 (mode) — downstream global interceptor that verifies
3
+ // the internal NATS JWT on every @MessagePattern, then runs the handler inside the authz
4
+ // ALS context.
5
+ //
6
+ // Registered in each downstream service's main.ts:
7
+ // app.useGlobalInterceptors(new InternalAuthInterceptor({ jwks, replay, serviceName, reflector }))
8
+ //
9
+ // Rollout-safe via AUTHZ_INTERNAL_AUTH_MODE (default 'off'):
10
+ // off → strip _internalJwt (so forbidNonWhitelisted validation never trips during a
11
+ // mixed-version window) and pass. No verification, no ALS. Zero behaviour change.
12
+ // shadow → verify + log failures (authz_internal_token_verify_total) but NEVER reject;
13
+ // populate ALS on success. Measures readiness before enforcing.
14
+ // enforce → verify and REJECT (fail-closed) on any missing/invalid/tampered/replayed token.
15
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
16
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
17
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
18
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
19
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
20
+ };
21
+ var __metadata = (this && this.__metadata) || function (k, v) {
22
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.InternalAuthInterceptor = void 0;
26
+ const common_1 = require("@nestjs/common");
27
+ const microservices_1 = require("@nestjs/microservices");
28
+ const rxjs_1 = require("rxjs");
29
+ const operators_1 = require("rxjs/operators");
30
+ const als_1 = require("../context/als");
31
+ const internal_token_1 = require("../nats/internal-token");
32
+ const skip_internal_auth_decorator_1 = require("./skip-internal-auth.decorator");
33
+ function subjectToCmd(subject) {
34
+ if (!subject)
35
+ return undefined;
36
+ try {
37
+ const parsed = JSON.parse(subject);
38
+ if (parsed && typeof parsed.cmd === 'string')
39
+ return parsed.cmd;
40
+ }
41
+ catch {
42
+ /* not JSON — use raw subject */
43
+ }
44
+ return subject;
45
+ }
46
+ function claimsToContext(claims) {
47
+ return {
48
+ userId: claims.sub,
49
+ juridicalIndividualId: claims.ji,
50
+ tenantId: claims.tnt,
51
+ snapId: claims.snap,
52
+ permHash: claims.ph,
53
+ // connected/accreditedAs/ability are hydrated by the Step 4 snapshot resolver.
54
+ connected: { studentsOfTeacher: [], reportsOfManager: [], pendingApprovalResourceIds: {} },
55
+ accreditedAs: {
56
+ provider: { accreditationIds: [], customerJuridicalIds: [] },
57
+ customer: { accreditationIds: [], providerJuridicalIds: [] },
58
+ },
59
+ ability: null,
60
+ };
61
+ }
62
+ let InternalAuthInterceptor = class InternalAuthInterceptor {
63
+ constructor(opts) {
64
+ this.opts = opts;
65
+ this.logger = new common_1.Logger('InternalAuth');
66
+ this.mode =
67
+ opts.mode ?? process.env.AUTHZ_INTERNAL_AUTH_MODE ?? 'off';
68
+ }
69
+ intercept(context, next) {
70
+ if (context.getType() !== 'rpc')
71
+ return next.handle(); // HTTP no-op
72
+ if (this.mode === 'off') {
73
+ // Strip the field if a (signing) gateway is already attaching it, so the
74
+ // downstream ValidationPipe(forbidNonWhitelisted) doesn't 400. No verification.
75
+ this.stripToken(context);
76
+ return next.handle();
77
+ }
78
+ const skip = this.opts.reflector.getAllAndOverride(skip_internal_auth_decorator_1.SKIP_INTERNAL_AUTH_KEY, [
79
+ context.getHandler(),
80
+ context.getClass(),
81
+ ]);
82
+ if (skip) {
83
+ this.stripToken(context);
84
+ return next.handle();
85
+ }
86
+ return (0, rxjs_1.from)(this.verify(context)).pipe((0, operators_1.mergeMap)((authCtx) => authCtx
87
+ ? new rxjs_1.Observable((subscriber) => als_1.authzAls.run(authCtx, () => next.handle().subscribe(subscriber)))
88
+ : next.handle()));
89
+ }
90
+ /** Returns the ALS context on success; in shadow mode returns null on failure (pass). */
91
+ async verify(context) {
92
+ const rpc = context.switchToRpc();
93
+ const data = rpc.getData();
94
+ const cmd = subjectToCmd(this.tryGetSubject(rpc));
95
+ try {
96
+ const jwt = data && data[internal_token_1.INTERNAL_JWT_FIELD];
97
+ if (!jwt)
98
+ throw new internal_token_1.InternalAuthError('missing', 'internal auth token absent');
99
+ const claims = await (0, internal_token_1.verifyInternalToken)(jwt, this.opts.jwks, this.opts.serviceName);
100
+ delete data[internal_token_1.INTERNAL_JWT_FIELD];
101
+ (0, internal_token_1.assertBodyHash)(claims, data ?? {});
102
+ if (this.opts.strictCmd !== false && cmd)
103
+ (0, internal_token_1.assertCmd)(claims, cmd);
104
+ let first;
105
+ try {
106
+ first = await this.opts.replay.firstSeen(claims.jti);
107
+ }
108
+ catch (e) {
109
+ throw new internal_token_1.InternalAuthError('backend', `replay backend unavailable: ${e.message}`);
110
+ }
111
+ if (!first)
112
+ throw new internal_token_1.InternalAuthError('replay', `jti '${claims.jti}' already used`);
113
+ return claimsToContext(claims);
114
+ }
115
+ catch (e) {
116
+ const reason = e instanceof internal_token_1.InternalAuthError ? e.reason : 'sig';
117
+ if (this.mode === 'shadow') {
118
+ this.logger.warn(`shadow would-deny [${reason}] cmd=${cmd ?? '?'}: ${e.message}`);
119
+ this.stripToken(context); // keep payload clean for the handler
120
+ return null;
121
+ }
122
+ throw new microservices_1.RpcException({ code: 'INTERNAL_AUTH', reason, message: e.message });
123
+ }
124
+ }
125
+ stripToken(context) {
126
+ const data = context.switchToRpc().getData();
127
+ if (data && internal_token_1.INTERNAL_JWT_FIELD in data)
128
+ delete data[internal_token_1.INTERNAL_JWT_FIELD];
129
+ }
130
+ tryGetSubject(rpc) {
131
+ const ctx = rpc.getContext();
132
+ return typeof ctx?.getSubject === 'function' ? ctx.getSubject() : undefined;
133
+ }
134
+ };
135
+ exports.InternalAuthInterceptor = InternalAuthInterceptor;
136
+ exports.InternalAuthInterceptor = InternalAuthInterceptor = __decorate([
137
+ (0, common_1.Injectable)(),
138
+ __metadata("design:paramtypes", [Object])
139
+ ], InternalAuthInterceptor);
140
+ //# sourceMappingURL=internal-auth.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-auth.interceptor.js","sourceRoot":"","sources":["../../src/nest/internal-auth.interceptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { ClientProxy, type NatsOptions, type ReadPacket, type WritePacket } from '@nestjs/microservices';
2
+ import { Observable } from 'rxjs';
3
+ import { InternalTokenSigner } from '../nats/internal-token.signer';
4
+ export interface NatsScopedClientOptions {
5
+ /** NATS transport options (servers, queue, etc.) — same shape as Transport.NATS. */
6
+ nats: NatsOptions['options'];
7
+ signer: InternalTokenSigner;
8
+ /** Audience of THIS client's target service: 'skillID' | 'skillCertet'. */
9
+ audience: string;
10
+ }
11
+ export declare class NatsScopedClientProxy extends ClientProxy {
12
+ private readonly opts;
13
+ private readonly delegate;
14
+ constructor(opts: NatsScopedClientOptions);
15
+ connect(): Promise<unknown>;
16
+ close(): Promise<void> | void;
17
+ unwrap<T>(): T;
18
+ protected publish(packet: ReadPacket, callback: (packet: WritePacket) => void): () => void;
19
+ protected dispatchEvent<T = unknown>(packet: ReadPacket): Promise<T>;
20
+ send<TResult = unknown, TInput = unknown>(pattern: unknown, data: TInput): Observable<TResult>;
21
+ emit<TResult = unknown, TInput = unknown>(pattern: unknown, data: TInput): Observable<TResult>;
22
+ }
23
+ //# sourceMappingURL=nats-scoped-client.proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nats-scoped-client.proxy.d.ts","sourceRoot":"","sources":["../../src/nest/nats-scoped-client.proxy.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,WAAW,EAGX,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAQ,MAAM,MAAM,CAAC;AAExC,OAAO,EAAE,mBAAmB,EAAgB,MAAM,+BAA+B,CAAC;AAElF,MAAM,WAAW,uBAAuB;IACtC,oFAAoF;IACpF,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,qBAAsB,SAAQ,WAAW;IAGxC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;gBAEV,IAAI,EAAE,uBAAuB;IAQ1D,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAG3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAG7B,MAAM,CAAC,CAAC,KAAK,CAAC;IAKd,SAAS,CAAC,OAAO,CACf,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GACtC,MAAM,IAAI;IAKb,SAAS,CAAC,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IAMpE,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,EACtC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,GACX,UAAU,CAAC,OAAO,CAAC;IAOtB,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,EACtC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,GACX,UAAU,CAAC,OAAO,CAAC;CAMvB"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ // Step 2 DEC-S2.16/18 — gateway-side NATS client that signs every outbound call.
3
+ //
4
+ // Registered as `customClass` in the gateway's ClientsModule. Delegates the actual
5
+ // NATS transport to a real client created via ClientProxyFactory, and overrides
6
+ // send()/emit() to attach a freshly-signed `_internalJwt` (DEC-S2.18: top-level
7
+ // field, not NATS headers). Wrapping the transport — not an interceptor — guarantees
8
+ // signing on 100% of outbound calls, including those outside the HTTP request pipeline.
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.NatsScopedClientProxy = void 0;
11
+ const microservices_1 = require("@nestjs/microservices");
12
+ const rxjs_1 = require("rxjs");
13
+ const operators_1 = require("rxjs/operators");
14
+ const internal_token_signer_1 = require("../nats/internal-token.signer");
15
+ class NatsScopedClientProxy extends microservices_1.ClientProxy {
16
+ constructor(opts) {
17
+ super();
18
+ this.opts = opts;
19
+ this.delegate = microservices_1.ClientProxyFactory.create({
20
+ transport: microservices_1.Transport.NATS,
21
+ options: opts.nats,
22
+ });
23
+ }
24
+ connect() {
25
+ return this.delegate.connect();
26
+ }
27
+ close() {
28
+ return this.delegate.close();
29
+ }
30
+ unwrap() {
31
+ return this.delegate.unwrap();
32
+ }
33
+ // Abstract transport hooks delegate to the real client (protected in the base).
34
+ publish(packet, callback) {
35
+ return this.delegate.publish(packet, callback);
36
+ }
37
+ dispatchEvent(packet) {
38
+ return this.delegate.dispatchEvent(packet);
39
+ }
40
+ send(pattern, data) {
41
+ const cmd = (0, internal_token_signer_1.patternToCmd)(pattern);
42
+ return (0, rxjs_1.from)(this.opts.signer.sign(cmd, this.opts.audience, (data ?? {}))).pipe((0, operators_1.mergeMap)((signed) => this.delegate.send(pattern, signed)));
43
+ }
44
+ emit(pattern, data) {
45
+ const cmd = (0, internal_token_signer_1.patternToCmd)(pattern);
46
+ return (0, rxjs_1.from)(this.opts.signer.sign(cmd, this.opts.audience, (data ?? {}))).pipe((0, operators_1.mergeMap)((signed) => this.delegate.emit(pattern, signed)));
47
+ }
48
+ }
49
+ exports.NatsScopedClientProxy = NatsScopedClientProxy;
50
+ //# sourceMappingURL=nats-scoped-client.proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nats-scoped-client.proxy.js","sourceRoot":"","sources":["../../src/nest/nats-scoped-client.proxy.ts"],"names":[],"mappings":";AAAA,iFAAiF;AACjF,EAAE;AACF,mFAAmF;AACnF,gFAAgF;AAChF,gFAAgF;AAChF,qFAAqF;AACrF,wFAAwF;;;AAExF,yDAO+B;AAC/B,+BAAwC;AACxC,8CAA0C;AAC1C,yEAAkF;AAUlF,MAAa,qBAAsB,SAAQ,2BAAW;IAGpD,YAA6B,IAA6B;QACxD,KAAK,EAAE,CAAC;QADmB,SAAI,GAAJ,IAAI,CAAyB;QAExD,IAAI,CAAC,QAAQ,GAAG,kCAAkB,CAAC,MAAM,CAAC;YACxC,SAAS,EAAE,yBAAS,CAAC,IAAI;YACzB,OAAO,EAAE,IAAI,CAAC,IAAI;SACnB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IACD,KAAK;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IACD,MAAM;QACJ,OAAQ,IAAI,CAAC,QAA+B,CAAC,MAAM,EAAK,CAAC;IAC3D,CAAC;IAED,gFAAgF;IACtE,OAAO,CACf,MAAkB,EAClB,QAAuC;QAEvC,OAAQ,IAAI,CAAC,QAEX,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,CAAC;IACS,aAAa,CAAc,MAAkB;QACrD,OAAQ,IAAI,CAAC,QAEX,CAAC,aAAa,CAAI,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CACF,OAAgB,EAChB,IAAY;QAEZ,MAAM,GAAG,GAAG,IAAA,oCAAY,EAAC,OAAO,CAAC,CAAC;QAClC,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC,CAAC,CAAC,IAAI,CACvG,IAAA,oBAAQ,EAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAU,OAAgB,EAAE,MAAM,CAAC,CAAC,CAC5E,CAAC;IACJ,CAAC;IAED,IAAI,CACF,OAAgB,EAChB,IAAY;QAEZ,MAAM,GAAG,GAAG,IAAA,oCAAY,EAAC,OAAO,CAAC,CAAC;QAClC,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC,CAAC,CAAC,IAAI,CACvG,IAAA,oBAAQ,EAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAU,OAAgB,EAAE,MAAM,CAAC,CAAC,CAC5E,CAAC;IACJ,CAAC;CACF;AAvDD,sDAuDC"}
@@ -0,0 +1,4 @@
1
+ import { type CustomDecorator } from '@nestjs/common';
2
+ export declare const SKIP_INTERNAL_AUTH_KEY = "skillera:authz:skip-internal-auth";
3
+ export declare function SkipInternalAuth(): CustomDecorator;
4
+ //# sourceMappingURL=skip-internal-auth.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skip-internal-auth.decorator.d.ts","sourceRoot":"","sources":["../../src/nest/skip-internal-auth.decorator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEnE,eAAO,MAAM,sBAAsB,sCAAsC,CAAC;AAE1E,wBAAgB,gBAAgB,IAAI,eAAe,CAElD"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SKIP_INTERNAL_AUTH_KEY = void 0;
4
+ exports.SkipInternalAuth = SkipInternalAuth;
5
+ // Step 2 DEC-S2.27 — opt a @MessagePattern out of internal-auth verification.
6
+ // Allowlist must stay minimal (health pings only); a CI lint rule (Step 8) requires
7
+ // a `// reason:` comment on each use.
8
+ const common_1 = require("@nestjs/common");
9
+ exports.SKIP_INTERNAL_AUTH_KEY = 'skillera:authz:skip-internal-auth';
10
+ function SkipInternalAuth() {
11
+ return (0, common_1.SetMetadata)(exports.SKIP_INTERNAL_AUTH_KEY, true);
12
+ }
13
+ //# sourceMappingURL=skip-internal-auth.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skip-internal-auth.decorator.js","sourceRoot":"","sources":["../../src/nest/skip-internal-auth.decorator.ts"],"names":[],"mappings":";;;AAOA,4CAEC;AATD,8EAA8E;AAC9E,oFAAoF;AACpF,sCAAsC;AACtC,2CAAmE;AAEtD,QAAA,sBAAsB,GAAG,mCAAmC,CAAC;AAE1E,SAAgB,gBAAgB;IAC9B,OAAO,IAAA,oBAAW,EAAC,8BAAsB,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { ResourceManifest } from './define-resource';
2
+ /**
3
+ * Registry singleton per-processo. Iniettabile via NestJS DI come `ResourceRegistry`.
4
+ * Lookup primario per subject + secondario per prismaModel (Step 3 DEC-S3.14).
5
+ */
6
+ export declare class ResourceRegistry {
7
+ private readonly bySubject;
8
+ private readonly byModel;
9
+ /**
10
+ * Registra un manifest. Throws se subject o prismaModel sono già registrati
11
+ * (Step 1 DEC-3: 1:1 manifest ↔ Prisma model).
12
+ */
13
+ register(manifest: ResourceManifest): void;
14
+ /** Step 1 DEC-3 lookup primario. Ritorna undefined se subject non registrato. */
15
+ get(subject: string): ResourceManifest | undefined;
16
+ /** Step 3 DEC-S3.14 lookup secondario. Usato dal Prisma extension hook. */
17
+ byPrismaModel(model: string): ResourceManifest | undefined;
18
+ /** Iterazione per CI coherence check + codegen. */
19
+ all(): ResourceManifest[];
20
+ /** Filter per service (utile in skillID aggregator). */
21
+ forService(service: ResourceManifest['service']): ResourceManifest[];
22
+ /** Reset (solo per test). */
23
+ clear(): void;
24
+ size(): number;
25
+ }
26
+ /**
27
+ * Singleton globale di processo. Iniettato in NestJS providers via factory.
28
+ * In test ambient, sostituibile creando una nuova `ResourceRegistry`.
29
+ */
30
+ export declare const globalResourceRegistry: ResourceRegistry;
31
+ //# sourceMappingURL=resource-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-registry.d.ts","sourceRoot":"","sources":["../src/resource-registry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAE/D;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAiB1C,iFAAiF;IACjF,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIlD,2EAA2E;IAC3E,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI1D,mDAAmD;IACnD,GAAG,IAAI,gBAAgB,EAAE;IAIzB,wDAAwD;IACxD,UAAU,CAAC,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,GAAG,gBAAgB,EAAE;IAIpE,6BAA6B;IAC7B,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,MAAM;CAGf;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,kBAAyB,CAAC"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ // Step 1 DEC-17/18: ResourceRegistry singleton per servizio
3
+ // Registrazione esplicita via `ResourceRegistryModule.forFeature([CourseResource, ...])`
4
+ // nel `*.module.ts` NestJS (no glob magic).
5
+ //
6
+ // skillID a startup aggrega via `@generazioneai/resource-registry-aggregator` (build-time JSON merge)
7
+ // per buildare snapshot CASL.
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.globalResourceRegistry = exports.ResourceRegistry = void 0;
10
+ /**
11
+ * Registry singleton per-processo. Iniettabile via NestJS DI come `ResourceRegistry`.
12
+ * Lookup primario per subject + secondario per prismaModel (Step 3 DEC-S3.14).
13
+ */
14
+ class ResourceRegistry {
15
+ constructor() {
16
+ this.bySubject = new Map();
17
+ this.byModel = new Map();
18
+ }
19
+ /**
20
+ * Registra un manifest. Throws se subject o prismaModel sono già registrati
21
+ * (Step 1 DEC-3: 1:1 manifest ↔ Prisma model).
22
+ */
23
+ register(manifest) {
24
+ if (this.bySubject.has(manifest.subject)) {
25
+ throw new Error(`[authz] Subject '${manifest.subject}' already registered. Duplicate manifest?`);
26
+ }
27
+ if (this.byModel.has(manifest.prismaModel)) {
28
+ throw new Error(`[authz] Prisma model '${manifest.prismaModel}' already mapped to subject '${this.byModel.get(manifest.prismaModel).subject}'. Cannot map to '${manifest.subject}'.`);
29
+ }
30
+ this.bySubject.set(manifest.subject, manifest);
31
+ this.byModel.set(manifest.prismaModel, manifest);
32
+ }
33
+ /** Step 1 DEC-3 lookup primario. Ritorna undefined se subject non registrato. */
34
+ get(subject) {
35
+ return this.bySubject.get(subject);
36
+ }
37
+ /** Step 3 DEC-S3.14 lookup secondario. Usato dal Prisma extension hook. */
38
+ byPrismaModel(model) {
39
+ return this.byModel.get(model);
40
+ }
41
+ /** Iterazione per CI coherence check + codegen. */
42
+ all() {
43
+ return Array.from(this.bySubject.values());
44
+ }
45
+ /** Filter per service (utile in skillID aggregator). */
46
+ forService(service) {
47
+ return this.all().filter((m) => m.service === service);
48
+ }
49
+ /** Reset (solo per test). */
50
+ clear() {
51
+ this.bySubject.clear();
52
+ this.byModel.clear();
53
+ }
54
+ size() {
55
+ return this.bySubject.size;
56
+ }
57
+ }
58
+ exports.ResourceRegistry = ResourceRegistry;
59
+ /**
60
+ * Singleton globale di processo. Iniettato in NestJS providers via factory.
61
+ * In test ambient, sostituibile creando una nuova `ResourceRegistry`.
62
+ */
63
+ exports.globalResourceRegistry = new ResourceRegistry();
64
+ //# sourceMappingURL=resource-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-registry.js","sourceRoot":"","sources":["../src/resource-registry.ts"],"names":[],"mappings":";AAAA,4DAA4D;AAC5D,yFAAyF;AACzF,4CAA4C;AAC5C,EAAE;AACF,sGAAsG;AACtG,8BAA8B;;;AAI9B;;;GAGG;AACH,MAAa,gBAAgB;IAA7B;QACmB,cAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;QAChD,YAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;IAoDjE,CAAC;IAlDC;;;OAGG;IACH,QAAQ,CAAC,QAA0B;QACjC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACb,oBAAoB,QAAQ,CAAC,OAAO,2CAA2C,CAChF,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,yBAAyB,QAAQ,CAAC,WAAW,gCAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAE,CAAC,OAC1C,qBAAqB,QAAQ,CAAC,OAAO,IAAI,CAC1C,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,iFAAiF;IACjF,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,2EAA2E;IAC3E,aAAa,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,mDAAmD;IACnD,GAAG;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,wDAAwD;IACxD,UAAU,CAAC,OAAoC;QAC7C,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,6BAA6B;IAC7B,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;CACF;AAtDD,4CAsDC;AAED;;;GAGG;AACU,QAAA,sBAAsB,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { DynamicModule } from '@nestjs/common';
2
+ import type { ResourceManifest } from './define-resource';
3
+ import { ResourceRegistry } from './resource-registry';
4
+ /** DI token for the per-process ResourceRegistry (alias of the class token). */
5
+ export declare const RESOURCE_REGISTRY: unique symbol;
6
+ export interface ResourceRegistryRootOptions {
7
+ /** Manifests to register eagerly at root (e.g. the aggregated set in skillID). */
8
+ manifests?: ResourceManifest[];
9
+ /** Inject a pre-built registry (tests / aggregator). Defaults to a fresh instance. */
10
+ registry?: ResourceRegistry;
11
+ }
12
+ export declare class ResourceRegistryModule {
13
+ /**
14
+ * Provides the singleton `ResourceRegistry` for the process. Global, so
15
+ * `forFeature(...)` in any feature module can inject it. Call once at app root.
16
+ */
17
+ static forRoot(options?: ResourceRegistryRootOptions): DynamicModule;
18
+ /**
19
+ * Registers a feature module's manifests into the root registry. The factory
20
+ * runs at bootstrap (eager, non-request-scoped) and registers each manifest;
21
+ * a duplicate subject/prismaModel surfaces as a startup error (DEC-3).
22
+ */
23
+ static forFeature(manifests: ResourceManifest[]): DynamicModule;
24
+ }
25
+ //# sourceMappingURL=resource-registry.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-registry.module.d.ts","sourceRoot":"","sources":["../src/resource-registry.module.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,eAAuC,CAAC;AAEtE,MAAM,WAAW,2BAA2B;IAC1C,kFAAkF;IAClF,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,sFAAsF;IACtF,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,qBAAa,sBAAsB;IACjC;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,2BAAgC,GAAG,aAAa;IAgBxE;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,gBAAgB,EAAE,GAAG,aAAa;CAmBhE"}