digitaltwin-core 0.14.2 → 1.0.0

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 (227) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +494 -359
  3. package/dist/auth/apisix_parser.d.ts +141 -0
  4. package/dist/auth/apisix_parser.d.ts.map +1 -0
  5. package/dist/auth/apisix_parser.js +161 -0
  6. package/dist/auth/apisix_parser.js.map +1 -0
  7. package/dist/auth/auth_config.d.ts +126 -0
  8. package/dist/auth/auth_config.d.ts.map +1 -0
  9. package/dist/auth/auth_config.js +169 -0
  10. package/dist/auth/auth_config.js.map +1 -0
  11. package/dist/auth/auth_provider.d.ts +118 -0
  12. package/dist/auth/auth_provider.d.ts.map +1 -0
  13. package/dist/auth/auth_provider.js +8 -0
  14. package/dist/auth/auth_provider.js.map +1 -0
  15. package/dist/auth/auth_provider_factory.d.ts +91 -0
  16. package/dist/auth/auth_provider_factory.d.ts.map +1 -0
  17. package/dist/auth/auth_provider_factory.js +146 -0
  18. package/dist/auth/auth_provider_factory.js.map +1 -0
  19. package/dist/auth/index.d.ts +8 -0
  20. package/dist/auth/index.d.ts.map +1 -0
  21. package/dist/auth/index.js +7 -0
  22. package/dist/auth/index.js.map +1 -0
  23. package/dist/auth/providers/gateway_auth_provider.d.ts +78 -0
  24. package/dist/auth/providers/gateway_auth_provider.d.ts.map +1 -0
  25. package/dist/auth/providers/gateway_auth_provider.js +109 -0
  26. package/dist/auth/providers/gateway_auth_provider.js.map +1 -0
  27. package/dist/auth/providers/index.d.ts +4 -0
  28. package/dist/auth/providers/index.d.ts.map +1 -0
  29. package/dist/auth/providers/index.js +4 -0
  30. package/dist/auth/providers/index.js.map +1 -0
  31. package/dist/auth/providers/jwt_auth_provider.d.ts +91 -0
  32. package/dist/auth/providers/jwt_auth_provider.d.ts.map +1 -0
  33. package/dist/auth/providers/jwt_auth_provider.js +204 -0
  34. package/dist/auth/providers/jwt_auth_provider.js.map +1 -0
  35. package/dist/auth/providers/no_auth_provider.d.ts +61 -0
  36. package/dist/auth/providers/no_auth_provider.d.ts.map +1 -0
  37. package/dist/auth/providers/no_auth_provider.js +76 -0
  38. package/dist/auth/providers/no_auth_provider.js.map +1 -0
  39. package/dist/auth/types.d.ts +100 -0
  40. package/dist/auth/types.d.ts.map +1 -0
  41. package/dist/auth/types.js +2 -0
  42. package/dist/auth/types.js.map +1 -0
  43. package/dist/auth/user_service.d.ts +86 -0
  44. package/dist/auth/user_service.d.ts.map +1 -0
  45. package/dist/auth/user_service.js +237 -0
  46. package/dist/auth/user_service.js.map +1 -0
  47. package/dist/components/assets_manager.d.ts +662 -0
  48. package/dist/components/assets_manager.d.ts.map +1 -0
  49. package/dist/components/assets_manager.js +1537 -0
  50. package/dist/components/assets_manager.js.map +1 -0
  51. package/dist/components/async_upload.d.ts +20 -0
  52. package/dist/components/async_upload.d.ts.map +1 -0
  53. package/dist/components/async_upload.js +10 -0
  54. package/dist/components/async_upload.js.map +1 -0
  55. package/dist/components/collector.d.ts +203 -0
  56. package/dist/components/collector.d.ts.map +1 -0
  57. package/dist/components/collector.js +214 -0
  58. package/dist/components/collector.js.map +1 -0
  59. package/dist/components/custom_table_manager.d.ts +503 -0
  60. package/dist/components/custom_table_manager.d.ts.map +1 -0
  61. package/dist/components/custom_table_manager.js +1023 -0
  62. package/dist/components/custom_table_manager.js.map +1 -0
  63. package/dist/components/global_assets_handler.d.ts +63 -0
  64. package/dist/components/global_assets_handler.d.ts.map +1 -0
  65. package/dist/components/global_assets_handler.js +127 -0
  66. package/dist/components/global_assets_handler.js.map +1 -0
  67. package/dist/components/handler.d.ts +104 -0
  68. package/dist/components/handler.d.ts.map +1 -0
  69. package/dist/components/handler.js +110 -0
  70. package/dist/components/handler.js.map +1 -0
  71. package/dist/components/harvester.d.ts +182 -0
  72. package/dist/components/harvester.d.ts.map +1 -0
  73. package/dist/components/harvester.js +406 -0
  74. package/dist/components/harvester.js.map +1 -0
  75. package/dist/components/index.d.ts +11 -0
  76. package/dist/components/index.d.ts.map +1 -0
  77. package/dist/components/index.js +9 -0
  78. package/dist/components/index.js.map +1 -0
  79. package/dist/components/interfaces.d.ts +126 -0
  80. package/dist/components/interfaces.d.ts.map +1 -0
  81. package/dist/components/interfaces.js +8 -0
  82. package/dist/components/interfaces.js.map +1 -0
  83. package/dist/components/map_manager.d.ts +61 -0
  84. package/dist/components/map_manager.d.ts.map +1 -0
  85. package/dist/components/map_manager.js +242 -0
  86. package/dist/components/map_manager.js.map +1 -0
  87. package/dist/components/tileset_manager.d.ts +125 -0
  88. package/dist/components/tileset_manager.d.ts.map +1 -0
  89. package/dist/components/tileset_manager.js +623 -0
  90. package/dist/components/tileset_manager.js.map +1 -0
  91. package/dist/components/types.d.ts +226 -0
  92. package/dist/components/types.d.ts.map +1 -0
  93. package/dist/components/types.js +8 -0
  94. package/dist/components/types.js.map +1 -0
  95. package/dist/database/adapters/knex_database_adapter.d.ts +97 -0
  96. package/dist/database/adapters/knex_database_adapter.d.ts.map +1 -0
  97. package/dist/database/adapters/knex_database_adapter.js +729 -0
  98. package/dist/database/adapters/knex_database_adapter.js.map +1 -0
  99. package/dist/database/database_adapter.d.ts +262 -0
  100. package/dist/database/database_adapter.d.ts.map +1 -0
  101. package/dist/database/database_adapter.js +46 -0
  102. package/dist/database/database_adapter.js.map +1 -0
  103. package/dist/engine/digital_twin_engine.d.ts +295 -0
  104. package/dist/engine/digital_twin_engine.d.ts.map +1 -0
  105. package/dist/engine/digital_twin_engine.js +907 -0
  106. package/dist/engine/digital_twin_engine.js.map +1 -0
  107. package/dist/engine/endpoints.d.ts +47 -0
  108. package/dist/engine/endpoints.d.ts.map +1 -0
  109. package/dist/engine/endpoints.js +88 -0
  110. package/dist/engine/endpoints.js.map +1 -0
  111. package/dist/engine/error_handler.d.ts +20 -0
  112. package/dist/engine/error_handler.d.ts.map +1 -0
  113. package/dist/engine/error_handler.js +69 -0
  114. package/dist/engine/error_handler.js.map +1 -0
  115. package/dist/engine/events.d.ts +93 -0
  116. package/dist/engine/events.d.ts.map +1 -0
  117. package/dist/engine/events.js +71 -0
  118. package/dist/engine/events.js.map +1 -0
  119. package/dist/engine/health.d.ts +112 -0
  120. package/dist/engine/health.d.ts.map +1 -0
  121. package/dist/engine/health.js +190 -0
  122. package/dist/engine/health.js.map +1 -0
  123. package/dist/engine/initializer.d.ts +62 -0
  124. package/dist/engine/initializer.d.ts.map +1 -0
  125. package/dist/engine/initializer.js +108 -0
  126. package/dist/engine/initializer.js.map +1 -0
  127. package/dist/engine/queue_manager.d.ts +87 -0
  128. package/dist/engine/queue_manager.d.ts.map +1 -0
  129. package/dist/engine/queue_manager.js +196 -0
  130. package/dist/engine/queue_manager.js.map +1 -0
  131. package/dist/engine/scheduler.d.ts +30 -0
  132. package/dist/engine/scheduler.d.ts.map +1 -0
  133. package/dist/engine/scheduler.js +378 -0
  134. package/dist/engine/scheduler.js.map +1 -0
  135. package/dist/engine/upload_processor.d.ts +36 -0
  136. package/dist/engine/upload_processor.d.ts.map +1 -0
  137. package/dist/engine/upload_processor.js +113 -0
  138. package/dist/engine/upload_processor.js.map +1 -0
  139. package/dist/env/env.d.ts +134 -0
  140. package/dist/env/env.d.ts.map +1 -0
  141. package/dist/env/env.js +177 -0
  142. package/dist/env/env.js.map +1 -0
  143. package/dist/errors/index.d.ts +94 -0
  144. package/dist/errors/index.d.ts.map +1 -0
  145. package/dist/errors/index.js +149 -0
  146. package/dist/errors/index.js.map +1 -0
  147. package/dist/index.d.ts +55 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +65 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/openapi/generator.d.ts +93 -0
  152. package/dist/openapi/generator.d.ts.map +1 -0
  153. package/dist/openapi/generator.js +293 -0
  154. package/dist/openapi/generator.js.map +1 -0
  155. package/dist/openapi/index.d.ts +9 -0
  156. package/dist/openapi/index.d.ts.map +1 -0
  157. package/dist/openapi/index.js +9 -0
  158. package/dist/openapi/index.js.map +1 -0
  159. package/dist/openapi/types.d.ts +182 -0
  160. package/dist/openapi/types.d.ts.map +1 -0
  161. package/dist/openapi/types.js +16 -0
  162. package/dist/openapi/types.js.map +1 -0
  163. package/dist/storage/adapters/local_storage_service.d.ts +57 -0
  164. package/dist/storage/adapters/local_storage_service.d.ts.map +1 -0
  165. package/dist/storage/adapters/local_storage_service.js +132 -0
  166. package/dist/storage/adapters/local_storage_service.js.map +1 -0
  167. package/dist/storage/adapters/ovh_storage_service.d.ts +72 -0
  168. package/dist/storage/adapters/ovh_storage_service.d.ts.map +1 -0
  169. package/dist/storage/adapters/ovh_storage_service.js +205 -0
  170. package/dist/storage/adapters/ovh_storage_service.js.map +1 -0
  171. package/dist/storage/storage_factory.d.ts +14 -0
  172. package/dist/storage/storage_factory.d.ts.map +1 -0
  173. package/dist/storage/storage_factory.js +43 -0
  174. package/dist/storage/storage_factory.js.map +1 -0
  175. package/dist/storage/storage_service.d.ts +163 -0
  176. package/dist/storage/storage_service.d.ts.map +1 -0
  177. package/dist/storage/storage_service.js +58 -0
  178. package/dist/storage/storage_service.js.map +1 -0
  179. package/dist/types/data_record.d.ts +123 -0
  180. package/dist/types/data_record.d.ts.map +1 -0
  181. package/dist/types/data_record.js +8 -0
  182. package/dist/types/data_record.js.map +1 -0
  183. package/dist/utils/graceful_shutdown.d.ts +44 -0
  184. package/dist/utils/graceful_shutdown.d.ts.map +1 -0
  185. package/dist/utils/graceful_shutdown.js +79 -0
  186. package/dist/utils/graceful_shutdown.js.map +1 -0
  187. package/dist/utils/http_responses.d.ts +175 -0
  188. package/dist/utils/http_responses.d.ts.map +1 -0
  189. package/dist/utils/http_responses.js +216 -0
  190. package/dist/utils/http_responses.js.map +1 -0
  191. package/dist/utils/index.d.ts +8 -0
  192. package/dist/utils/index.d.ts.map +1 -0
  193. package/dist/utils/index.js +6 -0
  194. package/dist/utils/index.js.map +1 -0
  195. package/dist/utils/logger.d.ts +74 -0
  196. package/dist/utils/logger.d.ts.map +1 -0
  197. package/dist/utils/logger.js +92 -0
  198. package/dist/utils/logger.js.map +1 -0
  199. package/dist/utils/map_to_data_record.d.ts +10 -0
  200. package/dist/utils/map_to_data_record.d.ts.map +1 -0
  201. package/dist/utils/map_to_data_record.js +36 -0
  202. package/dist/utils/map_to_data_record.js.map +1 -0
  203. package/dist/utils/safe_async.d.ts +50 -0
  204. package/dist/utils/safe_async.d.ts.map +1 -0
  205. package/dist/utils/safe_async.js +90 -0
  206. package/dist/utils/safe_async.js.map +1 -0
  207. package/dist/utils/servable_endpoint.d.ts +63 -0
  208. package/dist/utils/servable_endpoint.d.ts.map +1 -0
  209. package/dist/utils/servable_endpoint.js +67 -0
  210. package/dist/utils/servable_endpoint.js.map +1 -0
  211. package/dist/utils/zip_utils.d.ts +66 -0
  212. package/dist/utils/zip_utils.d.ts.map +1 -0
  213. package/dist/utils/zip_utils.js +169 -0
  214. package/dist/utils/zip_utils.js.map +1 -0
  215. package/dist/validation/index.d.ts +3 -0
  216. package/dist/validation/index.d.ts.map +1 -0
  217. package/dist/validation/index.js +7 -0
  218. package/dist/validation/index.js.map +1 -0
  219. package/dist/validation/schemas.d.ts +273 -0
  220. package/dist/validation/schemas.d.ts.map +1 -0
  221. package/dist/validation/schemas.js +82 -0
  222. package/dist/validation/schemas.js.map +1 -0
  223. package/dist/validation/validate.d.ts +49 -0
  224. package/dist/validation/validate.d.ts.map +1 -0
  225. package/dist/validation/validate.js +110 -0
  226. package/dist/validation/validate.js.map +1 -0
  227. package/package.json +23 -13
@@ -0,0 +1,118 @@
1
+ /**
2
+ * @fileoverview Authentication provider interface and types for the Digital Twin framework.
3
+ *
4
+ * This module defines the contract for authentication providers, allowing the framework
5
+ * to support multiple authentication mechanisms (gateway headers, JWT tokens, etc.).
6
+ */
7
+ import type { AuthenticatedUser } from './types.js';
8
+ /**
9
+ * Authentication mode for the Digital Twin framework.
10
+ *
11
+ * - `gateway`: Parse authentication from gateway headers (x-user-id, x-user-roles)
12
+ * - `jwt`: Validate JWT tokens from Authorization header
13
+ * - `none`: Disable authentication (development/testing only)
14
+ */
15
+ export type AuthMode = 'gateway' | 'jwt' | 'none';
16
+ /**
17
+ * JWT-specific configuration options.
18
+ */
19
+ export interface JwtConfig {
20
+ /** Secret key for HMAC algorithms (HS256, HS384, HS512) */
21
+ secret?: string;
22
+ /** Public key for RSA/EC algorithms (RS256, RS384, RS512, ES256, ES384, ES512) */
23
+ publicKey?: string;
24
+ /** JWT algorithm (default: 'HS256') */
25
+ algorithm?: string;
26
+ /** Expected token issuer for validation */
27
+ issuer?: string;
28
+ /** Expected token audience for validation */
29
+ audience?: string;
30
+ /** Claim name for user ID (default: 'sub') */
31
+ userIdClaim?: string;
32
+ /** Claim name for roles (default: 'roles', supports nested paths like 'realm_access.roles') */
33
+ rolesClaim?: string;
34
+ }
35
+ /**
36
+ * Authentication configuration for the Digital Twin framework.
37
+ */
38
+ export interface AuthProviderConfig {
39
+ /** Authentication mode */
40
+ mode: AuthMode;
41
+ /** Name of the admin role (default: 'admin') */
42
+ adminRoleName?: string;
43
+ /** JWT-specific configuration (required when mode is 'jwt') */
44
+ jwt?: JwtConfig;
45
+ /** Anonymous user ID for 'none' mode (default: 'anonymous') */
46
+ anonymousUserId?: string;
47
+ }
48
+ /**
49
+ * Request-like object for authentication parsing.
50
+ *
51
+ * This interface allows the auth provider to work with any request object
52
+ * that has headers, without requiring a full Express Request.
53
+ */
54
+ export interface AuthRequest {
55
+ /** Request headers */
56
+ headers: Record<string, string | string[] | undefined>;
57
+ }
58
+ /**
59
+ * Authentication provider interface.
60
+ *
61
+ * Implement this interface to create custom authentication mechanisms.
62
+ * The framework provides three built-in providers:
63
+ * - GatewayAuthProvider: For API gateway authentication (Apache APISIX, KrakenD)
64
+ * - JwtAuthProvider: For direct JWT token validation
65
+ * - NoAuthProvider: For development/testing without authentication
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * // Using the factory (recommended)
70
+ * const provider = AuthProviderFactory.fromEnv()
71
+ *
72
+ * // In a handler
73
+ * const user = provider.parseRequest(req)
74
+ * if (!user) {
75
+ * return { status: 401, content: 'Authentication required' }
76
+ * }
77
+ * ```
78
+ */
79
+ export interface AuthProvider {
80
+ /**
81
+ * Parse the request and return the authenticated user.
82
+ *
83
+ * @param req - Request object with headers
84
+ * @returns Authenticated user, or null if not authenticated or invalid
85
+ */
86
+ parseRequest(req: AuthRequest): AuthenticatedUser | null;
87
+ /**
88
+ * Check if the request has valid authentication.
89
+ *
90
+ * This is a quick check that can be used before full parsing.
91
+ *
92
+ * @param req - Request object with headers
93
+ * @returns true if the request has valid authentication credentials
94
+ */
95
+ hasValidAuth(req: AuthRequest): boolean;
96
+ /**
97
+ * Check if the authenticated user has admin privileges.
98
+ *
99
+ * @param req - Request object with headers
100
+ * @returns true if the user has the admin role
101
+ */
102
+ isAdmin(req: AuthRequest): boolean;
103
+ /**
104
+ * Get the user ID from the request.
105
+ *
106
+ * @param req - Request object with headers
107
+ * @returns User ID, or null if not authenticated
108
+ */
109
+ getUserId(req: AuthRequest): string | null;
110
+ /**
111
+ * Get the user roles from the request.
112
+ *
113
+ * @param req - Request object with headers
114
+ * @returns Array of role names, empty array if not authenticated
115
+ */
116
+ getUserRoles(req: AuthRequest): string[];
117
+ }
118
+ //# sourceMappingURL=auth_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth_provider.d.ts","sourceRoot":"","sources":["../../src/auth/auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,CAAA;AAEjD;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,0BAA0B;IAC1B,IAAI,EAAE,QAAQ,CAAA;IACd,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,SAAS,CAAA;IACf,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IACxB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;CACzD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,YAAY;IACzB;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI,CAAA;IAExD;;;;;;;OAOG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAA;IAEvC;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAA;IAElC;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAAA;IAE1C;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE,CAAA;CAC3C"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @fileoverview Authentication provider interface and types for the Digital Twin framework.
3
+ *
4
+ * This module defines the contract for authentication providers, allowing the framework
5
+ * to support multiple authentication mechanisms (gateway headers, JWT tokens, etc.).
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=auth_provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth_provider.js","sourceRoot":"","sources":["../../src/auth/auth_provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * @fileoverview Factory for creating authentication providers.
3
+ *
4
+ * This module provides a factory for creating the appropriate authentication
5
+ * provider based on configuration or environment variables.
6
+ */
7
+ import type { AuthProvider, AuthProviderConfig } from './auth_provider.js';
8
+ /**
9
+ * Factory for creating authentication providers.
10
+ *
11
+ * Use this factory to create the appropriate authentication provider based on
12
+ * configuration or environment variables.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * // Create from environment variables (recommended)
17
+ * const provider = AuthProviderFactory.fromEnv()
18
+ *
19
+ * // Create from explicit configuration
20
+ * const provider = AuthProviderFactory.create({
21
+ * mode: 'jwt',
22
+ * jwt: { secret: 'your-secret' }
23
+ * })
24
+ * ```
25
+ */
26
+ export declare class AuthProviderFactory {
27
+ /**
28
+ * Create an authentication provider from explicit configuration.
29
+ *
30
+ * @param config - Authentication configuration
31
+ * @returns Configured authentication provider
32
+ * @throws Error if configuration is invalid
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * // Gateway mode (default)
37
+ * const provider = AuthProviderFactory.create({ mode: 'gateway' })
38
+ *
39
+ * // JWT mode
40
+ * const provider = AuthProviderFactory.create({
41
+ * mode: 'jwt',
42
+ * jwt: { secret: 'your-secret', algorithm: 'HS256' }
43
+ * })
44
+ *
45
+ * // No auth mode (development only)
46
+ * const provider = AuthProviderFactory.create({ mode: 'none' })
47
+ * ```
48
+ */
49
+ static create(config: AuthProviderConfig): AuthProvider;
50
+ /**
51
+ * Create an authentication provider from environment variables.
52
+ *
53
+ * Environment variables:
54
+ * - `AUTH_MODE`: Authentication mode ('gateway', 'jwt', 'none'). Default: 'gateway'
55
+ * - `AUTH_ADMIN_ROLE`: Name of admin role. Default: 'admin'
56
+ *
57
+ * For JWT mode:
58
+ * - `JWT_SECRET`: Secret key for HMAC algorithms
59
+ * - `JWT_PUBLIC_KEY`: Public key content for RSA/EC algorithms
60
+ * - `JWT_PUBLIC_KEY_FILE`: Path to public key file
61
+ * - `JWT_ALGORITHM`: Algorithm (default: 'HS256')
62
+ * - `JWT_ISSUER`: Expected token issuer
63
+ * - `JWT_AUDIENCE`: Expected token audience
64
+ * - `JWT_USER_ID_CLAIM`: Claim for user ID (default: 'sub')
65
+ * - `JWT_ROLES_CLAIM`: Claim for roles (default: 'roles')
66
+ *
67
+ * For no-auth mode:
68
+ * - `DIGITALTWIN_DISABLE_AUTH`: Set to 'true' to disable auth
69
+ * - `DIGITALTWIN_ANONYMOUS_USER_ID`: Anonymous user ID (default: 'anonymous')
70
+ *
71
+ * @returns Configured authentication provider
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * // Gateway mode (default, no env vars needed)
76
+ * // AUTH_MODE=gateway or not set
77
+ * const provider = AuthProviderFactory.fromEnv()
78
+ *
79
+ * // JWT mode
80
+ * // AUTH_MODE=jwt
81
+ * // JWT_SECRET=your-secret
82
+ * const provider = AuthProviderFactory.fromEnv()
83
+ *
84
+ * // Disable auth for development
85
+ * // DIGITALTWIN_DISABLE_AUTH=true
86
+ * const provider = AuthProviderFactory.fromEnv()
87
+ * ```
88
+ */
89
+ static fromEnv(): AuthProvider;
90
+ }
91
+ //# sourceMappingURL=auth_provider_factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth_provider_factory.d.ts","sourceRoot":"","sources":["../../src/auth/auth_provider_factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAY,MAAM,oBAAoB,CAAA;AAKpF;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,mBAAmB;IAC5B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY;IAgBvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,MAAM,CAAC,OAAO,IAAI,YAAY;CAkDjC"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * @fileoverview Factory for creating authentication providers.
3
+ *
4
+ * This module provides a factory for creating the appropriate authentication
5
+ * provider based on configuration or environment variables.
6
+ */
7
+ import * as fs from 'fs';
8
+ import { GatewayAuthProvider } from './providers/gateway_auth_provider.js';
9
+ import { JwtAuthProvider } from './providers/jwt_auth_provider.js';
10
+ import { NoAuthProvider } from './providers/no_auth_provider.js';
11
+ /**
12
+ * Factory for creating authentication providers.
13
+ *
14
+ * Use this factory to create the appropriate authentication provider based on
15
+ * configuration or environment variables.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * // Create from environment variables (recommended)
20
+ * const provider = AuthProviderFactory.fromEnv()
21
+ *
22
+ * // Create from explicit configuration
23
+ * const provider = AuthProviderFactory.create({
24
+ * mode: 'jwt',
25
+ * jwt: { secret: 'your-secret' }
26
+ * })
27
+ * ```
28
+ */
29
+ export class AuthProviderFactory {
30
+ /**
31
+ * Create an authentication provider from explicit configuration.
32
+ *
33
+ * @param config - Authentication configuration
34
+ * @returns Configured authentication provider
35
+ * @throws Error if configuration is invalid
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * // Gateway mode (default)
40
+ * const provider = AuthProviderFactory.create({ mode: 'gateway' })
41
+ *
42
+ * // JWT mode
43
+ * const provider = AuthProviderFactory.create({
44
+ * mode: 'jwt',
45
+ * jwt: { secret: 'your-secret', algorithm: 'HS256' }
46
+ * })
47
+ *
48
+ * // No auth mode (development only)
49
+ * const provider = AuthProviderFactory.create({ mode: 'none' })
50
+ * ```
51
+ */
52
+ static create(config) {
53
+ switch (config.mode) {
54
+ case 'gateway':
55
+ return new GatewayAuthProvider(config.adminRoleName);
56
+ case 'jwt':
57
+ return new JwtAuthProvider(config);
58
+ case 'none':
59
+ return new NoAuthProvider(config.anonymousUserId);
60
+ default:
61
+ throw new Error(`Unknown auth mode: ${config.mode}`);
62
+ }
63
+ }
64
+ /**
65
+ * Create an authentication provider from environment variables.
66
+ *
67
+ * Environment variables:
68
+ * - `AUTH_MODE`: Authentication mode ('gateway', 'jwt', 'none'). Default: 'gateway'
69
+ * - `AUTH_ADMIN_ROLE`: Name of admin role. Default: 'admin'
70
+ *
71
+ * For JWT mode:
72
+ * - `JWT_SECRET`: Secret key for HMAC algorithms
73
+ * - `JWT_PUBLIC_KEY`: Public key content for RSA/EC algorithms
74
+ * - `JWT_PUBLIC_KEY_FILE`: Path to public key file
75
+ * - `JWT_ALGORITHM`: Algorithm (default: 'HS256')
76
+ * - `JWT_ISSUER`: Expected token issuer
77
+ * - `JWT_AUDIENCE`: Expected token audience
78
+ * - `JWT_USER_ID_CLAIM`: Claim for user ID (default: 'sub')
79
+ * - `JWT_ROLES_CLAIM`: Claim for roles (default: 'roles')
80
+ *
81
+ * For no-auth mode:
82
+ * - `DIGITALTWIN_DISABLE_AUTH`: Set to 'true' to disable auth
83
+ * - `DIGITALTWIN_ANONYMOUS_USER_ID`: Anonymous user ID (default: 'anonymous')
84
+ *
85
+ * @returns Configured authentication provider
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * // Gateway mode (default, no env vars needed)
90
+ * // AUTH_MODE=gateway or not set
91
+ * const provider = AuthProviderFactory.fromEnv()
92
+ *
93
+ * // JWT mode
94
+ * // AUTH_MODE=jwt
95
+ * // JWT_SECRET=your-secret
96
+ * const provider = AuthProviderFactory.fromEnv()
97
+ *
98
+ * // Disable auth for development
99
+ * // DIGITALTWIN_DISABLE_AUTH=true
100
+ * const provider = AuthProviderFactory.fromEnv()
101
+ * ```
102
+ */
103
+ static fromEnv() {
104
+ const adminRoleName = process.env.AUTH_ADMIN_ROLE || process.env.DIGITALTWIN_ADMIN_ROLE_NAME || 'admin';
105
+ // Check if auth is disabled (legacy env var)
106
+ if (process.env.DIGITALTWIN_DISABLE_AUTH === 'true') {
107
+ return new NoAuthProvider(process.env.DIGITALTWIN_ANONYMOUS_USER_ID || 'anonymous');
108
+ }
109
+ const mode = (process.env.AUTH_MODE || 'gateway');
110
+ if (mode === 'none') {
111
+ return new NoAuthProvider(process.env.DIGITALTWIN_ANONYMOUS_USER_ID || 'anonymous');
112
+ }
113
+ if (mode === 'gateway') {
114
+ return new GatewayAuthProvider(adminRoleName);
115
+ }
116
+ if (mode === 'jwt') {
117
+ // Load public key from file if specified
118
+ let publicKey;
119
+ if (process.env.JWT_PUBLIC_KEY_FILE) {
120
+ publicKey = fs.readFileSync(process.env.JWT_PUBLIC_KEY_FILE, 'utf-8');
121
+ }
122
+ else if (process.env.JWT_PUBLIC_KEY) {
123
+ publicKey = process.env.JWT_PUBLIC_KEY;
124
+ }
125
+ const secret = process.env.JWT_SECRET;
126
+ if (!secret && !publicKey) {
127
+ throw new Error('JWT mode requires either JWT_SECRET or JWT_PUBLIC_KEY/JWT_PUBLIC_KEY_FILE');
128
+ }
129
+ return new JwtAuthProvider({
130
+ mode: 'jwt',
131
+ adminRoleName,
132
+ jwt: {
133
+ secret,
134
+ publicKey,
135
+ algorithm: process.env.JWT_ALGORITHM || 'HS256',
136
+ issuer: process.env.JWT_ISSUER,
137
+ audience: process.env.JWT_AUDIENCE,
138
+ userIdClaim: process.env.JWT_USER_ID_CLAIM || 'sub',
139
+ rolesClaim: process.env.JWT_ROLES_CLAIM || 'roles'
140
+ }
141
+ });
142
+ }
143
+ throw new Error(`Unknown AUTH_MODE: ${mode}`);
144
+ }
145
+ }
146
+ //# sourceMappingURL=auth_provider_factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth_provider_factory.js","sourceRoot":"","sources":["../../src/auth/auth_provider_factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAEhE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,mBAAmB;IAC5B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,MAAM,CAAC,MAA0B;QACpC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,SAAS;gBACV,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;YAExD,KAAK,KAAK;gBACN,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;YAEtC,KAAK,MAAM;gBACP,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;YAErD;gBACI,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5D,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,MAAM,CAAC,OAAO;QACV,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAA;QAEvG,6CAA6C;QAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,MAAM,EAAE,CAAC;YAClD,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,WAAW,CAAC,CAAA;QACvF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,SAAS,CAAa,CAAA;QAE7D,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAClB,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,WAAW,CAAC,CAAA;QACvF,CAAC;QAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,OAAO,IAAI,mBAAmB,CAAC,aAAa,CAAC,CAAA;QACjD,CAAC;QAED,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACjB,yCAAyC;YACzC,IAAI,SAA6B,CAAA;YACjC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;gBAClC,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;YACzE,CAAC;iBAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;gBACpC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;YAC1C,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;YAErC,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAA;YAChG,CAAC;YAED,OAAO,IAAI,eAAe,CAAC;gBACvB,IAAI,EAAE,KAAK;gBACX,aAAa;gBACb,GAAG,EAAE;oBACD,MAAM;oBACN,SAAS;oBACT,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO;oBAC/C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;oBAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;oBAClC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,KAAK;oBACnD,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO;iBACrD;aACJ,CAAC,CAAA;QACN,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAA;IACjD,CAAC;CACJ"}
@@ -0,0 +1,8 @@
1
+ export type { AuthProvider, AuthRequest, AuthMode, AuthProviderConfig, JwtConfig } from './auth_provider.js';
2
+ export { AuthProviderFactory } from './auth_provider_factory.js';
3
+ export { GatewayAuthProvider, JwtAuthProvider, NoAuthProvider } from './providers/index.js';
4
+ export { ApisixAuthParser } from './apisix_parser.js';
5
+ export { UserService } from './user_service.js';
6
+ export { AuthConfig } from './auth_config.js';
7
+ export type { AuthenticatedUser, UserRecord, AuthContext, AuthenticatedRequest } from './types.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC5G,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAG3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,7 @@
1
+ export { AuthProviderFactory } from './auth_provider_factory.js';
2
+ export { GatewayAuthProvider, JwtAuthProvider, NoAuthProvider } from './providers/index.js';
3
+ // Backward-compatible API
4
+ export { ApisixAuthParser } from './apisix_parser.js';
5
+ export { UserService } from './user_service.js';
6
+ export { AuthConfig } from './auth_config.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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,EAAE,MAAM,oBAAoB,CAAA;AACrD,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"}