@fastybird/smart-panel-backend 1.1.0-alpha.1 → 1.1.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/dist/app.module.js +7 -0
  2. package/dist/app.module.js.map +1 -1
  3. package/dist/common/filters/conflict-exception.filter.d.ts +6 -0
  4. package/dist/common/filters/conflict-exception.filter.js +59 -0
  5. package/dist/common/filters/conflict-exception.filter.js.map +1 -0
  6. package/dist/common/filters/global-error.filter.js +1 -4
  7. package/dist/common/filters/global-error.filter.js.map +1 -1
  8. package/dist/common/filters/global-filters.d.ts +3 -0
  9. package/dist/common/filters/global-filters.js +22 -0
  10. package/dist/common/filters/global-filters.js.map +1 -0
  11. package/dist/common/filters/unprocessable-entity-exception.filter.d.ts +1 -0
  12. package/dist/common/filters/unprocessable-entity-exception.filter.js +15 -3
  13. package/dist/common/filters/unprocessable-entity-exception.filter.js.map +1 -1
  14. package/dist/common/utils/transform.utils.js +3 -0
  15. package/dist/common/utils/transform.utils.js.map +1 -1
  16. package/dist/main.js +2 -7
  17. package/dist/main.js.map +1 -1
  18. package/dist/modules/devices/controllers/channels.properties.controller.js +16 -4
  19. package/dist/modules/devices/controllers/channels.properties.controller.js.map +1 -1
  20. package/dist/modules/devices/controllers/devices.channels.properties.controller.js +16 -4
  21. package/dist/modules/devices/controllers/devices.channels.properties.controller.js.map +1 -1
  22. package/dist/modules/devices/devices.module.js +12 -0
  23. package/dist/modules/devices/devices.module.js.map +1 -1
  24. package/dist/modules/devices/services/channels.properties.service.d.ts +27 -3
  25. package/dist/modules/devices/services/channels.properties.service.js +304 -28
  26. package/dist/modules/devices/services/channels.properties.service.js.map +1 -1
  27. package/dist/modules/devices/services/channels.service.js +42 -38
  28. package/dist/modules/devices/services/channels.service.js.map +1 -1
  29. package/dist/modules/devices/services/command-latency-trace-collector.service.d.ts +101 -0
  30. package/dist/modules/devices/services/command-latency-trace-collector.service.js +451 -0
  31. package/dist/modules/devices/services/command-latency-trace-collector.service.js.map +1 -0
  32. package/dist/modules/devices/services/device-structure-lock.service.d.ts +10 -2
  33. package/dist/modules/devices/services/device-structure-lock.service.js +86 -7
  34. package/dist/modules/devices/services/device-structure-lock.service.js.map +1 -1
  35. package/dist/modules/devices/services/devices.service.js +37 -33
  36. package/dist/modules/devices/services/devices.service.js.map +1 -1
  37. package/dist/modules/devices/services/module-reset.service.d.ts +3 -1
  38. package/dist/modules/devices/services/module-reset.service.js +21 -16
  39. package/dist/modules/devices/services/module-reset.service.js.map +1 -1
  40. package/dist/modules/devices/services/property-command-dispatch.service.d.ts +45 -0
  41. package/dist/modules/devices/services/property-command-dispatch.service.js +227 -0
  42. package/dist/modules/devices/services/property-command-dispatch.service.js.map +1 -0
  43. package/dist/modules/devices/services/property-command-window.service.d.ts +71 -0
  44. package/dist/modules/devices/services/property-command-window.service.js +204 -0
  45. package/dist/modules/devices/services/property-command-window.service.js.map +1 -0
  46. package/dist/modules/devices/services/property-command.service.d.ts +20 -3
  47. package/dist/modules/devices/services/property-command.service.js +56 -10
  48. package/dist/modules/devices/services/property-command.service.js.map +1 -1
  49. package/dist/modules/devices/services/property-state-coordinator.service.d.ts +4 -0
  50. package/dist/modules/devices/services/property-state-coordinator.service.js +35 -0
  51. package/dist/modules/devices/services/property-state-coordinator.service.js.map +1 -0
  52. package/dist/modules/devices/services/property-value.service.d.ts +1 -0
  53. package/dist/modules/devices/services/property-value.service.js +4 -0
  54. package/dist/modules/devices/services/property-value.service.js.map +1 -1
  55. package/dist/modules/platform/services/platform.service.d.ts +13 -4
  56. package/dist/modules/platform/services/platform.service.js +57 -35
  57. package/dist/modules/platform/services/platform.service.js.map +1 -1
  58. package/dist/modules/remote-access/dto/update-config.dto.js +5 -0
  59. package/dist/modules/remote-access/dto/update-config.dto.js.map +1 -1
  60. package/dist/modules/remote-access/validators/is-remote-access-url.validator.js +5 -2
  61. package/dist/modules/remote-access/validators/is-remote-access-url.validator.js.map +1 -1
  62. package/dist/modules/system/services/privileged-worker.service.d.ts +10 -0
  63. package/dist/modules/system/services/privileged-worker.service.js +137 -11
  64. package/dist/modules/system/services/privileged-worker.service.js.map +1 -1
  65. package/dist/modules/websocket/gateway/websocket.gateway.d.ts +4 -1
  66. package/dist/modules/websocket/gateway/websocket.gateway.js +28 -5
  67. package/dist/modules/websocket/gateway/websocket.gateway.js.map +1 -1
  68. package/dist/modules/websocket/services/command-acknowledgement-trace.service.d.ts +143 -0
  69. package/dist/modules/websocket/services/command-acknowledgement-trace.service.js +523 -0
  70. package/dist/modules/websocket/services/command-acknowledgement-trace.service.js.map +1 -0
  71. package/dist/modules/websocket/websocket.module.js +9 -1
  72. package/dist/modules/websocket/websocket.module.js.map +1 -1
  73. package/dist/plugins/devices-home-assistant/services/home-assistant.ws.service.js +2 -1
  74. package/dist/plugins/devices-home-assistant/services/home-assistant.ws.service.js.map +1 -1
  75. package/dist/plugins/devices-home-assistant/services/state-changed.event.service.js +2 -3
  76. package/dist/plugins/devices-home-assistant/services/state-changed.event.service.js.map +1 -1
  77. package/dist/plugins/devices-homekit/listeners/homekit-event.listener.js +6 -1
  78. package/dist/plugins/devices-homekit/listeners/homekit-event.listener.js.map +1 -1
  79. package/dist/plugins/devices-homekit/mappers/base.mapper.js +27 -4
  80. package/dist/plugins/devices-homekit/mappers/base.mapper.js.map +1 -1
  81. package/dist/plugins/devices-homekit/mappers/homekit-mapper.interface.d.ts +8 -0
  82. package/dist/plugins/devices-homekit/mappers/thermostat-coordinator.d.ts +7 -0
  83. package/dist/plugins/devices-homekit/mappers/thermostat-coordinator.js +84 -73
  84. package/dist/plugins/devices-homekit/mappers/thermostat-coordinator.js.map +1 -1
  85. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.d.ts +20 -1
  86. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js +361 -119
  87. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js.map +1 -1
  88. package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.d.ts +13 -1
  89. package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.js +109 -10
  90. package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.js.map +1 -1
  91. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.js +8 -11
  92. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.js.map +1 -1
  93. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.js +2 -0
  94. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.js.map +1 -1
  95. package/dist/plugins/devices-shelly-ng/mappings/mapping-loader.service.js +4 -0
  96. package/dist/plugins/devices-shelly-ng/mappings/mapping-loader.service.js.map +1 -1
  97. package/dist/plugins/devices-shelly-ng/services/device-manager.service.js +5 -0
  98. package/dist/plugins/devices-shelly-ng/services/device-manager.service.js.map +1 -1
  99. package/dist/plugins/devices-shelly-ng/services/poll-placement-diagnostics.service.d.ts +29 -0
  100. package/dist/plugins/devices-shelly-ng/services/poll-placement-diagnostics.service.js +233 -0
  101. package/dist/plugins/devices-shelly-ng/services/poll-placement-diagnostics.service.js.map +1 -0
  102. package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.d.ts +12 -2
  103. package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js +81 -27
  104. package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js.map +1 -1
  105. package/dist/plugins/devices-shelly-ng/services/shelly-ws-server.service.d.ts +0 -1
  106. package/dist/plugins/devices-shelly-ng/services/shelly-ws-server.service.js +5 -12
  107. package/dist/plugins/devices-shelly-ng/services/shelly-ws-server.service.js.map +1 -1
  108. package/dist/plugins/devices-shelly-ng/utils/transform.utils.d.ts +2 -0
  109. package/dist/plugins/devices-shelly-ng/utils/transform.utils.js +14 -1
  110. package/dist/plugins/devices-shelly-ng/utils/transform.utils.js.map +1 -1
  111. package/dist/plugins/remote-access-cloudflare-tunnel/controllers/setup.controller.d.ts +17 -0
  112. package/dist/plugins/remote-access-cloudflare-tunnel/controllers/setup.controller.js +147 -0
  113. package/dist/plugins/remote-access-cloudflare-tunnel/controllers/setup.controller.js.map +1 -0
  114. package/dist/plugins/remote-access-cloudflare-tunnel/controllers/status.controller.d.ts +15 -0
  115. package/dist/plugins/remote-access-cloudflare-tunnel/controllers/status.controller.js +98 -0
  116. package/dist/plugins/remote-access-cloudflare-tunnel/controllers/status.controller.js.map +1 -0
  117. package/dist/plugins/remote-access-cloudflare-tunnel/dto/update-config.dto.d.ts +9 -0
  118. package/dist/plugins/remote-access-cloudflare-tunnel/dto/update-config.dto.js +94 -0
  119. package/dist/plugins/remote-access-cloudflare-tunnel/dto/update-config.dto.js.map +1 -0
  120. package/dist/plugins/remote-access-cloudflare-tunnel/models/config.model.d.ts +9 -0
  121. package/dist/plugins/remote-access-cloudflare-tunnel/models/config.model.js +92 -0
  122. package/dist/plugins/remote-access-cloudflare-tunnel/models/config.model.js.map +1 -0
  123. package/dist/plugins/remote-access-cloudflare-tunnel/models/install.model.d.ts +7 -0
  124. package/dist/plugins/remote-access-cloudflare-tunnel/models/install.model.js +48 -0
  125. package/dist/plugins/remote-access-cloudflare-tunnel/models/install.model.js.map +1 -0
  126. package/dist/plugins/remote-access-cloudflare-tunnel/models/status.model.d.ts +42 -0
  127. package/dist/plugins/remote-access-cloudflare-tunnel/models/status.model.js +352 -0
  128. package/dist/plugins/remote-access-cloudflare-tunnel/models/status.model.js.map +1 -0
  129. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.constants.d.ts +24 -0
  130. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.constants.js +27 -0
  131. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.constants.js.map +1 -0
  132. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.exceptions.d.ts +8 -0
  133. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.exceptions.js +19 -0
  134. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.exceptions.js.map +1 -0
  135. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.openapi.d.ts +4 -0
  136. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.openapi.js +20 -0
  137. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.openapi.js.map +1 -0
  138. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.plugin.d.ts +21 -0
  139. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.plugin.js +135 -0
  140. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.plugin.js.map +1 -0
  141. package/dist/plugins/remote-access-cloudflare-tunnel/scripts/cloudflared-setup.sh +185 -0
  142. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-managed.service.d.ts +82 -0
  143. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-managed.service.js +507 -0
  144. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-managed.service.js.map +1 -0
  145. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-provider.service.d.ts +10 -0
  146. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-provider.service.js +37 -0
  147. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-provider.service.js.map +1 -0
  148. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-setup.service.d.ts +38 -0
  149. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-setup.service.js +147 -0
  150. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-setup.service.js.map +1 -0
  151. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-cli.service.d.ts +15 -0
  152. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-cli.service.js +67 -0
  153. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-cli.service.js.map +1 -0
  154. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-metrics.service.d.ts +8 -0
  155. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-metrics.service.js +46 -0
  156. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-metrics.service.js.map +1 -0
  157. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-process.service.d.ts +27 -0
  158. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-process.service.js +139 -0
  159. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-process.service.js.map +1 -0
  160. package/dist/plugins/remote-access-tailscale/controllers/setup.controller.d.ts +1 -0
  161. package/dist/plugins/remote-access-tailscale/controllers/setup.controller.js +26 -10
  162. package/dist/plugins/remote-access-tailscale/controllers/setup.controller.js.map +1 -1
  163. package/dist/plugins/remote-access-tailscale/controllers/status.controller.d.ts +6 -1
  164. package/dist/plugins/remote-access-tailscale/controllers/status.controller.js +28 -3
  165. package/dist/plugins/remote-access-tailscale/controllers/status.controller.js.map +1 -1
  166. package/dist/plugins/remote-access-tailscale/models/status.model.d.ts +19 -0
  167. package/dist/plugins/remote-access-tailscale/models/status.model.js +158 -1
  168. package/dist/plugins/remote-access-tailscale/models/status.model.js.map +1 -1
  169. package/dist/plugins/remote-access-tailscale/remote-access-tailscale.constants.d.ts +2 -0
  170. package/dist/plugins/remote-access-tailscale/remote-access-tailscale.constants.js +3 -1
  171. package/dist/plugins/remote-access-tailscale/remote-access-tailscale.constants.js.map +1 -1
  172. package/dist/plugins/remote-access-tailscale/remote-access-tailscale.exceptions.d.ts +13 -0
  173. package/dist/plugins/remote-access-tailscale/remote-access-tailscale.exceptions.js +27 -0
  174. package/dist/plugins/remote-access-tailscale/remote-access-tailscale.exceptions.js.map +1 -0
  175. package/dist/plugins/remote-access-tailscale/remote-access-tailscale.openapi.d.ts +2 -2
  176. package/dist/plugins/remote-access-tailscale/remote-access-tailscale.openapi.js +2 -0
  177. package/dist/plugins/remote-access-tailscale/remote-access-tailscale.openapi.js.map +1 -1
  178. package/dist/plugins/remote-access-tailscale/remote-access-tailscale.plugin.js +1 -1
  179. package/dist/plugins/remote-access-tailscale/scripts/tailscale-setup.sh +61 -0
  180. package/dist/plugins/remote-access-tailscale/services/tailscale-cli.service.d.ts +9 -0
  181. package/dist/plugins/remote-access-tailscale/services/tailscale-cli.service.js +12 -0
  182. package/dist/plugins/remote-access-tailscale/services/tailscale-cli.service.js.map +1 -1
  183. package/dist/plugins/remote-access-tailscale/services/tailscale-login.service.d.ts +1 -0
  184. package/dist/plugins/remote-access-tailscale/services/tailscale-login.service.js +27 -2
  185. package/dist/plugins/remote-access-tailscale/services/tailscale-login.service.js.map +1 -1
  186. package/dist/plugins/remote-access-tailscale/services/tailscale-node-managed.service.d.ts +30 -1
  187. package/dist/plugins/remote-access-tailscale/services/tailscale-node-managed.service.js +300 -30
  188. package/dist/plugins/remote-access-tailscale/services/tailscale-node-managed.service.js.map +1 -1
  189. package/dist/plugins/remote-access-tailscale/services/tailscale-serve.service.d.ts +8 -3
  190. package/dist/plugins/remote-access-tailscale/services/tailscale-serve.service.js +39 -12
  191. package/dist/plugins/remote-access-tailscale/services/tailscale-serve.service.js.map +1 -1
  192. package/dist/plugins/remote-access-tailscale/services/tailscale-setup.service.d.ts +14 -5
  193. package/dist/plugins/remote-access-tailscale/services/tailscale-setup.service.js +51 -16
  194. package/dist/plugins/remote-access-tailscale/services/tailscale-setup.service.js.map +1 -1
  195. package/dist/plugins/scenes-local/platforms/local-scene.platform.d.ts +3 -1
  196. package/dist/plugins/scenes-local/platforms/local-scene.platform.js +12 -7
  197. package/dist/plugins/scenes-local/platforms/local-scene.platform.js.map +1 -1
  198. package/dist/plugins/spaces-home-control/services/climate-intent.service.d.ts +3 -1
  199. package/dist/plugins/spaces-home-control/services/climate-intent.service.js +6 -3
  200. package/dist/plugins/spaces-home-control/services/climate-intent.service.js.map +1 -1
  201. package/dist/plugins/spaces-home-control/services/covers-intent.service.d.ts +3 -1
  202. package/dist/plugins/spaces-home-control/services/covers-intent.service.js +6 -3
  203. package/dist/plugins/spaces-home-control/services/covers-intent.service.js.map +1 -1
  204. package/dist/plugins/spaces-home-control/services/lighting-intent.service.d.ts +3 -1
  205. package/dist/plugins/spaces-home-control/services/lighting-intent.service.js +7 -4
  206. package/dist/plugins/spaces-home-control/services/lighting-intent.service.js.map +1 -1
  207. package/dist/plugins/spaces-home-control/services/space-media-activity.service.d.ts +3 -1
  208. package/dist/plugins/spaces-home-control/services/space-media-activity.service.js +11 -5
  209. package/dist/plugins/spaces-home-control/services/space-media-activity.service.js.map +1 -1
  210. package/dist/plugins/spaces-home-control/services/space-undo-history.service.d.ts +3 -1
  211. package/dist/plugins/spaces-home-control/services/space-undo-history.service.js +8 -5
  212. package/dist/plugins/spaces-home-control/services/space-undo-history.service.js.map +1 -1
  213. package/dist/tsconfig.build.tsbuildinfo +1 -1
  214. package/package.json +2 -2
@@ -53,6 +53,7 @@ const channels_controls_service_1 = require("./services/channels.controls.servic
53
53
  const channels_properties_type_mapper_service_1 = require("./services/channels.properties-type-mapper.service");
54
54
  const channels_properties_service_1 = require("./services/channels.properties.service");
55
55
  const channels_service_1 = require("./services/channels.service");
56
+ const command_latency_trace_collector_service_1 = require("./services/command-latency-trace-collector.service");
56
57
  const device_connection_state_service_1 = require("./services/device-connection-state.service");
57
58
  const device_connectivity_service_1 = require("./services/device-connectivity.service");
58
59
  const device_control_tool_service_1 = require("./services/device-control-tool.service");
@@ -67,7 +68,10 @@ const devices_controls_service_1 = require("./services/devices.controls.service"
67
68
  const devices_service_1 = require("./services/devices.service");
68
69
  const module_reset_service_1 = require("./services/module-reset.service");
69
70
  const platform_registry_service_1 = require("./services/platform.registry.service");
71
+ const property_command_dispatch_service_1 = require("./services/property-command-dispatch.service");
72
+ const property_command_window_service_1 = require("./services/property-command-window.service");
70
73
  const property_command_service_1 = require("./services/property-command.service");
74
+ const property_state_coordinator_service_1 = require("./services/property-state-coordinator.service");
71
75
  const property_timeseries_service_1 = require("./services/property-timeseries.service");
72
76
  const property_value_lock_service_1 = require("./services/property-value-lock.service");
73
77
  const property_value_source_registry_service_1 = require("./services/property-value-source.registry.service");
@@ -246,7 +250,11 @@ exports.DevicesModule = DevicesModule = __decorate([
246
250
  property_value_source_registry_service_1.PropertyValueSourceRegistryService,
247
251
  property_value_lock_service_1.PropertyValueLockService,
248
252
  property_value_service_1.PropertyValueService,
253
+ property_state_coordinator_service_1.PropertyStateCoordinatorService,
249
254
  property_timeseries_service_1.PropertyTimeseriesService,
255
+ property_command_window_service_1.PropertyCommandWindowService,
256
+ command_latency_trace_collector_service_1.CommandLatencyTraceCollectorService,
257
+ property_command_dispatch_service_1.PropertyCommandDispatchService,
250
258
  property_command_service_1.PropertyCommandService,
251
259
  device_connection_state_service_1.DeviceConnectionStateService,
252
260
  stats_service_1.StatsService,
@@ -281,7 +289,11 @@ exports.DevicesModule = DevicesModule = __decorate([
281
289
  platform_registry_service_1.PlatformRegistryService,
282
290
  property_value_source_registry_service_1.PropertyValueSourceRegistryService,
283
291
  property_value_service_1.PropertyValueService,
292
+ property_state_coordinator_service_1.PropertyStateCoordinatorService,
284
293
  property_timeseries_service_1.PropertyTimeseriesService,
294
+ property_command_window_service_1.PropertyCommandWindowService,
295
+ command_latency_trace_collector_service_1.CommandLatencyTraceCollectorService,
296
+ property_command_dispatch_service_1.PropertyCommandDispatchService,
285
297
  property_command_service_1.PropertyCommandService,
286
298
  device_exists_constraint_validator_1.DeviceExistsConstraintValidator,
287
299
  device_not_hidden_constraint_validator_1.DeviceNotHiddenConstraintValidator,
@@ -1 +1 @@
1
- {"version":3,"file":"devices.module.js","sourceRoot":"","sources":["../../../src/modules/devices/devices.module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devices.module.js","sourceRoot":"","sources":["../../../src/modules/devices/devices.module.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,17 @@
1
1
  import { DataSource, EntityManager, Repository } from 'typeorm';
2
+ import { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
2
3
  import { EventEmitter2 } from '@nestjs/event-emitter';
3
4
  import { type StorageBackendBinding } from '../../storage/services/storage.service';
4
5
  import { ChannelCategory, DataTypeType, DeviceCategory, PermissionType, PropertyCategory } from '../devices.constants';
5
6
  import { CreateChannelPropertyDto } from '../dto/create-channel-property.dto';
6
7
  import { UpdateChannelPropertyDto } from '../dto/update-channel-property.dto';
7
8
  import { ChannelPropertyEntity } from '../entities/devices.entity';
8
- import { type PropertyValueState } from '../models/property-value-state.model';
9
+ import { PropertyValueState } from '../models/property-value-state.model';
9
10
  import { ChannelsPropertiesTypeMapperService } from './channels.properties-type-mapper.service';
11
+ import { CommandLatencyTraceCollectorService } from './command-latency-trace-collector.service';
10
12
  import { DeviceStructureLockService } from './device-structure-lock.service';
13
+ import { PropertyCommandWindowHandle, PropertyCommandWindowService } from './property-command-window.service';
14
+ import { PropertyStateCoordinatorService } from './property-state-coordinator.service';
11
15
  import { PropertyValueSourceRegistryService } from './property-value-source.registry.service';
12
16
  import { PropertyValueService } from './property-value.service';
13
17
  export interface BoundedChannelProperties {
@@ -80,18 +84,28 @@ export interface ChannelPropertyUpdateOptions {
80
84
  beforeValuePersistence?: () => Promise<void>;
81
85
  valueTimestamp?: Date;
82
86
  resolveValueTimestamp?: () => Date;
87
+ commandOrigin?: {
88
+ readonly handle: PropertyCommandWindowHandle;
89
+ readonly baseline: PropertyValueState;
90
+ };
83
91
  }
84
- export declare class ChannelsPropertiesService {
92
+ export declare class ChannelsPropertiesService implements OnModuleInit, OnModuleDestroy {
85
93
  private readonly repository;
86
94
  private readonly propertiesMapperService;
87
95
  private readonly propertyValueService;
88
96
  private readonly valueSourceRegistry;
89
97
  private readonly structureLock;
98
+ private readonly propertyStateCoordinator;
99
+ private readonly propertyCommandWindowService;
90
100
  private readonly dataSource;
91
101
  private readonly eventEmitter;
102
+ private readonly commandLatencyTraceCollector;
92
103
  private readonly logger;
93
104
  private static readonly VISIBLE_READABLE_STATE_CANDIDATE_MAX_LIMIT;
94
- constructor(repository: Repository<ChannelPropertyEntity>, propertiesMapperService: ChannelsPropertiesTypeMapperService, propertyValueService: PropertyValueService, valueSourceRegistry: PropertyValueSourceRegistryService, structureLock: DeviceStructureLockService, dataSource: DataSource, eventEmitter: EventEmitter2);
105
+ private commandWindowCleanupTimer;
106
+ constructor(repository: Repository<ChannelPropertyEntity>, propertiesMapperService: ChannelsPropertiesTypeMapperService, propertyValueService: PropertyValueService, valueSourceRegistry: PropertyValueSourceRegistryService, structureLock: DeviceStructureLockService, propertyStateCoordinator: PropertyStateCoordinatorService, propertyCommandWindowService: PropertyCommandWindowService, dataSource: DataSource, eventEmitter: EventEmitter2, commandLatencyTraceCollector?: CommandLatencyTraceCollectorService);
107
+ onModuleInit(): void;
108
+ onModuleDestroy(): void;
95
109
  findAll<TProperty extends ChannelPropertyEntity>(channelId?: string | string[], type?: string): Promise<TProperty[]>;
96
110
  findBoundedForChannels(channelIds: string[], perChannelLimit: number, strictValues?: boolean, propertyCategories?: string[]): Promise<BoundedChannelProperties>;
97
111
  findWritableCandidates(limit: number, offset?: number): Promise<WritablePropertyCandidates>;
@@ -102,7 +116,17 @@ export declare class ChannelsPropertiesService {
102
116
  findOneBy<TProperty extends ChannelPropertyEntity>(column: 'id' | 'category' | 'identifier' | 'name', value: string | number | boolean, channelId?: string, type?: string): Promise<TProperty | null>;
103
117
  create<TProperty extends ChannelPropertyEntity, TCreateDTO extends CreateChannelPropertyDto>(channelId: string, createDto: TCreateDTO): Promise<TProperty>;
104
118
  update<TProperty extends ChannelPropertyEntity, TUpdateDTO extends UpdateChannelPropertyDto>(id: string, updateDto: TUpdateDTO, options?: ChannelPropertyUpdateOptions): Promise<TProperty>;
119
+ private updateInternal;
120
+ private publishValueSet;
121
+ private updateValueOnly;
122
+ private commitWindowedProviderValue;
123
+ private commitCommandOriginValue;
124
+ private recoverExpiredCommandWindows;
105
125
  remove(id: string, manager?: EntityManager): Promise<void>;
106
126
  getOneOrThrow(id: string): Promise<ChannelPropertyEntity>;
127
+ private isValueOnlyUpdate;
128
+ private getValueOnlyMapping;
129
+ private findOneForValueUpdate;
130
+ private snapshotValueState;
107
131
  private validateDto;
108
132
  }
@@ -30,23 +30,50 @@ const transform_utils_1 = require("../../../common/utils/transform.utils");
30
30
  const devices_constants_1 = require("../devices.constants");
31
31
  const devices_exceptions_1 = require("../devices.exceptions");
32
32
  const devices_entity_1 = require("../entities/devices.entity");
33
+ const property_value_state_model_1 = require("../models/property-value-state.model");
33
34
  const property_command_value_utils_1 = require("../utils/property-command-value.utils");
34
35
  const property_metadata_utils_1 = require("../utils/property-metadata.utils");
35
36
  const unique_constraint_utils_1 = require("../utils/unique-constraint.utils");
36
37
  const channels_properties_type_mapper_service_1 = require("./channels.properties-type-mapper.service");
38
+ const command_latency_trace_collector_service_1 = require("./command-latency-trace-collector.service");
37
39
  const device_structure_lock_service_1 = require("./device-structure-lock.service");
40
+ const property_command_window_service_1 = require("./property-command-window.service");
41
+ const property_state_coordinator_service_1 = require("./property-state-coordinator.service");
38
42
  const property_value_source_registry_service_1 = require("./property-value-source.registry.service");
39
43
  const property_value_service_1 = require("./property-value.service");
40
44
  let ChannelsPropertiesService = ChannelsPropertiesService_1 = class ChannelsPropertiesService {
41
- constructor(repository, propertiesMapperService, propertyValueService, valueSourceRegistry, structureLock, dataSource, eventEmitter) {
45
+ constructor(repository, propertiesMapperService, propertyValueService, valueSourceRegistry, structureLock, propertyStateCoordinator, propertyCommandWindowService, dataSource, eventEmitter, commandLatencyTraceCollector = new command_latency_trace_collector_service_1.CommandLatencyTraceCollectorService()) {
42
46
  this.repository = repository;
43
47
  this.propertiesMapperService = propertiesMapperService;
44
48
  this.propertyValueService = propertyValueService;
45
49
  this.valueSourceRegistry = valueSourceRegistry;
46
50
  this.structureLock = structureLock;
51
+ this.propertyStateCoordinator = propertyStateCoordinator;
52
+ this.propertyCommandWindowService = propertyCommandWindowService;
47
53
  this.dataSource = dataSource;
48
54
  this.eventEmitter = eventEmitter;
55
+ this.commandLatencyTraceCollector = commandLatencyTraceCollector;
49
56
  this.logger = (0, extension_logger_service_1.createExtensionLogger)(devices_constants_1.DEVICES_MODULE_NAME, 'ChannelsPropertiesService');
57
+ this.commandWindowCleanupTimer = null;
58
+ }
59
+ onModuleInit() {
60
+ if (this.commandWindowCleanupTimer !== null) {
61
+ return;
62
+ }
63
+ this.commandWindowCleanupTimer = setInterval(() => {
64
+ void this.recoverExpiredCommandWindows().catch((error) => {
65
+ const message = error instanceof Error ? error.message : 'unknown failure';
66
+ this.logger.error(`Failed to recover an expired property command window: ${message}`);
67
+ });
68
+ }, 500);
69
+ this.commandWindowCleanupTimer.unref();
70
+ }
71
+ onModuleDestroy() {
72
+ if (this.commandWindowCleanupTimer !== null) {
73
+ clearInterval(this.commandWindowCleanupTimer);
74
+ this.commandWindowCleanupTimer = null;
75
+ }
76
+ this.propertyCommandWindowService.clear();
50
77
  }
51
78
  async findAll(channelId, type) {
52
79
  const mapping = type ? this.propertiesMapperService.getMapping(type) : null;
@@ -481,7 +508,30 @@ let ChannelsPropertiesService = ChannelsPropertiesService_1 = class ChannelsProp
481
508
  return savedProperty;
482
509
  }
483
510
  async update(id, updateDto, options = {}) {
511
+ const windowGeneration = options.commandOrigin?.handle.generation ??
512
+ (this.commandLatencyTraceCollector.isEnabled()
513
+ ? this.propertyCommandWindowService.peekGeneration(id)
514
+ : undefined);
515
+ return this.commandLatencyTraceCollector.traceUpdate({
516
+ propertyId: id,
517
+ value: updateDto.value,
518
+ windowGeneration,
519
+ }, () => this.updateInternal(id, updateDto, options));
520
+ }
521
+ async updateInternal(id, updateDto, options = {}) {
484
522
  this.logger.debug(`Updating data source with id=${id}`);
523
+ if (this.isValueOnlyUpdate(updateDto, options)) {
524
+ const valueOnlyMapping = typeof updateDto.type === 'string'
525
+ ? this.getValueOnlyMapping(updateDto.type)
526
+ : undefined;
527
+ if (valueOnlyMapping !== null) {
528
+ const result = await this.updateValueOnly(id, updateDto, valueOnlyMapping);
529
+ if ('property' in result) {
530
+ return result.property;
531
+ }
532
+ return this.updateInternal(id, { ...updateDto, type: result.type }, options);
533
+ }
534
+ }
485
535
  const property = await this.getOneOrThrow(id);
486
536
  const mapping = this.propertiesMapperService.getMapping(property.type);
487
537
  const dtoInstance = await this.validateDto(mapping.updateDto, updateDto);
@@ -489,6 +539,7 @@ let ChannelsPropertiesService = ChannelsPropertiesService_1 = class ChannelsProp
489
539
  const updateFields = (0, lodash_omitby_1.default)((0, transform_utils_1.toInstance)(mapping.class, dtoInstance), lodash_isundefined_1.default);
490
540
  return this.structureLock.runExclusive(async () => {
491
541
  const current = (await this.getOneOrThrow(id));
542
+ const previousCanonicalPropertyId = this.valueSourceRegistry.resolve(current);
492
543
  const entityFieldsChanged = Object.keys(updateFields).some((key) => {
493
544
  if (key === 'value' || key === 'type') {
494
545
  return false;
@@ -513,33 +564,72 @@ let ChannelsPropertiesService = ChannelsPropertiesService_1 = class ChannelsProp
513
564
  return newValue !== existingValue;
514
565
  });
515
566
  Object.assign(current, updateFields);
567
+ if (entityFieldsChanged) {
568
+ const nextCanonicalPropertyId = this.valueSourceRegistry.resolve(current);
569
+ if (nextCanonicalPropertyId !== previousCanonicalPropertyId) {
570
+ this.propertyCommandWindowService.cancel(previousCanonicalPropertyId);
571
+ this.propertyCommandWindowService.cancel(nextCanonicalPropertyId);
572
+ }
573
+ }
516
574
  if (mapping.beforeUpdate) {
517
575
  await mapping.beforeUpdate(current);
518
576
  }
519
577
  const raw = await repository.save(current);
520
578
  let valueChanged = false;
521
579
  let persistedValueState = null;
580
+ let forceConfirmationValueEvent = false;
522
581
  if (typeof updateDto.value !== 'undefined') {
523
582
  const valueTimestamp = options.resolveValueTimestamp?.() ?? options.valueTimestamp;
524
- if (options.strictValuePersistence && options.comparePersistedValue) {
525
- const result = await this.propertyValueService.writeStrictIfPersistedDifferent(raw, updateDto.value, options.expectedPersistedState ?? null, options.beforeValuePersistence, valueTimestamp);
526
- valueChanged = result.changed;
527
- persistedValueState = result.state;
528
- }
529
- else if (options.strictValuePersistence) {
530
- await options.beforeValuePersistence?.();
531
- const result = await this.propertyValueService.writeStrictWithState(raw, updateDto.value, options.storageBinding, valueTimestamp);
532
- valueChanged = result.changed;
533
- persistedValueState = result.state;
534
- }
535
- else {
536
- valueChanged = await this.propertyValueService.write(raw, updateDto.value, valueTimestamp);
583
+ const writeStrictValue = async () => {
584
+ if (options.strictValuePersistence && options.comparePersistedValue) {
585
+ return this.propertyValueService.writeStrictIfPersistedDifferent(raw, updateDto.value, options.expectedPersistedState ?? null, options.beforeValuePersistence, valueTimestamp);
586
+ }
587
+ if (options.strictValuePersistence) {
588
+ await options.beforeValuePersistence?.();
589
+ return this.propertyValueService.writeStrictWithState(raw, updateDto.value, options.storageBinding, valueTimestamp);
590
+ }
591
+ return null;
592
+ };
593
+ const writeWithoutWindow = async () => {
594
+ const strictResult = await writeStrictValue();
595
+ if (strictResult !== null) {
596
+ return strictResult;
597
+ }
598
+ return {
599
+ changed: await this.propertyValueService.write(raw, updateDto.value, valueTimestamp),
600
+ state: null,
601
+ };
602
+ };
603
+ const writeWithWindow = async () => {
604
+ const strictResult = await writeStrictValue();
605
+ return strictResult ?? this.propertyValueService.writeWithState(raw, updateDto.value, valueTimestamp);
606
+ };
607
+ const windowed = options.commandOrigin === undefined
608
+ ? await this.commitWindowedProviderValue(raw, updateDto.value, {
609
+ unwindowed: writeWithoutWindow,
610
+ windowed: writeWithWindow,
611
+ })
612
+ : await this.commitCommandOriginValue(raw, updateDto.value, options.commandOrigin, writeWithWindow);
613
+ valueChanged = windowed.changed;
614
+ persistedValueState = windowed.state;
615
+ forceConfirmationValueEvent = windowed.forceValueEvent;
616
+ this.commandLatencyTraceCollector.recordWriteComplete(raw, {
617
+ changed: windowed.changed,
618
+ held: windowed.held,
619
+ });
620
+ if (windowed.held) {
621
+ this.commandLatencyTraceCollector.recordSuppressed(raw, 'The provider report was held by the command window.');
537
622
  }
538
623
  }
539
624
  const strictValueEventEmitted = options.strictValuePersistence === true && valueChanged;
625
+ const confirmationValueEventEmitted = forceConfirmationValueEvent && !strictValueEventEmitted;
540
626
  if (strictValueEventEmitted) {
541
627
  raw.value = persistedValueState;
542
- this.eventEmitter.emit(devices_constants_1.EventType.CHANNEL_PROPERTY_VALUE_SET, raw);
628
+ this.publishValueSet(raw);
629
+ }
630
+ else if (confirmationValueEventEmitted) {
631
+ raw.value = persistedValueState;
632
+ this.publishValueSet(raw);
543
633
  }
544
634
  let updatedProperty = (await this.getOneOrThrow(property.id));
545
635
  if (mapping.afterUpdate) {
@@ -550,24 +640,170 @@ let ChannelsPropertiesService = ChannelsPropertiesService_1 = class ChannelsProp
550
640
  if (entityFieldsChanged) {
551
641
  this.eventEmitter.emit(devices_constants_1.EventType.CHANNEL_PROPERTY_UPDATED, updatedProperty);
552
642
  }
553
- else if (valueChanged && !strictValueEventEmitted) {
554
- this.eventEmitter.emit(devices_constants_1.EventType.CHANNEL_PROPERTY_VALUE_SET, updatedProperty);
643
+ else if (valueChanged && !strictValueEventEmitted && !confirmationValueEventEmitted) {
644
+ this.publishValueSet(updatedProperty);
555
645
  }
556
646
  return updatedProperty;
557
647
  });
558
648
  }
649
+ publishValueSet(property) {
650
+ this.commandLatencyTraceCollector.recordSourcePublication(property);
651
+ this.eventEmitter.emit(devices_constants_1.EventType.CHANNEL_PROPERTY_VALUE_SET, property);
652
+ }
653
+ async updateValueOnly(id, updateDto, knownMapping) {
654
+ return this.structureLock.runShared(() => this.propertyStateCoordinator.run(id, async () => {
655
+ const current = (await this.findOneForValueUpdate(id));
656
+ const mapping = knownMapping ?? this.propertiesMapperService.getMapping(current.type);
657
+ if (mapping.beforeUpdate || mapping.afterUpdate) {
658
+ return { type: current.type };
659
+ }
660
+ const dto = await this.validateDto(mapping.updateDto, {
661
+ ...updateDto,
662
+ type: updateDto.type ?? current.type,
663
+ });
664
+ if (dto.type !== current.type) {
665
+ throw new devices_exceptions_1.DevicesValidationException('Provided property type does not match the stored property type.');
666
+ }
667
+ const value = dto.value;
668
+ if (value === undefined) {
669
+ return { type: current.type };
670
+ }
671
+ const commit = async () => {
672
+ const write = () => this.propertyValueService.writeWithState(current, value);
673
+ const result = await this.commitWindowedProviderValue(current, value, { unwindowed: write, windowed: write });
674
+ this.commandLatencyTraceCollector.recordWriteComplete(current, {
675
+ changed: result.changed,
676
+ held: result.held,
677
+ });
678
+ if (result.held) {
679
+ this.commandLatencyTraceCollector.recordSuppressed(current, 'The provider report was held by the command window.');
680
+ return { property: current };
681
+ }
682
+ if (result.state !== null) {
683
+ current.value = this.snapshotValueState(result.state);
684
+ }
685
+ if (result.changed || result.forceValueEvent) {
686
+ this.publishValueSet(current);
687
+ }
688
+ return { property: current };
689
+ };
690
+ const canonicalPropertyId = this.valueSourceRegistry.resolve(current);
691
+ return canonicalPropertyId === id ? commit() : this.propertyStateCoordinator.run(canonicalPropertyId, commit);
692
+ }));
693
+ }
694
+ async commitWindowedProviderValue(property, value, writers) {
695
+ const canonicalPropertyId = this.valueSourceRegistry.resolve(property);
696
+ const validation = (0, property_command_value_utils_1.validatePropertyCommandValue)(property, value);
697
+ if (!validation.valid || validation.value === undefined) {
698
+ const result = await writers.unwindowed();
699
+ return { ...result, held: false, forceValueEvent: false };
700
+ }
701
+ const expired = this.propertyCommandWindowService.expire(canonicalPropertyId);
702
+ if (expired !== null) {
703
+ this.propertyCommandWindowService.cancelRecovery(canonicalPropertyId);
704
+ }
705
+ const window = this.propertyCommandWindowService.get(canonicalPropertyId);
706
+ if (window === null) {
707
+ this.propertyCommandWindowService.cancelRecovery(canonicalPropertyId);
708
+ const result = await writers.unwindowed();
709
+ return { ...result, held: false, forceValueEvent: false };
710
+ }
711
+ const handle = { canonicalPropertyId, generation: window.generation };
712
+ const receipt = { value: validation.value, receivedAt: Date.now() };
713
+ const isConfirmation = validation.value === window.commandedValue;
714
+ if (!isConfirmation && window.previousValue !== null && validation.value === window.previousValue) {
715
+ if (window.state === 'pending') {
716
+ this.propertyCommandWindowService.hold(handle, receipt);
717
+ }
718
+ return { changed: false, state: null, held: true, forceValueEvent: false };
719
+ }
720
+ const firstConfirmation = isConfirmation && window.state === 'pending';
721
+ const result = await writers.windowed();
722
+ if (result.state === null) {
723
+ return { ...result, held: false, forceValueEvent: false };
724
+ }
725
+ if (isConfirmation) {
726
+ this.propertyCommandWindowService.confirm(handle, receipt);
727
+ }
728
+ else {
729
+ this.propertyCommandWindowService.close(handle);
730
+ }
731
+ return { ...result, held: false, forceValueEvent: firstConfirmation };
732
+ }
733
+ async commitCommandOriginValue(property, value, origin, write) {
734
+ if (this.valueSourceRegistry.resolve(property) !== origin.handle.canonicalPropertyId) {
735
+ return { changed: false, state: null, held: false, forceValueEvent: false };
736
+ }
737
+ const window = this.propertyCommandWindowService.get(origin.handle.canonicalPropertyId);
738
+ if (window === null || window.generation !== origin.handle.generation || window.state !== 'pending') {
739
+ return { changed: false, state: null, held: false, forceValueEvent: false };
740
+ }
741
+ const result = await write();
742
+ if (result.changed && result.state !== null) {
743
+ this.propertyCommandWindowService.attachPatchReceipt(origin.handle, {
744
+ baseline: origin.baseline,
745
+ optimisticState: result.state,
746
+ });
747
+ }
748
+ return { ...result, held: false, forceValueEvent: false };
749
+ }
750
+ async recoverExpiredCommandWindows() {
751
+ const handles = this.propertyCommandWindowService.sweep();
752
+ for (const handle of handles) {
753
+ await this.structureLock.runShared(() => this.propertyStateCoordinator.run(handle.canonicalPropertyId, async () => {
754
+ const recovery = this.propertyCommandWindowService.getRecovery(handle);
755
+ if (recovery === null) {
756
+ return;
757
+ }
758
+ let property;
759
+ try {
760
+ property = await this.findOneForValueUpdate(handle.canonicalPropertyId);
761
+ }
762
+ catch (error) {
763
+ if (error instanceof devices_exceptions_1.DevicesNotFoundException) {
764
+ this.propertyCommandWindowService.completeRecovery(handle);
765
+ return;
766
+ }
767
+ throw error;
768
+ }
769
+ if (this.valueSourceRegistry.resolve(property) !== handle.canonicalPropertyId) {
770
+ this.propertyCommandWindowService.completeRecovery(handle);
771
+ return;
772
+ }
773
+ const result = recovery.heldReceipt !== null
774
+ ? await this.propertyValueService.writeWithState(property, recovery.heldReceipt.value)
775
+ : recovery.patchReceipt !== null
776
+ ? await this.propertyValueService.writeStrictIfPersistedDifferent(property, recovery.patchReceipt.baseline.value, recovery.patchReceipt.optimisticState)
777
+ : null;
778
+ if (result === null ||
779
+ result.state === null ||
780
+ this.propertyCommandWindowService.getRecovery(handle) === null) {
781
+ return;
782
+ }
783
+ property.value = this.snapshotValueState(result.state);
784
+ if (result.changed) {
785
+ this.eventEmitter.emit(devices_constants_1.EventType.CHANNEL_PROPERTY_VALUE_SET, property);
786
+ }
787
+ this.propertyCommandWindowService.completeRecovery(handle);
788
+ }));
789
+ }
790
+ }
559
791
  async remove(id, manager = this.dataSource.manager) {
560
- const property = await manager.findOne(devices_entity_1.ChannelPropertyEntity, {
561
- where: { id },
792
+ return this.structureLock.runExclusive(async () => {
793
+ const property = await manager.findOne(devices_entity_1.ChannelPropertyEntity, {
794
+ where: { id },
795
+ });
796
+ if (!property) {
797
+ this.logger.warn(`Property with id=${id} not found during removal (skipping)`);
798
+ return;
799
+ }
800
+ this.propertyCommandWindowService.cancel(id);
801
+ this.propertyCommandWindowService.cancel(this.valueSourceRegistry.resolve(property));
802
+ const propertyForEvent = { ...property };
803
+ await manager.remove(property);
804
+ this.logger.log(`Successfully removed property with id=${id}`);
805
+ this.eventEmitter.emit(devices_constants_1.EventType.CHANNEL_PROPERTY_DELETED, propertyForEvent);
562
806
  });
563
- if (!property) {
564
- this.logger.warn(`Property with id=${id} not found during removal (skipping)`);
565
- return;
566
- }
567
- const propertyForEvent = { ...property };
568
- await manager.remove(property);
569
- this.logger.log(`Successfully removed property with id=${id}`);
570
- this.eventEmitter.emit(devices_constants_1.EventType.CHANNEL_PROPERTY_DELETED, propertyForEvent);
571
807
  }
572
808
  async getOneOrThrow(id) {
573
809
  const property = await this.findOne(id);
@@ -577,6 +813,42 @@ let ChannelsPropertiesService = ChannelsPropertiesService_1 = class ChannelsProp
577
813
  }
578
814
  return property;
579
815
  }
816
+ isValueOnlyUpdate(updateDto, options) {
817
+ const keys = Object.keys(updateDto);
818
+ return (!options.strictValuePersistence &&
819
+ options.commandOrigin === undefined &&
820
+ !options.resolveValueTimestamp &&
821
+ !options.valueTimestamp &&
822
+ updateDto.value !== undefined &&
823
+ Object.prototype.hasOwnProperty.call(updateDto, 'value') &&
824
+ keys.every((key) => key === 'type' || key === 'value'));
825
+ }
826
+ getValueOnlyMapping(type) {
827
+ try {
828
+ const mapping = this.propertiesMapperService.getMapping(type);
829
+ return mapping.beforeUpdate || mapping.afterUpdate ? null : mapping;
830
+ }
831
+ catch {
832
+ return null;
833
+ }
834
+ }
835
+ async findOneForValueUpdate(id) {
836
+ const property = await this.repository
837
+ .createQueryBuilder('property')
838
+ .innerJoinAndSelect('property.channel', 'channel')
839
+ .innerJoinAndSelect('channel.device', 'device')
840
+ .where('property.id = :id', { id })
841
+ .callListeners(false)
842
+ .getOne();
843
+ if (!property) {
844
+ throw new devices_exceptions_1.DevicesNotFoundException('Channel property does not exist');
845
+ }
846
+ property.unit = (0, property_metadata_utils_1.resolvePropertyUnit)(property);
847
+ return property;
848
+ }
849
+ snapshotValueState(state) {
850
+ return state === null ? null : new property_value_state_model_1.PropertyValueState(state.value, state.lastUpdated, state.trend);
851
+ }
580
852
  async validateDto(DtoClass, dto) {
581
853
  const dtoInstance = (0, transform_utils_1.toInstance)(DtoClass, dto, {
582
854
  excludeExtraneousValues: false,
@@ -598,12 +870,16 @@ ChannelsPropertiesService.VISIBLE_READABLE_STATE_CANDIDATE_MAX_LIMIT = 500;
598
870
  exports.ChannelsPropertiesService = ChannelsPropertiesService = ChannelsPropertiesService_1 = __decorate([
599
871
  (0, common_1.Injectable)(),
600
872
  __param(0, (0, typeorm_2.InjectRepository)(devices_entity_1.ChannelPropertyEntity)),
873
+ __param(9, (0, common_1.Optional)()),
601
874
  __metadata("design:paramtypes", [typeorm_1.Repository,
602
875
  channels_properties_type_mapper_service_1.ChannelsPropertiesTypeMapperService,
603
876
  property_value_service_1.PropertyValueService,
604
877
  property_value_source_registry_service_1.PropertyValueSourceRegistryService,
605
878
  device_structure_lock_service_1.DeviceStructureLockService,
879
+ property_state_coordinator_service_1.PropertyStateCoordinatorService,
880
+ property_command_window_service_1.PropertyCommandWindowService,
606
881
  typeorm_1.DataSource,
607
- event_emitter_1.EventEmitter2])
882
+ event_emitter_1.EventEmitter2,
883
+ command_latency_trace_collector_service_1.CommandLatencyTraceCollectorService])
608
884
  ], ChannelsPropertiesService);
609
885
  //# sourceMappingURL=channels.properties.service.js.map