dt-common-device 1.3.0 → 2.0.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 (132) 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/local/entities/AlertBuilder.d.ts +87 -0
  9. package/dist/device/local/entities/AlertBuilder.example.d.ts +11 -0
  10. package/dist/device/local/entities/AlertBuilder.example.js +117 -0
  11. package/dist/device/local/entities/AlertBuilder.js +179 -0
  12. package/dist/device/local/entities/IssueBuilder.d.ts +109 -0
  13. package/dist/device/local/entities/IssueBuilder.example.d.ts +16 -0
  14. package/dist/device/local/entities/IssueBuilder.example.js +196 -0
  15. package/dist/device/local/entities/IssueBuilder.js +237 -0
  16. package/dist/device/local/entities/index.d.ts +2 -0
  17. package/dist/device/local/entities/index.js +7 -0
  18. package/dist/device/local/interfaces/IDevice.d.ts +10 -9
  19. package/dist/device/local/interfaces/IDevice.js +7 -0
  20. package/dist/device/local/models/Alert.model.d.ts +28 -0
  21. package/dist/device/local/models/Alert.model.js +222 -0
  22. package/dist/device/local/models/Issue.model.d.ts +28 -0
  23. package/dist/device/local/models/Issue.model.js +260 -0
  24. package/dist/device/local/repository/Alert.repository.d.ts +106 -0
  25. package/dist/device/local/repository/Alert.repository.js +374 -0
  26. package/dist/device/local/repository/Device.repository.d.ts +10 -2
  27. package/dist/device/local/repository/Device.repository.js +153 -30
  28. package/dist/device/local/repository/Hub.repository.d.ts +1 -1
  29. package/dist/device/local/repository/Hub.repository.js +60 -18
  30. package/dist/device/local/repository/Issue.repository.d.ts +113 -0
  31. package/dist/device/local/repository/Issue.repository.js +401 -0
  32. package/dist/device/local/repository/Schedule.repository.d.ts +1 -1
  33. package/dist/device/local/repository/Schedule.repository.js +14 -18
  34. package/dist/device/local/services/Alert.service.d.ts +135 -5
  35. package/dist/device/local/services/Alert.service.js +471 -7
  36. package/dist/device/local/services/AlertService.example.d.ts +55 -0
  37. package/dist/device/local/services/AlertService.example.js +148 -0
  38. package/dist/device/local/services/Device.service.d.ts +8 -5
  39. package/dist/device/local/services/Device.service.js +58 -40
  40. package/dist/device/local/services/Issue.service.d.ts +168 -0
  41. package/dist/device/local/services/Issue.service.js +642 -0
  42. package/dist/device/local/services/IssueService.example.d.ts +68 -0
  43. package/dist/device/local/services/IssueService.example.js +177 -0
  44. package/dist/device/local/services/index.d.ts +7 -5
  45. package/dist/device/local/services/index.js +21 -11
  46. package/dist/events/BaseEventHandler.d.ts +43 -0
  47. package/dist/events/BaseEventHandler.js +111 -0
  48. package/dist/events/BaseEventTransformer.d.ts +26 -0
  49. package/dist/events/BaseEventTransformer.js +72 -0
  50. package/dist/events/DeviceEventHandler.d.ts +15 -0
  51. package/dist/events/DeviceEventHandler.js +152 -0
  52. package/dist/events/DeviceEventTransformerFactory.d.ts +27 -0
  53. package/dist/events/DeviceEventTransformerFactory.js +116 -0
  54. package/dist/events/EventHandler.d.ts +11 -0
  55. package/dist/events/EventHandler.js +106 -0
  56. package/dist/events/EventHandlerOrchestrator.d.ts +35 -0
  57. package/dist/events/EventHandlerOrchestrator.js +141 -0
  58. package/dist/events/EventProcessingService.d.ts +43 -0
  59. package/dist/events/EventProcessingService.js +243 -0
  60. package/dist/events/InternalEventSubscription.d.ts +44 -0
  61. package/dist/events/InternalEventSubscription.js +152 -0
  62. package/dist/events/index.d.ts +9 -0
  63. package/dist/events/index.js +21 -0
  64. package/dist/events/interfaces/DeviceEvent.d.ts +48 -0
  65. package/dist/events/interfaces/DeviceEvent.js +2 -0
  66. package/dist/events/interfaces/IEventHandler.d.ts +23 -0
  67. package/dist/events/interfaces/IEventHandler.js +2 -0
  68. package/dist/events/interfaces/IEventTransformer.d.ts +7 -0
  69. package/dist/events/interfaces/IEventTransformer.js +2 -0
  70. package/dist/events/interfaces/IInternalEvent.d.ts +42 -0
  71. package/dist/events/interfaces/IInternalEvent.js +2 -0
  72. package/dist/events/interfaces/index.d.ts +4 -0
  73. package/dist/events/interfaces/index.js +20 -0
  74. package/dist/index.d.ts +6 -2
  75. package/dist/index.js +9 -2
  76. package/dist/types/alert.types.d.ts +57 -0
  77. package/dist/types/alert.types.js +22 -0
  78. package/dist/types/config.types.d.ts +15 -4
  79. package/dist/types/index.d.ts +2 -0
  80. package/dist/types/index.js +2 -0
  81. package/dist/types/issue.types.d.ts +90 -0
  82. package/dist/types/issue.types.js +40 -0
  83. package/dist/utils/http-utils.d.ts +13 -0
  84. package/dist/utils/http-utils.js +117 -0
  85. package/package.json +2 -1
  86. package/src/config/config.ts +117 -14
  87. package/src/{device/local/events/Events.ts → constants/Event.ts} +34 -13
  88. package/src/db/db.ts +14 -5
  89. package/src/device/local/entities/AlertBuilder.example.ts +126 -0
  90. package/src/device/local/entities/AlertBuilder.ts +202 -0
  91. package/src/device/local/entities/IssueBuilder.example.ts +210 -0
  92. package/src/device/local/entities/IssueBuilder.ts +263 -0
  93. package/src/device/local/entities/README.md +173 -0
  94. package/src/device/local/entities/index.ts +2 -0
  95. package/src/device/local/interfaces/IDevice.ts +11 -9
  96. package/src/device/local/models/Alert.model.md +319 -0
  97. package/src/device/local/models/Alert.model.ts +283 -0
  98. package/src/device/local/models/Issue.model.md +386 -0
  99. package/src/device/local/models/Issue.model.ts +350 -0
  100. package/src/device/local/models/README.md +312 -0
  101. package/src/device/local/repository/Alert.repository.ts +465 -0
  102. package/src/device/local/repository/Device.repository.ts +241 -32
  103. package/src/device/local/repository/Hub.repository.ts +74 -18
  104. package/src/device/local/repository/Issue.repository.ts +517 -0
  105. package/src/device/local/repository/Schedule.repository.ts +28 -22
  106. package/src/device/local/services/Alert.service.ts +617 -5
  107. package/src/device/local/services/AlertService.example.ts +229 -0
  108. package/src/device/local/services/Device.service.ts +70 -50
  109. package/src/device/local/services/Issue.service.ts +872 -0
  110. package/src/device/local/services/IssueService.example.ts +307 -0
  111. package/src/device/local/services/index.ts +7 -5
  112. package/src/events/BaseEventHandler.ts +145 -0
  113. package/src/events/BaseEventTransformer.ts +97 -0
  114. package/src/events/DeviceEventHandler.ts +211 -0
  115. package/src/events/DeviceEventTransformerFactory.ts +77 -0
  116. package/src/{device/local/events → events}/EventHandler.ts +19 -15
  117. package/src/events/EventHandlerOrchestrator.ts +119 -0
  118. package/src/events/EventProcessingService.ts +248 -0
  119. package/src/events/InternalEventSubscription.ts +219 -0
  120. package/src/events/index.ts +9 -0
  121. package/src/events/interfaces/DeviceEvent.ts +56 -0
  122. package/src/events/interfaces/IEventHandler.ts +28 -0
  123. package/src/events/interfaces/IEventTransformer.ts +8 -0
  124. package/src/events/interfaces/IInternalEvent.ts +47 -0
  125. package/src/events/interfaces/index.ts +4 -0
  126. package/src/index.ts +9 -2
  127. package/src/types/alert.types.ts +64 -0
  128. package/src/types/config.types.ts +17 -4
  129. package/src/types/index.ts +2 -0
  130. package/src/types/issue.types.ts +98 -0
  131. package/src/utils/http-utils.ts +143 -0
  132. package/src/device/local/events/index.ts +0 -2
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
4
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
5
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
6
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
7
+ var _, done = false;
8
+ for (var i = decorators.length - 1; i >= 0; i--) {
9
+ var context = {};
10
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
11
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
12
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
13
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
14
+ if (kind === "accessor") {
15
+ if (result === void 0) continue;
16
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
17
+ if (_ = accept(result.get)) descriptor.get = _;
18
+ if (_ = accept(result.set)) descriptor.set = _;
19
+ if (_ = accept(result.init)) initializers.unshift(_);
20
+ }
21
+ else if (_ = accept(result)) {
22
+ if (kind === "field") initializers.unshift(_);
23
+ else descriptor[key] = _;
24
+ }
25
+ }
26
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
27
+ done = true;
28
+ };
29
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
30
+ var useValue = arguments.length > 2;
31
+ for (var i = 0; i < initializers.length; i++) {
32
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
33
+ }
34
+ return useValue ? value : void 0;
35
+ };
36
+ var __setFunctionName = (this && this.__setFunctionName) || function (f, name, prefix) {
37
+ if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
38
+ return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
39
+ };
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.EventProcessingService = void 0;
42
+ const typedi_1 = require("typedi");
43
+ const DeviceEventHandler_1 = require("./DeviceEventHandler");
44
+ const config_1 = require("../config/config");
45
+ const EventHandlerOrchestrator_1 = require("./EventHandlerOrchestrator");
46
+ let EventProcessingService = (() => {
47
+ let _classDecorators = [(0, typedi_1.Service)()];
48
+ let _classDescriptor;
49
+ let _classExtraInitializers = [];
50
+ let _classThis;
51
+ var EventProcessingService = _classThis = class {
52
+ constructor(deviceEventTransformerFactory) {
53
+ this.deviceEventTransformerFactory = deviceEventTransformerFactory;
54
+ this.deviceHandlers = new Map();
55
+ this.handlerOrchestrator = new EventHandlerOrchestrator_1.EventHandlerOrchestrator();
56
+ this.deviceEventHandler = new DeviceEventHandler_1.DeviceEventHandler();
57
+ this.logger = (0, config_1.getConfig)().LOGGER;
58
+ this.initializeDeviceHandlers();
59
+ this.initializeHandlers();
60
+ }
61
+ /**
62
+ * Initialize device-specific handlers - to be implemented by subclasses
63
+ */
64
+ initializeDeviceHandlers() {
65
+ this.deviceHandlers = new Map();
66
+ // Subclasses should override this method to add their specific handlers
67
+ }
68
+ /**
69
+ * Initialize the handler hierarchy - to be implemented by subclasses
70
+ */
71
+ initializeHandlers() {
72
+ try {
73
+ // Register generic handler for common events
74
+ this.handlerOrchestrator.registerHandlers([
75
+ new DeviceEventHandler_1.DeviceEventHandler(), // Priority 100 - handles common events first
76
+ ]);
77
+ this.logger.info("Base event handlers initialized successfully");
78
+ }
79
+ catch (error) {
80
+ this.logger.error("EventProcessingService: initializeHandlers Error", error);
81
+ }
82
+ }
83
+ /**
84
+ * Get device-specific handler based on connection provider
85
+ */
86
+ getDeviceHandler(connectionProvider) {
87
+ const normalizedProvider = connectionProvider.toLowerCase();
88
+ return this.deviceHandlers.get(normalizedProvider) || null;
89
+ }
90
+ /**
91
+ * Transform device event using EventTransformerFactory
92
+ */
93
+ transformDeviceEventWithTransformer(connectionProvider, rawData) {
94
+ try {
95
+ // Create transformer for the connection provider
96
+ const transformer = this.deviceEventTransformerFactory.createTransformer(connectionProvider, rawData);
97
+ if (!transformer) {
98
+ this.logger.warn(`No transformer found for connection provider: ${connectionProvider}`);
99
+ return null;
100
+ }
101
+ // Execute the transformation pipeline
102
+ const transformedEvents = transformer.executeTransformation();
103
+ if (transformedEvents.length === 0) {
104
+ this.logger.warn(`No events transformed for connection provider: ${connectionProvider}`);
105
+ return null;
106
+ }
107
+ // Return the first transformed event (or handle multiple events as needed)
108
+ return transformedEvents[0];
109
+ }
110
+ catch (error) {
111
+ this.logger.error(`Error transforming event for ${connectionProvider}:`, error);
112
+ return null;
113
+ }
114
+ }
115
+ /**
116
+ * Transform raw event data to DeviceEvent format using EventTransformer
117
+ */
118
+ transformToDeviceEvent(connectionProvider, rawData) {
119
+ try {
120
+ // Use the transformer-based approach
121
+ const deviceEvent = this.transformDeviceEventWithTransformer(connectionProvider, rawData);
122
+ if (!deviceEvent) {
123
+ this.logger.warn("Failed to transform event data using transformer", {
124
+ connectionProvider,
125
+ rawData,
126
+ });
127
+ return null;
128
+ }
129
+ this.logger.info("Transformed event using EventTransformer", {
130
+ connectionProvider,
131
+ originalEventName: deviceEvent.originalEventName,
132
+ transformedEventName: deviceEvent.eventName,
133
+ deviceId: deviceEvent.deviceId,
134
+ });
135
+ return deviceEvent;
136
+ }
137
+ catch (error) {
138
+ this.logger.error("EventProcessingService: transformToDeviceEvent Error", error);
139
+ return null;
140
+ }
141
+ }
142
+ /**
143
+ * Process a single event from device.event.controller
144
+ */
145
+ async processEvent(connectionProvider, rawData) {
146
+ try {
147
+ this.logger.info("EventProcessingService: Processing event", {
148
+ connectionProvider,
149
+ eventName: rawData.eventName ?? rawData.type,
150
+ });
151
+ // Transform raw data to DeviceEvent using EventTransformer
152
+ const deviceEvent = this.transformToDeviceEvent(connectionProvider, rawData);
153
+ if (!deviceEvent) {
154
+ this.logger.warn("Failed to transform event data", {
155
+ connectionProvider,
156
+ rawData,
157
+ });
158
+ return;
159
+ }
160
+ // Get device-specific handler
161
+ const deviceHandler = this.getDeviceHandler(connectionProvider);
162
+ if (!deviceHandler) {
163
+ this.logger.warn("No device handler found for provider", {
164
+ connectionProvider,
165
+ });
166
+ return;
167
+ }
168
+ // Process with GenericEventHandler first (common logic)
169
+ if (this.deviceEventHandler.canHandle(deviceEvent.eventName)) {
170
+ try {
171
+ await this.deviceEventHandler.handleEvent(deviceEvent);
172
+ this.logger.info("Event processed by GenericEventHandler");
173
+ }
174
+ catch (error) {
175
+ this.logger.error("EventProcessingService: GenericEventHandler Error", error);
176
+ }
177
+ }
178
+ // Process with device-specific handler
179
+ if (deviceHandler.canHandle(deviceEvent.eventName)) {
180
+ try {
181
+ await deviceHandler.onEvent(deviceEvent);
182
+ this.logger.info("Event processed by device-specific handler", {
183
+ handler: deviceHandler.constructor.name,
184
+ });
185
+ }
186
+ catch (error) {
187
+ this.logger.error("EventProcessingService: Device-specific handler Error", error);
188
+ }
189
+ }
190
+ else {
191
+ this.logger.warn("Device handler cannot handle event", {
192
+ handler: deviceHandler.constructor.name,
193
+ eventName: deviceEvent.eventName,
194
+ });
195
+ }
196
+ }
197
+ catch (error) {
198
+ this.logger.error("EventProcessingService: processEvent Error", error);
199
+ throw error;
200
+ }
201
+ }
202
+ /**
203
+ * Process a single event (legacy method for DeviceEvent objects)
204
+ */
205
+ async processEventLegacy(event) {
206
+ try {
207
+ this.logger.info("EventProcessingService: Processing legacy event", {
208
+ eventName: event.eventName,
209
+ });
210
+ await this.handlerOrchestrator.processEvent(event);
211
+ }
212
+ catch (error) {
213
+ this.logger.error("EventProcessingService: processEventLegacy Error", error);
214
+ throw error;
215
+ }
216
+ }
217
+ /**
218
+ * Process multiple events
219
+ */
220
+ async processEvents(events) {
221
+ try {
222
+ this.logger.info("EventProcessingService: Processing multiple events", {
223
+ count: events.length,
224
+ });
225
+ await this.handlerOrchestrator.processEvents(events);
226
+ }
227
+ catch (error) {
228
+ this.logger.error("EventProcessingService: processEvents Error", error);
229
+ throw error;
230
+ }
231
+ }
232
+ };
233
+ __setFunctionName(_classThis, "EventProcessingService");
234
+ (() => {
235
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
236
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
237
+ EventProcessingService = _classThis = _classDescriptor.value;
238
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
239
+ __runInitializers(_classThis, _classExtraInitializers);
240
+ })();
241
+ return EventProcessingService = _classThis;
242
+ })();
243
+ exports.EventProcessingService = EventProcessingService;
@@ -0,0 +1,44 @@
1
+ import { IInternalEvent } from "./interfaces/IInternalEvent";
2
+ export declare enum InternalEventType {
3
+ HEARTBEAT = "heartbeat",
4
+ SCHEDULE_CREATE = "schedule.create",
5
+ SCHEDULE_UPDATE = "schedule.update",
6
+ SCHEDULE_DELETE = "schedule.delete",
7
+ RESERVATION_CREATE = "reservation.create",
8
+ RESERVATION_UPDATE = "reservation.update",
9
+ RESERVATION_CANCEL = "reservation.cancel",
10
+ SERVICE_DOWN = "service.down"
11
+ }
12
+ export declare class InternalEventSubscription {
13
+ private readonly internalEventHandler;
14
+ private readonly sqsQueueUrl;
15
+ private readonly logger;
16
+ private readonly isInitialized;
17
+ private isSubscribed;
18
+ constructor(internalEventHandler: IInternalEvent);
19
+ private handleMessage;
20
+ /**
21
+ * Safely call handler methods with error handling
22
+ */
23
+ private safeCallHandler;
24
+ /**
25
+ * Subscribe to SQS events
26
+ */
27
+ subscribe(): Promise<void>;
28
+ /**
29
+ * Unsubscribe from SQS events
30
+ */
31
+ unsubscribe(): Promise<void>;
32
+ /**
33
+ * Get subscription status
34
+ */
35
+ getStatus(): {
36
+ isInitialized: boolean;
37
+ isSubscribed: boolean;
38
+ sqsUrl: string;
39
+ };
40
+ /**
41
+ * Check if subscription is ready
42
+ */
43
+ isReady(): boolean;
44
+ }
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InternalEventSubscription = exports.InternalEventType = void 0;
4
+ const dt_pub_sub_1 = require("dt-pub-sub");
5
+ const config_1 = require("../config/config");
6
+ // Event types enum for better type safety
7
+ var InternalEventType;
8
+ (function (InternalEventType) {
9
+ InternalEventType["HEARTBEAT"] = "heartbeat";
10
+ InternalEventType["SCHEDULE_CREATE"] = "schedule.create";
11
+ InternalEventType["SCHEDULE_UPDATE"] = "schedule.update";
12
+ InternalEventType["SCHEDULE_DELETE"] = "schedule.delete";
13
+ InternalEventType["RESERVATION_CREATE"] = "reservation.create";
14
+ InternalEventType["RESERVATION_UPDATE"] = "reservation.update";
15
+ InternalEventType["RESERVATION_CANCEL"] = "reservation.cancel";
16
+ InternalEventType["SERVICE_DOWN"] = "service.down";
17
+ })(InternalEventType || (exports.InternalEventType = InternalEventType = {}));
18
+ class InternalEventSubscription {
19
+ constructor(internalEventHandler) {
20
+ this.internalEventHandler = internalEventHandler;
21
+ this.isInitialized = false;
22
+ this.isSubscribed = false;
23
+ this.sqsQueueUrl = (0, config_1.getConfig)().SQS_QUEUE_URL;
24
+ this.logger = (0, config_1.getConfig)().LOGGER;
25
+ this.isInitialized = true;
26
+ }
27
+ async handleMessage(message) {
28
+ try {
29
+ const eventType = message["detail-type"];
30
+ const eventData = message.detail;
31
+ this.logger.info("Received internal event", { eventType, eventData });
32
+ switch (eventType) {
33
+ case InternalEventType.HEARTBEAT:
34
+ await this.safeCallHandler(() => this.internalEventHandler.onHeartbeat(eventData));
35
+ break;
36
+ case InternalEventType.SCHEDULE_CREATE:
37
+ await this.safeCallHandler(() => this.internalEventHandler.onScheduleCreate(eventData));
38
+ break;
39
+ case InternalEventType.SCHEDULE_UPDATE:
40
+ await this.safeCallHandler(() => this.internalEventHandler.onScheduleUpdate(eventData));
41
+ break;
42
+ case InternalEventType.SCHEDULE_DELETE:
43
+ await this.safeCallHandler(() => this.internalEventHandler.onScheduleDelete(eventData));
44
+ break;
45
+ case InternalEventType.RESERVATION_CREATE:
46
+ await this.safeCallHandler(() => this.internalEventHandler.onReservationCreate(eventData));
47
+ break;
48
+ case InternalEventType.RESERVATION_UPDATE:
49
+ await this.safeCallHandler(() => this.internalEventHandler.onReservationUpdate(eventData));
50
+ break;
51
+ case InternalEventType.RESERVATION_CANCEL:
52
+ await this.safeCallHandler(() => this.internalEventHandler.onReservationCancel(eventData));
53
+ break;
54
+ case InternalEventType.SERVICE_DOWN:
55
+ await this.safeCallHandler(() => this.internalEventHandler.onServiceDown(eventData));
56
+ break;
57
+ default:
58
+ this.logger.warn("Unknown event type", { eventType, eventData });
59
+ break;
60
+ }
61
+ }
62
+ catch (error) {
63
+ this.logger.error("Error processing internal event message", {
64
+ error,
65
+ message,
66
+ eventType: message["detail-type"],
67
+ });
68
+ // Re-throw to let SQS handle retry logic
69
+ throw error;
70
+ }
71
+ }
72
+ /**
73
+ * Safely call handler methods with error handling
74
+ */
75
+ async safeCallHandler(handlerCall) {
76
+ try {
77
+ await handlerCall();
78
+ }
79
+ catch (error) {
80
+ this.logger.error("Handler method execution failed", { error });
81
+ // Re-throw to let the main error handler deal with it
82
+ throw error;
83
+ }
84
+ }
85
+ /**
86
+ * Subscribe to SQS events
87
+ */
88
+ async subscribe() {
89
+ if (!this.isInitialized) {
90
+ throw new Error("InternalEventSubscription must be initialized before subscribing");
91
+ }
92
+ if (!this.sqsQueueUrl) {
93
+ throw new Error("AWS SQS URL not found in environment variables");
94
+ }
95
+ if (this.isSubscribed) {
96
+ this.logger.warn("InternalEventSubscription is already subscribed");
97
+ return;
98
+ }
99
+ try {
100
+ await dt_pub_sub_1.eventDispatcher.subscribeToQueue(this.sqsQueueUrl, this.handleMessage.bind(this));
101
+ this.isSubscribed = true;
102
+ this.logger.info("Successfully subscribed to internal events", {
103
+ sqsUrl: this.sqsQueueUrl,
104
+ });
105
+ }
106
+ catch (error) {
107
+ this.logger.error("Failed to subscribe to internal events", {
108
+ error,
109
+ sqsUrl: this.sqsQueueUrl,
110
+ });
111
+ throw error;
112
+ }
113
+ }
114
+ /**
115
+ * Unsubscribe from SQS events
116
+ */
117
+ async unsubscribe() {
118
+ if (!this.isSubscribed) {
119
+ this.logger.warn("InternalEventSubscription is not currently subscribed");
120
+ return;
121
+ }
122
+ try {
123
+ // Note: You might need to implement unsubscribe method in dt-pub-sub
124
+ // await eventDispatcher.unsubscribeFromQueue(this.sqsQueueUrl);
125
+ this.isSubscribed = false;
126
+ this.logger.info("Successfully unsubscribed from internal events");
127
+ }
128
+ catch (error) {
129
+ this.logger.error("Failed to unsubscribe from internal events", {
130
+ error,
131
+ });
132
+ throw error;
133
+ }
134
+ }
135
+ /**
136
+ * Get subscription status
137
+ */
138
+ getStatus() {
139
+ return {
140
+ isInitialized: this.isInitialized,
141
+ isSubscribed: this.isSubscribed,
142
+ sqsUrl: this.sqsQueueUrl,
143
+ };
144
+ }
145
+ /**
146
+ * Check if subscription is ready
147
+ */
148
+ isReady() {
149
+ return this.isInitialized && this.isSubscribed;
150
+ }
151
+ }
152
+ exports.InternalEventSubscription = InternalEventSubscription;
@@ -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,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseEventTransformer = exports.BaseEventHandler = exports.DeviceEventTransformerFactory = exports.EventHandlerOrchestrator = exports.DeviceEventHandler = exports.EventProcessingService = exports.InternalEventSubscription = exports.EventHandler = exports.DT_EVENT_TYPES = void 0;
4
+ var Event_1 = require("../constants/Event");
5
+ Object.defineProperty(exports, "DT_EVENT_TYPES", { enumerable: true, get: function () { return Event_1.DT_EVENT_TYPES; } });
6
+ var EventHandler_1 = require("./EventHandler");
7
+ Object.defineProperty(exports, "EventHandler", { enumerable: true, get: function () { return EventHandler_1.EventHandler; } });
8
+ var InternalEventSubscription_1 = require("./InternalEventSubscription");
9
+ Object.defineProperty(exports, "InternalEventSubscription", { enumerable: true, get: function () { return InternalEventSubscription_1.InternalEventSubscription; } });
10
+ var EventProcessingService_1 = require("./EventProcessingService");
11
+ Object.defineProperty(exports, "EventProcessingService", { enumerable: true, get: function () { return EventProcessingService_1.EventProcessingService; } });
12
+ var DeviceEventHandler_1 = require("./DeviceEventHandler");
13
+ Object.defineProperty(exports, "DeviceEventHandler", { enumerable: true, get: function () { return DeviceEventHandler_1.DeviceEventHandler; } });
14
+ var EventHandlerOrchestrator_1 = require("./EventHandlerOrchestrator");
15
+ Object.defineProperty(exports, "EventHandlerOrchestrator", { enumerable: true, get: function () { return EventHandlerOrchestrator_1.EventHandlerOrchestrator; } });
16
+ var DeviceEventTransformerFactory_1 = require("./DeviceEventTransformerFactory");
17
+ Object.defineProperty(exports, "DeviceEventTransformerFactory", { enumerable: true, get: function () { return DeviceEventTransformerFactory_1.DeviceEventTransformerFactory; } });
18
+ var BaseEventHandler_1 = require("./BaseEventHandler");
19
+ Object.defineProperty(exports, "BaseEventHandler", { enumerable: true, get: function () { return BaseEventHandler_1.BaseEventHandler; } });
20
+ var BaseEventTransformer_1 = require("./BaseEventTransformer");
21
+ Object.defineProperty(exports, "BaseEventTransformer", { enumerable: true, get: function () { return BaseEventTransformer_1.BaseEventTransformer; } });
@@ -0,0 +1,48 @@
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;
10
+ }
11
+ export interface EventConstructionOptions {
12
+ eventId?: string;
13
+ eventName?: string;
14
+ status?: string;
15
+ mode?: string;
16
+ userName?: string;
17
+ userId?: string;
18
+ userType?: string;
19
+ rawEvent?: any;
20
+ batteryLevel?: string;
21
+ reason?: string;
22
+ eventDescription?: string;
23
+ }
24
+ export interface DeviceEventEntity {
25
+ event: any;
26
+ device: any;
27
+ hub: any[];
28
+ property: any;
29
+ }
30
+ export interface DeviceEventData {
31
+ mode?: string;
32
+ batteryLevel?: number;
33
+ }
34
+ export interface TTLockEventData extends DeviceEventData {
35
+ label: string;
36
+ }
37
+ export interface SaltoKSLockEventData extends DeviceEventData {
38
+ userId: string;
39
+ deviceName: string;
40
+ username: string;
41
+ accessBy: string;
42
+ accessDetails: string;
43
+ }
44
+ export interface TuyaLockEventData extends DeviceEventData {
45
+ }
46
+ export interface SchlageLockEventData extends DeviceEventData {
47
+ event: any;
48
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,23 @@
1
+ import { DeviceEvent } from "./DeviceEvent";
2
+ export interface IEventHandler {
3
+ /**
4
+ * Handle a single transformed event
5
+ */
6
+ handleEvent(event: DeviceEvent): Promise<void>;
7
+ /**
8
+ * Handle multiple events
9
+ */
10
+ handleEvents(events: DeviceEvent[]): Promise<void>;
11
+ /**
12
+ * Check if this handler can process the given event type
13
+ */
14
+ canHandle(eventType: string): boolean;
15
+ /**
16
+ * Get the priority of this handler (lower numbers = higher priority)
17
+ */
18
+ getPriority(): number;
19
+ /**
20
+ * Get the event types this handler can process
21
+ */
22
+ getSupportedEventTypes(): string[];
23
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ import { DeviceEvent } from "./DeviceEvent";
2
+ export interface IEventTransformer {
3
+ parseData(rawData: any): any;
4
+ transform(parsedData: any): DeviceEvent | DeviceEvent[];
5
+ validate(transformedEvent: DeviceEvent): boolean;
6
+ executeTransformation(): DeviceEvent[];
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,42 @@
1
+ export interface HeartbeatEventData {
2
+ duration?: number;
3
+ propertyId?: string;
4
+ timestamp?: string;
5
+ [key: string]: any;
6
+ }
7
+ export interface ScheduleEventData {
8
+ scheduleId: string;
9
+ propertyId: string;
10
+ deviceId?: string;
11
+ startTime: string;
12
+ endTime: string;
13
+ action: string;
14
+ [key: string]: any;
15
+ }
16
+ export interface ReservationEventData {
17
+ reservationId: string;
18
+ propertyId: string;
19
+ deviceId?: string;
20
+ userId?: string;
21
+ startTime: string;
22
+ endTime: string;
23
+ status: string;
24
+ [key: string]: any;
25
+ }
26
+ export interface ServiceEventData {
27
+ serviceId: string;
28
+ serviceName: string;
29
+ status: string;
30
+ timestamp: string;
31
+ [key: string]: any;
32
+ }
33
+ export interface IInternalEvent {
34
+ onHeartbeat(data: HeartbeatEventData): Promise<void>;
35
+ onScheduleCreate(data: ScheduleEventData): Promise<void>;
36
+ onScheduleUpdate(data: ScheduleEventData): Promise<void>;
37
+ onScheduleDelete(data: ScheduleEventData): Promise<void>;
38
+ onServiceDown(data: ServiceEventData): Promise<void>;
39
+ onReservationCreate(data: ReservationEventData): Promise<void>;
40
+ onReservationUpdate(data: ReservationEventData): Promise<void>;
41
+ onReservationCancel(data: ReservationEventData): Promise<void>;
42
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ export * from "./IInternalEvent";
2
+ export * from "./IEventHandler";
3
+ export * from "./IEventTransformer";
4
+ export * from "./DeviceEvent";
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./IInternalEvent"), exports);
18
+ __exportStar(require("./IEventHandler"), exports);
19
+ __exportStar(require("./IEventTransformer"), exports);
20
+ __exportStar(require("./DeviceEvent"), exports);
package/dist/index.d.ts CHANGED
@@ -1,6 +1,10 @@
1
1
  export { CloudDevice, CloudDeviceService, DeviceFactory, } from "./device/cloud/entities";
2
2
  export { LocalDeviceService, LocalHubService, LocalConnectionService, LocalPropertyService, LocalScheduleService, } from "./device/local/services";
3
+ export * from "./events";
4
+ export * from "./events/interfaces";
3
5
  export * from "./device/cloud/interfaces";
4
6
  export * from "./device/local/interfaces";
5
- export * from "./device/local/events";
6
- export { initialize, getConfig } from "./config/config";
7
+ export * from "./events";
8
+ export * from "./events/interfaces";
9
+ export * from "./types";
10
+ export { initialize, getConfig, shutdown } from "./config/config";