@matter/protocol 0.16.0-alpha.0-20251030-e9ca79f93 → 0.16.0-alpha.0-20251101-70c8d51d7
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/action/Interactable.d.ts +1 -0
- package/dist/cjs/action/Interactable.d.ts.map +1 -1
- package/dist/cjs/action/client/ClientInteraction.d.ts +25 -19
- package/dist/cjs/action/client/ClientInteraction.d.ts.map +1 -1
- package/dist/cjs/action/client/ClientInteraction.js +198 -94
- package/dist/cjs/action/client/ClientInteraction.js.map +2 -2
- package/dist/cjs/action/client/index.d.ts +1 -3
- package/dist/cjs/action/client/index.d.ts.map +1 -1
- package/dist/cjs/action/client/index.js +1 -3
- package/dist/cjs/action/client/index.js.map +1 -1
- package/dist/cjs/action/client/subscription/ClientSubscribe.d.ts +8 -0
- package/dist/cjs/action/client/subscription/ClientSubscribe.d.ts.map +1 -0
- package/dist/cjs/action/client/{ClientSubscription.js → subscription/ClientSubscribe.js} +3 -8
- package/dist/cjs/action/client/subscription/ClientSubscribe.js.map +6 -0
- package/dist/cjs/action/client/subscription/ClientSubscription.d.ts +38 -0
- package/dist/cjs/action/client/subscription/ClientSubscription.d.ts.map +1 -0
- package/dist/cjs/action/client/subscription/ClientSubscription.js +79 -0
- package/dist/cjs/action/client/subscription/ClientSubscription.js.map +6 -0
- package/dist/cjs/action/client/subscription/ClientSubscriptionHandler.d.ts.map +1 -0
- package/dist/cjs/action/client/{ClientSubscriptionHandler.js → subscription/ClientSubscriptionHandler.js} +5 -2
- package/dist/cjs/action/client/subscription/ClientSubscriptionHandler.js.map +6 -0
- package/dist/{esm/action/client → cjs/action/client/subscription}/ClientSubscriptions.d.ts +15 -8
- package/dist/cjs/action/client/subscription/ClientSubscriptions.d.ts.map +1 -0
- package/dist/cjs/action/client/subscription/ClientSubscriptions.js +133 -0
- package/dist/cjs/action/client/subscription/ClientSubscriptions.js.map +6 -0
- package/dist/cjs/action/client/subscription/PeerSubscription.d.ts +27 -0
- package/dist/cjs/action/client/subscription/PeerSubscription.d.ts.map +1 -0
- package/dist/cjs/action/client/subscription/PeerSubscription.js +57 -0
- package/dist/cjs/action/client/subscription/PeerSubscription.js.map +6 -0
- package/dist/cjs/action/client/subscription/SustainedSubscription.d.ts +57 -0
- package/dist/cjs/action/client/subscription/SustainedSubscription.d.ts.map +1 -0
- package/dist/cjs/action/client/subscription/SustainedSubscription.js +143 -0
- package/dist/cjs/action/client/subscription/SustainedSubscription.js.map +6 -0
- package/dist/cjs/action/client/subscription/index.d.ts +12 -0
- package/dist/cjs/action/client/subscription/index.d.ts.map +1 -0
- package/dist/cjs/action/client/subscription/index.js +29 -0
- package/dist/cjs/action/client/subscription/index.js.map +6 -0
- package/dist/cjs/action/errors.d.ts +7 -2
- package/dist/cjs/action/errors.d.ts.map +1 -1
- package/dist/cjs/action/errors.js +6 -3
- package/dist/cjs/action/errors.js.map +1 -1
- package/dist/cjs/action/request/Subscribe.d.ts +2 -2
- package/dist/cjs/action/request/Subscribe.d.ts.map +1 -1
- package/dist/cjs/action/request/Subscribe.js.map +1 -1
- package/dist/cjs/action/response/ReadResult.d.ts +1 -1
- package/dist/cjs/action/response/ReadResult.d.ts.map +1 -1
- package/dist/cjs/action/response/SubscribeResult.d.ts +2 -1
- package/dist/cjs/action/response/SubscribeResult.d.ts.map +1 -1
- package/dist/cjs/action/server/ServerInteraction.d.ts +0 -1
- package/dist/cjs/action/server/ServerInteraction.d.ts.map +1 -1
- package/dist/cjs/action/server/ServerInteraction.js +0 -3
- package/dist/cjs/action/server/ServerInteraction.js.map +1 -1
- package/dist/cjs/bdx/flow/InboundFlow.js +1 -1
- package/dist/cjs/bdx/flow/InboundFlow.js.map +1 -1
- package/dist/cjs/interaction/SubscriptionClient.d.ts +3 -3
- package/dist/cjs/interaction/SubscriptionClient.d.ts.map +1 -1
- package/dist/cjs/interaction/SubscriptionClient.js +0 -7
- package/dist/cjs/interaction/SubscriptionClient.js.map +1 -1
- package/dist/cjs/peer/PeerSet.d.ts +1 -1
- package/dist/cjs/peer/PeerSet.d.ts.map +1 -1
- package/dist/cjs/protocol/MessageExchange.js +1 -1
- package/dist/cjs/protocol/MessageExchange.js.map +1 -1
- package/dist/esm/action/Interactable.d.ts +1 -0
- package/dist/esm/action/Interactable.d.ts.map +1 -1
- package/dist/esm/action/client/ClientInteraction.d.ts +25 -19
- package/dist/esm/action/client/ClientInteraction.d.ts.map +1 -1
- package/dist/esm/action/client/ClientInteraction.js +201 -95
- package/dist/esm/action/client/ClientInteraction.js.map +2 -2
- package/dist/esm/action/client/index.d.ts +1 -3
- package/dist/esm/action/client/index.d.ts.map +1 -1
- package/dist/esm/action/client/index.js +1 -3
- package/dist/esm/action/client/index.js.map +1 -1
- package/dist/esm/action/client/subscription/ClientSubscribe.d.ts +8 -0
- package/dist/esm/action/client/subscription/ClientSubscribe.d.ts.map +1 -0
- package/dist/esm/action/client/subscription/ClientSubscribe.js +1 -0
- package/dist/esm/action/client/subscription/ClientSubscribe.js.map +6 -0
- package/dist/esm/action/client/subscription/ClientSubscription.d.ts +38 -0
- package/dist/esm/action/client/subscription/ClientSubscription.d.ts.map +1 -0
- package/dist/esm/action/client/subscription/ClientSubscription.js +59 -0
- package/dist/esm/action/client/subscription/ClientSubscription.js.map +6 -0
- package/dist/esm/action/client/subscription/ClientSubscriptionHandler.d.ts.map +1 -0
- package/dist/esm/action/client/{ClientSubscriptionHandler.js → subscription/ClientSubscriptionHandler.js} +5 -2
- package/dist/esm/action/client/subscription/ClientSubscriptionHandler.js.map +6 -0
- package/dist/{cjs/action/client → esm/action/client/subscription}/ClientSubscriptions.d.ts +15 -8
- package/dist/esm/action/client/subscription/ClientSubscriptions.d.ts.map +1 -0
- package/dist/esm/action/client/subscription/ClientSubscriptions.js +113 -0
- package/dist/esm/action/client/subscription/ClientSubscriptions.js.map +6 -0
- package/dist/esm/action/client/subscription/PeerSubscription.d.ts +27 -0
- package/dist/esm/action/client/subscription/PeerSubscription.d.ts.map +1 -0
- package/dist/esm/action/client/subscription/PeerSubscription.js +37 -0
- package/dist/esm/action/client/subscription/PeerSubscription.js.map +6 -0
- package/dist/esm/action/client/subscription/SustainedSubscription.d.ts +57 -0
- package/dist/esm/action/client/subscription/SustainedSubscription.d.ts.map +1 -0
- package/dist/esm/action/client/subscription/SustainedSubscription.js +133 -0
- package/dist/esm/action/client/subscription/SustainedSubscription.js.map +6 -0
- package/dist/esm/action/client/subscription/index.d.ts +12 -0
- package/dist/esm/action/client/subscription/index.d.ts.map +1 -0
- package/dist/esm/action/client/subscription/index.js +12 -0
- package/dist/esm/action/client/subscription/index.js.map +6 -0
- package/dist/esm/action/errors.d.ts +7 -2
- package/dist/esm/action/errors.d.ts.map +1 -1
- package/dist/esm/action/errors.js +6 -3
- package/dist/esm/action/errors.js.map +1 -1
- package/dist/esm/action/request/Subscribe.d.ts +2 -2
- package/dist/esm/action/request/Subscribe.d.ts.map +1 -1
- package/dist/esm/action/request/Subscribe.js.map +1 -1
- package/dist/esm/action/response/ReadResult.d.ts +1 -1
- package/dist/esm/action/response/ReadResult.d.ts.map +1 -1
- package/dist/esm/action/response/SubscribeResult.d.ts +2 -1
- package/dist/esm/action/response/SubscribeResult.d.ts.map +1 -1
- package/dist/esm/action/server/ServerInteraction.d.ts +0 -1
- package/dist/esm/action/server/ServerInteraction.d.ts.map +1 -1
- package/dist/esm/action/server/ServerInteraction.js +0 -3
- package/dist/esm/action/server/ServerInteraction.js.map +1 -1
- package/dist/esm/bdx/flow/InboundFlow.js +1 -1
- package/dist/esm/bdx/flow/InboundFlow.js.map +1 -1
- package/dist/esm/interaction/SubscriptionClient.d.ts +3 -3
- package/dist/esm/interaction/SubscriptionClient.d.ts.map +1 -1
- package/dist/esm/interaction/SubscriptionClient.js +1 -8
- package/dist/esm/interaction/SubscriptionClient.js.map +1 -1
- package/dist/esm/peer/PeerSet.d.ts +1 -1
- package/dist/esm/peer/PeerSet.d.ts.map +1 -1
- package/dist/esm/protocol/MessageExchange.js +1 -1
- package/dist/esm/protocol/MessageExchange.js.map +1 -1
- package/package.json +6 -6
- package/src/action/Interactable.ts +1 -0
- package/src/action/client/ClientInteraction.ts +273 -235
- package/src/action/client/index.ts +1 -3
- package/src/action/client/subscription/ClientSubscribe.ts +8 -0
- package/src/action/client/subscription/ClientSubscription.ts +88 -0
- package/src/action/client/{ClientSubscriptionHandler.ts → subscription/ClientSubscriptionHandler.ts} +5 -2
- package/src/action/client/subscription/ClientSubscriptions.ts +150 -0
- package/src/action/client/subscription/PeerSubscription.ts +51 -0
- package/src/action/client/subscription/SustainedSubscription.ts +199 -0
- package/src/action/client/subscription/index.ts +12 -0
- package/src/action/errors.ts +11 -6
- package/src/action/request/Subscribe.ts +2 -2
- package/src/action/response/ReadResult.ts +1 -1
- package/src/action/response/SubscribeResult.ts +2 -1
- package/src/action/server/ServerInteraction.ts +0 -5
- package/src/bdx/flow/InboundFlow.ts +1 -1
- package/src/interaction/SubscriptionClient.ts +4 -9
- package/src/protocol/MessageExchange.ts +1 -1
- package/dist/cjs/action/client/ClientSubscription.d.ts +0 -18
- package/dist/cjs/action/client/ClientSubscription.d.ts.map +0 -1
- package/dist/cjs/action/client/ClientSubscription.js.map +0 -6
- package/dist/cjs/action/client/ClientSubscriptionHandler.d.ts.map +0 -1
- package/dist/cjs/action/client/ClientSubscriptionHandler.js.map +0 -6
- package/dist/cjs/action/client/ClientSubscriptions.d.ts.map +0 -1
- package/dist/cjs/action/client/ClientSubscriptions.js +0 -145
- package/dist/cjs/action/client/ClientSubscriptions.js.map +0 -6
- package/dist/esm/action/client/ClientSubscription.d.ts +0 -18
- package/dist/esm/action/client/ClientSubscription.d.ts.map +0 -1
- package/dist/esm/action/client/ClientSubscription.js +0 -6
- package/dist/esm/action/client/ClientSubscription.js.map +0 -6
- package/dist/esm/action/client/ClientSubscriptionHandler.d.ts.map +0 -1
- package/dist/esm/action/client/ClientSubscriptionHandler.js.map +0 -6
- package/dist/esm/action/client/ClientSubscriptions.d.ts.map +0 -1
- package/dist/esm/action/client/ClientSubscriptions.js +0 -135
- package/dist/esm/action/client/ClientSubscriptions.js.map +0 -6
- package/src/action/client/ClientSubscription.ts +0 -19
- package/src/action/client/ClientSubscriptions.ts +0 -178
- /package/dist/cjs/action/client/{ClientSubscriptionHandler.d.ts → subscription/ClientSubscriptionHandler.d.ts} +0 -0
- /package/dist/esm/action/client/{ClientSubscriptionHandler.d.ts → subscription/ClientSubscriptionHandler.d.ts} +0 -0
|
@@ -1,3 +1,48 @@
|
|
|
1
|
+
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
|
|
2
|
+
var __typeError = (msg) => {
|
|
3
|
+
throw TypeError(msg);
|
|
4
|
+
};
|
|
5
|
+
var __using = (stack, value, async) => {
|
|
6
|
+
if (value != null) {
|
|
7
|
+
if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
|
|
8
|
+
var dispose, inner;
|
|
9
|
+
if (async) dispose = value[__knownSymbol("asyncDispose")];
|
|
10
|
+
if (dispose === void 0) {
|
|
11
|
+
dispose = value[__knownSymbol("dispose")];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") __typeError("Object not disposable");
|
|
15
|
+
if (inner) dispose = function() {
|
|
16
|
+
try {
|
|
17
|
+
inner.call(this);
|
|
18
|
+
} catch (e) {
|
|
19
|
+
return Promise.reject(e);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
stack.push([async, dispose, value]);
|
|
23
|
+
} else if (async) {
|
|
24
|
+
stack.push([async]);
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
};
|
|
28
|
+
var __callDispose = (stack, error, hasError) => {
|
|
29
|
+
var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
|
|
30
|
+
return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
|
|
31
|
+
};
|
|
32
|
+
var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
|
|
33
|
+
var next = (it) => {
|
|
34
|
+
while (it = stack.pop()) {
|
|
35
|
+
try {
|
|
36
|
+
var result = it[1] && it[1].call(it[2]);
|
|
37
|
+
if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
|
|
38
|
+
} catch (e) {
|
|
39
|
+
fail(e);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (hasError) throw error;
|
|
43
|
+
};
|
|
44
|
+
return next();
|
|
45
|
+
};
|
|
1
46
|
/**
|
|
2
47
|
* @license
|
|
3
48
|
* Copyright 2022-2025 Matter.js Authors
|
|
@@ -6,21 +51,25 @@
|
|
|
6
51
|
import { Invoke } from "#action/request/Invoke.js";
|
|
7
52
|
import { resolvePathForSpecifier } from "#action/request/Specifier.js";
|
|
8
53
|
import {
|
|
54
|
+
Abort,
|
|
9
55
|
BasicSet,
|
|
10
56
|
Diagnostic,
|
|
11
57
|
Duration,
|
|
12
|
-
|
|
58
|
+
Entropy,
|
|
13
59
|
ImplementationError,
|
|
14
60
|
isObject,
|
|
15
61
|
Logger,
|
|
62
|
+
RetrySchedule,
|
|
16
63
|
Seconds
|
|
17
64
|
} from "#general";
|
|
18
65
|
import { InteractionClientMessenger, MessageType } from "#interaction/InteractionMessenger.js";
|
|
19
|
-
import { InteractionQueue } from "#peer/InteractionQueue.js";
|
|
20
66
|
import { ExchangeProvider } from "#protocol/ExchangeProvider.js";
|
|
67
|
+
import { SecureSession } from "#session/SecureSession.js";
|
|
21
68
|
import { Status, TlvNoResponse, TlvSubscribeResponse } from "#types";
|
|
22
|
-
import { ClientSubscriptions } from "./ClientSubscriptions.js";
|
|
23
69
|
import { InputChunk } from "./InputChunk.js";
|
|
70
|
+
import { ClientSubscriptions } from "./subscription/ClientSubscriptions.js";
|
|
71
|
+
import { PeerSubscription } from "./subscription/PeerSubscription.js";
|
|
72
|
+
import { SustainedSubscription } from "./subscription/SustainedSubscription.js";
|
|
24
73
|
const logger = Logger.get("ClientInteraction");
|
|
25
74
|
const DEFAULT_MIN_INTERVAL_FLOOR = Seconds(1);
|
|
26
75
|
const DEFAULT_TIMED_REQUEST_TIMEOUT = Seconds(10);
|
|
@@ -28,16 +77,20 @@ const DEFAULT_MINIMUM_RESPONSE_TIMEOUT_WITH_FAILSAFE = Seconds(30);
|
|
|
28
77
|
class ClientInteraction {
|
|
29
78
|
#exchanges;
|
|
30
79
|
#subscriptions;
|
|
31
|
-
#queue;
|
|
32
80
|
#interactions = new BasicSet();
|
|
33
|
-
#
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
this.#
|
|
37
|
-
this.#
|
|
81
|
+
#abort;
|
|
82
|
+
#sustainRetries;
|
|
83
|
+
constructor({ environment, abort, sustainRetries }) {
|
|
84
|
+
this.#exchanges = environment.get(ExchangeProvider);
|
|
85
|
+
this.#subscriptions = environment.get(ClientSubscriptions);
|
|
86
|
+
this.#abort = Abort.subtask(abort);
|
|
87
|
+
this.#sustainRetries = new RetrySchedule(
|
|
88
|
+
environment.get(Entropy),
|
|
89
|
+
RetrySchedule.Configuration(SustainedSubscription.DefaultRetrySchedule, sustainRetries)
|
|
90
|
+
);
|
|
38
91
|
}
|
|
39
92
|
async close() {
|
|
40
|
-
this.#
|
|
93
|
+
this.#abort();
|
|
41
94
|
while (this.#interactions.size) {
|
|
42
95
|
await this.#interactions.deleted;
|
|
43
96
|
}
|
|
@@ -45,37 +98,31 @@ class ClientInteraction {
|
|
|
45
98
|
get subscriptions() {
|
|
46
99
|
return this.#subscriptions;
|
|
47
100
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
exchanges: env.get(ExchangeProvider),
|
|
54
|
-
subscriptions: env.get(ClientSubscriptions),
|
|
55
|
-
queue: env.get(InteractionQueue)
|
|
56
|
-
});
|
|
57
|
-
env.set(ClientInteraction, instance);
|
|
58
|
-
return instance;
|
|
59
|
-
}
|
|
60
|
-
async *read(request, _session) {
|
|
61
|
-
const readPathsCount = (request.attributeRequests?.length ?? 0) + (request.eventRequests?.length ?? 0);
|
|
62
|
-
if (readPathsCount > 9) {
|
|
63
|
-
logger.debug(
|
|
64
|
-
"Read interactions with more then 9 paths might be not allowed by the device. Consider splitting then into several read requests."
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
this.#begin(request);
|
|
68
|
-
let messenger;
|
|
101
|
+
/**
|
|
102
|
+
* Read attributes and events.
|
|
103
|
+
*/
|
|
104
|
+
async *read(request, session) {
|
|
105
|
+
var _stack = [];
|
|
69
106
|
try {
|
|
70
|
-
|
|
107
|
+
const readPathsCount = (request.attributeRequests?.length ?? 0) + (request.eventRequests?.length ?? 0);
|
|
108
|
+
if (readPathsCount > 9) {
|
|
109
|
+
logger.debug(
|
|
110
|
+
"Read interactions with more then 9 paths might be not allowed by the device. Consider splitting then into several read requests."
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
const context = __using(_stack, await this.#begin(request, session), true);
|
|
114
|
+
const { checkAbort, messenger } = context;
|
|
71
115
|
logger.debug("Read \xBB", messenger.exchange.via, request);
|
|
72
116
|
await messenger.sendReadRequest(request);
|
|
117
|
+
checkAbort();
|
|
73
118
|
let attributeReportCount = 0;
|
|
74
119
|
let eventReportCount = 0;
|
|
75
120
|
for await (const report of messenger.readDataReports()) {
|
|
121
|
+
checkAbort();
|
|
76
122
|
attributeReportCount += report.attributeReports?.length ?? 0;
|
|
77
123
|
eventReportCount += report.eventReports?.length ?? 0;
|
|
78
124
|
yield InputChunk(report);
|
|
125
|
+
checkAbort();
|
|
79
126
|
}
|
|
80
127
|
logger.debug(
|
|
81
128
|
"Read \xAB",
|
|
@@ -84,26 +131,31 @@ class ClientInteraction {
|
|
|
84
131
|
attributeReportCount + eventReportCount === 0 ? "(empty)" : Diagnostic.dict({ attributes: attributeReportCount, events: eventReportCount })
|
|
85
132
|
)
|
|
86
133
|
);
|
|
134
|
+
} catch (_) {
|
|
135
|
+
var _error = _, _hasError = true;
|
|
87
136
|
} finally {
|
|
88
|
-
|
|
89
|
-
|
|
137
|
+
var _promise = __callDispose(_stack, _error, _hasError);
|
|
138
|
+
_promise && await _promise;
|
|
90
139
|
}
|
|
91
140
|
}
|
|
92
141
|
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
142
|
+
* Update node attributes.
|
|
143
|
+
*
|
|
144
|
+
* Writes with the Matter protocol are generally not atomic, so this method only throws if the entire action fails.
|
|
145
|
+
* You must check each {@link WriteResult.AttributeStatus} to determine whether individual updates failed.
|
|
96
146
|
*/
|
|
97
|
-
async write(request,
|
|
98
|
-
|
|
99
|
-
let messenger;
|
|
147
|
+
async write(request, session) {
|
|
148
|
+
var _stack = [];
|
|
100
149
|
try {
|
|
101
|
-
|
|
150
|
+
const context = __using(_stack, await this.#begin(request, session), true);
|
|
151
|
+
const { checkAbort, messenger } = context;
|
|
102
152
|
if (request.timedRequest) {
|
|
103
153
|
await messenger.sendTimedRequest(request.timeout ?? DEFAULT_TIMED_REQUEST_TIMEOUT);
|
|
154
|
+
checkAbort();
|
|
104
155
|
}
|
|
105
156
|
logger.info("Write \xBB", messenger.exchange.via, request);
|
|
106
157
|
const response = await messenger.sendWriteCommand(request);
|
|
158
|
+
checkAbort();
|
|
107
159
|
if (request.suppressResponse) {
|
|
108
160
|
return void 0;
|
|
109
161
|
}
|
|
@@ -144,18 +196,24 @@ class ClientInteraction {
|
|
|
144
196
|
)
|
|
145
197
|
);
|
|
146
198
|
return result;
|
|
199
|
+
} catch (_) {
|
|
200
|
+
var _error = _, _hasError = true;
|
|
147
201
|
} finally {
|
|
148
|
-
|
|
149
|
-
|
|
202
|
+
var _promise = __callDispose(_stack, _error, _hasError);
|
|
203
|
+
_promise && await _promise;
|
|
150
204
|
}
|
|
151
205
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
206
|
+
/**
|
|
207
|
+
* Invoke one or more commands.
|
|
208
|
+
*/
|
|
209
|
+
async *invoke(request, session) {
|
|
210
|
+
var _stack = [];
|
|
155
211
|
try {
|
|
156
|
-
|
|
212
|
+
const context = __using(_stack, await this.#begin(request, session), true);
|
|
213
|
+
const { checkAbort, messenger } = context;
|
|
157
214
|
if (request.timedRequest) {
|
|
158
215
|
await messenger.sendTimedRequest(request.timeout ?? DEFAULT_TIMED_REQUEST_TIMEOUT);
|
|
216
|
+
checkAbort();
|
|
159
217
|
}
|
|
160
218
|
logger.info(
|
|
161
219
|
"Invoke \xBB",
|
|
@@ -168,6 +226,7 @@ class ClientInteraction {
|
|
|
168
226
|
request,
|
|
169
227
|
expectedProcessingTime ?? (useExtendedFailSafeMessageResponseTimeout ? DEFAULT_MINIMUM_RESPONSE_TIMEOUT_WITH_FAILSAFE : void 0)
|
|
170
228
|
);
|
|
229
|
+
checkAbort();
|
|
171
230
|
if (!request.suppressResponse) {
|
|
172
231
|
if (result && result.invokeResponses?.length) {
|
|
173
232
|
const chunk = result.invokeResponses.map((response) => {
|
|
@@ -233,64 +292,98 @@ class ClientInteraction {
|
|
|
233
292
|
} else {
|
|
234
293
|
yield [];
|
|
235
294
|
}
|
|
295
|
+
checkAbort();
|
|
236
296
|
}
|
|
297
|
+
} catch (_) {
|
|
298
|
+
var _error = _, _hasError = true;
|
|
237
299
|
} finally {
|
|
238
|
-
|
|
239
|
-
|
|
300
|
+
var _promise = __callDispose(_stack, _error, _hasError);
|
|
301
|
+
_promise && await _promise;
|
|
240
302
|
}
|
|
241
303
|
}
|
|
242
|
-
|
|
304
|
+
/**
|
|
305
|
+
* Subscribe to attribute values and events.
|
|
306
|
+
*/
|
|
307
|
+
async subscribe(request, session) {
|
|
243
308
|
const subscriptionPathsCount = (request.attributeRequests?.length ?? 0) + (request.eventRequests?.length ?? 0);
|
|
244
309
|
if (subscriptionPathsCount > 3) {
|
|
245
310
|
logger.debug("Subscribe interactions with more then 3 paths might be not allowed by the device.");
|
|
246
311
|
}
|
|
247
312
|
if (!request.keepSubscriptions) {
|
|
248
|
-
for (const
|
|
313
|
+
for (const subscription2 of this.#subscriptions) {
|
|
249
314
|
logger.debug(
|
|
250
|
-
`Removing subscription with ID ${
|
|
315
|
+
`Removing subscription with ID ${subscription2.subscriptionId} because new subscription replaces it`
|
|
251
316
|
);
|
|
252
|
-
|
|
317
|
+
subscription2.close();
|
|
253
318
|
}
|
|
254
319
|
}
|
|
255
|
-
this.#
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
messenger
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
320
|
+
SecureSession.assert(this.#exchanges.session);
|
|
321
|
+
const peer = this.#exchanges.session.peerAddress;
|
|
322
|
+
const subscribe = async (request2) => {
|
|
323
|
+
var _stack = [];
|
|
324
|
+
try {
|
|
325
|
+
const context = __using(_stack, await this.#begin(request2, session), true);
|
|
326
|
+
const { checkAbort, messenger } = context;
|
|
327
|
+
logger.info(
|
|
328
|
+
"Subscribe \xBB",
|
|
329
|
+
messenger.exchange.via,
|
|
330
|
+
Diagnostic.asFlags({ keepSubscriptions: request2.keepSubscriptions }),
|
|
331
|
+
Diagnostic.dict({
|
|
332
|
+
min: Duration.format(request2.minIntervalFloor),
|
|
333
|
+
max: Duration.format(request2.maxIntervalCeiling)
|
|
334
|
+
}),
|
|
335
|
+
request2
|
|
336
|
+
);
|
|
337
|
+
await messenger.sendSubscribeRequest({
|
|
338
|
+
minIntervalFloorSeconds: Seconds.of(DEFAULT_MIN_INTERVAL_FLOOR),
|
|
339
|
+
maxIntervalCeilingSeconds: Seconds.of(DEFAULT_MIN_INTERVAL_FLOOR),
|
|
340
|
+
// TODO use better max fallback
|
|
341
|
+
...request2
|
|
342
|
+
});
|
|
343
|
+
checkAbort();
|
|
344
|
+
await this.#handleSubscriptionResponse(request2, readChunks(messenger));
|
|
345
|
+
checkAbort();
|
|
346
|
+
const responseMessage = await messenger.nextMessage(MessageType.SubscribeResponse);
|
|
347
|
+
const response = TlvSubscribeResponse.decode(responseMessage.payload);
|
|
348
|
+
logger.info(
|
|
349
|
+
"Subscription successful \xAB",
|
|
350
|
+
messenger.exchange.via,
|
|
351
|
+
Diagnostic.dict({
|
|
352
|
+
id: response.subscriptionId,
|
|
353
|
+
interval: Duration.format(Seconds(response.maxInterval))
|
|
354
|
+
})
|
|
355
|
+
);
|
|
356
|
+
const subscription2 = new PeerSubscription({
|
|
357
|
+
request: request2,
|
|
358
|
+
peer,
|
|
359
|
+
closed: () => this.#subscriptions.delete(subscription2),
|
|
360
|
+
response,
|
|
361
|
+
abort: session?.abort
|
|
362
|
+
});
|
|
363
|
+
this.#subscriptions.addPeer(subscription2);
|
|
364
|
+
return subscription2;
|
|
365
|
+
} catch (_) {
|
|
366
|
+
var _error = _, _hasError = true;
|
|
367
|
+
} finally {
|
|
368
|
+
var _promise = __callDispose(_stack, _error, _hasError);
|
|
369
|
+
_promise && await _promise;
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
let subscription;
|
|
373
|
+
if (request.sustain) {
|
|
374
|
+
subscription = new SustainedSubscription({
|
|
375
|
+
subscribe,
|
|
376
|
+
peer,
|
|
377
|
+
closed: () => this.#subscriptions.delete(subscription),
|
|
378
|
+
request,
|
|
379
|
+
abort: session?.abort,
|
|
380
|
+
retries: this.#sustainRetries
|
|
274
381
|
});
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
const response = TlvSubscribeResponse.decode(responseMessage.payload);
|
|
278
|
-
logger.info(
|
|
279
|
-
"Subscription successful \xAB",
|
|
280
|
-
messenger.exchange.via,
|
|
281
|
-
Diagnostic.dict({
|
|
282
|
-
subId: response.subscriptionId,
|
|
283
|
-
interval: Duration.format(Seconds(response.maxInterval))
|
|
284
|
-
})
|
|
285
|
-
);
|
|
286
|
-
return this.#subscriptions.add(request, response);
|
|
287
|
-
} finally {
|
|
288
|
-
await messenger?.close();
|
|
289
|
-
this.#end(request);
|
|
382
|
+
} else {
|
|
383
|
+
subscription = await subscribe(request);
|
|
290
384
|
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
this.#subscriptions.get(id)?.close();
|
|
385
|
+
this.#subscriptions.addActive(subscription);
|
|
386
|
+
return subscription;
|
|
294
387
|
}
|
|
295
388
|
async #handleSubscriptionResponse(request, result) {
|
|
296
389
|
if (request.updated) {
|
|
@@ -299,14 +392,27 @@ class ClientInteraction {
|
|
|
299
392
|
for await (const _chunk of result) ;
|
|
300
393
|
}
|
|
301
394
|
}
|
|
302
|
-
#begin(request) {
|
|
303
|
-
if (this.#
|
|
395
|
+
async #begin(request, session) {
|
|
396
|
+
if (this.#abort.aborted) {
|
|
304
397
|
throw new ImplementationError("Client interaction unavailable after close");
|
|
305
398
|
}
|
|
306
399
|
this.#interactions.add(request);
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
400
|
+
const checkAbort = Abort.checkerFor(session);
|
|
401
|
+
const messenger = await InteractionClientMessenger.create(this.#exchanges);
|
|
402
|
+
const context = {
|
|
403
|
+
checkAbort,
|
|
404
|
+
messenger,
|
|
405
|
+
[Symbol.asyncDispose]: async () => {
|
|
406
|
+
await messenger.close();
|
|
407
|
+
this.#interactions.delete(request);
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
try {
|
|
411
|
+
context.checkAbort();
|
|
412
|
+
} catch (e) {
|
|
413
|
+
await context[Symbol.asyncDispose]();
|
|
414
|
+
}
|
|
415
|
+
return context;
|
|
310
416
|
}
|
|
311
417
|
}
|
|
312
418
|
async function* readChunks(messenger) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/action/client/ClientInteraction.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAuB,cAAc;AAErC,SAAS,+BAA+B;
|
|
5
|
-
"names": []
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["subscription", "request"]
|
|
6
6
|
}
|
|
@@ -4,9 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
export * from "./ClientInteraction.js";
|
|
7
|
-
export * from "./ClientSubscription.js";
|
|
8
|
-
export * from "./ClientSubscriptionHandler.js";
|
|
9
|
-
export * from "./ClientSubscriptions.js";
|
|
10
7
|
export * from "./InputChunk.js";
|
|
11
8
|
export * from "./ReadScope.js";
|
|
9
|
+
export * from "./subscription/index.js";
|
|
12
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/action/client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,wBAAwB,CAAC;AACvC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/action/client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC"}
|
|
@@ -4,9 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
export * from "./ClientInteraction.js";
|
|
7
|
-
export * from "./ClientSubscription.js";
|
|
8
|
-
export * from "./ClientSubscriptionHandler.js";
|
|
9
|
-
export * from "./ClientSubscriptions.js";
|
|
10
7
|
export * from "./InputChunk.js";
|
|
11
8
|
export * from "./ReadScope.js";
|
|
9
|
+
export * from "./subscription/index.js";
|
|
12
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/action/client/index.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Subscribe } from "#action/request/Subscribe.js";
|
|
2
|
+
export interface ClientSubscribe extends Subscribe {
|
|
3
|
+
/**
|
|
4
|
+
* If true the subscription is virtualized and the underlying subscription is reestablished when lost.
|
|
5
|
+
*/
|
|
6
|
+
sustain?: boolean;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=ClientSubscribe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClientSubscribe.d.ts","sourceRoot":"","sources":["../../../../../src/action/client/subscription/ClientSubscribe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAC9C;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=ClientSubscribe.js.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { Subscribe } from "#action/request/Subscribe.js";
|
|
7
|
+
import type { ActiveSubscription } from "#action/response/SubscribeResult.js";
|
|
8
|
+
import { Abort, Logger } from "#general";
|
|
9
|
+
import { PeerAddress } from "#peer/PeerAddress.js";
|
|
10
|
+
import { ClientSubscribe } from "./ClientSubscribe.js";
|
|
11
|
+
/**
|
|
12
|
+
* The client view of an established Matter subscription.
|
|
13
|
+
*/
|
|
14
|
+
export declare abstract class ClientSubscription implements ActiveSubscription {
|
|
15
|
+
#private;
|
|
16
|
+
readonly request: Subscribe;
|
|
17
|
+
readonly peer: PeerAddress;
|
|
18
|
+
abstract subscriptionId: number;
|
|
19
|
+
abstract maxInterval: number;
|
|
20
|
+
abstract interactionModelRevision: number;
|
|
21
|
+
/**
|
|
22
|
+
* If the subscription has an async worker, this is the promise associated with the worker.
|
|
23
|
+
*/
|
|
24
|
+
done?: Promise<void>;
|
|
25
|
+
constructor({ request, peer, closed, abort }: ClientSubscription.Configuration);
|
|
26
|
+
close(): void;
|
|
27
|
+
protected get abort(): Abort;
|
|
28
|
+
protected get logger(): Logger;
|
|
29
|
+
}
|
|
30
|
+
export declare namespace ClientSubscription {
|
|
31
|
+
interface Configuration {
|
|
32
|
+
request: ClientSubscribe;
|
|
33
|
+
peer: PeerAddress;
|
|
34
|
+
closed: () => void;
|
|
35
|
+
abort?: AbortSignal;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=ClientSubscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClientSubscription.d.ts","sourceRoot":"","sources":["../../../../../src/action/client/subscription/ClientSubscription.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAc,MAAM,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIvD;;GAEG;AACH,8BAAsB,kBAAmB,YAAW,kBAAkB;;IAClE,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAE1C;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBAMT,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,aAAa;IAU9E,KAAK;IA4BL,SAAS,KAAK,KAAK,UAElB;IAED,SAAS,KAAK,MAAM,WAEnB;CACJ;AAED,yBAAiB,kBAAkB,CAAC;IAChC,UAAiB,aAAa;QAC1B,OAAO,EAAE,eAAe,CAAC;QACzB,IAAI,EAAE,WAAW,CAAC;QAClB,MAAM,EAAE,MAAM,IAAI,CAAC;QACnB,KAAK,CAAC,EAAE,WAAW,CAAC;KACvB;CACJ"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Abort, Diagnostic, Logger } from "#general";
|
|
7
|
+
const logger = Logger.get("ClientSubscription");
|
|
8
|
+
class ClientSubscription {
|
|
9
|
+
request;
|
|
10
|
+
peer;
|
|
11
|
+
/**
|
|
12
|
+
* If the subscription has an async worker, this is the promise associated with the worker.
|
|
13
|
+
*/
|
|
14
|
+
done;
|
|
15
|
+
#closed;
|
|
16
|
+
#abort;
|
|
17
|
+
#isClosed = false;
|
|
18
|
+
constructor({ request, peer, closed, abort }) {
|
|
19
|
+
this.request = request;
|
|
20
|
+
this.peer = peer;
|
|
21
|
+
this.#closed = closed;
|
|
22
|
+
this.#abort = new Abort({
|
|
23
|
+
abort,
|
|
24
|
+
handler: this.close.bind(this)
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
close() {
|
|
28
|
+
if (this.#isClosed) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.#isClosed = true;
|
|
32
|
+
this.#abort();
|
|
33
|
+
this.#closed();
|
|
34
|
+
const unhandledError = (e) => {
|
|
35
|
+
this.logger.error("Unhandled error in subscription to", Diagnostic.strong(this.peer.toString()), e);
|
|
36
|
+
};
|
|
37
|
+
if (this.done) {
|
|
38
|
+
this.done.finally(() => {
|
|
39
|
+
this.request.closed?.();
|
|
40
|
+
}).catch(unhandledError);
|
|
41
|
+
} else {
|
|
42
|
+
try {
|
|
43
|
+
this.request.closed?.();
|
|
44
|
+
} catch (e) {
|
|
45
|
+
unhandledError(e);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
get abort() {
|
|
50
|
+
return this.#abort;
|
|
51
|
+
}
|
|
52
|
+
get logger() {
|
|
53
|
+
return logger;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export {
|
|
57
|
+
ClientSubscription
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=ClientSubscription.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/action/client/subscription/ClientSubscription.ts"],
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,OAAO,YAAY,cAAc;AAI1C,MAAM,SAAS,OAAO,IAAI,oBAAoB;AAKvC,MAAe,mBAAiD;AAAA,EAC1D;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAQT;AAAA,EAES;AAAA,EACA;AAAA,EACT,YAAY;AAAA,EAEZ,YAAY,EAAE,SAAS,MAAM,QAAQ,MAAM,GAAqC;AAC5E,SAAK,UAAU;AACf,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,SAAS,IAAI,MAAM;AAAA,MACpB;AAAA,MACA,SAAS,KAAK,MAAM,KAAK,IAAI;AAAA,IACjC,CAAC;AAAA,EACL;AAAA,EAEA,QAAQ;AACJ,QAAI,KAAK,WAAW;AAChB;AAAA,IACJ;AACA,SAAK,YAAY;AAEjB,SAAK,OAAO;AACZ,SAAK,QAAQ;AAEb,UAAM,iBAAiB,CAAC,MAAe;AACnC,WAAK,OAAO,MAAM,sCAAsC,WAAW,OAAO,KAAK,KAAK,SAAS,CAAC,GAAG,CAAC;AAAA,IACtG;AAEA,QAAI,KAAK,MAAM;AACX,WAAK,KACA,QAAQ,MAAM;AACX,aAAK,QAAQ,SAAS;AAAA,MAC1B,CAAC,EACA,MAAM,cAAc;AAAA,IAC7B,OAAO;AACH,UAAI;AACA,aAAK,QAAQ,SAAS;AAAA,MAC1B,SAAS,GAAG;AACR,uBAAe,CAAC;AAAA,MACpB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,IAAc,QAAQ;AAClB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAc,SAAS;AACnB,WAAO;AAAA,EACX;AACJ;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClientSubscriptionHandler.d.ts","sourceRoot":"","sources":["../../../../../src/action/client/subscription/ClientSubscriptionHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAI/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI/D;;GAEG;AACH,qBAAa,yBAA0B,YAAW,eAAe;;IAC7D,EAAE,SAA2B;IAC7B,qBAAqB,UAAQ;gBAIjB,aAAa,EAAE,mBAAmB;IAIxC,aAAa,CAAC,QAAQ,EAAE,eAAe;IAyDvC,KAAK;CACd"}
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
import { Diagnostic, InternalError, Logger } from "#general";
|
|
7
7
|
import { DecodedDataReport } from "#interaction/DecodedDataReport.js";
|
|
8
8
|
import { IncomingInteractionClientMessenger } from "#interaction/InteractionMessenger.js";
|
|
9
|
+
import { SecureSession } from "#session/SecureSession.js";
|
|
9
10
|
import { INTERACTION_PROTOCOL_ID, Status } from "#types";
|
|
10
|
-
import { InputChunk } from "
|
|
11
|
+
import { InputChunk } from "../InputChunk.js";
|
|
11
12
|
const logger = Logger.get("ClientSubscriptionHandler");
|
|
12
13
|
class ClientSubscriptionHandler {
|
|
13
14
|
id = INTERACTION_PROTOCOL_ID;
|
|
@@ -30,7 +31,9 @@ class ClientSubscriptionHandler {
|
|
|
30
31
|
await sendInvalid(messenger, void 0);
|
|
31
32
|
return;
|
|
32
33
|
}
|
|
33
|
-
const
|
|
34
|
+
const { session } = exchange.channel;
|
|
35
|
+
SecureSession.assert(session);
|
|
36
|
+
const subscription = this.#subscriptions.getPeer(session.peerAddress, subscriptionId);
|
|
34
37
|
if (subscription === void 0) {
|
|
35
38
|
logger.debug("Ignoring data report for unknown subscription ID", Diagnostic.strong(subscriptionId));
|
|
36
39
|
await sendInvalid(messenger, subscriptionId);
|