@matter/node 0.16.0-alpha.0-20251110-c4c70a41b → 0.16.0-alpha.0-20251111-11cc8c3bd

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 (91) hide show
  1. package/dist/cjs/behavior/internal/BehaviorBacking.d.ts +2 -1
  2. package/dist/cjs/behavior/internal/BehaviorBacking.d.ts.map +1 -1
  3. package/dist/cjs/behavior/internal/BehaviorBacking.js +11 -3
  4. package/dist/cjs/behavior/internal/BehaviorBacking.js.map +1 -1
  5. package/dist/cjs/behavior/internal/ClientBehaviorBacking.d.ts +2 -0
  6. package/dist/cjs/behavior/internal/ClientBehaviorBacking.d.ts.map +1 -1
  7. package/dist/cjs/behavior/internal/ClientBehaviorBacking.js +4 -0
  8. package/dist/cjs/behavior/internal/ClientBehaviorBacking.js.map +1 -1
  9. package/dist/cjs/behavior/state/managed/Datasource.d.ts +4 -0
  10. package/dist/cjs/behavior/state/managed/Datasource.d.ts.map +1 -1
  11. package/dist/cjs/behavior/state/managed/Datasource.js +5 -0
  12. package/dist/cjs/behavior/state/managed/Datasource.js.map +1 -1
  13. package/dist/cjs/endpoint/properties/Behaviors.d.ts +12 -2
  14. package/dist/cjs/endpoint/properties/Behaviors.d.ts.map +1 -1
  15. package/dist/cjs/endpoint/properties/Behaviors.js +44 -10
  16. package/dist/cjs/endpoint/properties/Behaviors.js.map +2 -2
  17. package/dist/cjs/node/client/ClientStructure.d.ts +31 -1
  18. package/dist/cjs/node/client/ClientStructure.d.ts.map +1 -1
  19. package/dist/cjs/node/client/ClientStructure.js +257 -81
  20. package/dist/cjs/node/client/ClientStructure.js.map +1 -1
  21. package/dist/cjs/node/client/ClientStructureEvents.d.ts +5 -2
  22. package/dist/cjs/node/client/ClientStructureEvents.d.ts.map +1 -1
  23. package/dist/cjs/node/client/ClientStructureEvents.js +38 -2
  24. package/dist/cjs/node/client/ClientStructureEvents.js.map +1 -1
  25. package/dist/cjs/node/client/Peers.d.ts +3 -0
  26. package/dist/cjs/node/client/Peers.d.ts.map +1 -1
  27. package/dist/cjs/node/client/Peers.js +3 -0
  28. package/dist/cjs/node/client/Peers.js.map +1 -1
  29. package/dist/cjs/node/server/ServerEndpointInitializer.js +1 -1
  30. package/dist/cjs/node/server/ServerEndpointInitializer.js.map +1 -1
  31. package/dist/cjs/storage/EndpointStore.d.ts +5 -1
  32. package/dist/cjs/storage/EndpointStore.d.ts.map +1 -1
  33. package/dist/cjs/storage/EndpointStore.js +7 -1
  34. package/dist/cjs/storage/EndpointStore.js.map +1 -1
  35. package/dist/cjs/storage/client/ClientEndpointStore.d.ts +2 -1
  36. package/dist/cjs/storage/client/ClientEndpointStore.d.ts.map +1 -1
  37. package/dist/cjs/storage/client/DatasourceCache.d.ts +14 -3
  38. package/dist/cjs/storage/client/DatasourceCache.d.ts.map +1 -1
  39. package/dist/cjs/storage/client/DatasourceCache.js +10 -0
  40. package/dist/cjs/storage/client/DatasourceCache.js.map +1 -1
  41. package/dist/esm/behavior/internal/BehaviorBacking.d.ts +2 -1
  42. package/dist/esm/behavior/internal/BehaviorBacking.d.ts.map +1 -1
  43. package/dist/esm/behavior/internal/BehaviorBacking.js +11 -3
  44. package/dist/esm/behavior/internal/BehaviorBacking.js.map +1 -1
  45. package/dist/esm/behavior/internal/ClientBehaviorBacking.d.ts +2 -0
  46. package/dist/esm/behavior/internal/ClientBehaviorBacking.d.ts.map +1 -1
  47. package/dist/esm/behavior/internal/ClientBehaviorBacking.js +4 -0
  48. package/dist/esm/behavior/internal/ClientBehaviorBacking.js.map +1 -1
  49. package/dist/esm/behavior/state/managed/Datasource.d.ts +4 -0
  50. package/dist/esm/behavior/state/managed/Datasource.d.ts.map +1 -1
  51. package/dist/esm/behavior/state/managed/Datasource.js +5 -0
  52. package/dist/esm/behavior/state/managed/Datasource.js.map +1 -1
  53. package/dist/esm/endpoint/properties/Behaviors.d.ts +12 -2
  54. package/dist/esm/endpoint/properties/Behaviors.d.ts.map +1 -1
  55. package/dist/esm/endpoint/properties/Behaviors.js +44 -10
  56. package/dist/esm/endpoint/properties/Behaviors.js.map +2 -2
  57. package/dist/esm/node/client/ClientStructure.d.ts +31 -1
  58. package/dist/esm/node/client/ClientStructure.d.ts.map +1 -1
  59. package/dist/esm/node/client/ClientStructure.js +258 -82
  60. package/dist/esm/node/client/ClientStructure.js.map +1 -1
  61. package/dist/esm/node/client/ClientStructureEvents.d.ts +5 -2
  62. package/dist/esm/node/client/ClientStructureEvents.d.ts.map +1 -1
  63. package/dist/esm/node/client/ClientStructureEvents.js +39 -3
  64. package/dist/esm/node/client/ClientStructureEvents.js.map +1 -1
  65. package/dist/esm/node/client/Peers.d.ts +3 -0
  66. package/dist/esm/node/client/Peers.d.ts.map +1 -1
  67. package/dist/esm/node/client/Peers.js +3 -0
  68. package/dist/esm/node/client/Peers.js.map +1 -1
  69. package/dist/esm/node/server/ServerEndpointInitializer.js +1 -1
  70. package/dist/esm/node/server/ServerEndpointInitializer.js.map +1 -1
  71. package/dist/esm/storage/EndpointStore.d.ts +5 -1
  72. package/dist/esm/storage/EndpointStore.d.ts.map +1 -1
  73. package/dist/esm/storage/EndpointStore.js +7 -1
  74. package/dist/esm/storage/EndpointStore.js.map +1 -1
  75. package/dist/esm/storage/client/ClientEndpointStore.d.ts +2 -1
  76. package/dist/esm/storage/client/ClientEndpointStore.d.ts.map +1 -1
  77. package/dist/esm/storage/client/DatasourceCache.d.ts +14 -3
  78. package/dist/esm/storage/client/DatasourceCache.d.ts.map +1 -1
  79. package/dist/esm/storage/client/DatasourceCache.js +10 -0
  80. package/dist/esm/storage/client/DatasourceCache.js.map +1 -1
  81. package/package.json +7 -7
  82. package/src/behavior/internal/BehaviorBacking.ts +16 -3
  83. package/src/behavior/internal/ClientBehaviorBacking.ts +10 -1
  84. package/src/behavior/state/managed/Datasource.ts +13 -0
  85. package/src/endpoint/properties/Behaviors.ts +53 -12
  86. package/src/node/client/ClientStructure.ts +352 -91
  87. package/src/node/client/ClientStructureEvents.ts +55 -7
  88. package/src/node/client/Peers.ts +4 -0
  89. package/src/node/server/ServerEndpointInitializer.ts +1 -1
  90. package/src/storage/EndpointStore.ts +8 -1
  91. package/src/storage/client/DatasourceCache.ts +28 -4
@@ -9,22 +9,27 @@ import { ClusterBehavior } from "#behavior/cluster/ClusterBehavior.js";
9
9
  import { DescriptorClient } from "#behaviors/descriptor";
10
10
  import { Endpoint } from "#endpoint/Endpoint.js";
11
11
  import { EndpointType } from "#endpoint/type/EndpointType.js";
12
- import { Environment, Environmental, Observable } from "#general";
12
+ import { Environment, Environmental, Logger, Observable } from "#general";
13
13
  import { DeviceTypeId } from "#types";
14
14
 
15
+ const logger = Logger.get("ClientStructureEvents");
16
+
15
17
  /**
16
18
  * An environmental service that manages events endpoint and behavior types.
17
19
  */
18
20
  export class ClientStructureEvents {
19
- #endpointEvents?: Map<DeviceTypeId, Observable<[Endpoint]>>;
21
+ #endpointEvents?: Map<DeviceTypeId, Observable<[endpoint: Endpoint]>>;
20
22
  #clusterEvents?: Map<
21
23
  string,
22
24
  Array<{
23
25
  requestedType: Behavior.Type;
24
- event: Observable<[Endpoint, Behavior.Type]>;
26
+ event: Observable<[endpoint: Endpoint, type: ClusterBehavior.Type]>;
25
27
  }>
26
28
  >;
27
29
 
30
+ #clusterReplaced?: Observable<[endpoint: Endpoint, type: ClusterBehavior.Type]>;
31
+ #clusterDeleted?: Observable<[endpoint: Endpoint, type: ClusterBehavior.Type]>;
32
+
28
33
  static [Environmental.create](env: Environment) {
29
34
  const instance = new ClientStructureEvents();
30
35
  env.set(ClientStructureEvents, instance);
@@ -38,7 +43,7 @@ export class ClientStructureEvents {
38
43
 
39
44
  let event = this.#endpointEvents.get(type.deviceType);
40
45
  if (event === undefined) {
41
- this.#endpointEvents.set(type.deviceType, (event = Observable()));
46
+ this.#endpointEvents.set(type.deviceType, (event = this.#createEvent("endpointInstalled")));
42
47
  }
43
48
 
44
49
  return event as Observable<[endpoint: Endpoint<T>]>;
@@ -60,12 +65,26 @@ export class ClientStructureEvents {
60
65
  }
61
66
  }
62
67
 
63
- const event = Observable();
68
+ const event = this.#createEvent("clusterInstalled");
64
69
  events.push({ requestedType: type, event });
65
70
 
66
71
  return event;
67
72
  }
68
73
 
74
+ get clusterReplaced() {
75
+ if (this.#clusterReplaced) {
76
+ return this.#clusterReplaced;
77
+ }
78
+ return (this.#clusterReplaced = this.#createEvent("clusterReplaced"));
79
+ }
80
+
81
+ get clusterDeleted() {
82
+ if (this.#clusterDeleted) {
83
+ return this.#clusterDeleted;
84
+ }
85
+ return (this.#clusterDeleted = this.#createEvent("clusterDeleted"));
86
+ }
87
+
69
88
  emitEndpoint(endpoint: Endpoint) {
70
89
  if (this.#endpointEvents && endpoint.behaviors.supported.descriptor) {
71
90
  const deviceTypes = endpoint.stateOf(DescriptorClient).deviceTypeList;
@@ -75,7 +94,11 @@ export class ClientStructureEvents {
75
94
  }
76
95
 
77
96
  for (const type of Object.values(endpoint.behaviors.supported)) {
78
- this.emitCluster(endpoint, type);
97
+ if (!("cluster" in type)) {
98
+ continue;
99
+ }
100
+
101
+ this.emitCluster(endpoint, type as ClusterBehavior.Type);
79
102
  }
80
103
 
81
104
  for (const part of endpoint.parts) {
@@ -83,15 +106,40 @@ export class ClientStructureEvents {
83
106
  }
84
107
  }
85
108
 
86
- emitCluster(endpoint: Endpoint, type: Behavior.Type) {
109
+ emitCluster(endpoint: Endpoint, type: ClusterBehavior.Type) {
87
110
  const events = this.#clusterEvents?.get(type.id);
88
111
  if (!events) {
89
112
  return;
90
113
  }
114
+
91
115
  for (const { requestedType, event } of events) {
92
116
  if (type.supports(requestedType)) {
93
117
  event.emit(endpoint, type);
94
118
  }
95
119
  }
96
120
  }
121
+
122
+ emitClusterReplaced(endpoint: Endpoint, type: ClusterBehavior.Type) {
123
+ if (!this.#clusterReplaced) {
124
+ return;
125
+ }
126
+
127
+ this.#clusterReplaced.emit(endpoint, type);
128
+ }
129
+
130
+ emitClusterDeleted(endpoint: Endpoint, type: ClusterBehavior.Type) {
131
+ if (!this.#clusterDeleted) {
132
+ return;
133
+ }
134
+
135
+ this.#clusterDeleted.emit(endpoint, type);
136
+ }
137
+
138
+ #createEvent(kind: string): Observable<any, void> {
139
+ return Observable(unhandledError);
140
+
141
+ function unhandledError(e: unknown) {
142
+ logger.error(`Unhandled error in client structure ${kind} event handler:`, e);
143
+ }
144
+ }
97
145
  }
@@ -131,6 +131,10 @@ export class Peers extends EndpointContainer<ClientNode> {
131
131
  return this.owner.env.get(ClientStructureEvents).clusterInstalled(type);
132
132
  }
133
133
 
134
+ /**
135
+ * Emits when fixed attributes
136
+ */
137
+
134
138
  override get(id: number | string | PeerAddress) {
135
139
  if (typeof id !== "string" && typeof id !== "number") {
136
140
  const address = PeerAddress(id);
@@ -32,7 +32,7 @@ export class ServerEndpointInitializer extends EndpointInitializer {
32
32
 
33
33
  // DescriptorServer is mandatory but we don't include it in generated device types
34
34
  if (!(DescriptorServer.id in endpoint.behaviors.supported)) {
35
- endpoint.behaviors.inject(DescriptorServer);
35
+ endpoint.behaviors.inject(DescriptorServer, undefined, false);
36
36
  }
37
37
  }
38
38
 
@@ -115,12 +115,19 @@ export class EndpointStore {
115
115
  }
116
116
 
117
117
  /**
118
- * Remove all persisted information for the {@link Endpoint}
118
+ * Remove all persisted information for the {@link Endpoint}.
119
119
  */
120
120
  erase() {
121
121
  return this.storage.clearAll();
122
122
  }
123
123
 
124
+ /**
125
+ * Remove all persisted information for a single behavior on the {@link Endpoint}.
126
+ */
127
+ eraseStoreForBehavior(behaviorId: string) {
128
+ return this.storage.createContext(behaviorId).clearAll();
129
+ }
130
+
124
131
  protected get storage() {
125
132
  return this.#storage;
126
133
  }
@@ -5,21 +5,33 @@
5
5
  */
6
6
 
7
7
  import { Datasource } from "#behavior/state/managed/Datasource.js";
8
- import { InternalError, Transaction } from "#general";
8
+ import { InternalError, MaybePromise, Transaction } from "#general";
9
9
  import { Val } from "#protocol";
10
10
  import type { ClientEndpointStore } from "./ClientEndpointStore.js";
11
11
  import type { RemoteWriteParticipant } from "./RemoteWriteParticipant.js";
12
12
 
13
13
  /**
14
- * Factory function for the default implementation of {@link Datasource.ExternallyMutableStore}.
14
+ * The default implementation of {@link Datasource.ExternallyMutableStore}.
15
15
  *
16
- * This implements storage for attribute values for a single cluster loaded from remote nodes.
16
+ * This implements storage for attribute values for a single cluster loaded from peers.
17
17
  */
18
+ export interface DatasourceCache extends Datasource.ExternallyMutableStore {
19
+ /**
20
+ * Reset the cache to "uninitialized" state by reclaiming {@link initialValues} from an active datasource.
21
+ */
22
+ reclaimValues(): void;
23
+
24
+ /**
25
+ * Erase values just for this datasource.
26
+ */
27
+ erase(): MaybePromise<void>;
28
+ }
29
+
18
30
  export function DatasourceCache(
19
31
  store: ClientEndpointStore,
20
32
  behaviorId: string,
21
33
  initialValues: Val.Struct | undefined,
22
- ): Datasource.ExternallyMutableStore {
34
+ ): DatasourceCache {
23
35
  let version = initialValues?.[DatasourceCache.VERSION_KEY] as number;
24
36
  if (typeof version !== "number") {
25
37
  version = Datasource.UNKNOWN_VERSION;
@@ -51,6 +63,14 @@ export function DatasourceCache(
51
63
  },
52
64
 
53
65
  externalChangeListener: undefined,
66
+ releaseValues: undefined,
67
+
68
+ reclaimValues() {
69
+ if (this.releaseValues) {
70
+ this.initialValues = this.releaseValues();
71
+ this.releaseValues = undefined;
72
+ }
73
+ },
54
74
 
55
75
  get version() {
56
76
  return version;
@@ -59,6 +79,10 @@ export function DatasourceCache(
59
79
  set version(_version: number) {
60
80
  throw new InternalError("Datasource version must be set via externalSet");
61
81
  },
82
+
83
+ async erase() {
84
+ await store.eraseStoreForBehavior(behaviorId);
85
+ },
62
86
  };
63
87
  }
64
88