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.
- package/TROUBLESHOOTING.md +184 -0
- package/dist/config/config.d.ts +9 -2
- package/dist/config/config.js +97 -14
- package/dist/constants/Event.d.ts +75 -0
- package/dist/constants/Event.js +78 -0
- package/dist/db/db.d.ts +1 -0
- package/dist/db/db.js +18 -2
- package/dist/device/local/entities/AlertBuilder.d.ts +87 -0
- package/dist/device/local/entities/AlertBuilder.example.d.ts +11 -0
- package/dist/device/local/entities/AlertBuilder.example.js +117 -0
- package/dist/device/local/entities/AlertBuilder.js +179 -0
- package/dist/device/local/entities/IssueBuilder.d.ts +109 -0
- package/dist/device/local/entities/IssueBuilder.example.d.ts +16 -0
- package/dist/device/local/entities/IssueBuilder.example.js +196 -0
- package/dist/device/local/entities/IssueBuilder.js +237 -0
- package/dist/device/local/entities/index.d.ts +2 -0
- package/dist/device/local/entities/index.js +7 -0
- package/dist/device/local/interfaces/IDevice.d.ts +10 -9
- package/dist/device/local/interfaces/IDevice.js +7 -0
- package/dist/device/local/models/Alert.model.d.ts +28 -0
- package/dist/device/local/models/Alert.model.js +222 -0
- package/dist/device/local/models/Issue.model.d.ts +28 -0
- package/dist/device/local/models/Issue.model.js +260 -0
- package/dist/device/local/repository/Alert.repository.d.ts +106 -0
- package/dist/device/local/repository/Alert.repository.js +374 -0
- package/dist/device/local/repository/Device.repository.d.ts +10 -2
- package/dist/device/local/repository/Device.repository.js +153 -30
- package/dist/device/local/repository/Hub.repository.d.ts +1 -1
- package/dist/device/local/repository/Hub.repository.js +60 -18
- package/dist/device/local/repository/Issue.repository.d.ts +113 -0
- package/dist/device/local/repository/Issue.repository.js +401 -0
- package/dist/device/local/repository/Schedule.repository.d.ts +1 -1
- package/dist/device/local/repository/Schedule.repository.js +14 -18
- package/dist/device/local/services/Alert.service.d.ts +135 -5
- package/dist/device/local/services/Alert.service.js +471 -7
- package/dist/device/local/services/AlertService.example.d.ts +55 -0
- package/dist/device/local/services/AlertService.example.js +148 -0
- package/dist/device/local/services/Device.service.d.ts +8 -5
- package/dist/device/local/services/Device.service.js +58 -40
- package/dist/device/local/services/Issue.service.d.ts +168 -0
- package/dist/device/local/services/Issue.service.js +642 -0
- package/dist/device/local/services/IssueService.example.d.ts +68 -0
- package/dist/device/local/services/IssueService.example.js +177 -0
- package/dist/device/local/services/index.d.ts +7 -5
- package/dist/device/local/services/index.js +21 -11
- package/dist/events/BaseEventHandler.d.ts +43 -0
- package/dist/events/BaseEventHandler.js +111 -0
- package/dist/events/BaseEventTransformer.d.ts +26 -0
- package/dist/events/BaseEventTransformer.js +72 -0
- package/dist/events/DeviceEventHandler.d.ts +15 -0
- package/dist/events/DeviceEventHandler.js +152 -0
- package/dist/events/DeviceEventTransformerFactory.d.ts +27 -0
- package/dist/events/DeviceEventTransformerFactory.js +116 -0
- package/dist/events/EventHandler.d.ts +11 -0
- package/dist/events/EventHandler.js +106 -0
- package/dist/events/EventHandlerOrchestrator.d.ts +35 -0
- package/dist/events/EventHandlerOrchestrator.js +141 -0
- package/dist/events/EventProcessingService.d.ts +43 -0
- package/dist/events/EventProcessingService.js +243 -0
- package/dist/events/InternalEventSubscription.d.ts +44 -0
- package/dist/events/InternalEventSubscription.js +152 -0
- package/dist/events/index.d.ts +9 -0
- package/dist/events/index.js +21 -0
- package/dist/events/interfaces/DeviceEvent.d.ts +48 -0
- package/dist/events/interfaces/DeviceEvent.js +2 -0
- package/dist/events/interfaces/IEventHandler.d.ts +23 -0
- package/dist/events/interfaces/IEventHandler.js +2 -0
- package/dist/events/interfaces/IEventTransformer.d.ts +7 -0
- package/dist/events/interfaces/IEventTransformer.js +2 -0
- package/dist/events/interfaces/IInternalEvent.d.ts +42 -0
- package/dist/events/interfaces/IInternalEvent.js +2 -0
- package/dist/events/interfaces/index.d.ts +4 -0
- package/dist/events/interfaces/index.js +20 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.js +9 -2
- package/dist/types/alert.types.d.ts +57 -0
- package/dist/types/alert.types.js +22 -0
- package/dist/types/config.types.d.ts +15 -4
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +2 -0
- package/dist/types/issue.types.d.ts +90 -0
- package/dist/types/issue.types.js +40 -0
- package/dist/utils/http-utils.d.ts +13 -0
- package/dist/utils/http-utils.js +117 -0
- package/package.json +2 -1
- package/src/config/config.ts +117 -14
- package/src/{device/local/events/Events.ts → constants/Event.ts} +34 -13
- package/src/db/db.ts +14 -5
- package/src/device/local/entities/AlertBuilder.example.ts +126 -0
- package/src/device/local/entities/AlertBuilder.ts +202 -0
- package/src/device/local/entities/IssueBuilder.example.ts +210 -0
- package/src/device/local/entities/IssueBuilder.ts +263 -0
- package/src/device/local/entities/README.md +173 -0
- package/src/device/local/entities/index.ts +2 -0
- package/src/device/local/interfaces/IDevice.ts +11 -9
- package/src/device/local/models/Alert.model.md +319 -0
- package/src/device/local/models/Alert.model.ts +283 -0
- package/src/device/local/models/Issue.model.md +386 -0
- package/src/device/local/models/Issue.model.ts +350 -0
- package/src/device/local/models/README.md +312 -0
- package/src/device/local/repository/Alert.repository.ts +465 -0
- package/src/device/local/repository/Device.repository.ts +241 -32
- package/src/device/local/repository/Hub.repository.ts +74 -18
- package/src/device/local/repository/Issue.repository.ts +517 -0
- package/src/device/local/repository/Schedule.repository.ts +28 -22
- package/src/device/local/services/Alert.service.ts +617 -5
- package/src/device/local/services/AlertService.example.ts +229 -0
- package/src/device/local/services/Device.service.ts +70 -50
- package/src/device/local/services/Issue.service.ts +872 -0
- package/src/device/local/services/IssueService.example.ts +307 -0
- package/src/device/local/services/index.ts +7 -5
- package/src/events/BaseEventHandler.ts +145 -0
- package/src/events/BaseEventTransformer.ts +97 -0
- package/src/events/DeviceEventHandler.ts +211 -0
- package/src/events/DeviceEventTransformerFactory.ts +77 -0
- package/src/{device/local/events → events}/EventHandler.ts +19 -15
- package/src/events/EventHandlerOrchestrator.ts +119 -0
- package/src/events/EventProcessingService.ts +248 -0
- package/src/events/InternalEventSubscription.ts +219 -0
- package/src/events/index.ts +9 -0
- package/src/events/interfaces/DeviceEvent.ts +56 -0
- package/src/events/interfaces/IEventHandler.ts +28 -0
- package/src/events/interfaces/IEventTransformer.ts +8 -0
- package/src/events/interfaces/IInternalEvent.ts +47 -0
- package/src/events/interfaces/index.ts +4 -0
- package/src/index.ts +9 -2
- package/src/types/alert.types.ts +64 -0
- package/src/types/config.types.ts +17 -4
- package/src/types/index.ts +2 -0
- package/src/types/issue.types.ts +98 -0
- package/src/utils/http-utils.ts +143 -0
- 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,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,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,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,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 "./
|
|
6
|
-
export
|
|
7
|
+
export * from "./events";
|
|
8
|
+
export * from "./events/interfaces";
|
|
9
|
+
export * from "./types";
|
|
10
|
+
export { initialize, getConfig, shutdown } from "./config/config";
|