dt-common-device 9.2.4 → 9.2.6

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 (233) hide show
  1. package/dist/audit/ExcludeAudits.js +5 -0
  2. package/dist/audit/PushAudit.js +1 -2
  3. package/dist/chronicle/Cronicle.service.d.ts +6 -2
  4. package/dist/chronicle/Cronicle.service.js +19 -2
  5. package/dist/chronicle/ICronicle.interface.d.ts +1 -0
  6. package/dist/entities/accessGroup/AccessGroup.repository.d.ts +2 -1
  7. package/dist/entities/accessGroup/AccessGroup.repository.js +4 -1
  8. package/dist/entities/accessGroup/AccessGroup.service.d.ts +2 -1
  9. package/dist/entities/accessGroup/AccessGroup.service.js +4 -3
  10. package/dist/entities/device/local/services/Device.service.js +10 -0
  11. package/dist/entities/guest/Guest.repository.d.ts +1 -1
  12. package/dist/entities/guest/Guest.repository.js +5 -2
  13. package/dist/entities/guest/Guest.service.d.ts +1 -1
  14. package/dist/entities/guest/Guest.service.js +4 -1
  15. package/dist/entities/schedules/Schedule.repository.d.ts +1 -1
  16. package/dist/entities/schedules/Schedule.repository.js +5 -2
  17. package/dist/entities/schedules/Schedule.service.d.ts +1 -1
  18. package/dist/entities/schedules/Schedule.service.js +4 -1
  19. package/dist/entities/user/User.repository.js +4 -1
  20. package/dist/entities/user/User.service.d.ts +1 -1
  21. package/dist/entities/user/User.service.js +4 -1
  22. package/dist/entities/zone/Zone.service.js +4 -1
  23. package/dist/issues/Issue.service.js +7 -12
  24. package/dist/queue/entities/HybridHttpQueue.js +43 -11
  25. package/dist/queue/utils/queueUtils.d.ts +1 -1
  26. package/dist/queue/utils/queueUtils.js +147 -53
  27. package/package.json +1 -1
  28. package/dist/admin/Admin.repository.d.ts +0 -7
  29. package/dist/admin/Admin.repository.js +0 -182
  30. package/dist/admin/Admin.service.d.ts +0 -5
  31. package/dist/admin/Admin.service.js +0 -17
  32. package/dist/admin/index.d.ts +0 -1
  33. package/dist/admin/index.js +0 -17
  34. package/dist/audit/AuditProperties.d.ts +0 -16
  35. package/dist/audit/AuditProperties.js +0 -2
  36. package/dist/chronicle/IChronicle.interface.d.ts +0 -14
  37. package/dist/chronicle/IChronicle.interface.js +0 -2
  38. package/dist/chronicle/chronicle.service.d.ts +0 -4
  39. package/dist/chronicle/chronicle.service.js +0 -44
  40. package/dist/connection/Connection.repository.d.ts +0 -8
  41. package/dist/connection/Connection.repository.js +0 -92
  42. package/dist/connection/Connection.service.d.ts +0 -8
  43. package/dist/connection/Connection.service.js +0 -32
  44. package/dist/connection/IConnection.d.ts +0 -28
  45. package/dist/connection/IConnection.js +0 -16
  46. package/dist/connection/index.d.ts +0 -2
  47. package/dist/connection/index.js +0 -18
  48. package/dist/copilotQueue/examples/CopilotQueue.example.d.ts +0 -37
  49. package/dist/copilotQueue/examples/CopilotQueue.example.js +0 -140
  50. package/dist/copilotQueue/examples/index.d.ts +0 -1
  51. package/dist/copilotQueue/examples/index.js +0 -17
  52. package/dist/device/cloud/entities/CloudConnection.d.ts +0 -6
  53. package/dist/device/cloud/entities/CloudConnection.js +0 -6
  54. package/dist/device/cloud/entities/CloudDevice.d.ts +0 -16
  55. package/dist/device/cloud/entities/CloudDevice.js +0 -26
  56. package/dist/device/cloud/entities/CloudDeviceService.d.ts +0 -5
  57. package/dist/device/cloud/entities/CloudDeviceService.js +0 -9
  58. package/dist/device/cloud/entities/DeviceFactory.d.ts +0 -7
  59. package/dist/device/cloud/entities/DeviceFactory.js +0 -80
  60. package/dist/device/cloud/entities/index.d.ts +0 -3
  61. package/dist/device/cloud/entities/index.js +0 -19
  62. package/dist/device/cloud/interface.d.ts +0 -101
  63. package/dist/device/cloud/interface.js +0 -3
  64. package/dist/device/cloud/interfaces/ICloudConnection.d.ts +0 -5
  65. package/dist/device/cloud/interfaces/ICloudConnection.js +0 -2
  66. package/dist/device/cloud/interfaces/ICloudDevice.d.ts +0 -9
  67. package/dist/device/cloud/interfaces/ICloudDevice.js +0 -2
  68. package/dist/device/cloud/interfaces/ICloudDeviceService.d.ts +0 -4
  69. package/dist/device/cloud/interfaces/ICloudDeviceService.js +0 -2
  70. package/dist/device/cloud/interfaces/IConnectionService.d.ts +0 -7
  71. package/dist/device/cloud/interfaces/IConnectionService.js +0 -2
  72. package/dist/device/cloud/interfaces/IDeviceConnectionService.d.ts +0 -7
  73. package/dist/device/cloud/interfaces/IDeviceConnectionService.js +0 -3
  74. package/dist/device/cloud/interfaces/IDeviceFactory.d.ts +0 -4
  75. package/dist/device/cloud/interfaces/IDeviceFactory.js +0 -2
  76. package/dist/device/cloud/interfaces/IDeviceService.d.ts +0 -8
  77. package/dist/device/cloud/interfaces/IDeviceService.js +0 -2
  78. package/dist/device/cloud/interfaces/IDevicesService.d.ts +0 -9
  79. package/dist/device/cloud/interfaces/IDevicesService.js +0 -2
  80. package/dist/device/cloud/interfaces/IHubService.d.ts +0 -5
  81. package/dist/device/cloud/interfaces/IHubService.js +0 -2
  82. package/dist/device/cloud/interfaces/IRawDataTransformer.d.ts +0 -4
  83. package/dist/device/cloud/interfaces/IRawDataTransformer.js +0 -2
  84. package/dist/device/cloud/interfaces/IRawDevice.d.ts +0 -17
  85. package/dist/device/cloud/interfaces/IRawDevice.js +0 -11
  86. package/dist/device/cloud/interfaces/index.d.ts +0 -5
  87. package/dist/device/cloud/interfaces/index.js +0 -21
  88. package/dist/device/cloud/services/CloudDevice.service.d.ts +0 -5
  89. package/dist/device/cloud/services/CloudDevice.service.js +0 -9
  90. package/dist/device/cloud/services/Connection.service.d.ts +0 -8
  91. package/dist/device/cloud/services/Connection.service.js +0 -6
  92. package/dist/device/cloud/services/Device.service.d.ts +0 -39
  93. package/dist/device/cloud/services/Device.service.js +0 -9
  94. package/dist/device/cloud/services/DeviceCloudService.d.ts +0 -42
  95. package/dist/device/cloud/services/DeviceCloudService.js +0 -59
  96. package/dist/device/cloud/services/DeviceHub.service.d.ts +0 -3
  97. package/dist/device/cloud/services/DeviceHub.service.js +0 -6
  98. package/dist/device/cloud/services/Hub.service.d.ts +0 -25
  99. package/dist/device/cloud/services/Hub.service.js +0 -9
  100. package/dist/device/cloud/services/SmartThingsDeviceService.d.ts +0 -38
  101. package/dist/device/cloud/services/SmartThingsDeviceService.js +0 -52
  102. package/dist/device/cloud/services/index.d.ts +0 -2
  103. package/dist/device/cloud/services/index.js +0 -18
  104. package/dist/device/cloud/types.d.ts +0 -52
  105. package/dist/device/cloud/types.js +0 -15
  106. package/dist/device/index.d.ts +0 -4
  107. package/dist/device/index.js +0 -20
  108. package/dist/device/local/entities/AlertBuilder.d.ts +0 -87
  109. package/dist/device/local/entities/AlertBuilder.example.d.ts +0 -11
  110. package/dist/device/local/entities/AlertBuilder.example.js +0 -117
  111. package/dist/device/local/entities/AlertBuilder.js +0 -179
  112. package/dist/device/local/entities/IssueBuilder.d.ts +0 -109
  113. package/dist/device/local/entities/IssueBuilder.example.d.ts +0 -16
  114. package/dist/device/local/entities/IssueBuilder.example.js +0 -196
  115. package/dist/device/local/entities/IssueBuilder.js +0 -237
  116. package/dist/device/local/entities/index.d.ts +0 -2
  117. package/dist/device/local/entities/index.js +0 -7
  118. package/dist/device/local/events/EventHandler.d.ts +0 -11
  119. package/dist/device/local/events/EventHandler.js +0 -86
  120. package/dist/device/local/events/Events.d.ts +0 -54
  121. package/dist/device/local/events/Events.js +0 -57
  122. package/dist/device/local/events/index.d.ts +0 -2
  123. package/dist/device/local/events/index.js +0 -7
  124. package/dist/device/local/handler/EventHandler.d.ts +0 -7
  125. package/dist/device/local/handler/EventHandler.js +0 -44
  126. package/dist/device/local/interface.d.ts +0 -0
  127. package/dist/device/local/interface.js +0 -1
  128. package/dist/device/local/interfaces/IConnection.d.ts +0 -26
  129. package/dist/device/local/interfaces/IConnection.js +0 -14
  130. package/dist/device/local/interfaces/IDevice.d.ts +0 -68
  131. package/dist/device/local/interfaces/IDevice.js +0 -10
  132. package/dist/device/local/interfaces/IDtDevice.d.ts +0 -16
  133. package/dist/device/local/interfaces/IDtDevice.js +0 -2
  134. package/dist/device/local/interfaces/IHub.d.ts +0 -46
  135. package/dist/device/local/interfaces/IHub.js +0 -2
  136. package/dist/device/local/interfaces/IProperty.d.ts +0 -29
  137. package/dist/device/local/interfaces/IProperty.js +0 -2
  138. package/dist/device/local/interfaces/ISchedule.d.ts +0 -25
  139. package/dist/device/local/interfaces/ISchedule.js +0 -2
  140. package/dist/device/local/interfaces/index.d.ts +0 -3
  141. package/dist/device/local/interfaces/index.js +0 -19
  142. package/dist/device/local/models/Alert.model.d.ts +0 -28
  143. package/dist/device/local/models/Alert.model.js +0 -222
  144. package/dist/device/local/models/Issue.model.d.ts +0 -28
  145. package/dist/device/local/models/Issue.model.js +0 -260
  146. package/dist/device/local/repository/Alert.repository.d.ts +0 -106
  147. package/dist/device/local/repository/Alert.repository.js +0 -374
  148. package/dist/device/local/repository/Connection.repository.d.ts +0 -8
  149. package/dist/device/local/repository/Connection.repository.js +0 -92
  150. package/dist/device/local/repository/Device.repository.d.ts +0 -30
  151. package/dist/device/local/repository/Device.repository.js +0 -325
  152. package/dist/device/local/repository/Hub.repository.d.ts +0 -13
  153. package/dist/device/local/repository/Hub.repository.js +0 -139
  154. package/dist/device/local/repository/Issue.repository.d.ts +0 -113
  155. package/dist/device/local/repository/Issue.repository.js +0 -401
  156. package/dist/device/local/repository/Property.repository.d.ts +0 -8
  157. package/dist/device/local/repository/Property.repository.js +0 -95
  158. package/dist/device/local/repository/Schedule.repository.d.ts +0 -9
  159. package/dist/device/local/repository/Schedule.repository.js +0 -109
  160. package/dist/device/local/services/Alert.service.d.ts +0 -137
  161. package/dist/device/local/services/Alert.service.js +0 -475
  162. package/dist/device/local/services/AlertService.example.d.ts +0 -55
  163. package/dist/device/local/services/AlertService.example.js +0 -148
  164. package/dist/device/local/services/Connection.service.d.ts +0 -8
  165. package/dist/device/local/services/Connection.service.js +0 -32
  166. package/dist/device/local/services/Device.service.d.ts +0 -40
  167. package/dist/device/local/services/Device.service.js +0 -391
  168. package/dist/device/local/services/DeviceHub.service.d.ts +0 -11
  169. package/dist/device/local/services/DeviceHub.service.js +0 -40
  170. package/dist/device/local/services/Hub.service.d.ts +0 -12
  171. package/dist/device/local/services/Hub.service.js +0 -107
  172. package/dist/device/local/services/Issue.service.d.ts +0 -168
  173. package/dist/device/local/services/Issue.service.js +0 -642
  174. package/dist/device/local/services/IssueService.example.d.ts +0 -68
  175. package/dist/device/local/services/IssueService.example.js +0 -177
  176. package/dist/device/local/services/Property.service.d.ts +0 -8
  177. package/dist/device/local/services/Property.service.js +0 -36
  178. package/dist/device/local/services/Schedule.service.d.ts +0 -9
  179. package/dist/device/local/services/Schedule.service.js +0 -26
  180. package/dist/device/local/services/index.d.ts +0 -3
  181. package/dist/device/local/services/index.js +0 -19
  182. package/dist/pms/IPms.d.ts +0 -6
  183. package/dist/pms/IPms.js +0 -10
  184. package/dist/pms/index.d.ts +0 -1
  185. package/dist/pms/index.js +0 -18
  186. package/dist/pms/webhookQueue/examples/index.d.ts +0 -2
  187. package/dist/pms/webhookQueue/examples/index.js +0 -18
  188. package/dist/pms/webhookQueue/examples/pms-integration.d.ts +0 -65
  189. package/dist/pms/webhookQueue/examples/pms-integration.js +0 -254
  190. package/dist/pms/webhookQueue/examples/usage.d.ts +0 -7
  191. package/dist/pms/webhookQueue/examples/usage.js +0 -175
  192. package/dist/pms/webhookQueue/index.d.ts +0 -3
  193. package/dist/pms/webhookQueue/index.js +0 -20
  194. package/dist/pms/webhookQueue/interfaces/IWebhookQueue.d.ts +0 -33
  195. package/dist/pms/webhookQueue/interfaces/IWebhookQueue.js +0 -2
  196. package/dist/pms/webhookQueue/interfaces/IWebhookWorker.d.ts +0 -38
  197. package/dist/pms/webhookQueue/interfaces/IWebhookWorker.js +0 -2
  198. package/dist/pms/webhookQueue/interfaces/index.d.ts +0 -1
  199. package/dist/pms/webhookQueue/interfaces/index.js +0 -17
  200. package/dist/pms/webhookQueue/services/WebhookQueueFactory.d.ts +0 -38
  201. package/dist/pms/webhookQueue/services/WebhookQueueFactory.js +0 -131
  202. package/dist/pms/webhookQueue/services/WebhookQueueIntegration.d.ts +0 -70
  203. package/dist/pms/webhookQueue/services/WebhookQueueIntegration.js +0 -207
  204. package/dist/pms/webhookQueue/services/WebhookQueueService.d.ts +0 -45
  205. package/dist/pms/webhookQueue/services/WebhookQueueService.js +0 -270
  206. package/dist/pms/webhookQueue/services/WebhookWorker.d.ts +0 -37
  207. package/dist/pms/webhookQueue/services/WebhookWorker.js +0 -201
  208. package/dist/pms/webhookQueue/services/index.d.ts +0 -1
  209. package/dist/pms/webhookQueue/services/index.js +0 -17
  210. package/dist/pms/webhookQueue/types/index.d.ts +0 -1
  211. package/dist/pms/webhookQueue/types/index.js +0 -17
  212. package/dist/pms/webhookQueue/types/webhook.types.d.ts +0 -39
  213. package/dist/pms/webhookQueue/types/webhook.types.js +0 -2
  214. package/dist/property/IProperty.d.ts +0 -29
  215. package/dist/property/IProperty.js +0 -2
  216. package/dist/property/Property.repository.d.ts +0 -8
  217. package/dist/property/Property.repository.js +0 -109
  218. package/dist/property/Property.service.d.ts +0 -8
  219. package/dist/property/Property.service.js +0 -124
  220. package/dist/property/index.d.ts +0 -2
  221. package/dist/property/index.js +0 -18
  222. package/dist/queue/interfaces/IHttpRequestJob.d.ts +0 -9
  223. package/dist/queue/interfaces/IHttpRequestJob.js +0 -2
  224. package/dist/types/alert.types.d.ts +0 -57
  225. package/dist/types/alert.types.js +0 -22
  226. package/dist/types/config.types.d.ts +0 -19
  227. package/dist/types/config.types.js +0 -2
  228. package/dist/types/index.d.ts +0 -3
  229. package/dist/types/index.js +0 -19
  230. package/dist/types/issue.types.d.ts +0 -90
  231. package/dist/types/issue.types.js +0 -40
  232. package/dist/utils/http-utils.d.ts +0 -13
  233. package/dist/utils/http-utils.js +0 -117
@@ -25,37 +25,110 @@ class QueueUtils {
25
25
  .get(queueKey));
26
26
  }
27
27
  static getOrCreateWorker(queueKey, workers, processFunction, jobResults) {
28
- if (workers.has(queueKey))
29
- return;
28
+ if (workers.has(queueKey)) {
29
+ const existingWorker = workers.get(queueKey);
30
+ console.log(`[${new Date().toISOString()}] [getOrCreateWorker] Worker already exists for queue: ${queueKey}, checking if it's running...`);
31
+ // Check if worker is still connected/running
32
+ // If worker is closed or errored, recreate it
33
+ if (existingWorker && typeof existingWorker.isRunning === "function") {
34
+ const isRunning = existingWorker.isRunning();
35
+ console.log(`[${new Date().toISOString()}] [getOrCreateWorker] Existing worker running status: ${isRunning}`);
36
+ if (!isRunning) {
37
+ console.log(`[${new Date().toISOString()}] [getOrCreateWorker] Worker not running, closing and recreating...`);
38
+ try {
39
+ existingWorker.close();
40
+ }
41
+ catch (e) {
42
+ // Ignore errors when closing
43
+ }
44
+ workers.delete(queueKey);
45
+ // Continue to create new worker below
46
+ }
47
+ else {
48
+ return; // Worker is running, keep using it
49
+ }
50
+ }
51
+ else {
52
+ // Worker object exists but might be stale, try to use it
53
+ console.log(`[${new Date().toISOString()}] [getOrCreateWorker] Existing worker found but cannot verify status, keeping it`);
54
+ return;
55
+ }
56
+ }
57
+ console.log(`[${new Date().toISOString()}] [getOrCreateWorker] Creating new worker for queue: ${queueKey}`);
30
58
  const { Worker } = require("bullmq");
31
- const worker = new Worker(queueKey, processFunction, {
59
+ // Wrap the process function to catch any errors during execution
60
+ const wrappedProcessFunction = async (job) => {
61
+ const wrapperStartTime = Date.now();
62
+ console.log(`[${new Date().toISOString()}] [Worker Wrapper] Worker picked up job - JobId: ${job?.id}, QueueKey: ${queueKey}, JobName: ${job?.name}, Delay: ${job?.opts?.delay || 0}ms`);
63
+ try {
64
+ const result = await processFunction(job);
65
+ const processingTime = Date.now() - wrapperStartTime;
66
+ console.log(`[${new Date().toISOString()}] [Worker Wrapper] Job processed successfully - JobId: ${job?.id}, ProcessingTime: ${processingTime}ms, ResultType: ${typeof result}, HasResult: ${result !== undefined && result !== null}`);
67
+ return result;
68
+ }
69
+ catch (error) {
70
+ const processingTime = Date.now() - wrapperStartTime;
71
+ console.log(`[${new Date().toISOString()}] [Worker Wrapper] Error processing job - JobId: ${job?.id}, Error: ${error.message}, Stack: ${error.stack}, ProcessingTime: ${processingTime}ms`);
72
+ throw error;
73
+ }
74
+ };
75
+ const worker = new Worker(queueKey, wrappedProcessFunction, {
32
76
  connection: (0, redis_1.getRedisClient)(),
33
77
  concurrency: 1,
34
- removeOnComplete: true,
35
- removeOnFail: true,
78
+ removeOnComplete: { count: 100, age: 3600 }, // Keep completed jobs for debugging
79
+ removeOnFail: { count: 100, age: 3600 },
36
80
  lockDuration: 300000,
37
- stalledInterval: 60000,
81
+ stalledInterval: 30000, // Check for stalled jobs more frequently
38
82
  });
83
+ console.log(`[${new Date().toISOString()}] [getOrCreateWorker] Worker instance created for queue: ${queueKey}`);
39
84
  // Event handlers for job tracking
85
+ worker.on("active", (job) => {
86
+ console.log(`[${new Date().toISOString()}] [Worker Event] Job active - JobId: ${job.id}, QueueKey: ${queueKey}, JobName: ${job.name}, Data: ${JSON.stringify(job.data || {})}`);
87
+ });
88
+ worker.on("waiting", (jobId) => {
89
+ console.log(`[${new Date().toISOString()}] [Worker Event] Job waiting - JobId: ${jobId}, QueueKey: ${queueKey}`);
90
+ });
91
+ worker.on("delayed", (job) => {
92
+ console.log(`[${new Date().toISOString()}] [Worker Event] Job delayed - JobId: ${job.id}, QueueKey: ${queueKey}, Delay: ${job.opts?.delay || 0}ms`);
93
+ });
40
94
  worker.on("completed", (job) => {
95
+ console.log(`[${new Date().toISOString()}] [Worker Event] Job completed - JobId: ${job.id}, QueueKey: ${queueKey}, ReturnValueType: ${typeof job.returnvalue}, HasReturnValue: ${job.returnvalue !== undefined}`);
41
96
  (0, config_1.getConfig)().LOGGER.info(`HTTP request completed: ${job.id} [${queueKey}]`);
42
97
  const result = job.returnvalue;
43
- jobResults.set(job.id, {
98
+ const jobResult = {
44
99
  result,
45
100
  resolved: true,
46
101
  timestamp: Date.now(),
47
- });
102
+ };
103
+ console.log(`[${new Date().toISOString()}] [Worker Event] Storing job result - JobId: ${job.id}, ResultType: ${typeof result}, Resolved: true`);
104
+ jobResults.set(job.id, jobResult);
105
+ console.log(`[${new Date().toISOString()}] [Worker Event] Job result stored in jobResults - JobId: ${job.id}, StoredResult: ${JSON.stringify(jobResult)}`);
48
106
  });
49
107
  worker.on("failed", (job, err) => {
108
+ console.log(`[${new Date().toISOString()}] [Worker Event] Job failed - JobId: ${job?.id}, QueueKey: ${queueKey}, Error: ${err.message}`);
50
109
  (0, config_1.getConfig)().LOGGER.error(`HTTP request failed: ${job?.id} [${queueKey}], Error: ${err.message}`);
51
110
  jobResults.set(job.id, {
52
111
  error: err.message,
53
112
  resolved: true,
54
113
  timestamp: Date.now(),
55
114
  });
115
+ console.log(`[${new Date().toISOString()}] [Worker Event] Job error stored in jobResults - JobId: ${job?.id}`);
116
+ });
117
+ worker.on("error", (err) => {
118
+ console.log(`[${new Date().toISOString()}] [Worker Event] Worker error - QueueKey: ${queueKey}, Error: ${err.message}, Stack: ${err.stack}`);
119
+ (0, config_1.getConfig)().LOGGER.error(`Worker error for ${queueKey}: ${err.message}`);
120
+ });
121
+ worker.on("ready", () => {
122
+ console.log(`[${new Date().toISOString()}] [Worker Event] Worker ready - QueueKey: ${queueKey}`);
123
+ });
124
+ worker.on("closing", () => {
125
+ console.log(`[${new Date().toISOString()}] [Worker Event] Worker closing - QueueKey: ${queueKey}`);
126
+ });
127
+ worker.on("closed", () => {
128
+ console.log(`[${new Date().toISOString()}] [Worker Event] Worker closed - QueueKey: ${queueKey}`);
56
129
  });
57
- worker.on("error", (err) => (0, config_1.getConfig)().LOGGER.error(`Worker error for ${queueKey}: ${err.message}`));
58
130
  workers.set(queueKey, worker);
131
+ console.log(`[${new Date().toISOString()}] [getOrCreateWorker] Worker initialized and stored for queue: ${queueKey}`);
59
132
  (0, config_1.getConfig)().LOGGER.info(`Worker initialized for queue: ${queueKey}`);
60
133
  }
61
134
  static async waitForRateLimitExpiry(connectionId, provider, rateLimitConfigs) {
@@ -63,6 +136,7 @@ class QueueUtils {
63
136
  const config = rateLimitConfigs.get(provider);
64
137
  if (!config)
65
138
  return;
139
+ console.log(`[${new Date().toISOString()}] [waitForRateLimitExpiry] Starting wait for ${provider} [${connectionId}]`);
66
140
  while (true) {
67
141
  const timestamps = await rateLimit_utils_1.RateLimitUtils.getRawRequestTimestamps(key);
68
142
  const now = Date.now();
@@ -70,18 +144,21 @@ class QueueUtils {
70
144
  const recentRequests = timestamps.filter((t) => t > windowStart);
71
145
  if (recentRequests.length < config.maxRequests) {
72
146
  // Rate limit not exceeded, we can proceed
147
+ console.log(`[${new Date().toISOString()}] [waitForRateLimitExpiry] Rate limit cleared, proceeding`);
73
148
  break;
74
149
  }
75
150
  // Calculate when the earliest request will expire
76
151
  const earliestRequest = recentRequests[0];
77
152
  const nextAvailableTime = earliestRequest + config.windowMs;
78
153
  const delay = Math.max(nextAvailableTime - now, 1000); // At least 1 second
154
+ console.log(`[${new Date().toISOString()}] [waitForRateLimitExpiry] Rate limit exceeded, waiting ${delay}ms. Requests in window: ${recentRequests.length}/${config.maxRequests}`);
79
155
  (0, config_1.getConfig)().LOGGER.info(`Rate limit exceeded for ${provider} [${connectionId}]. Waiting ${delay}ms until next allowed request. Current requests in window: ${recentRequests.length}/${config.maxRequests}`);
80
156
  // Wait for the calculated delay
81
157
  await new Promise((resolve) => setTimeout(resolve, delay));
82
158
  }
83
159
  }
84
160
  static async executeHttpRequest(url, method, options, connectionId, provider) {
161
+ console.log(`[${new Date().toISOString()}] [executeHttpRequest] Starting HTTP request - ${method} ${url} -> ${provider} [${connectionId}]`);
85
162
  (0, config_1.getConfig)().LOGGER.info(`Executing: ${method} ${url} -> ${provider} [${connectionId}]`);
86
163
  try {
87
164
  // Record the request first
@@ -95,11 +172,13 @@ class QueueUtils {
95
172
  ...(options.body && { data: options.body }),
96
173
  ...(options.params && { params: options.params }),
97
174
  });
175
+ console.log(`[${new Date().toISOString()}] [executeHttpRequest] HTTP request successful - ${method} ${url} for ${provider} [${connectionId}]`);
98
176
  (0, config_1.getConfig)().LOGGER.info(`HTTP request successful: ${method} ${url} for ${provider} [${connectionId}]`);
99
177
  // Return only the response data
100
178
  return response.data;
101
179
  }
102
180
  catch (error) {
181
+ console.log(`[${new Date().toISOString()}] [executeHttpRequest] HTTP request failed - ${method} ${url} for ${provider} [${connectionId}], Error: ${error.message}`);
103
182
  (0, config_1.getConfig)().LOGGER.error(`HTTP request failed: ${error.message}`);
104
183
  await (0, dt_audit_library_1.publishAudit)({
105
184
  eventType: "http.request.error",
@@ -119,62 +198,77 @@ class QueueUtils {
119
198
  }
120
199
  }
121
200
  static async addJobToQueue(queueKey, jobData, delay, queues) {
201
+ console.log(`[${new Date().toISOString()}] [addJobToQueue] Adding job to BullMQ queue - QueueKey: ${queueKey}, Delay: ${delay}ms`);
122
202
  const queue = this.getOrCreateQueue(queueKey, queues);
123
203
  const job = await queue.add("http-request", jobData, {
124
204
  delay,
125
205
  attempts: 1,
126
- removeOnComplete: { age: 300, count: 1 },
127
- removeOnFail: { age: 300, count: 1 },
206
+ removeOnComplete: { age: 300, count: 100 },
207
+ removeOnFail: { age: 300, count: 100 },
128
208
  });
209
+ console.log(`[${new Date().toISOString()}] [addJobToQueue] Job added to BullMQ - JobId: ${job.id}, QueueKey: ${queueKey}, Delay: ${delay}ms`);
210
+ // Log queue state for debugging
211
+ try {
212
+ const [waiting, delayed, active] = await Promise.all([
213
+ queue.getWaitingCount(),
214
+ queue.getDelayedCount(),
215
+ queue.getActiveCount(),
216
+ ]);
217
+ console.log(`[${new Date().toISOString()}] [addJobToQueue] Queue state - QueueKey: ${queueKey}, Waiting: ${waiting}, Delayed: ${delayed}, Active: ${active}`);
218
+ }
219
+ catch (e) {
220
+ // Ignore errors getting queue state
221
+ }
129
222
  return job.id;
130
223
  }
131
- static async waitForJobCompletion(jobId, queueKey, jobResults, jobDelay = 0) {
132
- return new Promise((resolve, reject) => {
133
- let timeoutId;
134
- let backupTimeoutId;
135
- let checkCount = 0;
136
- // Calculate timeout: delay + execution buffer
137
- // Buffer includes: HTTP request timeout (60s) + rate limit wait + processing overhead
138
- const baseBuffer = queueKey.toLowerCase().includes("cloudbeds")
139
- ? 180000
140
- : 90000;
141
- const totalTimeout = jobDelay + baseBuffer;
142
- // Calculate max checks based on total timeout
143
- // Use 50ms for first 10 checks, then 100ms for remaining
144
- // Max checks should cover the total timeout
145
- const maxChecks = Math.ceil((totalTimeout - 500) / 100 + 10);
146
- (0, config_1.getConfig)().LOGGER.info(`Waiting for job ${jobId}: delay=${jobDelay}ms, totalTimeout=${totalTimeout}ms, maxChecks=${maxChecks}`);
147
- const checkJob = async () => {
148
- if (++checkCount >= maxChecks) {
149
- clearTimeout(timeoutId);
150
- clearTimeout(backupTimeoutId);
151
- return reject(new Error(`Job timeout: Request took too long (waited ${totalTimeout}ms, delay was ${jobDelay}ms)`));
152
- }
224
+ static async waitForJobCompletion(jobId, queueKey, jobDelay = 0, windowMs = 60000) {
225
+ // Simple: delay (wait) + windowMs (execute) + HTTP timeout buffer
226
+ const httpTimeout = 60000;
227
+ const totalTimeout = jobDelay + windowMs + httpTimeout;
228
+ console.log(`[${new Date().toISOString()}] [waitForJobCompletion] Waiting for job ${jobId} - delay: ${jobDelay}ms, timeout: ${totalTimeout}ms`);
229
+ const startTime = Date.now();
230
+ const { Queue } = require("bullmq");
231
+ const queue = new Queue(queueKey, {
232
+ connection: (0, redis_1.getRedisClient)(),
233
+ });
234
+ return new Promise(async (resolve, reject) => {
235
+ const checkInterval = setInterval(async () => {
153
236
  try {
154
- const memoryResult = jobResults.get(jobId);
155
- if (memoryResult?.resolved) {
156
- clearTimeout(timeoutId);
157
- clearTimeout(backupTimeoutId);
158
- return memoryResult.result !== undefined
159
- ? resolve(memoryResult.result)
160
- : reject(new Error(memoryResult.error || "Unknown error"));
237
+ const job = await queue.getJob(jobId);
238
+ if (!job) {
239
+ const elapsed = Date.now() - startTime;
240
+ if (elapsed > totalTimeout) {
241
+ clearInterval(checkInterval);
242
+ await queue.close();
243
+ return reject(new Error(`Job ${jobId} not found and timeout exceeded`));
244
+ }
245
+ return; // Job not found yet, keep checking
246
+ }
247
+ const state = await job.getState();
248
+ if (state === "completed") {
249
+ console.log(`[${new Date().toISOString()}] [waitForJobCompletion] Job ${jobId} completed`);
250
+ clearInterval(checkInterval);
251
+ const result = job.returnvalue;
252
+ await queue.close();
253
+ return resolve(result);
254
+ }
255
+ if (state === "failed") {
256
+ console.log(`[${new Date().toISOString()}] [waitForJobCompletion] Job ${jobId} failed: ${job.failedReason}`);
257
+ clearInterval(checkInterval);
258
+ await queue.close();
259
+ return reject(new Error(job.failedReason || "Job failed"));
161
260
  }
162
- // Continue checking
163
- timeoutId = setTimeout(checkJob, checkCount < 10 ? 50 : 100);
164
261
  }
165
262
  catch (error) {
166
- clearTimeout(timeoutId);
167
- clearTimeout(backupTimeoutId);
168
- reject(new Error(`Error checking job: ${error.message}`));
263
+ clearInterval(checkInterval);
264
+ await queue.close();
265
+ reject(error);
169
266
  }
170
- };
171
- checkJob();
172
- // const waitTime = queueKey.toLowerCase().includes("cloudbeds")
173
- // ? 180000
174
- // : 60000;
175
- // Backup timeout with the calculated total timeout
176
- backupTimeoutId = setTimeout(() => {
177
- clearTimeout(timeoutId);
267
+ }, 500); // Check every 500ms
268
+ // Timeout
269
+ setTimeout(() => {
270
+ clearInterval(checkInterval);
271
+ queue.close();
178
272
  reject(new Error(`Request timeout: Maximum wait time exceeded (${totalTimeout}ms). Job delay was ${jobDelay}ms.`));
179
273
  }, totalTimeout);
180
274
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dt-common-device",
3
- "version": "9.2.4",
3
+ "version": "9.2.6",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -1,7 +0,0 @@
1
- export declare class AdminRepository {
2
- private readonly axiosInstance;
3
- private readonly deviceRepository;
4
- private readonly postgres;
5
- constructor();
6
- getZonesByAccessGroupIds(accessGroupIds: string[]): Promise<any[]>;
7
- }
@@ -1,182 +0,0 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
19
- function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
20
- var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
21
- var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
22
- var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
23
- var _, done = false;
24
- for (var i = decorators.length - 1; i >= 0; i--) {
25
- var context = {};
26
- for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
27
- for (var p in contextIn.access) context.access[p] = contextIn.access[p];
28
- context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
29
- var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
30
- if (kind === "accessor") {
31
- if (result === void 0) continue;
32
- if (result === null || typeof result !== "object") throw new TypeError("Object expected");
33
- if (_ = accept(result.get)) descriptor.get = _;
34
- if (_ = accept(result.set)) descriptor.set = _;
35
- if (_ = accept(result.init)) initializers.unshift(_);
36
- }
37
- else if (_ = accept(result)) {
38
- if (kind === "field") initializers.unshift(_);
39
- else descriptor[key] = _;
40
- }
41
- }
42
- if (target) Object.defineProperty(target, contextIn.name, descriptor);
43
- done = true;
44
- };
45
- var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
46
- var useValue = arguments.length > 2;
47
- for (var i = 0; i < initializers.length; i++) {
48
- value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
49
- }
50
- return useValue ? value : void 0;
51
- };
52
- var __importStar = (this && this.__importStar) || (function () {
53
- var ownKeys = function(o) {
54
- ownKeys = Object.getOwnPropertyNames || function (o) {
55
- var ar = [];
56
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
57
- return ar;
58
- };
59
- return ownKeys(o);
60
- };
61
- return function (mod) {
62
- if (mod && mod.__esModule) return mod;
63
- var result = {};
64
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
65
- __setModuleDefault(result, mod);
66
- return result;
67
- };
68
- })();
69
- var __setFunctionName = (this && this.__setFunctionName) || function (f, name, prefix) {
70
- if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
71
- return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
72
- };
73
- Object.defineProperty(exports, "__esModule", { value: true });
74
- exports.AdminRepository = void 0;
75
- const typedi_1 = __importStar(require("typedi"));
76
- const utils_1 = require("../utils");
77
- const Device_repository_1 = require("../device/local/repository/Device.repository");
78
- const db_1 = require("../db/db");
79
- const interfaces_1 = require("../device/cloud/interfaces");
80
- let AdminRepository = (() => {
81
- let _classDecorators = [(0, typedi_1.Service)()];
82
- let _classDescriptor;
83
- let _classExtraInitializers = [];
84
- let _classThis;
85
- var AdminRepository = _classThis = class {
86
- constructor() {
87
- this.axiosInstance = (0, utils_1.getCloudServiceAxiosInstance)();
88
- this.deviceRepository = typedi_1.default.get(Device_repository_1.DeviceRepository);
89
- this.postgres = (0, db_1.getPostgresClient)();
90
- }
91
- async getZonesByAccessGroupIds(accessGroupIds) {
92
- const result = await this.postgres.query(`SELECT "zc".*, "z"."id", "z"."name"
93
- FROM "dt_zones_collection_map" "zc"
94
- INNER JOIN "dt_zones" "z" ON "zc"."zoneId" = "z"."id"
95
- WHERE "zc"."collectionId" = ANY($1)`, [accessGroupIds]);
96
- const response = result.rows;
97
- const _zones = (nestedZones, allzones = []) => {
98
- nestedZones.forEach((z) => {
99
- const onlyZone = { ...z };
100
- delete onlyZone.childZones;
101
- allzones.push(onlyZone);
102
- if (!Array.isArray(z.childZones)) {
103
- if (z.childZones.id)
104
- z.childZones = [z.childZones];
105
- }
106
- if (z.childZones.length) {
107
- _zones(z.childZones, allzones);
108
- }
109
- });
110
- return allzones.map((e) => e.id);
111
- };
112
- // const zones = _zones(response);
113
- const zoneIds = response.map((el) => el.id);
114
- const collectionZone = [];
115
- for (let i = 0; i < response.length; i++) {
116
- let zoneIds = [];
117
- const zones = await this.axiosInstance.get(`/zones/child?zoneId=${response[i].zoneId}`);
118
- zoneIds.push(response[i].zoneId);
119
- if (zones.childZones?.length > 0) {
120
- const nestedZoneIds = new Set(_zones(zones.childZones));
121
- zoneIds = [...zoneIds, ...nestedZoneIds];
122
- }
123
- if (collectionZone.length == 0) {
124
- const obj = {
125
- collectionId: response[i].collectionId,
126
- zoneIds,
127
- };
128
- collectionZone.push(obj);
129
- }
130
- else {
131
- const obj = collectionZone.find((e) => e.collectionId == response[i].collectionId);
132
- if (obj) {
133
- obj.zoneIds = [...obj.zoneIds, ...zoneIds];
134
- }
135
- else {
136
- collectionZone.push({
137
- collectionId: response[i].collectionId,
138
- zoneIds,
139
- });
140
- }
141
- }
142
- }
143
- let _zoneIds = collectionZone.flatMap((e) => {
144
- return e.zoneIds.map((z) => z);
145
- });
146
- if (_zoneIds.length === 0)
147
- return [];
148
- const deviecDetail = await this.deviceRepository.queryDevices({
149
- zoneIds: _zoneIds,
150
- excludeDeviceType: interfaces_1.DeviceType.HUB
151
- });
152
- const _collectionZone = collectionZone.map((e) => {
153
- const zones = e.zoneIds;
154
- let devices = [];
155
- zones.forEach((element) => {
156
- const device = deviecDetail.filter((d) => d.zoneId == element);
157
- // Add collectionId to each device
158
- device.forEach((dev) => {
159
- dev.collectionId = e.collectionId;
160
- });
161
- const _devices = devices.concat(device);
162
- devices = _devices;
163
- });
164
- e.devices = devices;
165
- e.parentZone = response;
166
- return e;
167
- });
168
- const collectionZoneDevices = Array.from(new Set(_collectionZone));
169
- return collectionZoneDevices;
170
- }
171
- };
172
- __setFunctionName(_classThis, "AdminRepository");
173
- (() => {
174
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
175
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
176
- AdminRepository = _classThis = _classDescriptor.value;
177
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
178
- __runInitializers(_classThis, _classExtraInitializers);
179
- })();
180
- return AdminRepository = _classThis;
181
- })();
182
- exports.AdminRepository = AdminRepository;
@@ -1,5 +0,0 @@
1
- export declare class AdminService {
2
- private readonly adminRepository;
3
- constructor();
4
- getZonesByAccessGroupIds(accessGroupIds: string[]): Promise<any[]>;
5
- }
@@ -1,17 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.AdminService = void 0;
7
- const typedi_1 = __importDefault(require("typedi"));
8
- const Admin_repository_1 = require("./Admin.repository");
9
- class AdminService {
10
- constructor() {
11
- this.adminRepository = typedi_1.default.get(Admin_repository_1.AdminRepository);
12
- }
13
- async getZonesByAccessGroupIds(accessGroupIds) {
14
- return await this.adminRepository.getZonesByAccessGroupIds(accessGroupIds);
15
- }
16
- }
17
- exports.AdminService = AdminService;
@@ -1 +0,0 @@
1
- export * from "./Admin.service";
@@ -1,17 +0,0 @@
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("./Admin.service"), exports);
@@ -1,16 +0,0 @@
1
- export interface AuditProperties {
2
- resource: string;
3
- propertyId: string;
4
- propertyName?: string;
5
- userId?: string;
6
- userName?: string;
7
- deviceId?: string;
8
- deviceName?: string;
9
- zoneId?: string;
10
- zoneName?: string;
11
- accessGroupId?: string;
12
- accessGroupName?: string;
13
- scheduleId?: string;
14
- scheduleName?: string;
15
- [key: string]: any;
16
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,14 +0,0 @@
1
- export interface ICronicle {
2
- name: string;
3
- cronJobId: string;
4
- apiUrl: string;
5
- method: "POST";
6
- target: string;
7
- schedule: {
8
- minutes?: string;
9
- hours?: string;
10
- dom?: string;
11
- month?: string;
12
- dow?: string;
13
- };
14
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,4 +0,0 @@
1
- import { ICronicle } from "./IChronicle.interface";
2
- export declare class ChronicleClass {
3
- registerJob(payload: ICronicle): Promise<void>;
4
- }
@@ -1,44 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ChronicleClass = void 0;
7
- const config_1 = require("../config/config");
8
- const axios_1 = __importDefault(require("axios"));
9
- class ChronicleClass {
10
- async registerJob(payload) {
11
- const { name, apiUrl, method, schedule, cronJobId, target } = payload;
12
- try {
13
- const cronicleEndpoint = process.env.CRONICLE_ENDPOINT;
14
- const cronicleApiKey = process.env.CRONICLE_API_KEY;
15
- await axios_1.default.post(`${cronicleEndpoint}/create_event`, {
16
- id: cronJobId,
17
- title: name,
18
- category: "general",
19
- plugin: "urlplug",
20
- timeZone: "UTC",
21
- enabled: 1,
22
- params: {
23
- url: apiUrl,
24
- method,
25
- headers: `dt-cronicle-api-key: ${cronicleApiKey}`,
26
- },
27
- data: payload,
28
- target: target,
29
- timing: {
30
- minutes: schedule.minutes ?? "0",
31
- hours: schedule.hours ?? "*",
32
- dom: schedule.dom ?? "*",
33
- month: schedule.month ?? "*",
34
- dow: schedule.dow ?? "*",
35
- },
36
- });
37
- (0, config_1.getConfig)().LOGGER.info(`Successfully registered chronicle job: ${name} with ID: ${cronJobId}`);
38
- }
39
- catch (error) {
40
- (0, config_1.getConfig)().LOGGER.error(`Failed to create device: ${error.message}`);
41
- }
42
- }
43
- }
44
- exports.ChronicleClass = ChronicleClass;
@@ -1,8 +0,0 @@
1
- import { IConnection } from "./IConnection";
2
- export declare class ConnectionRepository {
3
- private readonly pool;
4
- constructor();
5
- createConnection(data: Partial<IConnection>): Promise<IConnection>;
6
- getConnectionById(connectionId: string): Promise<IConnection>;
7
- updateConnection(connectionId: string, data: Partial<IConnection>): Promise<any>;
8
- }