bootifyjs 1.1.8 → 1.2.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 (190) hide show
  1. package/README.md +89 -0
  2. package/dist/api.d.ts +4 -0
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +25 -10
  5. package/dist/api.js.map +1 -1
  6. package/dist/auth/AuthManager.d.ts +68 -0
  7. package/dist/auth/AuthManager.d.ts.map +1 -0
  8. package/dist/auth/AuthManager.js +239 -0
  9. package/dist/auth/AuthManager.js.map +1 -0
  10. package/dist/auth/examples/basic-usage.d.ts +29 -0
  11. package/dist/auth/examples/basic-usage.d.ts.map +1 -0
  12. package/dist/auth/examples/basic-usage.js +390 -0
  13. package/dist/auth/examples/basic-usage.js.map +1 -0
  14. package/dist/auth/index.d.ts +72 -0
  15. package/dist/auth/index.d.ts.map +1 -0
  16. package/dist/auth/index.js +118 -0
  17. package/dist/auth/index.js.map +1 -0
  18. package/dist/auth/middleware/AuthMiddleware.d.ts +110 -0
  19. package/dist/auth/middleware/AuthMiddleware.d.ts.map +1 -0
  20. package/dist/auth/middleware/AuthMiddleware.js +336 -0
  21. package/dist/auth/middleware/AuthMiddleware.js.map +1 -0
  22. package/dist/auth/storage/RedisTokenStorage.d.ts +92 -0
  23. package/dist/auth/storage/RedisTokenStorage.d.ts.map +1 -0
  24. package/dist/auth/storage/RedisTokenStorage.js +207 -0
  25. package/dist/auth/storage/RedisTokenStorage.js.map +1 -0
  26. package/dist/auth/strategies/ApiKeyStrategy.d.ts +64 -0
  27. package/dist/auth/strategies/ApiKeyStrategy.d.ts.map +1 -0
  28. package/dist/auth/strategies/ApiKeyStrategy.js +391 -0
  29. package/dist/auth/strategies/ApiKeyStrategy.js.map +1 -0
  30. package/dist/auth/strategies/JwtStrategy.d.ts +46 -0
  31. package/dist/auth/strategies/JwtStrategy.d.ts.map +1 -0
  32. package/dist/auth/strategies/JwtStrategy.js +310 -0
  33. package/dist/auth/strategies/JwtStrategy.js.map +1 -0
  34. package/dist/auth/types.d.ts +130 -0
  35. package/dist/auth/types.d.ts.map +1 -0
  36. package/dist/auth/types.js +50 -0
  37. package/dist/auth/types.js.map +1 -0
  38. package/dist/config/AppConfig.d.ts +4 -7
  39. package/dist/config/AppConfig.d.ts.map +1 -1
  40. package/dist/config/AppConfig.js +13 -6
  41. package/dist/config/AppConfig.js.map +1 -1
  42. package/dist/constants/index.d.ts +61 -0
  43. package/dist/constants/index.d.ts.map +1 -0
  44. package/dist/constants/index.js +75 -0
  45. package/dist/constants/index.js.map +1 -0
  46. package/dist/core/decorators.d.ts +7 -7
  47. package/dist/core/decorators.d.ts.map +1 -1
  48. package/dist/core/decorators.js +8 -7
  49. package/dist/core/decorators.js.map +1 -1
  50. package/dist/core/di-container.d.ts +1 -1
  51. package/dist/core/di-container.d.ts.map +1 -1
  52. package/dist/core/di-container.js +3 -3
  53. package/dist/core/di-container.js.map +1 -1
  54. package/dist/events/event-bus.service.d.ts.map +1 -1
  55. package/dist/events/event-bus.service.js +2 -0
  56. package/dist/events/event-bus.service.js.map +1 -1
  57. package/dist/examples/auth/auth.middleware.d.ts +27 -0
  58. package/dist/examples/auth/auth.middleware.d.ts.map +1 -0
  59. package/dist/examples/auth/auth.middleware.js +187 -0
  60. package/dist/examples/auth/auth.middleware.js.map +1 -0
  61. package/dist/examples/auth/authorization.middleware.d.ts +1 -0
  62. package/dist/examples/auth/authorization.middleware.d.ts.map +1 -0
  63. package/dist/examples/auth/authorization.middleware.js +2 -0
  64. package/dist/examples/auth/authorization.middleware.js.map +1 -0
  65. package/dist/examples/auth/context.extractor.d.ts +1 -0
  66. package/dist/examples/auth/context.extractor.d.ts.map +1 -0
  67. package/dist/examples/auth/context.extractor.js +2 -0
  68. package/dist/examples/auth/context.extractor.js.map +1 -0
  69. package/dist/examples/auth/example.d.ts +1 -0
  70. package/dist/examples/auth/example.d.ts.map +1 -0
  71. package/dist/examples/auth/example.js +2 -0
  72. package/dist/examples/auth/example.js.map +1 -0
  73. package/dist/examples/auth/provider.d.ts +1 -0
  74. package/dist/examples/auth/provider.d.ts.map +1 -0
  75. package/dist/examples/auth/provider.js +2 -0
  76. package/dist/examples/auth/provider.js.map +1 -0
  77. package/dist/examples/auth/users.d.ts +1 -0
  78. package/dist/examples/auth/users.d.ts.map +1 -0
  79. package/dist/examples/auth/users.js +2 -0
  80. package/dist/examples/auth/users.js.map +1 -0
  81. package/dist/examples/authorization-examples.d.ts +67 -0
  82. package/dist/examples/authorization-examples.d.ts.map +1 -0
  83. package/dist/examples/authorization-examples.js +202 -0
  84. package/dist/examples/authorization-examples.js.map +1 -0
  85. package/dist/examples/controllers/auth.controller.d.ts +64 -0
  86. package/dist/examples/controllers/auth.controller.d.ts.map +1 -0
  87. package/dist/examples/controllers/auth.controller.js +284 -0
  88. package/dist/examples/controllers/auth.controller.js.map +1 -0
  89. package/dist/examples/controllers/health.controller.d.ts +1 -0
  90. package/dist/examples/controllers/health.controller.d.ts.map +1 -1
  91. package/dist/examples/controllers/health.controller.js +6 -0
  92. package/dist/examples/controllers/health.controller.js.map +1 -1
  93. package/dist/examples/controllers/todo-updated.controller.d.ts +103 -0
  94. package/dist/examples/controllers/todo-updated.controller.d.ts.map +1 -0
  95. package/dist/examples/controllers/todo-updated.controller.js +328 -0
  96. package/dist/examples/controllers/todo-updated.controller.js.map +1 -0
  97. package/dist/examples/controllers/todo-with-jwt-auth.controller.d.ts +114 -0
  98. package/dist/examples/controllers/todo-with-jwt-auth.controller.d.ts.map +1 -0
  99. package/dist/examples/controllers/todo-with-jwt-auth.controller.js +329 -0
  100. package/dist/examples/controllers/todo-with-jwt-auth.controller.js.map +1 -0
  101. package/dist/examples/controllers/todo.controller.d.ts +4 -2
  102. package/dist/examples/controllers/todo.controller.d.ts.map +1 -1
  103. package/dist/examples/controllers/todo.controller.js +44 -18
  104. package/dist/examples/controllers/todo.controller.js.map +1 -1
  105. package/dist/examples/events/TodoEventHandler.d.ts +4 -1
  106. package/dist/examples/events/TodoEventHandler.d.ts.map +1 -1
  107. package/dist/examples/events/TodoEventHandler.js +8 -4
  108. package/dist/examples/events/TodoEventHandler.js.map +1 -1
  109. package/dist/examples/global-middleware-example.d.ts +2 -0
  110. package/dist/examples/global-middleware-example.d.ts.map +1 -0
  111. package/dist/examples/global-middleware-example.js +94 -0
  112. package/dist/examples/global-middleware-example.js.map +1 -0
  113. package/dist/examples/index.d.ts.map +1 -1
  114. package/dist/examples/index.js +81 -25
  115. package/dist/examples/index.js.map +1 -1
  116. package/dist/examples/jwt-auth-example.d.ts +47 -0
  117. package/dist/examples/jwt-auth-example.d.ts.map +1 -0
  118. package/dist/examples/jwt-auth-example.js +316 -0
  119. package/dist/examples/jwt-auth-example.js.map +1 -0
  120. package/dist/examples/services/todo.service.d.ts +3 -2
  121. package/dist/examples/services/todo.service.d.ts.map +1 -1
  122. package/dist/examples/services/todo.service.js +12 -2
  123. package/dist/examples/services/todo.service.js.map +1 -1
  124. package/dist/examples/services/user.service.d.ts +99 -0
  125. package/dist/examples/services/user.service.d.ts.map +1 -0
  126. package/dist/examples/services/user.service.js +281 -0
  127. package/dist/examples/services/user.service.js.map +1 -0
  128. package/dist/examples/simple-auth-example.d.ts +7 -0
  129. package/dist/examples/simple-auth-example.d.ts.map +1 -0
  130. package/dist/examples/simple-auth-example.js +106 -0
  131. package/dist/examples/simple-auth-example.js.map +1 -0
  132. package/dist/examples/test-auth-flow.d.ts +56 -0
  133. package/dist/examples/test-auth-flow.d.ts.map +1 -0
  134. package/dist/examples/test-auth-flow.js +449 -0
  135. package/dist/examples/test-auth-flow.js.map +1 -0
  136. package/dist/examples/todos/schema.d.ts +8 -8
  137. package/dist/index.d.ts +1 -0
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +1 -0
  140. package/dist/index.js.map +1 -1
  141. package/dist/logging/config/logging.config.d.ts +0 -32
  142. package/dist/logging/config/logging.config.d.ts.map +1 -1
  143. package/dist/logging/config/logging.config.js +43 -49
  144. package/dist/logging/config/logging.config.js.map +1 -1
  145. package/dist/logging/core/logger.d.ts +2 -0
  146. package/dist/logging/core/logger.d.ts.map +1 -1
  147. package/dist/logging/core/logger.js +6 -0
  148. package/dist/logging/core/logger.js.map +1 -1
  149. package/dist/logging/core/logger.provider.d.ts.map +1 -1
  150. package/dist/logging/core/logger.provider.js +24 -12
  151. package/dist/logging/core/logger.provider.js.map +1 -1
  152. package/dist/logging/core/startup.logger.d.ts +1 -1
  153. package/dist/logging/core/startup.logger.d.ts.map +1 -1
  154. package/dist/logging/core/startup.logger.js +6 -3
  155. package/dist/logging/core/startup.logger.js.map +1 -1
  156. package/dist/logging/core/tracing.service.d.ts +32 -0
  157. package/dist/logging/core/tracing.service.d.ts.map +1 -0
  158. package/dist/logging/core/tracing.service.js +165 -0
  159. package/dist/logging/core/tracing.service.js.map +1 -0
  160. package/dist/logging/index.d.ts +1 -1
  161. package/dist/logging/index.d.ts.map +1 -1
  162. package/dist/logging/index.js +3 -2
  163. package/dist/logging/index.js.map +1 -1
  164. package/dist/middleware/auth-context.extractor.d.ts +5 -0
  165. package/dist/middleware/auth-context.extractor.d.ts.map +1 -0
  166. package/dist/middleware/auth-context.extractor.js +114 -0
  167. package/dist/middleware/auth-context.extractor.js.map +1 -0
  168. package/dist/middleware/auth.middleware.d.ts +16 -2
  169. package/dist/middleware/auth.middleware.d.ts.map +1 -1
  170. package/dist/middleware/auth.middleware.js +110 -13
  171. package/dist/middleware/auth.middleware.js.map +1 -1
  172. package/dist/middleware/authorization.middleware.d.ts +21 -0
  173. package/dist/middleware/authorization.middleware.d.ts.map +1 -0
  174. package/dist/middleware/authorization.middleware.js +55 -0
  175. package/dist/middleware/authorization.middleware.js.map +1 -0
  176. package/dist/middleware/context.middleware.d.ts +12 -2
  177. package/dist/middleware/context.middleware.d.ts.map +1 -1
  178. package/dist/middleware/context.middleware.js +43 -17
  179. package/dist/middleware/context.middleware.js.map +1 -1
  180. package/dist/middleware/index.d.ts +1 -0
  181. package/dist/middleware/index.d.ts.map +1 -1
  182. package/dist/middleware/request-logger.middleware.d.ts +2 -0
  183. package/dist/middleware/request-logger.middleware.d.ts.map +1 -1
  184. package/dist/middleware/request-logger.middleware.js +22 -1
  185. package/dist/middleware/request-logger.middleware.js.map +1 -1
  186. package/dist/middleware/tracing.middleware.d.ts +15 -0
  187. package/dist/middleware/tracing.middleware.d.ts.map +1 -0
  188. package/dist/middleware/tracing.middleware.js +36 -0
  189. package/dist/middleware/tracing.middleware.js.map +1 -0
  190. package/package.json +10 -2
package/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # BootifyJS: A Modern, Declarative Node.js Framework
2
+
3
+ **BootifyJS** is a powerful, modern, and developer-friendly web framework for Node.js, built on the high-performance foundations of **Fastify**. Inspired by the productivity and robust architecture of Spring Boot, BootifyJS brings declarative programming, a powerful Dependency Injection system, and an enterprise-grade feature set to the TypeScript ecosystem.
4
+
5
+ Our goal is to make building complex, scalable, and maintainable backend applications not just possible, but elegant and enjoyable.
6
+
7
+ ## Core Features
8
+
9
+ - **Declarative & Decorator-Driven:** Write clean, readable, and self-documenting code using a rich set of decorators for controllers, services, dependency injection, and more.
10
+ - **Powerful Dependency Injection:** A full-featured DI container that supports constructor and property injection, interface binding, scopes, and eager loading.
11
+ - **Event-Driven Architecture:** A built-in, asynchronous event bus with automatic retries and a dead-letter queue, enabling you to build resilient, decoupled systems.
12
+ - **Pluggable Caching:** A decorator-driven caching system that works out-of-the-box with an in-memory store and can be seamlessly extended to use Redis or other backends.
13
+ - **Type-Safe Configuration:** A schema-driven configuration system that validates your environment at startup, catching errors early and providing fully typed config objects.
14
+ - **Built on Fastify:** Leverage the incredible performance and rich plugin ecosystem of one of the fastest web frameworks for Node.js.
15
+
16
+ ## Getting Started
17
+
18
+ ### Installation
19
+
20
+ To create a new BootifyJS project, you can use our upcoming CLI or set it up manually.
21
+
22
+ ```
23
+ # (Coming Soon)
24
+ # npx bootifyjs-cli new my-project
25
+
26
+ # Manual Installation
27
+ npm install bootifyjs fastify reflect-metadata
28
+ ```
29
+
30
+ ### Your First Application
31
+
32
+ Here’s a simple "Hello World" application to show you how easy it is to get started.
33
+
34
+ **1. Create your main server file:**
35
+
36
+ ```
37
+ // src/server.ts
38
+ import 'reflect-metadata';
39
+ import { createBootifyApp, Controller, Get } from 'bootifyjs';
40
+
41
+ @Controller('/hello')
42
+ export class HelloController {
43
+ @Get('/')
44
+ sayHello() {
45
+ return { message: 'Hello from BootifyJS!' };
46
+ }
47
+ }
48
+
49
+ async function main() {
50
+ // Import your controller file to ensure its decorators run
51
+ await import('./controllers/hello.controller');
52
+
53
+ const { start } = await createBootifyApp({
54
+ controllers: [HelloController],
55
+ port: 3000,
56
+ });
57
+
58
+ await start();
59
+ }
60
+
61
+ main();
62
+ ```
63
+
64
+ **2. Run your application:**
65
+
66
+ ```
67
+ npx ts-node src/server.ts
68
+ ```
69
+
70
+ You can now visit `http://localhost:3000/hello` in your browser or with `curl` to see your application running!
71
+
72
+ ## Philosophy
73
+
74
+ BootifyJS is built on a few core principles:
75
+
76
+ - **Developer Experience First:** Frameworks should reduce boilerplate and complexity, not add to it. Our primary goal is to make development fast, intuitive, and enjoyable.
77
+ - **Convention Over Configuration:** We provide sensible defaults and automatic wiring so you can focus on writing business logic.
78
+ - **Robustness by Default:** Features like startup validation, graceful shutdown, and resilient event handling are built-in, helping you write production-ready code from day one.
79
+ - **Extensibility:** While the framework works out-of-the-box, it's designed to be pluggable and extensible. You can easily bring your own implementations for caching, authentication, and more.
80
+
81
+ ## Documentation
82
+
83
+ Dive deeper into the features of BootifyJS:
84
+
85
+ - [**Core Module**](https://github.com/piyushpriyadarshi/bootifyjs/tree/main/src/core 'null')**:** Learn about the Dependency Injection system, decorators, and component lifecycle.
86
+ - [**Configuration**](https://github.com/piyushpriyadarshi/bootifyjs/tree/main/src/config 'null')**:** Master the type-safe, schema-driven configuration system.
87
+ - [**Events Module**](https://github.com/piyushpriyadarshi/bootifyjs/tree/main/src/events 'null')**:** Master the event bus for building decoupled, event-driven services.
88
+ - [**Cache Module**](https://github.com/piyushpriyadarshi/bootifyjs/tree/main/src/cache 'null')**:** Speed up your application with our decorator-driven caching system.
89
+ - [**Logging**](https://github.com/piyushpriyadarshi/bootifyjs/tree/main/src/logging 'null')**:** Understand the structured, context-aware logging system.# bootifyjs
package/dist/api.d.ts CHANGED
@@ -1,12 +1,16 @@
1
1
  import { FastifyInstance } from 'fastify';
2
2
  import { ZodObject } from 'zod';
3
+ import { FastifyMiddleware } from './core/decorators';
3
4
  import { Constructor } from './core/di-container';
5
+ import { ContextExtractor } from './middleware/context.middleware';
4
6
  export interface BootifyAppOptions {
5
7
  controllers: Constructor[];
6
8
  port?: number;
7
9
  hostname?: string;
8
10
  enableSwagger?: boolean;
9
11
  configSchema?: ZodObject<any>;
12
+ contextExtractor?: ContextExtractor;
13
+ globalMiddlewares?: FastifyMiddleware[];
10
14
  }
11
15
  export declare function createBootifyApp(options: BootifyAppOptions): Promise<{
12
16
  app: FastifyInstance<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>;
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAClD,OAAU,EAAY,SAAS,EAAa,MAAM,KAAK,CAAA;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAWjD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,WAAW,EAAE,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;CAC9B;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB;;;GA4EhE"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,OAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAClD,OAAU,EAAY,SAAS,EAAE,MAAM,KAAK,CAAA;AAG5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGjD,OAAO,EAAE,gBAAgB,EAA2B,MAAM,iCAAiC,CAAA;AAM3F,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,WAAW,EAAE,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;IAC7B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,CAAA;CACxC;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB;;;GA0FhE"}
package/dist/api.js CHANGED
@@ -37,15 +37,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.createBootifyApp = createBootifyApp;
40
+ const swagger_1 = __importDefault(require("@fastify/swagger"));
41
+ const swagger_ui_1 = __importDefault(require("@fastify/swagger-ui"));
40
42
  const fastify_1 = __importDefault(require("fastify"));
41
43
  const zod_1 = __importStar(require("zod"));
44
+ const AppConfig_1 = require("./config/AppConfig");
45
+ const constants_1 = require("./constants");
42
46
  const router_1 = require("./core/router");
43
- const swagger_1 = __importDefault(require("@fastify/swagger"));
44
- const swagger_ui_1 = __importDefault(require("@fastify/swagger-ui"));
45
- const request_logger_middleware_1 = require("./middleware/request-logger.middleware");
46
- const context_middleware_1 = require("./middleware/context.middleware");
47
47
  const logging_1 = require("./logging");
48
- const AppConfig_1 = require("./config/AppConfig");
48
+ const context_middleware_1 = require("./middleware/context.middleware");
49
+ const request_logger_middleware_1 = require("./middleware/request-logger.middleware");
49
50
  async function createBootifyApp(options) {
50
51
  AppConfig_1.AppConfig.initialize(options.configSchema ?? zod_1.default.object({}));
51
52
  const { logger, startupLogger } = await (0, logging_1.intitializeLogging)();
@@ -53,14 +54,24 @@ async function createBootifyApp(options) {
53
54
  const app = (0, fastify_1.default)({
54
55
  logger: false,
55
56
  });
57
+ // Register context middleware FIRST to establish AsyncLocalStorage context
56
58
  startupLogger.logComponentStart('Request Context Middleware');
57
- app.addHook('onRequest', context_middleware_1.contextMiddleware);
59
+ app.addHook('onRequest', (0, context_middleware_1.createContextMiddleware)(options.contextExtractor));
58
60
  startupLogger.logComponentComplete('Request Context Middleware');
61
+ // Register global middlewares after context is established
62
+ if (options.globalMiddlewares && options.globalMiddlewares.length > 0) {
63
+ startupLogger.logComponentStart('Global Middlewares');
64
+ options.globalMiddlewares.forEach((middleware, index) => {
65
+ app.addHook('onRequest', middleware);
66
+ console.log(` ✓ Registered global middleware ${index + 1}`);
67
+ });
68
+ startupLogger.logComponentComplete('Global Middlewares');
69
+ }
59
70
  // 2. Request Logger Hooks
60
71
  // These log the start and end of the request.
61
72
  startupLogger.logComponentStart('Attaching Request Logger');
62
73
  app.addHook('onRequest', request_logger_middleware_1.requestLoggerOnRequest);
63
- app.addHook('onResponse', request_logger_middleware_1.requestLoggerOnResponse);
74
+ app.addHook('onResponse', (0, request_logger_middleware_1.createRequestLoggerOnResponse)(logger));
64
75
  startupLogger.logComponentComplete('Attaching Request Logger');
65
76
  startupLogger.logComponentStart('Attaching Global ErrorHandler');
66
77
  app.setErrorHandler((error, request, reply) => {
@@ -84,6 +95,8 @@ async function createBootifyApp(options) {
84
95
  startupLogger.logComponentComplete('Attaching Global ErrorHandler');
85
96
  if (options.enableSwagger) {
86
97
  startupLogger.logComponentStart('Initializing Swagger');
98
+ const swaggerHost = options.hostname ?? 'localhost';
99
+ const swaggerPort = options.port ?? constants_1.DEFAULT_SERVER_PORT;
87
100
  await app.register(swagger_1.default, {
88
101
  openapi: {
89
102
  info: {
@@ -91,7 +104,7 @@ async function createBootifyApp(options) {
91
104
  description: 'API documentation',
92
105
  version: '1.0.0',
93
106
  },
94
- servers: [{ url: `http://${options.hostname ?? 'localhost'}:${options.port ?? 3000}` }],
107
+ servers: [{ url: `http://${swaggerHost}:${swaggerPort}` }],
95
108
  },
96
109
  });
97
110
  await app.register(swagger_ui_1.default, {
@@ -105,8 +118,10 @@ async function createBootifyApp(options) {
105
118
  startupLogger.logStartupComplete();
106
119
  const start = async () => {
107
120
  try {
108
- await app.listen({ port: options.port ?? 3000, host: options.hostname ?? '0.0.0.0' });
109
- startupLogger.logStartupSummary();
121
+ const actualPort = options.port ?? constants_1.DEFAULT_SERVER_PORT;
122
+ const actualHost = options.hostname ?? constants_1.DEFAULT_SERVER_HOST;
123
+ await app.listen({ port: actualPort, host: actualHost });
124
+ startupLogger.logStartupSummary(actualPort, actualHost);
110
125
  }
111
126
  catch (err) {
112
127
  app.log.error(err);
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * AuthManager - Central orchestrator for authentication strategies
3
+ * Manages strategy registration, selection, and execution
4
+ */
5
+ import { AuthConfig, AuthContext, AuthResult, AuthStrategy, TokenStorage } from './types';
6
+ export declare class AuthManager {
7
+ private config;
8
+ private strategies;
9
+ private defaultStrategy?;
10
+ private tokenStorage?;
11
+ constructor(config?: {
12
+ defaultStrategy?: string;
13
+ tokenStorage?: TokenStorage;
14
+ });
15
+ /**
16
+ * Register an authentication strategy
17
+ */
18
+ registerStrategy(strategy: AuthStrategy, config: AuthConfig): Promise<void>;
19
+ /**
20
+ * Get a registered strategy by name
21
+ */
22
+ getStrategy(name: string): AuthStrategy | undefined;
23
+ /**
24
+ * Get all registered strategy names
25
+ */
26
+ getRegisteredStrategies(): string[];
27
+ /**
28
+ * Authenticate using a specific strategy or auto-detect
29
+ */
30
+ authenticate(context: AuthContext, strategyName?: string): Promise<AuthResult>;
31
+ /**
32
+ * Validate a token using a specific strategy or auto-detect
33
+ */
34
+ validate(token: string, context: AuthContext, strategyName?: string): Promise<AuthResult>;
35
+ /**
36
+ * Refresh an access token
37
+ */
38
+ refresh(refreshToken: string, context: AuthContext, strategyName?: string): Promise<AuthResult>;
39
+ /**
40
+ * Revoke/logout a user's session
41
+ */
42
+ revoke(token: string, context: AuthContext, strategyName?: string): Promise<boolean>;
43
+ /**
44
+ * Select appropriate strategy based on context and preference
45
+ */
46
+ private selectStrategy;
47
+ /**
48
+ * Auto-detect strategy based on request context
49
+ */
50
+ private detectStrategy;
51
+ /**
52
+ * Store session data in token storage
53
+ */
54
+ private storeSessionData;
55
+ /**
56
+ * Clean up session data from token storage
57
+ */
58
+ private cleanupSessionData;
59
+ /**
60
+ * Get authentication statistics
61
+ */
62
+ getStats(): {
63
+ registeredStrategies: number;
64
+ strategyNames: string[];
65
+ defaultStrategy?: string;
66
+ };
67
+ }
68
+ //# sourceMappingURL=AuthManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../../src/auth/AuthManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,UAAU,EACV,WAAW,EAEX,UAAU,EACV,YAAY,EAEZ,YAAY,EACb,MAAM,SAAS,CAAC;AAEjB,qBAAa,WAAW;IAKV,OAAO,CAAC,MAAM;IAJ1B,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,YAAY,CAAC,CAAe;gBAEhB,MAAM,GAAE;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,YAAY,CAAC,EAAE,YAAY,CAAC;KACxB;IAKN;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBjF;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAInD;;OAEG;IACH,uBAAuB,IAAI,MAAM,EAAE;IAInC;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAiCpF;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuB/F;;OAEG;IACG,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA8BrG;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuB1F;;OAEG;IACH,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAkBtB;;OAEG;YACW,gBAAgB;IAiB9B;;OAEG;YACW,kBAAkB;IAiBhC;;OAEG;IACH,QAAQ,IAAI;QACV,oBAAoB,EAAE,MAAM,CAAC;QAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B;CAOF"}
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ /**
3
+ * AuthManager - Central orchestrator for authentication strategies
4
+ * Manages strategy registration, selection, and execution
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AuthManager = void 0;
8
+ const types_1 = require("./types");
9
+ class AuthManager {
10
+ constructor(config = {}) {
11
+ this.config = config;
12
+ this.strategies = new Map();
13
+ this.defaultStrategy = config.defaultStrategy;
14
+ this.tokenStorage = config.tokenStorage;
15
+ }
16
+ /**
17
+ * Register an authentication strategy
18
+ */
19
+ async registerStrategy(strategy, config) {
20
+ try {
21
+ await strategy.initialize(config);
22
+ this.strategies.set(strategy.name, strategy);
23
+ // Set as default if it's the first strategy or explicitly configured
24
+ if (!this.defaultStrategy || config.options?.isDefault) {
25
+ this.defaultStrategy = strategy.name;
26
+ }
27
+ }
28
+ catch (error) {
29
+ const errorMessage = error instanceof Error ? error.message : String(error);
30
+ throw new types_1.AuthError(`Failed to register strategy '${strategy.name}': ${errorMessage}`, 'STRATEGY_REGISTRATION_FAILED', 500);
31
+ }
32
+ }
33
+ /**
34
+ * Get a registered strategy by name
35
+ */
36
+ getStrategy(name) {
37
+ return this.strategies.get(name);
38
+ }
39
+ /**
40
+ * Get all registered strategy names
41
+ */
42
+ getRegisteredStrategies() {
43
+ return Array.from(this.strategies.keys());
44
+ }
45
+ /**
46
+ * Authenticate using a specific strategy or auto-detect
47
+ */
48
+ async authenticate(context, strategyName) {
49
+ const strategy = this.selectStrategy(context, strategyName);
50
+ if (!strategy) {
51
+ return {
52
+ success: false,
53
+ error: 'No suitable authentication strategy found'
54
+ };
55
+ }
56
+ console.log('AuthManager.authenticate', strategy.name, context);
57
+ try {
58
+ const result = await strategy.authenticate(context);
59
+ // Store session data if authentication successful and token storage available
60
+ if (result.success && result.user && this.tokenStorage) {
61
+ await this.storeSessionData(result, strategy.name);
62
+ }
63
+ return result;
64
+ }
65
+ catch (error) {
66
+ console.error(`Authentication failed for strategy '${strategy.name}':`, error);
67
+ const errorMessage = error instanceof Error ? error.message : String(error);
68
+ const errorCode = error instanceof types_1.AuthError ? error.code : 'UNKNOWN_ERROR';
69
+ return {
70
+ success: false,
71
+ error: errorMessage || 'Authentication failed',
72
+ metadata: { strategy: strategy.name, error: errorCode }
73
+ };
74
+ }
75
+ }
76
+ /**
77
+ * Validate a token using a specific strategy or auto-detect
78
+ */
79
+ async validate(token, context, strategyName) {
80
+ const strategy = this.selectStrategy(context, strategyName);
81
+ if (!strategy) {
82
+ return {
83
+ success: false,
84
+ error: 'No suitable validation strategy found'
85
+ };
86
+ }
87
+ try {
88
+ return await strategy.validate(token, context);
89
+ }
90
+ catch (error) {
91
+ const errorMessage = error instanceof Error ? error.message : String(error);
92
+ const errorCode = error instanceof types_1.AuthError ? error.code : 'UNKNOWN_ERROR';
93
+ return {
94
+ success: false,
95
+ error: errorMessage || 'Token validation failed',
96
+ metadata: { strategy: strategy.name, error: errorCode }
97
+ };
98
+ }
99
+ }
100
+ /**
101
+ * Refresh an access token
102
+ */
103
+ async refresh(refreshToken, context, strategyName) {
104
+ const strategy = this.selectStrategy(context, strategyName);
105
+ if (!strategy || !strategy.refresh) {
106
+ return {
107
+ success: false,
108
+ error: 'Token refresh not supported by strategy'
109
+ };
110
+ }
111
+ try {
112
+ const result = await strategy.refresh(refreshToken, context);
113
+ // Update session data if refresh successful
114
+ if (result.success && result.user && this.tokenStorage) {
115
+ await this.storeSessionData(result, strategy.name);
116
+ }
117
+ return result;
118
+ }
119
+ catch (error) {
120
+ const errorMessage = error instanceof Error ? error.message : String(error);
121
+ const errorCode = error instanceof types_1.AuthError ? error.code : 'UNKNOWN_ERROR';
122
+ return {
123
+ success: false,
124
+ error: errorMessage || 'Token refresh failed',
125
+ metadata: { strategy: strategy.name, error: errorCode }
126
+ };
127
+ }
128
+ }
129
+ /**
130
+ * Revoke/logout a user's session
131
+ */
132
+ async revoke(token, context, strategyName) {
133
+ const strategy = this.selectStrategy(context, strategyName);
134
+ if (!strategy) {
135
+ return false;
136
+ }
137
+ try {
138
+ const result = strategy.revoke ? await strategy.revoke(token, context) : true;
139
+ // Clean up session data
140
+ if (result && this.tokenStorage) {
141
+ await this.cleanupSessionData(token);
142
+ }
143
+ return result;
144
+ }
145
+ catch (error) {
146
+ const errorMessage = error instanceof Error ? error.message : String(error);
147
+ console.error(`Failed to revoke token: ${errorMessage}`);
148
+ return false;
149
+ }
150
+ }
151
+ /**
152
+ * Select appropriate strategy based on context and preference
153
+ */
154
+ selectStrategy(context, preferredStrategy) {
155
+ // Use explicitly specified strategy
156
+ if (preferredStrategy && this.strategies.has(preferredStrategy)) {
157
+ return this.strategies.get(preferredStrategy);
158
+ }
159
+ // Use strategy from context
160
+ if (context.strategy && this.strategies.has(context.strategy)) {
161
+ return this.strategies.get(context.strategy);
162
+ }
163
+ // Auto-detect based on request headers/content
164
+ const detectedStrategy = this.detectStrategy(context);
165
+ if (detectedStrategy && this.strategies.has(detectedStrategy)) {
166
+ return this.strategies.get(detectedStrategy);
167
+ }
168
+ // Fall back to default strategy
169
+ if (this.defaultStrategy && this.strategies.has(this.defaultStrategy)) {
170
+ return this.strategies.get(this.defaultStrategy);
171
+ }
172
+ return undefined;
173
+ }
174
+ /**
175
+ * Auto-detect strategy based on request context
176
+ */
177
+ detectStrategy(context) {
178
+ const { headers } = context;
179
+ // Check for API key in headers
180
+ if (headers['x-api-key'] || headers['api-key']) {
181
+ return types_1.AuthStrategyType.API_KEY;
182
+ }
183
+ // Check for JWT Bearer token
184
+ const authHeader = headers['authorization'] || headers['Authorization'];
185
+ if (authHeader?.startsWith('Bearer ')) {
186
+ return types_1.AuthStrategyType.JWT;
187
+ }
188
+ // Default detection logic can be extended here
189
+ return undefined;
190
+ }
191
+ /**
192
+ * Store session data in token storage
193
+ */
194
+ async storeSessionData(result, strategyName) {
195
+ if (!this.tokenStorage || !result.user || !result.tokens) {
196
+ return;
197
+ }
198
+ const sessionKey = `session:${result.user.id}:${Date.now()}`;
199
+ const sessionData = {
200
+ userId: result.user.id,
201
+ strategy: strategyName,
202
+ issuedAt: new Date(),
203
+ expiresAt: new Date(Date.now() + (result.tokens.expiresIn * 1000)),
204
+ metadata: result.metadata
205
+ };
206
+ await this.tokenStorage.store(sessionKey, sessionData, result.tokens.expiresIn);
207
+ }
208
+ /**
209
+ * Clean up session data from token storage
210
+ */
211
+ async cleanupSessionData(token) {
212
+ if (!this.tokenStorage) {
213
+ return;
214
+ }
215
+ // This is a simplified cleanup - in practice, you'd need to
216
+ // decode the token to get user ID and find associated sessions
217
+ try {
218
+ // Implementation would depend on your token structure
219
+ // For now, we'll just log the cleanup attempt
220
+ console.log('Session cleanup requested for token');
221
+ }
222
+ catch (error) {
223
+ const errorMessage = error instanceof Error ? error.message : String(error);
224
+ console.error('Failed to cleanup session data:', errorMessage);
225
+ }
226
+ }
227
+ /**
228
+ * Get authentication statistics
229
+ */
230
+ getStats() {
231
+ return {
232
+ registeredStrategies: this.strategies.size,
233
+ strategyNames: Array.from(this.strategies.keys()),
234
+ defaultStrategy: this.defaultStrategy
235
+ };
236
+ }
237
+ }
238
+ exports.AuthManager = AuthManager;
239
+ //# sourceMappingURL=AuthManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthManager.js","sourceRoot":"","sources":["../../src/auth/AuthManager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,mCAQiB;AAEjB,MAAa,WAAW;IAKtB,YAAoB,SAGhB,EAAE;QAHc,WAAM,GAAN,MAAM,CAGpB;QAPE,eAAU,GAA8B,IAAI,GAAG,EAAE,CAAC;QAQxD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAAsB,EAAE,MAAkB;QAC/D,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAE7C,qEAAqE;YACrE,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;gBACvD,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC;YACvC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,IAAI,iBAAS,CACjB,gCAAgC,QAAQ,CAAC,IAAI,MAAM,YAAY,EAAE,EACjE,8BAA8B,EAC9B,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,uBAAuB;QACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAoB,EAAE,YAAqB;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,2CAA2C;aACnD,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC/D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAEpD,8EAA8E;YAC9E,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvD,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEf,OAAO,CAAC,KAAK,CAAC,uCAAuC,QAAQ,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/E,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,SAAS,GAAG,KAAK,YAAY,iBAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;YAC5E,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,YAAY,IAAI,uBAAuB;gBAC9C,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,OAAoB,EAAE,YAAqB;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,uCAAuC;aAC/C,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,SAAS,GAAG,KAAK,YAAY,iBAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;YAC5E,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,YAAY,IAAI,yBAAyB;gBAChD,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,YAAoB,EAAE,OAAoB,EAAE,YAAqB;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,yCAAyC;aACjD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAE7D,4CAA4C;YAC5C,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvD,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,SAAS,GAAG,KAAK,YAAY,iBAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;YAC5E,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,YAAY,IAAI,sBAAsB;gBAC7C,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAAoB,EAAE,YAAqB;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAE9E,wBAAwB;YACxB,IAAI,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO,CAAC,KAAK,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAAoB,EAAE,iBAA0B;QACrE,oCAAoC;QACpC,IAAI,iBAAiB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAChD,CAAC;QAED,4BAA4B;QAC5B,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9D,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC;QAED,+CAA+C;QAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,gBAAgB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC9D,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC/C,CAAC;QAED,gCAAgC;QAChC,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAAoB;QACzC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAE5B,+BAA+B;QAC/B,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/C,OAAO,wBAAgB,CAAC,OAAO,CAAC;QAClC,CAAC;QAED,6BAA6B;QAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;QACxE,IAAI,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,OAAO,wBAAgB,CAAC,GAAG,CAAC;QAC9B,CAAC;QAED,+CAA+C;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,MAAkB,EAAE,YAAoB;QACrE,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACzD,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC7D,MAAM,WAAW,GAAG;YAClB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;YACtB,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,IAAI,IAAI,EAAE;YACpB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;YAClE,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC;QAEF,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAAC,KAAa;QAC5C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,4DAA4D;QAC5D,+DAA+D;QAC/D,IAAI,CAAC;YACH,sDAAsD;YACtD,8CAA8C;YAC9C,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,YAAY,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QAKN,OAAO;YACL,oBAAoB,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAC1C,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACjD,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC,CAAC;IACJ,CAAC;CACF;AAjRD,kCAiRC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * BootifyJS Authentication Examples
3
+ * Demonstrates how to use the authentication system with different strategies
4
+ */
5
+ import { FastifyInstance } from 'fastify';
6
+ import { AuthManager, AuthMiddleware, RedisTokenStorage } from '../index';
7
+ export declare class MockRedisClient {
8
+ private store;
9
+ get(key: string): Promise<string | null>;
10
+ set(key: string, value: string, options?: {
11
+ EX?: number;
12
+ }): Promise<string | null>;
13
+ del(key: string): Promise<number>;
14
+ exists(key: string): Promise<number>;
15
+ expire(key: string, seconds: number): Promise<number>;
16
+ ttl(key: string): Promise<number>;
17
+ }
18
+ export declare function setupJwtAuth(): Promise<{
19
+ authManager: AuthManager;
20
+ middleware: AuthMiddleware;
21
+ tokenStorage: RedisTokenStorage;
22
+ }>;
23
+ export declare function setupMultiAuth(app: FastifyInstance): Promise<{
24
+ authManager: AuthManager;
25
+ middleware: AuthMiddleware;
26
+ tokenStorage: RedisTokenStorage;
27
+ }>;
28
+ export declare function registerJWTAuthRoutes(app: FastifyInstance, authManager: AuthManager, middleware: AuthMiddleware): void;
29
+ //# sourceMappingURL=basic-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic-usage.d.ts","sourceRoot":"","sources":["../../../src/auth/examples/basic-usage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI1C,OAAO,EAGL,WAAW,EACX,cAAc,EAEd,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAGlB,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAyD;IAEhE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMlF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOrD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAOxC;AAGD,wBAAsB,YAAY;;;;GA2DjC;AAGD,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe;;;;GA+DxD;AAGD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,eAAe,EACpB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,cAAc,QA0G3B"}