@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.
- package/dist/cjs/behavior/internal/BehaviorBacking.d.ts +6 -1
- package/dist/cjs/behavior/internal/BehaviorBacking.d.ts.map +1 -1
- package/dist/cjs/behavior/internal/BehaviorBacking.js +2 -1
- package/dist/cjs/behavior/internal/BehaviorBacking.js.map +1 -1
- package/dist/cjs/behavior/internal/ClientBehaviorBacking.d.ts +2 -1
- package/dist/cjs/behavior/internal/ClientBehaviorBacking.d.ts.map +1 -1
- package/dist/cjs/behavior/internal/ClientBehaviorBacking.js +4 -0
- package/dist/cjs/behavior/internal/ClientBehaviorBacking.js.map +1 -1
- package/dist/cjs/behavior/internal/ServerBehaviorBacking.d.ts +2 -0
- package/dist/cjs/behavior/internal/ServerBehaviorBacking.d.ts.map +1 -1
- package/dist/cjs/behavior/internal/ServerBehaviorBacking.js +37 -0
- package/dist/cjs/behavior/internal/ServerBehaviorBacking.js.map +1 -1
- package/dist/cjs/behavior/state/transaction/Transaction.d.ts +18 -18
- package/dist/cjs/behavior/system/events/EventsBehavior.d.ts +26 -0
- package/dist/cjs/behavior/system/events/EventsBehavior.d.ts.map +1 -0
- package/dist/cjs/behavior/system/events/EventsBehavior.js +74 -0
- package/dist/cjs/behavior/system/events/EventsBehavior.js.map +6 -0
- package/dist/cjs/behavior/system/events/index.d.ts +7 -0
- package/dist/cjs/behavior/system/events/index.d.ts.map +1 -0
- package/dist/cjs/behavior/system/events/index.js +24 -0
- package/dist/cjs/behavior/system/events/index.js.map +6 -0
- package/dist/cjs/behavior/system/network/ServerNetworkRuntime.d.ts.map +1 -1
- package/dist/cjs/behavior/system/network/ServerNetworkRuntime.js +3 -0
- package/dist/cjs/behavior/system/network/ServerNetworkRuntime.js.map +1 -1
- package/dist/cjs/behaviors/administrator-commissioning/AdministratorCommissioningServer.d.ts +8 -0
- package/dist/cjs/behaviors/administrator-commissioning/AdministratorCommissioningServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/administrator-commissioning/AdministratorCommissioningServer.js +12 -4
- package/dist/cjs/behaviors/administrator-commissioning/AdministratorCommissioningServer.js.map +1 -1
- package/dist/cjs/behaviors/general-diagnostics/GeneralDiagnosticsServer.d.ts +2 -4
- package/dist/cjs/behaviors/general-diagnostics/GeneralDiagnosticsServer.d.ts.map +1 -1
- package/dist/cjs/behaviors/general-diagnostics/GeneralDiagnosticsServer.js +6 -8
- package/dist/cjs/behaviors/general-diagnostics/GeneralDiagnosticsServer.js.map +1 -1
- package/dist/cjs/endpoint/Agent.d.ts +1 -1
- package/dist/cjs/endpoint/Agent.js +1 -1
- package/dist/cjs/endpoint/index.d.ts +1 -1
- package/dist/cjs/endpoint/index.d.ts.map +1 -1
- package/dist/cjs/endpoint/index.js +1 -1
- package/dist/cjs/endpoint/index.js.map +1 -1
- package/dist/cjs/endpoint/properties/Behaviors.d.ts +13 -0
- package/dist/cjs/endpoint/properties/Behaviors.d.ts.map +1 -1
- package/dist/cjs/endpoint/properties/Behaviors.js +37 -24
- package/dist/cjs/endpoint/properties/Behaviors.js.map +2 -2
- package/dist/cjs/endpoint/properties/EndpointInitializer.d.ts +8 -3
- package/dist/cjs/endpoint/properties/EndpointInitializer.d.ts.map +1 -1
- package/dist/cjs/endpoint/properties/EndpointInitializer.js +5 -0
- package/dist/cjs/endpoint/properties/EndpointInitializer.js.map +1 -1
- package/dist/cjs/endpoint/server/BehaviorServer.d.ts +21 -0
- package/dist/cjs/endpoint/server/BehaviorServer.d.ts.map +1 -0
- package/dist/cjs/endpoint/server/BehaviorServer.js +272 -0
- package/dist/cjs/endpoint/server/BehaviorServer.js.map +6 -0
- package/dist/{esm/endpoint → cjs/endpoint/server}/EndpointServer.d.ts +5 -6
- package/dist/cjs/endpoint/server/EndpointServer.d.ts.map +1 -0
- package/dist/cjs/endpoint/{EndpointServer.js → server/EndpointServer.js} +38 -14
- package/dist/cjs/endpoint/server/EndpointServer.js.map +6 -0
- package/dist/cjs/{node → endpoint}/server/ServerEndpointInitializer.d.ts +4 -4
- package/dist/cjs/endpoint/server/ServerEndpointInitializer.d.ts.map +1 -0
- package/dist/cjs/{node → endpoint}/server/ServerEndpointInitializer.js +7 -7
- package/dist/cjs/endpoint/server/ServerEndpointInitializer.js.map +6 -0
- package/dist/cjs/endpoint/server/index.d.ts +8 -0
- package/dist/cjs/endpoint/server/index.d.ts.map +1 -0
- package/dist/cjs/endpoint/server/index.js +25 -0
- package/dist/cjs/endpoint/server/index.js.map +6 -0
- package/dist/cjs/endpoint/type/MutableEndpoint.d.ts.map +1 -1
- package/dist/cjs/endpoint/type/MutableEndpoint.js +3 -0
- package/dist/cjs/endpoint/type/MutableEndpoint.js.map +1 -1
- package/dist/cjs/node/Node.d.ts +5 -0
- package/dist/cjs/node/Node.d.ts.map +1 -1
- package/dist/cjs/node/Node.js +17 -2
- package/dist/cjs/node/Node.js.map +1 -1
- package/dist/cjs/node/NodeLifecycle.d.ts +11 -1
- package/dist/cjs/node/NodeLifecycle.d.ts.map +1 -1
- package/dist/cjs/node/NodeLifecycle.js +14 -0
- package/dist/cjs/node/NodeLifecycle.js.map +1 -1
- package/dist/cjs/node/ServerNode.d.ts +3 -2
- package/dist/cjs/node/ServerNode.d.ts.map +1 -1
- package/dist/cjs/node/ServerNode.js +9 -9
- package/dist/cjs/node/ServerNode.js.map +1 -1
- package/dist/cjs/node/server/ServerEnvironment.js +1 -1
- package/dist/cjs/node/server/ServerEnvironment.js.map +1 -1
- package/dist/cjs/node/server/TransactionalInteractionServer.d.ts +2 -2
- package/dist/cjs/node/server/TransactionalInteractionServer.d.ts.map +1 -1
- package/dist/cjs/node/server/TransactionalInteractionServer.js +9 -4
- package/dist/cjs/node/server/TransactionalInteractionServer.js.map +2 -2
- package/dist/cjs/node/server/index.d.ts +0 -1
- package/dist/cjs/node/server/index.d.ts.map +1 -1
- package/dist/cjs/node/server/index.js +0 -1
- package/dist/cjs/node/server/index.js.map +1 -1
- package/dist/esm/behavior/internal/BehaviorBacking.d.ts +6 -1
- package/dist/esm/behavior/internal/BehaviorBacking.d.ts.map +1 -1
- package/dist/esm/behavior/internal/BehaviorBacking.js +2 -1
- package/dist/esm/behavior/internal/BehaviorBacking.js.map +1 -1
- package/dist/esm/behavior/internal/ClientBehaviorBacking.d.ts +2 -1
- package/dist/esm/behavior/internal/ClientBehaviorBacking.d.ts.map +1 -1
- package/dist/esm/behavior/internal/ClientBehaviorBacking.js +4 -0
- package/dist/esm/behavior/internal/ClientBehaviorBacking.js.map +1 -1
- package/dist/esm/behavior/internal/ServerBehaviorBacking.d.ts +2 -0
- package/dist/esm/behavior/internal/ServerBehaviorBacking.d.ts.map +1 -1
- package/dist/esm/behavior/internal/ServerBehaviorBacking.js +37 -0
- package/dist/esm/behavior/internal/ServerBehaviorBacking.js.map +1 -1
- package/dist/esm/behavior/state/transaction/Transaction.d.ts +18 -18
- package/dist/esm/behavior/system/events/EventsBehavior.d.ts +26 -0
- package/dist/esm/behavior/system/events/EventsBehavior.d.ts.map +1 -0
- package/dist/esm/behavior/system/events/EventsBehavior.js +54 -0
- package/dist/esm/behavior/system/events/EventsBehavior.js.map +6 -0
- package/dist/esm/behavior/system/events/index.d.ts +7 -0
- package/dist/esm/behavior/system/events/index.d.ts.map +1 -0
- package/dist/esm/behavior/system/events/index.js +7 -0
- package/dist/esm/behavior/system/events/index.js.map +6 -0
- package/dist/esm/behavior/system/network/ServerNetworkRuntime.d.ts.map +1 -1
- package/dist/esm/behavior/system/network/ServerNetworkRuntime.js +3 -0
- package/dist/esm/behavior/system/network/ServerNetworkRuntime.js.map +1 -1
- package/dist/esm/behaviors/administrator-commissioning/AdministratorCommissioningServer.d.ts +8 -0
- package/dist/esm/behaviors/administrator-commissioning/AdministratorCommissioningServer.d.ts.map +1 -1
- package/dist/esm/behaviors/administrator-commissioning/AdministratorCommissioningServer.js +12 -4
- package/dist/esm/behaviors/administrator-commissioning/AdministratorCommissioningServer.js.map +1 -1
- package/dist/esm/behaviors/general-diagnostics/GeneralDiagnosticsServer.d.ts +2 -4
- package/dist/esm/behaviors/general-diagnostics/GeneralDiagnosticsServer.d.ts.map +1 -1
- package/dist/esm/behaviors/general-diagnostics/GeneralDiagnosticsServer.js +6 -8
- package/dist/esm/behaviors/general-diagnostics/GeneralDiagnosticsServer.js.map +1 -1
- package/dist/esm/endpoint/Agent.d.ts +1 -1
- package/dist/esm/endpoint/Agent.js +1 -1
- package/dist/esm/endpoint/index.d.ts +1 -1
- package/dist/esm/endpoint/index.d.ts.map +1 -1
- package/dist/esm/endpoint/index.js +1 -1
- package/dist/esm/endpoint/properties/Behaviors.d.ts +13 -0
- package/dist/esm/endpoint/properties/Behaviors.d.ts.map +1 -1
- package/dist/esm/endpoint/properties/Behaviors.js +38 -27
- package/dist/esm/endpoint/properties/Behaviors.js.map +2 -2
- package/dist/esm/endpoint/properties/EndpointInitializer.d.ts +8 -3
- package/dist/esm/endpoint/properties/EndpointInitializer.d.ts.map +1 -1
- package/dist/esm/endpoint/properties/EndpointInitializer.js +5 -0
- package/dist/esm/endpoint/properties/EndpointInitializer.js.map +1 -1
- package/dist/esm/endpoint/server/BehaviorServer.d.ts +21 -0
- package/dist/esm/endpoint/server/BehaviorServer.d.ts.map +1 -0
- package/dist/esm/endpoint/server/BehaviorServer.js +269 -0
- package/dist/esm/endpoint/server/BehaviorServer.js.map +6 -0
- package/dist/{cjs/endpoint → esm/endpoint/server}/EndpointServer.d.ts +5 -6
- package/dist/esm/endpoint/server/EndpointServer.d.ts.map +1 -0
- package/dist/esm/endpoint/{EndpointServer.js → server/EndpointServer.js} +38 -14
- package/dist/esm/endpoint/server/EndpointServer.js.map +6 -0
- package/dist/esm/{node → endpoint}/server/ServerEndpointInitializer.d.ts +4 -4
- package/dist/esm/endpoint/server/ServerEndpointInitializer.d.ts.map +1 -0
- package/dist/esm/{node → endpoint}/server/ServerEndpointInitializer.js +7 -7
- package/dist/esm/endpoint/server/ServerEndpointInitializer.js.map +6 -0
- package/dist/esm/endpoint/server/index.d.ts +8 -0
- package/dist/esm/endpoint/server/index.d.ts.map +1 -0
- package/dist/esm/endpoint/server/index.js +8 -0
- package/dist/esm/endpoint/server/index.js.map +6 -0
- package/dist/esm/endpoint/type/MutableEndpoint.d.ts.map +1 -1
- package/dist/esm/endpoint/type/MutableEndpoint.js +3 -0
- package/dist/esm/endpoint/type/MutableEndpoint.js.map +1 -1
- package/dist/esm/node/Node.d.ts +5 -0
- package/dist/esm/node/Node.d.ts.map +1 -1
- package/dist/esm/node/Node.js +17 -2
- package/dist/esm/node/Node.js.map +1 -1
- package/dist/esm/node/NodeLifecycle.d.ts +11 -1
- package/dist/esm/node/NodeLifecycle.d.ts.map +1 -1
- package/dist/esm/node/NodeLifecycle.js +15 -1
- package/dist/esm/node/NodeLifecycle.js.map +1 -1
- package/dist/esm/node/ServerNode.d.ts +3 -2
- package/dist/esm/node/ServerNode.d.ts.map +1 -1
- package/dist/esm/node/ServerNode.js +10 -10
- package/dist/esm/node/ServerNode.js.map +1 -1
- package/dist/esm/node/server/ServerEnvironment.js +1 -1
- package/dist/esm/node/server/ServerEnvironment.js.map +1 -1
- package/dist/esm/node/server/TransactionalInteractionServer.d.ts +2 -2
- package/dist/esm/node/server/TransactionalInteractionServer.d.ts.map +1 -1
- package/dist/esm/node/server/TransactionalInteractionServer.js +9 -4
- package/dist/esm/node/server/TransactionalInteractionServer.js.map +2 -2
- package/dist/esm/node/server/index.d.ts +0 -1
- package/dist/esm/node/server/index.d.ts.map +1 -1
- package/dist/esm/node/server/index.js +0 -1
- package/dist/esm/node/server/index.js.map +1 -1
- package/package.json +7 -7
- package/src/behavior/internal/BehaviorBacking.ts +9 -1
- package/src/behavior/internal/ClientBehaviorBacking.ts +6 -1
- package/src/behavior/internal/ServerBehaviorBacking.ts +51 -0
- package/src/behavior/system/events/EventsBehavior.ts +60 -0
- package/src/behavior/system/events/index.ts +7 -0
- package/src/behavior/system/network/ServerNetworkRuntime.ts +6 -0
- package/src/behaviors/administrator-commissioning/AdministratorCommissioningServer.ts +14 -4
- package/src/behaviors/general-diagnostics/GeneralDiagnosticsServer.ts +16 -9
- package/src/endpoint/Agent.ts +1 -1
- package/src/endpoint/index.ts +1 -1
- package/src/endpoint/properties/Behaviors.ts +56 -28
- package/src/endpoint/properties/EndpointInitializer.ts +9 -3
- package/src/endpoint/server/BehaviorServer.ts +387 -0
- package/src/endpoint/{EndpointServer.ts → server/EndpointServer.ts} +50 -20
- package/src/{node → endpoint}/server/ServerEndpointInitializer.ts +7 -7
- package/src/endpoint/server/index.ts +8 -0
- package/src/endpoint/type/MutableEndpoint.ts +4 -0
- package/src/node/Node.ts +22 -4
- package/src/node/NodeLifecycle.ts +17 -1
- package/src/node/ServerNode.ts +11 -13
- package/src/node/server/ServerEnvironment.ts +1 -1
- package/src/node/server/TransactionalInteractionServer.ts +13 -7
- package/src/node/server/index.ts +0 -1
- package/dist/cjs/behavior/internal/ClusterServerBacking.d.ts +0 -36
- package/dist/cjs/behavior/internal/ClusterServerBacking.d.ts.map +0 -1
- package/dist/cjs/behavior/internal/ClusterServerBacking.js +0 -342
- package/dist/cjs/behavior/internal/ClusterServerBacking.js.map +0 -6
- package/dist/cjs/endpoint/EndpointServer.d.ts.map +0 -1
- package/dist/cjs/endpoint/EndpointServer.js.map +0 -6
- package/dist/cjs/node/server/ServerEndpointInitializer.d.ts.map +0 -1
- package/dist/cjs/node/server/ServerEndpointInitializer.js.map +0 -6
- package/dist/esm/behavior/internal/ClusterServerBacking.d.ts +0 -36
- package/dist/esm/behavior/internal/ClusterServerBacking.d.ts.map +0 -1
- package/dist/esm/behavior/internal/ClusterServerBacking.js +0 -330
- package/dist/esm/behavior/internal/ClusterServerBacking.js.map +0 -6
- package/dist/esm/endpoint/EndpointServer.d.ts.map +0 -1
- package/dist/esm/endpoint/EndpointServer.js.map +0 -6
- package/dist/esm/node/server/ServerEndpointInitializer.d.ts.map +0 -1
- package/dist/esm/node/server/ServerEndpointInitializer.js.map +0 -6
- 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
|
-
}
|