bootifyjs 1.2.0 → 1.3.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 (123) hide show
  1. package/README.md +1 -1
  2. package/dist/api.d.ts +2 -0
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +20 -4
  5. package/dist/api.js.map +1 -1
  6. package/dist/auth/examples/basic-usage.d.ts +2 -1
  7. package/dist/auth/examples/basic-usage.d.ts.map +1 -1
  8. package/dist/auth/examples/basic-usage.js +3 -2
  9. package/dist/auth/examples/basic-usage.js.map +1 -1
  10. package/dist/auth/index.d.ts +6 -8
  11. package/dist/auth/index.d.ts.map +1 -1
  12. package/dist/auth/index.js +11 -11
  13. package/dist/auth/index.js.map +1 -1
  14. package/dist/auth/middleware/AuthMiddleware.js.map +1 -1
  15. package/dist/cache/bootstrap.js +1 -1
  16. package/dist/cache/bootstrap.js.map +1 -1
  17. package/dist/cache/index.d.ts +2 -1
  18. package/dist/cache/index.d.ts.map +1 -1
  19. package/dist/cache/index.js +4 -1
  20. package/dist/cache/index.js.map +1 -1
  21. package/dist/cache/{in-memory-cache.store.d.ts → stores/in-memory-cache.store.d.ts} +1 -1
  22. package/dist/cache/stores/in-memory-cache.store.d.ts.map +1 -0
  23. package/dist/cache/{in-memory-cache.store.js → stores/in-memory-cache.store.js} +1 -1
  24. package/dist/cache/stores/in-memory-cache.store.js.map +1 -0
  25. package/dist/cache/stores/index.d.ts +3 -0
  26. package/dist/cache/stores/index.d.ts.map +1 -0
  27. package/dist/cache/stores/index.js +20 -0
  28. package/dist/cache/stores/index.js.map +1 -0
  29. package/dist/cache/stores/redis-cache.store.d.ts +8 -0
  30. package/dist/cache/stores/redis-cache.store.d.ts.map +1 -0
  31. package/dist/cache/stores/redis-cache.store.js +39 -0
  32. package/dist/cache/stores/redis-cache.store.js.map +1 -0
  33. package/dist/core/router.d.ts.map +1 -1
  34. package/dist/core/router.js +3 -3
  35. package/dist/core/router.js.map +1 -1
  36. package/dist/events/bootstrap.d.ts +13 -1
  37. package/dist/events/bootstrap.d.ts.map +1 -1
  38. package/dist/events/bootstrap.js +30 -2
  39. package/dist/events/bootstrap.js.map +1 -1
  40. package/dist/events/buffered-event-bus.service.d.ts +135 -0
  41. package/dist/events/buffered-event-bus.service.d.ts.map +1 -0
  42. package/dist/events/buffered-event-bus.service.js +420 -0
  43. package/dist/events/buffered-event-bus.service.js.map +1 -0
  44. package/dist/events/config/buffered-event-config.d.ts +153 -0
  45. package/dist/events/config/buffered-event-config.d.ts.map +1 -0
  46. package/dist/events/config/buffered-event-config.js +181 -0
  47. package/dist/events/config/buffered-event-config.js.map +1 -0
  48. package/dist/events/index.d.ts +3 -0
  49. package/dist/events/index.d.ts.map +1 -1
  50. package/dist/events/index.js +3 -0
  51. package/dist/events/index.js.map +1 -1
  52. package/dist/events/metrics/event-metrics.d.ts +175 -0
  53. package/dist/events/metrics/event-metrics.d.ts.map +1 -0
  54. package/dist/events/metrics/event-metrics.js +235 -0
  55. package/dist/events/metrics/event-metrics.js.map +1 -0
  56. package/dist/events/monitoring/health-monitor.d.ts +142 -0
  57. package/dist/events/monitoring/health-monitor.d.ts.map +1 -0
  58. package/dist/events/monitoring/health-monitor.js +492 -0
  59. package/dist/events/monitoring/health-monitor.js.map +1 -0
  60. package/dist/events/retry/retry-handler.d.ts +112 -0
  61. package/dist/events/retry/retry-handler.d.ts.map +1 -0
  62. package/dist/events/retry/retry-handler.js +218 -0
  63. package/dist/events/retry/retry-handler.js.map +1 -0
  64. package/dist/events/shared-buffer.d.ts +92 -0
  65. package/dist/events/shared-buffer.d.ts.map +1 -0
  66. package/dist/events/shared-buffer.js +179 -0
  67. package/dist/events/shared-buffer.js.map +1 -0
  68. package/dist/events/worker/event-processor.worker.d.ts +75 -0
  69. package/dist/events/worker/event-processor.worker.d.ts.map +1 -0
  70. package/dist/events/worker/event-processor.worker.js +293 -0
  71. package/dist/events/worker/event-processor.worker.js.map +1 -0
  72. package/dist/events/worker/worker-manager.d.ts +132 -0
  73. package/dist/events/worker/worker-manager.d.ts.map +1 -0
  74. package/dist/events/worker/worker-manager.js +436 -0
  75. package/dist/events/worker/worker-manager.js.map +1 -0
  76. package/dist/examples/auth/auth.middleware.d.ts +0 -26
  77. package/dist/examples/auth/auth.middleware.d.ts.map +1 -1
  78. package/dist/examples/auth/auth.middleware.js +0 -185
  79. package/dist/examples/auth/auth.middleware.js.map +1 -1
  80. package/dist/examples/controllers/auth.controller.d.ts +0 -63
  81. package/dist/examples/controllers/auth.controller.d.ts.map +1 -1
  82. package/dist/examples/controllers/auth.controller.js +247 -282
  83. package/dist/examples/controllers/auth.controller.js.map +1 -1
  84. package/dist/examples/events/buffered-event-example.d.ts +71 -0
  85. package/dist/examples/events/buffered-event-example.d.ts.map +1 -0
  86. package/dist/examples/events/buffered-event-example.js +182 -0
  87. package/dist/examples/events/buffered-event-example.js.map +1 -0
  88. package/dist/examples/events/integration-test.d.ts +10 -0
  89. package/dist/examples/events/integration-test.d.ts.map +1 -0
  90. package/dist/examples/events/integration-test.js +147 -0
  91. package/dist/examples/events/integration-test.js.map +1 -0
  92. package/dist/examples/index.d.ts +1 -0
  93. package/dist/examples/index.d.ts.map +1 -1
  94. package/dist/examples/index.js +11 -7
  95. package/dist/examples/index.js.map +1 -1
  96. package/dist/examples/todos/schema.d.ts +4 -4
  97. package/package.json +2 -1
  98. package/dist/cache/in-memory-cache.store.d.ts.map +0 -1
  99. package/dist/cache/in-memory-cache.store.js.map +0 -1
  100. package/dist/examples/authorization-examples.d.ts +0 -67
  101. package/dist/examples/authorization-examples.d.ts.map +0 -1
  102. package/dist/examples/authorization-examples.js +0 -202
  103. package/dist/examples/authorization-examples.js.map +0 -1
  104. package/dist/examples/controllers/todo-updated.controller.d.ts +0 -103
  105. package/dist/examples/controllers/todo-updated.controller.d.ts.map +0 -1
  106. package/dist/examples/controllers/todo-updated.controller.js +0 -328
  107. package/dist/examples/controllers/todo-updated.controller.js.map +0 -1
  108. package/dist/examples/controllers/todo-with-jwt-auth.controller.d.ts +0 -114
  109. package/dist/examples/controllers/todo-with-jwt-auth.controller.d.ts.map +0 -1
  110. package/dist/examples/controllers/todo-with-jwt-auth.controller.js +0 -329
  111. package/dist/examples/controllers/todo-with-jwt-auth.controller.js.map +0 -1
  112. package/dist/examples/jwt-auth-example.d.ts +0 -47
  113. package/dist/examples/jwt-auth-example.d.ts.map +0 -1
  114. package/dist/examples/jwt-auth-example.js +0 -316
  115. package/dist/examples/jwt-auth-example.js.map +0 -1
  116. package/dist/examples/services/user.service.d.ts +0 -99
  117. package/dist/examples/services/user.service.d.ts.map +0 -1
  118. package/dist/examples/services/user.service.js +0 -281
  119. package/dist/examples/services/user.service.js.map +0 -1
  120. package/dist/examples/test-auth-flow.d.ts +0 -56
  121. package/dist/examples/test-auth-flow.d.ts.map +0 -1
  122. package/dist/examples/test-auth-flow.js +0 -449
  123. package/dist/examples/test-auth-flow.js.map +0 -1
@@ -1,8 +1,20 @@
1
1
  import { Constructor } from '../core/di-container';
2
+ import { BufferedEventBusService } from './buffered-event-bus.service';
3
+ /**
4
+ * Bootstrap options for the event system
5
+ */
6
+ export interface EventSystemBootstrapOptions {
7
+ useBufferedProcessing?: boolean;
8
+ bufferedEventConfig?: any;
9
+ }
2
10
  /**
3
11
  * Scans all registered DI components for EventListeners and subscribes
4
12
  * their handlers to the EventBus. Should be called once at application startup.
5
13
  * @param components An array of all registered service/controller constructors.
14
+ * @param options Bootstrap options for event system configuration
6
15
  */
7
- export declare function bootstrapEventSystem(components: Constructor[]): void;
16
+ export declare function bootstrapEventSystem(components: Constructor[], options?: EventSystemBootstrapOptions): {
17
+ eventBus: any;
18
+ bufferedEventBus: BufferedEventBusService | null;
19
+ };
8
20
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/events/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAK7D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,WAAW,EAAE,QAgC7D"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/events/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAE7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAItE;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,mBAAmB,CAAC,EAAE,GAAG,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,2BAAgC;;;EAgExG"}
@@ -3,15 +3,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.bootstrapEventSystem = bootstrapEventSystem;
4
4
  const di_container_1 = require("../core/di-container");
5
5
  const event_bus_service_1 = require("./event-bus.service");
6
+ const buffered_event_bus_service_1 = require("./buffered-event-bus.service");
6
7
  const decorators_1 = require("./decorators");
7
8
  /**
8
9
  * Scans all registered DI components for EventListeners and subscribes
9
10
  * their handlers to the EventBus. Should be called once at application startup.
10
11
  * @param components An array of all registered service/controller constructors.
12
+ * @param options Bootstrap options for event system configuration
11
13
  */
12
- function bootstrapEventSystem(components) {
14
+ function bootstrapEventSystem(components, options = {}) {
13
15
  console.log('🔄 Bootstrapping Event System...');
16
+ // Initialize both event bus services
14
17
  const eventBus = di_container_1.container.resolve(event_bus_service_1.EventBusService);
18
+ let bufferedEventBus = null;
19
+ if (options.useBufferedProcessing) {
20
+ console.log(' - Initializing Buffered Event Processing...');
21
+ bufferedEventBus = new buffered_event_bus_service_1.BufferedEventBusService(options.bufferedEventConfig || {});
22
+ // Register the buffered event bus in the container for DI
23
+ di_container_1.container.register(buffered_event_bus_service_1.BufferedEventBusService, { useFactory: () => bufferedEventBus });
24
+ }
15
25
  for (const component of components) {
16
26
  const isListener = Reflect.getMetadata(decorators_1.EVENTS_METADATA_KEYS.eventListener, component);
17
27
  if (!isListener) {
@@ -28,10 +38,28 @@ function bootstrapEventSystem(components) {
28
38
  const handler = {
29
39
  handle: listenerInstance[handlerInfo.methodName].bind(listenerInstance),
30
40
  };
41
+ // Register with regular event bus
31
42
  eventBus.subscribe(handlerInfo.eventType, handler);
32
- console.log(` ✓ Registered handler for '${handlerInfo.eventType}' -> ${handlerInfo.methodName}()`);
43
+ // Also register with buffered event bus if enabled
44
+ if (bufferedEventBus) {
45
+ bufferedEventBus.registerHandler(handlerInfo.eventType, handler);
46
+ }
47
+ console.log(` ✓ Registered handler for '${handlerInfo.eventType}' -> ${handlerInfo.methodName}()${bufferedEventBus ? ' (buffered)' : ''}`);
33
48
  }
34
49
  }
50
+ // Initialize buffered event bus if enabled
51
+ if (bufferedEventBus) {
52
+ bufferedEventBus.initialize().then(() => {
53
+ console.log('✅ Buffered Event System initialized successfully!');
54
+ }).catch((error) => {
55
+ console.error('❌ Failed to initialize Buffered Event System:', error);
56
+ });
57
+ }
35
58
  console.log('✅ Event System bootstrapped successfully!\n');
59
+ // Return the initialized event system components
60
+ return {
61
+ eventBus,
62
+ bufferedEventBus
63
+ };
36
64
  }
37
65
  //# sourceMappingURL=bootstrap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/events/bootstrap.ts"],"names":[],"mappings":";;AAUA,oDAgCC;AA1CD,uDAA6D;AAC7D,2DAAqD;AACrD,6CAAmD;AAGnD;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,UAAyB;IAC5D,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;IAC/C,MAAM,QAAQ,GAAG,wBAAS,CAAC,OAAO,CAAkB,mCAAe,CAAQ,CAAA;IAE3E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,iCAAoB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;QACrF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,SAAQ;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,iCAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,CAAA;QACnF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,SAAQ;QACV,CAAC;QAED,yEAAyE;QACzE,MAAM,gBAAgB,GAAG,wBAAS,CAAC,OAAO,CAAC,SAAS,CAAQ,CAAA;QAE5D,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;QAEpD,KAAK,MAAM,WAAW,IAAI,QAAQ,EAAE,CAAC;YACnC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;aACvD,CAAA;YAElB,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAClD,OAAO,CAAC,GAAG,CACT,iCAAiC,WAAW,CAAC,SAAS,QAAQ,WAAW,CAAC,UAAU,IAAI,CACzF,CAAA;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;AAC5D,CAAC"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/events/bootstrap.ts"],"names":[],"mappings":";;AAoBA,oDAgEC;AApFD,uDAA6D;AAC7D,2DAAqD;AACrD,6EAAsE;AACtE,6CAAmD;AAWnD;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,UAAyB,EAAE,UAAuC,EAAE;IACvG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;IAE/C,qCAAqC;IACrC,MAAM,QAAQ,GAAG,wBAAS,CAAC,OAAO,CAAkB,mCAAe,CAAQ,CAAA;IAC3E,IAAI,gBAAgB,GAAmC,IAAI,CAAA;IAE3D,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAA;QAC5D,gBAAgB,GAAG,IAAI,oDAAuB,CAAC,OAAO,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAA;QACjF,0DAA0D;QAC1D,wBAAS,CAAC,QAAQ,CAAC,oDAAuB,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACrF,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,iCAAoB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;QACrF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,SAAQ;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,iCAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,CAAA;QACnF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,SAAQ;QACV,CAAC;QAED,yEAAyE;QACzE,MAAM,gBAAgB,GAAG,wBAAS,CAAC,OAAO,CAAC,SAAS,CAAQ,CAAA;QAE5D,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;QAEpD,KAAK,MAAM,WAAW,IAAI,QAAQ,EAAE,CAAC;YACnC,MAAM,OAAO,GAAkB;gBAC7B,MAAM,EAAE,gBAAgB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;aACvD,CAAA;YAElB,kCAAkC;YAClC,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAElD,mDAAmD;YACnD,IAAI,gBAAgB,EAAE,CAAC;gBACrB,gBAAgB,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAClE,CAAC;YAED,OAAO,CAAC,GAAG,CACT,iCAAiC,WAAW,CAAC,SAAS,QAAQ,WAAW,CAAC,UAAU,KAAK,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CACjI,CAAA;QACH,CAAC;IACH,CAAC;IACD,2CAA2C;IAC3C,IAAI,gBAAgB,EAAE,CAAC;QACrB,gBAAgB,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACtC,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAA;QAClE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAA;QACvE,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;IAE1D,iDAAiD;IACjD,OAAO;QACL,QAAQ;QACR,gBAAgB;KACjB,CAAA;AACH,CAAC"}
@@ -0,0 +1,135 @@
1
+ import { EventEmitter } from 'events';
2
+ import { PriorityEvent, EventPriority } from './shared-buffer';
3
+ import { BufferedEventConfig } from './config/buffered-event-config';
4
+ import { IEventHandler } from './event.types';
5
+ /**
6
+ * Event processing result
7
+ */
8
+ export interface EventProcessingResult {
9
+ success: boolean;
10
+ eventId: string;
11
+ processingTime?: number;
12
+ error?: string;
13
+ retryCount?: number;
14
+ }
15
+ /**
16
+ * Buffered event bus service options
17
+ */
18
+ export interface BufferedEventBusOptions {
19
+ config?: Partial<BufferedEventConfig>;
20
+ fallbackToSync?: boolean;
21
+ enableMetrics?: boolean;
22
+ enableHealthMonitoring?: boolean;
23
+ }
24
+ /**
25
+ * Main service for buffered event processing
26
+ * Provides thread-safe, high-performance event processing with worker threads
27
+ */
28
+ export declare class BufferedEventBusService extends EventEmitter {
29
+ private readonly logger;
30
+ private config;
31
+ private sharedBuffer;
32
+ private workerManager;
33
+ private metricsCollector;
34
+ private healthMonitor;
35
+ private retryHandler;
36
+ private handlers;
37
+ private isInitialized;
38
+ private isShuttingDown;
39
+ private fallbackToSync;
40
+ private syncProcessingQueue;
41
+ private syncProcessingInterval?;
42
+ private metricsInterval?;
43
+ private healthCheckInterval?;
44
+ constructor(options?: BufferedEventBusOptions);
45
+ /**
46
+ * Initialize the buffered event bus service
47
+ */
48
+ initialize(): Promise<void>;
49
+ /**
50
+ * Initialize all components
51
+ */
52
+ private initializeComponents;
53
+ /**
54
+ * Setup event handlers for worker manager and health monitor
55
+ */
56
+ private setupEventHandlers;
57
+ /**
58
+ * Handle detected bottlenecks with auto-scaling
59
+ */
60
+ private handleBottleneck;
61
+ /**
62
+ * Start monitoring intervals
63
+ */
64
+ private startMonitoring;
65
+ /**
66
+ * Collect metrics and emit events
67
+ */
68
+ private collectAndEmitMetrics;
69
+ /**
70
+ * Perform health check
71
+ */
72
+ private performHealthCheck;
73
+ /**
74
+ * Register an event handler
75
+ */
76
+ registerHandler(eventType: string, handler: IEventHandler): void;
77
+ /**
78
+ * Unregister an event handler
79
+ */
80
+ unregisterHandler(eventType: string): void;
81
+ /**
82
+ * Emit an event for processing
83
+ */
84
+ emitEvent(eventType: string, data: any, options?: {
85
+ priority?: EventPriority;
86
+ timeout?: number;
87
+ retryable?: boolean;
88
+ }): Promise<EventProcessingResult>;
89
+ /**
90
+ * Process event synchronously as fallback
91
+ */
92
+ private processSyncEvent;
93
+ /**
94
+ * Start synchronous processing for fallback mode
95
+ */
96
+ private startSyncProcessing;
97
+ /**
98
+ * Get current metrics
99
+ */
100
+ getMetrics(): any;
101
+ /**
102
+ * Get health status
103
+ */
104
+ getHealthStatus(): Promise<any>;
105
+ /**
106
+ * Get worker statistics
107
+ */
108
+ getWorkerStatistics(): any;
109
+ /**
110
+ * Scale worker pool
111
+ */
112
+ scaleWorkers(targetCount: number): Promise<void>;
113
+ /**
114
+ * Graceful shutdown
115
+ */
116
+ shutdown(): Promise<void>;
117
+ /**
118
+ * Generate unique event ID
119
+ */
120
+ private generateEventId;
121
+ /**
122
+ * Check if the service is initialized and ready
123
+ */
124
+ isReady(): boolean;
125
+ /**
126
+ * Get configuration
127
+ */
128
+ getConfig(): BufferedEventConfig;
129
+ /**
130
+ * Update configuration (requires restart)
131
+ */
132
+ updateConfig(newConfig: Partial<BufferedEventConfig>): Promise<void>;
133
+ }
134
+ export { BufferedEventConfig, EventPriority, PriorityEvent };
135
+ //# sourceMappingURL=buffered-event-bus.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffered-event-bus.service.d.ts","sourceRoot":"","sources":["../../src/events/buffered-event-bus.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,420 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BufferedEventBusService = void 0;
4
+ const events_1 = require("events");
5
+ const shared_buffer_1 = require("./shared-buffer");
6
+ const worker_manager_1 = require("./worker/worker-manager");
7
+ const event_metrics_1 = require("./metrics/event-metrics");
8
+ const health_monitor_1 = require("./monitoring/health-monitor");
9
+ const retry_handler_1 = require("./retry/retry-handler");
10
+ const buffered_event_config_1 = require("./config/buffered-event-config");
11
+ /**
12
+ * Simple logger implementation
13
+ */
14
+ class Logger {
15
+ constructor(context) {
16
+ this.context = context;
17
+ }
18
+ log(message, data) {
19
+ console.log(`[${this.context}] ${message}`, data || '');
20
+ }
21
+ warn(message, data) {
22
+ console.warn(`[${this.context}] ${message}`, data || '');
23
+ }
24
+ error(message, error) {
25
+ console.error(`[${this.context}] ${message}`, error || '');
26
+ }
27
+ }
28
+ /**
29
+ * Main service for buffered event processing
30
+ * Provides thread-safe, high-performance event processing with worker threads
31
+ */
32
+ class BufferedEventBusService extends events_1.EventEmitter {
33
+ constructor(options = {}) {
34
+ super();
35
+ this.logger = new Logger(BufferedEventBusService.name);
36
+ this.handlers = new Map();
37
+ this.isInitialized = false;
38
+ this.isShuttingDown = false;
39
+ this.syncProcessingQueue = [];
40
+ // Load and validate configuration
41
+ const userConfig = options.config || {};
42
+ const envConfig = buffered_event_config_1.BufferedEventConfigLoader.fromEnvironment();
43
+ const mergedConfig = { ...userConfig, ...envConfig };
44
+ const validationErrors = buffered_event_config_1.BufferedEventConfigValidator.validate(mergedConfig);
45
+ if (validationErrors.length > 0) {
46
+ throw new Error(`Invalid buffered event configuration: ${validationErrors.join(', ')}`);
47
+ }
48
+ this.config = buffered_event_config_1.BufferedEventConfigValidator.mergeWithDefaults(mergedConfig);
49
+ this.fallbackToSync = options.fallbackToSync ?? this.config.fallbackToSync;
50
+ this.logger.log('BufferedEventBusService initialized with configuration', {
51
+ workerCount: this.config.workerCount,
52
+ maxQueueSize: this.config.maxQueueSize,
53
+ maxMemoryMB: this.config.maxMemoryMB,
54
+ fallbackToSync: this.fallbackToSync
55
+ });
56
+ }
57
+ /**
58
+ * Initialize the buffered event bus service
59
+ */
60
+ async initialize() {
61
+ if (!this.config.enabled) {
62
+ this.logger.warn('Buffered event processing is disabled');
63
+ return;
64
+ }
65
+ try {
66
+ await this.initializeComponents();
67
+ this.logger.log('BufferedEventBusService successfully initialized');
68
+ }
69
+ catch (error) {
70
+ this.logger.error('Failed to initialize BufferedEventBusService', error);
71
+ if (this.fallbackToSync) {
72
+ this.logger.warn('Falling back to synchronous event processing');
73
+ this.startSyncProcessing();
74
+ }
75
+ else {
76
+ throw error;
77
+ }
78
+ }
79
+ }
80
+ /**
81
+ * Initialize all components
82
+ */
83
+ async initializeComponents() {
84
+ this.logger.log('Initializing buffered event processing components');
85
+ // Initialize shared buffer
86
+ this.sharedBuffer = new shared_buffer_1.SharedEventBuffer({
87
+ maxEvents: this.config.maxQueueSize,
88
+ maxEventSize: this.config.maxEventSize,
89
+ totalMemoryMB: this.config.maxMemoryMB
90
+ });
91
+ // Initialize metrics collector
92
+ this.metricsCollector = new event_metrics_1.EventMetricsCollector(this.config);
93
+ // Initialize retry handler
94
+ this.retryHandler = new retry_handler_1.RetryHandler(this.config);
95
+ // Initialize worker manager
96
+ this.workerManager = new worker_manager_1.WorkerManager(this.config, this.sharedBuffer.getSharedBuffer(), this.metricsCollector);
97
+ // Initialize health monitor
98
+ this.healthMonitor = new health_monitor_1.EventSystemHealthMonitor(this.config, this.metricsCollector);
99
+ // Setup event handlers
100
+ this.setupEventHandlers();
101
+ // Initialize worker pool
102
+ await this.workerManager.initialize();
103
+ // Start monitoring
104
+ this.startMonitoring();
105
+ this.isInitialized = true;
106
+ this.emit('initialized');
107
+ }
108
+ /**
109
+ * Setup event handlers for worker manager and health monitor
110
+ */
111
+ setupEventHandlers() {
112
+ // Worker manager events
113
+ this.workerManager.on('worker_restart_failed', (workerId, error) => {
114
+ this.logger.error(`Worker ${workerId} restart failed`, error);
115
+ this.emit('worker_error', { workerId, error });
116
+ });
117
+ // Health monitor would emit events if it extended EventEmitter
118
+ // For now, we'll handle this through periodic checks
119
+ }
120
+ /**
121
+ * Handle detected bottlenecks with auto-scaling
122
+ */
123
+ async handleBottleneck(report) {
124
+ if (report.type === 'slow_processing' && report.severity === 'high') {
125
+ const currentWorkers = this.workerManager.getHealthyWorkerCount();
126
+ const maxWorkers = Math.min(currentWorkers * 2, this.config.workerCount * 2);
127
+ if (currentWorkers < maxWorkers) {
128
+ this.logger.log(`Scaling up workers from ${currentWorkers} to ${maxWorkers}`);
129
+ await this.workerManager.scaleWorkers(maxWorkers);
130
+ }
131
+ }
132
+ }
133
+ /**
134
+ * Start monitoring intervals
135
+ */
136
+ startMonitoring() {
137
+ if (this.config.monitoring.enabled) {
138
+ // Metrics collection
139
+ this.metricsInterval = setInterval(() => {
140
+ this.collectAndEmitMetrics();
141
+ }, this.config.monitoring.metricsInterval);
142
+ // Health monitoring
143
+ if (this.config.monitoring.healthMonitoring) {
144
+ this.healthCheckInterval = setInterval(() => {
145
+ this.performHealthCheck();
146
+ }, this.config.monitoring.healthCheckInterval);
147
+ }
148
+ }
149
+ }
150
+ /**
151
+ * Collect metrics and emit events
152
+ */
153
+ collectAndEmitMetrics() {
154
+ try {
155
+ const queueMetrics = this.sharedBuffer.getStats();
156
+ const retryStats = this.retryHandler.getRetryStats();
157
+ const deadLetterQueueSize = this.retryHandler.getDeadLetterQueue().length;
158
+ const metrics = this.metricsCollector.collectMetrics(queueMetrics.size, { critical: 0, normal: 0, low: 0 }, // Priority breakdown not available from current stats
159
+ 0, // Memory usage not available from current stats
160
+ retryStats, deadLetterQueueSize);
161
+ this.emit('metrics', metrics);
162
+ }
163
+ catch (error) {
164
+ this.logger.error('Failed to collect metrics', error);
165
+ }
166
+ }
167
+ /**
168
+ * Perform health check
169
+ */
170
+ async performHealthCheck() {
171
+ try {
172
+ const healthResult = await this.healthMonitor.performHealthCheck();
173
+ this.emit('health_check', healthResult);
174
+ if (healthResult.status !== 'healthy') {
175
+ this.logger.warn('Health check failed', healthResult);
176
+ }
177
+ }
178
+ catch (error) {
179
+ this.logger.error('Health check failed', error);
180
+ }
181
+ }
182
+ /**
183
+ * Register an event handler
184
+ */
185
+ registerHandler(eventType, handler) {
186
+ this.handlers.set(eventType, handler);
187
+ if (this.isInitialized && this.workerManager) {
188
+ this.workerManager.registerHandler(eventType, handler);
189
+ }
190
+ this.logger.log(`Registered handler for event type: ${eventType}`);
191
+ }
192
+ /**
193
+ * Unregister an event handler
194
+ */
195
+ unregisterHandler(eventType) {
196
+ this.handlers.delete(eventType);
197
+ this.logger.log(`Unregistered handler for event type: ${eventType}`);
198
+ }
199
+ /**
200
+ * Emit an event for processing
201
+ */
202
+ async emitEvent(eventType, data, options = {}) {
203
+ const eventId = this.generateEventId();
204
+ const priority = options.priority || 'normal';
205
+ const timestamp = Date.now();
206
+ const event = {
207
+ type: eventType,
208
+ payload: data,
209
+ priority,
210
+ timestamp,
211
+ retryCount: 0,
212
+ correlationId: eventId
213
+ };
214
+ try {
215
+ // Check if system is healthy and initialized
216
+ if (!this.isInitialized || this.isShuttingDown) {
217
+ if (this.fallbackToSync) {
218
+ return await this.processSyncEvent(event);
219
+ }
220
+ else {
221
+ throw new Error('Buffered event system is not available');
222
+ }
223
+ }
224
+ // Record event enqueued
225
+ this.metricsCollector.recordEventEnqueued(priority);
226
+ // Try to enqueue event
227
+ const enqueued = this.sharedBuffer.enqueue(event);
228
+ if (!enqueued) {
229
+ this.metricsCollector.recordEventDropped();
230
+ if (this.fallbackToSync) {
231
+ this.logger.warn(`Queue full, processing event ${eventId} synchronously`);
232
+ return await this.processSyncEvent(event);
233
+ }
234
+ else {
235
+ throw new Error('Event queue is full');
236
+ }
237
+ }
238
+ return {
239
+ success: true,
240
+ eventId: event.correlationId || this.generateEventId(),
241
+ processingTime: 0 // Will be updated when processed
242
+ };
243
+ }
244
+ catch (error) {
245
+ this.logger.error(`Failed to emit event ${eventType}`, error);
246
+ return {
247
+ success: false,
248
+ eventId,
249
+ error: error instanceof Error ? error.message : String(error)
250
+ };
251
+ }
252
+ }
253
+ /**
254
+ * Process event synchronously as fallback
255
+ */
256
+ async processSyncEvent(event) {
257
+ const startTime = Date.now();
258
+ try {
259
+ const handler = this.handlers.get(event.type);
260
+ if (!handler) {
261
+ throw new Error(`No handler registered for event type: ${event.type}`);
262
+ }
263
+ await handler.handle(event);
264
+ const processingTime = Date.now() - startTime;
265
+ this.metricsCollector.recordEventProcessed(processingTime, 0);
266
+ return {
267
+ success: true,
268
+ eventId: event.correlationId || this.generateEventId(),
269
+ processingTime
270
+ };
271
+ }
272
+ catch (error) {
273
+ const processingTime = Date.now() - startTime;
274
+ this.metricsCollector.recordEventDropped();
275
+ return {
276
+ success: false,
277
+ eventId: event.correlationId || 'unknown',
278
+ processingTime,
279
+ error: error instanceof Error ? error.message : String(error)
280
+ };
281
+ }
282
+ }
283
+ /**
284
+ * Start synchronous processing for fallback mode
285
+ */
286
+ startSyncProcessing() {
287
+ if (this.syncProcessingInterval) {
288
+ return;
289
+ }
290
+ this.syncProcessingInterval = setInterval(async () => {
291
+ if (this.syncProcessingQueue.length > 0) {
292
+ const event = this.syncProcessingQueue.shift();
293
+ if (event) {
294
+ await this.processSyncEvent(event);
295
+ }
296
+ }
297
+ }, 10); // Process every 10ms
298
+ }
299
+ /**
300
+ * Get current metrics
301
+ */
302
+ getMetrics() {
303
+ if (!this.metricsCollector) {
304
+ return null;
305
+ }
306
+ const queueMetrics = this.sharedBuffer?.getStats() || {
307
+ size: 0,
308
+ maxEvents: 0,
309
+ utilization: 0,
310
+ isFull: false,
311
+ isEmpty: true,
312
+ writeIndex: 0,
313
+ readIndex: 0
314
+ };
315
+ const retryStats = this.retryHandler?.getRetryStats() || {
316
+ totalRetries: 0,
317
+ successfulRetries: 0,
318
+ failedRetries: 0,
319
+ deadLetterCount: 0,
320
+ averageRetryDelay: 0
321
+ };
322
+ const deadLetterQueueSize = this.retryHandler?.getDeadLetterQueue().length || 0;
323
+ return this.metricsCollector.collectMetrics(queueMetrics.size, { critical: 0, normal: 0, low: 0 }, // Priority breakdown not available
324
+ 0, // Memory usage not available
325
+ retryStats, deadLetterQueueSize);
326
+ }
327
+ /**
328
+ * Get health status
329
+ */
330
+ async getHealthStatus() {
331
+ if (!this.healthMonitor) {
332
+ return { healthy: false, reason: 'Health monitor not initialized' };
333
+ }
334
+ return await this.healthMonitor.performHealthCheck();
335
+ }
336
+ /**
337
+ * Get worker statistics
338
+ */
339
+ getWorkerStatistics() {
340
+ if (!this.workerManager) {
341
+ return null;
342
+ }
343
+ return {
344
+ ...this.workerManager.getStatistics(),
345
+ workerStatuses: this.workerManager.getWorkerStatuses()
346
+ };
347
+ }
348
+ /**
349
+ * Scale worker pool
350
+ */
351
+ async scaleWorkers(targetCount) {
352
+ if (!this.workerManager) {
353
+ throw new Error('Worker manager not initialized');
354
+ }
355
+ await this.workerManager.scaleWorkers(targetCount);
356
+ this.logger.log(`Scaled worker pool to ${targetCount} workers`);
357
+ }
358
+ /**
359
+ * Graceful shutdown
360
+ */
361
+ async shutdown() {
362
+ if (this.isShuttingDown) {
363
+ return;
364
+ }
365
+ this.logger.log('Starting graceful shutdown of BufferedEventBusService');
366
+ this.isShuttingDown = true;
367
+ // Clear intervals
368
+ if (this.metricsInterval) {
369
+ clearInterval(this.metricsInterval);
370
+ }
371
+ if (this.healthCheckInterval) {
372
+ clearInterval(this.healthCheckInterval);
373
+ }
374
+ if (this.syncProcessingInterval) {
375
+ clearInterval(this.syncProcessingInterval);
376
+ }
377
+ // Shutdown components
378
+ if (this.workerManager) {
379
+ await this.workerManager.shutdown();
380
+ }
381
+ this.emit('shutdown');
382
+ this.logger.log('BufferedEventBusService shutdown complete');
383
+ }
384
+ /**
385
+ * Generate unique event ID
386
+ */
387
+ generateEventId() {
388
+ return `evt_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
389
+ }
390
+ /**
391
+ * Check if the service is initialized and ready
392
+ */
393
+ isReady() {
394
+ return this.isInitialized && !this.isShuttingDown;
395
+ }
396
+ /**
397
+ * Get configuration
398
+ */
399
+ getConfig() {
400
+ return { ...this.config };
401
+ }
402
+ /**
403
+ * Update configuration (requires restart)
404
+ */
405
+ async updateConfig(newConfig) {
406
+ const validationErrors = buffered_event_config_1.BufferedEventConfigValidator.validate(newConfig);
407
+ if (validationErrors.length > 0) {
408
+ throw new Error(`Invalid configuration: ${validationErrors.join(', ')}`);
409
+ }
410
+ this.logger.log('Configuration update requested, restarting service');
411
+ await this.shutdown();
412
+ this.config = buffered_event_config_1.BufferedEventConfigValidator.mergeWithDefaults({
413
+ ...this.config,
414
+ ...newConfig
415
+ });
416
+ await this.initializeComponents();
417
+ }
418
+ }
419
+ exports.BufferedEventBusService = BufferedEventBusService;
420
+ //# sourceMappingURL=buffered-event-bus.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffered-event-bus.service.js","sourceRoot":"","sources":["../../src/events/buffered-event-bus.service.ts"],"names":[],"mappings":";;;AAAA,mCAAsC;AACtC,mDAAkF;AAClF,4DAAwD;AACxD,2DAAgE;AAChE,gEAAuE;AACvE,yDAAqD;AACrD,0EAA8H;AAG9H;;GAEG;AACH,MAAM,MAAM;IACV,YAAoB,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAEvC,GAAG,CAAC,OAAe,EAAE,IAAU;QAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAU;QAC9B,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAW;QAChC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF;AAuBD;;;GAGG;AACH,MAAa,uBAAwB,SAAQ,qBAAY;IAuBvD,YAAY,UAAmC,EAAE;QAC/C,KAAK,EAAE,CAAC;QAvBO,WAAM,GAAG,IAAI,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAS3D,aAAQ,GAA+B,IAAI,GAAG,EAAE,CAAC;QACjD,kBAAa,GAAG,KAAK,CAAC;QACtB,mBAAc,GAAG,KAAK,CAAC;QAIvB,wBAAmB,GAAoB,EAAE,CAAC;QAUhD,kCAAkC;QAClC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,iDAAyB,CAAC,eAAe,EAAE,CAAC;QAC9D,MAAM,YAAY,GAAG,EAAE,GAAG,UAAU,EAAE,GAAG,SAAS,EAAE,CAAC;QAErD,MAAM,gBAAgB,GAAG,oDAA4B,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC7E,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,yCAAyC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,oDAA4B,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAC3E,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QAE3E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wDAAwD,EAAE;YACxE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACtC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;YAEzE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBACjE,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB;QAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QAErE,2BAA2B;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,iCAAiB,CAAC;YACxC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACnC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACtC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;SACvC,CAAC,CAAC;QAEH,+BAA+B;QAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,qCAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE/D,2BAA2B;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,4BAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAElD,4BAA4B;QAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,8BAAa,CACpC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,EACnC,IAAI,CAAC,gBAAgB,CACtB,CAAC;QAEF,4BAA4B;QAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,yCAAwB,CAC/C,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,gBAAgB,CACtB,CAAC;QAEF,uBAAuB;QACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,yBAAyB;QACzB,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAEtC,mBAAmB;QACnB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,kBAAkB;QACxB,wBAAwB;QACxB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,uBAAuB,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YACjE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,QAAQ,iBAAiB,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,+DAA+D;QAC/D,qDAAqD;IACvD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,MAAW;QACxC,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YACpE,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;YAClE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;YAE7E,IAAI,cAAc,GAAG,UAAU,EAAE,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,cAAc,OAAO,UAAU,EAAE,CAAC,CAAC;gBAC9E,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACnC,qBAAqB;YACrB,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;gBACtC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;YAE3C,oBAAoB;YACpB,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;gBAC5C,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,GAAG,EAAE;oBAC1C,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;YACrD,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC;YAE1E,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAClD,YAAY,CAAC,IAAI,EACjB,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,sDAAsD;YAC1F,CAAC,EAAE,gDAAgD;YACnD,UAAU,EACV,mBAAmB,CACpB,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB;QAC9B,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC;YACnE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;YAExC,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,SAAiB,EAAE,OAAsB;QAC9D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEtC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7C,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,SAAiB;QACxC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,SAAS,CACpB,SAAiB,EACjB,IAAS,EACT,UAII,EAAE;QAEN,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,KAAK,GAAkB;YAC3B,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,IAAI;YACb,QAAQ;YACR,SAAS;YACT,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,OAAO;SACvB,CAAC;QAEF,IAAI,CAAC;YACH,6CAA6C;YAC7C,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC/C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;YAED,wBAAwB;YACxB,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAEpD,uBAAuB;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAElD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;gBAE3C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,OAAO,gBAAgB,CAAC,CAAC;oBAC1E,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,eAAe,EAAE;gBACtD,cAAc,EAAE,CAAC,CAAC,iCAAiC;aACpD,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;YAE9D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO;gBACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,KAAoB;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE5B,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC9C,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAE9D,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,eAAe,EAAE;gBACtD,cAAc;aACf,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC9C,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;YAE3C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,KAAK,CAAC,aAAa,IAAI,SAAS;gBACzC,cAAc;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,sBAAsB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACnD,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;gBAC/C,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB;IAC/B,CAAC;IAED;;OAEG;IACI,UAAU;QACf,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI;YACpD,IAAI,EAAE,CAAC;YACP,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;SACb,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,EAAE,IAAI;YACvD,YAAY,EAAE,CAAC;YACf,iBAAiB,EAAE,CAAC;YACpB,aAAa,EAAE,CAAC;YAChB,eAAe,EAAE,CAAC;YAClB,iBAAiB,EAAE,CAAC;SACrB,CAAC;QAEF,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE,kBAAkB,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC;QAEhF,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CACzC,YAAY,CAAC,IAAI,EACjB,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,mCAAmC;QACvE,CAAC,EAAE,6BAA6B;QAChC,UAAU,EACV,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC;QACtE,CAAC;QAED,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC;IACvD,CAAC;IAED;;OAEG;IACI,mBAAmB;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE;YACrC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE;SACvD,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY,CAAC,WAAmB;QAC3C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yBAAyB,WAAW,UAAU,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,QAAQ;QACnB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACzE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAE3B,kBAAkB;QAClB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7C,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACxE,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,OAAO,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;IACpD,CAAC;IAED;;OAEG;IACI,SAAS;QACd,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY,CAAC,SAAuC;QAC/D,MAAM,gBAAgB,GAAG,oDAA4B,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1E,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,0BAA0B,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAEtE,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,oDAA4B,CAAC,iBAAiB,CAAC;YAC3D,GAAG,IAAI,CAAC,MAAM;YACd,GAAG,SAAS;SACb,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACpC,CAAC;CACF;AA/eD,0DA+eC"}