bootifyjs 1.1.9 → 1.2.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 (234) hide show
  1. package/README.md +1 -1
  2. package/dist/api.d.ts +5 -0
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +25 -9
  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 +30 -0
  11. package/dist/auth/examples/basic-usage.d.ts.map +1 -0
  12. package/dist/auth/examples/basic-usage.js +391 -0
  13. package/dist/auth/examples/basic-usage.js.map +1 -0
  14. package/dist/auth/index.d.ts +70 -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/cache/bootstrap.js +1 -1
  39. package/dist/cache/bootstrap.js.map +1 -1
  40. package/dist/cache/index.d.ts +2 -1
  41. package/dist/cache/index.d.ts.map +1 -1
  42. package/dist/cache/index.js +4 -1
  43. package/dist/cache/index.js.map +1 -1
  44. package/dist/cache/{in-memory-cache.store.d.ts → stores/in-memory-cache.store.d.ts} +1 -1
  45. package/dist/cache/stores/in-memory-cache.store.d.ts.map +1 -0
  46. package/dist/cache/{in-memory-cache.store.js → stores/in-memory-cache.store.js} +1 -1
  47. package/dist/cache/stores/in-memory-cache.store.js.map +1 -0
  48. package/dist/cache/stores/index.d.ts +3 -0
  49. package/dist/cache/stores/index.d.ts.map +1 -0
  50. package/dist/cache/stores/index.js +20 -0
  51. package/dist/cache/stores/index.js.map +1 -0
  52. package/dist/cache/stores/redis-cache.store.d.ts +8 -0
  53. package/dist/cache/stores/redis-cache.store.d.ts.map +1 -0
  54. package/dist/cache/stores/redis-cache.store.js +39 -0
  55. package/dist/cache/stores/redis-cache.store.js.map +1 -0
  56. package/dist/config/AppConfig.d.ts +3 -3
  57. package/dist/config/AppConfig.d.ts.map +1 -1
  58. package/dist/config/AppConfig.js +9 -2
  59. package/dist/config/AppConfig.js.map +1 -1
  60. package/dist/constants/index.d.ts +61 -0
  61. package/dist/constants/index.d.ts.map +1 -0
  62. package/dist/constants/index.js +75 -0
  63. package/dist/constants/index.js.map +1 -0
  64. package/dist/core/decorators.d.ts +7 -7
  65. package/dist/core/decorators.d.ts.map +1 -1
  66. package/dist/core/decorators.js +8 -7
  67. package/dist/core/decorators.js.map +1 -1
  68. package/dist/core/di-container.d.ts +1 -1
  69. package/dist/core/di-container.d.ts.map +1 -1
  70. package/dist/core/di-container.js +3 -3
  71. package/dist/core/di-container.js.map +1 -1
  72. package/dist/core/router.d.ts.map +1 -1
  73. package/dist/core/router.js +3 -3
  74. package/dist/core/router.js.map +1 -1
  75. package/dist/events/bootstrap.d.ts +13 -1
  76. package/dist/events/bootstrap.d.ts.map +1 -1
  77. package/dist/events/bootstrap.js +30 -2
  78. package/dist/events/bootstrap.js.map +1 -1
  79. package/dist/events/buffered-event-bus.service.d.ts +135 -0
  80. package/dist/events/buffered-event-bus.service.d.ts.map +1 -0
  81. package/dist/events/buffered-event-bus.service.js +420 -0
  82. package/dist/events/buffered-event-bus.service.js.map +1 -0
  83. package/dist/events/config/buffered-event-config.d.ts +153 -0
  84. package/dist/events/config/buffered-event-config.d.ts.map +1 -0
  85. package/dist/events/config/buffered-event-config.js +181 -0
  86. package/dist/events/config/buffered-event-config.js.map +1 -0
  87. package/dist/events/event-bus.service.d.ts.map +1 -1
  88. package/dist/events/event-bus.service.js +2 -0
  89. package/dist/events/event-bus.service.js.map +1 -1
  90. package/dist/events/index.d.ts +3 -0
  91. package/dist/events/index.d.ts.map +1 -1
  92. package/dist/events/index.js +3 -0
  93. package/dist/events/index.js.map +1 -1
  94. package/dist/events/metrics/event-metrics.d.ts +175 -0
  95. package/dist/events/metrics/event-metrics.d.ts.map +1 -0
  96. package/dist/events/metrics/event-metrics.js +235 -0
  97. package/dist/events/metrics/event-metrics.js.map +1 -0
  98. package/dist/events/monitoring/health-monitor.d.ts +142 -0
  99. package/dist/events/monitoring/health-monitor.d.ts.map +1 -0
  100. package/dist/events/monitoring/health-monitor.js +492 -0
  101. package/dist/events/monitoring/health-monitor.js.map +1 -0
  102. package/dist/events/retry/retry-handler.d.ts +112 -0
  103. package/dist/events/retry/retry-handler.d.ts.map +1 -0
  104. package/dist/events/retry/retry-handler.js +218 -0
  105. package/dist/events/retry/retry-handler.js.map +1 -0
  106. package/dist/events/shared-buffer.d.ts +92 -0
  107. package/dist/events/shared-buffer.d.ts.map +1 -0
  108. package/dist/events/shared-buffer.js +179 -0
  109. package/dist/events/shared-buffer.js.map +1 -0
  110. package/dist/events/worker/event-processor.worker.d.ts +75 -0
  111. package/dist/events/worker/event-processor.worker.d.ts.map +1 -0
  112. package/dist/events/worker/event-processor.worker.js +293 -0
  113. package/dist/events/worker/event-processor.worker.js.map +1 -0
  114. package/dist/events/worker/worker-manager.d.ts +132 -0
  115. package/dist/events/worker/worker-manager.d.ts.map +1 -0
  116. package/dist/events/worker/worker-manager.js +436 -0
  117. package/dist/events/worker/worker-manager.js.map +1 -0
  118. package/dist/examples/auth/auth.middleware.d.ts +1 -0
  119. package/dist/examples/auth/auth.middleware.d.ts.map +1 -0
  120. package/dist/examples/auth/auth.middleware.js +2 -0
  121. package/dist/examples/auth/auth.middleware.js.map +1 -0
  122. package/dist/examples/auth/authorization.middleware.d.ts +1 -0
  123. package/dist/examples/auth/authorization.middleware.d.ts.map +1 -0
  124. package/dist/examples/auth/authorization.middleware.js +2 -0
  125. package/dist/examples/auth/authorization.middleware.js.map +1 -0
  126. package/dist/examples/auth/context.extractor.d.ts +1 -0
  127. package/dist/examples/auth/context.extractor.d.ts.map +1 -0
  128. package/dist/examples/auth/context.extractor.js +2 -0
  129. package/dist/examples/auth/context.extractor.js.map +1 -0
  130. package/dist/examples/auth/example.d.ts +1 -0
  131. package/dist/examples/auth/example.d.ts.map +1 -0
  132. package/dist/examples/auth/example.js +2 -0
  133. package/dist/examples/auth/example.js.map +1 -0
  134. package/dist/examples/auth/provider.d.ts +1 -0
  135. package/dist/examples/auth/provider.d.ts.map +1 -0
  136. package/dist/examples/auth/provider.js +2 -0
  137. package/dist/examples/auth/provider.js.map +1 -0
  138. package/dist/examples/auth/users.d.ts +1 -0
  139. package/dist/examples/auth/users.d.ts.map +1 -0
  140. package/dist/examples/auth/users.js +2 -0
  141. package/dist/examples/auth/users.js.map +1 -0
  142. package/dist/examples/controllers/auth.controller.d.ts +1 -0
  143. package/dist/examples/controllers/auth.controller.d.ts.map +1 -0
  144. package/dist/examples/controllers/auth.controller.js +249 -0
  145. package/dist/examples/controllers/auth.controller.js.map +1 -0
  146. package/dist/examples/controllers/health.controller.d.ts +1 -0
  147. package/dist/examples/controllers/health.controller.d.ts.map +1 -1
  148. package/dist/examples/controllers/health.controller.js +6 -0
  149. package/dist/examples/controllers/health.controller.js.map +1 -1
  150. package/dist/examples/controllers/todo.controller.d.ts +4 -2
  151. package/dist/examples/controllers/todo.controller.d.ts.map +1 -1
  152. package/dist/examples/controllers/todo.controller.js +44 -18
  153. package/dist/examples/controllers/todo.controller.js.map +1 -1
  154. package/dist/examples/events/TodoEventHandler.d.ts +4 -1
  155. package/dist/examples/events/TodoEventHandler.d.ts.map +1 -1
  156. package/dist/examples/events/TodoEventHandler.js +8 -4
  157. package/dist/examples/events/TodoEventHandler.js.map +1 -1
  158. package/dist/examples/events/buffered-event-example.d.ts +71 -0
  159. package/dist/examples/events/buffered-event-example.d.ts.map +1 -0
  160. package/dist/examples/events/buffered-event-example.js +182 -0
  161. package/dist/examples/events/buffered-event-example.js.map +1 -0
  162. package/dist/examples/events/integration-test.d.ts +10 -0
  163. package/dist/examples/events/integration-test.d.ts.map +1 -0
  164. package/dist/examples/events/integration-test.js +147 -0
  165. package/dist/examples/events/integration-test.js.map +1 -0
  166. package/dist/examples/global-middleware-example.d.ts +2 -0
  167. package/dist/examples/global-middleware-example.d.ts.map +1 -0
  168. package/dist/examples/global-middleware-example.js +94 -0
  169. package/dist/examples/global-middleware-example.js.map +1 -0
  170. package/dist/examples/index.d.ts +1 -0
  171. package/dist/examples/index.d.ts.map +1 -1
  172. package/dist/examples/index.js +86 -27
  173. package/dist/examples/index.js.map +1 -1
  174. package/dist/examples/services/todo.service.d.ts +3 -2
  175. package/dist/examples/services/todo.service.d.ts.map +1 -1
  176. package/dist/examples/services/todo.service.js +12 -2
  177. package/dist/examples/services/todo.service.js.map +1 -1
  178. package/dist/examples/simple-auth-example.d.ts +7 -0
  179. package/dist/examples/simple-auth-example.d.ts.map +1 -0
  180. package/dist/examples/simple-auth-example.js +106 -0
  181. package/dist/examples/simple-auth-example.js.map +1 -0
  182. package/dist/examples/todos/schema.d.ts +4 -4
  183. package/dist/index.d.ts +1 -0
  184. package/dist/index.d.ts.map +1 -1
  185. package/dist/index.js +1 -0
  186. package/dist/index.js.map +1 -1
  187. package/dist/logging/config/logging.config.d.ts +0 -32
  188. package/dist/logging/config/logging.config.d.ts.map +1 -1
  189. package/dist/logging/config/logging.config.js +43 -49
  190. package/dist/logging/config/logging.config.js.map +1 -1
  191. package/dist/logging/core/logger.d.ts +1 -0
  192. package/dist/logging/core/logger.d.ts.map +1 -1
  193. package/dist/logging/core/logger.js +3 -0
  194. package/dist/logging/core/logger.js.map +1 -1
  195. package/dist/logging/core/logger.provider.d.ts.map +1 -1
  196. package/dist/logging/core/logger.provider.js +24 -12
  197. package/dist/logging/core/logger.provider.js.map +1 -1
  198. package/dist/logging/core/startup.logger.d.ts +1 -1
  199. package/dist/logging/core/startup.logger.d.ts.map +1 -1
  200. package/dist/logging/core/startup.logger.js +6 -3
  201. package/dist/logging/core/startup.logger.js.map +1 -1
  202. package/dist/logging/core/tracing.service.d.ts +32 -0
  203. package/dist/logging/core/tracing.service.d.ts.map +1 -0
  204. package/dist/logging/core/tracing.service.js +165 -0
  205. package/dist/logging/core/tracing.service.js.map +1 -0
  206. package/dist/logging/index.d.ts +1 -1
  207. package/dist/logging/index.d.ts.map +1 -1
  208. package/dist/logging/index.js +3 -2
  209. package/dist/logging/index.js.map +1 -1
  210. package/dist/middleware/auth-context.extractor.d.ts +5 -0
  211. package/dist/middleware/auth-context.extractor.d.ts.map +1 -0
  212. package/dist/middleware/auth-context.extractor.js +114 -0
  213. package/dist/middleware/auth-context.extractor.js.map +1 -0
  214. package/dist/middleware/auth.middleware.d.ts +16 -2
  215. package/dist/middleware/auth.middleware.d.ts.map +1 -1
  216. package/dist/middleware/auth.middleware.js +110 -13
  217. package/dist/middleware/auth.middleware.js.map +1 -1
  218. package/dist/middleware/authorization.middleware.d.ts +21 -0
  219. package/dist/middleware/authorization.middleware.d.ts.map +1 -0
  220. package/dist/middleware/authorization.middleware.js +55 -0
  221. package/dist/middleware/authorization.middleware.js.map +1 -0
  222. package/dist/middleware/context.middleware.d.ts +12 -2
  223. package/dist/middleware/context.middleware.d.ts.map +1 -1
  224. package/dist/middleware/context.middleware.js +43 -17
  225. package/dist/middleware/context.middleware.js.map +1 -1
  226. package/dist/middleware/index.d.ts +1 -0
  227. package/dist/middleware/index.d.ts.map +1 -1
  228. package/dist/middleware/tracing.middleware.d.ts +15 -0
  229. package/dist/middleware/tracing.middleware.d.ts.map +1 -0
  230. package/dist/middleware/tracing.middleware.js +36 -0
  231. package/dist/middleware/tracing.middleware.js.map +1 -0
  232. package/package.json +5 -1
  233. package/dist/cache/in-memory-cache.store.d.ts.map +0 -1
  234. package/dist/cache/in-memory-cache.store.js.map +0 -1
package/README.md CHANGED
@@ -8,7 +8,7 @@ Our goal is to make building complex, scalable, and maintainable backend applica
8
8
 
9
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
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.
11
+ - **Event-Driven Architecture:** A built-in, asynchronous event bus with automatic retries and a dead-letter queue, plus high-performance buffered event processing with worker threads, priority queues, and advanced monitoring.
12
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
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
14
  - **Built on Fastify:** Leverage the incredible performance and rich plugin ecosystem of one of the fastest web frameworks for Node.js.
package/dist/api.d.ts CHANGED
@@ -1,12 +1,17 @@
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[];
14
+ ignoreTrailingSlash?: boolean;
10
15
  }
11
16
  export declare function createBootifyApp(options: BootifyAppOptions): Promise<{
12
17
  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;AAYjD,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;IACvC,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB;;;GA2FhE"}
package/dist/api.js CHANGED
@@ -37,25 +37,37 @@ 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)();
52
53
  startupLogger.logStartupBanner();
53
54
  const app = (0, fastify_1.default)({
54
55
  logger: false,
56
+ ignoreTrailingSlash: options.ignoreTrailingSlash ?? true,
55
57
  });
58
+ // Register context middleware FIRST to establish AsyncLocalStorage context
56
59
  startupLogger.logComponentStart('Request Context Middleware');
57
- app.addHook('onRequest', context_middleware_1.contextMiddleware);
60
+ app.addHook('onRequest', (0, context_middleware_1.createContextMiddleware)(options.contextExtractor));
58
61
  startupLogger.logComponentComplete('Request Context Middleware');
62
+ // Register global middlewares after context is established
63
+ if (options.globalMiddlewares && options.globalMiddlewares.length > 0) {
64
+ startupLogger.logComponentStart('Global Middlewares');
65
+ options.globalMiddlewares.forEach((middleware, index) => {
66
+ app.addHook('onRequest', middleware);
67
+ console.log(` ✓ Registered global middleware ${index + 1}`);
68
+ });
69
+ startupLogger.logComponentComplete('Global Middlewares');
70
+ }
59
71
  // 2. Request Logger Hooks
60
72
  // These log the start and end of the request.
61
73
  startupLogger.logComponentStart('Attaching Request Logger');
@@ -84,6 +96,8 @@ async function createBootifyApp(options) {
84
96
  startupLogger.logComponentComplete('Attaching Global ErrorHandler');
85
97
  if (options.enableSwagger) {
86
98
  startupLogger.logComponentStart('Initializing Swagger');
99
+ const swaggerHost = options.hostname ?? 'localhost';
100
+ const swaggerPort = options.port ?? constants_1.DEFAULT_SERVER_PORT;
87
101
  await app.register(swagger_1.default, {
88
102
  openapi: {
89
103
  info: {
@@ -91,7 +105,7 @@ async function createBootifyApp(options) {
91
105
  description: 'API documentation',
92
106
  version: '1.0.0',
93
107
  },
94
- servers: [{ url: `http://${options.hostname ?? 'localhost'}:${options.port ?? 3000}` }],
108
+ servers: [{ url: `http://${swaggerHost}:${swaggerPort}` }],
95
109
  },
96
110
  });
97
111
  await app.register(swagger_ui_1.default, {
@@ -105,8 +119,10 @@ async function createBootifyApp(options) {
105
119
  startupLogger.logStartupComplete();
106
120
  const start = async () => {
107
121
  try {
108
- await app.listen({ port: options.port ?? 3000, host: options.hostname ?? '0.0.0.0' });
109
- startupLogger.logStartupSummary();
122
+ const actualPort = options.port ?? constants_1.DEFAULT_SERVER_PORT;
123
+ const actualHost = options.hostname ?? constants_1.DEFAULT_SERVER_HOST;
124
+ await app.listen({ port: actualPort, host: actualHost });
125
+ startupLogger.logStartupSummary(actualPort, actualHost);
110
126
  }
111
127
  catch (err) {
112
128
  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":"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"}
@@ -0,0 +1,30 @@
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, RedisTokenStorage } from '../index';
7
+ import { AuthMiddleware } from '../middleware/AuthMiddleware';
8
+ export declare class MockRedisClient {
9
+ private store;
10
+ get(key: string): Promise<string | null>;
11
+ set(key: string, value: string, options?: {
12
+ EX?: number;
13
+ }): Promise<string | null>;
14
+ del(key: string): Promise<number>;
15
+ exists(key: string): Promise<number>;
16
+ expire(key: string, seconds: number): Promise<number>;
17
+ ttl(key: string): Promise<number>;
18
+ }
19
+ export declare function setupJwtAuth(): Promise<{
20
+ authManager: AuthManager;
21
+ middleware: AuthMiddleware;
22
+ tokenStorage: RedisTokenStorage;
23
+ }>;
24
+ export declare function setupMultiAuth(app: FastifyInstance): Promise<{
25
+ authManager: AuthManager;
26
+ middleware: AuthMiddleware;
27
+ tokenStorage: RedisTokenStorage;
28
+ }>;
29
+ export declare function registerJWTAuthRoutes(app: FastifyInstance, authManager: AuthManager, middleware: AuthMiddleware): void;
30
+ //# 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;AAG1C,OAAO,EAGL,WAAW,EAEX,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAI9D,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"}