dt-common-device 3.0.10 → 3.0.11
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/dist/config/config.d.ts +1 -2
- package/dist/config/config.js +4 -5
- package/dist/device/local/repository/Schedule.repository.d.ts +0 -1
- package/dist/device/local/repository/Schedule.repository.js +6 -6
- package/dist/queue/entities/HybridHttpQueue.d.ts +4 -14
- package/dist/queue/entities/HybridHttpQueue.js +31 -119
- package/dist/queue/interfaces/IHybridHttpQueue.d.ts +2 -12
- package/dist/queue/interfaces/IJobResult.d.ts +1 -8
- package/dist/queue/interfaces/index.d.ts +0 -1
- package/dist/queue/interfaces/index.js +0 -1
- package/dist/queue/services/QueueService.d.ts +2 -12
- package/dist/queue/types/queue.types.d.ts +10 -29
- package/dist/queue/utils/jobUtils.d.ts +0 -3
- package/dist/queue/utils/jobUtils.js +0 -48
- package/dist/queue/utils/queueUtils.d.ts +7 -0
- package/dist/queue/utils/queueUtils.js +113 -4
- package/package.json +6 -1
- package/.eslintrc.js +0 -44
- package/src/alerts/Alert.model.ts +0 -289
- package/src/alerts/Alert.repository.ts +0 -487
- package/src/alerts/Alert.service.ts +0 -711
- package/src/alerts/AlertBuilder.example.ts +0 -126
- package/src/alerts/AlertBuilder.ts +0 -208
- package/src/alerts/AlertService.example.ts +0 -232
- package/src/alerts/alert.types.ts +0 -64
- package/src/alerts/index.ts +0 -3
- package/src/config/config.ts +0 -202
- package/src/config/config.types.ts +0 -21
- package/src/connection/Connection.repository.ts +0 -52
- package/src/connection/Connection.service.ts +0 -39
- package/src/connection/IConnection.ts +0 -27
- package/src/connection/index.ts +0 -3
- package/src/constants/ConnectionProviders.ts +0 -11
- package/src/constants/Event.ts +0 -89
- package/src/constants/Service.ts +0 -17
- package/src/constants/index.ts +0 -3
- package/src/db/db.ts +0 -24
- package/src/db/index.ts +0 -2
- package/src/db/redis.ts +0 -20
- package/src/device/cloud/entities/CloudDevice.ts +0 -40
- package/src/device/cloud/entities/CloudDeviceService.ts +0 -8
- package/src/device/cloud/entities/DeviceFactory.ts +0 -27
- package/src/device/cloud/entities/index.ts +0 -3
- package/src/device/cloud/interfaces/ICloudDevice.ts +0 -14
- package/src/device/cloud/interfaces/ICloudDeviceService.ts +0 -6
- package/src/device/cloud/interfaces/IDeviceFactory.ts +0 -5
- package/src/device/cloud/interfaces/IRawDataTransformer.ts +0 -5
- package/src/device/cloud/interfaces/IRawDevice.ts +0 -19
- package/src/device/cloud/interfaces/index.ts +0 -5
- package/src/device/local/interfaces/IDevice.ts +0 -62
- package/src/device/local/interfaces/IDtDevice.ts +0 -16
- package/src/device/local/interfaces/ISchedule.ts +0 -40
- package/src/device/local/interfaces/index.ts +0 -3
- package/src/device/local/repository/Device.repository.ts +0 -368
- package/src/device/local/repository/Hub.repository.ts +0 -107
- package/src/device/local/repository/Schedule.repository.ts +0 -72
- package/src/device/local/services/Device.service.ts +0 -436
- package/src/device/local/services/Hub.service.ts +0 -57
- package/src/device/local/services/Schedule.service.ts +0 -26
- package/src/device/local/services/index.ts +0 -3
- package/src/docs/Alert.model.md +0 -319
- package/src/docs/Alerts&IssuesModel.md +0 -312
- package/src/docs/Issue.model.md +0 -386
- package/src/docs/SECURITY.md +0 -67
- package/src/docs/TROUBLESHOOTING.md +0 -184
- package/src/events/BaseEventHandler.ts +0 -145
- package/src/events/BaseEventTransformer.ts +0 -97
- package/src/events/DeviceEventHandler.ts +0 -213
- package/src/events/DeviceEventTransformerFactory.ts +0 -77
- package/src/events/EventHandler.ts +0 -124
- package/src/events/EventHandlerOrchestrator.ts +0 -119
- package/src/events/EventProcessingService.ts +0 -248
- package/src/events/InternalEventSubscription.ts +0 -194
- package/src/events/index.ts +0 -9
- package/src/events/interfaces/DeviceEvent.ts +0 -56
- package/src/events/interfaces/IEventHandler.ts +0 -28
- package/src/events/interfaces/IEventTransformer.ts +0 -8
- package/src/events/interfaces/IInternalEvent.ts +0 -33
- package/src/events/interfaces/index.ts +0 -4
- package/src/index.ts +0 -43
- package/src/issues/Issue.model.ts +0 -350
- package/src/issues/Issue.repository.ts +0 -517
- package/src/issues/Issue.service.ts +0 -932
- package/src/issues/IssueBuilder.example.ts +0 -210
- package/src/issues/IssueBuilder.ts +0 -263
- package/src/issues/IssueService.example.ts +0 -310
- package/src/issues/index.ts +0 -2
- package/src/issues/issue.types.ts +0 -98
- package/src/property/IProperty.ts +0 -30
- package/src/property/Property.repository.ts +0 -53
- package/src/property/Property.service.ts +0 -38
- package/src/property/index.ts +0 -2
- package/src/queue/entities/HybridHttpQueue.ts +0 -274
- package/src/queue/entities/index.ts +0 -1
- package/src/queue/index.ts +0 -6
- package/src/queue/interfaces/IHttpRequestJob.ts +0 -10
- package/src/queue/interfaces/IHybridHttpQueue.ts +0 -25
- package/src/queue/interfaces/IJobResult.ts +0 -15
- package/src/queue/interfaces/IRateLimitConfig.ts +0 -5
- package/src/queue/interfaces/index.ts +0 -4
- package/src/queue/services/QueueService.ts +0 -40
- package/src/queue/services/index.ts +0 -1
- package/src/queue/types/http.types.ts +0 -23
- package/src/queue/types/index.ts +0 -2
- package/src/queue/types/queue.types.ts +0 -21
- package/src/queue/utils/index.ts +0 -3
- package/src/queue/utils/jobUtils.ts +0 -79
- package/src/queue/utils/queueUtils.ts +0 -84
- package/src/queue/utils/rateLimit.utils.ts +0 -131
- package/src/utils/http.utils.ts +0 -143
- package/src/utils/index.ts +0 -2
- package/src/utils/redis.utils.ts +0 -74
- package/tsconfig.json +0 -20
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { Service } from "typedi";
|
|
2
|
-
import { IEventHandler } from "./interfaces/IEventHandler";
|
|
3
|
-
import { DeviceEvent } from "./interfaces/DeviceEvent";
|
|
4
|
-
import { ILogger } from "../config/config.types";
|
|
5
|
-
import { getConfig } from "../config/config";
|
|
6
|
-
|
|
7
|
-
@Service()
|
|
8
|
-
export class EventHandlerOrchestrator {
|
|
9
|
-
private handlers: IEventHandler[] = [];
|
|
10
|
-
private readonly logger: ILogger;
|
|
11
|
-
constructor() {
|
|
12
|
-
this.logger = getConfig().LOGGER;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Register a handler with the orchestrator
|
|
16
|
-
*/
|
|
17
|
-
registerHandler(handler: IEventHandler): void {
|
|
18
|
-
this.handlers.push(handler);
|
|
19
|
-
// Sort handlers by priority (lower numbers = higher priority)
|
|
20
|
-
this.handlers.sort((a, b) => a.getPriority() - b.getPriority());
|
|
21
|
-
this.logger.info(
|
|
22
|
-
`Registered handler: ${
|
|
23
|
-
handler.constructor.name
|
|
24
|
-
} with priority ${handler.getPriority()}`
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Register multiple handlers
|
|
30
|
-
*/
|
|
31
|
-
registerHandlers(handlers: IEventHandler[]): void {
|
|
32
|
-
handlers.forEach((handler) => this.registerHandler(handler));
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Process a single event through the handler hierarchy
|
|
37
|
-
*/
|
|
38
|
-
async processEvent(event: DeviceEvent): Promise<void> {
|
|
39
|
-
try {
|
|
40
|
-
this.logger.info(
|
|
41
|
-
`Processing event: ${event.eventName} for device: ${event.deviceId}`
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
const applicableHandlers = this.handlers.filter((handler) =>
|
|
45
|
-
handler.canHandle(event.eventName)
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
if (applicableHandlers.length === 0) {
|
|
49
|
-
this.logger.warn(
|
|
50
|
-
`No handlers found for event type: ${event.eventName}`
|
|
51
|
-
);
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
this.logger.info(
|
|
56
|
-
`Found ${applicableHandlers.length} handlers for event: ${event.eventName}`
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
// Process with each applicable handler in priority order
|
|
60
|
-
for (const handler of applicableHandlers) {
|
|
61
|
-
try {
|
|
62
|
-
await handler.handleEvent(event);
|
|
63
|
-
this.logger.info(`Event processed by: ${handler.constructor.name}`);
|
|
64
|
-
} catch (error) {
|
|
65
|
-
this.logger.error(
|
|
66
|
-
`Error in handler ${handler.constructor.name}:`,
|
|
67
|
-
error
|
|
68
|
-
);
|
|
69
|
-
// Continue with other handlers even if one fails
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
} catch (error) {
|
|
73
|
-
this.logger.error(
|
|
74
|
-
"Error in EventHandlerOrchestrator.processEvent:",
|
|
75
|
-
error
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Process multiple events
|
|
82
|
-
*/
|
|
83
|
-
async processEvents(events: DeviceEvent[]): Promise<void> {
|
|
84
|
-
try {
|
|
85
|
-
this.logger.info(`Processing ${events.length} events`);
|
|
86
|
-
|
|
87
|
-
for (const event of events) {
|
|
88
|
-
await this.processEvent(event);
|
|
89
|
-
}
|
|
90
|
-
} catch (error) {
|
|
91
|
-
this.logger.error(
|
|
92
|
-
"Error in EventHandlerOrchestrator.processEvents:",
|
|
93
|
-
error
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Get all registered handlers
|
|
100
|
-
*/
|
|
101
|
-
getHandlers(): IEventHandler[] {
|
|
102
|
-
return [...this.handlers];
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Get handlers that can handle a specific event type
|
|
107
|
-
*/
|
|
108
|
-
getHandlersForEventType(eventType: string): IEventHandler[] {
|
|
109
|
-
return this.handlers.filter((handler) => handler.canHandle(eventType));
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Clear all registered handlers
|
|
114
|
-
*/
|
|
115
|
-
clearHandlers(): void {
|
|
116
|
-
this.handlers = [];
|
|
117
|
-
this.logger.info("All handlers cleared");
|
|
118
|
-
}
|
|
119
|
-
}
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import { Service } from "typedi";
|
|
2
|
-
import { DeviceEventHandler } from "./DeviceEventHandler";
|
|
3
|
-
import { ILogger } from "../config/config.types";
|
|
4
|
-
import { getConfig } from "../config/config";
|
|
5
|
-
import { DeviceEvent } from "./interfaces/DeviceEvent";
|
|
6
|
-
import { IEventTransformer } from "./interfaces/IEventTransformer";
|
|
7
|
-
import { EventHandlerOrchestrator } from "./EventHandlerOrchestrator";
|
|
8
|
-
import { DeviceEventTransformerFactory } from "./DeviceEventTransformerFactory";
|
|
9
|
-
import { BaseEventHandler } from "./BaseEventHandler";
|
|
10
|
-
|
|
11
|
-
@Service()
|
|
12
|
-
export class EventProcessingService {
|
|
13
|
-
private readonly handlerOrchestrator: EventHandlerOrchestrator;
|
|
14
|
-
public readonly deviceEventHandler: DeviceEventHandler;
|
|
15
|
-
private readonly logger: ILogger;
|
|
16
|
-
private deviceHandlers: Map<string, any> = new Map();
|
|
17
|
-
|
|
18
|
-
constructor(
|
|
19
|
-
private readonly deviceEventTransformerFactory: DeviceEventTransformerFactory
|
|
20
|
-
) {
|
|
21
|
-
this.handlerOrchestrator = new EventHandlerOrchestrator();
|
|
22
|
-
this.deviceEventHandler = new DeviceEventHandler();
|
|
23
|
-
this.logger = getConfig().LOGGER;
|
|
24
|
-
this.initializeDeviceHandlers();
|
|
25
|
-
this.initializeHandlers();
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Initialize device-specific handlers - to be implemented by subclasses
|
|
30
|
-
*/
|
|
31
|
-
protected initializeDeviceHandlers(): void {
|
|
32
|
-
this.deviceHandlers = new Map();
|
|
33
|
-
// Subclasses should override this method to add their specific handlers
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Initialize the handler hierarchy - to be implemented by subclasses
|
|
38
|
-
*/
|
|
39
|
-
protected initializeHandlers(): void {
|
|
40
|
-
try {
|
|
41
|
-
// Register generic handler for common events
|
|
42
|
-
this.handlerOrchestrator.registerHandlers([
|
|
43
|
-
new DeviceEventHandler(), // Priority 100 - handles common events first
|
|
44
|
-
]);
|
|
45
|
-
|
|
46
|
-
this.logger.info("Base event handlers initialized successfully");
|
|
47
|
-
} catch (error) {
|
|
48
|
-
this.logger.error(
|
|
49
|
-
"EventProcessingService: initializeHandlers Error",
|
|
50
|
-
error
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Get device-specific handler based on connection provider
|
|
57
|
-
*/
|
|
58
|
-
private getDeviceHandler(connectionProvider: string): any {
|
|
59
|
-
const normalizedProvider = connectionProvider.toLowerCase();
|
|
60
|
-
return this.deviceHandlers.get(normalizedProvider) || null;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Transform device event using EventTransformerFactory
|
|
65
|
-
*/
|
|
66
|
-
transformDeviceEventWithTransformer(
|
|
67
|
-
connectionProvider: string,
|
|
68
|
-
rawData: any
|
|
69
|
-
): DeviceEvent | null {
|
|
70
|
-
try {
|
|
71
|
-
// Create transformer for the connection provider
|
|
72
|
-
const transformer: IEventTransformer | null =
|
|
73
|
-
this.deviceEventTransformerFactory.createTransformer(
|
|
74
|
-
connectionProvider,
|
|
75
|
-
rawData
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
if (!transformer) {
|
|
79
|
-
this.logger.warn(
|
|
80
|
-
`No transformer found for connection provider: ${connectionProvider}`
|
|
81
|
-
);
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Execute the transformation pipeline
|
|
86
|
-
const transformedEvents = transformer.executeTransformation();
|
|
87
|
-
|
|
88
|
-
if (transformedEvents.length === 0) {
|
|
89
|
-
this.logger.warn(
|
|
90
|
-
`No events transformed for connection provider: ${connectionProvider}`
|
|
91
|
-
);
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Return the first transformed event (or handle multiple events as needed)
|
|
96
|
-
return transformedEvents[0];
|
|
97
|
-
} catch (error) {
|
|
98
|
-
this.logger.error(
|
|
99
|
-
`Error transforming event for ${connectionProvider}:`,
|
|
100
|
-
error
|
|
101
|
-
);
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Transform raw event data to DeviceEvent format using EventTransformer
|
|
108
|
-
*/
|
|
109
|
-
private transformToDeviceEvent(
|
|
110
|
-
connectionProvider: string,
|
|
111
|
-
rawData: any
|
|
112
|
-
): DeviceEvent | null {
|
|
113
|
-
try {
|
|
114
|
-
// Use the transformer-based approach
|
|
115
|
-
const deviceEvent = this.transformDeviceEventWithTransformer(
|
|
116
|
-
connectionProvider,
|
|
117
|
-
rawData
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
if (!deviceEvent) {
|
|
121
|
-
this.logger.warn("Failed to transform event data using transformer", {
|
|
122
|
-
connectionProvider,
|
|
123
|
-
rawData,
|
|
124
|
-
});
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
this.logger.info("Transformed event using EventTransformer", {
|
|
129
|
-
connectionProvider,
|
|
130
|
-
originalEventName: deviceEvent.originalEventName,
|
|
131
|
-
transformedEventName: deviceEvent.eventName,
|
|
132
|
-
deviceId: deviceEvent.deviceId,
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
return deviceEvent;
|
|
136
|
-
} catch (error) {
|
|
137
|
-
this.logger.error(
|
|
138
|
-
"EventProcessingService: transformToDeviceEvent Error",
|
|
139
|
-
error
|
|
140
|
-
);
|
|
141
|
-
return null;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Process a single event from device.event.controller
|
|
147
|
-
*/
|
|
148
|
-
async processEvent(connectionProvider: string, rawData: any): Promise<void> {
|
|
149
|
-
try {
|
|
150
|
-
this.logger.info("EventProcessingService: Processing event", {
|
|
151
|
-
connectionProvider,
|
|
152
|
-
eventName: rawData.eventName ?? rawData.type,
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
// Transform raw data to DeviceEvent using EventTransformer
|
|
156
|
-
const deviceEvent = this.transformToDeviceEvent(
|
|
157
|
-
connectionProvider,
|
|
158
|
-
rawData
|
|
159
|
-
);
|
|
160
|
-
if (!deviceEvent) {
|
|
161
|
-
this.logger.warn("Failed to transform event data", {
|
|
162
|
-
connectionProvider,
|
|
163
|
-
rawData,
|
|
164
|
-
});
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Get device-specific handler
|
|
169
|
-
const deviceHandler: BaseEventHandler =
|
|
170
|
-
this.getDeviceHandler(connectionProvider);
|
|
171
|
-
if (!deviceHandler) {
|
|
172
|
-
this.logger.warn("No device handler found for provider", {
|
|
173
|
-
connectionProvider,
|
|
174
|
-
});
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// Process with GenericEventHandler first (common logic)
|
|
179
|
-
if (this.deviceEventHandler.canHandle(deviceEvent.eventName)) {
|
|
180
|
-
try {
|
|
181
|
-
await this.deviceEventHandler.handleEvent(deviceEvent);
|
|
182
|
-
this.logger.info("Event processed by GenericEventHandler");
|
|
183
|
-
} catch (error) {
|
|
184
|
-
this.logger.error(
|
|
185
|
-
"EventProcessingService: GenericEventHandler Error",
|
|
186
|
-
error
|
|
187
|
-
);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// Process with device-specific handler
|
|
192
|
-
if (deviceHandler.canHandle(deviceEvent.eventName)) {
|
|
193
|
-
try {
|
|
194
|
-
await deviceHandler.onEvent(deviceEvent);
|
|
195
|
-
this.logger.info("Event processed by device-specific handler", {
|
|
196
|
-
handler: deviceHandler.constructor.name,
|
|
197
|
-
});
|
|
198
|
-
} catch (error) {
|
|
199
|
-
this.logger.error(
|
|
200
|
-
"EventProcessingService: Device-specific handler Error",
|
|
201
|
-
error
|
|
202
|
-
);
|
|
203
|
-
}
|
|
204
|
-
} else {
|
|
205
|
-
this.logger.warn("Device handler cannot handle event", {
|
|
206
|
-
handler: deviceHandler.constructor.name,
|
|
207
|
-
eventName: deviceEvent.eventName,
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
} catch (error) {
|
|
211
|
-
this.logger.error("EventProcessingService: processEvent Error", error);
|
|
212
|
-
throw error;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Process a single event (legacy method for DeviceEvent objects)
|
|
218
|
-
*/
|
|
219
|
-
async processEventLegacy(event: DeviceEvent): Promise<void> {
|
|
220
|
-
try {
|
|
221
|
-
this.logger.info("EventProcessingService: Processing legacy event", {
|
|
222
|
-
eventName: event.eventName,
|
|
223
|
-
});
|
|
224
|
-
await this.handlerOrchestrator.processEvent(event);
|
|
225
|
-
} catch (error) {
|
|
226
|
-
this.logger.error(
|
|
227
|
-
"EventProcessingService: processEventLegacy Error",
|
|
228
|
-
error
|
|
229
|
-
);
|
|
230
|
-
throw error;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Process multiple events
|
|
236
|
-
*/
|
|
237
|
-
async processEvents(events: DeviceEvent[]): Promise<void> {
|
|
238
|
-
try {
|
|
239
|
-
this.logger.info("EventProcessingService: Processing multiple events", {
|
|
240
|
-
count: events.length,
|
|
241
|
-
});
|
|
242
|
-
await this.handlerOrchestrator.processEvents(events);
|
|
243
|
-
} catch (error) {
|
|
244
|
-
this.logger.error("EventProcessingService: processEvents Error", error);
|
|
245
|
-
throw error;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
import { eventDispatcher } from "dt-pub-sub";
|
|
2
|
-
import { getConfig } from "../config/config";
|
|
3
|
-
import {
|
|
4
|
-
IInternalEvent,
|
|
5
|
-
HeartbeatEventData,
|
|
6
|
-
ScheduleEventData,
|
|
7
|
-
ServiceEventData,
|
|
8
|
-
} from "./interfaces/IInternalEvent";
|
|
9
|
-
import { ILogger } from "../config/config.types";
|
|
10
|
-
|
|
11
|
-
// Event types enum for better type safety
|
|
12
|
-
export enum InternalEventType {
|
|
13
|
-
HEARTBEAT = "heartbeat",
|
|
14
|
-
SCHEDULE_CREATE = "schedule.create",
|
|
15
|
-
SCHEDULE_UPDATE = "schedule.update",
|
|
16
|
-
SCHEDULE_DELETE = "schedule.delete",
|
|
17
|
-
RESERVATION_CREATE = "reservation.create",
|
|
18
|
-
RESERVATION_UPDATE = "reservation.update",
|
|
19
|
-
RESERVATION_CANCEL = "reservation.cancel",
|
|
20
|
-
SERVICE_DOWN = "service.down",
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export class InternalEventSubscription {
|
|
24
|
-
private readonly sqsQueueUrl: string;
|
|
25
|
-
private readonly logger: ILogger;
|
|
26
|
-
private readonly isInitialized: boolean = false;
|
|
27
|
-
private isSubscribed: boolean = false;
|
|
28
|
-
|
|
29
|
-
constructor(private readonly internalEventHandler: IInternalEvent) {
|
|
30
|
-
this.sqsQueueUrl = getConfig().SQS_QUEUE_URL;
|
|
31
|
-
this.logger = getConfig().LOGGER;
|
|
32
|
-
this.isInitialized = true;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
private async handleMessage(message: any): Promise<void> {
|
|
36
|
-
try {
|
|
37
|
-
const eventType = message["detail-type"];
|
|
38
|
-
const eventData = message.detail;
|
|
39
|
-
|
|
40
|
-
this.logger.info("Received internal event", { eventType, eventData });
|
|
41
|
-
|
|
42
|
-
switch (eventType) {
|
|
43
|
-
case InternalEventType.HEARTBEAT:
|
|
44
|
-
await this.safeCallHandler(() =>
|
|
45
|
-
this.internalEventHandler.onHeartbeat(
|
|
46
|
-
eventData as HeartbeatEventData
|
|
47
|
-
)
|
|
48
|
-
);
|
|
49
|
-
break;
|
|
50
|
-
|
|
51
|
-
case InternalEventType.SCHEDULE_CREATE:
|
|
52
|
-
await this.safeCallHandler(() =>
|
|
53
|
-
this.internalEventHandler.onScheduleCreate(
|
|
54
|
-
eventData as ScheduleEventData
|
|
55
|
-
)
|
|
56
|
-
);
|
|
57
|
-
break;
|
|
58
|
-
|
|
59
|
-
case InternalEventType.SCHEDULE_UPDATE:
|
|
60
|
-
await this.safeCallHandler(() =>
|
|
61
|
-
this.internalEventHandler.onScheduleUpdate(
|
|
62
|
-
eventData as ScheduleEventData
|
|
63
|
-
)
|
|
64
|
-
);
|
|
65
|
-
break;
|
|
66
|
-
|
|
67
|
-
case InternalEventType.SCHEDULE_DELETE:
|
|
68
|
-
await this.safeCallHandler(() =>
|
|
69
|
-
this.internalEventHandler.onScheduleDelete(
|
|
70
|
-
eventData as ScheduleEventData
|
|
71
|
-
)
|
|
72
|
-
);
|
|
73
|
-
break;
|
|
74
|
-
|
|
75
|
-
case InternalEventType.SERVICE_DOWN:
|
|
76
|
-
await this.safeCallHandler(() =>
|
|
77
|
-
this.internalEventHandler.onServiceDown(
|
|
78
|
-
eventData as ServiceEventData
|
|
79
|
-
)
|
|
80
|
-
);
|
|
81
|
-
break;
|
|
82
|
-
|
|
83
|
-
default:
|
|
84
|
-
this.logger.warn("Unknown event type", { eventType, eventData });
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
} catch (error) {
|
|
88
|
-
this.logger.error("Error processing internal event message", {
|
|
89
|
-
error,
|
|
90
|
-
message,
|
|
91
|
-
eventType: message["detail-type"],
|
|
92
|
-
});
|
|
93
|
-
// Re-throw to let SQS handle retry logic
|
|
94
|
-
throw error;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Safely call handler methods with error handling
|
|
100
|
-
*/
|
|
101
|
-
private async safeCallHandler(
|
|
102
|
-
handlerCall: () => Promise<void>
|
|
103
|
-
): Promise<void> {
|
|
104
|
-
try {
|
|
105
|
-
await handlerCall();
|
|
106
|
-
} catch (error) {
|
|
107
|
-
this.logger.error("Handler method execution failed", { error });
|
|
108
|
-
// Re-throw to let the main error handler deal with it
|
|
109
|
-
throw error;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Subscribe to SQS events
|
|
115
|
-
*/
|
|
116
|
-
public async subscribe(): Promise<void> {
|
|
117
|
-
if (!this.isInitialized) {
|
|
118
|
-
throw new Error(
|
|
119
|
-
"InternalEventSubscription must be initialized before subscribing"
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (!this.sqsQueueUrl) {
|
|
124
|
-
throw new Error("AWS SQS URL not found in environment variables");
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (this.isSubscribed) {
|
|
128
|
-
this.logger.warn("InternalEventSubscription is already subscribed");
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
try {
|
|
133
|
-
await eventDispatcher.subscribeToQueue(
|
|
134
|
-
this.sqsQueueUrl,
|
|
135
|
-
this.handleMessage.bind(this)
|
|
136
|
-
);
|
|
137
|
-
this.isSubscribed = true;
|
|
138
|
-
this.logger.info("Successfully subscribed to internal events", {
|
|
139
|
-
sqsUrl: this.sqsQueueUrl,
|
|
140
|
-
});
|
|
141
|
-
} catch (error) {
|
|
142
|
-
this.logger.error("Failed to subscribe to internal events", {
|
|
143
|
-
error,
|
|
144
|
-
sqsUrl: this.sqsQueueUrl,
|
|
145
|
-
});
|
|
146
|
-
throw error;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Unsubscribe from SQS events
|
|
152
|
-
*/
|
|
153
|
-
public async unsubscribe(): Promise<void> {
|
|
154
|
-
if (!this.isSubscribed) {
|
|
155
|
-
this.logger.warn("InternalEventSubscription is not currently subscribed");
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
try {
|
|
160
|
-
// Note: You might need to implement unsubscribe method in dt-pub-sub
|
|
161
|
-
// await eventDispatcher.unsubscribeFromQueue(this.sqsQueueUrl);
|
|
162
|
-
|
|
163
|
-
this.isSubscribed = false;
|
|
164
|
-
this.logger.info("Successfully unsubscribed from internal events");
|
|
165
|
-
} catch (error) {
|
|
166
|
-
this.logger.error("Failed to unsubscribe from internal events", {
|
|
167
|
-
error,
|
|
168
|
-
});
|
|
169
|
-
throw error;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Get subscription status
|
|
175
|
-
*/
|
|
176
|
-
public getStatus(): {
|
|
177
|
-
isInitialized: boolean;
|
|
178
|
-
isSubscribed: boolean;
|
|
179
|
-
sqsUrl: string;
|
|
180
|
-
} {
|
|
181
|
-
return {
|
|
182
|
-
isInitialized: this.isInitialized,
|
|
183
|
-
isSubscribed: this.isSubscribed,
|
|
184
|
-
sqsUrl: this.sqsQueueUrl,
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Check if subscription is ready
|
|
190
|
-
*/
|
|
191
|
-
public isReady(): boolean {
|
|
192
|
-
return this.isInitialized && this.isSubscribed;
|
|
193
|
-
}
|
|
194
|
-
}
|
package/src/events/index.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export { DT_EVENT_TYPES } from "../constants/Event";
|
|
2
|
-
export { EventHandler } from "./EventHandler";
|
|
3
|
-
export { InternalEventSubscription } from "./InternalEventSubscription";
|
|
4
|
-
export { EventProcessingService } from "./EventProcessingService";
|
|
5
|
-
export { DeviceEventHandler } from "./DeviceEventHandler";
|
|
6
|
-
export { EventHandlerOrchestrator } from "./EventHandlerOrchestrator";
|
|
7
|
-
export { DeviceEventTransformerFactory } from "./DeviceEventTransformerFactory";
|
|
8
|
-
export { BaseEventHandler } from "./BaseEventHandler";
|
|
9
|
-
export { BaseEventTransformer } from "./BaseEventTransformer";
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
export interface DeviceEvent {
|
|
2
|
-
eventId: string;
|
|
3
|
-
deviceId: string;
|
|
4
|
-
eventName: string;
|
|
5
|
-
data: DeviceEventData;
|
|
6
|
-
timestamp?: string;
|
|
7
|
-
connectionProvider?: string;
|
|
8
|
-
originalEventName?: string;
|
|
9
|
-
rawEvent?: any; // Store the original raw event data
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface EventConstructionOptions {
|
|
13
|
-
eventId?: string;
|
|
14
|
-
eventName?: string;
|
|
15
|
-
status?: string;
|
|
16
|
-
mode?: string;
|
|
17
|
-
userName?: string;
|
|
18
|
-
userId?: string;
|
|
19
|
-
userType?: string;
|
|
20
|
-
rawEvent?: any;
|
|
21
|
-
batteryLevel?: string;
|
|
22
|
-
reason?: string;
|
|
23
|
-
eventDescription?: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface DeviceEventEntity {
|
|
27
|
-
event: any;
|
|
28
|
-
device: any;
|
|
29
|
-
hub: any[];
|
|
30
|
-
property: any;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface DeviceEventData {
|
|
34
|
-
mode?: string;
|
|
35
|
-
batteryLevel?: number;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface TTLockEventData extends DeviceEventData {
|
|
39
|
-
label: string;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface SaltoKSLockEventData extends DeviceEventData {
|
|
43
|
-
userId: string;
|
|
44
|
-
deviceName: string;
|
|
45
|
-
username: string;
|
|
46
|
-
accessBy: string;
|
|
47
|
-
accessDetails: string;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export interface TuyaLockEventData extends DeviceEventData {
|
|
51
|
-
// Inherits mode from DeviceEventData
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export interface SchlageLockEventData extends DeviceEventData {
|
|
55
|
-
event: any;
|
|
56
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { DeviceEvent } from "./DeviceEvent";
|
|
2
|
-
|
|
3
|
-
export interface IEventHandler {
|
|
4
|
-
/**
|
|
5
|
-
* Handle a single transformed event
|
|
6
|
-
*/
|
|
7
|
-
handleEvent(event: DeviceEvent): Promise<void>;
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Handle multiple events
|
|
11
|
-
*/
|
|
12
|
-
handleEvents(events: DeviceEvent[]): Promise<void>;
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Check if this handler can process the given event type
|
|
16
|
-
*/
|
|
17
|
-
canHandle(eventType: string): boolean;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Get the priority of this handler (lower numbers = higher priority)
|
|
21
|
-
*/
|
|
22
|
-
getPriority(): number;
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Get the event types this handler can process
|
|
26
|
-
*/
|
|
27
|
-
getSupportedEventTypes(): string[];
|
|
28
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { DeviceEvent } from "./DeviceEvent";
|
|
2
|
-
|
|
3
|
-
export interface IEventTransformer {
|
|
4
|
-
parseData(rawData: any): any;
|
|
5
|
-
transform(parsedData: any): DeviceEvent | DeviceEvent[];
|
|
6
|
-
validate(transformedEvent: DeviceEvent): boolean;
|
|
7
|
-
executeTransformation(): DeviceEvent[];
|
|
8
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
// Event data interfaces for better type safety
|
|
2
|
-
export interface HeartbeatEventData {
|
|
3
|
-
duration?: number;
|
|
4
|
-
propertyId?: string;
|
|
5
|
-
timestamp?: string;
|
|
6
|
-
[key: string]: any;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface ScheduleEventData {
|
|
10
|
-
scheduleId: string;
|
|
11
|
-
propertyId: string;
|
|
12
|
-
deviceId?: string;
|
|
13
|
-
startTime: string;
|
|
14
|
-
endTime: string;
|
|
15
|
-
action: string;
|
|
16
|
-
[key: string]: any;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface ServiceEventData {
|
|
20
|
-
serviceId: string;
|
|
21
|
-
serviceName: string;
|
|
22
|
-
status: string;
|
|
23
|
-
timestamp: string;
|
|
24
|
-
[key: string]: any;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface IInternalEvent {
|
|
28
|
-
onHeartbeat(data: HeartbeatEventData): Promise<void>;
|
|
29
|
-
onScheduleCreate(data: ScheduleEventData): Promise<void>;
|
|
30
|
-
onScheduleUpdate(data: ScheduleEventData): Promise<void>;
|
|
31
|
-
onScheduleDelete(data: ScheduleEventData): Promise<void>;
|
|
32
|
-
onServiceDown(data: ServiceEventData): Promise<void>;
|
|
33
|
-
}
|