@matter/nodejs 0.16.0-alpha.0-20251203-aaf94bca8 → 0.16.0-alpha.0-20251207-37e501b18
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/net/NodeJsUdpChannel.d.ts +3 -3
- package/dist/cjs/net/NodeJsUdpChannel.d.ts.map +1 -1
- package/dist/cjs/net/NodeJsUdpChannel.js +132 -49
- package/dist/cjs/net/NodeJsUdpChannel.js.map +2 -2
- package/dist/esm/net/NodeJsUdpChannel.d.ts +3 -3
- package/dist/esm/net/NodeJsUdpChannel.d.ts.map +1 -1
- package/dist/esm/net/NodeJsUdpChannel.js +133 -49
- package/dist/esm/net/NodeJsUdpChannel.js.map +2 -2
- package/package.json +10 -10
- package/src/net/NodeJsUdpChannel.ts +25 -5
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
* Copyright 2022-2025 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { Bytes, ChannelType, UdpChannel, UdpChannelOptions, UdpSocketType } from "#general";
|
|
6
|
+
import { Bytes, ChannelType, Lifetime, UdpChannel, UdpChannelOptions, UdpSocketType } from "#general";
|
|
7
7
|
import * as dgram from "node:dgram";
|
|
8
8
|
export declare class NodeJsUdpChannel implements UdpChannel {
|
|
9
9
|
#private;
|
|
10
|
-
static create({ listeningPort, type, listeningAddress, netInterface, reuseAddress }: UdpChannelOptions): Promise<NodeJsUdpChannel>;
|
|
10
|
+
static create({ lifetime: lifetimeOwner, listeningPort, type, listeningAddress, netInterface, reuseAddress, }: UdpChannelOptions): Promise<NodeJsUdpChannel>;
|
|
11
11
|
readonly maxPayloadSize: number;
|
|
12
|
-
constructor(type: UdpSocketType, socket: dgram.Socket, netInterface?: string);
|
|
12
|
+
constructor(lifetime: Lifetime, type: UdpSocketType, socket: dgram.Socket, netInterface?: string);
|
|
13
13
|
addMembership(membershipAddress: string): void;
|
|
14
14
|
dropMembership(membershipAddress: string): void;
|
|
15
15
|
onData(listener: (netInterface: string | undefined, peerAddress: string, peerPort: number, data: Bytes) => void): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeJsUdpChannel.d.ts","sourceRoot":"","sources":["../../../src/net/NodeJsUdpChannel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAGH,KAAK,EACL,WAAW,
|
|
1
|
+
{"version":3,"file":"NodeJsUdpChannel.d.ts","sourceRoot":"","sources":["../../../src/net/NodeJsUdpChannel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAGH,KAAK,EACL,WAAW,EAMX,QAAQ,EASR,UAAU,EACV,iBAAiB,EACjB,aAAa,EAChB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAqDpC,qBAAa,gBAAiB,YAAW,UAAU;;WAMlC,MAAM,CAAC,EAChB,QAAQ,EAAE,aAAa,EACvB,aAAa,EACb,IAAI,EACJ,gBAAgB,EAChB,YAAY,EACZ,YAAY,GACf,EAAE,iBAAiB;IAgEpB,QAAQ,CAAC,cAAc,SAAwB;gBAWnC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IAOhG,aAAa,CAAC,iBAAiB,EAAE,MAAM;IAkBvC,cAAc,CAAC,iBAAiB,EAAE,MAAM;IAkBxC,MAAM,CAAC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI;;;IAoCzG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK;IAsC5C,KAAK;IAWX,IAAI,IAAI,WAEP;IAED,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM;CAiB/C"}
|
|
@@ -5,6 +5,10 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
|
|
9
|
+
var __typeError = (msg) => {
|
|
10
|
+
throw TypeError(msg);
|
|
11
|
+
};
|
|
8
12
|
var __export = (target, all) => {
|
|
9
13
|
for (var name in all)
|
|
10
14
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -26,6 +30,47 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
30
|
mod
|
|
27
31
|
));
|
|
28
32
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
33
|
+
var __using = (stack, value, async) => {
|
|
34
|
+
if (value != null) {
|
|
35
|
+
if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
|
|
36
|
+
var dispose, inner;
|
|
37
|
+
if (async) dispose = value[__knownSymbol("asyncDispose")];
|
|
38
|
+
if (dispose === void 0) {
|
|
39
|
+
dispose = value[__knownSymbol("dispose")];
|
|
40
|
+
if (async) inner = dispose;
|
|
41
|
+
}
|
|
42
|
+
if (typeof dispose !== "function") __typeError("Object not disposable");
|
|
43
|
+
if (inner) dispose = function() {
|
|
44
|
+
try {
|
|
45
|
+
inner.call(this);
|
|
46
|
+
} catch (e) {
|
|
47
|
+
return Promise.reject(e);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
stack.push([async, dispose, value]);
|
|
51
|
+
} else if (async) {
|
|
52
|
+
stack.push([async]);
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
};
|
|
56
|
+
var __callDispose = (stack, error, hasError) => {
|
|
57
|
+
var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
|
|
58
|
+
return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
|
|
59
|
+
};
|
|
60
|
+
var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
|
|
61
|
+
var next = (it) => {
|
|
62
|
+
while (it = stack.pop()) {
|
|
63
|
+
try {
|
|
64
|
+
var result = it[1] && it[1].call(it[2]);
|
|
65
|
+
if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
|
|
66
|
+
} catch (e) {
|
|
67
|
+
fail(e);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (hasError) throw error;
|
|
71
|
+
};
|
|
72
|
+
return next();
|
|
73
|
+
};
|
|
29
74
|
var NodeJsUdpChannel_exports = {};
|
|
30
75
|
__export(NodeJsUdpChannel_exports, {
|
|
31
76
|
NodeJsUdpChannel: () => NodeJsUdpChannel
|
|
@@ -83,57 +128,86 @@ function createDgramSocket(host, port, options) {
|
|
|
83
128
|
});
|
|
84
129
|
}
|
|
85
130
|
class NodeJsUdpChannel {
|
|
131
|
+
#lifetime;
|
|
86
132
|
#type;
|
|
87
133
|
#socket;
|
|
88
134
|
#netInterface;
|
|
89
|
-
static async create({
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (type === "
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
135
|
+
static async create({
|
|
136
|
+
lifetime: lifetimeOwner,
|
|
137
|
+
listeningPort,
|
|
138
|
+
type,
|
|
139
|
+
listeningAddress,
|
|
140
|
+
netInterface,
|
|
141
|
+
reuseAddress
|
|
142
|
+
}) {
|
|
143
|
+
var _stack2 = [];
|
|
144
|
+
try {
|
|
145
|
+
const name = `${listeningAddress?.includes(":") ? `[${listeningAddress}]` : listeningAddress ?? "*"}:${listeningPort}`;
|
|
146
|
+
const lifetime = __using(_stack2, (lifetimeOwner ?? import_general.Lifetime.process).join("socket", import_general.Diagnostic.strong(name)));
|
|
147
|
+
lifetime.details.intf = netInterface;
|
|
148
|
+
let dgramType;
|
|
149
|
+
switch (type) {
|
|
150
|
+
case "udp":
|
|
151
|
+
case "udp6":
|
|
152
|
+
dgramType = "udp6";
|
|
153
|
+
break;
|
|
154
|
+
case "udp4":
|
|
155
|
+
dgramType = "udp4";
|
|
156
|
+
break;
|
|
157
|
+
default:
|
|
158
|
+
throw new import_general.ImplementationError(`Unrecognized UDP socket type ${type}`);
|
|
159
|
+
}
|
|
160
|
+
const socketOptions = { type: dgramType };
|
|
161
|
+
if (type === "udp6") {
|
|
162
|
+
socketOptions.ipv6Only = true;
|
|
163
|
+
}
|
|
164
|
+
if (reuseAddress) {
|
|
165
|
+
socketOptions.reuseAddr = true;
|
|
166
|
+
}
|
|
167
|
+
let socket;
|
|
168
|
+
{
|
|
169
|
+
var _stack = [];
|
|
170
|
+
try {
|
|
171
|
+
const _creating = __using(_stack, lifetime.join("creating"));
|
|
172
|
+
socket = await createDgramSocket(listeningAddress, listeningPort, socketOptions);
|
|
173
|
+
} catch (_) {
|
|
174
|
+
var _error = _, _hasError = true;
|
|
175
|
+
} finally {
|
|
176
|
+
__callDispose(_stack, _error, _hasError);
|
|
119
177
|
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
|
|
178
|
+
}
|
|
179
|
+
socket.setBroadcast(true);
|
|
180
|
+
let netInterfaceZone;
|
|
181
|
+
if (netInterface !== void 0) {
|
|
182
|
+
netInterfaceZone = import_NodeJsNetwork.NodeJsNetwork.getNetInterfaceZoneIpv6(netInterface);
|
|
183
|
+
let multicastInterface;
|
|
184
|
+
if (type === "udp4") {
|
|
185
|
+
multicastInterface = import_NodeJsNetwork.NodeJsNetwork.getMulticastInterfaceIpv4(netInterface);
|
|
186
|
+
if (multicastInterface === void 0) {
|
|
187
|
+
throw new import_general.NoAddressAvailableError(`No IPv4 addresses on interface "${netInterface}"`);
|
|
188
|
+
}
|
|
189
|
+
} else {
|
|
190
|
+
if (netInterfaceZone === void 0) {
|
|
191
|
+
throw new import_general.NoAddressAvailableError(`No IPv6 addresses on interface "${netInterface}"`);
|
|
192
|
+
}
|
|
193
|
+
multicastInterface = `::%${netInterfaceZone}`;
|
|
123
194
|
}
|
|
124
|
-
|
|
195
|
+
logger.debug(
|
|
196
|
+
"Initialize multicast",
|
|
197
|
+
import_general.Diagnostic.dict({
|
|
198
|
+
address: `${multicastInterface}:${listeningPort}`,
|
|
199
|
+
interface: netInterface,
|
|
200
|
+
type
|
|
201
|
+
})
|
|
202
|
+
);
|
|
203
|
+
socket.setMulticastInterface(multicastInterface);
|
|
125
204
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
type
|
|
132
|
-
})
|
|
133
|
-
);
|
|
134
|
-
socket.setMulticastInterface(multicastInterface);
|
|
205
|
+
return new NodeJsUdpChannel(lifetime, type, socket, netInterfaceZone);
|
|
206
|
+
} catch (_2) {
|
|
207
|
+
var _error2 = _2, _hasError2 = true;
|
|
208
|
+
} finally {
|
|
209
|
+
__callDispose(_stack2, _error2, _hasError2);
|
|
135
210
|
}
|
|
136
|
-
return new NodeJsUdpChannel(type, socket, netInterfaceZone);
|
|
137
211
|
}
|
|
138
212
|
maxPayloadSize = import_general.MAX_UDP_MESSAGE_SIZE;
|
|
139
213
|
/**
|
|
@@ -146,7 +220,8 @@ class NodeJsUdpChannel {
|
|
|
146
220
|
() => this.#rejectDanglingSends()
|
|
147
221
|
);
|
|
148
222
|
#sendsInProgress = /* @__PURE__ */ new Map();
|
|
149
|
-
constructor(type, socket, netInterface) {
|
|
223
|
+
constructor(lifetime, type, socket, netInterface) {
|
|
224
|
+
this.#lifetime = lifetime;
|
|
150
225
|
this.#type = type;
|
|
151
226
|
this.#socket = socket;
|
|
152
227
|
this.#netInterface = netInterface;
|
|
@@ -244,12 +319,20 @@ class NodeJsUdpChannel {
|
|
|
244
319
|
return promise;
|
|
245
320
|
}
|
|
246
321
|
async close() {
|
|
322
|
+
var _stack = [];
|
|
247
323
|
try {
|
|
248
|
-
this.#
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
324
|
+
const _closing = __using(_stack, this.#lifetime.closing());
|
|
325
|
+
try {
|
|
326
|
+
await new Promise((resolve) => this.#socket.close(resolve));
|
|
327
|
+
} catch (error) {
|
|
328
|
+
if (!(error instanceof Error) || error.message !== "Not running") {
|
|
329
|
+
logger.debug("Error on closing socket", error);
|
|
330
|
+
}
|
|
252
331
|
}
|
|
332
|
+
} catch (_) {
|
|
333
|
+
var _error = _, _hasError = true;
|
|
334
|
+
} finally {
|
|
335
|
+
__callDispose(_stack, _error, _hasError);
|
|
253
336
|
}
|
|
254
337
|
}
|
|
255
338
|
get port() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/net/NodeJsUdpChannel.ts"],
|
|
4
|
-
"mappings": "
|
|
5
|
-
"names": ["error"]
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["error", "_stack", "_", "_error", "_hasError"]
|
|
6
6
|
}
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
* Copyright 2022-2025 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { Bytes, ChannelType, UdpChannel, UdpChannelOptions, UdpSocketType } from "#general";
|
|
6
|
+
import { Bytes, ChannelType, Lifetime, UdpChannel, UdpChannelOptions, UdpSocketType } from "#general";
|
|
7
7
|
import * as dgram from "node:dgram";
|
|
8
8
|
export declare class NodeJsUdpChannel implements UdpChannel {
|
|
9
9
|
#private;
|
|
10
|
-
static create({ listeningPort, type, listeningAddress, netInterface, reuseAddress }: UdpChannelOptions): Promise<NodeJsUdpChannel>;
|
|
10
|
+
static create({ lifetime: lifetimeOwner, listeningPort, type, listeningAddress, netInterface, reuseAddress, }: UdpChannelOptions): Promise<NodeJsUdpChannel>;
|
|
11
11
|
readonly maxPayloadSize: number;
|
|
12
|
-
constructor(type: UdpSocketType, socket: dgram.Socket, netInterface?: string);
|
|
12
|
+
constructor(lifetime: Lifetime, type: UdpSocketType, socket: dgram.Socket, netInterface?: string);
|
|
13
13
|
addMembership(membershipAddress: string): void;
|
|
14
14
|
dropMembership(membershipAddress: string): void;
|
|
15
15
|
onData(listener: (netInterface: string | undefined, peerAddress: string, peerPort: number, data: Bytes) => void): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeJsUdpChannel.d.ts","sourceRoot":"","sources":["../../../src/net/NodeJsUdpChannel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAGH,KAAK,EACL,WAAW,
|
|
1
|
+
{"version":3,"file":"NodeJsUdpChannel.d.ts","sourceRoot":"","sources":["../../../src/net/NodeJsUdpChannel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAGH,KAAK,EACL,WAAW,EAMX,QAAQ,EASR,UAAU,EACV,iBAAiB,EACjB,aAAa,EAChB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAqDpC,qBAAa,gBAAiB,YAAW,UAAU;;WAMlC,MAAM,CAAC,EAChB,QAAQ,EAAE,aAAa,EACvB,aAAa,EACb,IAAI,EACJ,gBAAgB,EAChB,YAAY,EACZ,YAAY,GACf,EAAE,iBAAiB;IAgEpB,QAAQ,CAAC,cAAc,SAAwB;gBAWnC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IAOhG,aAAa,CAAC,iBAAiB,EAAE,MAAM;IAkBvC,cAAc,CAAC,iBAAiB,EAAE,MAAM;IAkBxC,MAAM,CAAC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI;;;IAoCzG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK;IAsC5C,KAAK;IAWX,IAAI,IAAI,WAEP;IAED,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM;CAiB/C"}
|
|
@@ -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
|
|
@@ -13,6 +58,7 @@ import {
|
|
|
13
58
|
ImplementationError,
|
|
14
59
|
isIPv4,
|
|
15
60
|
isIPv6,
|
|
61
|
+
Lifetime,
|
|
16
62
|
Logger,
|
|
17
63
|
MAX_UDP_MESSAGE_SIZE,
|
|
18
64
|
Millis,
|
|
@@ -68,57 +114,86 @@ function createDgramSocket(host, port, options) {
|
|
|
68
114
|
});
|
|
69
115
|
}
|
|
70
116
|
class NodeJsUdpChannel {
|
|
117
|
+
#lifetime;
|
|
71
118
|
#type;
|
|
72
119
|
#socket;
|
|
73
120
|
#netInterface;
|
|
74
|
-
static async create({
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if (type === "
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
121
|
+
static async create({
|
|
122
|
+
lifetime: lifetimeOwner,
|
|
123
|
+
listeningPort,
|
|
124
|
+
type,
|
|
125
|
+
listeningAddress,
|
|
126
|
+
netInterface,
|
|
127
|
+
reuseAddress
|
|
128
|
+
}) {
|
|
129
|
+
var _stack2 = [];
|
|
130
|
+
try {
|
|
131
|
+
const name = `${listeningAddress?.includes(":") ? `[${listeningAddress}]` : listeningAddress ?? "*"}:${listeningPort}`;
|
|
132
|
+
const lifetime = __using(_stack2, (lifetimeOwner ?? Lifetime.process).join("socket", Diagnostic.strong(name)));
|
|
133
|
+
lifetime.details.intf = netInterface;
|
|
134
|
+
let dgramType;
|
|
135
|
+
switch (type) {
|
|
136
|
+
case "udp":
|
|
137
|
+
case "udp6":
|
|
138
|
+
dgramType = "udp6";
|
|
139
|
+
break;
|
|
140
|
+
case "udp4":
|
|
141
|
+
dgramType = "udp4";
|
|
142
|
+
break;
|
|
143
|
+
default:
|
|
144
|
+
throw new ImplementationError(`Unrecognized UDP socket type ${type}`);
|
|
145
|
+
}
|
|
146
|
+
const socketOptions = { type: dgramType };
|
|
147
|
+
if (type === "udp6") {
|
|
148
|
+
socketOptions.ipv6Only = true;
|
|
149
|
+
}
|
|
150
|
+
if (reuseAddress) {
|
|
151
|
+
socketOptions.reuseAddr = true;
|
|
152
|
+
}
|
|
153
|
+
let socket;
|
|
154
|
+
{
|
|
155
|
+
var _stack = [];
|
|
156
|
+
try {
|
|
157
|
+
const _creating = __using(_stack, lifetime.join("creating"));
|
|
158
|
+
socket = await createDgramSocket(listeningAddress, listeningPort, socketOptions);
|
|
159
|
+
} catch (_) {
|
|
160
|
+
var _error = _, _hasError = true;
|
|
161
|
+
} finally {
|
|
162
|
+
__callDispose(_stack, _error, _hasError);
|
|
104
163
|
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
|
|
164
|
+
}
|
|
165
|
+
socket.setBroadcast(true);
|
|
166
|
+
let netInterfaceZone;
|
|
167
|
+
if (netInterface !== void 0) {
|
|
168
|
+
netInterfaceZone = NodeJsNetwork.getNetInterfaceZoneIpv6(netInterface);
|
|
169
|
+
let multicastInterface;
|
|
170
|
+
if (type === "udp4") {
|
|
171
|
+
multicastInterface = NodeJsNetwork.getMulticastInterfaceIpv4(netInterface);
|
|
172
|
+
if (multicastInterface === void 0) {
|
|
173
|
+
throw new NoAddressAvailableError(`No IPv4 addresses on interface "${netInterface}"`);
|
|
174
|
+
}
|
|
175
|
+
} else {
|
|
176
|
+
if (netInterfaceZone === void 0) {
|
|
177
|
+
throw new NoAddressAvailableError(`No IPv6 addresses on interface "${netInterface}"`);
|
|
178
|
+
}
|
|
179
|
+
multicastInterface = `::%${netInterfaceZone}`;
|
|
108
180
|
}
|
|
109
|
-
|
|
181
|
+
logger.debug(
|
|
182
|
+
"Initialize multicast",
|
|
183
|
+
Diagnostic.dict({
|
|
184
|
+
address: `${multicastInterface}:${listeningPort}`,
|
|
185
|
+
interface: netInterface,
|
|
186
|
+
type
|
|
187
|
+
})
|
|
188
|
+
);
|
|
189
|
+
socket.setMulticastInterface(multicastInterface);
|
|
110
190
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
type
|
|
117
|
-
})
|
|
118
|
-
);
|
|
119
|
-
socket.setMulticastInterface(multicastInterface);
|
|
191
|
+
return new NodeJsUdpChannel(lifetime, type, socket, netInterfaceZone);
|
|
192
|
+
} catch (_2) {
|
|
193
|
+
var _error2 = _2, _hasError2 = true;
|
|
194
|
+
} finally {
|
|
195
|
+
__callDispose(_stack2, _error2, _hasError2);
|
|
120
196
|
}
|
|
121
|
-
return new NodeJsUdpChannel(type, socket, netInterfaceZone);
|
|
122
197
|
}
|
|
123
198
|
maxPayloadSize = MAX_UDP_MESSAGE_SIZE;
|
|
124
199
|
/**
|
|
@@ -131,7 +206,8 @@ class NodeJsUdpChannel {
|
|
|
131
206
|
() => this.#rejectDanglingSends()
|
|
132
207
|
);
|
|
133
208
|
#sendsInProgress = /* @__PURE__ */ new Map();
|
|
134
|
-
constructor(type, socket, netInterface) {
|
|
209
|
+
constructor(lifetime, type, socket, netInterface) {
|
|
210
|
+
this.#lifetime = lifetime;
|
|
135
211
|
this.#type = type;
|
|
136
212
|
this.#socket = socket;
|
|
137
213
|
this.#netInterface = netInterface;
|
|
@@ -229,12 +305,20 @@ class NodeJsUdpChannel {
|
|
|
229
305
|
return promise;
|
|
230
306
|
}
|
|
231
307
|
async close() {
|
|
308
|
+
var _stack = [];
|
|
232
309
|
try {
|
|
233
|
-
this.#
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
310
|
+
const _closing = __using(_stack, this.#lifetime.closing());
|
|
311
|
+
try {
|
|
312
|
+
await new Promise((resolve) => this.#socket.close(resolve));
|
|
313
|
+
} catch (error) {
|
|
314
|
+
if (!(error instanceof Error) || error.message !== "Not running") {
|
|
315
|
+
logger.debug("Error on closing socket", error);
|
|
316
|
+
}
|
|
237
317
|
}
|
|
318
|
+
} catch (_) {
|
|
319
|
+
var _error = _, _hasError = true;
|
|
320
|
+
} finally {
|
|
321
|
+
__callDispose(_stack, _error, _hasError);
|
|
238
322
|
}
|
|
239
323
|
}
|
|
240
324
|
get port() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/net/NodeJsUdpChannel.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIG;AACP,SAAS,uCAAuC;AAChD,YAAY,WAAW;AACvB,SAAS,qBAAqB;AAE9B,MAAM,SAAS,OAAO,IAAI,eAAe;AAIzC,MAAM,kCAAkC,QAAQ;AAEhD,SAAS,kBAAkB,MAA0B,MAA0B,SAA8B;AACzG,QAAM,SAAS,MAAM,aAAa,OAAO;AACzC,SAAO,IAAI,QAAsB,CAAC,SAAS,WAAW;AAClD,UAAM,kBAAkB,CAAC,UAAiB;AACtC,UAAI;AACA,eAAO,MAAM;AAAA,MACjB,SAASA,QAAO;AACZ,eAAO,MAAM,yBAAyBA,MAAK;AAAA,MAC/C;AAEA,YAAM,OAAQ,OAAuC;AACrD,UAAI,OAAO,GAAG,OAAO,OAAO,QAAQ,SAAS,SAAS,YAAY,MAAM;AACxE,UAAI,SAAS,QAAW;AACpB,eAAO,GAAG,IAAI,IAAI,IAAI;AAAA,MAC1B;AACA,cAAQ,MAAM;AAAA,QACV,KAAK;AACD,kBAAQ,IAAI,kBAAkB,eAAe,IAAI,iCAAiC;AAClF;AAAA,QAEJ;AACI,kBAAQ,IAAI,UAAU,kBAAkB,IAAI,UAAU,IAAI,GAAG;AAC7D;AAAA,MACR;AACA,aAAO,KAAK;AAAA,IAChB;AACA,WAAO,GAAG,SAAS,eAAe;AAClC,WAAO,KAAK,MAAM,MAAM,MAAM;AAC1B,YAAM,EAAE,SAAS,WAAW,MAAM,UAAU,IAAI,OAAO,QAAQ;AAC/D,aAAO;AAAA,QACH;AAAA,QACA,WAAW,KAAK;AAAA,UACZ,eAAe,GAAG,IAAI,IAAI,IAAI;AAAA,UAC9B,cAAc,GAAG,SAAS,IAAI,SAAS;AAAA,QAC3C,CAAC;AAAA,MACL;AACA,aAAO,eAAe,SAAS,eAAe;AAC9C,aAAO,GAAG,SAAS,WAAS,OAAO,MAAM,KAAK,CAAC;AAE/C,cAAQ,MAAM;AAAA,IAClB,CAAC;AAAA,EACL,CAAC;AACL;AAEO,MAAM,iBAAuC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EAET,aAAa,OAAO,
|
|
5
|
-
"names": ["error"]
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["error", "_stack", "_", "_error", "_hasError"]
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/nodejs",
|
|
3
|
-
"version": "0.16.0-alpha.0-
|
|
3
|
+
"version": "0.16.0-alpha.0-20251207-37e501b18",
|
|
4
4
|
"description": "Node.js platform support for matter.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -44,17 +44,17 @@
|
|
|
44
44
|
"#*": "./src/*"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@matter/general": "0.16.0-alpha.0-
|
|
48
|
-
"@matter/node": "0.16.0-alpha.0-
|
|
49
|
-
"@matter/protocol": "0.16.0-alpha.0-
|
|
50
|
-
"@matter/types": "0.16.0-alpha.0-
|
|
47
|
+
"@matter/general": "0.16.0-alpha.0-20251207-37e501b18",
|
|
48
|
+
"@matter/node": "0.16.0-alpha.0-20251207-37e501b18",
|
|
49
|
+
"@matter/protocol": "0.16.0-alpha.0-20251207-37e501b18",
|
|
50
|
+
"@matter/types": "0.16.0-alpha.0-20251207-37e501b18"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@matter/model": "0.16.0-alpha.0-
|
|
54
|
-
"@matter/protocol": "0.16.0-alpha.0-
|
|
55
|
-
"@matter/testing": "0.16.0-alpha.0-
|
|
56
|
-
"@matter/tools": "0.16.0-alpha.0-
|
|
57
|
-
"@project-chip/matter.js": "0.16.0-alpha.0-
|
|
53
|
+
"@matter/model": "0.16.0-alpha.0-20251207-37e501b18",
|
|
54
|
+
"@matter/protocol": "0.16.0-alpha.0-20251207-37e501b18",
|
|
55
|
+
"@matter/testing": "0.16.0-alpha.0-20251207-37e501b18",
|
|
56
|
+
"@matter/tools": "0.16.0-alpha.0-20251207-37e501b18",
|
|
57
|
+
"@project-chip/matter.js": "0.16.0-alpha.0-20251207-37e501b18",
|
|
58
58
|
"@types/bytebuffer": "^5.0.49"
|
|
59
59
|
},
|
|
60
60
|
"files": [
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
ImplementationError,
|
|
15
15
|
isIPv4,
|
|
16
16
|
isIPv6,
|
|
17
|
+
Lifetime,
|
|
17
18
|
Logger,
|
|
18
19
|
MAX_UDP_MESSAGE_SIZE,
|
|
19
20
|
Millis,
|
|
@@ -81,11 +82,23 @@ function createDgramSocket(host: string | undefined, port: number | undefined, o
|
|
|
81
82
|
}
|
|
82
83
|
|
|
83
84
|
export class NodeJsUdpChannel implements UdpChannel {
|
|
85
|
+
readonly #lifetime: Lifetime;
|
|
84
86
|
readonly #type: UdpSocketType;
|
|
85
87
|
readonly #socket: dgram.Socket;
|
|
86
88
|
readonly #netInterface: string | undefined;
|
|
87
89
|
|
|
88
|
-
static async create({
|
|
90
|
+
static async create({
|
|
91
|
+
lifetime: lifetimeOwner,
|
|
92
|
+
listeningPort,
|
|
93
|
+
type,
|
|
94
|
+
listeningAddress,
|
|
95
|
+
netInterface,
|
|
96
|
+
reuseAddress,
|
|
97
|
+
}: UdpChannelOptions) {
|
|
98
|
+
const name = `${listeningAddress?.includes(":") ? `[${listeningAddress}]` : (listeningAddress ?? "*")}:${listeningPort}`;
|
|
99
|
+
using lifetime = (lifetimeOwner ?? Lifetime.process).join("socket", Diagnostic.strong(name));
|
|
100
|
+
lifetime.details.intf = netInterface;
|
|
101
|
+
|
|
89
102
|
let dgramType: "udp4" | "udp6";
|
|
90
103
|
switch (type) {
|
|
91
104
|
case "udp":
|
|
@@ -110,7 +123,12 @@ export class NodeJsUdpChannel implements UdpChannel {
|
|
|
110
123
|
socketOptions.reuseAddr = true;
|
|
111
124
|
}
|
|
112
125
|
|
|
113
|
-
|
|
126
|
+
let socket;
|
|
127
|
+
{
|
|
128
|
+
using _creating = lifetime.join("creating");
|
|
129
|
+
socket = await createDgramSocket(listeningAddress, listeningPort, socketOptions);
|
|
130
|
+
}
|
|
131
|
+
|
|
114
132
|
socket.setBroadcast(true);
|
|
115
133
|
let netInterfaceZone: string | undefined;
|
|
116
134
|
if (netInterface !== undefined) {
|
|
@@ -137,7 +155,7 @@ export class NodeJsUdpChannel implements UdpChannel {
|
|
|
137
155
|
);
|
|
138
156
|
socket.setMulticastInterface(multicastInterface);
|
|
139
157
|
}
|
|
140
|
-
return new NodeJsUdpChannel(type, socket, netInterfaceZone);
|
|
158
|
+
return new NodeJsUdpChannel(lifetime, type, socket, netInterfaceZone);
|
|
141
159
|
}
|
|
142
160
|
|
|
143
161
|
readonly maxPayloadSize = MAX_UDP_MESSAGE_SIZE;
|
|
@@ -151,7 +169,8 @@ export class NodeJsUdpChannel implements UdpChannel {
|
|
|
151
169
|
);
|
|
152
170
|
readonly #sendsInProgress = new Map<Promise<void>, { sendMs: number; rejecter: (reason?: any) => void }>();
|
|
153
171
|
|
|
154
|
-
constructor(type: UdpSocketType, socket: dgram.Socket, netInterface?: string) {
|
|
172
|
+
constructor(lifetime: Lifetime, type: UdpSocketType, socket: dgram.Socket, netInterface?: string) {
|
|
173
|
+
this.#lifetime = lifetime;
|
|
155
174
|
this.#type = type;
|
|
156
175
|
this.#socket = socket;
|
|
157
176
|
this.#netInterface = netInterface;
|
|
@@ -268,8 +287,9 @@ export class NodeJsUdpChannel implements UdpChannel {
|
|
|
268
287
|
}
|
|
269
288
|
|
|
270
289
|
async close() {
|
|
290
|
+
using _closing = this.#lifetime.closing();
|
|
271
291
|
try {
|
|
272
|
-
this.#socket.close();
|
|
292
|
+
await new Promise<void>(resolve => this.#socket.close(resolve));
|
|
273
293
|
} catch (error) {
|
|
274
294
|
if (!(error instanceof Error) || error.message !== "Not running") {
|
|
275
295
|
logger.debug("Error on closing socket", error);
|