@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.
- package/dist/app.module.js +7 -0
- package/dist/app.module.js.map +1 -1
- package/dist/common/filters/conflict-exception.filter.d.ts +6 -0
- package/dist/common/filters/conflict-exception.filter.js +59 -0
- package/dist/common/filters/conflict-exception.filter.js.map +1 -0
- package/dist/common/filters/global-error.filter.js +1 -4
- package/dist/common/filters/global-error.filter.js.map +1 -1
- package/dist/common/filters/global-filters.d.ts +3 -0
- package/dist/common/filters/global-filters.js +22 -0
- package/dist/common/filters/global-filters.js.map +1 -0
- package/dist/common/filters/unprocessable-entity-exception.filter.d.ts +1 -0
- package/dist/common/filters/unprocessable-entity-exception.filter.js +15 -3
- package/dist/common/filters/unprocessable-entity-exception.filter.js.map +1 -1
- package/dist/common/utils/transform.utils.js +3 -0
- package/dist/common/utils/transform.utils.js.map +1 -1
- package/dist/main.js +2 -7
- package/dist/main.js.map +1 -1
- package/dist/modules/devices/controllers/channels.properties.controller.js +16 -4
- package/dist/modules/devices/controllers/channels.properties.controller.js.map +1 -1
- package/dist/modules/devices/controllers/devices.channels.properties.controller.js +16 -4
- package/dist/modules/devices/controllers/devices.channels.properties.controller.js.map +1 -1
- package/dist/modules/devices/devices.module.js +12 -0
- package/dist/modules/devices/devices.module.js.map +1 -1
- package/dist/modules/devices/services/channels.properties.service.d.ts +27 -3
- package/dist/modules/devices/services/channels.properties.service.js +304 -28
- package/dist/modules/devices/services/channels.properties.service.js.map +1 -1
- package/dist/modules/devices/services/channels.service.js +42 -38
- package/dist/modules/devices/services/channels.service.js.map +1 -1
- package/dist/modules/devices/services/command-latency-trace-collector.service.d.ts +101 -0
- package/dist/modules/devices/services/command-latency-trace-collector.service.js +451 -0
- package/dist/modules/devices/services/command-latency-trace-collector.service.js.map +1 -0
- package/dist/modules/devices/services/device-structure-lock.service.d.ts +10 -2
- package/dist/modules/devices/services/device-structure-lock.service.js +86 -7
- package/dist/modules/devices/services/device-structure-lock.service.js.map +1 -1
- package/dist/modules/devices/services/devices.service.js +37 -33
- package/dist/modules/devices/services/devices.service.js.map +1 -1
- package/dist/modules/devices/services/module-reset.service.d.ts +3 -1
- package/dist/modules/devices/services/module-reset.service.js +21 -16
- package/dist/modules/devices/services/module-reset.service.js.map +1 -1
- package/dist/modules/devices/services/property-command-dispatch.service.d.ts +45 -0
- package/dist/modules/devices/services/property-command-dispatch.service.js +227 -0
- package/dist/modules/devices/services/property-command-dispatch.service.js.map +1 -0
- package/dist/modules/devices/services/property-command-window.service.d.ts +71 -0
- package/dist/modules/devices/services/property-command-window.service.js +204 -0
- package/dist/modules/devices/services/property-command-window.service.js.map +1 -0
- package/dist/modules/devices/services/property-command.service.d.ts +20 -3
- package/dist/modules/devices/services/property-command.service.js +56 -10
- package/dist/modules/devices/services/property-command.service.js.map +1 -1
- package/dist/modules/devices/services/property-state-coordinator.service.d.ts +4 -0
- package/dist/modules/devices/services/property-state-coordinator.service.js +35 -0
- package/dist/modules/devices/services/property-state-coordinator.service.js.map +1 -0
- package/dist/modules/devices/services/property-value.service.d.ts +1 -0
- package/dist/modules/devices/services/property-value.service.js +4 -0
- package/dist/modules/devices/services/property-value.service.js.map +1 -1
- package/dist/modules/platform/services/platform.service.d.ts +13 -4
- package/dist/modules/platform/services/platform.service.js +57 -35
- package/dist/modules/platform/services/platform.service.js.map +1 -1
- package/dist/modules/remote-access/dto/update-config.dto.js +5 -0
- package/dist/modules/remote-access/dto/update-config.dto.js.map +1 -1
- package/dist/modules/remote-access/validators/is-remote-access-url.validator.js +5 -2
- package/dist/modules/remote-access/validators/is-remote-access-url.validator.js.map +1 -1
- package/dist/modules/system/services/privileged-worker.service.d.ts +10 -0
- package/dist/modules/system/services/privileged-worker.service.js +137 -11
- package/dist/modules/system/services/privileged-worker.service.js.map +1 -1
- package/dist/modules/websocket/gateway/websocket.gateway.d.ts +4 -1
- package/dist/modules/websocket/gateway/websocket.gateway.js +28 -5
- package/dist/modules/websocket/gateway/websocket.gateway.js.map +1 -1
- package/dist/modules/websocket/services/command-acknowledgement-trace.service.d.ts +143 -0
- package/dist/modules/websocket/services/command-acknowledgement-trace.service.js +523 -0
- package/dist/modules/websocket/services/command-acknowledgement-trace.service.js.map +1 -0
- package/dist/modules/websocket/websocket.module.js +9 -1
- package/dist/modules/websocket/websocket.module.js.map +1 -1
- package/dist/plugins/devices-home-assistant/services/home-assistant.ws.service.js +2 -1
- package/dist/plugins/devices-home-assistant/services/home-assistant.ws.service.js.map +1 -1
- package/dist/plugins/devices-home-assistant/services/state-changed.event.service.js +2 -3
- package/dist/plugins/devices-home-assistant/services/state-changed.event.service.js.map +1 -1
- package/dist/plugins/devices-homekit/listeners/homekit-event.listener.js +6 -1
- package/dist/plugins/devices-homekit/listeners/homekit-event.listener.js.map +1 -1
- package/dist/plugins/devices-homekit/mappers/base.mapper.js +27 -4
- package/dist/plugins/devices-homekit/mappers/base.mapper.js.map +1 -1
- package/dist/plugins/devices-homekit/mappers/homekit-mapper.interface.d.ts +8 -0
- package/dist/plugins/devices-homekit/mappers/thermostat-coordinator.d.ts +7 -0
- package/dist/plugins/devices-homekit/mappers/thermostat-coordinator.js +84 -73
- package/dist/plugins/devices-homekit/mappers/thermostat-coordinator.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.d.ts +20 -1
- package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js +361 -119
- package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.d.ts +13 -1
- package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.js +109 -10
- package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.js +8 -11
- package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.js +2 -0
- package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/mappings/mapping-loader.service.js +4 -0
- package/dist/plugins/devices-shelly-ng/mappings/mapping-loader.service.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/services/device-manager.service.js +5 -0
- package/dist/plugins/devices-shelly-ng/services/device-manager.service.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/services/poll-placement-diagnostics.service.d.ts +29 -0
- package/dist/plugins/devices-shelly-ng/services/poll-placement-diagnostics.service.js +233 -0
- package/dist/plugins/devices-shelly-ng/services/poll-placement-diagnostics.service.js.map +1 -0
- package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.d.ts +12 -2
- package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js +81 -27
- package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/services/shelly-ws-server.service.d.ts +0 -1
- package/dist/plugins/devices-shelly-ng/services/shelly-ws-server.service.js +5 -12
- package/dist/plugins/devices-shelly-ng/services/shelly-ws-server.service.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/utils/transform.utils.d.ts +2 -0
- package/dist/plugins/devices-shelly-ng/utils/transform.utils.js +14 -1
- package/dist/plugins/devices-shelly-ng/utils/transform.utils.js.map +1 -1
- package/dist/plugins/remote-access-cloudflare-tunnel/controllers/setup.controller.d.ts +17 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/controllers/setup.controller.js +147 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/controllers/setup.controller.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/controllers/status.controller.d.ts +15 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/controllers/status.controller.js +98 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/controllers/status.controller.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/dto/update-config.dto.d.ts +9 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/dto/update-config.dto.js +94 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/dto/update-config.dto.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/models/config.model.d.ts +9 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/models/config.model.js +92 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/models/config.model.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/models/install.model.d.ts +7 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/models/install.model.js +48 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/models/install.model.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/models/status.model.d.ts +42 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/models/status.model.js +352 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/models/status.model.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.constants.d.ts +24 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.constants.js +27 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.constants.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.exceptions.d.ts +8 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.exceptions.js +19 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.exceptions.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.openapi.d.ts +4 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.openapi.js +20 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.openapi.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.plugin.d.ts +21 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.plugin.js +135 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.plugin.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/scripts/cloudflared-setup.sh +185 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-managed.service.d.ts +82 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-managed.service.js +507 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-managed.service.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-provider.service.d.ts +10 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-provider.service.js +37 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-provider.service.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-setup.service.d.ts +38 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-setup.service.js +147 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-setup.service.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-cli.service.d.ts +15 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-cli.service.js +67 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-cli.service.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-metrics.service.d.ts +8 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-metrics.service.js +46 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-metrics.service.js.map +1 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-process.service.d.ts +27 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-process.service.js +139 -0
- package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-process.service.js.map +1 -0
- package/dist/plugins/remote-access-tailscale/controllers/setup.controller.d.ts +1 -0
- package/dist/plugins/remote-access-tailscale/controllers/setup.controller.js +26 -10
- package/dist/plugins/remote-access-tailscale/controllers/setup.controller.js.map +1 -1
- package/dist/plugins/remote-access-tailscale/controllers/status.controller.d.ts +6 -1
- package/dist/plugins/remote-access-tailscale/controllers/status.controller.js +28 -3
- package/dist/plugins/remote-access-tailscale/controllers/status.controller.js.map +1 -1
- package/dist/plugins/remote-access-tailscale/models/status.model.d.ts +19 -0
- package/dist/plugins/remote-access-tailscale/models/status.model.js +158 -1
- package/dist/plugins/remote-access-tailscale/models/status.model.js.map +1 -1
- package/dist/plugins/remote-access-tailscale/remote-access-tailscale.constants.d.ts +2 -0
- package/dist/plugins/remote-access-tailscale/remote-access-tailscale.constants.js +3 -1
- package/dist/plugins/remote-access-tailscale/remote-access-tailscale.constants.js.map +1 -1
- package/dist/plugins/remote-access-tailscale/remote-access-tailscale.exceptions.d.ts +13 -0
- package/dist/plugins/remote-access-tailscale/remote-access-tailscale.exceptions.js +27 -0
- package/dist/plugins/remote-access-tailscale/remote-access-tailscale.exceptions.js.map +1 -0
- package/dist/plugins/remote-access-tailscale/remote-access-tailscale.openapi.d.ts +2 -2
- package/dist/plugins/remote-access-tailscale/remote-access-tailscale.openapi.js +2 -0
- package/dist/plugins/remote-access-tailscale/remote-access-tailscale.openapi.js.map +1 -1
- package/dist/plugins/remote-access-tailscale/remote-access-tailscale.plugin.js +1 -1
- package/dist/plugins/remote-access-tailscale/scripts/tailscale-setup.sh +61 -0
- package/dist/plugins/remote-access-tailscale/services/tailscale-cli.service.d.ts +9 -0
- package/dist/plugins/remote-access-tailscale/services/tailscale-cli.service.js +12 -0
- package/dist/plugins/remote-access-tailscale/services/tailscale-cli.service.js.map +1 -1
- package/dist/plugins/remote-access-tailscale/services/tailscale-login.service.d.ts +1 -0
- package/dist/plugins/remote-access-tailscale/services/tailscale-login.service.js +27 -2
- package/dist/plugins/remote-access-tailscale/services/tailscale-login.service.js.map +1 -1
- package/dist/plugins/remote-access-tailscale/services/tailscale-node-managed.service.d.ts +30 -1
- package/dist/plugins/remote-access-tailscale/services/tailscale-node-managed.service.js +300 -30
- package/dist/plugins/remote-access-tailscale/services/tailscale-node-managed.service.js.map +1 -1
- package/dist/plugins/remote-access-tailscale/services/tailscale-serve.service.d.ts +8 -3
- package/dist/plugins/remote-access-tailscale/services/tailscale-serve.service.js +39 -12
- package/dist/plugins/remote-access-tailscale/services/tailscale-serve.service.js.map +1 -1
- package/dist/plugins/remote-access-tailscale/services/tailscale-setup.service.d.ts +14 -5
- package/dist/plugins/remote-access-tailscale/services/tailscale-setup.service.js +51 -16
- package/dist/plugins/remote-access-tailscale/services/tailscale-setup.service.js.map +1 -1
- package/dist/plugins/scenes-local/platforms/local-scene.platform.d.ts +3 -1
- package/dist/plugins/scenes-local/platforms/local-scene.platform.js +12 -7
- package/dist/plugins/scenes-local/platforms/local-scene.platform.js.map +1 -1
- package/dist/plugins/spaces-home-control/services/climate-intent.service.d.ts +3 -1
- package/dist/plugins/spaces-home-control/services/climate-intent.service.js +6 -3
- package/dist/plugins/spaces-home-control/services/climate-intent.service.js.map +1 -1
- package/dist/plugins/spaces-home-control/services/covers-intent.service.d.ts +3 -1
- package/dist/plugins/spaces-home-control/services/covers-intent.service.js +6 -3
- package/dist/plugins/spaces-home-control/services/covers-intent.service.js.map +1 -1
- package/dist/plugins/spaces-home-control/services/lighting-intent.service.d.ts +3 -1
- package/dist/plugins/spaces-home-control/services/lighting-intent.service.js +7 -4
- package/dist/plugins/spaces-home-control/services/lighting-intent.service.js.map +1 -1
- package/dist/plugins/spaces-home-control/services/space-media-activity.service.d.ts +3 -1
- package/dist/plugins/spaces-home-control/services/space-media-activity.service.js +11 -5
- package/dist/plugins/spaces-home-control/services/space-media-activity.service.js.map +1 -1
- package/dist/plugins/spaces-home-control/services/space-undo-history.service.d.ts +3 -1
- package/dist/plugins/spaces-home-control/services/space-undo-history.service.js +8 -5
- package/dist/plugins/spaces-home-control/services/space-undo-history.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- 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":";;;;;;;;;;;;AAAA,2CAAsD;AACtD,2CAAkE;AAClE,6CAAgD;AAEhD,2FAAqF;AACrF,gGAA0F;AAC1F,kFAA8E;AAC9E,8DAA0D;AAC1D,2DAAoD;AACpD,kFAA6E;AAC7E,kEAA8D;AAC9D,qFAAgF;AAChF,wDAAoD;AACpD,yEAAqE;AACrE,8DAA0D;AAC1D,+EAAiE;AACjE,yGAAmG;AACnG,8DAA0D;AAC1D,sGAAgG;AAChG,qGAA+F;AAC/F,wDAAoD;AACpD,oEAAgE;AAEhE,2EAAuE;AACvE,6FAAwF;AACxF,iGAA4F;AAC5F,2FAAsF;AACtF,6GAAuG;AACvG,iHAA2G;AAC3G,yEAAqE;AACrE,2FAAsF;AACtF,2DAM6B;AAC7B,uDAAiE;AACjE,+DAAiE;AACjE,sEAAiE;AACjE,8DAMmC;AACnC,sFAAgF;AAChF,yFAAoF;AACpF,wDAA2D;AAC3D,+EAA0E;AAC1E,0FAAoF;AACpF,oFAA+E;AAC/E,gHAAyG;AACzG,wFAAmF;AACnF,kEAA8D;AAC9D,gGAA0F;AAC1F,wFAAmF;AACnF,wFAAkF;AAClF,8FAAwF;AACxF,4FAAsF;AACtF,oFAA+E;AAC/E,0EAAqE;AACrE,0EAAqE;AACrE,8EAAyE;AACzE,wFAAkF;AAClF,kFAA6E;AAC7E,gEAA4D;AAC5D,0EAAqE;AACrE,oFAA+E;AAC/E,kFAA6E;AAC7E,wFAAmF;AACnF,wFAAkF;AAClF,8GAAuG;AACvG,8EAAyE;AACzE,4DAAwD;AACxD,uGAAiG;AACjG,uFAAkF;AAClF,yGAAmG;AACnG,qGAA+F;AAC/F,qFAAgF;AAChF,0GAAoG;AACpG,4HAAqH;AACrH,wGAAkG;AAClG,gHAAyG;
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
561
|
-
|
|
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
|