@matter/general 0.16.8-alpha.0-20260127-65e1b40e2 → 0.16.8-alpha.0-20260128-0ff06da17

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.
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { ServerAddressUdp } from "#net/ServerAddress.js";
7
+ import { Observable } from "#util/index.js";
7
8
  export declare enum ChannelType {
8
9
  UDP = "udp",
9
10
  BLE = "ble",
@@ -26,6 +27,15 @@ export interface Channel<T> {
26
27
  }
27
28
  export interface IpNetworkChannel<T> extends Channel<T> {
28
29
  networkAddress: ServerAddressUdp;
30
+ networkAddressChanged: Observable<[ServerAddressUdp]>;
29
31
  }
32
+ /**
33
+ * Returns true (and guards types) if the channel is an IP channel
34
+ */
30
35
  export declare function isIpNetworkChannel<T>(channel?: Channel<T>): channel is IpNetworkChannel<T>;
36
+ /**
37
+ * Checks if two IPNetworkChannels are referencing the same address.
38
+ * Both the channel type (UDP/TCP) and the address (including port) need to match.
39
+ */
40
+ export declare function sameIpNetworkChannel<T>(channel1: IpNetworkChannel<T>, channel2: IpNetworkChannel<T>): boolean;
31
41
  //# sourceMappingURL=Channel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Channel.d.ts","sourceRoot":"","sources":["../../../src/net/Channel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,oBAAY,WAAW;IACnB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,QAAQ;CACd;AAED,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IAEvB,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAC;IAEpB,+CAA+C;IAC/C,qBAAqB,EAAE,OAAO,CAAC;IAE/B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE,WAAW,CAAC;IAElB,iDAAiD;IACjD,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,kCAAkC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACnD,cAAc,EAAE,gBAAgB,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAE1F"}
1
+ {"version":3,"file":"Channel.d.ts","sourceRoot":"","sources":["../../../src/net/Channel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,oBAAY,WAAW;IACnB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,QAAQ;CACd;AAED,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IAEvB,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAC;IAEpB,+CAA+C;IAC/C,qBAAqB,EAAE,OAAO,CAAC;IAE/B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE,WAAW,CAAC;IAElB,iDAAiD;IACjD,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,kCAAkC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAGD,MAAM,WAAW,gBAAgB,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACnD,cAAc,EAAE,gBAAgB,CAAC;IACjC,qBAAqB,EAAE,UAAU,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;CACzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAE1F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,WAInG"}
@@ -19,7 +19,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var Channel_exports = {};
20
20
  __export(Channel_exports, {
21
21
  ChannelType: () => ChannelType,
22
- isIpNetworkChannel: () => isIpNetworkChannel
22
+ isIpNetworkChannel: () => isIpNetworkChannel,
23
+ sameIpNetworkChannel: () => sameIpNetworkChannel
23
24
  });
24
25
  module.exports = __toCommonJS(Channel_exports);
25
26
  var import_Type = require("#util/Type.js");
@@ -37,4 +38,9 @@ var ChannelType = /* @__PURE__ */ ((ChannelType2) => {
37
38
  function isIpNetworkChannel(channel) {
38
39
  return (0, import_Type.isObject)(channel?.networkAddress);
39
40
  }
41
+ function sameIpNetworkChannel(channel1, channel2) {
42
+ const { networkAddress: addr1 } = channel1;
43
+ const { networkAddress: addr2 } = channel2;
44
+ return addr1.type === addr2.type && addr1.ip === addr2.ip && addr1.port === addr2.port;
45
+ }
40
46
  //# sourceMappingURL=Channel.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/net/Channel.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,kBAAyB;AANzB;AAAA;AAAA;AAAA;AAAA;AAQO,IAAK,cAAL,kBAAKA,iBAAL;AACH,EAAAA,aAAA,SAAM;AACN,EAAAA,aAAA,SAAM;AACN,EAAAA,aAAA,SAAM;AAHE,SAAAA;AAAA,GAAA;AAgCL,SAAS,mBAAsB,SAAsD;AACxF,aAAO,sBAAU,SAA6C,cAAc;AAChF;",
4
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,kBAAyB;AANzB;AAAA;AAAA;AAAA;AAAA;AASO,IAAK,cAAL,kBAAKA,iBAAL;AACH,EAAAA,aAAA,SAAM;AACN,EAAAA,aAAA,SAAM;AACN,EAAAA,aAAA,SAAM;AAHE,SAAAA;AAAA,GAAA;AAqCL,SAAS,mBAAsB,SAAsD;AACxF,aAAO,sBAAU,SAA6C,cAAc;AAChF;AAMO,SAAS,qBAAwB,UAA+B,UAA+B;AAClG,QAAM,EAAE,gBAAgB,MAAM,IAAI;AAClC,QAAM,EAAE,gBAAgB,MAAM,IAAI;AAClC,SAAO,MAAM,SAAS,MAAM,QAAQ,MAAM,OAAO,MAAM,MAAM,MAAM,SAAS,MAAM;AACtF;",
5
5
  "names": ["ChannelType"]
6
6
  }
@@ -7,6 +7,7 @@ import { Channel, ChannelType, IpNetworkChannel } from "#net/Channel.js";
7
7
  import { ConnectionlessTransport } from "#net/ConnectionlessTransport.js";
8
8
  import { Network } from "#net/Network.js";
9
9
  import { Bytes } from "#util/Bytes.js";
10
+ import { Observable } from "#util/index.js";
10
11
  import { ServerAddress, ServerAddressUdp } from "../ServerAddress.js";
11
12
  import { UdpChannel } from "./UdpChannel.js";
12
13
  export declare class UdpInterface implements ConnectionlessTransport {
@@ -19,14 +20,15 @@ export declare class UdpInterface implements ConnectionlessTransport {
19
20
  onData(listener: (channel: Channel<Bytes>, messageBytes: Bytes) => void): ConnectionlessTransport.Listener;
20
21
  get port(): number;
21
22
  close(): Promise<void>;
22
- addMembership(address: string): import("../../index.js").MaybePromise<void>;
23
- dropMembership(address: string): import("../../index.js").MaybePromise<void>;
23
+ addMembership(address: string): import("#util/index.js").MaybePromise<void>;
24
+ dropMembership(address: string): import("#util/index.js").MaybePromise<void>;
24
25
  }
25
26
  export declare class UdpConnection implements IpNetworkChannel<Bytes> {
26
27
  #private;
27
28
  readonly isReliable = false;
28
29
  readonly supportsLargeMessages = false;
29
30
  readonly type = ChannelType.UDP;
31
+ readonly networkAddressChanged: Observable<[ServerAddressUdp], void>;
30
32
  constructor(server: UdpChannel, peerAddress: string, peerPort: number);
31
33
  get maxPayloadSize(): number;
32
34
  send(data: Bytes): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"UdpInterface.d.ts","sourceRoot":"","sources":["../../../../src/net/udp/UdpInterface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAgB,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qBAAa,YAAa,YAAW,uBAAuB;;WAG3C,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;gBAMpG,MAAM,EAAE,UAAU;IAI9B,SAAS,KAAK,MAAM,eAEnB;IAED,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM;IAIrC,WAAW,CAAC,OAAO,EAAE,aAAa;IAQxC,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,KAAK,KAAK,IAAI,GAAG,uBAAuB,CAAC,QAAQ;IAM1G,IAAI,IAAI,WAEP;IAED,KAAK;IAIL,aAAa,CAAC,OAAO,EAAE,MAAM;IAI7B,cAAc,CAAC,OAAO,EAAE,MAAM;CAGjC;AAED,qBAAa,aAAc,YAAW,gBAAgB,CAAC,KAAK,CAAC;;IACzD,QAAQ,CAAC,UAAU,SAAS;IAC5B,QAAQ,CAAC,qBAAqB,SAAS;IACvC,QAAQ,CAAC,IAAI,mBAAmB;gBAKpB,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAMrE,IAAI,cAAc,WAEjB;IAED,IAAI,CAAC,IAAI,EAAE,KAAK;IAIhB,IAAI,IAAI,WAEP;IAED,IAAI,cAAc,IAAI,gBAAgB,CAErC;IAEK,KAAK;CAGd"}
1
+ {"version":3,"file":"UdpInterface.d.ts","sourceRoot":"","sources":["../../../../src/net/udp/UdpInterface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAgB,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qBAAa,YAAa,YAAW,uBAAuB;;WAG3C,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;gBAMpG,MAAM,EAAE,UAAU;IAI9B,SAAS,KAAK,MAAM,eAEnB;IAED,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM;IAIrC,WAAW,CAAC,OAAO,EAAE,aAAa;IAQxC,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,KAAK,KAAK,IAAI,GAAG,uBAAuB,CAAC,QAAQ;IAM1G,IAAI,IAAI,WAEP;IAED,KAAK;IAIL,aAAa,CAAC,OAAO,EAAE,MAAM;IAI7B,cAAc,CAAC,OAAO,EAAE,MAAM;CAGjC;AAED,qBAAa,aAAc,YAAW,gBAAgB,CAAC,KAAK,CAAC;;IACzD,QAAQ,CAAC,UAAU,SAAS;IAC5B,QAAQ,CAAC,qBAAqB,SAAS;IACvC,QAAQ,CAAC,IAAI,mBAAmB;IAIhC,QAAQ,CAAC,qBAAqB,uCAAoC;gBAEtD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAMrE,IAAI,cAAc,WAEjB;IAED,IAAI,CAAC,IAAI,EAAE,KAAK;IAIhB,IAAI,IAAI,WAEP;IAED,IAAI,cAAc,IAAI,gBAAgB,CAErC;IAEK,KAAK;CAGd"}
@@ -24,6 +24,7 @@ __export(UdpInterface_exports, {
24
24
  module.exports = __toCommonJS(UdpInterface_exports);
25
25
  var import_Channel = require("#net/Channel.js");
26
26
  var import_Network = require("#net/Network.js");
27
+ var import_util = require("#util/index.js");
27
28
  /**
28
29
  * @license
29
30
  * Copyright 2022-2026 Matter.js Authors
@@ -77,6 +78,8 @@ class UdpConnection {
77
78
  #server;
78
79
  #peerAddress;
79
80
  #peerPort;
81
+ networkAddressChanged = (0, import_util.Observable)();
82
+ // no change so will basically never emit
80
83
  constructor(server, peerAddress, peerPort) {
81
84
  this.#server = server;
82
85
  this.#peerAddress = peerAddress;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/net/udp/UdpInterface.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,qBAAuD;AAEvD,qBAAsC;AARtC;AAAA;AAAA;AAAA;AAAA;AAaO,MAAM,aAAgD;AAAA,EAChD;AAAA,EAET,aAAa,OAAO,SAAkB,MAAuB,MAAe,MAAe,cAAuB;AAC9G,WAAO,IAAI;AAAA,MACP,MAAM,QAAQ,iBAAiB,EAAE,eAAe,MAAM,MAAM,cAAc,kBAAkB,KAAK,CAAC;AAAA,IACtG;AAAA,EACJ;AAAA,EAEA,YAAY,QAAoB;AAC5B,SAAK,UAAU;AAAA,EACnB;AAAA,EAEA,IAAc,SAAS;AACnB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAAS,MAAmB,SAAiB;AACzC,WAAO,KAAK,QAAQ,SAAS,MAAM,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,YAAY,SAAwB;AACtC,QAAI,QAAQ,SAAS,OAAO;AACxB,YAAM,IAAI,4BAAa,4BAA4B,QAAQ,IAAI,EAAE;AAAA,IACrE;AACA,UAAM,EAAE,IAAI,KAAK,IAAI;AACrB,WAAO,QAAQ,QAAQ,IAAI,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC;AAAA,EACpE;AAAA,EAEA,OAAO,UAAoG;AACvG,WAAO,KAAK,QAAQ;AAAA,MAAO,CAAC,eAAe,UAAU,UAAU,SAC3D,SAAS,IAAI,cAAc,KAAK,SAAS,UAAU,QAAQ,GAAG,IAAI;AAAA,IACtE;AAAA,EACJ;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,QAAQ;AACJ,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC9B;AAAA,EAEA,cAAc,SAAiB;AAC3B,WAAO,KAAK,QAAQ,cAAc,OAAO;AAAA,EAC7C;AAAA,EAEA,eAAe,SAAiB;AAC5B,WAAO,KAAK,QAAQ,eAAe,OAAO;AAAA,EAC9C;AACJ;AAEO,MAAM,cAAiD;AAAA,EACjD,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,OAAO,2BAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAoB,aAAqB,UAAkB;AACnE,SAAK,UAAU;AACf,SAAK,eAAe;AACpB,SAAK,YAAY;AAAA,EACrB;AAAA,EAEA,IAAI,iBAAiB;AACjB,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,KAAK,MAAa;AACd,WAAO,KAAK,QAAQ,KAAK,KAAK,cAAc,KAAK,WAAW,IAAI;AAAA,EACpE;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,GAAG,KAAK,IAAI,MAAM,KAAK,aAAa,SAAS,GAAG,IAAI,IAAI,KAAK,YAAY,MAAM,KAAK,YAAY,IAAI,KAAK,SAAS;AAAA,EAC7H;AAAA,EAEA,IAAI,iBAAmC;AACnC,WAAO,EAAE,MAAM,OAAO,IAAI,KAAK,cAAc,MAAM,KAAK,UAAU;AAAA,EACtE;AAAA,EAEA,MAAM,QAAQ;AAAA,EAEd;AACJ;",
4
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,qBAAuD;AAEvD,qBAAsC;AAEtC,kBAA2B;AAV3B;AAAA;AAAA;AAAA;AAAA;AAcO,MAAM,aAAgD;AAAA,EAChD;AAAA,EAET,aAAa,OAAO,SAAkB,MAAuB,MAAe,MAAe,cAAuB;AAC9G,WAAO,IAAI;AAAA,MACP,MAAM,QAAQ,iBAAiB,EAAE,eAAe,MAAM,MAAM,cAAc,kBAAkB,KAAK,CAAC;AAAA,IACtG;AAAA,EACJ;AAAA,EAEA,YAAY,QAAoB;AAC5B,SAAK,UAAU;AAAA,EACnB;AAAA,EAEA,IAAc,SAAS;AACnB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAAS,MAAmB,SAAiB;AACzC,WAAO,KAAK,QAAQ,SAAS,MAAM,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,YAAY,SAAwB;AACtC,QAAI,QAAQ,SAAS,OAAO;AACxB,YAAM,IAAI,4BAAa,4BAA4B,QAAQ,IAAI,EAAE;AAAA,IACrE;AACA,UAAM,EAAE,IAAI,KAAK,IAAI;AACrB,WAAO,QAAQ,QAAQ,IAAI,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC;AAAA,EACpE;AAAA,EAEA,OAAO,UAAoG;AACvG,WAAO,KAAK,QAAQ;AAAA,MAAO,CAAC,eAAe,UAAU,UAAU,SAC3D,SAAS,IAAI,cAAc,KAAK,SAAS,UAAU,QAAQ,GAAG,IAAI;AAAA,IACtE;AAAA,EACJ;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,QAAQ;AACJ,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC9B;AAAA,EAEA,cAAc,SAAiB;AAC3B,WAAO,KAAK,QAAQ,cAAc,OAAO;AAAA,EAC7C;AAAA,EAEA,eAAe,SAAiB;AAC5B,WAAO,KAAK,QAAQ,eAAe,OAAO;AAAA,EAC9C;AACJ;AAEO,MAAM,cAAiD;AAAA,EACjD,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,OAAO,2BAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,4BAAwB,wBAA+B;AAAA;AAAA,EAEhE,YAAY,QAAoB,aAAqB,UAAkB;AACnE,SAAK,UAAU;AACf,SAAK,eAAe;AACpB,SAAK,YAAY;AAAA,EACrB;AAAA,EAEA,IAAI,iBAAiB;AACjB,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,KAAK,MAAa;AACd,WAAO,KAAK,QAAQ,KAAK,KAAK,cAAc,KAAK,WAAW,IAAI;AAAA,EACpE;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,GAAG,KAAK,IAAI,MAAM,KAAK,aAAa,SAAS,GAAG,IAAI,IAAI,KAAK,YAAY,MAAM,KAAK,YAAY,IAAI,KAAK,SAAS;AAAA,EAC7H;AAAA,EAEA,IAAI,iBAAmC;AACnC,WAAO,EAAE,MAAM,OAAO,IAAI,KAAK,cAAc,MAAM,KAAK,UAAU;AAAA,EACtE;AAAA,EAEA,MAAM,QAAQ;AAAA,EAEd;AACJ;",
5
5
  "names": []
6
6
  }
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { ServerAddressUdp } from "#net/ServerAddress.js";
7
+ import { Observable } from "#util/index.js";
7
8
  export declare enum ChannelType {
8
9
  UDP = "udp",
9
10
  BLE = "ble",
@@ -26,6 +27,15 @@ export interface Channel<T> {
26
27
  }
27
28
  export interface IpNetworkChannel<T> extends Channel<T> {
28
29
  networkAddress: ServerAddressUdp;
30
+ networkAddressChanged: Observable<[ServerAddressUdp]>;
29
31
  }
32
+ /**
33
+ * Returns true (and guards types) if the channel is an IP channel
34
+ */
30
35
  export declare function isIpNetworkChannel<T>(channel?: Channel<T>): channel is IpNetworkChannel<T>;
36
+ /**
37
+ * Checks if two IPNetworkChannels are referencing the same address.
38
+ * Both the channel type (UDP/TCP) and the address (including port) need to match.
39
+ */
40
+ export declare function sameIpNetworkChannel<T>(channel1: IpNetworkChannel<T>, channel2: IpNetworkChannel<T>): boolean;
31
41
  //# sourceMappingURL=Channel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Channel.d.ts","sourceRoot":"","sources":["../../../src/net/Channel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,oBAAY,WAAW;IACnB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,QAAQ;CACd;AAED,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IAEvB,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAC;IAEpB,+CAA+C;IAC/C,qBAAqB,EAAE,OAAO,CAAC;IAE/B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE,WAAW,CAAC;IAElB,iDAAiD;IACjD,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,kCAAkC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACnD,cAAc,EAAE,gBAAgB,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAE1F"}
1
+ {"version":3,"file":"Channel.d.ts","sourceRoot":"","sources":["../../../src/net/Channel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,oBAAY,WAAW;IACnB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,QAAQ;CACd;AAED,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IAEvB,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAC;IAEpB,+CAA+C;IAC/C,qBAAqB,EAAE,OAAO,CAAC;IAE/B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE,WAAW,CAAC;IAElB,iDAAiD;IACjD,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,kCAAkC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAGD,MAAM,WAAW,gBAAgB,CAAC,CAAC,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACnD,cAAc,EAAE,gBAAgB,CAAC;IACjC,qBAAqB,EAAE,UAAU,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;CACzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAE1F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,WAInG"}
@@ -13,8 +13,14 @@ var ChannelType = /* @__PURE__ */ ((ChannelType2) => {
13
13
  function isIpNetworkChannel(channel) {
14
14
  return isObject(channel?.networkAddress);
15
15
  }
16
+ function sameIpNetworkChannel(channel1, channel2) {
17
+ const { networkAddress: addr1 } = channel1;
18
+ const { networkAddress: addr2 } = channel2;
19
+ return addr1.type === addr2.type && addr1.ip === addr2.ip && addr1.port === addr2.port;
20
+ }
16
21
  export {
17
22
  ChannelType,
18
- isIpNetworkChannel
23
+ isIpNetworkChannel,
24
+ sameIpNetworkChannel
19
25
  };
20
26
  //# sourceMappingURL=Channel.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/net/Channel.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,gBAAgB;AAElB,IAAK,cAAL,kBAAKA,iBAAL;AACH,EAAAA,aAAA,SAAM;AACN,EAAAA,aAAA,SAAM;AACN,EAAAA,aAAA,SAAM;AAHE,SAAAA;AAAA,GAAA;AAgCL,SAAS,mBAAsB,SAAsD;AACxF,SAAO,SAAU,SAA6C,cAAc;AAChF;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,gBAAgB;AAGlB,IAAK,cAAL,kBAAKA,iBAAL;AACH,EAAAA,aAAA,SAAM;AACN,EAAAA,aAAA,SAAM;AACN,EAAAA,aAAA,SAAM;AAHE,SAAAA;AAAA,GAAA;AAqCL,SAAS,mBAAsB,SAAsD;AACxF,SAAO,SAAU,SAA6C,cAAc;AAChF;AAMO,SAAS,qBAAwB,UAA+B,UAA+B;AAClG,QAAM,EAAE,gBAAgB,MAAM,IAAI;AAClC,QAAM,EAAE,gBAAgB,MAAM,IAAI;AAClC,SAAO,MAAM,SAAS,MAAM,QAAQ,MAAM,OAAO,MAAM,MAAM,MAAM,SAAS,MAAM;AACtF;",
5
5
  "names": ["ChannelType"]
6
6
  }
@@ -7,6 +7,7 @@ import { Channel, ChannelType, IpNetworkChannel } from "#net/Channel.js";
7
7
  import { ConnectionlessTransport } from "#net/ConnectionlessTransport.js";
8
8
  import { Network } from "#net/Network.js";
9
9
  import { Bytes } from "#util/Bytes.js";
10
+ import { Observable } from "#util/index.js";
10
11
  import { ServerAddress, ServerAddressUdp } from "../ServerAddress.js";
11
12
  import { UdpChannel } from "./UdpChannel.js";
12
13
  export declare class UdpInterface implements ConnectionlessTransport {
@@ -19,14 +20,15 @@ export declare class UdpInterface implements ConnectionlessTransport {
19
20
  onData(listener: (channel: Channel<Bytes>, messageBytes: Bytes) => void): ConnectionlessTransport.Listener;
20
21
  get port(): number;
21
22
  close(): Promise<void>;
22
- addMembership(address: string): import("../../index.js").MaybePromise<void>;
23
- dropMembership(address: string): import("../../index.js").MaybePromise<void>;
23
+ addMembership(address: string): import("#util/index.js").MaybePromise<void>;
24
+ dropMembership(address: string): import("#util/index.js").MaybePromise<void>;
24
25
  }
25
26
  export declare class UdpConnection implements IpNetworkChannel<Bytes> {
26
27
  #private;
27
28
  readonly isReliable = false;
28
29
  readonly supportsLargeMessages = false;
29
30
  readonly type = ChannelType.UDP;
31
+ readonly networkAddressChanged: Observable<[ServerAddressUdp], void>;
30
32
  constructor(server: UdpChannel, peerAddress: string, peerPort: number);
31
33
  get maxPayloadSize(): number;
32
34
  send(data: Bytes): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"UdpInterface.d.ts","sourceRoot":"","sources":["../../../../src/net/udp/UdpInterface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAgB,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qBAAa,YAAa,YAAW,uBAAuB;;WAG3C,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;gBAMpG,MAAM,EAAE,UAAU;IAI9B,SAAS,KAAK,MAAM,eAEnB;IAED,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM;IAIrC,WAAW,CAAC,OAAO,EAAE,aAAa;IAQxC,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,KAAK,KAAK,IAAI,GAAG,uBAAuB,CAAC,QAAQ;IAM1G,IAAI,IAAI,WAEP;IAED,KAAK;IAIL,aAAa,CAAC,OAAO,EAAE,MAAM;IAI7B,cAAc,CAAC,OAAO,EAAE,MAAM;CAGjC;AAED,qBAAa,aAAc,YAAW,gBAAgB,CAAC,KAAK,CAAC;;IACzD,QAAQ,CAAC,UAAU,SAAS;IAC5B,QAAQ,CAAC,qBAAqB,SAAS;IACvC,QAAQ,CAAC,IAAI,mBAAmB;gBAKpB,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAMrE,IAAI,cAAc,WAEjB;IAED,IAAI,CAAC,IAAI,EAAE,KAAK;IAIhB,IAAI,IAAI,WAEP;IAED,IAAI,cAAc,IAAI,gBAAgB,CAErC;IAEK,KAAK;CAGd"}
1
+ {"version":3,"file":"UdpInterface.d.ts","sourceRoot":"","sources":["../../../../src/net/udp/UdpInterface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAgB,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qBAAa,YAAa,YAAW,uBAAuB;;WAG3C,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;gBAMpG,MAAM,EAAE,UAAU;IAI9B,SAAS,KAAK,MAAM,eAEnB;IAED,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM;IAIrC,WAAW,CAAC,OAAO,EAAE,aAAa;IAQxC,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,KAAK,KAAK,IAAI,GAAG,uBAAuB,CAAC,QAAQ;IAM1G,IAAI,IAAI,WAEP;IAED,KAAK;IAIL,aAAa,CAAC,OAAO,EAAE,MAAM;IAI7B,cAAc,CAAC,OAAO,EAAE,MAAM;CAGjC;AAED,qBAAa,aAAc,YAAW,gBAAgB,CAAC,KAAK,CAAC;;IACzD,QAAQ,CAAC,UAAU,SAAS;IAC5B,QAAQ,CAAC,qBAAqB,SAAS;IACvC,QAAQ,CAAC,IAAI,mBAAmB;IAIhC,QAAQ,CAAC,qBAAqB,uCAAoC;gBAEtD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAMrE,IAAI,cAAc,WAEjB;IAED,IAAI,CAAC,IAAI,EAAE,KAAK;IAIhB,IAAI,IAAI,WAEP;IAED,IAAI,cAAc,IAAI,gBAAgB,CAErC;IAEK,KAAK;CAGd"}
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { ChannelType } from "#net/Channel.js";
7
7
  import { NetworkError } from "#net/Network.js";
8
+ import { Observable } from "#util/index.js";
8
9
  class UdpInterface {
9
10
  #server;
10
11
  static async create(network, type, port, host, netInterface) {
@@ -53,6 +54,8 @@ class UdpConnection {
53
54
  #server;
54
55
  #peerAddress;
55
56
  #peerPort;
57
+ networkAddressChanged = Observable();
58
+ // no change so will basically never emit
56
59
  constructor(server, peerAddress, peerPort) {
57
60
  this.#server = server;
58
61
  this.#peerAddress = peerAddress;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/net/udp/UdpInterface.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAkB,mBAAqC;AAEvD,SAAkB,oBAAoB;AAK/B,MAAM,aAAgD;AAAA,EAChD;AAAA,EAET,aAAa,OAAO,SAAkB,MAAuB,MAAe,MAAe,cAAuB;AAC9G,WAAO,IAAI;AAAA,MACP,MAAM,QAAQ,iBAAiB,EAAE,eAAe,MAAM,MAAM,cAAc,kBAAkB,KAAK,CAAC;AAAA,IACtG;AAAA,EACJ;AAAA,EAEA,YAAY,QAAoB;AAC5B,SAAK,UAAU;AAAA,EACnB;AAAA,EAEA,IAAc,SAAS;AACnB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAAS,MAAmB,SAAiB;AACzC,WAAO,KAAK,QAAQ,SAAS,MAAM,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,YAAY,SAAwB;AACtC,QAAI,QAAQ,SAAS,OAAO;AACxB,YAAM,IAAI,aAAa,4BAA4B,QAAQ,IAAI,EAAE;AAAA,IACrE;AACA,UAAM,EAAE,IAAI,KAAK,IAAI;AACrB,WAAO,QAAQ,QAAQ,IAAI,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC;AAAA,EACpE;AAAA,EAEA,OAAO,UAAoG;AACvG,WAAO,KAAK,QAAQ;AAAA,MAAO,CAAC,eAAe,UAAU,UAAU,SAC3D,SAAS,IAAI,cAAc,KAAK,SAAS,UAAU,QAAQ,GAAG,IAAI;AAAA,IACtE;AAAA,EACJ;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,QAAQ;AACJ,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC9B;AAAA,EAEA,cAAc,SAAiB;AAC3B,WAAO,KAAK,QAAQ,cAAc,OAAO;AAAA,EAC7C;AAAA,EAEA,eAAe,SAAiB;AAC5B,WAAO,KAAK,QAAQ,eAAe,OAAO;AAAA,EAC9C;AACJ;AAEO,MAAM,cAAiD;AAAA,EACjD,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,OAAO,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAoB,aAAqB,UAAkB;AACnE,SAAK,UAAU;AACf,SAAK,eAAe;AACpB,SAAK,YAAY;AAAA,EACrB;AAAA,EAEA,IAAI,iBAAiB;AACjB,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,KAAK,MAAa;AACd,WAAO,KAAK,QAAQ,KAAK,KAAK,cAAc,KAAK,WAAW,IAAI;AAAA,EACpE;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,GAAG,KAAK,IAAI,MAAM,KAAK,aAAa,SAAS,GAAG,IAAI,IAAI,KAAK,YAAY,MAAM,KAAK,YAAY,IAAI,KAAK,SAAS;AAAA,EAC7H;AAAA,EAEA,IAAI,iBAAmC;AACnC,WAAO,EAAE,MAAM,OAAO,IAAI,KAAK,cAAc,MAAM,KAAK,UAAU;AAAA,EACtE;AAAA,EAEA,MAAM,QAAQ;AAAA,EAEd;AACJ;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAkB,mBAAqC;AAEvD,SAAkB,oBAAoB;AAEtC,SAAS,kBAAkB;AAIpB,MAAM,aAAgD;AAAA,EAChD;AAAA,EAET,aAAa,OAAO,SAAkB,MAAuB,MAAe,MAAe,cAAuB;AAC9G,WAAO,IAAI;AAAA,MACP,MAAM,QAAQ,iBAAiB,EAAE,eAAe,MAAM,MAAM,cAAc,kBAAkB,KAAK,CAAC;AAAA,IACtG;AAAA,EACJ;AAAA,EAEA,YAAY,QAAoB;AAC5B,SAAK,UAAU;AAAA,EACnB;AAAA,EAEA,IAAc,SAAS;AACnB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAAS,MAAmB,SAAiB;AACzC,WAAO,KAAK,QAAQ,SAAS,MAAM,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,YAAY,SAAwB;AACtC,QAAI,QAAQ,SAAS,OAAO;AACxB,YAAM,IAAI,aAAa,4BAA4B,QAAQ,IAAI,EAAE;AAAA,IACrE;AACA,UAAM,EAAE,IAAI,KAAK,IAAI;AACrB,WAAO,QAAQ,QAAQ,IAAI,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC;AAAA,EACpE;AAAA,EAEA,OAAO,UAAoG;AACvG,WAAO,KAAK,QAAQ;AAAA,MAAO,CAAC,eAAe,UAAU,UAAU,SAC3D,SAAS,IAAI,cAAc,KAAK,SAAS,UAAU,QAAQ,GAAG,IAAI;AAAA,IACtE;AAAA,EACJ;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,QAAQ;AACJ,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC9B;AAAA,EAEA,cAAc,SAAiB;AAC3B,WAAO,KAAK,QAAQ,cAAc,OAAO;AAAA,EAC7C;AAAA,EAEA,eAAe,SAAiB;AAC5B,WAAO,KAAK,QAAQ,eAAe,OAAO;AAAA,EAC9C;AACJ;AAEO,MAAM,cAAiD;AAAA,EACjD,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,OAAO,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAwB,WAA+B;AAAA;AAAA,EAEhE,YAAY,QAAoB,aAAqB,UAAkB;AACnE,SAAK,UAAU;AACf,SAAK,eAAe;AACpB,SAAK,YAAY;AAAA,EACrB;AAAA,EAEA,IAAI,iBAAiB;AACjB,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,KAAK,MAAa;AACd,WAAO,KAAK,QAAQ,KAAK,KAAK,cAAc,KAAK,WAAW,IAAI;AAAA,EACpE;AAAA,EAEA,IAAI,OAAO;AACP,WAAO,GAAG,KAAK,IAAI,MAAM,KAAK,aAAa,SAAS,GAAG,IAAI,IAAI,KAAK,YAAY,MAAM,KAAK,YAAY,IAAI,KAAK,SAAS;AAAA,EAC7H;AAAA,EAEA,IAAI,iBAAmC;AACnC,WAAO,EAAE,MAAM,OAAO,IAAI,KAAK,cAAc,MAAM,KAAK,UAAU;AAAA,EACtE;AAAA,EAEA,MAAM,QAAQ;AAAA,EAEd;AACJ;",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/general",
3
- "version": "0.16.8-alpha.0-20260127-65e1b40e2",
3
+ "version": "0.16.8-alpha.0-20260128-0ff06da17",
4
4
  "description": "Non-Matter support for Matter.js",
5
5
  "keywords": [
6
6
  "iot",
@@ -36,7 +36,7 @@
36
36
  "@noble/curves": "^2.0.1"
37
37
  },
38
38
  "devDependencies": {
39
- "@matter/testing": "0.16.8-alpha.0-20260127-65e1b40e2"
39
+ "@matter/testing": "0.16.8-alpha.0-20260128-0ff06da17"
40
40
  },
41
41
  "files": [
42
42
  "dist/**/*",
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { ServerAddressUdp } from "#net/ServerAddress.js";
7
7
  import { isObject } from "#util/Type.js";
8
+ import { Observable } from "#util/index.js";
8
9
 
9
10
  export enum ChannelType {
10
11
  UDP = "udp",
@@ -34,10 +35,25 @@ export interface Channel<T> {
34
35
  close(): Promise<void>;
35
36
  }
36
37
 
38
+ // TODO Enhance when we add TCP support
37
39
  export interface IpNetworkChannel<T> extends Channel<T> {
38
40
  networkAddress: ServerAddressUdp;
41
+ networkAddressChanged: Observable<[ServerAddressUdp]>;
39
42
  }
40
43
 
44
+ /**
45
+ * Returns true (and guards types) if the channel is an IP channel
46
+ */
41
47
  export function isIpNetworkChannel<T>(channel?: Channel<T>): channel is IpNetworkChannel<T> {
42
48
  return isObject((channel as IpNetworkChannel<T> | undefined)?.networkAddress);
43
49
  }
50
+
51
+ /**
52
+ * Checks if two IPNetworkChannels are referencing the same address.
53
+ * Both the channel type (UDP/TCP) and the address (including port) need to match.
54
+ */
55
+ export function sameIpNetworkChannel<T>(channel1: IpNetworkChannel<T>, channel2: IpNetworkChannel<T>) {
56
+ const { networkAddress: addr1 } = channel1;
57
+ const { networkAddress: addr2 } = channel2;
58
+ return addr1.type === addr2.type && addr1.ip === addr2.ip && addr1.port === addr2.port;
59
+ }
@@ -8,6 +8,7 @@ import { Channel, ChannelType, IpNetworkChannel } from "#net/Channel.js";
8
8
  import { ConnectionlessTransport } from "#net/ConnectionlessTransport.js";
9
9
  import { Network, NetworkError } from "#net/Network.js";
10
10
  import { Bytes } from "#util/Bytes.js";
11
+ import { Observable } from "#util/index.js";
11
12
  import { ServerAddress, ServerAddressUdp } from "../ServerAddress.js";
12
13
  import { UdpChannel } from "./UdpChannel.js";
13
14
 
@@ -70,6 +71,7 @@ export class UdpConnection implements IpNetworkChannel<Bytes> {
70
71
  readonly #server: UdpChannel;
71
72
  readonly #peerAddress: string;
72
73
  readonly #peerPort: number;
74
+ readonly networkAddressChanged = Observable<[ServerAddressUdp]>(); // no change so will basically never emit
73
75
 
74
76
  constructor(server: UdpChannel, peerAddress: string, peerPort: number) {
75
77
  this.#server = server;