digitaltwin-core 0.14.3 → 1.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 (159) hide show
  1. package/README.md +218 -1
  2. package/dist/auth/apisix_parser.d.ts +56 -56
  3. package/dist/auth/apisix_parser.d.ts.map +1 -1
  4. package/dist/auth/apisix_parser.js +72 -86
  5. package/dist/auth/apisix_parser.js.map +1 -1
  6. package/dist/auth/auth_provider.d.ts +118 -0
  7. package/dist/auth/auth_provider.d.ts.map +1 -0
  8. package/dist/auth/auth_provider.js +8 -0
  9. package/dist/auth/auth_provider.js.map +1 -0
  10. package/dist/auth/auth_provider_factory.d.ts +91 -0
  11. package/dist/auth/auth_provider_factory.d.ts.map +1 -0
  12. package/dist/auth/auth_provider_factory.js +146 -0
  13. package/dist/auth/auth_provider_factory.js.map +1 -0
  14. package/dist/auth/index.d.ts +4 -1
  15. package/dist/auth/index.d.ts.map +1 -1
  16. package/dist/auth/index.js +3 -0
  17. package/dist/auth/index.js.map +1 -1
  18. package/dist/auth/providers/gateway_auth_provider.d.ts +78 -0
  19. package/dist/auth/providers/gateway_auth_provider.d.ts.map +1 -0
  20. package/dist/auth/providers/gateway_auth_provider.js +109 -0
  21. package/dist/auth/providers/gateway_auth_provider.js.map +1 -0
  22. package/dist/auth/providers/index.d.ts +4 -0
  23. package/dist/auth/providers/index.d.ts.map +1 -0
  24. package/dist/auth/providers/index.js +4 -0
  25. package/dist/auth/providers/index.js.map +1 -0
  26. package/dist/auth/providers/jwt_auth_provider.d.ts +91 -0
  27. package/dist/auth/providers/jwt_auth_provider.d.ts.map +1 -0
  28. package/dist/auth/providers/jwt_auth_provider.js +204 -0
  29. package/dist/auth/providers/jwt_auth_provider.js.map +1 -0
  30. package/dist/auth/providers/no_auth_provider.d.ts +61 -0
  31. package/dist/auth/providers/no_auth_provider.d.ts.map +1 -0
  32. package/dist/auth/providers/no_auth_provider.js +76 -0
  33. package/dist/auth/providers/no_auth_provider.js.map +1 -0
  34. package/dist/auth/types.d.ts +5 -3
  35. package/dist/auth/types.d.ts.map +1 -1
  36. package/dist/components/assets_manager.d.ts +1 -1
  37. package/dist/components/assets_manager.d.ts.map +1 -1
  38. package/dist/components/assets_manager.js +54 -48
  39. package/dist/components/assets_manager.js.map +1 -1
  40. package/dist/components/collector.d.ts.map +1 -1
  41. package/dist/components/collector.js +30 -18
  42. package/dist/components/collector.js.map +1 -1
  43. package/dist/components/custom_table_manager.d.ts.map +1 -1
  44. package/dist/components/custom_table_manager.js +36 -65
  45. package/dist/components/custom_table_manager.js.map +1 -1
  46. package/dist/components/global_assets_handler.d.ts +4 -2
  47. package/dist/components/global_assets_handler.d.ts.map +1 -1
  48. package/dist/components/global_assets_handler.js.map +1 -1
  49. package/dist/components/harvester.d.ts.map +1 -1
  50. package/dist/components/harvester.js +46 -33
  51. package/dist/components/harvester.js.map +1 -1
  52. package/dist/components/interfaces.d.ts +3 -2
  53. package/dist/components/interfaces.d.ts.map +1 -1
  54. package/dist/components/map_manager.d.ts.map +1 -1
  55. package/dist/components/map_manager.js.map +1 -1
  56. package/dist/components/tileset_manager.d.ts +2 -1
  57. package/dist/components/tileset_manager.d.ts.map +1 -1
  58. package/dist/components/tileset_manager.js +20 -15
  59. package/dist/components/tileset_manager.js.map +1 -1
  60. package/dist/database/adapters/knex_database_adapter.d.ts +6 -1
  61. package/dist/database/adapters/knex_database_adapter.d.ts.map +1 -1
  62. package/dist/database/adapters/knex_database_adapter.js +118 -36
  63. package/dist/database/adapters/knex_database_adapter.js.map +1 -1
  64. package/dist/database/database_adapter.d.ts +13 -1
  65. package/dist/database/database_adapter.d.ts.map +1 -1
  66. package/dist/database/database_adapter.js.map +1 -1
  67. package/dist/engine/component_types.d.ts +95 -0
  68. package/dist/engine/component_types.d.ts.map +1 -0
  69. package/dist/engine/component_types.js +93 -0
  70. package/dist/engine/component_types.js.map +1 -0
  71. package/dist/engine/digital_twin_engine.d.ts +121 -6
  72. package/dist/engine/digital_twin_engine.d.ts.map +1 -1
  73. package/dist/engine/digital_twin_engine.js +402 -74
  74. package/dist/engine/digital_twin_engine.js.map +1 -1
  75. package/dist/engine/endpoints.d.ts.map +1 -1
  76. package/dist/engine/endpoints.js +35 -3
  77. package/dist/engine/endpoints.js.map +1 -1
  78. package/dist/engine/error_handler.d.ts +20 -0
  79. package/dist/engine/error_handler.d.ts.map +1 -0
  80. package/dist/engine/error_handler.js +69 -0
  81. package/dist/engine/error_handler.js.map +1 -0
  82. package/dist/engine/events.d.ts +1 -1
  83. package/dist/engine/events.d.ts.map +1 -1
  84. package/dist/engine/events.js.map +1 -1
  85. package/dist/engine/health.d.ts +112 -0
  86. package/dist/engine/health.d.ts.map +1 -0
  87. package/dist/engine/health.js +190 -0
  88. package/dist/engine/health.js.map +1 -0
  89. package/dist/engine/initializer.d.ts.map +1 -1
  90. package/dist/engine/initializer.js +6 -4
  91. package/dist/engine/initializer.js.map +1 -1
  92. package/dist/engine/scheduler.d.ts.map +1 -1
  93. package/dist/engine/scheduler.js +17 -9
  94. package/dist/engine/scheduler.js.map +1 -1
  95. package/dist/engine/upload_processor.d.ts.map +1 -1
  96. package/dist/engine/upload_processor.js +24 -12
  97. package/dist/engine/upload_processor.js.map +1 -1
  98. package/dist/errors/index.d.ts +94 -0
  99. package/dist/errors/index.d.ts.map +1 -0
  100. package/dist/errors/index.js +149 -0
  101. package/dist/errors/index.js.map +1 -0
  102. package/dist/index.d.ts +9 -0
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +13 -0
  105. package/dist/index.js.map +1 -1
  106. package/dist/loader/component_loader.d.ts +128 -0
  107. package/dist/loader/component_loader.d.ts.map +1 -0
  108. package/dist/loader/component_loader.js +330 -0
  109. package/dist/loader/component_loader.js.map +1 -0
  110. package/dist/loader/index.d.ts +19 -0
  111. package/dist/loader/index.d.ts.map +1 -0
  112. package/dist/loader/index.js +19 -0
  113. package/dist/loader/index.js.map +1 -0
  114. package/dist/storage/adapters/local_storage_service.d.ts +6 -0
  115. package/dist/storage/adapters/local_storage_service.d.ts.map +1 -1
  116. package/dist/storage/adapters/local_storage_service.js +26 -4
  117. package/dist/storage/adapters/local_storage_service.js.map +1 -1
  118. package/dist/storage/adapters/ovh_storage_service.d.ts.map +1 -1
  119. package/dist/storage/adapters/ovh_storage_service.js +5 -6
  120. package/dist/storage/adapters/ovh_storage_service.js.map +1 -1
  121. package/dist/storage/storage_factory.d.ts.map +1 -1
  122. package/dist/storage/storage_factory.js +4 -1
  123. package/dist/storage/storage_factory.js.map +1 -1
  124. package/dist/storage/storage_service.d.ts.map +1 -1
  125. package/dist/storage/storage_service.js +6 -2
  126. package/dist/storage/storage_service.js.map +1 -1
  127. package/dist/types/http.d.ts +156 -0
  128. package/dist/types/http.d.ts.map +1 -0
  129. package/dist/types/http.js +8 -0
  130. package/dist/types/http.js.map +1 -0
  131. package/dist/utils/graceful_shutdown.d.ts +44 -0
  132. package/dist/utils/graceful_shutdown.d.ts.map +1 -0
  133. package/dist/utils/graceful_shutdown.js +79 -0
  134. package/dist/utils/graceful_shutdown.js.map +1 -0
  135. package/dist/utils/http_responses.d.ts +20 -0
  136. package/dist/utils/http_responses.d.ts.map +1 -1
  137. package/dist/utils/http_responses.js +28 -2
  138. package/dist/utils/http_responses.js.map +1 -1
  139. package/dist/utils/logger.d.ts +8 -8
  140. package/dist/utils/logger.d.ts.map +1 -1
  141. package/dist/utils/logger.js +8 -8
  142. package/dist/utils/logger.js.map +1 -1
  143. package/dist/utils/safe_async.d.ts +50 -0
  144. package/dist/utils/safe_async.d.ts.map +1 -0
  145. package/dist/utils/safe_async.js +90 -0
  146. package/dist/utils/safe_async.js.map +1 -0
  147. package/dist/validation/index.d.ts +3 -0
  148. package/dist/validation/index.d.ts.map +1 -0
  149. package/dist/validation/index.js +7 -0
  150. package/dist/validation/index.js.map +1 -0
  151. package/dist/validation/schemas.d.ts +273 -0
  152. package/dist/validation/schemas.d.ts.map +1 -0
  153. package/dist/validation/schemas.js +82 -0
  154. package/dist/validation/schemas.js.map +1 -0
  155. package/dist/validation/validate.d.ts +49 -0
  156. package/dist/validation/validate.d.ts.map +1 -0
  157. package/dist/validation/validate.js +110 -0
  158. package/dist/validation/validate.js.map +1 -0
  159. package/package.json +14 -8
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE3F,0BAA0B;AAC1B,OAAO,EAAE,gBAAgB,EAAoB,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @fileoverview Gateway authentication provider for API Gateway authentication.
3
+ *
4
+ * This provider parses authentication information from HTTP headers set by an API gateway
5
+ * (such as Apache APISIX or KrakenD) after validating JWT tokens with an identity provider.
6
+ *
7
+ * Expected headers:
8
+ * - `x-user-id`: User identifier (UUID from Keycloak)
9
+ * - `x-user-roles`: Comma-separated list of user roles
10
+ */
11
+ import type { AuthProvider, AuthRequest } from '../auth_provider.js';
12
+ import type { AuthenticatedUser } from '../types.js';
13
+ /**
14
+ * Authentication provider for API Gateway authentication.
15
+ *
16
+ * This is the default authentication mode for Digital Twin applications deployed
17
+ * behind an API gateway like Apache APISIX or KrakenD.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const provider = new GatewayAuthProvider('admin')
22
+ *
23
+ * // In a handler
24
+ * const user = provider.parseRequest(req)
25
+ * if (!user) {
26
+ * return { status: 401, content: 'Authentication required' }
27
+ * }
28
+ *
29
+ * if (provider.isAdmin(req)) {
30
+ * // Admin-only logic
31
+ * }
32
+ * ```
33
+ */
34
+ export declare class GatewayAuthProvider implements AuthProvider {
35
+ #private;
36
+ /**
37
+ * Creates a new GatewayAuthProvider.
38
+ *
39
+ * @param adminRoleName - Name of the admin role (default: 'admin')
40
+ */
41
+ constructor(adminRoleName?: string);
42
+ /**
43
+ * Parse the request headers and return the authenticated user.
44
+ *
45
+ * @param req - Request object with headers
46
+ * @returns Authenticated user, or null if x-user-id header is missing
47
+ */
48
+ parseRequest(req: AuthRequest): AuthenticatedUser | null;
49
+ /**
50
+ * Check if the request has the x-user-id header.
51
+ *
52
+ * @param req - Request object with headers
53
+ * @returns true if x-user-id header is present
54
+ */
55
+ hasValidAuth(req: AuthRequest): boolean;
56
+ /**
57
+ * Check if the user has the admin role.
58
+ *
59
+ * @param req - Request object with headers
60
+ * @returns true if x-user-roles contains the admin role
61
+ */
62
+ isAdmin(req: AuthRequest): boolean;
63
+ /**
64
+ * Get the user ID from the x-user-id header.
65
+ *
66
+ * @param req - Request object with headers
67
+ * @returns User ID, or null if header is missing
68
+ */
69
+ getUserId(req: AuthRequest): string | null;
70
+ /**
71
+ * Get the user roles from the x-user-roles header.
72
+ *
73
+ * @param req - Request object with headers
74
+ * @returns Array of role names, empty array if header is missing
75
+ */
76
+ getUserRoles(req: AuthRequest): string[];
77
+ }
78
+ //# sourceMappingURL=gateway_auth_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway_auth_provider.d.ts","sourceRoot":"","sources":["../../../src/auth/providers/gateway_auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,mBAAoB,YAAW,YAAY;;IAGpD;;;;OAIG;gBACS,aAAa,SAAU;IAInC;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI;IASxD;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO;IAIvC;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO;IAKlC;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAI1C;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE;CAkB3C"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * @fileoverview Gateway authentication provider for API Gateway authentication.
3
+ *
4
+ * This provider parses authentication information from HTTP headers set by an API gateway
5
+ * (such as Apache APISIX or KrakenD) after validating JWT tokens with an identity provider.
6
+ *
7
+ * Expected headers:
8
+ * - `x-user-id`: User identifier (UUID from Keycloak)
9
+ * - `x-user-roles`: Comma-separated list of user roles
10
+ */
11
+ /**
12
+ * Authentication provider for API Gateway authentication.
13
+ *
14
+ * This is the default authentication mode for Digital Twin applications deployed
15
+ * behind an API gateway like Apache APISIX or KrakenD.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const provider = new GatewayAuthProvider('admin')
20
+ *
21
+ * // In a handler
22
+ * const user = provider.parseRequest(req)
23
+ * if (!user) {
24
+ * return { status: 401, content: 'Authentication required' }
25
+ * }
26
+ *
27
+ * if (provider.isAdmin(req)) {
28
+ * // Admin-only logic
29
+ * }
30
+ * ```
31
+ */
32
+ export class GatewayAuthProvider {
33
+ #adminRoleName;
34
+ /**
35
+ * Creates a new GatewayAuthProvider.
36
+ *
37
+ * @param adminRoleName - Name of the admin role (default: 'admin')
38
+ */
39
+ constructor(adminRoleName = 'admin') {
40
+ this.#adminRoleName = adminRoleName;
41
+ }
42
+ /**
43
+ * Parse the request headers and return the authenticated user.
44
+ *
45
+ * @param req - Request object with headers
46
+ * @returns Authenticated user, or null if x-user-id header is missing
47
+ */
48
+ parseRequest(req) {
49
+ const userId = this.#getHeader(req.headers, 'x-user-id');
50
+ if (!userId)
51
+ return null;
52
+ const roles = this.getUserRoles(req);
53
+ return { id: userId, roles };
54
+ }
55
+ /**
56
+ * Check if the request has the x-user-id header.
57
+ *
58
+ * @param req - Request object with headers
59
+ * @returns true if x-user-id header is present
60
+ */
61
+ hasValidAuth(req) {
62
+ return !!this.#getHeader(req.headers, 'x-user-id');
63
+ }
64
+ /**
65
+ * Check if the user has the admin role.
66
+ *
67
+ * @param req - Request object with headers
68
+ * @returns true if x-user-roles contains the admin role
69
+ */
70
+ isAdmin(req) {
71
+ const roles = this.getUserRoles(req);
72
+ return roles.includes(this.#adminRoleName);
73
+ }
74
+ /**
75
+ * Get the user ID from the x-user-id header.
76
+ *
77
+ * @param req - Request object with headers
78
+ * @returns User ID, or null if header is missing
79
+ */
80
+ getUserId(req) {
81
+ return this.#getHeader(req.headers, 'x-user-id');
82
+ }
83
+ /**
84
+ * Get the user roles from the x-user-roles header.
85
+ *
86
+ * @param req - Request object with headers
87
+ * @returns Array of role names, empty array if header is missing
88
+ */
89
+ getUserRoles(req) {
90
+ const rolesHeader = this.#getHeader(req.headers, 'x-user-roles');
91
+ if (!rolesHeader)
92
+ return [];
93
+ return rolesHeader
94
+ .split(',')
95
+ .map(r => r.trim())
96
+ .filter(Boolean);
97
+ }
98
+ /**
99
+ * Get a header value as a string.
100
+ * Handles both string and string[] header values.
101
+ */
102
+ #getHeader(headers, name) {
103
+ const value = headers[name];
104
+ if (!value)
105
+ return null;
106
+ return Array.isArray(value) ? value[0] : value;
107
+ }
108
+ }
109
+ //# sourceMappingURL=gateway_auth_provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway_auth_provider.js","sourceRoot":"","sources":["../../../src/auth/providers/gateway_auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,mBAAmB;IACnB,cAAc,CAAQ;IAE/B;;;;OAIG;IACH,YAAY,aAAa,GAAG,OAAO;QAC/B,IAAI,CAAC,cAAc,GAAG,aAAa,CAAA;IACvC,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,GAAgB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACxD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAEpC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,GAAgB;QACzB,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACtD,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,GAAgB;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9C,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,GAAgB;QACtB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACpD,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,GAAgB;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QAChE,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAA;QAC3B,OAAO,WAAW;aACb,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAClB,MAAM,CAAC,OAAO,CAAC,CAAA;IACxB,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,OAAsD,EAAE,IAAY;QAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QACvB,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAClD,CAAC;CACJ"}
@@ -0,0 +1,4 @@
1
+ export { GatewayAuthProvider } from './gateway_auth_provider.js';
2
+ export { JwtAuthProvider } from './jwt_auth_provider.js';
3
+ export { NoAuthProvider } from './no_auth_provider.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { GatewayAuthProvider } from './gateway_auth_provider.js';
2
+ export { JwtAuthProvider } from './jwt_auth_provider.js';
3
+ export { NoAuthProvider } from './no_auth_provider.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * @fileoverview JWT authentication provider for direct token validation.
3
+ *
4
+ * This provider validates JWT tokens from the Authorization header without
5
+ * requiring an API gateway. Useful for standalone deployments or when you
6
+ * want to handle authentication directly in the application.
7
+ *
8
+ * Supports:
9
+ * - HMAC algorithms (HS256, HS384, HS512) with a secret key
10
+ * - RSA algorithms (RS256, RS384, RS512) with a public key
11
+ * - EC algorithms (ES256, ES384, ES512) with a public key
12
+ * - Keycloak token format (realm_access.roles)
13
+ * - Custom claim paths for user ID and roles
14
+ */
15
+ import type { AuthProvider, AuthRequest, AuthProviderConfig } from '../auth_provider.js';
16
+ import type { AuthenticatedUser } from '../types.js';
17
+ /**
18
+ * Authentication provider for JWT token validation.
19
+ *
20
+ * This provider validates JWT tokens directly in the application, without
21
+ * requiring an API gateway. It extracts user information from token claims.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * // With HMAC secret
26
+ * const provider = new JwtAuthProvider({
27
+ * mode: 'jwt',
28
+ * jwt: {
29
+ * secret: 'your-256-bit-secret',
30
+ * algorithm: 'HS256'
31
+ * }
32
+ * })
33
+ *
34
+ * // With RSA public key (Keycloak)
35
+ * const provider = new JwtAuthProvider({
36
+ * mode: 'jwt',
37
+ * jwt: {
38
+ * publicKey: fs.readFileSync('public.pem', 'utf-8'),
39
+ * algorithm: 'RS256',
40
+ * issuer: 'https://keycloak.example.com/realms/myrealm',
41
+ * rolesClaim: 'realm_access.roles'
42
+ * }
43
+ * })
44
+ * ```
45
+ */
46
+ export declare class JwtAuthProvider implements AuthProvider {
47
+ #private;
48
+ /**
49
+ * Creates a new JwtAuthProvider.
50
+ *
51
+ * @param config - Authentication configuration with JWT settings
52
+ * @throws Error if JWT configuration is missing or incomplete
53
+ */
54
+ constructor(config: AuthProviderConfig);
55
+ /**
56
+ * Parse the request and validate the JWT token.
57
+ *
58
+ * @param req - Request object with headers
59
+ * @returns Authenticated user, or null if token is missing/invalid
60
+ */
61
+ parseRequest(req: AuthRequest): AuthenticatedUser | null;
62
+ /**
63
+ * Check if the request has a valid Authorization header with Bearer token.
64
+ *
65
+ * @param req - Request object with headers
66
+ * @returns true if Authorization header is present with Bearer scheme
67
+ */
68
+ hasValidAuth(req: AuthRequest): boolean;
69
+ /**
70
+ * Check if the authenticated user has admin privileges.
71
+ *
72
+ * @param req - Request object with headers
73
+ * @returns true if the user has the admin role
74
+ */
75
+ isAdmin(req: AuthRequest): boolean;
76
+ /**
77
+ * Get the user ID from the JWT token.
78
+ *
79
+ * @param req - Request object with headers
80
+ * @returns User ID, or null if not authenticated
81
+ */
82
+ getUserId(req: AuthRequest): string | null;
83
+ /**
84
+ * Get the user roles from the JWT token.
85
+ *
86
+ * @param req - Request object with headers
87
+ * @returns Array of role names, empty array if not authenticated
88
+ */
89
+ getUserRoles(req: AuthRequest): string[];
90
+ }
91
+ //# sourceMappingURL=jwt_auth_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt_auth_provider.d.ts","sourceRoot":"","sources":["../../../src/auth/providers/jwt_auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,eAAgB,YAAW,YAAY;;IAShD;;;;;OAKG;gBACS,MAAM,EAAE,kBAAkB;IAwBtC;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI;IAuBxD;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO;IAIvC;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO;IAKlC;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAK1C;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE;CAkE3C"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * @fileoverview JWT authentication provider for direct token validation.
3
+ *
4
+ * This provider validates JWT tokens from the Authorization header without
5
+ * requiring an API gateway. Useful for standalone deployments or when you
6
+ * want to handle authentication directly in the application.
7
+ *
8
+ * Supports:
9
+ * - HMAC algorithms (HS256, HS384, HS512) with a secret key
10
+ * - RSA algorithms (RS256, RS384, RS512) with a public key
11
+ * - EC algorithms (ES256, ES384, ES512) with a public key
12
+ * - Keycloak token format (realm_access.roles)
13
+ * - Custom claim paths for user ID and roles
14
+ */
15
+ import jwt from 'jsonwebtoken';
16
+ /**
17
+ * Authentication provider for JWT token validation.
18
+ *
19
+ * This provider validates JWT tokens directly in the application, without
20
+ * requiring an API gateway. It extracts user information from token claims.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * // With HMAC secret
25
+ * const provider = new JwtAuthProvider({
26
+ * mode: 'jwt',
27
+ * jwt: {
28
+ * secret: 'your-256-bit-secret',
29
+ * algorithm: 'HS256'
30
+ * }
31
+ * })
32
+ *
33
+ * // With RSA public key (Keycloak)
34
+ * const provider = new JwtAuthProvider({
35
+ * mode: 'jwt',
36
+ * jwt: {
37
+ * publicKey: fs.readFileSync('public.pem', 'utf-8'),
38
+ * algorithm: 'RS256',
39
+ * issuer: 'https://keycloak.example.com/realms/myrealm',
40
+ * rolesClaim: 'realm_access.roles'
41
+ * }
42
+ * })
43
+ * ```
44
+ */
45
+ export class JwtAuthProvider {
46
+ #secret;
47
+ #algorithm;
48
+ #issuer;
49
+ #audience;
50
+ #userIdClaim;
51
+ #rolesClaim;
52
+ #adminRoleName;
53
+ /**
54
+ * Creates a new JwtAuthProvider.
55
+ *
56
+ * @param config - Authentication configuration with JWT settings
57
+ * @throws Error if JWT configuration is missing or incomplete
58
+ */
59
+ constructor(config) {
60
+ if (!config.jwt) {
61
+ throw new Error('JWT configuration required for JWT auth mode');
62
+ }
63
+ const { jwt: jwtConfig } = config;
64
+ // Secret or public key
65
+ if (jwtConfig.publicKey) {
66
+ this.#secret = jwtConfig.publicKey;
67
+ }
68
+ else if (jwtConfig.secret) {
69
+ this.#secret = jwtConfig.secret;
70
+ }
71
+ else {
72
+ throw new Error('JWT secret or publicKey required');
73
+ }
74
+ this.#algorithm = jwtConfig.algorithm || 'HS256';
75
+ this.#issuer = jwtConfig.issuer;
76
+ this.#audience = jwtConfig.audience;
77
+ this.#userIdClaim = jwtConfig.userIdClaim || 'sub';
78
+ this.#rolesClaim = jwtConfig.rolesClaim || 'roles';
79
+ this.#adminRoleName = config.adminRoleName || 'admin';
80
+ }
81
+ /**
82
+ * Parse the request and validate the JWT token.
83
+ *
84
+ * @param req - Request object with headers
85
+ * @returns Authenticated user, or null if token is missing/invalid
86
+ */
87
+ parseRequest(req) {
88
+ const token = this.#extractToken(req);
89
+ if (!token)
90
+ return null;
91
+ try {
92
+ const decoded = jwt.verify(token, this.#secret, {
93
+ algorithms: [this.#algorithm],
94
+ issuer: this.#issuer,
95
+ audience: this.#audience
96
+ });
97
+ const userId = this.#extractClaim(decoded, this.#userIdClaim);
98
+ if (!userId || typeof userId !== 'string')
99
+ return null;
100
+ const roles = this.#extractRoles(decoded);
101
+ return { id: userId, roles };
102
+ }
103
+ catch {
104
+ // Token invalid or expired
105
+ return null;
106
+ }
107
+ }
108
+ /**
109
+ * Check if the request has a valid Authorization header with Bearer token.
110
+ *
111
+ * @param req - Request object with headers
112
+ * @returns true if Authorization header is present with Bearer scheme
113
+ */
114
+ hasValidAuth(req) {
115
+ return !!this.#extractToken(req);
116
+ }
117
+ /**
118
+ * Check if the authenticated user has admin privileges.
119
+ *
120
+ * @param req - Request object with headers
121
+ * @returns true if the user has the admin role
122
+ */
123
+ isAdmin(req) {
124
+ const user = this.parseRequest(req);
125
+ return user?.roles.includes(this.#adminRoleName) ?? false;
126
+ }
127
+ /**
128
+ * Get the user ID from the JWT token.
129
+ *
130
+ * @param req - Request object with headers
131
+ * @returns User ID, or null if not authenticated
132
+ */
133
+ getUserId(req) {
134
+ const user = this.parseRequest(req);
135
+ return user?.id ?? null;
136
+ }
137
+ /**
138
+ * Get the user roles from the JWT token.
139
+ *
140
+ * @param req - Request object with headers
141
+ * @returns Array of role names, empty array if not authenticated
142
+ */
143
+ getUserRoles(req) {
144
+ const user = this.parseRequest(req);
145
+ return user?.roles ?? [];
146
+ }
147
+ /**
148
+ * Extract the Bearer token from the Authorization header.
149
+ */
150
+ #extractToken(req) {
151
+ const authHeader = this.#getHeader(req.headers, 'authorization');
152
+ if (!authHeader)
153
+ return null;
154
+ // Format: "Bearer <token>"
155
+ const parts = authHeader.split(' ');
156
+ if (parts.length !== 2 || parts[0].toLowerCase() !== 'bearer') {
157
+ return null;
158
+ }
159
+ return parts[1];
160
+ }
161
+ /**
162
+ * Extract a claim value from the token payload.
163
+ * Supports nested paths like "realm_access.roles".
164
+ */
165
+ #extractClaim(payload, path) {
166
+ const parts = path.split('.');
167
+ let current = payload;
168
+ for (const part of parts) {
169
+ if (current === null || current === undefined)
170
+ return undefined;
171
+ if (typeof current !== 'object')
172
+ return undefined;
173
+ current = current[part];
174
+ }
175
+ return current;
176
+ }
177
+ /**
178
+ * Extract roles from the token payload.
179
+ * Supports standard array format and Keycloak's realm_access.roles.
180
+ */
181
+ #extractRoles(payload) {
182
+ // Try configured roles claim first
183
+ const roles = this.#extractClaim(payload, this.#rolesClaim);
184
+ if (Array.isArray(roles)) {
185
+ return roles.filter((r) => typeof r === 'string');
186
+ }
187
+ // Fallback to Keycloak format
188
+ const realmAccess = payload.realm_access;
189
+ if (realmAccess?.roles && Array.isArray(realmAccess.roles)) {
190
+ return realmAccess.roles;
191
+ }
192
+ return [];
193
+ }
194
+ /**
195
+ * Get a header value as a string.
196
+ */
197
+ #getHeader(headers, name) {
198
+ const value = headers[name];
199
+ if (!value)
200
+ return null;
201
+ return Array.isArray(value) ? value[0] : value;
202
+ }
203
+ }
204
+ //# sourceMappingURL=jwt_auth_provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt_auth_provider.js","sourceRoot":"","sources":["../../../src/auth/providers/jwt_auth_provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @fileoverview No-authentication provider for development and testing.
3
+ *
4
+ * This provider bypasses all authentication checks and returns a configurable
5
+ * anonymous user for all requests. Use only in development or testing environments.
6
+ *
7
+ * WARNING: Never use this provider in production!
8
+ */
9
+ import type { AuthProvider, AuthRequest } from '../auth_provider.js';
10
+ import type { AuthenticatedUser } from '../types.js';
11
+ /**
12
+ * Authentication provider that bypasses authentication.
13
+ *
14
+ * All requests are treated as authenticated with a configurable anonymous user.
15
+ * This provider is useful for development and testing when you don't want to
16
+ * set up authentication infrastructure.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * // Development setup
21
+ * const provider = new NoAuthProvider('dev-user-123')
22
+ *
23
+ * // All requests return the same user
24
+ * const user = provider.parseRequest(req) // { id: 'dev-user-123', roles: ['user'] }
25
+ * provider.hasValidAuth(req) // always true
26
+ * provider.isAdmin(req) // always false
27
+ * ```
28
+ */
29
+ export declare class NoAuthProvider implements AuthProvider {
30
+ #private;
31
+ /**
32
+ * Creates a new NoAuthProvider.
33
+ *
34
+ * @param anonymousUserId - User ID for the anonymous user (default: 'anonymous')
35
+ * @param anonymousRoles - Roles for the anonymous user (default: ['anonymous'])
36
+ */
37
+ constructor(anonymousUserId?: string, anonymousRoles?: string[]);
38
+ /**
39
+ * Returns the anonymous user for all requests.
40
+ *
41
+ * @returns Anonymous user with configured ID and roles
42
+ */
43
+ parseRequest(_req: AuthRequest): AuthenticatedUser | null;
44
+ /**
45
+ * Always returns true (all requests are "authenticated").
46
+ */
47
+ hasValidAuth(_req: AuthRequest): boolean;
48
+ /**
49
+ * Always returns false (anonymous user is never admin).
50
+ */
51
+ isAdmin(_req: AuthRequest): boolean;
52
+ /**
53
+ * Returns the anonymous user ID.
54
+ */
55
+ getUserId(_req: AuthRequest): string | null;
56
+ /**
57
+ * Returns the anonymous user roles.
58
+ */
59
+ getUserRoles(_req: AuthRequest): string[];
60
+ }
61
+ //# sourceMappingURL=no_auth_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no_auth_provider.d.ts","sourceRoot":"","sources":["../../../src/auth/providers/no_auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAe,YAAW,YAAY;;IAI/C;;;;;OAKG;gBACS,eAAe,SAAc,EAAE,cAAc,GAAE,MAAM,EAAkB;IAKnF;;;;OAIG;IACH,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI;IAOzD;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAIxC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAInC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAI3C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE;CAG5C"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @fileoverview No-authentication provider for development and testing.
3
+ *
4
+ * This provider bypasses all authentication checks and returns a configurable
5
+ * anonymous user for all requests. Use only in development or testing environments.
6
+ *
7
+ * WARNING: Never use this provider in production!
8
+ */
9
+ /**
10
+ * Authentication provider that bypasses authentication.
11
+ *
12
+ * All requests are treated as authenticated with a configurable anonymous user.
13
+ * This provider is useful for development and testing when you don't want to
14
+ * set up authentication infrastructure.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * // Development setup
19
+ * const provider = new NoAuthProvider('dev-user-123')
20
+ *
21
+ * // All requests return the same user
22
+ * const user = provider.parseRequest(req) // { id: 'dev-user-123', roles: ['user'] }
23
+ * provider.hasValidAuth(req) // always true
24
+ * provider.isAdmin(req) // always false
25
+ * ```
26
+ */
27
+ export class NoAuthProvider {
28
+ #anonymousUserId;
29
+ #anonymousRoles;
30
+ /**
31
+ * Creates a new NoAuthProvider.
32
+ *
33
+ * @param anonymousUserId - User ID for the anonymous user (default: 'anonymous')
34
+ * @param anonymousRoles - Roles for the anonymous user (default: ['anonymous'])
35
+ */
36
+ constructor(anonymousUserId = 'anonymous', anonymousRoles = ['anonymous']) {
37
+ this.#anonymousUserId = anonymousUserId;
38
+ this.#anonymousRoles = anonymousRoles;
39
+ }
40
+ /**
41
+ * Returns the anonymous user for all requests.
42
+ *
43
+ * @returns Anonymous user with configured ID and roles
44
+ */
45
+ parseRequest(_req) {
46
+ return {
47
+ id: this.#anonymousUserId,
48
+ roles: this.#anonymousRoles
49
+ };
50
+ }
51
+ /**
52
+ * Always returns true (all requests are "authenticated").
53
+ */
54
+ hasValidAuth(_req) {
55
+ return true;
56
+ }
57
+ /**
58
+ * Always returns false (anonymous user is never admin).
59
+ */
60
+ isAdmin(_req) {
61
+ return false;
62
+ }
63
+ /**
64
+ * Returns the anonymous user ID.
65
+ */
66
+ getUserId(_req) {
67
+ return this.#anonymousUserId;
68
+ }
69
+ /**
70
+ * Returns the anonymous user roles.
71
+ */
72
+ getUserRoles(_req) {
73
+ return this.#anonymousRoles;
74
+ }
75
+ }
76
+ //# sourceMappingURL=no_auth_provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no_auth_provider.js","sourceRoot":"","sources":["../../../src/auth/providers/no_auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,cAAc;IACd,gBAAgB,CAAQ;IACxB,eAAe,CAAU;IAElC;;;;;OAKG;IACH,YAAY,eAAe,GAAG,WAAW,EAAE,iBAA2B,CAAC,WAAW,CAAC;QAC/E,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAA;QACvC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAA;IACzC,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,IAAiB;QAC1B,OAAO;YACH,EAAE,EAAE,IAAI,CAAC,gBAAgB;YACzB,KAAK,EAAE,IAAI,CAAC,eAAe;SAC9B,CAAA;IACL,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAiB;QAC1B,OAAO,IAAI,CAAA;IACf,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAiB;QACrB,OAAO,KAAK,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAiB;QACvB,OAAO,IAAI,CAAC,gBAAgB,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAiB;QAC1B,OAAO,IAAI,CAAC,eAAe,CAAA;IAC/B,CAAC;CACJ"}