@matter/react-native 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/net/UdpChannelReactNative.d.ts +7 -6
- package/dist/cjs/net/UdpChannelReactNative.d.ts.map +1 -1
- package/dist/cjs/net/UdpChannelReactNative.js +46 -36
- package/dist/cjs/net/UdpChannelReactNative.js.map +1 -1
- package/dist/esm/net/UdpChannelReactNative.d.ts +7 -6
- package/dist/esm/net/UdpChannelReactNative.d.ts.map +1 -1
- package/dist/esm/net/UdpChannelReactNative.js +46 -36
- package/dist/esm/net/UdpChannelReactNative.js.map +1 -1
- package/package.json +5 -5
- package/src/net/UdpChannelReactNative.ts +58 -40
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChannelType, UdpChannel, UdpChannelOptions } from "#general";
|
|
1
|
+
import { ChannelType, UdpChannel, UdpChannelOptions, UdpSocketType } from "#general";
|
|
2
2
|
interface RemoteInfo {
|
|
3
3
|
address: string;
|
|
4
4
|
family: "IPv4" | "IPv6";
|
|
@@ -9,6 +9,7 @@ interface Socket {
|
|
|
9
9
|
setBroadcast(flag: boolean): void;
|
|
10
10
|
setMulticastInterface(interfaceAddress: string): void;
|
|
11
11
|
addMembership(multicastAddress: string, multicastInterface?: string): void;
|
|
12
|
+
dropMembership(multicastAddress: string, multicastInterface?: string): void;
|
|
12
13
|
on(event: "message", listener: (msg: Uint8Array, rinfo: RemoteInfo) => void): void;
|
|
13
14
|
on(event: "error", listener: (error: Error) => void): void;
|
|
14
15
|
removeListener(event: "message", listener: (msg: Uint8Array, rinfo: RemoteInfo) => void): void;
|
|
@@ -21,12 +22,12 @@ interface Socket {
|
|
|
21
22
|
};
|
|
22
23
|
}
|
|
23
24
|
export declare class UdpChannelReactNative implements UdpChannel {
|
|
24
|
-
private
|
|
25
|
-
|
|
26
|
-
private readonly netInterface?;
|
|
27
|
-
static create({ listeningPort, type, listeningAddress, netInterface, membershipAddresses, }: UdpChannelOptions): Promise<UdpChannelReactNative>;
|
|
25
|
+
#private;
|
|
26
|
+
static create({ listeningPort, type, listeningAddress, netInterface }: UdpChannelOptions): Promise<UdpChannelReactNative>;
|
|
28
27
|
readonly maxPayloadSize: number;
|
|
29
|
-
constructor(type:
|
|
28
|
+
constructor(type: UdpSocketType, socket: Socket, netInterface?: string);
|
|
29
|
+
addMembership(membershipAddress: string): Promise<void>;
|
|
30
|
+
dropMembership(membershipAddress: string): Promise<void>;
|
|
30
31
|
onData(listener: (netInterface: string | undefined, peerAddress: string, peerPort: number, data: Uint8Array) => void): {
|
|
31
32
|
close: () => Promise<void>;
|
|
32
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UdpChannelReactNative.d.ts","sourceRoot":"","sources":["../../../src/net/UdpChannelReactNative.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,WAAW,EASX,UAAU,EACV,iBAAiB,
|
|
1
|
+
{"version":3,"file":"UdpChannelReactNative.d.ts","sourceRoot":"","sources":["../../../src/net/UdpChannelReactNative.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,WAAW,EASX,UAAU,EACV,iBAAiB,EACjB,aAAa,EAChB,MAAM,UAAU,CAAC;AAOlB,UAAU,UAAU;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAoBD,UAAU,MAAM;IACZ,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,aAAa,CAAC,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3E,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5E,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IACnF,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3D,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/F,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IACvE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IACpG,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAmCD,qBAAa,qBAAsB,YAAW,UAAU;;WAKvC,MAAM,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,EAAE,iBAAiB;IAgC9F,QAAQ,CAAC,cAAc,SAAwB;gBAEnC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IAMhE,aAAa,CAAC,iBAAiB,EAAE,MAAM;IAkBvC,cAAc,CAAC,iBAAiB,EAAE,MAAM;IAkB9C,MAAM,CACF,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI;;;IAiB3G,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU;IAYjD,KAAK;IAQX,IAAI,IAAI,WAEP;IAED,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM;CAe/C"}
|
|
@@ -72,18 +72,10 @@ function createDgramSocket(host, port, options) {
|
|
|
72
72
|
});
|
|
73
73
|
}
|
|
74
74
|
class UdpChannelReactNative {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
static async create({
|
|
81
|
-
listeningPort,
|
|
82
|
-
type,
|
|
83
|
-
listeningAddress,
|
|
84
|
-
netInterface,
|
|
85
|
-
membershipAddresses
|
|
86
|
-
}) {
|
|
75
|
+
#type;
|
|
76
|
+
#socket;
|
|
77
|
+
#netInterface;
|
|
78
|
+
static async create({ listeningPort, type, listeningAddress, netInterface }) {
|
|
87
79
|
const socketOptions = { type, reuseAddr: true };
|
|
88
80
|
if (type === "udp6") {
|
|
89
81
|
socketOptions.ipv6Only = true;
|
|
@@ -112,41 +104,59 @@ class UdpChannelReactNative {
|
|
|
112
104
|
);
|
|
113
105
|
socket.setMulticastInterface(multicastInterface);
|
|
114
106
|
}
|
|
115
|
-
if (membershipAddresses !== void 0) {
|
|
116
|
-
const multicastInterfaces = await import_NetworkReactNative.NetworkReactNative.getMembershipMulticastInterfaces(
|
|
117
|
-
netInterface,
|
|
118
|
-
type === "udp4"
|
|
119
|
-
);
|
|
120
|
-
for (const address of membershipAddresses) {
|
|
121
|
-
for (const multicastInterface of multicastInterfaces) {
|
|
122
|
-
try {
|
|
123
|
-
socket.addMembership(address, multicastInterface);
|
|
124
|
-
} catch (error) {
|
|
125
|
-
logger.warn(
|
|
126
|
-
`Error adding membership for address ${address}${multicastInterface ? ` with interface ${multicastInterface}` : ""}: ${error}`
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
107
|
return new UdpChannelReactNative(type, socket, netInterfaceZone);
|
|
133
108
|
}
|
|
134
109
|
maxPayloadSize = import_general.MAX_UDP_MESSAGE_SIZE;
|
|
110
|
+
constructor(type, socket, netInterface) {
|
|
111
|
+
this.#type = type;
|
|
112
|
+
this.#socket = socket;
|
|
113
|
+
this.#netInterface = netInterface;
|
|
114
|
+
}
|
|
115
|
+
async addMembership(membershipAddress) {
|
|
116
|
+
const multicastInterfaces = await import_NetworkReactNative.NetworkReactNative.getMembershipMulticastInterfaces(
|
|
117
|
+
this.#netInterface,
|
|
118
|
+
this.#type === "udp4"
|
|
119
|
+
);
|
|
120
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
121
|
+
try {
|
|
122
|
+
this.#socket.addMembership(membershipAddress, multicastInterface);
|
|
123
|
+
} catch (error) {
|
|
124
|
+
logger.warn(
|
|
125
|
+
`Error adding membership for address ${membershipAddress}${multicastInterface ? ` with interface ${multicastInterface}` : ""}: ${error}`
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async dropMembership(membershipAddress) {
|
|
131
|
+
const multicastInterfaces = await import_NetworkReactNative.NetworkReactNative.getMembershipMulticastInterfaces(
|
|
132
|
+
this.#netInterface,
|
|
133
|
+
this.#type === "udp4"
|
|
134
|
+
);
|
|
135
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
136
|
+
try {
|
|
137
|
+
this.#socket.dropMembership(membershipAddress, multicastInterface);
|
|
138
|
+
} catch (error) {
|
|
139
|
+
logger.warn(
|
|
140
|
+
`Error removing membership for address ${membershipAddress}${multicastInterface ? ` with interface ${multicastInterface}` : ""}: ${error}`
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
135
145
|
onData(listener) {
|
|
136
146
|
const messageListener = async (data, { address, port }) => {
|
|
137
|
-
const netInterface = this
|
|
147
|
+
const netInterface = this.#netInterface ?? await import_NetworkReactNative.NetworkReactNative.getNetInterfaceForIp(address);
|
|
138
148
|
listener(netInterface, address, port, data);
|
|
139
149
|
};
|
|
140
|
-
this
|
|
150
|
+
this.#socket.on("message", messageListener);
|
|
141
151
|
return {
|
|
142
152
|
close: async () => {
|
|
143
|
-
this
|
|
153
|
+
this.#socket.removeListener("message", messageListener);
|
|
144
154
|
}
|
|
145
155
|
};
|
|
146
156
|
}
|
|
147
157
|
async send(host, port, data) {
|
|
148
158
|
return new Promise((resolve, reject) => {
|
|
149
|
-
this
|
|
159
|
+
this.#socket.send(data, port, host, (error) => {
|
|
150
160
|
if (error !== null) {
|
|
151
161
|
reject((0, import_general.repackErrorAs)(error, import_general.NetworkError));
|
|
152
162
|
return;
|
|
@@ -157,13 +167,13 @@ class UdpChannelReactNative {
|
|
|
157
167
|
}
|
|
158
168
|
async close() {
|
|
159
169
|
try {
|
|
160
|
-
this
|
|
170
|
+
this.#socket.close();
|
|
161
171
|
} catch (error) {
|
|
162
172
|
logger.debug("Error on closing socket", error);
|
|
163
173
|
}
|
|
164
174
|
}
|
|
165
175
|
get port() {
|
|
166
|
-
return this
|
|
176
|
+
return this.#socket.address().port;
|
|
167
177
|
}
|
|
168
178
|
supports(type, address) {
|
|
169
179
|
if (type !== import_general.ChannelType.UDP) {
|
|
@@ -172,7 +182,7 @@ class UdpChannelReactNative {
|
|
|
172
182
|
if (address === void 0) {
|
|
173
183
|
return true;
|
|
174
184
|
}
|
|
175
|
-
if (this
|
|
185
|
+
if (this.#type === "udp4") {
|
|
176
186
|
return (0, import_general.isIPv4)(address);
|
|
177
187
|
}
|
|
178
188
|
return (0, import_general.isIPv6)(address);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/net/UdpChannelReactNative.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,8BAAkB;AAElB,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["dgram", "error"]
|
|
6
6
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChannelType, UdpChannel, UdpChannelOptions } from "#general";
|
|
1
|
+
import { ChannelType, UdpChannel, UdpChannelOptions, UdpSocketType } from "#general";
|
|
2
2
|
interface RemoteInfo {
|
|
3
3
|
address: string;
|
|
4
4
|
family: "IPv4" | "IPv6";
|
|
@@ -9,6 +9,7 @@ interface Socket {
|
|
|
9
9
|
setBroadcast(flag: boolean): void;
|
|
10
10
|
setMulticastInterface(interfaceAddress: string): void;
|
|
11
11
|
addMembership(multicastAddress: string, multicastInterface?: string): void;
|
|
12
|
+
dropMembership(multicastAddress: string, multicastInterface?: string): void;
|
|
12
13
|
on(event: "message", listener: (msg: Uint8Array, rinfo: RemoteInfo) => void): void;
|
|
13
14
|
on(event: "error", listener: (error: Error) => void): void;
|
|
14
15
|
removeListener(event: "message", listener: (msg: Uint8Array, rinfo: RemoteInfo) => void): void;
|
|
@@ -21,12 +22,12 @@ interface Socket {
|
|
|
21
22
|
};
|
|
22
23
|
}
|
|
23
24
|
export declare class UdpChannelReactNative implements UdpChannel {
|
|
24
|
-
private
|
|
25
|
-
|
|
26
|
-
private readonly netInterface?;
|
|
27
|
-
static create({ listeningPort, type, listeningAddress, netInterface, membershipAddresses, }: UdpChannelOptions): Promise<UdpChannelReactNative>;
|
|
25
|
+
#private;
|
|
26
|
+
static create({ listeningPort, type, listeningAddress, netInterface }: UdpChannelOptions): Promise<UdpChannelReactNative>;
|
|
28
27
|
readonly maxPayloadSize: number;
|
|
29
|
-
constructor(type:
|
|
28
|
+
constructor(type: UdpSocketType, socket: Socket, netInterface?: string);
|
|
29
|
+
addMembership(membershipAddress: string): Promise<void>;
|
|
30
|
+
dropMembership(membershipAddress: string): Promise<void>;
|
|
30
31
|
onData(listener: (netInterface: string | undefined, peerAddress: string, peerPort: number, data: Uint8Array) => void): {
|
|
31
32
|
close: () => Promise<void>;
|
|
32
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UdpChannelReactNative.d.ts","sourceRoot":"","sources":["../../../src/net/UdpChannelReactNative.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,WAAW,EASX,UAAU,EACV,iBAAiB,
|
|
1
|
+
{"version":3,"file":"UdpChannelReactNative.d.ts","sourceRoot":"","sources":["../../../src/net/UdpChannelReactNative.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,WAAW,EASX,UAAU,EACV,iBAAiB,EACjB,aAAa,EAChB,MAAM,UAAU,CAAC;AAOlB,UAAU,UAAU;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAoBD,UAAU,MAAM;IACZ,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,aAAa,CAAC,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3E,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5E,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IACnF,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3D,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/F,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IACvE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IACpG,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAmCD,qBAAa,qBAAsB,YAAW,UAAU;;WAKvC,MAAM,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,EAAE,iBAAiB;IAgC9F,QAAQ,CAAC,cAAc,SAAwB;gBAEnC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IAMhE,aAAa,CAAC,iBAAiB,EAAE,MAAM;IAkBvC,cAAc,CAAC,iBAAiB,EAAE,MAAM;IAkB9C,MAAM,CACF,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI;;;IAiB3G,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU;IAYjD,KAAK;IAQX,IAAI,IAAI,WAEP;IAED,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM;CAe/C"}
|
|
@@ -49,18 +49,10 @@ function createDgramSocket(host, port, options) {
|
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
51
|
class UdpChannelReactNative {
|
|
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;
|
|
@@ -89,41 +81,59 @@ class UdpChannelReactNative {
|
|
|
89
81
|
);
|
|
90
82
|
socket.setMulticastInterface(multicastInterface);
|
|
91
83
|
}
|
|
92
|
-
if (membershipAddresses !== void 0) {
|
|
93
|
-
const multicastInterfaces = await NetworkReactNative.getMembershipMulticastInterfaces(
|
|
94
|
-
netInterface,
|
|
95
|
-
type === "udp4"
|
|
96
|
-
);
|
|
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
84
|
return new UdpChannelReactNative(type, socket, netInterfaceZone);
|
|
110
85
|
}
|
|
111
86
|
maxPayloadSize = MAX_UDP_MESSAGE_SIZE;
|
|
87
|
+
constructor(type, socket, netInterface) {
|
|
88
|
+
this.#type = type;
|
|
89
|
+
this.#socket = socket;
|
|
90
|
+
this.#netInterface = netInterface;
|
|
91
|
+
}
|
|
92
|
+
async addMembership(membershipAddress) {
|
|
93
|
+
const multicastInterfaces = await NetworkReactNative.getMembershipMulticastInterfaces(
|
|
94
|
+
this.#netInterface,
|
|
95
|
+
this.#type === "udp4"
|
|
96
|
+
);
|
|
97
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
98
|
+
try {
|
|
99
|
+
this.#socket.addMembership(membershipAddress, multicastInterface);
|
|
100
|
+
} catch (error) {
|
|
101
|
+
logger.warn(
|
|
102
|
+
`Error adding membership for address ${membershipAddress}${multicastInterface ? ` with interface ${multicastInterface}` : ""}: ${error}`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async dropMembership(membershipAddress) {
|
|
108
|
+
const multicastInterfaces = await NetworkReactNative.getMembershipMulticastInterfaces(
|
|
109
|
+
this.#netInterface,
|
|
110
|
+
this.#type === "udp4"
|
|
111
|
+
);
|
|
112
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
113
|
+
try {
|
|
114
|
+
this.#socket.dropMembership(membershipAddress, multicastInterface);
|
|
115
|
+
} catch (error) {
|
|
116
|
+
logger.warn(
|
|
117
|
+
`Error removing membership for address ${membershipAddress}${multicastInterface ? ` with interface ${multicastInterface}` : ""}: ${error}`
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
112
122
|
onData(listener) {
|
|
113
123
|
const messageListener = async (data, { address, port }) => {
|
|
114
|
-
const netInterface = this
|
|
124
|
+
const netInterface = this.#netInterface ?? await NetworkReactNative.getNetInterfaceForIp(address);
|
|
115
125
|
listener(netInterface, address, port, data);
|
|
116
126
|
};
|
|
117
|
-
this
|
|
127
|
+
this.#socket.on("message", messageListener);
|
|
118
128
|
return {
|
|
119
129
|
close: async () => {
|
|
120
|
-
this
|
|
130
|
+
this.#socket.removeListener("message", messageListener);
|
|
121
131
|
}
|
|
122
132
|
};
|
|
123
133
|
}
|
|
124
134
|
async send(host, port, data) {
|
|
125
135
|
return new Promise((resolve, reject) => {
|
|
126
|
-
this
|
|
136
|
+
this.#socket.send(data, port, host, (error) => {
|
|
127
137
|
if (error !== null) {
|
|
128
138
|
reject(repackErrorAs(error, NetworkError));
|
|
129
139
|
return;
|
|
@@ -134,13 +144,13 @@ class UdpChannelReactNative {
|
|
|
134
144
|
}
|
|
135
145
|
async close() {
|
|
136
146
|
try {
|
|
137
|
-
this
|
|
147
|
+
this.#socket.close();
|
|
138
148
|
} catch (error) {
|
|
139
149
|
logger.debug("Error on closing socket", error);
|
|
140
150
|
}
|
|
141
151
|
}
|
|
142
152
|
get port() {
|
|
143
|
-
return this
|
|
153
|
+
return this.#socket.address().port;
|
|
144
154
|
}
|
|
145
155
|
supports(type, address) {
|
|
146
156
|
if (type !== ChannelType.UDP) {
|
|
@@ -149,7 +159,7 @@ class UdpChannelReactNative {
|
|
|
149
159
|
if (address === void 0) {
|
|
150
160
|
return true;
|
|
151
161
|
}
|
|
152
|
-
if (this
|
|
162
|
+
if (this.#type === "udp4") {
|
|
153
163
|
return isIPv4(address);
|
|
154
164
|
}
|
|
155
165
|
return isIPv6(address);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/net/UdpChannelReactNative.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,OAAO,WAAW;AAElB;AAAA,EACI;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/react-native",
|
|
3
|
-
"version": "0.14.0",
|
|
3
|
+
"version": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
4
4
|
"description": "Experimental React Native support for matter.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -35,9 +35,9 @@
|
|
|
35
35
|
"#*": "./src/*"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@matter/general": "0.14.0",
|
|
39
|
-
"@matter/nodejs": "0.14.0",
|
|
40
|
-
"@matter/protocol": "0.14.0",
|
|
38
|
+
"@matter/general": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
39
|
+
"@matter/nodejs": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
40
|
+
"@matter/protocol": "0.14.1-alpha.0-20250606-a9bcd03f9",
|
|
41
41
|
"@react-native-async-storage/async-storage": "^2.1.2",
|
|
42
42
|
"@react-native-community/netinfo": "^11.3.2",
|
|
43
43
|
"@types/jwk-to-pem": "^2.0.3",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"react-native-udp": "^4.1.7"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
|
-
"@matter/tools": "0.14.0"
|
|
52
|
+
"@matter/tools": "0.14.1-alpha.0-20250606-a9bcd03f9"
|
|
53
53
|
},
|
|
54
54
|
"overrides": {
|
|
55
55
|
"brorand": "npm:@matter.js/brorand@1.1.0"
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
repackErrorAs,
|
|
18
18
|
UdpChannel,
|
|
19
19
|
UdpChannelOptions,
|
|
20
|
+
UdpSocketType,
|
|
20
21
|
} from "#general";
|
|
21
22
|
import { NetworkReactNative } from "./NetworkReactNative.js";
|
|
22
23
|
|
|
@@ -30,9 +31,9 @@ interface RemoteInfo {
|
|
|
30
31
|
port: number;
|
|
31
32
|
size: number;
|
|
32
33
|
}
|
|
33
|
-
|
|
34
|
+
|
|
34
35
|
interface SocketOptions {
|
|
35
|
-
type:
|
|
36
|
+
type: UdpSocketType;
|
|
36
37
|
reuseAddr?: boolean | undefined;
|
|
37
38
|
/**
|
|
38
39
|
* @default false
|
|
@@ -48,10 +49,12 @@ interface SocketOptions {
|
|
|
48
49
|
) => void)
|
|
49
50
|
| undefined;
|
|
50
51
|
}
|
|
52
|
+
|
|
51
53
|
interface Socket {
|
|
52
54
|
setBroadcast(flag: boolean): void;
|
|
53
55
|
setMulticastInterface(interfaceAddress: string): void;
|
|
54
56
|
addMembership(multicastAddress: string, multicastInterface?: string): void;
|
|
57
|
+
dropMembership(multicastAddress: string, multicastInterface?: string): void;
|
|
55
58
|
on(event: "message", listener: (msg: Uint8Array, rinfo: RemoteInfo) => void): void;
|
|
56
59
|
on(event: "error", listener: (error: Error) => void): void;
|
|
57
60
|
removeListener(event: "message", listener: (msg: Uint8Array, rinfo: RemoteInfo) => void): void;
|
|
@@ -95,13 +98,11 @@ function createDgramSocket(host: string | undefined, port: number | undefined, o
|
|
|
95
98
|
}
|
|
96
99
|
|
|
97
100
|
export class UdpChannelReactNative implements UdpChannel {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
membershipAddresses,
|
|
104
|
-
}: UdpChannelOptions) {
|
|
101
|
+
readonly #type: UdpSocketType;
|
|
102
|
+
readonly #socket: Socket;
|
|
103
|
+
readonly #netInterface?: string;
|
|
104
|
+
|
|
105
|
+
static async create({ listeningPort, type, listeningAddress, netInterface }: UdpChannelOptions) {
|
|
105
106
|
const socketOptions: SocketOptions = { type, reuseAddr: true };
|
|
106
107
|
if (type === "udp6") {
|
|
107
108
|
socketOptions.ipv6Only = true;
|
|
@@ -130,57 +131,74 @@ export class UdpChannelReactNative implements UdpChannel {
|
|
|
130
131
|
);
|
|
131
132
|
socket.setMulticastInterface(multicastInterface);
|
|
132
133
|
}
|
|
133
|
-
if (membershipAddresses !== undefined) {
|
|
134
|
-
const multicastInterfaces = await NetworkReactNative.getMembershipMulticastInterfaces(
|
|
135
|
-
netInterface,
|
|
136
|
-
type === "udp4",
|
|
137
|
-
);
|
|
138
|
-
for (const address of membershipAddresses) {
|
|
139
|
-
for (const multicastInterface of multicastInterfaces) {
|
|
140
|
-
try {
|
|
141
|
-
socket.addMembership(address, multicastInterface);
|
|
142
|
-
} catch (error) {
|
|
143
|
-
logger.warn(
|
|
144
|
-
`Error adding membership for address ${address}${
|
|
145
|
-
multicastInterface ? ` with interface ${multicastInterface}` : ""
|
|
146
|
-
}: ${error}`,
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
134
|
return new UdpChannelReactNative(type, socket, netInterfaceZone);
|
|
153
135
|
}
|
|
154
136
|
|
|
155
137
|
readonly maxPayloadSize = MAX_UDP_MESSAGE_SIZE;
|
|
156
138
|
|
|
157
|
-
constructor(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
139
|
+
constructor(type: UdpSocketType, socket: Socket, netInterface?: string) {
|
|
140
|
+
this.#type = type;
|
|
141
|
+
this.#socket = socket;
|
|
142
|
+
this.#netInterface = netInterface;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async addMembership(membershipAddress: string) {
|
|
146
|
+
const multicastInterfaces = await NetworkReactNative.getMembershipMulticastInterfaces(
|
|
147
|
+
this.#netInterface,
|
|
148
|
+
this.#type === "udp4",
|
|
149
|
+
);
|
|
150
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
151
|
+
try {
|
|
152
|
+
this.#socket.addMembership(membershipAddress, multicastInterface);
|
|
153
|
+
} catch (error) {
|
|
154
|
+
logger.warn(
|
|
155
|
+
`Error adding membership for address ${membershipAddress}${
|
|
156
|
+
multicastInterface ? ` with interface ${multicastInterface}` : ""
|
|
157
|
+
}: ${error}`,
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async dropMembership(membershipAddress: string) {
|
|
164
|
+
const multicastInterfaces = await NetworkReactNative.getMembershipMulticastInterfaces(
|
|
165
|
+
this.#netInterface,
|
|
166
|
+
this.#type === "udp4",
|
|
167
|
+
);
|
|
168
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
169
|
+
try {
|
|
170
|
+
this.#socket.dropMembership(membershipAddress, multicastInterface);
|
|
171
|
+
} catch (error) {
|
|
172
|
+
logger.warn(
|
|
173
|
+
`Error removing membership for address ${membershipAddress}${
|
|
174
|
+
multicastInterface ? ` with interface ${multicastInterface}` : ""
|
|
175
|
+
}: ${error}`,
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
162
180
|
|
|
163
181
|
onData(
|
|
164
182
|
listener: (netInterface: string | undefined, peerAddress: string, peerPort: number, data: Uint8Array) => void,
|
|
165
183
|
) {
|
|
166
184
|
const messageListener = async (data: Uint8Array, { address, port }: RemoteInfo) => {
|
|
167
|
-
const netInterface = this
|
|
185
|
+
const netInterface = this.#netInterface ?? (await NetworkReactNative.getNetInterfaceForIp(address));
|
|
168
186
|
listener(netInterface, address, port, data);
|
|
169
187
|
};
|
|
170
188
|
|
|
171
189
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
172
|
-
this
|
|
190
|
+
this.#socket.on("message", messageListener);
|
|
173
191
|
return {
|
|
174
192
|
close: async () => {
|
|
175
193
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
176
|
-
this
|
|
194
|
+
this.#socket.removeListener("message", messageListener);
|
|
177
195
|
},
|
|
178
196
|
};
|
|
179
197
|
}
|
|
180
198
|
|
|
181
199
|
async send(host: string, port: number, data: Uint8Array) {
|
|
182
200
|
return new Promise<void>((resolve, reject) => {
|
|
183
|
-
this
|
|
201
|
+
this.#socket.send(data, port, host, error => {
|
|
184
202
|
if (error !== null) {
|
|
185
203
|
reject(repackErrorAs(error, NetworkError) as Error);
|
|
186
204
|
return;
|
|
@@ -192,14 +210,14 @@ export class UdpChannelReactNative implements UdpChannel {
|
|
|
192
210
|
|
|
193
211
|
async close() {
|
|
194
212
|
try {
|
|
195
|
-
this
|
|
213
|
+
this.#socket.close();
|
|
196
214
|
} catch (error) {
|
|
197
215
|
logger.debug("Error on closing socket", error);
|
|
198
216
|
}
|
|
199
217
|
}
|
|
200
218
|
|
|
201
219
|
get port() {
|
|
202
|
-
return this
|
|
220
|
+
return this.#socket.address().port;
|
|
203
221
|
}
|
|
204
222
|
|
|
205
223
|
supports(type: ChannelType, address?: string) {
|
|
@@ -211,7 +229,7 @@ export class UdpChannelReactNative implements UdpChannel {
|
|
|
211
229
|
return true;
|
|
212
230
|
}
|
|
213
231
|
|
|
214
|
-
if (this
|
|
232
|
+
if (this.#type === "udp4") {
|
|
215
233
|
return isIPv4(address);
|
|
216
234
|
}
|
|
217
235
|
|