@matter/node 0.11.9 → 0.12.0-alpha.0-20241211-6d80d8b5c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/dist/cjs/behavior/internal/BehaviorBacking.d.ts +6 -1
  2. package/dist/cjs/behavior/internal/BehaviorBacking.d.ts.map +1 -1
  3. package/dist/cjs/behavior/internal/BehaviorBacking.js +2 -1
  4. package/dist/cjs/behavior/internal/BehaviorBacking.js.map +1 -1
  5. package/dist/cjs/behavior/internal/ClientBehaviorBacking.d.ts +2 -1
  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/internal/ServerBehaviorBacking.d.ts +2 -0
  10. package/dist/cjs/behavior/internal/ServerBehaviorBacking.d.ts.map +1 -1
  11. package/dist/cjs/behavior/internal/ServerBehaviorBacking.js +37 -0
  12. package/dist/cjs/behavior/internal/ServerBehaviorBacking.js.map +1 -1
  13. package/dist/cjs/behavior/state/transaction/Transaction.d.ts +18 -18
  14. package/dist/cjs/behavior/system/events/EventsBehavior.d.ts +26 -0
  15. package/dist/cjs/behavior/system/events/EventsBehavior.d.ts.map +1 -0
  16. package/dist/cjs/behavior/system/events/EventsBehavior.js +74 -0
  17. package/dist/cjs/behavior/system/events/EventsBehavior.js.map +6 -0
  18. package/dist/cjs/behavior/system/events/index.d.ts +7 -0
  19. package/dist/cjs/behavior/system/events/index.d.ts.map +1 -0
  20. package/dist/cjs/behavior/system/events/index.js +24 -0
  21. package/dist/cjs/behavior/system/events/index.js.map +6 -0
  22. package/dist/cjs/behavior/system/network/ServerNetworkRuntime.d.ts.map +1 -1
  23. package/dist/cjs/behavior/system/network/ServerNetworkRuntime.js +3 -0
  24. package/dist/cjs/behavior/system/network/ServerNetworkRuntime.js.map +1 -1
  25. package/dist/cjs/behaviors/administrator-commissioning/AdministratorCommissioningServer.d.ts +8 -0
  26. package/dist/cjs/behaviors/administrator-commissioning/AdministratorCommissioningServer.d.ts.map +1 -1
  27. package/dist/cjs/behaviors/administrator-commissioning/AdministratorCommissioningServer.js +12 -4
  28. package/dist/cjs/behaviors/administrator-commissioning/AdministratorCommissioningServer.js.map +1 -1
  29. package/dist/cjs/behaviors/general-diagnostics/GeneralDiagnosticsServer.d.ts +2 -4
  30. package/dist/cjs/behaviors/general-diagnostics/GeneralDiagnosticsServer.d.ts.map +1 -1
  31. package/dist/cjs/behaviors/general-diagnostics/GeneralDiagnosticsServer.js +6 -8
  32. package/dist/cjs/behaviors/general-diagnostics/GeneralDiagnosticsServer.js.map +1 -1
  33. package/dist/cjs/endpoint/Agent.d.ts +1 -1
  34. package/dist/cjs/endpoint/Agent.js +1 -1
  35. package/dist/cjs/endpoint/index.d.ts +1 -1
  36. package/dist/cjs/endpoint/index.d.ts.map +1 -1
  37. package/dist/cjs/endpoint/index.js +1 -1
  38. package/dist/cjs/endpoint/index.js.map +1 -1
  39. package/dist/cjs/endpoint/properties/Behaviors.d.ts +13 -0
  40. package/dist/cjs/endpoint/properties/Behaviors.d.ts.map +1 -1
  41. package/dist/cjs/endpoint/properties/Behaviors.js +37 -24
  42. package/dist/cjs/endpoint/properties/Behaviors.js.map +2 -2
  43. package/dist/cjs/endpoint/properties/EndpointInitializer.d.ts +8 -3
  44. package/dist/cjs/endpoint/properties/EndpointInitializer.d.ts.map +1 -1
  45. package/dist/cjs/endpoint/properties/EndpointInitializer.js +5 -0
  46. package/dist/cjs/endpoint/properties/EndpointInitializer.js.map +1 -1
  47. package/dist/cjs/endpoint/server/BehaviorServer.d.ts +21 -0
  48. package/dist/cjs/endpoint/server/BehaviorServer.d.ts.map +1 -0
  49. package/dist/cjs/endpoint/server/BehaviorServer.js +272 -0
  50. package/dist/cjs/endpoint/server/BehaviorServer.js.map +6 -0
  51. package/dist/{esm/endpoint → cjs/endpoint/server}/EndpointServer.d.ts +5 -6
  52. package/dist/cjs/endpoint/server/EndpointServer.d.ts.map +1 -0
  53. package/dist/cjs/endpoint/{EndpointServer.js → server/EndpointServer.js} +38 -14
  54. package/dist/cjs/endpoint/server/EndpointServer.js.map +6 -0
  55. package/dist/cjs/{node → endpoint}/server/ServerEndpointInitializer.d.ts +4 -4
  56. package/dist/cjs/endpoint/server/ServerEndpointInitializer.d.ts.map +1 -0
  57. package/dist/cjs/{node → endpoint}/server/ServerEndpointInitializer.js +7 -7
  58. package/dist/cjs/endpoint/server/ServerEndpointInitializer.js.map +6 -0
  59. package/dist/cjs/endpoint/server/index.d.ts +8 -0
  60. package/dist/cjs/endpoint/server/index.d.ts.map +1 -0
  61. package/dist/cjs/endpoint/server/index.js +25 -0
  62. package/dist/cjs/endpoint/server/index.js.map +6 -0
  63. package/dist/cjs/endpoint/type/MutableEndpoint.d.ts.map +1 -1
  64. package/dist/cjs/endpoint/type/MutableEndpoint.js +3 -0
  65. package/dist/cjs/endpoint/type/MutableEndpoint.js.map +1 -1
  66. package/dist/cjs/node/Node.d.ts +5 -0
  67. package/dist/cjs/node/Node.d.ts.map +1 -1
  68. package/dist/cjs/node/Node.js +17 -2
  69. package/dist/cjs/node/Node.js.map +1 -1
  70. package/dist/cjs/node/NodeLifecycle.d.ts +11 -1
  71. package/dist/cjs/node/NodeLifecycle.d.ts.map +1 -1
  72. package/dist/cjs/node/NodeLifecycle.js +14 -0
  73. package/dist/cjs/node/NodeLifecycle.js.map +1 -1
  74. package/dist/cjs/node/ServerNode.d.ts +3 -2
  75. package/dist/cjs/node/ServerNode.d.ts.map +1 -1
  76. package/dist/cjs/node/ServerNode.js +9 -9
  77. package/dist/cjs/node/ServerNode.js.map +1 -1
  78. package/dist/cjs/node/server/ServerEnvironment.js +1 -1
  79. package/dist/cjs/node/server/ServerEnvironment.js.map +1 -1
  80. package/dist/cjs/node/server/TransactionalInteractionServer.d.ts +2 -2
  81. package/dist/cjs/node/server/TransactionalInteractionServer.d.ts.map +1 -1
  82. package/dist/cjs/node/server/TransactionalInteractionServer.js +9 -4
  83. package/dist/cjs/node/server/TransactionalInteractionServer.js.map +2 -2
  84. package/dist/cjs/node/server/index.d.ts +0 -1
  85. package/dist/cjs/node/server/index.d.ts.map +1 -1
  86. package/dist/cjs/node/server/index.js +0 -1
  87. package/dist/cjs/node/server/index.js.map +1 -1
  88. package/dist/esm/behavior/internal/BehaviorBacking.d.ts +6 -1
  89. package/dist/esm/behavior/internal/BehaviorBacking.d.ts.map +1 -1
  90. package/dist/esm/behavior/internal/BehaviorBacking.js +2 -1
  91. package/dist/esm/behavior/internal/BehaviorBacking.js.map +1 -1
  92. package/dist/esm/behavior/internal/ClientBehaviorBacking.d.ts +2 -1
  93. package/dist/esm/behavior/internal/ClientBehaviorBacking.d.ts.map +1 -1
  94. package/dist/esm/behavior/internal/ClientBehaviorBacking.js +4 -0
  95. package/dist/esm/behavior/internal/ClientBehaviorBacking.js.map +1 -1
  96. package/dist/esm/behavior/internal/ServerBehaviorBacking.d.ts +2 -0
  97. package/dist/esm/behavior/internal/ServerBehaviorBacking.d.ts.map +1 -1
  98. package/dist/esm/behavior/internal/ServerBehaviorBacking.js +37 -0
  99. package/dist/esm/behavior/internal/ServerBehaviorBacking.js.map +1 -1
  100. package/dist/esm/behavior/state/transaction/Transaction.d.ts +18 -18
  101. package/dist/esm/behavior/system/events/EventsBehavior.d.ts +26 -0
  102. package/dist/esm/behavior/system/events/EventsBehavior.d.ts.map +1 -0
  103. package/dist/esm/behavior/system/events/EventsBehavior.js +54 -0
  104. package/dist/esm/behavior/system/events/EventsBehavior.js.map +6 -0
  105. package/dist/esm/behavior/system/events/index.d.ts +7 -0
  106. package/dist/esm/behavior/system/events/index.d.ts.map +1 -0
  107. package/dist/esm/behavior/system/events/index.js +7 -0
  108. package/dist/esm/behavior/system/events/index.js.map +6 -0
  109. package/dist/esm/behavior/system/network/ServerNetworkRuntime.d.ts.map +1 -1
  110. package/dist/esm/behavior/system/network/ServerNetworkRuntime.js +3 -0
  111. package/dist/esm/behavior/system/network/ServerNetworkRuntime.js.map +1 -1
  112. package/dist/esm/behaviors/administrator-commissioning/AdministratorCommissioningServer.d.ts +8 -0
  113. package/dist/esm/behaviors/administrator-commissioning/AdministratorCommissioningServer.d.ts.map +1 -1
  114. package/dist/esm/behaviors/administrator-commissioning/AdministratorCommissioningServer.js +12 -4
  115. package/dist/esm/behaviors/administrator-commissioning/AdministratorCommissioningServer.js.map +1 -1
  116. package/dist/esm/behaviors/general-diagnostics/GeneralDiagnosticsServer.d.ts +2 -4
  117. package/dist/esm/behaviors/general-diagnostics/GeneralDiagnosticsServer.d.ts.map +1 -1
  118. package/dist/esm/behaviors/general-diagnostics/GeneralDiagnosticsServer.js +6 -8
  119. package/dist/esm/behaviors/general-diagnostics/GeneralDiagnosticsServer.js.map +1 -1
  120. package/dist/esm/endpoint/Agent.d.ts +1 -1
  121. package/dist/esm/endpoint/Agent.js +1 -1
  122. package/dist/esm/endpoint/index.d.ts +1 -1
  123. package/dist/esm/endpoint/index.d.ts.map +1 -1
  124. package/dist/esm/endpoint/index.js +1 -1
  125. package/dist/esm/endpoint/properties/Behaviors.d.ts +13 -0
  126. package/dist/esm/endpoint/properties/Behaviors.d.ts.map +1 -1
  127. package/dist/esm/endpoint/properties/Behaviors.js +38 -27
  128. package/dist/esm/endpoint/properties/Behaviors.js.map +2 -2
  129. package/dist/esm/endpoint/properties/EndpointInitializer.d.ts +8 -3
  130. package/dist/esm/endpoint/properties/EndpointInitializer.d.ts.map +1 -1
  131. package/dist/esm/endpoint/properties/EndpointInitializer.js +5 -0
  132. package/dist/esm/endpoint/properties/EndpointInitializer.js.map +1 -1
  133. package/dist/esm/endpoint/server/BehaviorServer.d.ts +21 -0
  134. package/dist/esm/endpoint/server/BehaviorServer.d.ts.map +1 -0
  135. package/dist/esm/endpoint/server/BehaviorServer.js +269 -0
  136. package/dist/esm/endpoint/server/BehaviorServer.js.map +6 -0
  137. package/dist/{cjs/endpoint → esm/endpoint/server}/EndpointServer.d.ts +5 -6
  138. package/dist/esm/endpoint/server/EndpointServer.d.ts.map +1 -0
  139. package/dist/esm/endpoint/{EndpointServer.js → server/EndpointServer.js} +38 -14
  140. package/dist/esm/endpoint/server/EndpointServer.js.map +6 -0
  141. package/dist/esm/{node → endpoint}/server/ServerEndpointInitializer.d.ts +4 -4
  142. package/dist/esm/endpoint/server/ServerEndpointInitializer.d.ts.map +1 -0
  143. package/dist/esm/{node → endpoint}/server/ServerEndpointInitializer.js +7 -7
  144. package/dist/esm/endpoint/server/ServerEndpointInitializer.js.map +6 -0
  145. package/dist/esm/endpoint/server/index.d.ts +8 -0
  146. package/dist/esm/endpoint/server/index.d.ts.map +1 -0
  147. package/dist/esm/endpoint/server/index.js +8 -0
  148. package/dist/esm/endpoint/server/index.js.map +6 -0
  149. package/dist/esm/endpoint/type/MutableEndpoint.d.ts.map +1 -1
  150. package/dist/esm/endpoint/type/MutableEndpoint.js +3 -0
  151. package/dist/esm/endpoint/type/MutableEndpoint.js.map +1 -1
  152. package/dist/esm/node/Node.d.ts +5 -0
  153. package/dist/esm/node/Node.d.ts.map +1 -1
  154. package/dist/esm/node/Node.js +17 -2
  155. package/dist/esm/node/Node.js.map +1 -1
  156. package/dist/esm/node/NodeLifecycle.d.ts +11 -1
  157. package/dist/esm/node/NodeLifecycle.d.ts.map +1 -1
  158. package/dist/esm/node/NodeLifecycle.js +15 -1
  159. package/dist/esm/node/NodeLifecycle.js.map +1 -1
  160. package/dist/esm/node/ServerNode.d.ts +3 -2
  161. package/dist/esm/node/ServerNode.d.ts.map +1 -1
  162. package/dist/esm/node/ServerNode.js +10 -10
  163. package/dist/esm/node/ServerNode.js.map +1 -1
  164. package/dist/esm/node/server/ServerEnvironment.js +1 -1
  165. package/dist/esm/node/server/ServerEnvironment.js.map +1 -1
  166. package/dist/esm/node/server/TransactionalInteractionServer.d.ts +2 -2
  167. package/dist/esm/node/server/TransactionalInteractionServer.d.ts.map +1 -1
  168. package/dist/esm/node/server/TransactionalInteractionServer.js +9 -4
  169. package/dist/esm/node/server/TransactionalInteractionServer.js.map +2 -2
  170. package/dist/esm/node/server/index.d.ts +0 -1
  171. package/dist/esm/node/server/index.d.ts.map +1 -1
  172. package/dist/esm/node/server/index.js +0 -1
  173. package/dist/esm/node/server/index.js.map +1 -1
  174. package/package.json +7 -7
  175. package/src/behavior/internal/BehaviorBacking.ts +9 -1
  176. package/src/behavior/internal/ClientBehaviorBacking.ts +6 -1
  177. package/src/behavior/internal/ServerBehaviorBacking.ts +51 -0
  178. package/src/behavior/system/events/EventsBehavior.ts +60 -0
  179. package/src/behavior/system/events/index.ts +7 -0
  180. package/src/behavior/system/network/ServerNetworkRuntime.ts +6 -0
  181. package/src/behaviors/administrator-commissioning/AdministratorCommissioningServer.ts +14 -4
  182. package/src/behaviors/general-diagnostics/GeneralDiagnosticsServer.ts +16 -9
  183. package/src/endpoint/Agent.ts +1 -1
  184. package/src/endpoint/index.ts +1 -1
  185. package/src/endpoint/properties/Behaviors.ts +56 -28
  186. package/src/endpoint/properties/EndpointInitializer.ts +9 -3
  187. package/src/endpoint/server/BehaviorServer.ts +387 -0
  188. package/src/endpoint/{EndpointServer.ts → server/EndpointServer.ts} +50 -20
  189. package/src/{node → endpoint}/server/ServerEndpointInitializer.ts +7 -7
  190. package/src/endpoint/server/index.ts +8 -0
  191. package/src/endpoint/type/MutableEndpoint.ts +4 -0
  192. package/src/node/Node.ts +22 -4
  193. package/src/node/NodeLifecycle.ts +17 -1
  194. package/src/node/ServerNode.ts +11 -13
  195. package/src/node/server/ServerEnvironment.ts +1 -1
  196. package/src/node/server/TransactionalInteractionServer.ts +13 -7
  197. package/src/node/server/index.ts +0 -1
  198. package/dist/cjs/behavior/internal/ClusterServerBacking.d.ts +0 -36
  199. package/dist/cjs/behavior/internal/ClusterServerBacking.d.ts.map +0 -1
  200. package/dist/cjs/behavior/internal/ClusterServerBacking.js +0 -342
  201. package/dist/cjs/behavior/internal/ClusterServerBacking.js.map +0 -6
  202. package/dist/cjs/endpoint/EndpointServer.d.ts.map +0 -1
  203. package/dist/cjs/endpoint/EndpointServer.js.map +0 -6
  204. package/dist/cjs/node/server/ServerEndpointInitializer.d.ts.map +0 -1
  205. package/dist/cjs/node/server/ServerEndpointInitializer.js.map +0 -6
  206. package/dist/esm/behavior/internal/ClusterServerBacking.d.ts +0 -36
  207. package/dist/esm/behavior/internal/ClusterServerBacking.d.ts.map +0 -1
  208. package/dist/esm/behavior/internal/ClusterServerBacking.js +0 -330
  209. package/dist/esm/behavior/internal/ClusterServerBacking.js.map +0 -6
  210. package/dist/esm/endpoint/EndpointServer.d.ts.map +0 -1
  211. package/dist/esm/endpoint/EndpointServer.js.map +0 -6
  212. package/dist/esm/node/server/ServerEndpointInitializer.d.ts.map +0 -1
  213. package/dist/esm/node/server/ServerEndpointInitializer.js.map +0 -6
  214. package/src/behavior/internal/ClusterServerBacking.ts +0 -446
@@ -1,446 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2022-2024 Matter.js Authors
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- import { Resource } from "#behavior/state/index.js";
8
- import type { EndpointServer } from "#endpoint/EndpointServer.js";
9
- import { camelize, Diagnostic, ImplementationError, InternalError, isObject, Logger, MaybePromise } from "#general";
10
- import { CommandModel, ElementTag } from "#model";
11
- import {
12
- AttributeServer,
13
- ClusterDatasource,
14
- ClusterServer,
15
- CommandServer,
16
- createAttributeServer as ConstructAttributeServer,
17
- EventHandler,
18
- EventServer,
19
- FabricManager,
20
- Message,
21
- SecureSession,
22
- } from "#protocol";
23
- import { Attribute, Command, Event, TlvNoResponse } from "#types";
24
- import { AccessControl } from "../AccessControl.js";
25
- import { Behavior } from "../Behavior.js";
26
- import type { ClusterBehavior } from "../cluster/ClusterBehavior.js";
27
- import { ClusterEvents } from "../cluster/ClusterEvents.js";
28
- import { ValidatedElements } from "../cluster/ValidatedElements.js";
29
- import { Contextual } from "../context/Contextual.js";
30
- import { Val } from "../state/Val.js";
31
- import { StructManager } from "../state/managed/values/StructManager.js";
32
- import { Status } from "../state/transaction/Status.js";
33
- import { ServerBehaviorBacking } from "./ServerBehaviorBacking.js";
34
-
35
- const logger = Logger.get("Behavior");
36
-
37
- /**
38
- * Backing for cluster behaviors on servers.
39
- *
40
- * TODO - refactor element server management after we remove the old API
41
- */
42
- export class ClusterServerBacking extends ServerBehaviorBacking {
43
- #server: EndpointServer;
44
- #clusterServer?: ClusterServer;
45
-
46
- get clusterServer() {
47
- return this.#clusterServer;
48
- }
49
-
50
- get runtime() {
51
- return this.#server.endpoint.env.runtime;
52
- }
53
-
54
- get server() {
55
- return this.#server;
56
- }
57
-
58
- override get type() {
59
- return super.type as ClusterBehavior.Type;
60
- }
61
-
62
- constructor(server: EndpointServer, type: ClusterBehavior.Type) {
63
- super(server.endpoint, type);
64
- this.#server = server;
65
- }
66
-
67
- protected override invokeInitializer(behavior: Behavior, options?: Behavior.Options) {
68
- const { id, name, attributes, commands, events } = this.type.cluster;
69
-
70
- if (!options) {
71
- options = {};
72
- }
73
-
74
- const clusterServer = (this.#clusterServer = {
75
- id,
76
- name,
77
- datasource: this.#createClusterDatasource(),
78
- attributes: {},
79
- commands: {},
80
- events: {},
81
- });
82
-
83
- const result = super.invokeInitializer(behavior, options);
84
-
85
- const createClusterServer = () => {
86
- // Validate elements and determine which are applicable
87
- const elements = new ValidatedElements(this.type, behavior);
88
- elements.report();
89
-
90
- // Attribute servers. Include global attributes as well as cluster attributes
91
- this.#configureServers(
92
- elements.attributes,
93
- attributes,
94
- clusterServer.attributes,
95
- behavior,
96
- ["attributeList"],
97
- createAttributeServer,
98
- );
99
-
100
- // Command servers
101
- this.#configureServers(
102
- elements.commands,
103
- commands,
104
- clusterServer.commands,
105
- behavior,
106
- ["acceptedCommandList", "generatedCommandList"],
107
- createCommandServer,
108
- );
109
-
110
- // Event servers
111
- this.#configureServers(
112
- elements.events,
113
- events,
114
- clusterServer.events,
115
- behavior,
116
- undefined,
117
- createEventServer,
118
- );
119
-
120
- // Install the cluster server into the EndpointServer
121
- this.#server.addClusterServer(clusterServer);
122
- };
123
-
124
- if (MaybePromise.is(result)) {
125
- return result.then(createClusterServer);
126
- }
127
-
128
- createClusterServer();
129
- }
130
-
131
- protected override get datasourceOptions() {
132
- return {
133
- ...super.datasourceOptions,
134
- cluster: this.type.cluster.id,
135
- };
136
- }
137
-
138
- /**
139
- * Create the {@link ClusterDatasource} that adapts the Behavior API to the AttributeServer API.
140
- */
141
- #createClusterDatasource(): ClusterDatasource {
142
- const datasource = this.datasource;
143
- const env = this.endpoint.env;
144
-
145
- return {
146
- get version() {
147
- return datasource.version;
148
- },
149
-
150
- get eventHandler() {
151
- return env.get(EventHandler);
152
- },
153
-
154
- get fabrics() {
155
- return env.get(FabricManager).fabrics;
156
- },
157
-
158
- // We handle change management ourselves
159
- changed() {},
160
-
161
- // We handle version management ourselves
162
- increaseVersion() {
163
- return datasource.version;
164
- },
165
- };
166
- }
167
-
168
- /**
169
- * Configure the servers for a set of elements (attributes, commands or events).
170
- */
171
- #configureServers<T, S>(
172
- names: Iterable<string>,
173
- definitions: Record<string, T>,
174
- servers: Record<string, S>,
175
- behavior: Behavior,
176
- attributeNames: ["attributeList"] | ["acceptedCommandList", "generatedCommandList"] | undefined,
177
- addServer: (
178
- name: string,
179
- definition: T,
180
- backing: ClusterServerBacking,
181
- behavior: Behavior,
182
- ) => { ids: number[]; server: S },
183
- ) {
184
- const collectedIds = Array<Set<number>>();
185
- if (attributeNames !== undefined) {
186
- attributeNames.forEach(() => collectedIds.push(new Set()));
187
- }
188
-
189
- // Create a server for each supported element and record the ID
190
- for (const name of names) {
191
- const definition = definitions[name];
192
- const { ids, server } = addServer(name, definition, this, behavior);
193
- if (attributeNames !== undefined) {
194
- ids.forEach((id, index) => collectedIds[index].add(id));
195
- }
196
- servers[name] = server;
197
- }
198
-
199
- if (attributeNames !== undefined) {
200
- // Set the global attribute detailing supported elements
201
- attributeNames.forEach((attributeName, index) => {
202
- (behavior.state as Record<string, number[]>)[attributeName] = [...collectedIds[index].values()];
203
- });
204
- }
205
- }
206
- }
207
-
208
- function createAttributeServer(
209
- name: string,
210
- definition: Attribute<any, any>,
211
- backing: ClusterServerBacking,
212
- behavior: Behavior,
213
- ) {
214
- function getter(_session: any, _endpoint: any, _isFabricFiltered: any, message?: Message) {
215
- if (!message) {
216
- // If there is no message this is getLocal
217
- return (backing.datasource.view as Val.Struct)[name];
218
- }
219
-
220
- const behavior = behaviorFor(backing, message);
221
-
222
- behavior.context.activity?.frame(`read ${name}`);
223
-
224
- const trace = behavior.context.trace;
225
- if (trace) {
226
- trace.path = backing.path.at(name);
227
- }
228
-
229
- logger.debug("Read", Diagnostic.strong(`${backing}.state.${name}`), "via", behavior.context.transaction.via);
230
-
231
- const state = behavior.state as Val.Struct;
232
-
233
- StructManager.assertDirectReadAuthorized(state, name);
234
-
235
- if (trace) {
236
- trace.output = state[name];
237
- }
238
-
239
- return state[name];
240
- }
241
-
242
- function setter(value: any, _session: any, _endpoint: any, message?: Message) {
243
- const behavior = behaviorFor(backing, message);
244
-
245
- behavior.context.activity?.frame(`write ${name}`);
246
-
247
- logger.info("Write", Diagnostic.strong(`${backing}.state.${name}`), "via", behavior.context.transaction.via);
248
-
249
- const trace = behavior.context.trace;
250
- if (trace) {
251
- trace.path = backing.path.at(name);
252
- trace.input = value;
253
- }
254
-
255
- const state = behavior.state as Val.Struct;
256
-
257
- state[name] = value;
258
-
259
- // If the transaction is a write transaction, report that
260
- // the attribute is updated
261
- return behavior.context.transaction?.status === Status.Exclusive;
262
- }
263
-
264
- const server = ConstructAttributeServer(
265
- backing.type.cluster,
266
- definition,
267
- name,
268
- (behavior.state as Val.Struct)[name],
269
- backing.clusterServer!.datasource!,
270
- getter,
271
- setter,
272
- );
273
-
274
- // Wire events (FixedAttributeServer is not an AttributeServer so we skip that)
275
- if (server instanceof AttributeServer) {
276
- const observable = (backing.events as any)[`${name}$Changed`] as ClusterEvents.AttributeObservable | undefined;
277
- observable?.on((_value, _oldValue, context) => {
278
- const session = context.session;
279
- if (session instanceof SecureSession) {
280
- server.updated(session);
281
- } else {
282
- server.updatedLocal();
283
- }
284
- });
285
- }
286
-
287
- server.assignToEndpoint(backing.server);
288
-
289
- return {
290
- ids: [definition.id],
291
- server,
292
- };
293
- }
294
-
295
- function createCommandServer(name: string, definition: Command<any, any, any>, backing: ClusterServerBacking) {
296
- // TODO: Introduce nicer ways to get command incl caching and such, aka "make api suck less"
297
- const schema = backing.type.schema?.member(camelize(name, true), [ElementTag.Command]) as CommandModel;
298
- if (schema === undefined) {
299
- throw new ImplementationError(`There is no metadata for command ${name}`);
300
- }
301
- const access = AccessControl(schema);
302
-
303
- const handler = (request: unknown, _session: unknown, message: Message) => {
304
- let requestDiagnostic: unknown;
305
- if (isObject(request)) {
306
- requestDiagnostic = Diagnostic.dict(request);
307
- } else if (request !== undefined) {
308
- requestDiagnostic = request;
309
- } else {
310
- requestDiagnostic = Diagnostic.weak("(no payload)");
311
- }
312
-
313
- const behavior = behaviorFor(backing, message);
314
-
315
- const path = backing.path.at(name);
316
-
317
- const trace = behavior.context.trace;
318
- if (trace) {
319
- trace.path = backing.path.at(name);
320
- trace.input = request;
321
- }
322
-
323
- logger.info("Invoke", Diagnostic.strong(path.toString()), behavior.context.transaction.via, requestDiagnostic);
324
-
325
- access.authorizeInvoke(behavior.context, {
326
- path,
327
- cluster: behavior.cluster.id,
328
- });
329
-
330
- let isAsync = false;
331
- let activity: undefined | Disposable;
332
- let result: unknown;
333
- try {
334
- activity = behavior.context?.activity?.frame(`invoke ${name}`);
335
-
336
- const invoke = (behavior as unknown as Record<string, (arg: unknown) => unknown>)[name].bind(behavior);
337
-
338
- // Lock if necessary, then invoke
339
- if ((behavior.constructor as ClusterBehavior.Type).lockOnInvoke) {
340
- const tx = behavior.context.transaction;
341
- if (Resource.isLocked(behavior)) {
342
- // Automatic locking with locked resource; requires async lock acquisition
343
- result = (async function invokeAsync() {
344
- await tx.addResources(behavior);
345
- await tx.begin();
346
- return invoke(request);
347
- })();
348
- } else {
349
- // Automatic locking on unlocked resource; may proceed synchronously
350
- tx.addResourcesSync(behavior);
351
- tx.beginSync();
352
- result = invoke(request);
353
- }
354
- } else {
355
- // Automatic locking disabled
356
- result = invoke(request);
357
- }
358
-
359
- if (MaybePromise.is(result)) {
360
- isAsync = true;
361
- result = Promise.resolve(result)
362
- .then(result => {
363
- if (trace) {
364
- trace.output = result;
365
- }
366
- return result;
367
- })
368
- .finally(() => activity?.[Symbol.dispose]());
369
- } else if (trace) {
370
- trace.output = result;
371
- }
372
- } finally {
373
- if (!isAsync) {
374
- activity?.[Symbol.dispose]();
375
- }
376
- }
377
-
378
- return result;
379
- };
380
-
381
- const server = new CommandServer(
382
- definition.requestId,
383
- definition.responseId,
384
- name,
385
- definition.requestSchema,
386
- definition.responseSchema,
387
- definition.timed,
388
- definition.invokeAcl,
389
- handler,
390
- );
391
-
392
- // Eliminate redundant diagnostic messages
393
- server.debug = () => {};
394
-
395
- const ids = [definition.requestId];
396
- if (definition.responseSchema !== TlvNoResponse) {
397
- ids.push(definition.responseId);
398
- }
399
- return {
400
- ids,
401
- server,
402
- };
403
- }
404
-
405
- function createEventServer(name: string, definition: Event<any, any>, backing: ClusterServerBacking) {
406
- const observable = (backing.events as any)[name] as ClusterEvents.EventObservable;
407
-
408
- const server = new EventServer(
409
- definition.id,
410
- backing.type.cluster.id,
411
- name,
412
- definition.schema,
413
- definition.priority,
414
- definition.readAcl,
415
- );
416
-
417
- observable?.on((payload, _context) => {
418
- const maybePromise = server.triggerEvent(payload);
419
- if (MaybePromise.is(maybePromise)) {
420
- backing.runtime.add(maybePromise);
421
- }
422
- });
423
-
424
- server.assignToEndpoint(backing.server);
425
- const promise = server.bindToEventHandler(backing.endpoint.env.get(EventHandler));
426
- if (MaybePromise.is(promise)) {
427
- // Current code structure means this should never happen. Refactor after removal of old API will resolve this
428
- throw new InternalError("Event handler binding returned a promise");
429
- }
430
-
431
- return {
432
- ids: [definition.id],
433
- server,
434
- };
435
- }
436
-
437
- function behaviorFor(backing: ClusterServerBacking, message: Message | undefined) {
438
- const context = Contextual.contextOf(message);
439
- if (!context) {
440
- throw new InternalError("Message context not installed");
441
- }
442
-
443
- const agent = context.agentFor(backing.endpoint);
444
-
445
- return agent.get(backing.type);
446
- }