dt-common-device 1.3.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/TROUBLESHOOTING.md +184 -0
  2. package/dist/config/config.d.ts +9 -2
  3. package/dist/config/config.js +97 -14
  4. package/dist/constants/Event.d.ts +75 -0
  5. package/dist/constants/Event.js +78 -0
  6. package/dist/db/db.d.ts +1 -0
  7. package/dist/db/db.js +18 -2
  8. package/dist/device/cloud/entities/CloudDevice.d.ts +1 -0
  9. package/dist/device/cloud/entities/CloudDevice.js +3 -0
  10. package/dist/device/local/entities/AlertBuilder.d.ts +87 -0
  11. package/dist/device/local/entities/AlertBuilder.example.d.ts +11 -0
  12. package/dist/device/local/entities/AlertBuilder.example.js +117 -0
  13. package/dist/device/local/entities/AlertBuilder.js +179 -0
  14. package/dist/device/local/entities/IssueBuilder.d.ts +109 -0
  15. package/dist/device/local/entities/IssueBuilder.example.d.ts +16 -0
  16. package/dist/device/local/entities/IssueBuilder.example.js +196 -0
  17. package/dist/device/local/entities/IssueBuilder.js +237 -0
  18. package/dist/device/local/entities/index.d.ts +2 -0
  19. package/dist/device/local/entities/index.js +7 -0
  20. package/dist/device/local/events/EventHandler.js +6 -6
  21. package/dist/device/local/events/Events.d.ts +33 -12
  22. package/dist/device/local/events/Events.js +33 -12
  23. package/dist/device/local/interfaces/IDevice.d.ts +10 -9
  24. package/dist/device/local/interfaces/IDevice.js +7 -0
  25. package/dist/device/local/models/Alert.model.d.ts +28 -0
  26. package/dist/device/local/models/Alert.model.js +222 -0
  27. package/dist/device/local/models/Issue.model.d.ts +28 -0
  28. package/dist/device/local/models/Issue.model.js +260 -0
  29. package/dist/device/local/repository/Alert.repository.d.ts +106 -0
  30. package/dist/device/local/repository/Alert.repository.js +374 -0
  31. package/dist/device/local/repository/Device.repository.d.ts +11 -2
  32. package/dist/device/local/repository/Device.repository.js +163 -30
  33. package/dist/device/local/repository/Hub.repository.d.ts +1 -1
  34. package/dist/device/local/repository/Hub.repository.js +60 -18
  35. package/dist/device/local/repository/Issue.repository.d.ts +113 -0
  36. package/dist/device/local/repository/Issue.repository.js +401 -0
  37. package/dist/device/local/repository/Schedule.repository.d.ts +1 -1
  38. package/dist/device/local/repository/Schedule.repository.js +14 -18
  39. package/dist/device/local/services/Alert.service.d.ts +135 -5
  40. package/dist/device/local/services/Alert.service.js +471 -7
  41. package/dist/device/local/services/AlertService.example.d.ts +55 -0
  42. package/dist/device/local/services/AlertService.example.js +148 -0
  43. package/dist/device/local/services/Device.service.d.ts +9 -6
  44. package/dist/device/local/services/Device.service.js +61 -41
  45. package/dist/device/local/services/Issue.service.d.ts +168 -0
  46. package/dist/device/local/services/Issue.service.js +642 -0
  47. package/dist/device/local/services/IssueService.example.d.ts +68 -0
  48. package/dist/device/local/services/IssueService.example.js +177 -0
  49. package/dist/device/local/services/index.d.ts +7 -5
  50. package/dist/device/local/services/index.js +21 -11
  51. package/dist/events/BaseEventHandler.d.ts +43 -0
  52. package/dist/events/BaseEventHandler.js +111 -0
  53. package/dist/events/BaseEventTransformer.d.ts +26 -0
  54. package/dist/events/BaseEventTransformer.js +72 -0
  55. package/dist/events/DeviceEventHandler.d.ts +15 -0
  56. package/dist/events/DeviceEventHandler.js +152 -0
  57. package/dist/events/DeviceEventTransformerFactory.d.ts +27 -0
  58. package/dist/events/DeviceEventTransformerFactory.js +116 -0
  59. package/dist/events/EventHandler.d.ts +11 -0
  60. package/dist/events/EventHandler.js +111 -0
  61. package/dist/events/EventHandlerOrchestrator.d.ts +35 -0
  62. package/dist/events/EventHandlerOrchestrator.js +141 -0
  63. package/dist/events/EventProcessingService.d.ts +43 -0
  64. package/dist/events/EventProcessingService.js +243 -0
  65. package/dist/events/InternalEventSubscription.d.ts +44 -0
  66. package/dist/events/InternalEventSubscription.js +152 -0
  67. package/dist/events/index.d.ts +9 -0
  68. package/dist/events/index.js +21 -0
  69. package/dist/events/interfaces/DeviceEvent.d.ts +48 -0
  70. package/dist/events/interfaces/IEventHandler.d.ts +23 -0
  71. package/dist/{device/cloud/interface.js → events/interfaces/IEventHandler.js} +0 -1
  72. package/dist/events/interfaces/IEventTransformer.d.ts +7 -0
  73. package/dist/{device/cloud/interfaces/IDeviceConnectionService.js → events/interfaces/IEventTransformer.js} +0 -1
  74. package/dist/events/interfaces/IInternalEvent.d.ts +42 -0
  75. package/dist/events/interfaces/IInternalEvent.js +2 -0
  76. package/dist/events/interfaces/index.d.ts +4 -0
  77. package/dist/{device → events/interfaces}/index.js +4 -4
  78. package/dist/index.d.ts +6 -2
  79. package/dist/index.js +9 -2
  80. package/dist/types/alert.types.d.ts +57 -0
  81. package/dist/types/alert.types.js +22 -0
  82. package/dist/types/config.types.d.ts +15 -4
  83. package/dist/types/index.d.ts +2 -0
  84. package/dist/types/index.js +2 -0
  85. package/dist/types/issue.types.d.ts +90 -0
  86. package/dist/types/issue.types.js +40 -0
  87. package/dist/utils/http-utils.d.ts +13 -0
  88. package/dist/utils/http-utils.js +117 -0
  89. package/package.json +2 -1
  90. package/src/config/config.ts +117 -14
  91. package/src/{device/local/events/Events.ts → constants/Event.ts} +34 -13
  92. package/src/db/db.ts +14 -5
  93. package/src/device/cloud/entities/CloudDevice.ts +4 -0
  94. package/src/device/local/entities/AlertBuilder.example.ts +126 -0
  95. package/src/device/local/entities/AlertBuilder.ts +202 -0
  96. package/src/device/local/entities/IssueBuilder.example.ts +210 -0
  97. package/src/device/local/entities/IssueBuilder.ts +263 -0
  98. package/src/device/local/entities/README.md +173 -0
  99. package/src/device/local/entities/index.ts +2 -0
  100. package/src/device/local/interfaces/IDevice.ts +11 -9
  101. package/src/device/local/models/Alert.model.md +319 -0
  102. package/src/device/local/models/Alert.model.ts +283 -0
  103. package/src/device/local/models/Issue.model.md +386 -0
  104. package/src/device/local/models/Issue.model.ts +350 -0
  105. package/src/device/local/models/README.md +312 -0
  106. package/src/device/local/repository/Alert.repository.ts +465 -0
  107. package/src/device/local/repository/Device.repository.ts +251 -30
  108. package/src/device/local/repository/Hub.repository.ts +74 -18
  109. package/src/device/local/repository/Issue.repository.ts +517 -0
  110. package/src/device/local/repository/Schedule.repository.ts +28 -22
  111. package/src/device/local/services/Alert.service.ts +617 -5
  112. package/src/device/local/services/AlertService.example.ts +229 -0
  113. package/src/device/local/services/Device.service.ts +74 -52
  114. package/src/device/local/services/Issue.service.ts +872 -0
  115. package/src/device/local/services/IssueService.example.ts +307 -0
  116. package/src/device/local/services/index.ts +7 -5
  117. package/src/events/BaseEventHandler.ts +145 -0
  118. package/src/events/BaseEventTransformer.ts +97 -0
  119. package/src/events/DeviceEventHandler.ts +211 -0
  120. package/src/events/DeviceEventTransformerFactory.ts +77 -0
  121. package/src/{device/local/events → events}/EventHandler.ts +24 -19
  122. package/src/events/EventHandlerOrchestrator.ts +119 -0
  123. package/src/events/EventProcessingService.ts +248 -0
  124. package/src/events/InternalEventSubscription.ts +219 -0
  125. package/src/events/index.ts +9 -0
  126. package/src/events/interfaces/DeviceEvent.ts +56 -0
  127. package/src/events/interfaces/IEventHandler.ts +28 -0
  128. package/src/events/interfaces/IEventTransformer.ts +8 -0
  129. package/src/events/interfaces/IInternalEvent.ts +47 -0
  130. package/src/events/interfaces/index.ts +4 -0
  131. package/src/index.ts +9 -2
  132. package/src/types/alert.types.ts +64 -0
  133. package/src/types/config.types.ts +17 -4
  134. package/src/types/index.ts +2 -0
  135. package/src/types/issue.types.ts +98 -0
  136. package/src/utils/http-utils.ts +143 -0
  137. package/dist/device/cloud/interface.d.ts +0 -101
  138. package/dist/device/cloud/interfaces/IDeviceConnectionService.d.ts +0 -7
  139. package/dist/device/cloud/interfaces/IDevicesService.d.ts +0 -9
  140. package/dist/device/cloud/services/Device.service.d.ts +0 -39
  141. package/dist/device/cloud/services/Device.service.js +0 -9
  142. package/dist/device/cloud/services/DeviceCloudService.d.ts +0 -42
  143. package/dist/device/cloud/services/DeviceCloudService.js +0 -59
  144. package/dist/device/cloud/services/DeviceHub.service.d.ts +0 -3
  145. package/dist/device/cloud/services/DeviceHub.service.js +0 -6
  146. package/dist/device/cloud/services/Hub.service.d.ts +0 -25
  147. package/dist/device/cloud/services/Hub.service.js +0 -9
  148. package/dist/device/cloud/services/SmartThingsDeviceService.d.ts +0 -38
  149. package/dist/device/cloud/services/SmartThingsDeviceService.js +0 -52
  150. package/dist/device/index.d.ts +0 -4
  151. package/dist/device/local/interface.d.ts +0 -0
  152. package/dist/device/local/interface.js +0 -1
  153. package/dist/device/local/services/DeviceHub.service.d.ts +0 -11
  154. package/dist/device/local/services/DeviceHub.service.js +0 -40
  155. package/src/device/local/events/index.ts +0 -2
  156. /package/dist/{device/cloud/interfaces/IDevicesService.js → events/interfaces/DeviceEvent.js} +0 -0
@@ -0,0 +1,248 @@
1
+ import { Service } from "typedi";
2
+ import { DeviceEventHandler } from "./DeviceEventHandler";
3
+ import { ILogger } from "../types/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
+ }
@@ -0,0 +1,219 @@
1
+ import { eventDispatcher } from "dt-pub-sub";
2
+ import { getConfig } from "../config/config";
3
+ import {
4
+ IInternalEvent,
5
+ HeartbeatEventData,
6
+ ScheduleEventData,
7
+ ReservationEventData,
8
+ ServiceEventData,
9
+ } from "./interfaces/IInternalEvent";
10
+ import { ILogger } from "../types/config.types";
11
+
12
+ // Event types enum for better type safety
13
+ export enum InternalEventType {
14
+ HEARTBEAT = "heartbeat",
15
+ SCHEDULE_CREATE = "schedule.create",
16
+ SCHEDULE_UPDATE = "schedule.update",
17
+ SCHEDULE_DELETE = "schedule.delete",
18
+ RESERVATION_CREATE = "reservation.create",
19
+ RESERVATION_UPDATE = "reservation.update",
20
+ RESERVATION_CANCEL = "reservation.cancel",
21
+ SERVICE_DOWN = "service.down",
22
+ }
23
+
24
+ export class InternalEventSubscription {
25
+ private readonly sqsQueueUrl: string;
26
+ private readonly logger: ILogger;
27
+ private readonly isInitialized: boolean = false;
28
+ private isSubscribed: boolean = false;
29
+
30
+ constructor(private readonly internalEventHandler: IInternalEvent) {
31
+ this.sqsQueueUrl = getConfig().SQS_QUEUE_URL;
32
+ this.logger = getConfig().LOGGER;
33
+ this.isInitialized = true;
34
+ }
35
+
36
+ private async handleMessage(message: any): Promise<void> {
37
+ try {
38
+ const eventType = message["detail-type"];
39
+ const eventData = message.detail;
40
+
41
+ this.logger.info("Received internal event", { eventType, eventData });
42
+
43
+ switch (eventType) {
44
+ case InternalEventType.HEARTBEAT:
45
+ await this.safeCallHandler(() =>
46
+ this.internalEventHandler.onHeartbeat(
47
+ eventData as HeartbeatEventData
48
+ )
49
+ );
50
+ break;
51
+
52
+ case InternalEventType.SCHEDULE_CREATE:
53
+ await this.safeCallHandler(() =>
54
+ this.internalEventHandler.onScheduleCreate(
55
+ eventData as ScheduleEventData
56
+ )
57
+ );
58
+ break;
59
+
60
+ case InternalEventType.SCHEDULE_UPDATE:
61
+ await this.safeCallHandler(() =>
62
+ this.internalEventHandler.onScheduleUpdate(
63
+ eventData as ScheduleEventData
64
+ )
65
+ );
66
+ break;
67
+
68
+ case InternalEventType.SCHEDULE_DELETE:
69
+ await this.safeCallHandler(() =>
70
+ this.internalEventHandler.onScheduleDelete(
71
+ eventData as ScheduleEventData
72
+ )
73
+ );
74
+ break;
75
+
76
+ case InternalEventType.RESERVATION_CREATE:
77
+ await this.safeCallHandler(() =>
78
+ this.internalEventHandler.onReservationCreate(
79
+ eventData as ReservationEventData
80
+ )
81
+ );
82
+ break;
83
+
84
+ case InternalEventType.RESERVATION_UPDATE:
85
+ await this.safeCallHandler(() =>
86
+ this.internalEventHandler.onReservationUpdate(
87
+ eventData as ReservationEventData
88
+ )
89
+ );
90
+ break;
91
+
92
+ case InternalEventType.RESERVATION_CANCEL:
93
+ await this.safeCallHandler(() =>
94
+ this.internalEventHandler.onReservationCancel(
95
+ eventData as ReservationEventData
96
+ )
97
+ );
98
+ break;
99
+
100
+ case InternalEventType.SERVICE_DOWN:
101
+ await this.safeCallHandler(() =>
102
+ this.internalEventHandler.onServiceDown(
103
+ eventData as ServiceEventData
104
+ )
105
+ );
106
+ break;
107
+
108
+ default:
109
+ this.logger.warn("Unknown event type", { eventType, eventData });
110
+ break;
111
+ }
112
+ } catch (error) {
113
+ this.logger.error("Error processing internal event message", {
114
+ error,
115
+ message,
116
+ eventType: message["detail-type"],
117
+ });
118
+ // Re-throw to let SQS handle retry logic
119
+ throw error;
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Safely call handler methods with error handling
125
+ */
126
+ private async safeCallHandler(
127
+ handlerCall: () => Promise<void>
128
+ ): Promise<void> {
129
+ try {
130
+ await handlerCall();
131
+ } catch (error) {
132
+ this.logger.error("Handler method execution failed", { error });
133
+ // Re-throw to let the main error handler deal with it
134
+ throw error;
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Subscribe to SQS events
140
+ */
141
+ public async subscribe(): Promise<void> {
142
+ if (!this.isInitialized) {
143
+ throw new Error(
144
+ "InternalEventSubscription must be initialized before subscribing"
145
+ );
146
+ }
147
+
148
+ if (!this.sqsQueueUrl) {
149
+ throw new Error("AWS SQS URL not found in environment variables");
150
+ }
151
+
152
+ if (this.isSubscribed) {
153
+ this.logger.warn("InternalEventSubscription is already subscribed");
154
+ return;
155
+ }
156
+
157
+ try {
158
+ await eventDispatcher.subscribeToQueue(
159
+ this.sqsQueueUrl,
160
+ this.handleMessage.bind(this)
161
+ );
162
+ this.isSubscribed = true;
163
+ this.logger.info("Successfully subscribed to internal events", {
164
+ sqsUrl: this.sqsQueueUrl,
165
+ });
166
+ } catch (error) {
167
+ this.logger.error("Failed to subscribe to internal events", {
168
+ error,
169
+ sqsUrl: this.sqsQueueUrl,
170
+ });
171
+ throw error;
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Unsubscribe from SQS events
177
+ */
178
+ public async unsubscribe(): Promise<void> {
179
+ if (!this.isSubscribed) {
180
+ this.logger.warn("InternalEventSubscription is not currently subscribed");
181
+ return;
182
+ }
183
+
184
+ try {
185
+ // Note: You might need to implement unsubscribe method in dt-pub-sub
186
+ // await eventDispatcher.unsubscribeFromQueue(this.sqsQueueUrl);
187
+
188
+ this.isSubscribed = false;
189
+ this.logger.info("Successfully unsubscribed from internal events");
190
+ } catch (error) {
191
+ this.logger.error("Failed to unsubscribe from internal events", {
192
+ error,
193
+ });
194
+ throw error;
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Get subscription status
200
+ */
201
+ public getStatus(): {
202
+ isInitialized: boolean;
203
+ isSubscribed: boolean;
204
+ sqsUrl: string;
205
+ } {
206
+ return {
207
+ isInitialized: this.isInitialized,
208
+ isSubscribed: this.isSubscribed,
209
+ sqsUrl: this.sqsQueueUrl,
210
+ };
211
+ }
212
+
213
+ /**
214
+ * Check if subscription is ready
215
+ */
216
+ public isReady(): boolean {
217
+ return this.isInitialized && this.isSubscribed;
218
+ }
219
+ }
@@ -0,0 +1,9 @@
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";
@@ -0,0 +1,56 @@
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
+ }
@@ -0,0 +1,28 @@
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
+ }
@@ -0,0 +1,8 @@
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
+ }
@@ -0,0 +1,47 @@
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 ReservationEventData {
20
+ reservationId: string;
21
+ propertyId: string;
22
+ deviceId?: string;
23
+ userId?: string;
24
+ startTime: string;
25
+ endTime: string;
26
+ status: string;
27
+ [key: string]: any;
28
+ }
29
+
30
+ export interface ServiceEventData {
31
+ serviceId: string;
32
+ serviceName: string;
33
+ status: string;
34
+ timestamp: string;
35
+ [key: string]: any;
36
+ }
37
+
38
+ export interface IInternalEvent {
39
+ onHeartbeat(data: HeartbeatEventData): Promise<void>;
40
+ onScheduleCreate(data: ScheduleEventData): Promise<void>;
41
+ onScheduleUpdate(data: ScheduleEventData): Promise<void>;
42
+ onScheduleDelete(data: ScheduleEventData): Promise<void>;
43
+ onServiceDown(data: ServiceEventData): Promise<void>;
44
+ onReservationCreate(data: ReservationEventData): Promise<void>;
45
+ onReservationUpdate(data: ReservationEventData): Promise<void>;
46
+ onReservationCancel(data: ReservationEventData): Promise<void>;
47
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./IInternalEvent";
2
+ export * from "./IEventHandler";
3
+ export * from "./IEventTransformer";
4
+ export * from "./DeviceEvent";
package/src/index.ts CHANGED
@@ -14,11 +14,18 @@ export {
14
14
  LocalScheduleService,
15
15
  } from "./device/local/services";
16
16
 
17
+ // Events exports
18
+ export * from "./events";
19
+ export * from "./events/interfaces";
20
+
17
21
  export * from "./device/cloud/interfaces";
18
22
 
19
23
  // Local exports
20
24
  export * from "./device/local/interfaces";
21
- export * from "./device/local/events";
25
+ export * from "./events";
26
+ export * from "./events/interfaces";
27
+ // Types exports
28
+ export * from "./types";
22
29
 
23
30
  //initialize export
24
- export { initialize, getConfig } from "./config/config";
31
+ export { initialize, getConfig, shutdown } from "./config/config";