@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.
- package/README.md +289 -22
- package/dist/Console/Commands/EventCacheCommand.d.ts +15 -0
- package/dist/Console/Commands/EventCacheCommand.d.ts.map +1 -0
- package/dist/Console/Commands/EventCacheCommand.js +99 -0
- package/dist/Console/Commands/EventCacheCommand.js.map +1 -0
- package/dist/Console/Commands/EventClearCommand.d.ts +15 -0
- package/dist/Console/Commands/EventClearCommand.d.ts.map +1 -0
- package/dist/Console/Commands/EventClearCommand.js +71 -0
- package/dist/Console/Commands/EventClearCommand.js.map +1 -0
- package/dist/Console/Commands/EventListCommand.d.ts +19 -0
- package/dist/Console/Commands/EventListCommand.d.ts.map +1 -0
- package/dist/Console/Commands/EventListCommand.js +106 -0
- package/dist/Console/Commands/EventListCommand.js.map +1 -0
- package/dist/Console/Commands/MakeEventCommand.d.ts +27 -0
- package/dist/Console/Commands/MakeEventCommand.d.ts.map +1 -0
- package/dist/Console/Commands/MakeEventCommand.js +117 -0
- package/dist/Console/Commands/MakeEventCommand.js.map +1 -0
- package/dist/Console/Commands/MakeListenerCommand.d.ts +27 -0
- package/dist/Console/Commands/MakeListenerCommand.d.ts.map +1 -0
- package/dist/Console/Commands/MakeListenerCommand.js +157 -0
- package/dist/Console/Commands/MakeListenerCommand.js.map +1 -0
- package/dist/Console/orchestr.js +10 -0
- package/dist/Console/orchestr.js.map +1 -1
- package/dist/Contracts/Events/Dispatcher.d.ts +94 -0
- package/dist/Contracts/Events/Dispatcher.d.ts.map +1 -0
- package/dist/Contracts/Events/Dispatcher.js +9 -0
- package/dist/Contracts/Events/Dispatcher.js.map +1 -0
- package/dist/Contracts/Events/index.d.ts +7 -0
- package/dist/Contracts/Events/index.d.ts.map +1 -0
- package/dist/Contracts/Events/index.js +8 -0
- package/dist/Contracts/Events/index.js.map +1 -0
- package/dist/Database/Ensemble/Ensemble.d.ts +7 -0
- package/dist/Database/Ensemble/Ensemble.d.ts.map +1 -1
- package/dist/Database/Ensemble/Ensemble.js +119 -0
- package/dist/Database/Ensemble/Ensemble.js.map +1 -1
- package/dist/Database/Ensemble/EnsembleBuilder.d.ts.map +1 -1
- package/dist/Database/Ensemble/EnsembleBuilder.js +7 -0
- package/dist/Database/Ensemble/EnsembleBuilder.js.map +1 -1
- package/dist/Database/Ensemble/Events/ModelCreated.d.ts +11 -0
- package/dist/Database/Ensemble/Events/ModelCreated.d.ts.map +1 -0
- package/dist/Database/Ensemble/Events/ModelCreated.js +16 -0
- package/dist/Database/Ensemble/Events/ModelCreated.js.map +1 -0
- package/dist/Database/Ensemble/Events/ModelCreating.d.ts +12 -0
- package/dist/Database/Ensemble/Events/ModelCreating.d.ts.map +1 -0
- package/dist/Database/Ensemble/Events/ModelCreating.js +17 -0
- package/dist/Database/Ensemble/Events/ModelCreating.js.map +1 -0
- package/dist/Database/Ensemble/Events/ModelDeleted.d.ts +11 -0
- package/dist/Database/Ensemble/Events/ModelDeleted.d.ts.map +1 -0
- package/dist/Database/Ensemble/Events/ModelDeleted.js +16 -0
- package/dist/Database/Ensemble/Events/ModelDeleted.js.map +1 -0
- package/dist/Database/Ensemble/Events/ModelDeleting.d.ts +12 -0
- package/dist/Database/Ensemble/Events/ModelDeleting.d.ts.map +1 -0
- package/dist/Database/Ensemble/Events/ModelDeleting.js +17 -0
- package/dist/Database/Ensemble/Events/ModelDeleting.js.map +1 -0
- package/dist/Database/Ensemble/Events/ModelEvent.d.ts +17 -0
- package/dist/Database/Ensemble/Events/ModelEvent.d.ts.map +1 -0
- package/dist/Database/Ensemble/Events/ModelEvent.js +22 -0
- package/dist/Database/Ensemble/Events/ModelEvent.js.map +1 -0
- package/dist/Database/Ensemble/Events/ModelRetrieved.d.ts +11 -0
- package/dist/Database/Ensemble/Events/ModelRetrieved.d.ts.map +1 -0
- package/dist/Database/Ensemble/Events/ModelRetrieved.js +16 -0
- package/dist/Database/Ensemble/Events/ModelRetrieved.js.map +1 -0
- package/dist/Database/Ensemble/Events/ModelSaved.d.ts +11 -0
- package/dist/Database/Ensemble/Events/ModelSaved.d.ts.map +1 -0
- package/dist/Database/Ensemble/Events/ModelSaved.js +16 -0
- package/dist/Database/Ensemble/Events/ModelSaved.js.map +1 -0
- package/dist/Database/Ensemble/Events/ModelSaving.d.ts +12 -0
- package/dist/Database/Ensemble/Events/ModelSaving.d.ts.map +1 -0
- package/dist/Database/Ensemble/Events/ModelSaving.js +17 -0
- package/dist/Database/Ensemble/Events/ModelSaving.js.map +1 -0
- package/dist/Database/Ensemble/Events/ModelUpdated.d.ts +11 -0
- package/dist/Database/Ensemble/Events/ModelUpdated.d.ts.map +1 -0
- package/dist/Database/Ensemble/Events/ModelUpdated.js +16 -0
- package/dist/Database/Ensemble/Events/ModelUpdated.js.map +1 -0
- package/dist/Database/Ensemble/Events/ModelUpdating.d.ts +12 -0
- package/dist/Database/Ensemble/Events/ModelUpdating.d.ts.map +1 -0
- package/dist/Database/Ensemble/Events/ModelUpdating.js +17 -0
- package/dist/Database/Ensemble/Events/ModelUpdating.js.map +1 -0
- package/dist/Database/Ensemble/Events/index.d.ts +16 -0
- package/dist/Database/Ensemble/Events/index.d.ts.map +1 -0
- package/dist/Database/Ensemble/Events/index.js +29 -0
- package/dist/Database/Ensemble/Events/index.js.map +1 -0
- package/dist/Events/Concerns/Dispatchable.d.ts +121 -0
- package/dist/Events/Concerns/Dispatchable.d.ts.map +1 -0
- package/dist/Events/Concerns/Dispatchable.js +165 -0
- package/dist/Events/Concerns/Dispatchable.js.map +1 -0
- package/dist/Events/Contracts/Dispatcher.d.ts +144 -0
- package/dist/Events/Contracts/Dispatcher.d.ts.map +1 -0
- package/dist/Events/Contracts/Dispatcher.js +3 -0
- package/dist/Events/Contracts/Dispatcher.js.map +1 -0
- package/dist/Events/Contracts/ShouldDispatchAfterCommit.d.ts +21 -0
- package/dist/Events/Contracts/ShouldDispatchAfterCommit.d.ts.map +1 -0
- package/dist/Events/Contracts/ShouldDispatchAfterCommit.js +3 -0
- package/dist/Events/Contracts/ShouldDispatchAfterCommit.js.map +1 -0
- package/dist/Events/Decorators/HandlesEvents.d.ts +83 -0
- package/dist/Events/Decorators/HandlesEvents.d.ts.map +1 -0
- package/dist/Events/Decorators/HandlesEvents.js +105 -0
- package/dist/Events/Decorators/HandlesEvents.js.map +1 -0
- package/dist/Events/Dispatcher.d.ts +201 -0
- package/dist/Events/Dispatcher.d.ts.map +1 -0
- package/dist/Events/Dispatcher.js +359 -0
- package/dist/Events/Dispatcher.js.map +1 -0
- package/dist/Events/Event.d.ts +140 -0
- package/dist/Events/Event.d.ts.map +1 -0
- package/dist/Events/Event.js +266 -0
- package/dist/Events/Event.js.map +1 -0
- package/dist/Events/EventDiscoveryCache.d.ts +205 -0
- package/dist/Events/EventDiscoveryCache.d.ts.map +1 -0
- package/dist/Events/EventDiscoveryCache.js +310 -0
- package/dist/Events/EventDiscoveryCache.js.map +1 -0
- package/dist/Events/EventServiceProvider.d.ts +148 -0
- package/dist/Events/EventServiceProvider.d.ts.map +1 -0
- package/dist/Events/EventServiceProvider.js +258 -0
- package/dist/Events/EventServiceProvider.js.map +1 -0
- package/dist/Events/NullDispatcher.d.ts +97 -0
- package/dist/Events/NullDispatcher.d.ts.map +1 -0
- package/dist/Events/NullDispatcher.js +118 -0
- package/dist/Events/NullDispatcher.js.map +1 -0
- package/dist/Events/PendingDispatch.d.ts +119 -0
- package/dist/Events/PendingDispatch.d.ts.map +1 -0
- package/dist/Events/PendingDispatch.js +162 -0
- package/dist/Events/PendingDispatch.js.map +1 -0
- package/dist/Events/index.d.ts +12 -0
- package/dist/Events/index.d.ts.map +1 -0
- package/dist/Events/index.js +20 -0
- package/dist/Events/index.js.map +1 -0
- package/dist/Events/types.d.ts +77 -0
- package/dist/Events/types.d.ts.map +1 -0
- package/dist/Events/types.js +3 -0
- package/dist/Events/types.js.map +1 -0
- package/dist/Facades/Event.d.ts +200 -0
- package/dist/Facades/Event.d.ts.map +1 -0
- package/dist/Facades/Event.js +331 -0
- package/dist/Facades/Event.js.map +1 -0
- package/dist/Foundation/Application.d.ts +33 -0
- package/dist/Foundation/Application.d.ts.map +1 -1
- package/dist/Foundation/Application.js +40 -0
- package/dist/Foundation/Application.js.map +1 -1
- package/dist/Listeners/Contracts/ShouldQueue.d.ts +142 -0
- package/dist/Listeners/Contracts/ShouldQueue.d.ts.map +1 -0
- package/dist/Listeners/Contracts/ShouldQueue.js +20 -0
- package/dist/Listeners/Contracts/ShouldQueue.js.map +1 -0
- package/dist/Listeners/Contracts/ShouldQueueAfterCommit.d.ts +24 -0
- package/dist/Listeners/Contracts/ShouldQueueAfterCommit.d.ts.map +1 -0
- package/dist/Listeners/Contracts/ShouldQueueAfterCommit.js +3 -0
- package/dist/Listeners/Contracts/ShouldQueueAfterCommit.js.map +1 -0
- package/dist/Support/EventDiscovery.d.ts +142 -0
- package/dist/Support/EventDiscovery.d.ts.map +1 -0
- package/dist/Support/EventDiscovery.js +302 -0
- package/dist/Support/EventDiscovery.js.map +1 -0
- package/dist/Support/Testing/Fakes/EventFake.d.ts +291 -0
- package/dist/Support/Testing/Fakes/EventFake.d.ts.map +1 -0
- package/dist/Support/Testing/Fakes/EventFake.js +444 -0
- package/dist/Support/Testing/Fakes/EventFake.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- 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"}
|