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

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 (107) hide show
  1. package/dist/migrations/1000000000026-AddHardwareInputCategories.d.ts +7 -0
  2. package/dist/migrations/1000000000026-AddHardwareInputCategories.js +364 -0
  3. package/dist/migrations/1000000000026-AddHardwareInputCategories.js.map +1 -0
  4. package/dist/modules/devices/controllers/channels.controller.d.ts +5 -1
  5. package/dist/modules/devices/controllers/channels.controller.js +34 -2
  6. package/dist/modules/devices/controllers/channels.controller.js.map +1 -1
  7. package/dist/modules/devices/controllers/channels.properties.controller.js +5 -0
  8. package/dist/modules/devices/controllers/channels.properties.controller.js.map +1 -1
  9. package/dist/modules/devices/controllers/devices.channels.controller.d.ts +5 -1
  10. package/dist/modules/devices/controllers/devices.channels.controller.js +38 -2
  11. package/dist/modules/devices/controllers/devices.channels.controller.js.map +1 -1
  12. package/dist/modules/devices/controllers/devices.channels.properties.controller.js +5 -0
  13. package/dist/modules/devices/controllers/devices.channels.properties.controller.js.map +1 -1
  14. package/dist/modules/devices/devices.constants.d.ts +6 -0
  15. package/dist/modules/devices/devices.constants.js +6 -0
  16. package/dist/modules/devices/devices.constants.js.map +1 -1
  17. package/dist/modules/devices/devices.module.js +6 -0
  18. package/dist/modules/devices/devices.module.js.map +1 -1
  19. package/dist/modules/devices/devices.openapi.d.ts +3 -1
  20. package/dist/modules/devices/devices.openapi.js +7 -0
  21. package/dist/modules/devices/devices.openapi.js.map +1 -1
  22. package/dist/modules/devices/dto/channel-input-occurrence.dto.d.ts +10 -0
  23. package/dist/modules/devices/dto/channel-input-occurrence.dto.js +99 -0
  24. package/dist/modules/devices/dto/channel-input-occurrence.dto.js.map +1 -0
  25. package/dist/modules/devices/models/channel-input-capabilities.model.d.ts +20 -0
  26. package/dist/modules/devices/models/channel-input-capabilities.model.js +111 -0
  27. package/dist/modules/devices/models/channel-input-capabilities.model.js.map +1 -0
  28. package/dist/modules/devices/models/channel-input-occurrence.model.d.ts +22 -0
  29. package/dist/modules/devices/models/channel-input-occurrence.model.js +154 -0
  30. package/dist/modules/devices/models/channel-input-occurrence.model.js.map +1 -0
  31. package/dist/modules/devices/services/channel-input-deduplication.service.d.ts +17 -0
  32. package/dist/modules/devices/services/channel-input-deduplication.service.js +88 -0
  33. package/dist/modules/devices/services/channel-input-deduplication.service.js.map +1 -0
  34. package/dist/modules/devices/services/channel-input-occurrences.service.d.ts +21 -0
  35. package/dist/modules/devices/services/channel-input-occurrences.service.js +163 -0
  36. package/dist/modules/devices/services/channel-input-occurrences.service.js.map +1 -0
  37. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.d.ts +19 -3
  38. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js +515 -51
  39. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js.map +1 -1
  40. package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.d.ts +2 -0
  41. package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.js +10 -2
  42. package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.js.map +1 -1
  43. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.js +3 -2
  44. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.js.map +1 -1
  45. package/dist/plugins/devices-shelly-ng/mappings/definitions/inputs.yaml +80 -0
  46. package/dist/plugins/devices-shelly-ng/mappings/mapping-loader.service.js +7 -1
  47. package/dist/plugins/devices-shelly-ng/mappings/mapping-loader.service.js.map +1 -1
  48. package/dist/plugins/devices-shelly-ng/mappings/mapping.types.d.ts +6 -3
  49. package/dist/plugins/devices-shelly-ng/mappings/schema/mapping-schema.json +5 -0
  50. package/dist/plugins/devices-shelly-ng/services/device-manager.service.js +130 -7
  51. package/dist/plugins/devices-shelly-ng/services/device-manager.service.js.map +1 -1
  52. package/dist/plugins/devices-shelly-ng/services/poll-placement-diagnostics.service.d.ts +23 -4
  53. package/dist/plugins/devices-shelly-ng/services/poll-placement-diagnostics.service.js +296 -72
  54. package/dist/plugins/devices-shelly-ng/services/poll-placement-diagnostics.service.js.map +1 -1
  55. package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js +11 -7
  56. package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js.map +1 -1
  57. package/dist/plugins/devices-shelly-ng/services/shelly-rpc-client.service.js +3 -0
  58. package/dist/plugins/devices-shelly-ng/services/shelly-rpc-client.service.js.map +1 -1
  59. package/dist/plugins/devices-shelly-ng/services/shelly-ws-server.service.d.ts +1 -0
  60. package/dist/plugins/devices-shelly-ng/services/shelly-ws-server.service.js +13 -1
  61. package/dist/plugins/devices-shelly-ng/services/shelly-ws-server.service.js.map +1 -1
  62. package/dist/plugins/devices-shelly-v1/devices-shelly-v1.constants.d.ts +2 -0
  63. package/dist/plugins/devices-shelly-v1/devices-shelly-v1.constants.js +66 -4
  64. package/dist/plugins/devices-shelly-v1/devices-shelly-v1.constants.js.map +1 -1
  65. package/dist/plugins/devices-shelly-v1/devices-shelly-v1.plugin.js +2 -0
  66. package/dist/plugins/devices-shelly-v1/devices-shelly-v1.plugin.js.map +1 -1
  67. package/dist/plugins/devices-shelly-v1/platforms/shelly-v1.device.platform.js +7 -0
  68. package/dist/plugins/devices-shelly-v1/platforms/shelly-v1.device.platform.js.map +1 -1
  69. package/dist/plugins/devices-shelly-v1/services/device-mapper.service.d.ts +3 -1
  70. package/dist/plugins/devices-shelly-v1/services/device-mapper.service.js +20 -2
  71. package/dist/plugins/devices-shelly-v1/services/device-mapper.service.js.map +1 -1
  72. package/dist/plugins/devices-shelly-v1/services/shelly-v1-input-tracker.service.d.ts +16 -0
  73. package/dist/plugins/devices-shelly-v1/services/shelly-v1-input-tracker.service.js +107 -0
  74. package/dist/plugins/devices-shelly-v1/services/shelly-v1-input-tracker.service.js.map +1 -0
  75. package/dist/plugins/devices-shelly-v1/services/shelly-v1.service.d.ts +7 -1
  76. package/dist/plugins/devices-shelly-v1/services/shelly-v1.service.js +98 -3
  77. package/dist/plugins/devices-shelly-v1/services/shelly-v1.service.js.map +1 -1
  78. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.constants.d.ts +3 -0
  79. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.constants.js +41 -5
  80. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.constants.js.map +1 -1
  81. package/dist/plugins/devices-zigbee2mqtt/interfaces/zigbee2mqtt.interface.d.ts +7 -1
  82. package/dist/plugins/devices-zigbee2mqtt/mappings/config-driven.converter.js +16 -15
  83. package/dist/plugins/devices-zigbee2mqtt/mappings/config-driven.converter.js.map +1 -1
  84. package/dist/plugins/devices-zigbee2mqtt/mappings/definitions/remotes.yaml +505 -74
  85. package/dist/plugins/devices-zigbee2mqtt/mappings/schema/mapping-schema.json +3 -3
  86. package/dist/plugins/devices-zigbee2mqtt/mappings/transformers/transformer.types.d.ts +1 -1
  87. package/dist/plugins/devices-zigbee2mqtt/services/base-client-adapter.d.ts +8 -2
  88. package/dist/plugins/devices-zigbee2mqtt/services/base-client-adapter.js +6 -5
  89. package/dist/plugins/devices-zigbee2mqtt/services/base-client-adapter.js.map +1 -1
  90. package/dist/plugins/devices-zigbee2mqtt/services/device-adoption.service.js +18 -11
  91. package/dist/plugins/devices-zigbee2mqtt/services/device-adoption.service.js.map +1 -1
  92. package/dist/plugins/devices-zigbee2mqtt/services/device-mapper.service.d.ts +9 -3
  93. package/dist/plugins/devices-zigbee2mqtt/services/device-mapper.service.js +166 -3
  94. package/dist/plugins/devices-zigbee2mqtt/services/device-mapper.service.js.map +1 -1
  95. package/dist/plugins/devices-zigbee2mqtt/services/mqtt-client-adapter.service.js +5 -2
  96. package/dist/plugins/devices-zigbee2mqtt/services/mqtt-client-adapter.service.js.map +1 -1
  97. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt.service.d.ts +1 -0
  98. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt.service.js +44 -4
  99. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt.service.js.map +1 -1
  100. package/dist/spec/channels.d.ts +51 -1
  101. package/dist/spec/channels.js +64 -1
  102. package/dist/spec/channels.js.map +1 -1
  103. package/dist/spec/devices.d.ts +155 -2
  104. package/dist/spec/devices.js +161 -2
  105. package/dist/spec/devices.js.map +1 -1
  106. package/dist/tsconfig.build.tsbuildinfo +1 -1
  107. package/package.json +2 -2
@@ -11,30 +11,47 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.PollPlacementDiagnosticsService = void 0;
13
13
  const crypto_1 = require("crypto");
14
+ const fs_1 = require("fs");
14
15
  const promises_1 = require("fs/promises");
15
16
  const path_1 = require("path");
17
+ const perf_hooks_1 = require("perf_hooks");
16
18
  const common_1 = require("@nestjs/common");
17
19
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
18
- const MAX_DURATION_MS = 180_000;
20
+ const DEFAULT_DURATION_MS = 180_000;
21
+ const MAX_DURATION_MS = 360_000;
19
22
  const MAX_RECORDS = 64;
20
23
  const MAX_BYTES = 256 * 1024;
24
+ const OWNER_SUFFIX = '.owner.json';
25
+ class ExportOwnershipError extends Error {
26
+ constructor(message) {
27
+ super(message);
28
+ this.name = 'ExportOwnershipError';
29
+ }
30
+ }
21
31
  let PollPlacementDiagnosticsService = class PollPlacementDiagnosticsService {
22
32
  constructor() {
23
33
  this.processInstanceId = (0, crypto_1.randomUUID)();
24
- this.observerRuntimeHash = (0, crypto_1.createHash)('sha256').update('poll-placement-diagnostics-v1').digest('hex');
34
+ this.observerRuntimeHash = this.computeRuntimeHash();
25
35
  this.delegateObservations = new Map();
26
36
  this.snapshot = null;
27
37
  this.writePending = false;
28
- this.writeQueued = false;
38
+ this.publishRequested = false;
39
+ this.writePromise = null;
29
40
  this.destroyed = false;
41
+ this.ownershipAcquired = false;
42
+ this.expiryTimer = null;
30
43
  this.cycleSequence = 0;
31
44
  this.config = this.parseConfig(process.env.FB_SHELLY_POLL_PLACEMENT);
45
+ this.ownerPath = this.config ? this.config.exportPath + OWNER_SUFFIX : null;
32
46
  if (this.config) {
33
47
  const now = this.now();
48
+ const nowUtc = this.utcNow();
34
49
  this.snapshot = {
35
50
  schemaVersion: 1,
36
51
  runId: this.config.runId,
37
52
  status: 'armed',
53
+ candidateStatus: 'invalidated',
54
+ candidateReason: 'awaiting-cycle',
38
55
  configFingerprint: (0, crypto_1.createHash)('sha256').update(JSON.stringify(this.config)).digest('hex'),
39
56
  processInstanceId: this.processInstanceId,
40
57
  processId: process.pid,
@@ -42,63 +59,106 @@ let PollPlacementDiagnosticsService = class PollPlacementDiagnosticsService {
42
59
  observerRuntimeHash: this.observerRuntimeHash,
43
60
  backendClock: 'performance-now-v1',
44
61
  armedAtMonotonicMs: now,
62
+ armedAtUtc: nowUtc,
45
63
  expiresAtMonotonicMs: now + this.config.durationMs,
46
64
  sequence: 0,
47
65
  observations: [],
48
66
  };
67
+ this.expiryTimer = setTimeout(() => this.expireIfNeeded(), this.config.durationMs);
68
+ this.expiryTimer.unref?.();
49
69
  void this.publish();
50
70
  }
51
71
  }
52
- onModuleDestroy() {
53
- this.destroyed = true;
54
- if (this.snapshot && (this.snapshot.status === 'armed' || this.snapshot.status === 'ready')) {
72
+ async onModuleDestroy() {
73
+ if (this.expiryTimer) {
74
+ clearTimeout(this.expiryTimer);
75
+ this.expiryTimer = null;
76
+ }
77
+ if (this.snapshot && this.isActive()) {
55
78
  this.snapshot.status = 'invalidated';
56
79
  this.snapshot.reason = 'process-shutdown';
57
- void this.publish();
80
+ await this.publish();
81
+ }
82
+ else {
83
+ const pending = this.writePromise;
84
+ if (pending !== null)
85
+ await pending;
58
86
  }
87
+ this.destroyed = true;
59
88
  }
60
89
  isEnabled() {
61
- return this.snapshot !== null && !this.destroyed;
90
+ this.expireIfNeeded();
91
+ return this.snapshot !== null && !this.destroyed && this.isActive();
62
92
  }
63
93
  observeDelegate(observation) {
64
- if (!this.snapshot || this.destroyed)
94
+ if (!this.snapshot || this.destroyed || !this.isActive())
65
95
  return;
96
+ const previous = this.delegateObservations.get(observation.delegateId);
66
97
  this.delegateObservations.set(observation.delegateId, observation);
98
+ if (previous &&
99
+ (previous.sourceDeviceId === this.snapshot.sourceDeviceId ||
100
+ observation.sourceDeviceId === this.snapshot.sourceDeviceId) &&
101
+ (previous.sourceDeviceId !== observation.sourceDeviceId ||
102
+ previous.generation !== observation.generation ||
103
+ observation.connected !== true)) {
104
+ this.invalidateCandidate('target-delegate-changed');
105
+ }
106
+ }
107
+ removeDelegate(delegateId) {
108
+ const previous = this.delegateObservations.get(delegateId);
109
+ this.delegateObservations.delete(delegateId);
110
+ if (previous?.sourceDeviceId === this.snapshot?.sourceDeviceId)
111
+ this.invalidateCandidate('target-delegate-removed');
67
112
  }
68
113
  invalidate(reason) {
69
- if (!this.snapshot || this.snapshot.status === 'invalidated')
114
+ if (!this.snapshot || this.destroyed || !this.isActive())
70
115
  return;
71
116
  this.snapshot.status = 'invalidated';
72
117
  this.snapshot.reason = reason;
73
118
  void this.publish();
74
119
  }
75
- observeCycle(generation, intervalMs, delegates) {
76
- const snapshot = this.snapshot;
77
- if (!snapshot || this.destroyed || (snapshot.status !== 'armed' && snapshot.status !== 'ready'))
78
- return;
79
- if (this.now() >= snapshot.expiresAtMonotonicMs) {
80
- snapshot.status = 'expired';
81
- snapshot.reason = 'diagnostic-expired';
82
- void this.publish();
120
+ invalidateCandidate(reason) {
121
+ if (!this.snapshot || this.destroyed || !this.isActive())
83
122
  return;
123
+ this.snapshot.candidateStatus = 'invalidated';
124
+ this.snapshot.candidateReason = reason;
125
+ this.snapshot.sequence++;
126
+ void this.publish();
127
+ }
128
+ observeCycle(generation, intervalMs, delegates, activePollCount = 0, concurrencyCap = 10, inFlightDelegates = [], schedulerState = 'started') {
129
+ const snapshot = this.snapshot;
130
+ if (!snapshot || this.destroyed || !this.isActive())
131
+ return null;
132
+ if (!Number.isInteger(generation) || !Number.isInteger(intervalMs) || intervalMs < 1 || delegates.length === 0) {
133
+ return null;
84
134
  }
85
- if (!Number.isInteger(generation) || !Number.isInteger(intervalMs) || intervalMs < 1 || delegates.length === 0)
86
- return;
135
+ const cycleEntryMonotonicMs = this.now();
136
+ const cycleEntryUtc = this.utcNow();
137
+ const registrationBeforeMs = this.now();
138
+ const registrationBeforeUtc = this.utcNow();
87
139
  const ordered = delegates.slice();
88
- const targetMatches = ordered.filter((id) => this.delegateObservations.get(id)?.sourceDeviceId === snapshot.sourceDeviceId);
140
+ const targetMatches = ordered.filter((id) => {
141
+ const delegate = this.delegateObservations.get(id);
142
+ return delegate?.sourceDeviceId === snapshot.sourceDeviceId && delegate.connected === true;
143
+ });
89
144
  const targetIndex = targetMatches.length === 1 ? ordered.indexOf(targetMatches[0]) : -1;
90
145
  const targetId = targetIndex >= 0 ? ordered[targetIndex] : null;
91
146
  const target = targetId ? this.delegateObservations.get(targetId) : undefined;
92
- const delayMs = targetId ? Math.floor((targetIndex * intervalMs) / ordered.length) : null;
93
- const before = this.now();
94
- const after = this.now();
147
+ const cycleSequence = ++this.cycleSequence;
148
+ snapshot.candidateStatus = targetId === null ? 'invalidated' : 'valid';
149
+ snapshot.candidateReason = targetId === null ? 'target-unresolved' : undefined;
95
150
  snapshot.observations.push({
96
- cycleSequence: ++this.cycleSequence,
151
+ cycleSequence,
97
152
  generation,
98
153
  intervalMs,
99
- anchorMonotonicMs: before,
154
+ anchorMonotonicMs: cycleEntryMonotonicMs,
155
+ anchorUtc: cycleEntryUtc,
100
156
  connectedDelegateCount: ordered.length,
101
157
  delegateOrderFingerprint: (0, crypto_1.createHash)('sha256').update(ordered.join('\n')).digest('hex'),
158
+ activePollCount,
159
+ concurrencyCap,
160
+ targetInFlight: targetId !== null && inFlightDelegates.includes(targetId),
161
+ schedulerState,
102
162
  target: {
103
163
  delegateId: targetId,
104
164
  slotIndex: targetId ? targetIndex : null,
@@ -106,31 +166,36 @@ let PollPlacementDiagnosticsService = class PollPlacementDiagnosticsService {
106
166
  generation: target?.generation ?? null,
107
167
  decision: 'unresolved',
108
168
  skipReason: targetId ? 'slot-pending' : 'target-unresolved',
109
- delayMs,
110
- registrationBeforeMs: before,
111
- registrationAfterMs: after,
169
+ delayMs: targetId ? Math.floor((targetIndex * intervalMs) / ordered.length) : null,
170
+ registrationBeforeMs,
171
+ registrationBeforeUtc,
172
+ registrationAfterMs: null,
173
+ registrationAfterUtc: null,
112
174
  },
113
175
  });
114
176
  snapshot.sequence++;
115
177
  snapshot.status = 'ready';
116
- if (snapshot.observations.length > MAX_RECORDS || Buffer.byteLength(JSON.stringify(snapshot)) > MAX_BYTES) {
117
- snapshot.status = 'overflow';
118
- snapshot.reason = 'observation-bound-exceeded';
119
- snapshot.observations = snapshot.observations.slice(0, MAX_RECORDS);
120
- }
178
+ this.enforceBounds();
121
179
  void this.publish();
180
+ return cycleSequence;
122
181
  }
123
- observeSlot(delegateId, generation, decision, skipReason) {
182
+ completeCycleRegistration(cycleSequence) {
124
183
  const snapshot = this.snapshot;
125
- if (!snapshot || this.destroyed || (snapshot.status !== 'armed' && snapshot.status !== 'ready'))
184
+ if (!snapshot || this.destroyed || !this.isActive())
126
185
  return;
127
- if (this.now() >= snapshot.expiresAtMonotonicMs) {
128
- snapshot.status = 'expired';
129
- snapshot.reason = 'diagnostic-expired';
130
- void this.publish();
186
+ const observation = snapshot.observations.find((candidate) => candidate.cycleSequence === cycleSequence);
187
+ if (!observation)
131
188
  return;
132
- }
133
- const observation = snapshot.observations.at(-1);
189
+ observation.target.registrationAfterMs = this.now();
190
+ observation.target.registrationAfterUtc = this.utcNow();
191
+ snapshot.sequence++;
192
+ void this.publish();
193
+ }
194
+ observeSlot(delegateId, generation, cycleSequence, decision, skipReason) {
195
+ const snapshot = this.snapshot;
196
+ if (!snapshot || this.destroyed || !this.isActive())
197
+ return;
198
+ const observation = snapshot.observations.find((candidate) => candidate.cycleSequence === cycleSequence);
134
199
  if (!observation || observation.generation !== generation || observation.target.delegateId !== delegateId)
135
200
  return;
136
201
  observation.target.decision = decision;
@@ -138,6 +203,26 @@ let PollPlacementDiagnosticsService = class PollPlacementDiagnosticsService {
138
203
  snapshot.sequence++;
139
204
  void this.publish();
140
205
  }
206
+ isActive() {
207
+ return this.snapshot?.status === 'armed' || this.snapshot?.status === 'ready';
208
+ }
209
+ expireIfNeeded() {
210
+ if (!this.snapshot || this.destroyed || !this.isActive() || this.now() < this.snapshot.expiresAtMonotonicMs)
211
+ return;
212
+ this.snapshot.status = 'expired';
213
+ this.snapshot.reason = 'diagnostic-expired';
214
+ void this.publish();
215
+ }
216
+ enforceBounds() {
217
+ if (!this.snapshot)
218
+ return;
219
+ if (this.snapshot.observations.length <= MAX_RECORDS &&
220
+ Buffer.byteLength(JSON.stringify(this.snapshot)) <= MAX_BYTES)
221
+ return;
222
+ this.snapshot.status = 'overflow';
223
+ this.snapshot.reason = 'observation-bound-exceeded';
224
+ this.snapshot.observations = this.snapshot.observations.slice(0, MAX_RECORDS);
225
+ }
141
226
  parseConfig(raw) {
142
227
  if (!raw)
143
228
  return null;
@@ -151,7 +236,7 @@ let PollPlacementDiagnosticsService = class PollPlacementDiagnosticsService {
151
236
  return null;
152
237
  if (typeof value.exportPath !== 'string' || !value.exportPath.startsWith('/') || value.exportPath.includes('\0'))
153
238
  return null;
154
- const durationMs = value.durationMs === undefined ? 180_000 : value.durationMs;
239
+ const durationMs = value.durationMs === undefined ? DEFAULT_DURATION_MS : value.durationMs;
155
240
  if (typeof durationMs !== 'number' ||
156
241
  !Number.isInteger(durationMs) ||
157
242
  durationMs < 1000 ||
@@ -172,55 +257,194 @@ let PollPlacementDiagnosticsService = class PollPlacementDiagnosticsService {
172
257
  return null;
173
258
  }
174
259
  }
260
+ computeRuntimeHash() {
261
+ try {
262
+ return (0, crypto_1.createHash)('sha256').update((0, fs_1.readFileSync)(__filename)).digest('hex');
263
+ }
264
+ catch {
265
+ return (0, crypto_1.createHash)('sha256').update(__filename).digest('hex');
266
+ }
267
+ }
175
268
  now() {
176
- return Number(process.hrtime.bigint()) / 1_000_000;
269
+ return perf_hooks_1.performance.now();
177
270
  }
178
- async publish() {
179
- if (!this.snapshot || !this.config)
271
+ utcNow() {
272
+ return new Date().toISOString();
273
+ }
274
+ ownerRecord() {
275
+ return {
276
+ schemaVersion: 1,
277
+ runId: this.snapshot.runId,
278
+ processInstanceId: this.processInstanceId,
279
+ processId: process.pid,
280
+ configFingerprint: this.snapshot.configFingerprint,
281
+ };
282
+ }
283
+ async acquireOwnership() {
284
+ if (this.ownershipAcquired)
180
285
  return;
181
- if (this.writePending) {
182
- this.writeQueued = true;
286
+ if (!this.config || !this.ownerPath || !this.snapshot)
287
+ throw new ExportOwnershipError('diagnostic is disabled');
288
+ const directory = (0, path_1.dirname)(this.config.exportPath);
289
+ await (0, promises_1.mkdir)(directory, { recursive: true, mode: 0o700 });
290
+ const directoryStat = await (0, promises_1.lstat)(directory);
291
+ if (!directoryStat.isDirectory())
292
+ throw new ExportOwnershipError('export parent is not a directory');
293
+ if ((directoryStat.mode & 0o077) !== 0)
294
+ throw new ExportOwnershipError('export parent is not owner-only');
295
+ const existingOutput = await this.lstatIfExists(this.config.exportPath);
296
+ if (existingOutput?.isSymbolicLink())
297
+ throw new ExportOwnershipError('export output is a symlink');
298
+ if (existingOutput)
299
+ throw new ExportOwnershipError('export output already exists');
300
+ let ownerHandle;
301
+ try {
302
+ ownerHandle = await (0, promises_1.open)(this.ownerPath, 'wx', 0o600);
303
+ }
304
+ catch (error) {
305
+ if (error.code === 'EEXIST') {
306
+ throw new ExportOwnershipError('owner record already exists');
307
+ }
308
+ throw error;
309
+ }
310
+ try {
311
+ await ownerHandle.writeFile(`${JSON.stringify(this.ownerRecord())}\n`);
312
+ await ownerHandle.sync();
313
+ }
314
+ finally {
315
+ await ownerHandle.close();
316
+ }
317
+ await this.syncDirectory(directory);
318
+ this.ownershipAcquired = true;
319
+ }
320
+ async assertOwnership(requireOutput) {
321
+ if (!this.config || !this.ownerPath || !this.snapshot || !this.ownershipAcquired)
322
+ throw new ExportOwnershipError('export ownership is not acquired');
323
+ const directoryStat = await (0, promises_1.lstat)((0, path_1.dirname)(this.config.exportPath));
324
+ if (!directoryStat.isDirectory())
325
+ throw new ExportOwnershipError('export parent is not a directory');
326
+ if ((directoryStat.mode & 0o077) !== 0)
327
+ throw new ExportOwnershipError('export parent is not owner-only');
328
+ const ownerStat = await (0, promises_1.lstat)(this.ownerPath);
329
+ if (ownerStat.isSymbolicLink())
330
+ throw new ExportOwnershipError('owner record is a symlink');
331
+ if ((ownerStat.mode & 0o177) !== 0)
332
+ throw new ExportOwnershipError('owner record is not owner-only');
333
+ const ownerHandle = await (0, promises_1.open)(this.ownerPath, 'r');
334
+ let owner;
335
+ try {
336
+ owner = JSON.parse(await ownerHandle.readFile('utf8'));
337
+ }
338
+ finally {
339
+ await ownerHandle.close();
340
+ }
341
+ if (JSON.stringify(owner) !== JSON.stringify(this.ownerRecord()))
342
+ throw new ExportOwnershipError('export ownership changed');
343
+ const outputStat = await this.lstatIfExists(this.config.exportPath);
344
+ if (!outputStat) {
345
+ if (requireOutput)
346
+ throw new ExportOwnershipError('export output is missing');
183
347
  return;
184
348
  }
349
+ if (outputStat.isSymbolicLink())
350
+ throw new ExportOwnershipError('export output is a symlink');
351
+ if ((outputStat.mode & 0o177) !== 0)
352
+ throw new ExportOwnershipError('export output is not owner-only');
353
+ const outputHandle = await (0, promises_1.open)(this.config.exportPath, 'r');
354
+ let current;
355
+ try {
356
+ current = JSON.parse(await outputHandle.readFile('utf8'));
357
+ }
358
+ finally {
359
+ await outputHandle.close();
360
+ }
361
+ const expected = this.ownerRecord();
362
+ if (current.runId !== expected.runId ||
363
+ current.processInstanceId !== expected.processInstanceId ||
364
+ current.configFingerprint !== expected.configFingerprint) {
365
+ throw new ExportOwnershipError('export output belongs to another session');
366
+ }
367
+ }
368
+ async syncDirectory(directory) {
369
+ const handle = await (0, promises_1.open)(directory, 'r');
370
+ try {
371
+ await handle.sync();
372
+ }
373
+ finally {
374
+ await handle.close();
375
+ }
376
+ }
377
+ async lstatIfExists(path) {
378
+ try {
379
+ return await (0, promises_1.lstat)(path);
380
+ }
381
+ catch (error) {
382
+ if (error.code === 'ENOENT')
383
+ return null;
384
+ throw error;
385
+ }
386
+ }
387
+ publish() {
388
+ if (!this.snapshot || !this.config)
389
+ return Promise.resolve();
390
+ this.publishRequested = true;
391
+ if (this.writePending)
392
+ return this.writePromise ?? Promise.resolve();
185
393
  this.writePending = true;
394
+ this.writePromise = this.flushPublish();
395
+ return this.writePromise;
396
+ }
397
+ async flushPublish() {
398
+ try {
399
+ do {
400
+ this.publishRequested = false;
401
+ await this.writeSnapshot();
402
+ } while (this.publishRequested && this.snapshot?.status !== 'writer-failure');
403
+ }
404
+ finally {
405
+ this.writePending = false;
406
+ this.writePromise = null;
407
+ }
408
+ }
409
+ async writeSnapshot() {
410
+ if (!this.snapshot || !this.config)
411
+ return;
186
412
  let temporary = null;
187
413
  let temporaryCreated = false;
188
414
  try {
189
- await (0, promises_1.mkdir)((0, path_1.dirname)(this.config.exportPath), { recursive: true, mode: 0o700 });
415
+ await this.acquireOwnership();
416
+ await this.assertOwnership(false);
190
417
  temporary = this.config.exportPath + '.tmp-' + process.pid + '-' + this.snapshot.sequence;
191
- const body = JSON.stringify(this.snapshot) + '\n';
192
- await (0, promises_1.writeFile)(temporary, body, { mode: 0o600, flag: 'wx' });
418
+ await (0, promises_1.writeFile)(temporary, JSON.stringify(this.snapshot) + '\n', { mode: 0o600, flag: 'wx' });
193
419
  temporaryCreated = true;
194
420
  const handle = await (0, promises_1.open)(temporary, 'r');
195
421
  try {
196
422
  await handle.sync();
197
423
  }
198
- catch (error) {
199
- try {
200
- await handle.close();
201
- }
202
- catch {
203
- }
204
- throw error;
424
+ finally {
425
+ await handle.close();
205
426
  }
206
- await handle.close();
207
- await (0, promises_1.rename)(temporary, this.config.exportPath);
208
- await (0, promises_1.stat)(this.config.exportPath);
427
+ const outputExists = (await this.lstatIfExists(this.config.exportPath)) !== null;
428
+ if (outputExists) {
429
+ await this.assertOwnership(true);
430
+ await (0, promises_1.rename)(temporary, this.config.exportPath);
431
+ temporaryCreated = false;
432
+ }
433
+ else {
434
+ await (0, promises_1.link)(temporary, this.config.exportPath);
435
+ await (0, promises_1.unlink)(temporary);
436
+ temporaryCreated = false;
437
+ }
438
+ await this.syncDirectory((0, path_1.dirname)(this.config.exportPath));
439
+ await this.assertOwnership(true);
209
440
  }
210
- catch {
211
- if (temporaryCreated && temporary !== null) {
441
+ catch (error) {
442
+ if (temporaryCreated && temporary !== null)
212
443
  await (0, promises_1.unlink)(temporary).catch(() => undefined);
213
- }
214
444
  if (this.snapshot) {
215
445
  this.snapshot.status = 'writer-failure';
216
- this.snapshot.reason = 'export-write-failed';
217
- }
218
- }
219
- finally {
220
- this.writePending = false;
221
- if (this.writeQueued) {
222
- this.writeQueued = false;
223
- void this.publish();
446
+ this.snapshot.reason =
447
+ error instanceof ExportOwnershipError ? 'export-ownership-failed' : 'export-write-failed';
224
448
  }
225
449
  }
226
450
  }
@@ -1 +1 @@
1
- {"version":3,"file":"poll-placement-diagnostics.service.js","sourceRoot":"","sources":["../../../../src/plugins/devices-shelly-ng/services/poll-placement-diagnostics.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"poll-placement-diagnostics.service.js","sourceRoot":"","sources":["../../../../src/plugins/devices-shelly-ng/services/poll-placement-diagnostics.service.ts"],"names":[],"mappings":"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"}
@@ -296,7 +296,7 @@ let ShellyNgService = ShellyNgService_1 = class ShellyNgService extends base_man
296
296
  this.discoveryQueue.length = 0;
297
297
  this.discoveryGeneration++;
298
298
  this.processingDiscovery = false;
299
- this.delegatesRegistryService.detach();
299
+ await this.delegatesRegistryService.detach();
300
300
  try {
301
301
  const devices = await this.devicesService.findAll(devices_shelly_ng_constants_1.DEVICES_SHELLY_NG_TYPE);
302
302
  for (const device of devices) {
@@ -424,7 +424,7 @@ let ShellyNgService = ShellyNgService_1 = class ShellyNgService extends base_man
424
424
  }
425
425
  }
426
426
  startStatusPoll() {
427
- this.stopStatusPoll(false);
427
+ this.stopStatusPoll(this.state === 'started');
428
428
  const intervalSec = this.config.statusPollInterval;
429
429
  if (intervalSec <= 0) {
430
430
  this.logger.log('Status polling disabled (interval = 0)');
@@ -449,11 +449,13 @@ let ShellyNgService = ShellyNgService_1 = class ShellyNgService extends base_man
449
449
  return;
450
450
  }
451
451
  const delegates = this.delegatesRegistryService.getConnectedDelegateIds().slice().sort();
452
- this.pollPlacementDiagnostics.observeCycle(generation, intervalMs, delegates);
452
+ const cycleSequence = this.pollPlacementDiagnostics.observeCycle(generation, intervalMs, delegates, this.statusPollActive, ShellyNgService_1.STATUS_POLL_CONCURRENCY, Array.from(this.statusPollInFlight), this.state === 'starting' ? 'starting' : 'started');
453
453
  for (const [index, delegateId] of delegates.entries()) {
454
454
  const delay = Math.floor((index * intervalMs) / delegates.length);
455
- this.scheduleStatusPollTimeout(() => this.runStatusPollSlot(delegateId, generation), delay);
455
+ this.scheduleStatusPollTimeout(() => this.runStatusPollSlot(delegateId, generation, cycleSequence), delay);
456
456
  }
457
+ if (cycleSequence !== null)
458
+ this.pollPlacementDiagnostics.completeCycleRegistration(cycleSequence);
457
459
  this.statusPollTimer = this.scheduleStatusPollTimeout(() => this.scheduleStatusPollCycle(intervalMs, generation), intervalMs);
458
460
  }
459
461
  scheduleStatusPollTimeout(callback, delayMs) {
@@ -464,12 +466,12 @@ let ShellyNgService = ShellyNgService_1 = class ShellyNgService extends base_man
464
466
  this.statusPollTimers.add(timer);
465
467
  return timer;
466
468
  }
467
- runStatusPollSlot(delegateId, generation) {
469
+ runStatusPollSlot(delegateId, generation, cycleSequence) {
468
470
  if (this.state !== 'started' ||
469
471
  generation !== this.statusPollGeneration ||
470
472
  this.statusPollActive >= ShellyNgService_1.STATUS_POLL_CONCURRENCY ||
471
473
  this.statusPollInFlight.has(delegateId)) {
472
- this.pollPlacementDiagnostics.observeSlot(delegateId, generation, 'skipped', this.state !== 'started'
474
+ this.pollPlacementDiagnostics.observeSlot(delegateId, generation, cycleSequence ?? -1, 'skipped', this.state !== 'started'
473
475
  ? 'lifecycle-inactive'
474
476
  : generation !== this.statusPollGeneration
475
477
  ? 'generation-changed'
@@ -478,7 +480,9 @@ let ShellyNgService = ShellyNgService_1 = class ShellyNgService extends base_man
478
480
  : 'delegate-in-flight');
479
481
  return;
480
482
  }
481
- this.pollPlacementDiagnostics.observeSlot(delegateId, generation, 'dispatch-attempt');
483
+ if (cycleSequence !== null) {
484
+ this.pollPlacementDiagnostics.observeSlot(delegateId, generation, cycleSequence, 'dispatch-attempt');
485
+ }
482
486
  this.statusPollActive++;
483
487
  this.statusPollInFlight.add(delegateId);
484
488
  void this.delegatesRegistryService