@orchestr-sh/orchestr 1.6.1 → 1.7.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 (159) hide show
  1. package/README.md +289 -22
  2. package/dist/Console/Commands/EventCacheCommand.d.ts +15 -0
  3. package/dist/Console/Commands/EventCacheCommand.d.ts.map +1 -0
  4. package/dist/Console/Commands/EventCacheCommand.js +99 -0
  5. package/dist/Console/Commands/EventCacheCommand.js.map +1 -0
  6. package/dist/Console/Commands/EventClearCommand.d.ts +15 -0
  7. package/dist/Console/Commands/EventClearCommand.d.ts.map +1 -0
  8. package/dist/Console/Commands/EventClearCommand.js +71 -0
  9. package/dist/Console/Commands/EventClearCommand.js.map +1 -0
  10. package/dist/Console/Commands/EventListCommand.d.ts +19 -0
  11. package/dist/Console/Commands/EventListCommand.d.ts.map +1 -0
  12. package/dist/Console/Commands/EventListCommand.js +106 -0
  13. package/dist/Console/Commands/EventListCommand.js.map +1 -0
  14. package/dist/Console/Commands/MakeEventCommand.d.ts +27 -0
  15. package/dist/Console/Commands/MakeEventCommand.d.ts.map +1 -0
  16. package/dist/Console/Commands/MakeEventCommand.js +117 -0
  17. package/dist/Console/Commands/MakeEventCommand.js.map +1 -0
  18. package/dist/Console/Commands/MakeListenerCommand.d.ts +27 -0
  19. package/dist/Console/Commands/MakeListenerCommand.d.ts.map +1 -0
  20. package/dist/Console/Commands/MakeListenerCommand.js +157 -0
  21. package/dist/Console/Commands/MakeListenerCommand.js.map +1 -0
  22. package/dist/Console/orchestr.js +10 -0
  23. package/dist/Console/orchestr.js.map +1 -1
  24. package/dist/Contracts/Events/Dispatcher.d.ts +94 -0
  25. package/dist/Contracts/Events/Dispatcher.d.ts.map +1 -0
  26. package/dist/Contracts/Events/Dispatcher.js +9 -0
  27. package/dist/Contracts/Events/Dispatcher.js.map +1 -0
  28. package/dist/Contracts/Events/index.d.ts +7 -0
  29. package/dist/Contracts/Events/index.d.ts.map +1 -0
  30. package/dist/Contracts/Events/index.js +8 -0
  31. package/dist/Contracts/Events/index.js.map +1 -0
  32. package/dist/Database/Ensemble/Ensemble.d.ts +7 -0
  33. package/dist/Database/Ensemble/Ensemble.d.ts.map +1 -1
  34. package/dist/Database/Ensemble/Ensemble.js +119 -0
  35. package/dist/Database/Ensemble/Ensemble.js.map +1 -1
  36. package/dist/Database/Ensemble/EnsembleBuilder.d.ts.map +1 -1
  37. package/dist/Database/Ensemble/EnsembleBuilder.js +7 -0
  38. package/dist/Database/Ensemble/EnsembleBuilder.js.map +1 -1
  39. package/dist/Database/Ensemble/Events/ModelCreated.d.ts +11 -0
  40. package/dist/Database/Ensemble/Events/ModelCreated.d.ts.map +1 -0
  41. package/dist/Database/Ensemble/Events/ModelCreated.js +16 -0
  42. package/dist/Database/Ensemble/Events/ModelCreated.js.map +1 -0
  43. package/dist/Database/Ensemble/Events/ModelCreating.d.ts +12 -0
  44. package/dist/Database/Ensemble/Events/ModelCreating.d.ts.map +1 -0
  45. package/dist/Database/Ensemble/Events/ModelCreating.js +17 -0
  46. package/dist/Database/Ensemble/Events/ModelCreating.js.map +1 -0
  47. package/dist/Database/Ensemble/Events/ModelDeleted.d.ts +11 -0
  48. package/dist/Database/Ensemble/Events/ModelDeleted.d.ts.map +1 -0
  49. package/dist/Database/Ensemble/Events/ModelDeleted.js +16 -0
  50. package/dist/Database/Ensemble/Events/ModelDeleted.js.map +1 -0
  51. package/dist/Database/Ensemble/Events/ModelDeleting.d.ts +12 -0
  52. package/dist/Database/Ensemble/Events/ModelDeleting.d.ts.map +1 -0
  53. package/dist/Database/Ensemble/Events/ModelDeleting.js +17 -0
  54. package/dist/Database/Ensemble/Events/ModelDeleting.js.map +1 -0
  55. package/dist/Database/Ensemble/Events/ModelEvent.d.ts +17 -0
  56. package/dist/Database/Ensemble/Events/ModelEvent.d.ts.map +1 -0
  57. package/dist/Database/Ensemble/Events/ModelEvent.js +22 -0
  58. package/dist/Database/Ensemble/Events/ModelEvent.js.map +1 -0
  59. package/dist/Database/Ensemble/Events/ModelRetrieved.d.ts +11 -0
  60. package/dist/Database/Ensemble/Events/ModelRetrieved.d.ts.map +1 -0
  61. package/dist/Database/Ensemble/Events/ModelRetrieved.js +16 -0
  62. package/dist/Database/Ensemble/Events/ModelRetrieved.js.map +1 -0
  63. package/dist/Database/Ensemble/Events/ModelSaved.d.ts +11 -0
  64. package/dist/Database/Ensemble/Events/ModelSaved.d.ts.map +1 -0
  65. package/dist/Database/Ensemble/Events/ModelSaved.js +16 -0
  66. package/dist/Database/Ensemble/Events/ModelSaved.js.map +1 -0
  67. package/dist/Database/Ensemble/Events/ModelSaving.d.ts +12 -0
  68. package/dist/Database/Ensemble/Events/ModelSaving.d.ts.map +1 -0
  69. package/dist/Database/Ensemble/Events/ModelSaving.js +17 -0
  70. package/dist/Database/Ensemble/Events/ModelSaving.js.map +1 -0
  71. package/dist/Database/Ensemble/Events/ModelUpdated.d.ts +11 -0
  72. package/dist/Database/Ensemble/Events/ModelUpdated.d.ts.map +1 -0
  73. package/dist/Database/Ensemble/Events/ModelUpdated.js +16 -0
  74. package/dist/Database/Ensemble/Events/ModelUpdated.js.map +1 -0
  75. package/dist/Database/Ensemble/Events/ModelUpdating.d.ts +12 -0
  76. package/dist/Database/Ensemble/Events/ModelUpdating.d.ts.map +1 -0
  77. package/dist/Database/Ensemble/Events/ModelUpdating.js +17 -0
  78. package/dist/Database/Ensemble/Events/ModelUpdating.js.map +1 -0
  79. package/dist/Database/Ensemble/Events/index.d.ts +16 -0
  80. package/dist/Database/Ensemble/Events/index.d.ts.map +1 -0
  81. package/dist/Database/Ensemble/Events/index.js +29 -0
  82. package/dist/Database/Ensemble/Events/index.js.map +1 -0
  83. package/dist/Events/Concerns/Dispatchable.d.ts +121 -0
  84. package/dist/Events/Concerns/Dispatchable.d.ts.map +1 -0
  85. package/dist/Events/Concerns/Dispatchable.js +165 -0
  86. package/dist/Events/Concerns/Dispatchable.js.map +1 -0
  87. package/dist/Events/Contracts/Dispatcher.d.ts +144 -0
  88. package/dist/Events/Contracts/Dispatcher.d.ts.map +1 -0
  89. package/dist/Events/Contracts/Dispatcher.js +3 -0
  90. package/dist/Events/Contracts/Dispatcher.js.map +1 -0
  91. package/dist/Events/Contracts/ShouldDispatchAfterCommit.d.ts +21 -0
  92. package/dist/Events/Contracts/ShouldDispatchAfterCommit.d.ts.map +1 -0
  93. package/dist/Events/Contracts/ShouldDispatchAfterCommit.js +3 -0
  94. package/dist/Events/Contracts/ShouldDispatchAfterCommit.js.map +1 -0
  95. package/dist/Events/Decorators/HandlesEvents.d.ts +83 -0
  96. package/dist/Events/Decorators/HandlesEvents.d.ts.map +1 -0
  97. package/dist/Events/Decorators/HandlesEvents.js +105 -0
  98. package/dist/Events/Decorators/HandlesEvents.js.map +1 -0
  99. package/dist/Events/Dispatcher.d.ts +201 -0
  100. package/dist/Events/Dispatcher.d.ts.map +1 -0
  101. package/dist/Events/Dispatcher.js +359 -0
  102. package/dist/Events/Dispatcher.js.map +1 -0
  103. package/dist/Events/Event.d.ts +140 -0
  104. package/dist/Events/Event.d.ts.map +1 -0
  105. package/dist/Events/Event.js +266 -0
  106. package/dist/Events/Event.js.map +1 -0
  107. package/dist/Events/EventDiscoveryCache.d.ts +205 -0
  108. package/dist/Events/EventDiscoveryCache.d.ts.map +1 -0
  109. package/dist/Events/EventDiscoveryCache.js +310 -0
  110. package/dist/Events/EventDiscoveryCache.js.map +1 -0
  111. package/dist/Events/EventServiceProvider.d.ts +148 -0
  112. package/dist/Events/EventServiceProvider.d.ts.map +1 -0
  113. package/dist/Events/EventServiceProvider.js +258 -0
  114. package/dist/Events/EventServiceProvider.js.map +1 -0
  115. package/dist/Events/NullDispatcher.d.ts +97 -0
  116. package/dist/Events/NullDispatcher.d.ts.map +1 -0
  117. package/dist/Events/NullDispatcher.js +118 -0
  118. package/dist/Events/NullDispatcher.js.map +1 -0
  119. package/dist/Events/PendingDispatch.d.ts +119 -0
  120. package/dist/Events/PendingDispatch.d.ts.map +1 -0
  121. package/dist/Events/PendingDispatch.js +162 -0
  122. package/dist/Events/PendingDispatch.js.map +1 -0
  123. package/dist/Events/index.d.ts +12 -0
  124. package/dist/Events/index.d.ts.map +1 -0
  125. package/dist/Events/index.js +20 -0
  126. package/dist/Events/index.js.map +1 -0
  127. package/dist/Events/types.d.ts +77 -0
  128. package/dist/Events/types.d.ts.map +1 -0
  129. package/dist/Events/types.js +3 -0
  130. package/dist/Events/types.js.map +1 -0
  131. package/dist/Facades/Event.d.ts +200 -0
  132. package/dist/Facades/Event.d.ts.map +1 -0
  133. package/dist/Facades/Event.js +331 -0
  134. package/dist/Facades/Event.js.map +1 -0
  135. package/dist/Foundation/Application.d.ts +33 -0
  136. package/dist/Foundation/Application.d.ts.map +1 -1
  137. package/dist/Foundation/Application.js +40 -0
  138. package/dist/Foundation/Application.js.map +1 -1
  139. package/dist/Listeners/Contracts/ShouldQueue.d.ts +142 -0
  140. package/dist/Listeners/Contracts/ShouldQueue.d.ts.map +1 -0
  141. package/dist/Listeners/Contracts/ShouldQueue.js +20 -0
  142. package/dist/Listeners/Contracts/ShouldQueue.js.map +1 -0
  143. package/dist/Listeners/Contracts/ShouldQueueAfterCommit.d.ts +24 -0
  144. package/dist/Listeners/Contracts/ShouldQueueAfterCommit.d.ts.map +1 -0
  145. package/dist/Listeners/Contracts/ShouldQueueAfterCommit.js +3 -0
  146. package/dist/Listeners/Contracts/ShouldQueueAfterCommit.js.map +1 -0
  147. package/dist/Support/EventDiscovery.d.ts +142 -0
  148. package/dist/Support/EventDiscovery.d.ts.map +1 -0
  149. package/dist/Support/EventDiscovery.js +302 -0
  150. package/dist/Support/EventDiscovery.js.map +1 -0
  151. package/dist/Support/Testing/Fakes/EventFake.d.ts +291 -0
  152. package/dist/Support/Testing/Fakes/EventFake.d.ts.map +1 -0
  153. package/dist/Support/Testing/Fakes/EventFake.js +444 -0
  154. package/dist/Support/Testing/Fakes/EventFake.js.map +1 -0
  155. package/dist/index.d.ts +6 -0
  156. package/dist/index.d.ts.map +1 -1
  157. package/dist/index.js +11 -1
  158. package/dist/index.js.map +1 -1
  159. package/package.json +3 -3
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ /**
3
+ * Event Base Class
4
+ *
5
+ * Base class for all events in the application
6
+ * Provides serialization support and broadcasting capabilities
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * class UserRegistered extends Event {
11
+ * constructor(public readonly user: User) {
12
+ * super();
13
+ * }
14
+ * }
15
+ *
16
+ * // Dispatch the event
17
+ * UserRegistered.dispatch(user);
18
+ * ```
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.Event = void 0;
22
+ /**
23
+ * Abstract Event base class
24
+ *
25
+ * All application events should extend this class.
26
+ * It provides:
27
+ * - Event metadata storage
28
+ * - Serialization for queueing
29
+ * - Broadcasting support
30
+ * - Static dispatch methods (via Dispatchable mixin)
31
+ */
32
+ class Event {
33
+ /**
34
+ * Properties to exclude from serialization
35
+ * Override in child classes to specify which properties should not be serialized
36
+ */
37
+ static serializable = [];
38
+ /**
39
+ * The name of the connection the job should be sent to
40
+ * Used when queueing event listeners
41
+ */
42
+ connection;
43
+ /**
44
+ * The name of the queue the job should be sent to
45
+ * Used when queueing event listeners
46
+ */
47
+ queue;
48
+ /**
49
+ * The number of seconds before the job should be processed
50
+ * Used when queueing event listeners
51
+ */
52
+ delay;
53
+ /**
54
+ * Convert event to JSON for queue serialization
55
+ *
56
+ * Serializes all public properties except those listed in the serializable array
57
+ *
58
+ * @returns Object representation of the event
59
+ */
60
+ toJSON() {
61
+ const data = {
62
+ _class: this.constructor.name,
63
+ };
64
+ // Get constructor
65
+ const ctor = this.constructor;
66
+ // Get all property names
67
+ const properties = Object.getOwnPropertyNames(this);
68
+ for (const prop of properties) {
69
+ // Skip if in serializable exclusion list
70
+ if (ctor.serializable.includes(prop)) {
71
+ continue;
72
+ }
73
+ // Skip private properties (starting with _)
74
+ if (prop.startsWith('_')) {
75
+ continue;
76
+ }
77
+ // Get the value
78
+ const value = this[prop];
79
+ // Serialize the value
80
+ if (value !== undefined) {
81
+ data[prop] = this.serializeValue(value);
82
+ }
83
+ }
84
+ return data;
85
+ }
86
+ /**
87
+ * Serialize a value for JSON storage
88
+ *
89
+ * @param value - Value to serialize
90
+ * @returns Serialized value
91
+ */
92
+ serializeValue(value) {
93
+ // Handle null/undefined
94
+ if (value === null || value === undefined) {
95
+ return value;
96
+ }
97
+ // Handle Date objects
98
+ if (value instanceof Date) {
99
+ return {
100
+ _type: 'Date',
101
+ value: value.toISOString(),
102
+ };
103
+ }
104
+ // Handle objects with toJSON method
105
+ if (typeof value === 'object' && typeof value.toJSON === 'function') {
106
+ return value.toJSON();
107
+ }
108
+ // Handle arrays
109
+ if (Array.isArray(value)) {
110
+ return value.map((item) => this.serializeValue(item));
111
+ }
112
+ // Handle plain objects
113
+ if (typeof value === 'object') {
114
+ const serialized = {};
115
+ for (const [key, val] of Object.entries(value)) {
116
+ serialized[key] = this.serializeValue(val);
117
+ }
118
+ return serialized;
119
+ }
120
+ // Return primitives as-is
121
+ return value;
122
+ }
123
+ /**
124
+ * Recreate event from JSON
125
+ *
126
+ * This method should be overridden in child classes if custom deserialization is needed
127
+ *
128
+ * @param data - Serialized event data
129
+ * @returns Event instance
130
+ */
131
+ static fromJSON(data) {
132
+ // Create a new instance without calling constructor
133
+ const instance = Object.create(this.prototype);
134
+ // Restore properties
135
+ for (const [key, value] of Object.entries(data)) {
136
+ if (key === '_class')
137
+ continue;
138
+ instance[key] = this.deserializeValue(value);
139
+ }
140
+ return instance;
141
+ }
142
+ /**
143
+ * Deserialize a value from JSON
144
+ *
145
+ * @param value - Serialized value
146
+ * @returns Deserialized value
147
+ */
148
+ static deserializeValue(value) {
149
+ // Handle null/undefined
150
+ if (value === null || value === undefined) {
151
+ return value;
152
+ }
153
+ // Handle special type markers
154
+ if (typeof value === 'object' && value._type) {
155
+ switch (value._type) {
156
+ case 'Date':
157
+ return new Date(value.value);
158
+ default:
159
+ return value;
160
+ }
161
+ }
162
+ // Handle arrays
163
+ if (Array.isArray(value)) {
164
+ return value.map((item) => this.deserializeValue(item));
165
+ }
166
+ // Handle plain objects
167
+ if (typeof value === 'object') {
168
+ const deserialized = {};
169
+ for (const [key, val] of Object.entries(value)) {
170
+ deserialized[key] = this.deserializeValue(val);
171
+ }
172
+ return deserialized;
173
+ }
174
+ // Return primitives as-is
175
+ return value;
176
+ }
177
+ /**
178
+ * Get the broadcast channel name(s)
179
+ *
180
+ * Override in child classes to specify which channels this event should broadcast on
181
+ *
182
+ * @returns Channel name(s) or empty array for no broadcasting
183
+ *
184
+ * @example
185
+ * ```typescript
186
+ * broadcastOn(): string | string[] {
187
+ * return 'users.' + this.user.id;
188
+ * }
189
+ * ```
190
+ */
191
+ broadcastOn() {
192
+ return [];
193
+ }
194
+ /**
195
+ * Get the data to broadcast
196
+ *
197
+ * Override in child classes to customize the broadcast payload
198
+ * By default, returns all public properties
199
+ *
200
+ * @returns Data to broadcast
201
+ *
202
+ * @example
203
+ * ```typescript
204
+ * broadcastWith(): Record<string, any> {
205
+ * return {
206
+ * userId: this.user.id,
207
+ * userName: this.user.name,
208
+ * };
209
+ * }
210
+ * ```
211
+ */
212
+ broadcastWith() {
213
+ const data = {};
214
+ // Get all property names
215
+ const properties = Object.getOwnPropertyNames(this);
216
+ for (const prop of properties) {
217
+ // Skip private properties
218
+ if (prop.startsWith('_')) {
219
+ continue;
220
+ }
221
+ // Skip queue-related properties
222
+ if (['connection', 'queue', 'delay'].includes(prop)) {
223
+ continue;
224
+ }
225
+ const value = this[prop];
226
+ if (value !== undefined) {
227
+ data[prop] = value;
228
+ }
229
+ }
230
+ return data;
231
+ }
232
+ /**
233
+ * Get the broadcast event name
234
+ *
235
+ * Override in child classes to customize the event name sent to clients
236
+ * By default, returns the class name
237
+ *
238
+ * @returns Event name for broadcasting
239
+ *
240
+ * @example
241
+ * ```typescript
242
+ * broadcastAs(): string {
243
+ * return 'user.registered';
244
+ * }
245
+ * ```
246
+ */
247
+ broadcastAs() {
248
+ return this.constructor.name;
249
+ }
250
+ /**
251
+ * Determine if this event should broadcast
252
+ *
253
+ * Override in child classes to conditionally broadcast events
254
+ *
255
+ * @returns True if event should broadcast
256
+ */
257
+ shouldBroadcast() {
258
+ const channels = this.broadcastOn();
259
+ return Array.isArray(channels) ? channels.length > 0 : !!channels;
260
+ }
261
+ }
262
+ exports.Event = Event;
263
+ // Apply Dispatchable mixin to Event class
264
+ const Dispatchable_1 = require("./Concerns/Dispatchable");
265
+ (0, Dispatchable_1.applyDispatchable)(Event);
266
+ //# sourceMappingURL=Event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Event.js","sourceRoot":"","sources":["../../src/Events/Event.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,205 @@
1
+ import { Application } from '../Foundation/Application';
2
+ /**
3
+ * Cache entry structure for discovered events
4
+ */
5
+ export interface CachedEventEntry {
6
+ /**
7
+ * Event class name
8
+ */
9
+ event: string;
10
+ /**
11
+ * Array of listener class paths that handle this event
12
+ */
13
+ listeners: string[];
14
+ /**
15
+ * Timestamp when this entry was cached
16
+ */
17
+ cachedAt: number;
18
+ }
19
+ /**
20
+ * Cache structure for all discovered events
21
+ */
22
+ export interface EventCache {
23
+ /**
24
+ * Version of the cache format (for future compatibility)
25
+ */
26
+ version: string;
27
+ /**
28
+ * Timestamp when the cache was generated
29
+ */
30
+ generatedAt: number;
31
+ /**
32
+ * Map of event names to their cached entries
33
+ */
34
+ events: Record<string, CachedEventEntry>;
35
+ }
36
+ /**
37
+ * EventDiscoveryCache
38
+ *
39
+ * Manages caching of discovered event-listener mappings to improve performance.
40
+ * Cache is stored as JSON in the storage/framework directory.
41
+ *
42
+ * This prevents the need to scan and parse TypeScript files on every application
43
+ * boot in production environments.
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * const cache = new EventDiscoveryCache(app)
48
+ *
49
+ * // Check if cache exists
50
+ * if (cache.exists()) {
51
+ * const listeners = cache.load()
52
+ * }
53
+ *
54
+ * // Store discovered listeners
55
+ * cache.store(discoveredListeners)
56
+ *
57
+ * // Clear cache
58
+ * cache.clear()
59
+ * ```
60
+ */
61
+ export declare class EventDiscoveryCache {
62
+ protected app: Application;
63
+ /**
64
+ * Current cache format version
65
+ */
66
+ private static readonly CACHE_VERSION;
67
+ /**
68
+ * Default cache file path relative to storage directory
69
+ */
70
+ private static readonly CACHE_PATH;
71
+ constructor(app: Application);
72
+ /**
73
+ * Get the full path to the cache file
74
+ *
75
+ * @returns Absolute path to the events cache file
76
+ */
77
+ getCachePath(): string;
78
+ /**
79
+ * Determine if the events cache file exists
80
+ *
81
+ * @returns True if cache file exists and is readable
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * if (cache.exists()) {
86
+ * // Use cached events
87
+ * } else {
88
+ * // Discover events
89
+ * }
90
+ * ```
91
+ */
92
+ exists(): boolean;
93
+ /**
94
+ * Load cached event-listener mappings
95
+ *
96
+ * Reads the cache file and returns a Map of event names to listener paths.
97
+ * If the cache file doesn't exist or is invalid, returns an empty Map.
98
+ *
99
+ * @returns Map of event names to array of listener class paths
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * const listeners = cache.load()
104
+ * // Returns: Map {
105
+ * // 'UserRegistered' => ['Listeners/SendWelcomeEmail', 'Listeners/CreateUserProfile'],
106
+ * // 'OrderPlaced' => ['Listeners/SendOrderConfirmation']
107
+ * // }
108
+ * ```
109
+ */
110
+ load(): Map<string, string[]>;
111
+ /**
112
+ * Store event-listener mappings in cache
113
+ *
114
+ * Writes the discovered listeners to the cache file in JSON format.
115
+ * Creates the cache directory if it doesn't exist.
116
+ *
117
+ * @param listeners Map of event names to listener class paths
118
+ * @returns True if cache was successfully written, false otherwise
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * const discovery = new EventDiscovery(app)
123
+ * const listeners = await discovery.discover([app.path('Listeners')])
124
+ * cache.store(listeners)
125
+ * ```
126
+ */
127
+ store(listeners: Map<string, string[]>): boolean;
128
+ /**
129
+ * Clear the events cache
130
+ *
131
+ * Deletes the cache file. This is typically called by the event:clear command
132
+ * or when the cache needs to be invalidated.
133
+ *
134
+ * @returns True if cache was successfully cleared or didn't exist, false on error
135
+ *
136
+ * @example
137
+ * ```typescript
138
+ * cache.clear()
139
+ * // Cache file deleted, discovery will run on next boot
140
+ * ```
141
+ */
142
+ clear(): boolean;
143
+ /**
144
+ * Get cache metadata
145
+ *
146
+ * Returns information about the cache without loading all entries.
147
+ * Useful for displaying cache status.
148
+ *
149
+ * @returns Cache metadata or null if cache doesn't exist
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * const metadata = cache.getMetadata()
154
+ * console.log(`Cache generated at: ${new Date(metadata.generatedAt)}`)
155
+ * console.log(`Total events: ${Object.keys(metadata.events).length}`)
156
+ * ```
157
+ */
158
+ getMetadata(): Pick<EventCache, 'version' | 'generatedAt'> & {
159
+ eventCount: number;
160
+ } | null;
161
+ /**
162
+ * Check if cache is stale based on a timestamp
163
+ *
164
+ * Useful for invalidating cache based on file modification times
165
+ * or other external factors.
166
+ *
167
+ * @param threshold Timestamp in milliseconds. Cache is stale if older than this.
168
+ * @returns True if cache exists and is older than threshold
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * // Check if cache is older than 1 hour
173
+ * const oneHourAgo = Date.now() - (60 * 60 * 1000)
174
+ * if (cache.isStale(oneHourAgo)) {
175
+ * cache.clear()
176
+ * // Re-discover events
177
+ * }
178
+ * ```
179
+ */
180
+ isStale(threshold: number): boolean;
181
+ /**
182
+ * Get statistics about the cache
183
+ *
184
+ * Returns detailed statistics about cached events and listeners.
185
+ *
186
+ * @returns Cache statistics or null if cache doesn't exist
187
+ *
188
+ * @example
189
+ * ```typescript
190
+ * const stats = cache.getStatistics()
191
+ * console.log(`Total events: ${stats.totalEvents}`)
192
+ * console.log(`Total listeners: ${stats.totalListeners}`)
193
+ * ```
194
+ */
195
+ getStatistics(): {
196
+ totalEvents: number;
197
+ totalListeners: number;
198
+ averageListenersPerEvent: number;
199
+ largestEvent: {
200
+ name: string;
201
+ listenerCount: number;
202
+ } | null;
203
+ } | null;
204
+ }
205
+ //# sourceMappingURL=EventDiscoveryCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventDiscoveryCache.d.ts","sourceRoot":"","sources":["../../src/Events/EventDiscoveryCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAIxD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,mBAAmB;IAWlB,SAAS,CAAC,GAAG,EAAE,WAAW;IAVtC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAS;IAE9C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAA2B;gBAEvC,GAAG,EAAE,WAAW;IAEtC;;;;OAIG;IACH,YAAY,IAAI,MAAM;IAItB;;;;;;;;;;;;;OAaG;IACH,MAAM,IAAI,OAAO;IAQjB;;;;;;;;;;;;;;;;OAgBG;IACH,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAiC7B;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO;IA0ChD;;;;;;;;;;;;;OAaG;IACH,KAAK,IAAI,OAAO;IAmBhB;;;;;;;;;;;;;;OAcG;IACH,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,aAAa,CAAC,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAuB1F;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAUnC;;;;;;;;;;;;;OAaG;IACH,aAAa,IAAI;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,wBAAwB,EAAE,MAAM,CAAC;QACjC,YAAY,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,aAAa,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;KAC9D,GAAG,IAAI;CAqCT"}