@matter/node 0.16.0-alpha.0-20251115-d89e62680 → 0.16.0-alpha.0-20251129-96ad07c6e
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/cjs/behavior/Events.js +1 -1
- package/dist/cjs/behavior/cluster/ClientBehavior.d.ts +1 -1
- package/dist/cjs/behavior/cluster/ClusterBehavior.d.ts +1 -1
- package/dist/cjs/behavior/cluster/ClusterBehaviorType.d.ts +1 -1
- package/dist/cjs/behavior/cluster/ClusterBehaviorType.js +3 -3
- package/dist/cjs/behavior/cluster/ClusterBehaviorType.js.map +1 -1
- package/dist/cjs/behavior/state/validation/ValueValidator.js +14 -4
- package/dist/cjs/behavior/state/validation/ValueValidator.js.map +1 -1
- package/dist/cjs/behavior/state/validation/assertions.d.ts.map +1 -1
- package/dist/cjs/behavior/state/validation/assertions.js +21 -0
- package/dist/cjs/behavior/state/validation/assertions.js.map +1 -1
- package/dist/cjs/behavior/system/commissioning/CommissioningClient.d.ts.map +1 -1
- package/dist/cjs/behavior/system/commissioning/CommissioningClient.js +1 -3
- package/dist/cjs/behavior/system/commissioning/CommissioningClient.js.map +1 -1
- package/dist/cjs/behavior/system/controller/ControllerBehavior.d.ts +2 -0
- package/dist/cjs/behavior/system/controller/ControllerBehavior.d.ts.map +1 -1
- package/dist/cjs/behavior/system/controller/ControllerBehavior.js +5 -2
- package/dist/cjs/behavior/system/controller/ControllerBehavior.js.map +1 -1
- package/dist/cjs/behavior/system/network/ServerNetworkRuntime.d.ts +1 -0
- package/dist/cjs/behavior/system/network/ServerNetworkRuntime.d.ts.map +1 -1
- package/dist/cjs/behavior/system/network/ServerNetworkRuntime.js +8 -2
- package/dist/cjs/behavior/system/network/ServerNetworkRuntime.js.map +1 -1
- package/dist/cjs/behaviors/general-diagnostics/GeneralDiagnosticsServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/general-diagnostics/GeneralDiagnosticsServer.js +88 -34
- package/dist/cjs/behaviors/general-diagnostics/GeneralDiagnosticsServer.js.map +1 -1
- package/dist/cjs/behaviors/group-key-management/GroupKeyManagementServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/group-key-management/GroupKeyManagementServer.js +15 -2
- package/dist/cjs/behaviors/group-key-management/GroupKeyManagementServer.js.map +1 -1
- package/dist/cjs/behaviors/identify/IdentifyServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/identify/IdentifyServer.js +5 -0
- package/dist/cjs/behaviors/identify/IdentifyServer.js.map +1 -1
- package/dist/cjs/behaviors/service-area/ServiceAreaServer.js +1 -1
- package/dist/cjs/behaviors/switch/SwitchServer.js +2 -2
- package/dist/cjs/behaviors/thermostat/ThermostatServer.d.ts +10 -0
- package/dist/cjs/behaviors/thermostat/ThermostatServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/thermostat/ThermostatServer.js +59 -22
- package/dist/cjs/behaviors/thermostat/ThermostatServer.js.map +1 -1
- package/dist/cjs/endpoint/Endpoint.d.ts +2 -2
- package/dist/cjs/endpoint/Endpoint.d.ts.map +1 -1
- package/dist/cjs/endpoint/properties/Endpoints.d.ts +2 -2
- package/dist/cjs/endpoint/properties/Endpoints.d.ts.map +1 -1
- package/dist/cjs/endpoint/properties/Endpoints.js +12 -1
- package/dist/cjs/endpoint/properties/Endpoints.js.map +1 -1
- package/dist/cjs/node/ClientNode.d.ts +7 -2
- package/dist/cjs/node/ClientNode.d.ts.map +1 -1
- package/dist/cjs/node/ClientNode.js +10 -3
- package/dist/cjs/node/ClientNode.js.map +1 -1
- package/dist/cjs/node/Node.d.ts.map +1 -1
- package/dist/cjs/node/Node.js +9 -3
- package/dist/cjs/node/Node.js.map +1 -1
- package/dist/cjs/node/NodeLifecycle.d.ts +1 -1
- package/dist/cjs/node/NodeLifecycle.js +1 -1
- package/dist/cjs/node/ServerNode.d.ts.map +1 -1
- package/dist/cjs/node/ServerNode.js +11 -4
- package/dist/cjs/node/ServerNode.js.map +1 -1
- package/dist/cjs/node/client/ClientEndpointInitializer.js +1 -1
- package/dist/cjs/node/client/ClientEndpointInitializer.js.map +1 -1
- package/dist/cjs/node/client/ClientEventEmitter.d.ts.map +1 -1
- package/dist/cjs/node/client/ClientEventEmitter.js +8 -3
- package/dist/cjs/node/client/ClientEventEmitter.js.map +1 -1
- package/dist/cjs/node/client/ClientStructure.d.ts.map +1 -1
- package/dist/cjs/node/client/ClientStructure.js +80 -96
- package/dist/cjs/node/client/ClientStructure.js.map +1 -1
- package/dist/cjs/node/client/Peers.d.ts.map +1 -1
- package/dist/cjs/node/client/Peers.js +22 -4
- package/dist/cjs/node/client/Peers.js.map +1 -1
- package/dist/cjs/node/server/ServerEnvironment.d.ts.map +1 -1
- package/dist/cjs/node/server/ServerEnvironment.js +0 -3
- package/dist/cjs/node/server/ServerEnvironment.js.map +1 -1
- package/dist/esm/behavior/Events.js +1 -1
- package/dist/esm/behavior/cluster/ClientBehavior.d.ts +1 -1
- package/dist/esm/behavior/cluster/ClusterBehavior.d.ts +1 -1
- package/dist/esm/behavior/cluster/ClusterBehaviorType.d.ts +1 -1
- package/dist/esm/behavior/cluster/ClusterBehaviorType.js +3 -3
- package/dist/esm/behavior/cluster/ClusterBehaviorType.js.map +1 -1
- package/dist/esm/behavior/state/validation/ValueValidator.js +14 -4
- package/dist/esm/behavior/state/validation/ValueValidator.js.map +1 -1
- package/dist/esm/behavior/state/validation/assertions.d.ts.map +1 -1
- package/dist/esm/behavior/state/validation/assertions.js +22 -1
- package/dist/esm/behavior/state/validation/assertions.js.map +1 -1
- package/dist/esm/behavior/system/commissioning/CommissioningClient.d.ts.map +1 -1
- package/dist/esm/behavior/system/commissioning/CommissioningClient.js +1 -3
- package/dist/esm/behavior/system/commissioning/CommissioningClient.js.map +1 -1
- package/dist/esm/behavior/system/controller/ControllerBehavior.d.ts +2 -0
- package/dist/esm/behavior/system/controller/ControllerBehavior.d.ts.map +1 -1
- package/dist/esm/behavior/system/controller/ControllerBehavior.js +5 -2
- package/dist/esm/behavior/system/controller/ControllerBehavior.js.map +1 -1
- package/dist/esm/behavior/system/network/ServerNetworkRuntime.d.ts +1 -0
- package/dist/esm/behavior/system/network/ServerNetworkRuntime.d.ts.map +1 -1
- package/dist/esm/behavior/system/network/ServerNetworkRuntime.js +8 -2
- package/dist/esm/behavior/system/network/ServerNetworkRuntime.js.map +1 -1
- package/dist/esm/behaviors/general-diagnostics/GeneralDiagnosticsServer.d.ts.map +1 -1
- package/dist/esm/behaviors/general-diagnostics/GeneralDiagnosticsServer.js +88 -34
- package/dist/esm/behaviors/general-diagnostics/GeneralDiagnosticsServer.js.map +1 -1
- package/dist/esm/behaviors/group-key-management/GroupKeyManagementServer.d.ts.map +1 -1
- package/dist/esm/behaviors/group-key-management/GroupKeyManagementServer.js +16 -3
- package/dist/esm/behaviors/group-key-management/GroupKeyManagementServer.js.map +1 -1
- package/dist/esm/behaviors/identify/IdentifyServer.d.ts.map +1 -1
- package/dist/esm/behaviors/identify/IdentifyServer.js +5 -0
- package/dist/esm/behaviors/identify/IdentifyServer.js.map +1 -1
- package/dist/esm/behaviors/service-area/ServiceAreaServer.js +1 -1
- package/dist/esm/behaviors/switch/SwitchServer.js +2 -2
- package/dist/esm/behaviors/thermostat/ThermostatServer.d.ts +10 -0
- package/dist/esm/behaviors/thermostat/ThermostatServer.d.ts.map +1 -1
- package/dist/esm/behaviors/thermostat/ThermostatServer.js +59 -22
- package/dist/esm/behaviors/thermostat/ThermostatServer.js.map +1 -1
- package/dist/esm/endpoint/Endpoint.d.ts +2 -2
- package/dist/esm/endpoint/Endpoint.d.ts.map +1 -1
- package/dist/esm/endpoint/properties/Endpoints.d.ts +2 -2
- package/dist/esm/endpoint/properties/Endpoints.d.ts.map +1 -1
- package/dist/esm/endpoint/properties/Endpoints.js +12 -1
- package/dist/esm/endpoint/properties/Endpoints.js.map +1 -1
- package/dist/esm/node/ClientNode.d.ts +7 -2
- package/dist/esm/node/ClientNode.d.ts.map +1 -1
- package/dist/esm/node/ClientNode.js +10 -3
- package/dist/esm/node/ClientNode.js.map +1 -1
- package/dist/esm/node/Node.d.ts.map +1 -1
- package/dist/esm/node/Node.js +9 -3
- package/dist/esm/node/Node.js.map +1 -1
- package/dist/esm/node/NodeLifecycle.d.ts +1 -1
- package/dist/esm/node/NodeLifecycle.js +1 -1
- package/dist/esm/node/ServerNode.d.ts.map +1 -1
- package/dist/esm/node/ServerNode.js +11 -4
- package/dist/esm/node/ServerNode.js.map +1 -1
- package/dist/esm/node/client/ClientEndpointInitializer.js +1 -1
- package/dist/esm/node/client/ClientEndpointInitializer.js.map +1 -1
- package/dist/esm/node/client/ClientEventEmitter.d.ts.map +1 -1
- package/dist/esm/node/client/ClientEventEmitter.js +9 -4
- package/dist/esm/node/client/ClientEventEmitter.js.map +1 -1
- package/dist/esm/node/client/ClientStructure.d.ts.map +1 -1
- package/dist/esm/node/client/ClientStructure.js +80 -96
- package/dist/esm/node/client/ClientStructure.js.map +1 -1
- package/dist/esm/node/client/Peers.d.ts.map +1 -1
- package/dist/esm/node/client/Peers.js +24 -5
- package/dist/esm/node/client/Peers.js.map +1 -1
- package/dist/esm/node/server/ServerEnvironment.d.ts.map +1 -1
- package/dist/esm/node/server/ServerEnvironment.js +1 -4
- package/dist/esm/node/server/ServerEnvironment.js.map +1 -1
- package/package.json +7 -7
- package/src/behavior/Events.ts +1 -1
- package/src/behavior/cluster/ClientBehavior.ts +1 -1
- package/src/behavior/cluster/ClusterBehavior.ts +1 -1
- package/src/behavior/cluster/ClusterBehaviorType.ts +4 -5
- package/src/behavior/cluster/ValidatedElements.ts +1 -1
- package/src/behavior/state/validation/ValueValidator.ts +16 -4
- package/src/behavior/state/validation/assertions.ts +27 -1
- package/src/behavior/system/commissioning/CommissioningClient.ts +2 -4
- package/src/behavior/system/controller/ControllerBehavior.ts +8 -3
- package/src/behavior/system/network/ServerNetworkRuntime.ts +11 -2
- package/src/behaviors/general-diagnostics/GeneralDiagnosticsServer.ts +2 -1
- package/src/behaviors/group-key-management/GroupKeyManagementServer.ts +19 -3
- package/src/behaviors/identify/IdentifyServer.ts +9 -0
- package/src/behaviors/service-area/ServiceAreaServer.ts +1 -1
- package/src/behaviors/switch/SwitchServer.ts +2 -2
- package/src/behaviors/thermostat/ThermostatServer.ts +65 -22
- package/src/endpoint/Endpoint.ts +2 -2
- package/src/endpoint/properties/Endpoints.ts +16 -3
- package/src/node/ClientNode.ts +11 -4
- package/src/node/Node.ts +10 -3
- package/src/node/NodeLifecycle.ts +1 -1
- package/src/node/ServerNode.ts +12 -4
- package/src/node/client/ClientEndpointInitializer.ts +1 -1
- package/src/node/client/ClientEventEmitter.ts +9 -4
- package/src/node/client/ClientStructure.ts +67 -22
- package/src/node/client/Peers.ts +31 -4
- package/src/node/server/ServerEnvironment.ts +1 -6
|
@@ -20,7 +20,8 @@ import {
|
|
|
20
20
|
Mutex,
|
|
21
21
|
Seconds,
|
|
22
22
|
Time,
|
|
23
|
-
Timestamp
|
|
23
|
+
Timestamp,
|
|
24
|
+
UninitializedDependencyError
|
|
24
25
|
} from "#general";
|
|
25
26
|
import { ClientGroup } from "#node/ClientGroup.js";
|
|
26
27
|
import { InteractionServer } from "#node/server/InteractionServer.js";
|
|
@@ -46,13 +47,22 @@ class Peers extends EndpointContainer {
|
|
|
46
47
|
this.added.on(this.#handlePeerAdded.bind(this));
|
|
47
48
|
this.deleted.on(this.#manageExpiration.bind(this));
|
|
48
49
|
this.clusterInstalled(BasicInformationClient).on(this.#instrumentBasicInformation.bind(this));
|
|
50
|
+
const lifecycle = owner.lifecycle;
|
|
51
|
+
lifecycle.online.on(this.#nodeOnline.bind(this));
|
|
52
|
+
lifecycle.offline.on(this.#nodeOffline.bind(this));
|
|
49
53
|
}
|
|
50
54
|
/**
|
|
51
55
|
* Load nodes. Invoked automatically by owner.
|
|
52
56
|
*/
|
|
53
57
|
initialize() {
|
|
54
58
|
const factory = this.owner.env.get(ClientNodeFactory);
|
|
55
|
-
const clientStores = this.owner.env.
|
|
59
|
+
const clientStores = this.owner.env.maybeGet(ServerNodeStore)?.clientStores;
|
|
60
|
+
if (clientStores === void 0) {
|
|
61
|
+
throw new UninitializedDependencyError(
|
|
62
|
+
"Peers",
|
|
63
|
+
"are not available because ServerNode initialization is incomplete"
|
|
64
|
+
);
|
|
65
|
+
}
|
|
56
66
|
for (const id of clientStores.knownIds) {
|
|
57
67
|
this.add(
|
|
58
68
|
factory.create({
|
|
@@ -62,6 +72,15 @@ class Peers extends EndpointContainer {
|
|
|
62
72
|
);
|
|
63
73
|
}
|
|
64
74
|
}
|
|
75
|
+
async #nodeOnline() {
|
|
76
|
+
this.#manageExpiration();
|
|
77
|
+
}
|
|
78
|
+
async #nodeOffline() {
|
|
79
|
+
this.#cancelExpiration();
|
|
80
|
+
for (const peer of this) {
|
|
81
|
+
await peer.cancel();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
65
84
|
/**
|
|
66
85
|
* Find a specific commissionable node.
|
|
67
86
|
*/
|
|
@@ -255,12 +274,12 @@ class Peers extends EndpointContainer {
|
|
|
255
274
|
}
|
|
256
275
|
#onLeave(node, fabricIndex) {
|
|
257
276
|
this.#mutex.run(async () => {
|
|
258
|
-
const { fabrics: peerFabrics } = node.maybeStateOf(OperationalCredentialsClient);
|
|
259
|
-
const peerFabric = peerFabrics
|
|
277
|
+
const { fabrics: peerFabrics } = node.maybeStateOf(OperationalCredentialsClient) ?? {};
|
|
278
|
+
const peerFabric = peerFabrics?.find((fabric) => fabric.fabricIndex === fabricIndex);
|
|
260
279
|
if (!peerFabric) {
|
|
261
280
|
return;
|
|
262
281
|
}
|
|
263
|
-
const peerAddress = node.maybeStateOf(CommissioningClient)
|
|
282
|
+
const peerAddress = node.maybeStateOf(CommissioningClient)?.peerAddress;
|
|
264
283
|
if (!peerAddress) {
|
|
265
284
|
return;
|
|
266
285
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/node/client/Peers.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAS,yBAAyB;AAClC,SAAS,2BAA2B;AACpC,SAAS,wBAAwB;AACjC,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AAEpC,SAAS,yBAAyB;AAClC,SAAS,8BAA8B;AACvC,SAAS,oCAAoC;AAE7C,SAAS,yBAAyB;AAElC;AAAA,EAEI;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAClC,SAAS,2BAA2B,qBAAqB,eAAe,mBAAmB;AAC3F,SAAS,uBAAuB;AAEhC,SAAS,kBAAkB;AAE3B,SAAS,yBAAyB;AAClC,SAAS,6BAA6B;AAEtC,MAAM,SAAS,OAAO,IAAI,OAAO;AAEjC,MAAM,cAAc,QAAQ,EAAE;AAC9B,MAAM,sBAAsB,QAAQ;AAO7B,MAAM,cAAc,kBAA8B;AAAA,EACrD;AAAA,EACA;AAAA,EACA,SAAS,IAAI,MAAM,IAAI;AAAA,EACvB,UAAU;AAAA,EAEV,YAAY,OAAmB;AAC3B,UAAM,KAAK;AAEX,QAAI,CAAC,MAAM,IAAI,IAAI,iBAAiB,GAAG;AACnC,YAAM,IAAI,IAAI,mBAAmB,IAAI,QAAQ,IAAI,CAAC;AAAA,IACtD;AAEA,UAAM,IAAI,QAAQ,mBAAmB,KAAK,4BAA4B,KAAK,IAAI,CAAC;AAEhF,SAAK,MAAM,GAAG,KAAK,iBAAiB,KAAK,IAAI,CAAC;AAC9C,SAAK,QAAQ,GAAG,KAAK,kBAAkB,KAAK,IAAI,CAAC;AAEjD,SAAK,iBAAiB,sBAAsB,EAAE,GAAG,KAAK,4BAA4B,KAAK,IAAI,CAAC;AAAA,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["freshestExp"]
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerEnvironment.d.ts","sourceRoot":"","sources":["../../../../src/node/server/ServerEnvironment.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAU,UAAU,EAAE,MAAM,UAAU,CAAC;AAI9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKtD;;GAEG;AACH,yBAAiB,iBAAiB,CAAC;IAC/B,sGAAsG;IAC/F,MAAM,yBAAyB,yBAAe,CAAC;IAEtD,SAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,iBA+BhD;IAED,SAAsB,KAAK,CAAC,IAAI,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"ServerEnvironment.d.ts","sourceRoot":"","sources":["../../../../src/node/server/ServerEnvironment.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAU,UAAU,EAAE,MAAM,UAAU,CAAC;AAI9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKtD;;GAEG;AACH,yBAAiB,iBAAiB,CAAC;IAC/B,sGAAsG;IAC/F,MAAM,yBAAyB,yBAAe,CAAC;IAEtD,SAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,iBA+BhD;IAED,SAAsB,KAAK,CAAC,IAAI,EAAE,UAAU,iBAQ3C;CACJ"}
|
|
@@ -9,7 +9,7 @@ import { Crypto, Observable } from "#general";
|
|
|
9
9
|
import { NodePeerAddressStore } from "#node/client/NodePeerAddressStore.js";
|
|
10
10
|
import { ChangeNotificationService } from "#node/integration/ChangeNotificationService.js";
|
|
11
11
|
import { ServerEndpointInitializer } from "#node/server/ServerEndpointInitializer.js";
|
|
12
|
-
import { FabricManager,
|
|
12
|
+
import { FabricManager, OccurrenceManager, PeerAddressStore, SessionManager } from "#protocol";
|
|
13
13
|
import { ServerNodeStore } from "#storage/server/ServerNodeStore.js";
|
|
14
14
|
import { IdentityService } from "./IdentityService.js";
|
|
15
15
|
var ServerEnvironment;
|
|
@@ -46,9 +46,6 @@ var ServerEnvironment;
|
|
|
46
46
|
await env.close(SessionManager);
|
|
47
47
|
await env.close(OccurrenceManager);
|
|
48
48
|
await env.close(ServerNodeStore);
|
|
49
|
-
if (env.owns(MdnsService)) {
|
|
50
|
-
await env.close(MdnsService);
|
|
51
|
-
}
|
|
52
49
|
}
|
|
53
50
|
ServerEnvironment2.close = close;
|
|
54
51
|
})(ServerEnvironment || (ServerEnvironment = {}));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/node/server/ServerEnvironment.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,qCAAqC;AAC9C,SAAS,2BAA2B;AACpC,SAAS,QAAQ,kBAAkB;AACnC,SAAS,4BAA4B;AACrC,SAAS,iCAAiC;AAC1C,SAAS,iCAAiC;AAE1C,SAAS,eAAe,
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,qCAAqC;AAC9C,SAAS,2BAA2B;AACpC,SAAS,QAAQ,kBAAkB;AACnC,SAAS,4BAA4B;AACrC,SAAS,iCAAiC;AAC1C,SAAS,iCAAiC;AAE1C,SAAS,eAAe,mBAAmB,kBAAkB,sBAAsB;AACnF,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAKzB,IAAU;AAAA,CAAV,CAAUA,uBAAV;AAEI,EAAMA,mBAAA,4BAA4B,WAAW;AAEpD,iBAAsB,WAAW,MAAkB;AAC/C,UAAM,EAAE,IAAI,IAAI;AAGhB,QAAI,CAAC,IAAI,IAAI,eAAe,GAAG;AAE3B,YAAM,QAAQ,MAAM,gBAAgB,OAAO,KAAK,KAAK,EAAE;AACvD,UAAI,IAAI,iBAAiB,KAAK;AAAA,IAClC;AACA,QAAI,IAAI,qBAAqB,IAAI,0BAA0B,GAAG,CAAC;AAC/D,QAAI,IAAI,iBAAiB,IAAI,gBAAgB,IAAI,CAAC;AAClD,QAAI,CAAC,IAAI,IAAI,gBAAgB,GAAG;AAE5B,UAAI,IAAI,kBAAkB,IAAI,qBAAqB,IAAI,CAAC;AAAA,IAC5D;AACA,QAAI,IAAI,2BAA2B,IAAI,0BAA0B,IAAI,CAAC;AAGtE,UAAM,UAAU,MAAM,IAAI,KAAK,aAAa;AAE5C,YAAQ,OAAO,QAAQ,GAAG,YAAY;AAClC,YAAM,gBAAgB,QAAQ,QAAQ,IAAI,YAAU,OAAO,WAAW;AACtE,UAAI,cAAc,SAAS,GAAG;AAC1B,cAAM,8BAA8B,MAAM,aAAa;AAAA,MAC3D;AACA,MAAAA,mBAAA,0BAA0B,KAAK;AAAA,IACnC,CAAC;AAED,UAAM,IAAI,KAAK,cAAc;AAE7B,QAAI,IAAI,MAAM,EAAE,YAAY,KAAK,EAAE;AAAA,EACvC;AA/BA,EAAAA,mBAAsB;AAiCtB,iBAAsB,MAAM,MAAkB;AAC1C,UAAM,EAAE,IAAI,IAAI;AAEhB,QAAI,MAAM,aAAa;AACvB,UAAM,IAAI,MAAM,yBAAyB;AACzC,UAAM,IAAI,MAAM,cAAc;AAC9B,UAAM,IAAI,MAAM,iBAAiB;AACjC,UAAM,IAAI,MAAM,eAAe;AAAA,EACnC;AARA,EAAAA,mBAAsB;AAAA,GArCT;",
|
|
5
5
|
"names": ["ServerEnvironment"]
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/node",
|
|
3
|
-
"version": "0.16.0-alpha.0-
|
|
3
|
+
"version": "0.16.0-alpha.0-20251129-96ad07c6e",
|
|
4
4
|
"description": "API for building Matter nodes",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -42,14 +42,14 @@
|
|
|
42
42
|
"#*": "./src/*"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@matter/general": "0.16.0-alpha.0-
|
|
46
|
-
"@matter/model": "0.16.0-alpha.0-
|
|
47
|
-
"@matter/types": "0.16.0-alpha.0-
|
|
48
|
-
"@matter/protocol": "0.16.0-alpha.0-
|
|
45
|
+
"@matter/general": "0.16.0-alpha.0-20251129-96ad07c6e",
|
|
46
|
+
"@matter/model": "0.16.0-alpha.0-20251129-96ad07c6e",
|
|
47
|
+
"@matter/types": "0.16.0-alpha.0-20251129-96ad07c6e",
|
|
48
|
+
"@matter/protocol": "0.16.0-alpha.0-20251129-96ad07c6e"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@matter/tools": "0.16.0-alpha.0-
|
|
52
|
-
"@matter/testing": "0.16.0-alpha.0-
|
|
51
|
+
"@matter/tools": "0.16.0-alpha.0-20251129-96ad07c6e",
|
|
52
|
+
"@matter/testing": "0.16.0-alpha.0-20251129-96ad07c6e"
|
|
53
53
|
},
|
|
54
54
|
"files": [
|
|
55
55
|
"dist/**/*",
|
package/src/behavior/Events.ts
CHANGED
|
@@ -259,7 +259,7 @@ export class QuietEvent<T extends any[] = any[], S extends ValueModel = ValueMod
|
|
|
259
259
|
super(schema, owner);
|
|
260
260
|
this.#quiet = new QuietObservable({
|
|
261
261
|
shouldEmit(...args: T) {
|
|
262
|
-
const [
|
|
262
|
+
const [newValue, oldValue] = args;
|
|
263
263
|
|
|
264
264
|
return oldValue === null || (newValue === null && oldValue !== newValue) ? "now" : true;
|
|
265
265
|
},
|
|
@@ -14,7 +14,7 @@ import { markClientBehavior } from "./cluster-behavior-utils.js";
|
|
|
14
14
|
* You may use a client behavior to access the type-safe version of a behavior without knowing details of the underlying
|
|
15
15
|
* implementation such as the base class or supported features.
|
|
16
16
|
*
|
|
17
|
-
* For appropriate type safety {@link cluster} must
|
|
17
|
+
* For appropriate type safety {@link cluster} must specify all cluster elements, and those that are not mandatory
|
|
18
18
|
* without features must be marked as optional.
|
|
19
19
|
*/
|
|
20
20
|
export function ClientBehavior<const T extends ClusterType>(cluster: T): ClusterBehavior.Type<T> {
|
|
@@ -32,7 +32,7 @@ import type { ClusterState } from "./ClusterState.js";
|
|
|
32
32
|
* and may not be retained across invocations.
|
|
33
33
|
*
|
|
34
34
|
* ClusterBehaviors may be instantiated with unsupported mandatory commands and attributes. This is currently results
|
|
35
|
-
* in a runtime error but it will not cause a type error during development.
|
|
35
|
+
* in a runtime error, but it will not cause a type error during development.
|
|
36
36
|
*/
|
|
37
37
|
export class ClusterBehavior extends Behavior {
|
|
38
38
|
declare static readonly schema: Schema.Cluster;
|
|
@@ -161,7 +161,7 @@ export namespace ClusterBehaviorType {
|
|
|
161
161
|
/**
|
|
162
162
|
* Factory for command implementations.
|
|
163
163
|
*
|
|
164
|
-
* By default commands install as {@link Behavior.unimplemented}. In client scenarios this allows the caller to
|
|
164
|
+
* By default, commands install as {@link Behavior.unimplemented}. In client scenarios this allows the caller to
|
|
165
165
|
* provide a useful default implementation.
|
|
166
166
|
*/
|
|
167
167
|
commandFactory?: CommandFactory;
|
|
@@ -469,12 +469,11 @@ function createDefaultCommandDescriptors({ scope, base, commandFactory }: Deriva
|
|
|
469
469
|
|
|
470
470
|
// Choose implementation, or skip if appropriate implementation is already present
|
|
471
471
|
if (!conformantNames.has(name)) {
|
|
472
|
-
|
|
473
|
-
if (instance[name]) {
|
|
472
|
+
if (instance[name] && instance[name] !== Behavior.unimplemented) {
|
|
474
473
|
continue;
|
|
475
474
|
}
|
|
476
|
-
|
|
477
|
-
|
|
475
|
+
}
|
|
476
|
+
if (commandFactory) {
|
|
478
477
|
// With a factory, replace any existing implementation not provided by the factory
|
|
479
478
|
if ((instance[name] as MarkedCommand | undefined)?.[sourceFactory] === commandFactory) {
|
|
480
479
|
continue;
|
|
@@ -230,7 +230,7 @@ export class ValidatedElements {
|
|
|
230
230
|
if (implementation === Behavior.unimplemented) {
|
|
231
231
|
if (!command.optional) {
|
|
232
232
|
// TODO - do not pollute the logs with these as Matter spec is in flux (should this include groups
|
|
233
|
-
//
|
|
233
|
+
// or just scenes?)
|
|
234
234
|
if (this.#name.match(/^(?:Groups|Scenes|GroupKeyManagement)(?:Server|Behavior)/)) {
|
|
235
235
|
continue;
|
|
236
236
|
}
|
|
@@ -221,11 +221,23 @@ function createSimpleValidator(
|
|
|
221
221
|
}
|
|
222
222
|
|
|
223
223
|
function createIntegerValidator(schema: ValueModel, supervisor: RootSupervisor, name: string) {
|
|
224
|
+
const nullable = schema.effectiveQuality.nullable;
|
|
224
225
|
let assertion;
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
226
|
+
// Let's check schema type specific assertations first
|
|
227
|
+
// TODO maybe introduce a date type and then optimize this here later
|
|
228
|
+
if (schema.type === "epoch-s" || schema.type === "epoch-us") {
|
|
229
|
+
if (nullable) {
|
|
230
|
+
assertion = assertInt.nullable[schema.type];
|
|
231
|
+
} else {
|
|
232
|
+
assertion = assertInt.notNullable[schema.type];
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (assertion === undefined) {
|
|
236
|
+
if (nullable) {
|
|
237
|
+
assertion = assertInt.nullable[name];
|
|
238
|
+
} else {
|
|
239
|
+
assertion = assertInt.notNullable[name];
|
|
240
|
+
}
|
|
229
241
|
}
|
|
230
242
|
|
|
231
243
|
if (assertion === undefined) {
|
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { Bytes, isObject } from "#general";
|
|
7
|
+
import { Bytes, isObject, UINT32_MAX, UINT64_MAX } from "#general";
|
|
8
8
|
import { SchemaErrorPath } from "#model";
|
|
9
9
|
import { DatatypeError, IntegerRangeError, Val } from "#protocol";
|
|
10
|
+
import { MATTER_EPOCH_OFFSET_S, MATTER_EPOCH_OFFSET_US } from "@matter/types";
|
|
10
11
|
|
|
11
12
|
export function assertNumber(value: Val, path: SchemaErrorPath): asserts value is number {
|
|
12
13
|
if (Number.isFinite(value)) {
|
|
@@ -94,6 +95,31 @@ for (let i = 1n; i < 9n; i++) {
|
|
|
94
95
|
assertInt.nullable[intName] = createIntAssertion(`nullable ${intName}`, signedMin + 1n, signedMax);
|
|
95
96
|
}
|
|
96
97
|
|
|
98
|
+
// Add special epoch-s case
|
|
99
|
+
assertInt.notNullable["epoch-s"] = createIntAssertion(
|
|
100
|
+
"epoch-s",
|
|
101
|
+
BigInt(MATTER_EPOCH_OFFSET_S),
|
|
102
|
+
BigInt(UINT32_MAX + MATTER_EPOCH_OFFSET_S),
|
|
103
|
+
);
|
|
104
|
+
assertInt.nullable["epoch-s"] = createIntAssertion(
|
|
105
|
+
`nullable epoch-s`,
|
|
106
|
+
BigInt(MATTER_EPOCH_OFFSET_S),
|
|
107
|
+
BigInt(UINT32_MAX + MATTER_EPOCH_OFFSET_S) - 1n,
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
// Add special epoch-us case
|
|
111
|
+
// TODO Think about representing as float like other high precision time values?
|
|
112
|
+
assertInt.notNullable["epoch-us"] = createIntAssertion(
|
|
113
|
+
"epoch-us",
|
|
114
|
+
MATTER_EPOCH_OFFSET_US,
|
|
115
|
+
UINT64_MAX + MATTER_EPOCH_OFFSET_US,
|
|
116
|
+
);
|
|
117
|
+
assertInt.nullable["epoch-us"] = createIntAssertion(
|
|
118
|
+
`nullable epoch-us`,
|
|
119
|
+
MATTER_EPOCH_OFFSET_US,
|
|
120
|
+
UINT64_MAX + MATTER_EPOCH_OFFSET_US - 1n,
|
|
121
|
+
);
|
|
122
|
+
|
|
97
123
|
function createIntAssertion(name: string, lowerBoundInclusive: bigint, upperBoundExclusive: bigint) {
|
|
98
124
|
if (lowerBoundInclusive < Number.MIN_SAFE_INTEGER || upperBoundExclusive > Number.MAX_SAFE_INTEGER) {
|
|
99
125
|
return createVarIntAssertion(name, lowerBoundInclusive, upperBoundExclusive);
|
|
@@ -181,10 +181,8 @@ export class CommissioningClient extends Behavior {
|
|
|
181
181
|
|
|
182
182
|
const network = this.agent.get(NetworkClient);
|
|
183
183
|
network.state.defaultSubscription = opts.defaultSubscription;
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
network.state.autoSubscribe = opts.autoSubscribe ?? true;
|
|
187
|
-
}
|
|
184
|
+
// Nodes we commission are auto-subscribed by default, unless disabled explicitly
|
|
185
|
+
network.state.autoSubscribe = opts.autoSubscribe !== false;
|
|
188
186
|
network.state.caseAuthenticatedTags = opts.caseAuthenticatedTags;
|
|
189
187
|
|
|
190
188
|
logger.notice(
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import { Behavior } from "#behavior/Behavior.js";
|
|
8
8
|
import { BasicInformationBehavior } from "#behaviors/basic-information";
|
|
9
|
-
import { ConnectionlessTransportSet, ImplementationError, Logger } from "#general";
|
|
9
|
+
import { ConnectionlessTransportSet, ImplementationError, Logger, SharedEnvironmentServices } from "#general";
|
|
10
10
|
import { Node } from "#node/Node.js";
|
|
11
11
|
import {
|
|
12
12
|
Ble,
|
|
@@ -49,12 +49,15 @@ export class ControllerBehavior extends Behavior {
|
|
|
49
49
|
throw new ImplementationError("adminFabricLabel must be set for ControllerBehavior");
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
const node = Node.forEndpoint(this.endpoint);
|
|
53
|
+
|
|
52
54
|
// Configure discovery transports
|
|
53
55
|
if (this.state.ip === undefined) {
|
|
54
56
|
this.state.ip = true;
|
|
55
57
|
}
|
|
56
58
|
if (this.state.ip !== false) {
|
|
57
|
-
this.
|
|
59
|
+
this.internal.services = this.env.asDependent();
|
|
60
|
+
this.env.get(ScannerSet).add((await this.internal.services.load(MdnsService)).client);
|
|
58
61
|
}
|
|
59
62
|
|
|
60
63
|
if (this.state.ble === undefined) {
|
|
@@ -83,7 +86,6 @@ export class ControllerBehavior extends Behavior {
|
|
|
83
86
|
}
|
|
84
87
|
}
|
|
85
88
|
|
|
86
|
-
const node = Node.forEndpoint(this.endpoint);
|
|
87
89
|
this.reactTo(node.lifecycle.online, this.#nodeOnline);
|
|
88
90
|
if (node.lifecycle.isOnline) {
|
|
89
91
|
this.#nodeOnline();
|
|
@@ -95,6 +97,7 @@ export class ControllerBehavior extends Behavior {
|
|
|
95
97
|
await this.env.close(ActiveDiscoveries);
|
|
96
98
|
this.env.delete(FabricAuthority);
|
|
97
99
|
this.env.delete(ScannerSet);
|
|
100
|
+
await this.internal.services?.close();
|
|
98
101
|
}
|
|
99
102
|
|
|
100
103
|
get fabricAuthorityConfig(): FabricAuthorityConfiguration {
|
|
@@ -168,6 +171,8 @@ export namespace ControllerBehavior {
|
|
|
168
171
|
commissionable: true,
|
|
169
172
|
operationalTargets: [],
|
|
170
173
|
};
|
|
174
|
+
|
|
175
|
+
services?: SharedEnvironmentServices;
|
|
171
176
|
}
|
|
172
177
|
|
|
173
178
|
export class State {
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
NetworkInterfaceDetailed,
|
|
16
16
|
NoAddressAvailableError,
|
|
17
17
|
ObserverGroup,
|
|
18
|
+
SharedEnvironmentServices,
|
|
18
19
|
UdpInterface,
|
|
19
20
|
} from "#general";
|
|
20
21
|
import type { ServerNode } from "#node/ServerNode.js";
|
|
@@ -61,6 +62,12 @@ export class ServerNetworkRuntime extends NetworkRuntime {
|
|
|
61
62
|
#ipv6UdpInterface?: UdpInterface;
|
|
62
63
|
#observers = new ObserverGroup(this);
|
|
63
64
|
#groupNetworking?: ServerGroupNetworking;
|
|
65
|
+
#services: SharedEnvironmentServices;
|
|
66
|
+
|
|
67
|
+
constructor(owner: ServerNode) {
|
|
68
|
+
super(owner);
|
|
69
|
+
this.#services = owner.env.asDependent();
|
|
70
|
+
}
|
|
64
71
|
|
|
65
72
|
override get owner() {
|
|
66
73
|
return super.owner as ServerNode;
|
|
@@ -74,7 +81,7 @@ export class ServerNetworkRuntime extends NetworkRuntime {
|
|
|
74
81
|
const port = this.owner.state.network.operationalPort;
|
|
75
82
|
const options = this.owner.state.commissioning.mdns;
|
|
76
83
|
const crypto = this.owner.env.get(Crypto);
|
|
77
|
-
const { server } = this.
|
|
84
|
+
const { server } = this.#services.get(MdnsService);
|
|
78
85
|
this.#mdnsAdvertiser = new MdnsAdvertiser(crypto, server, { ...options, port });
|
|
79
86
|
}
|
|
80
87
|
return this.#mdnsAdvertiser;
|
|
@@ -253,7 +260,7 @@ export class ServerNetworkRuntime extends NetworkRuntime {
|
|
|
253
260
|
await this.addTransports(interfaces);
|
|
254
261
|
|
|
255
262
|
// Initialize MDNS
|
|
256
|
-
const mdns = await
|
|
263
|
+
const mdns = await this.#services.load(MdnsService);
|
|
257
264
|
|
|
258
265
|
const advertiser = env.get(DeviceAdvertiser);
|
|
259
266
|
|
|
@@ -323,6 +330,8 @@ export class ServerNetworkRuntime extends NetworkRuntime {
|
|
|
323
330
|
// Now all sessions are closed, so we wait for Advertiser to be gone
|
|
324
331
|
await advertisementShutdown;
|
|
325
332
|
|
|
333
|
+
await this.#services.close();
|
|
334
|
+
|
|
326
335
|
await env.close(ExchangeManager);
|
|
327
336
|
await env.close(SecureChannelProtocol);
|
|
328
337
|
await env.close(ConnectionlessTransportSet);
|
|
@@ -327,7 +327,8 @@ export class GeneralDiagnosticsServer extends Base {
|
|
|
327
327
|
}
|
|
328
328
|
|
|
329
329
|
async #updateNetworkList() {
|
|
330
|
-
|
|
330
|
+
await using services = this.env.asDependent();
|
|
331
|
+
const mdnsService = services.get(MdnsService);
|
|
331
332
|
const mdnsLimitedToNetworkInterfaces = mdnsService.limitedToNetInterface;
|
|
332
333
|
|
|
333
334
|
const networkRuntime = this.env.get(NetworkRuntime) as ServerNetworkRuntime;
|
|
@@ -9,7 +9,7 @@ import { GroupKeyManagement } from "#clusters/group-key-management";
|
|
|
9
9
|
import { deepCopy, ImplementationError, Logger, MaybePromise } from "#general";
|
|
10
10
|
import { DatatypeModel, FieldElement } from "#model";
|
|
11
11
|
import { NodeLifecycle } from "#node/NodeLifecycle.js";
|
|
12
|
-
import { assertRemoteActor, Fabric, FabricManager, hasRemoteActor } from "#protocol";
|
|
12
|
+
import { assertRemoteActor, Fabric, FabricManager, hasRemoteActor, IPK_DEFAULT_EPOCH_START_TIME } from "#protocol";
|
|
13
13
|
import { EndpointNumber, FabricIndex, GroupId, StatusCode, StatusResponseError } from "#types";
|
|
14
14
|
import { GroupKeyManagementBehavior } from "./GroupKeyManagementBehavior.js";
|
|
15
15
|
|
|
@@ -91,12 +91,27 @@ export class GroupKeyManagementServer extends GroupKeyManagementBehavior {
|
|
|
91
91
|
// When we have group key sets, we need to ensure that they are initialized on the Fabric group manager
|
|
92
92
|
if (this.state.groupKeySets.length) {
|
|
93
93
|
const groupKeysForFabric = new Map<FabricIndex, GroupKeyManagement.GroupKeySet[]>();
|
|
94
|
-
|
|
94
|
+
const groupKeySets = deepCopy(this.state.groupKeySets);
|
|
95
|
+
for (let i = 0; i < groupKeySets.length; i++) {
|
|
96
|
+
const groupKeySet = groupKeySets[i];
|
|
95
97
|
const fabricIndex = groupKeySet.fabricIndex;
|
|
96
98
|
const keys = groupKeysForFabric.get(fabricIndex) ?? [];
|
|
99
|
+
if (keys.length === 0 && !fabrics.has(fabricIndex)) {
|
|
100
|
+
// Should normally not happen, but we saw such crashes without details, so handle it gracefully
|
|
101
|
+
logger.warn(
|
|
102
|
+
`Stored GroupKeySets for FabricIndex ${fabricIndex}, but no such fabric exists anymore. Cleaning up stale entries.`,
|
|
103
|
+
);
|
|
104
|
+
groupKeySets.splice(i, 1);
|
|
105
|
+
i--;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
97
108
|
keys.push(groupKeySet);
|
|
98
109
|
groupKeysForFabric.set(fabricIndex, keys);
|
|
99
110
|
}
|
|
111
|
+
if (groupKeySets.length !== this.state.groupKeySets.length) {
|
|
112
|
+
// Some entries were removed, so update the persisted state
|
|
113
|
+
this.state.groupKeySets = groupKeySets;
|
|
114
|
+
}
|
|
100
115
|
|
|
101
116
|
for (const [fabricIndex, keys] of groupKeysForFabric.entries()) {
|
|
102
117
|
const fabric = fabrics.for(fabricIndex);
|
|
@@ -290,7 +305,8 @@ export class GroupKeyManagementServer extends GroupKeyManagementBehavior {
|
|
|
290
305
|
if (epochKey0 === null || epochStartTime0 === null) {
|
|
291
306
|
throw new StatusResponseError("EpochKey0 and EpochStartTime0 must be set", StatusCode.InvalidCommand);
|
|
292
307
|
}
|
|
293
|
-
if (epochStartTime0
|
|
308
|
+
if (epochStartTime0 <= IPK_DEFAULT_EPOCH_START_TIME) {
|
|
309
|
+
// Formally can never be < IPK_DEFAULT_EPOCH_START_TIME, but let's be sure
|
|
294
310
|
throw new StatusResponseError("EpochStartTime0 must not be 0", StatusCode.InvalidCommand);
|
|
295
311
|
}
|
|
296
312
|
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import { Identify } from "#clusters/identify";
|
|
8
8
|
import { MaybePromise, Observable, Seconds, Time, Timer } from "#general";
|
|
9
|
+
import { hasRemoteActor } from "@matter/protocol";
|
|
9
10
|
import { IdentifyBehavior } from "./IdentifyBehavior.js";
|
|
10
11
|
|
|
11
12
|
/**
|
|
@@ -33,6 +34,14 @@ export class IdentifyServer extends IdentifyBehavior {
|
|
|
33
34
|
this.state.identifyType = Identify.IdentifyType.None;
|
|
34
35
|
}
|
|
35
36
|
|
|
37
|
+
this.events.identifyTime$Changed.quiet.config = {
|
|
38
|
+
shouldEmit: (newValue, oldValue, context) =>
|
|
39
|
+
hasRemoteActor(context) || ((oldValue === 0 || newValue === 0) && newValue !== oldValue)
|
|
40
|
+
? "now"
|
|
41
|
+
: false,
|
|
42
|
+
suppressionEnabled: false,
|
|
43
|
+
};
|
|
44
|
+
|
|
36
45
|
// TODO - identifyTime should become virtual attribute with timer to update isIdentifying
|
|
37
46
|
// Enable I/2.4 once this is done
|
|
38
47
|
this.internal.identifyTimer = Time.getPeriodicTimer(
|
|
@@ -57,7 +57,7 @@ export class ServiceAreaBaseServer extends ServiceAreaBase {
|
|
|
57
57
|
// • when it changes to or from 0
|
|
58
58
|
// • when it decreases
|
|
59
59
|
// • when it changes to or from null
|
|
60
|
-
this.events.estimatedEndTime$Changed.quiet.shouldEmit = (
|
|
60
|
+
this.events.estimatedEndTime$Changed.quiet.shouldEmit = (newValue, oldValue) => {
|
|
61
61
|
return oldValue === null ||
|
|
62
62
|
oldValue === 0 ||
|
|
63
63
|
newValue === null ||
|
|
@@ -30,13 +30,13 @@ const schema = SwitchServerBase.schema.extend({
|
|
|
30
30
|
children: [
|
|
31
31
|
FieldElement({
|
|
32
32
|
name: "longPressDelay",
|
|
33
|
-
type: "
|
|
33
|
+
type: "duration",
|
|
34
34
|
conformance: "MSL",
|
|
35
35
|
default: DEFAULT_LONG_PRESS_DELAY,
|
|
36
36
|
}),
|
|
37
37
|
FieldElement({
|
|
38
38
|
name: "multiPressDelay",
|
|
39
|
-
type: "
|
|
39
|
+
type: "duration",
|
|
40
40
|
conformance: "MSM",
|
|
41
41
|
default: DEFAULT_MULTIPRESS_DELAY,
|
|
42
42
|
}),
|