@rljson/io 0.0.63 → 0.0.65

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/io.js CHANGED
@@ -1671,6 +1671,151 @@ class SocketMock {
1671
1671
  return new Map(this._onceListeners);
1672
1672
  }
1673
1673
  }
1674
+ function createSocketPair() {
1675
+ const socketA = new DirectionalSocketMock();
1676
+ const socketB = new DirectionalSocketMock();
1677
+ socketA._setPeer(socketB);
1678
+ socketB._setPeer(socketA);
1679
+ return [socketA, socketB];
1680
+ }
1681
+ class DirectionalSocketMock {
1682
+ connected = false;
1683
+ disconnected = true;
1684
+ _peer;
1685
+ _listeners = /* @__PURE__ */ new Map();
1686
+ _onceListeners = /* @__PURE__ */ new Map();
1687
+ _setPeer(peer) {
1688
+ this._peer = peer;
1689
+ }
1690
+ connect() {
1691
+ if (!this.connected) {
1692
+ this.connected = true;
1693
+ this.disconnected = false;
1694
+ this._triggerLocal("connect");
1695
+ if (this._peer) {
1696
+ this._peer._triggerLocal("connect");
1697
+ }
1698
+ }
1699
+ }
1700
+ disconnect() {
1701
+ if (this.connected) {
1702
+ this.connected = false;
1703
+ this.disconnected = true;
1704
+ this._triggerLocal("disconnect");
1705
+ if (this._peer) {
1706
+ this._peer._triggerLocal("disconnect");
1707
+ }
1708
+ }
1709
+ }
1710
+ on(eventName, listener) {
1711
+ if (!this._listeners.has(eventName)) {
1712
+ this._listeners.set(eventName, []);
1713
+ }
1714
+ this._listeners.get(eventName).push(listener);
1715
+ return this;
1716
+ }
1717
+ once(eventName, listener) {
1718
+ if (!this._onceListeners.has(eventName)) {
1719
+ this._onceListeners.set(eventName, []);
1720
+ }
1721
+ this._onceListeners.get(eventName).push(listener);
1722
+ return this;
1723
+ }
1724
+ off(eventName, listener) {
1725
+ if (listener) {
1726
+ const regularListeners = this._listeners.get(eventName);
1727
+ if (regularListeners) {
1728
+ const index = regularListeners.indexOf(listener);
1729
+ if (index > -1) regularListeners.splice(index, 1);
1730
+ }
1731
+ const onceListeners = this._onceListeners.get(eventName);
1732
+ if (onceListeners) {
1733
+ const index = onceListeners.indexOf(listener);
1734
+ if (index > -1) onceListeners.splice(index, 1);
1735
+ }
1736
+ } else {
1737
+ this._listeners.delete(eventName);
1738
+ this._onceListeners.delete(eventName);
1739
+ }
1740
+ return this;
1741
+ }
1742
+ /**
1743
+ * Emits an event to the PEER socket (cross-socket emission).
1744
+ * This is the key difference from SocketMock - emit() sends to the other side,
1745
+ * not to local listeners.
1746
+ *
1747
+ * Implements Socket.IO acknowledgement pattern: the last argument can be a callback
1748
+ * that the peer will invoke to send a response back.
1749
+ */
1750
+ emit(eventName, ...args) {
1751
+ if (!this._peer) {
1752
+ console.warn(
1753
+ `DirectionalSocketMock.emit: No peer connected for event ${String(eventName)}`
1754
+ );
1755
+ return false;
1756
+ }
1757
+ this._peer._triggerLocal(eventName, ...args);
1758
+ return true;
1759
+ }
1760
+ /**
1761
+ * Triggers listeners on THIS socket (local emission).
1762
+ * Used internally when receiving events from peer.
1763
+ */
1764
+ _triggerLocal(eventName, ...args) {
1765
+ const regularListeners = this._listeners.get(eventName);
1766
+ if (regularListeners) {
1767
+ [...regularListeners].forEach((listener) => {
1768
+ try {
1769
+ listener(...args);
1770
+ } catch (error) {
1771
+ console.error(`Error in listener for ${String(eventName)}:`, error);
1772
+ }
1773
+ });
1774
+ }
1775
+ const onceListeners = this._onceListeners.get(eventName);
1776
+ if (onceListeners) {
1777
+ const listenersToCall = [...onceListeners];
1778
+ this._onceListeners.delete(eventName);
1779
+ listenersToCall.forEach((listener) => {
1780
+ try {
1781
+ listener(...args);
1782
+ } catch (error) {
1783
+ console.error(
1784
+ `Error in once listener for ${String(eventName)}:`,
1785
+ error
1786
+ );
1787
+ }
1788
+ });
1789
+ }
1790
+ }
1791
+ removeAllListeners(eventName) {
1792
+ if (eventName !== void 0) {
1793
+ this._listeners.delete(eventName);
1794
+ this._onceListeners.delete(eventName);
1795
+ } else {
1796
+ this._listeners.clear();
1797
+ this._onceListeners.clear();
1798
+ }
1799
+ return this;
1800
+ }
1801
+ listenerCount(eventName) {
1802
+ const regularCount = this._listeners.get(eventName)?.length || 0;
1803
+ const onceCount = this._onceListeners.get(eventName)?.length || 0;
1804
+ return regularCount + onceCount;
1805
+ }
1806
+ listeners(eventName) {
1807
+ const regularListeners = this._listeners.get(eventName) || [];
1808
+ const onceListeners = this._onceListeners.get(eventName) || [];
1809
+ return [...regularListeners, ...onceListeners];
1810
+ }
1811
+ eventNames() {
1812
+ const allEvents = /* @__PURE__ */ new Set([
1813
+ ...this._listeners.keys(),
1814
+ ...this._onceListeners.keys()
1815
+ ]);
1816
+ return Array.from(allEvents);
1817
+ }
1818
+ }
1674
1819
  const socketExample = () => ({
1675
1820
  connected: false,
1676
1821
  disconnected: true,
@@ -1702,6 +1847,7 @@ const socketExample = () => ({
1702
1847
  }
1703
1848
  });
1704
1849
  export {
1850
+ DirectionalSocketMock,
1705
1851
  IoDbNameMapping,
1706
1852
  IoMem,
1707
1853
  IoMulti,
@@ -1712,6 +1858,7 @@ export {
1712
1858
  PeerSocketMock,
1713
1859
  SocketMock,
1714
1860
  calcReverseRefs,
1861
+ createSocketPair,
1715
1862
  exampleIo,
1716
1863
  exampleTestSetup,
1717
1864
  socketExample