@matter/nodejs 0.14.0 → 0.14.1-alpha.0-20250606-a9bcd03f9
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/crypto/NodeJsCrypto.js +1 -1
- package/dist/cjs/net/NodeJsUdpChannel.d.ts +5 -6
- package/dist/cjs/net/NodeJsUdpChannel.d.ts.map +1 -1
- package/dist/cjs/net/NodeJsUdpChannel.js +46 -33
- package/dist/cjs/net/NodeJsUdpChannel.js.map +1 -1
- package/dist/esm/crypto/NodeJsCrypto.js +1 -1
- package/dist/esm/net/NodeJsUdpChannel.d.ts +5 -6
- package/dist/esm/net/NodeJsUdpChannel.d.ts.map +1 -1
- package/dist/esm/net/NodeJsUdpChannel.js +46 -33
- package/dist/esm/net/NodeJsUdpChannel.js.map +1 -1
- package/package.json +10 -10
- package/src/crypto/NodeJsCrypto.ts +1 -1
- package/src/net/NodeJsUdpChannel.ts +54 -35
|
@@ -63,7 +63,7 @@ class NodeJsCrypto extends import_general.Crypto {
|
|
|
63
63
|
try {
|
|
64
64
|
cipher.final();
|
|
65
65
|
} catch (e) {
|
|
66
|
-
throw new import_general.CryptoDecryptError(`${import_general.CRYPTO_ENCRYPT_ALGORITHM}
|
|
66
|
+
throw new import_general.CryptoDecryptError(`${import_general.CRYPTO_ENCRYPT_ALGORITHM} decryption failed: ${(0, import_general.asError)(e).message}`);
|
|
67
67
|
}
|
|
68
68
|
return new Uint8Array(result);
|
|
69
69
|
}
|
|
@@ -3,16 +3,15 @@
|
|
|
3
3
|
* Copyright 2022-2025 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { ChannelType, UdpChannel, UdpChannelOptions } from "#general";
|
|
6
|
+
import { ChannelType, 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
|
-
|
|
11
|
-
private readonly socket;
|
|
12
|
-
private readonly netInterface?;
|
|
13
|
-
static create({ listeningPort, type, listeningAddress, netInterface, membershipAddresses, }: UdpChannelOptions): Promise<NodeJsUdpChannel>;
|
|
10
|
+
static create({ listeningPort, type, listeningAddress, netInterface }: UdpChannelOptions): Promise<NodeJsUdpChannel>;
|
|
14
11
|
readonly maxPayloadSize: number;
|
|
15
|
-
constructor(type:
|
|
12
|
+
constructor(type: UdpSocketType, socket: dgram.Socket, netInterface?: string);
|
|
13
|
+
addMembership(membershipAddress: string): void;
|
|
14
|
+
dropMembership(membershipAddress: string): void;
|
|
16
15
|
onData(listener: (netInterface: string | undefined, peerAddress: string, peerPort: number, data: Uint8Array) => void): {
|
|
17
16
|
close: () => Promise<void>;
|
|
18
17
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeJsUdpChannel.d.ts","sourceRoot":"","sources":["../../../src/net/NodeJsUdpChannel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,WAAW,EAWX,UAAU,EACV,iBAAiB,
|
|
1
|
+
{"version":3,"file":"NodeJsUdpChannel.d.ts","sourceRoot":"","sources":["../../../src/net/NodeJsUdpChannel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,WAAW,EAWX,UAAU,EACV,iBAAiB,EACjB,aAAa,EAChB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAqCpC,qBAAa,gBAAiB,YAAW,UAAU;;WAKlC,MAAM,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,EAAE,iBAAiB;IAmC9F,QAAQ,CAAC,cAAc,SAAwB;gBAWnC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IAM5E,aAAa,CAAC,iBAAiB,EAAE,MAAM;IAkBvC,cAAc,CAAC,iBAAiB,EAAE,MAAM;IAkBxC,MAAM,CACF,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI;;;IAqC3G,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU;IAsCjD,KAAK;IAUX,IAAI,IAAI,WAEP;IAED,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM;CAiB/C"}
|
|
@@ -70,18 +70,10 @@ function createDgramSocket(host, port, options) {
|
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
72
|
class NodeJsUdpChannel {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
static async create({
|
|
79
|
-
listeningPort,
|
|
80
|
-
type,
|
|
81
|
-
listeningAddress,
|
|
82
|
-
netInterface,
|
|
83
|
-
membershipAddresses
|
|
84
|
-
}) {
|
|
73
|
+
#type;
|
|
74
|
+
#socket;
|
|
75
|
+
#netInterface;
|
|
76
|
+
static async create({ listeningPort, type, listeningAddress, netInterface }) {
|
|
85
77
|
const socketOptions = { type, reuseAddr: true };
|
|
86
78
|
if (type === "udp6") {
|
|
87
79
|
socketOptions.ipv6Only = true;
|
|
@@ -113,20 +105,6 @@ class NodeJsUdpChannel {
|
|
|
113
105
|
);
|
|
114
106
|
socket.setMulticastInterface(multicastInterface);
|
|
115
107
|
}
|
|
116
|
-
if (membershipAddresses !== void 0) {
|
|
117
|
-
const multicastInterfaces = import_NodeJsNetwork.NodeJsNetwork.getMembershipMulticastInterfaces(netInterface, type === "udp4");
|
|
118
|
-
for (const address of membershipAddresses) {
|
|
119
|
-
for (const multicastInterface of multicastInterfaces) {
|
|
120
|
-
try {
|
|
121
|
-
socket.addMembership(address, multicastInterface);
|
|
122
|
-
} catch (error) {
|
|
123
|
-
logger.warn(
|
|
124
|
-
`Error adding membership for address ${address}${multicastInterface ? ` with interface ${multicastInterface}` : ""}: ${error}`
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
108
|
return new NodeJsUdpChannel(type, socket, netInterfaceZone);
|
|
131
109
|
}
|
|
132
110
|
maxPayloadSize = import_general.MAX_UDP_MESSAGE_SIZE;
|
|
@@ -140,15 +118,50 @@ class NodeJsUdpChannel {
|
|
|
140
118
|
() => this.#rejectDanglingSends()
|
|
141
119
|
);
|
|
142
120
|
#sendsInProgress = /* @__PURE__ */ new Map();
|
|
121
|
+
constructor(type, socket, netInterface) {
|
|
122
|
+
this.#type = type;
|
|
123
|
+
this.#socket = socket;
|
|
124
|
+
this.#netInterface = netInterface;
|
|
125
|
+
}
|
|
126
|
+
addMembership(membershipAddress) {
|
|
127
|
+
const multicastInterfaces = import_NodeJsNetwork.NodeJsNetwork.getMembershipMulticastInterfaces(
|
|
128
|
+
this.#netInterface,
|
|
129
|
+
this.#type === "udp4"
|
|
130
|
+
);
|
|
131
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
132
|
+
try {
|
|
133
|
+
this.#socket.addMembership(membershipAddress, multicastInterface);
|
|
134
|
+
} catch (error) {
|
|
135
|
+
logger.warn(
|
|
136
|
+
`Error adding membership for address ${membershipAddress}${multicastInterface ? ` with interface ${multicastInterface}` : ""}: ${error}`
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
dropMembership(membershipAddress) {
|
|
142
|
+
const multicastInterfaces = import_NodeJsNetwork.NodeJsNetwork.getMembershipMulticastInterfaces(
|
|
143
|
+
this.#netInterface,
|
|
144
|
+
this.#type === "udp4"
|
|
145
|
+
);
|
|
146
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
147
|
+
try {
|
|
148
|
+
this.#socket.dropMembership(membershipAddress, multicastInterface);
|
|
149
|
+
} catch (error) {
|
|
150
|
+
logger.warn(
|
|
151
|
+
`Error removing membership for address ${membershipAddress}${multicastInterface ? ` with interface ${multicastInterface}` : ""}: ${error}`
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
143
156
|
onData(listener) {
|
|
144
157
|
const messageListener = (data, { address, port }) => {
|
|
145
|
-
const netInterface = this
|
|
158
|
+
const netInterface = this.#netInterface ?? import_NodeJsNetwork.NodeJsNetwork.getNetInterfaceForIp(address);
|
|
146
159
|
listener(netInterface, address, port, data);
|
|
147
160
|
};
|
|
148
|
-
this
|
|
161
|
+
this.#socket.on("message", messageListener);
|
|
149
162
|
return {
|
|
150
163
|
close: async () => {
|
|
151
|
-
this
|
|
164
|
+
this.#socket.removeListener("message", messageListener);
|
|
152
165
|
}
|
|
153
166
|
};
|
|
154
167
|
}
|
|
@@ -196,7 +209,7 @@ class NodeJsUdpChannel {
|
|
|
196
209
|
this.#sendTimer.start();
|
|
197
210
|
}
|
|
198
211
|
try {
|
|
199
|
-
this
|
|
212
|
+
this.#socket.send(data, port, host, (error) => rejectOrResolve(error));
|
|
200
213
|
} catch (error) {
|
|
201
214
|
rejectOrResolve((0, import_general.repackErrorAs)(error, import_general.NetworkError));
|
|
202
215
|
}
|
|
@@ -204,7 +217,7 @@ class NodeJsUdpChannel {
|
|
|
204
217
|
}
|
|
205
218
|
async close() {
|
|
206
219
|
try {
|
|
207
|
-
this
|
|
220
|
+
this.#socket.close();
|
|
208
221
|
} catch (error) {
|
|
209
222
|
if (!(error instanceof Error) || error.message !== "Not running") {
|
|
210
223
|
logger.debug("Error on closing socket", error);
|
|
@@ -212,7 +225,7 @@ class NodeJsUdpChannel {
|
|
|
212
225
|
}
|
|
213
226
|
}
|
|
214
227
|
get port() {
|
|
215
|
-
return this
|
|
228
|
+
return this.#socket.address().port;
|
|
216
229
|
}
|
|
217
230
|
supports(type, address) {
|
|
218
231
|
if (type !== import_general.ChannelType.UDP) {
|
|
@@ -221,7 +234,7 @@ class NodeJsUdpChannel {
|
|
|
221
234
|
if (address === void 0) {
|
|
222
235
|
return true;
|
|
223
236
|
}
|
|
224
|
-
if (this
|
|
237
|
+
if (this.#type === "udp4") {
|
|
225
238
|
return (0, import_general.isIPv4)(address);
|
|
226
239
|
}
|
|
227
240
|
return (0, import_general.isIPv6)(address);
|
|
@@ -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,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["error"]
|
|
6
6
|
}
|
|
@@ -43,7 +43,7 @@ class NodeJsCrypto extends Crypto {
|
|
|
43
43
|
try {
|
|
44
44
|
cipher.final();
|
|
45
45
|
} catch (e) {
|
|
46
|
-
throw new CryptoDecryptError(`${CRYPTO_ENCRYPT_ALGORITHM}
|
|
46
|
+
throw new CryptoDecryptError(`${CRYPTO_ENCRYPT_ALGORITHM} decryption failed: ${asError(e).message}`);
|
|
47
47
|
}
|
|
48
48
|
return new Uint8Array(result);
|
|
49
49
|
}
|
|
@@ -3,16 +3,15 @@
|
|
|
3
3
|
* Copyright 2022-2025 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { ChannelType, UdpChannel, UdpChannelOptions } from "#general";
|
|
6
|
+
import { ChannelType, 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
|
-
|
|
11
|
-
private readonly socket;
|
|
12
|
-
private readonly netInterface?;
|
|
13
|
-
static create({ listeningPort, type, listeningAddress, netInterface, membershipAddresses, }: UdpChannelOptions): Promise<NodeJsUdpChannel>;
|
|
10
|
+
static create({ listeningPort, type, listeningAddress, netInterface }: UdpChannelOptions): Promise<NodeJsUdpChannel>;
|
|
14
11
|
readonly maxPayloadSize: number;
|
|
15
|
-
constructor(type:
|
|
12
|
+
constructor(type: UdpSocketType, socket: dgram.Socket, netInterface?: string);
|
|
13
|
+
addMembership(membershipAddress: string): void;
|
|
14
|
+
dropMembership(membershipAddress: string): void;
|
|
16
15
|
onData(listener: (netInterface: string | undefined, peerAddress: string, peerPort: number, data: Uint8Array) => void): {
|
|
17
16
|
close: () => Promise<void>;
|
|
18
17
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeJsUdpChannel.d.ts","sourceRoot":"","sources":["../../../src/net/NodeJsUdpChannel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,WAAW,EAWX,UAAU,EACV,iBAAiB,
|
|
1
|
+
{"version":3,"file":"NodeJsUdpChannel.d.ts","sourceRoot":"","sources":["../../../src/net/NodeJsUdpChannel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,WAAW,EAWX,UAAU,EACV,iBAAiB,EACjB,aAAa,EAChB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAqCpC,qBAAa,gBAAiB,YAAW,UAAU;;WAKlC,MAAM,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,EAAE,iBAAiB;IAmC9F,QAAQ,CAAC,cAAc,SAAwB;gBAWnC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IAM5E,aAAa,CAAC,iBAAiB,EAAE,MAAM;IAkBvC,cAAc,CAAC,iBAAiB,EAAE,MAAM;IAkBxC,MAAM,CACF,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI;;;IAqC3G,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU;IAsCjD,KAAK;IAUX,IAAI,IAAI,WAEP;IAED,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM;CAiB/C"}
|
|
@@ -49,18 +49,10 @@ function createDgramSocket(host, port, options) {
|
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
51
|
class NodeJsUdpChannel {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
static async create({
|
|
58
|
-
listeningPort,
|
|
59
|
-
type,
|
|
60
|
-
listeningAddress,
|
|
61
|
-
netInterface,
|
|
62
|
-
membershipAddresses
|
|
63
|
-
}) {
|
|
52
|
+
#type;
|
|
53
|
+
#socket;
|
|
54
|
+
#netInterface;
|
|
55
|
+
static async create({ listeningPort, type, listeningAddress, netInterface }) {
|
|
64
56
|
const socketOptions = { type, reuseAddr: true };
|
|
65
57
|
if (type === "udp6") {
|
|
66
58
|
socketOptions.ipv6Only = true;
|
|
@@ -92,20 +84,6 @@ class NodeJsUdpChannel {
|
|
|
92
84
|
);
|
|
93
85
|
socket.setMulticastInterface(multicastInterface);
|
|
94
86
|
}
|
|
95
|
-
if (membershipAddresses !== void 0) {
|
|
96
|
-
const multicastInterfaces = NodeJsNetwork.getMembershipMulticastInterfaces(netInterface, type === "udp4");
|
|
97
|
-
for (const address of membershipAddresses) {
|
|
98
|
-
for (const multicastInterface of multicastInterfaces) {
|
|
99
|
-
try {
|
|
100
|
-
socket.addMembership(address, multicastInterface);
|
|
101
|
-
} catch (error) {
|
|
102
|
-
logger.warn(
|
|
103
|
-
`Error adding membership for address ${address}${multicastInterface ? ` with interface ${multicastInterface}` : ""}: ${error}`
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
87
|
return new NodeJsUdpChannel(type, socket, netInterfaceZone);
|
|
110
88
|
}
|
|
111
89
|
maxPayloadSize = MAX_UDP_MESSAGE_SIZE;
|
|
@@ -119,15 +97,50 @@ class NodeJsUdpChannel {
|
|
|
119
97
|
() => this.#rejectDanglingSends()
|
|
120
98
|
);
|
|
121
99
|
#sendsInProgress = /* @__PURE__ */ new Map();
|
|
100
|
+
constructor(type, socket, netInterface) {
|
|
101
|
+
this.#type = type;
|
|
102
|
+
this.#socket = socket;
|
|
103
|
+
this.#netInterface = netInterface;
|
|
104
|
+
}
|
|
105
|
+
addMembership(membershipAddress) {
|
|
106
|
+
const multicastInterfaces = NodeJsNetwork.getMembershipMulticastInterfaces(
|
|
107
|
+
this.#netInterface,
|
|
108
|
+
this.#type === "udp4"
|
|
109
|
+
);
|
|
110
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
111
|
+
try {
|
|
112
|
+
this.#socket.addMembership(membershipAddress, multicastInterface);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
logger.warn(
|
|
115
|
+
`Error adding membership for address ${membershipAddress}${multicastInterface ? ` with interface ${multicastInterface}` : ""}: ${error}`
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
dropMembership(membershipAddress) {
|
|
121
|
+
const multicastInterfaces = NodeJsNetwork.getMembershipMulticastInterfaces(
|
|
122
|
+
this.#netInterface,
|
|
123
|
+
this.#type === "udp4"
|
|
124
|
+
);
|
|
125
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
126
|
+
try {
|
|
127
|
+
this.#socket.dropMembership(membershipAddress, multicastInterface);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
logger.warn(
|
|
130
|
+
`Error removing membership for address ${membershipAddress}${multicastInterface ? ` with interface ${multicastInterface}` : ""}: ${error}`
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
122
135
|
onData(listener) {
|
|
123
136
|
const messageListener = (data, { address, port }) => {
|
|
124
|
-
const netInterface = this
|
|
137
|
+
const netInterface = this.#netInterface ?? NodeJsNetwork.getNetInterfaceForIp(address);
|
|
125
138
|
listener(netInterface, address, port, data);
|
|
126
139
|
};
|
|
127
|
-
this
|
|
140
|
+
this.#socket.on("message", messageListener);
|
|
128
141
|
return {
|
|
129
142
|
close: async () => {
|
|
130
|
-
this
|
|
143
|
+
this.#socket.removeListener("message", messageListener);
|
|
131
144
|
}
|
|
132
145
|
};
|
|
133
146
|
}
|
|
@@ -175,7 +188,7 @@ class NodeJsUdpChannel {
|
|
|
175
188
|
this.#sendTimer.start();
|
|
176
189
|
}
|
|
177
190
|
try {
|
|
178
|
-
this
|
|
191
|
+
this.#socket.send(data, port, host, (error) => rejectOrResolve(error));
|
|
179
192
|
} catch (error) {
|
|
180
193
|
rejectOrResolve(repackErrorAs(error, NetworkError));
|
|
181
194
|
}
|
|
@@ -183,7 +196,7 @@ class NodeJsUdpChannel {
|
|
|
183
196
|
}
|
|
184
197
|
async close() {
|
|
185
198
|
try {
|
|
186
|
-
this
|
|
199
|
+
this.#socket.close();
|
|
187
200
|
} catch (error) {
|
|
188
201
|
if (!(error instanceof Error) || error.message !== "Not running") {
|
|
189
202
|
logger.debug("Error on closing socket", error);
|
|
@@ -191,7 +204,7 @@ class NodeJsUdpChannel {
|
|
|
191
204
|
}
|
|
192
205
|
}
|
|
193
206
|
get port() {
|
|
194
|
-
return this
|
|
207
|
+
return this.#socket.address().port;
|
|
195
208
|
}
|
|
196
209
|
supports(type, address) {
|
|
197
210
|
if (type !== ChannelType.UDP) {
|
|
@@ -200,7 +213,7 @@ class NodeJsUdpChannel {
|
|
|
200
213
|
if (address === void 0) {
|
|
201
214
|
return true;
|
|
202
215
|
}
|
|
203
|
-
if (this
|
|
216
|
+
if (this.#type === "udp4") {
|
|
204
217
|
return isIPv4(address);
|
|
205
218
|
}
|
|
206
219
|
return isIPv6(address);
|
|
@@ -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,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["error"]
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/nodejs",
|
|
3
|
-
"version": "0.14.0",
|
|
3
|
+
"version": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
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.14.0",
|
|
48
|
-
"@matter/node": "0.14.0",
|
|
49
|
-
"@matter/protocol": "0.14.0",
|
|
50
|
-
"@matter/types": "0.14.0"
|
|
47
|
+
"@matter/general": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
48
|
+
"@matter/node": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
49
|
+
"@matter/protocol": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
50
|
+
"@matter/types": "0.14.1-alpha.0-20250606-a9bcd03f9"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@matter/model": "0.14.0",
|
|
54
|
-
"@matter/protocol": "0.14.0",
|
|
55
|
-
"@matter/tools": "0.14.0",
|
|
56
|
-
"@matter/testing": "0.14.0",
|
|
57
|
-
"@project-chip/matter.js": "0.14.0",
|
|
53
|
+
"@matter/model": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
54
|
+
"@matter/protocol": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
55
|
+
"@matter/tools": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
56
|
+
"@matter/testing": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
57
|
+
"@project-chip/matter.js": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
58
58
|
"@types/bytebuffer": "^5.0.49"
|
|
59
59
|
},
|
|
60
60
|
"files": [
|
|
@@ -47,7 +47,7 @@ export class NodeJsCrypto extends Crypto {
|
|
|
47
47
|
try {
|
|
48
48
|
cipher.final();
|
|
49
49
|
} catch (e) {
|
|
50
|
-
throw new CryptoDecryptError(`${CRYPTO_ENCRYPT_ALGORITHM}
|
|
50
|
+
throw new CryptoDecryptError(`${CRYPTO_ENCRYPT_ALGORITHM} decryption failed: ${asError(e).message}`);
|
|
51
51
|
}
|
|
52
52
|
return new Uint8Array(result);
|
|
53
53
|
}
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
Time,
|
|
19
19
|
UdpChannel,
|
|
20
20
|
UdpChannelOptions,
|
|
21
|
+
UdpSocketType,
|
|
21
22
|
} from "#general";
|
|
22
23
|
import { RetransmissionLimitReachedError } from "#protocol";
|
|
23
24
|
import * as dgram from "node:dgram";
|
|
@@ -58,13 +59,11 @@ function createDgramSocket(host: string | undefined, port: number | undefined, o
|
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
export class NodeJsUdpChannel implements UdpChannel {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
membershipAddresses,
|
|
67
|
-
}: UdpChannelOptions) {
|
|
62
|
+
readonly #type: UdpSocketType;
|
|
63
|
+
readonly #socket: dgram.Socket;
|
|
64
|
+
readonly #netInterface: string | undefined;
|
|
65
|
+
|
|
66
|
+
static async create({ listeningPort, type, listeningAddress, netInterface }: UdpChannelOptions) {
|
|
68
67
|
const socketOptions: dgram.SocketOptions = { type, reuseAddr: true };
|
|
69
68
|
if (type === "udp6") {
|
|
70
69
|
socketOptions.ipv6Only = true;
|
|
@@ -96,22 +95,6 @@ export class NodeJsUdpChannel implements UdpChannel {
|
|
|
96
95
|
);
|
|
97
96
|
socket.setMulticastInterface(multicastInterface);
|
|
98
97
|
}
|
|
99
|
-
if (membershipAddresses !== undefined) {
|
|
100
|
-
const multicastInterfaces = NodeJsNetwork.getMembershipMulticastInterfaces(netInterface, type === "udp4");
|
|
101
|
-
for (const address of membershipAddresses) {
|
|
102
|
-
for (const multicastInterface of multicastInterfaces) {
|
|
103
|
-
try {
|
|
104
|
-
socket.addMembership(address, multicastInterface);
|
|
105
|
-
} catch (error) {
|
|
106
|
-
logger.warn(
|
|
107
|
-
`Error adding membership for address ${address}${
|
|
108
|
-
multicastInterface ? ` with interface ${multicastInterface}` : ""
|
|
109
|
-
}: ${error}`,
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
98
|
return new NodeJsUdpChannel(type, socket, netInterfaceZone);
|
|
116
99
|
}
|
|
117
100
|
|
|
@@ -126,24 +109,60 @@ export class NodeJsUdpChannel implements UdpChannel {
|
|
|
126
109
|
);
|
|
127
110
|
readonly #sendsInProgress = new Map<Promise<void>, { sendMs: number; rejecter: (reason?: any) => void }>();
|
|
128
111
|
|
|
129
|
-
constructor(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
112
|
+
constructor(type: UdpSocketType, socket: dgram.Socket, netInterface?: string) {
|
|
113
|
+
this.#type = type;
|
|
114
|
+
this.#socket = socket;
|
|
115
|
+
this.#netInterface = netInterface;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
addMembership(membershipAddress: string) {
|
|
119
|
+
const multicastInterfaces = NodeJsNetwork.getMembershipMulticastInterfaces(
|
|
120
|
+
this.#netInterface,
|
|
121
|
+
this.#type === "udp4",
|
|
122
|
+
);
|
|
123
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
124
|
+
try {
|
|
125
|
+
this.#socket.addMembership(membershipAddress, multicastInterface);
|
|
126
|
+
} catch (error) {
|
|
127
|
+
logger.warn(
|
|
128
|
+
`Error adding membership for address ${membershipAddress}${
|
|
129
|
+
multicastInterface ? ` with interface ${multicastInterface}` : ""
|
|
130
|
+
}: ${error}`,
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
dropMembership(membershipAddress: string) {
|
|
137
|
+
const multicastInterfaces = NodeJsNetwork.getMembershipMulticastInterfaces(
|
|
138
|
+
this.#netInterface,
|
|
139
|
+
this.#type === "udp4",
|
|
140
|
+
);
|
|
141
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
142
|
+
try {
|
|
143
|
+
this.#socket.dropMembership(membershipAddress, multicastInterface);
|
|
144
|
+
} catch (error) {
|
|
145
|
+
logger.warn(
|
|
146
|
+
`Error removing membership for address ${membershipAddress}${
|
|
147
|
+
multicastInterface ? ` with interface ${multicastInterface}` : ""
|
|
148
|
+
}: ${error}`,
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
134
153
|
|
|
135
154
|
onData(
|
|
136
155
|
listener: (netInterface: string | undefined, peerAddress: string, peerPort: number, data: Uint8Array) => void,
|
|
137
156
|
) {
|
|
138
157
|
const messageListener = (data: Uint8Array, { address, port }: dgram.RemoteInfo) => {
|
|
139
|
-
const netInterface = this
|
|
158
|
+
const netInterface = this.#netInterface ?? NodeJsNetwork.getNetInterfaceForIp(address);
|
|
140
159
|
listener(netInterface, address, port, data);
|
|
141
160
|
};
|
|
142
161
|
|
|
143
|
-
this
|
|
162
|
+
this.#socket.on("message", messageListener);
|
|
144
163
|
return {
|
|
145
164
|
close: async () => {
|
|
146
|
-
this
|
|
165
|
+
this.#socket.removeListener("message", messageListener);
|
|
147
166
|
},
|
|
148
167
|
};
|
|
149
168
|
}
|
|
@@ -200,7 +219,7 @@ export class NodeJsUdpChannel implements UdpChannel {
|
|
|
200
219
|
this.#sendTimer.start();
|
|
201
220
|
}
|
|
202
221
|
try {
|
|
203
|
-
this
|
|
222
|
+
this.#socket.send(data, port, host, error => rejectOrResolve(error));
|
|
204
223
|
} catch (error) {
|
|
205
224
|
rejectOrResolve(repackErrorAs(error, NetworkError));
|
|
206
225
|
}
|
|
@@ -210,7 +229,7 @@ export class NodeJsUdpChannel implements UdpChannel {
|
|
|
210
229
|
|
|
211
230
|
async close() {
|
|
212
231
|
try {
|
|
213
|
-
this
|
|
232
|
+
this.#socket.close();
|
|
214
233
|
} catch (error) {
|
|
215
234
|
if (!(error instanceof Error) || error.message !== "Not running") {
|
|
216
235
|
logger.debug("Error on closing socket", error);
|
|
@@ -219,7 +238,7 @@ export class NodeJsUdpChannel implements UdpChannel {
|
|
|
219
238
|
}
|
|
220
239
|
|
|
221
240
|
get port() {
|
|
222
|
-
return this
|
|
241
|
+
return this.#socket.address().port;
|
|
223
242
|
}
|
|
224
243
|
|
|
225
244
|
supports(type: ChannelType, address?: string) {
|
|
@@ -233,7 +252,7 @@ export class NodeJsUdpChannel implements UdpChannel {
|
|
|
233
252
|
|
|
234
253
|
// TODO - we currently only discriminate based on protocol type. We should also determine whether the address subnet is correct
|
|
235
254
|
|
|
236
|
-
if (this
|
|
255
|
+
if (this.#type === "udp4") {
|
|
237
256
|
return isIPv4(address);
|
|
238
257
|
}
|
|
239
258
|
|