Skip to content

Expose websocket connection#38

Open
ozanbaskan wants to merge 2 commits into
matallui:mainfrom
ozanbaskan:main
Open

Expose websocket connection#38
ozanbaskan wants to merge 2 commits into
matallui:mainfrom
ozanbaskan:main

Conversation

@ozanbaskan
Copy link
Copy Markdown

I created a voice chat app where I need to keep a websocket connection open. Artico was not exposing the underlying socket.io connection so I modified the code and built a version that exposes it, now I am creating a PR for others who might need it as well.

Example code:

const signaling = new SocketSignaling({ url: "https://freevoice.app:443" });
const peer = new Artico({ signaling });

const peers = {};
const users = new Map();

let socket;
/**
 * @type{import("./lib/rtco-client").Room}
 */
let room;
/**
 * @type{MediaStream}
 */
let localStream;
/**
 * @type{string}
 */
let roomId;
let muted = false;

peer.on("close", () => {
  console.log("Connection to signaling server is now closed.");
});

peer.on("error", (err) => {
  console.log("Artico error:", err);
});

peer.on("open", () => {
  peerId = peer.id;
  console.log("Artico connected", peerId);
  peer.on("call", function (call) {
    console.log(`Call from peer`);

    call.answer();

    call.on("open", () => {
      console.log("Connection established to ", call.target);
    });
    call.on("error", (err) => {
      console.error("Call error:", err);
    });

    call.on("stream", function (remoteStream, metadata) {
      startVoiceStream(call.target, remoteStream);
    });
  });

  socket = signaling.socket;

  socket.on("room-list", (rooms) => {
    allRooms = rooms;
    renderRooms(rooms);
  });

  socket.on("nickname-changed", ({ id, nickname }) => {
    if (!users.has(id)) return;

    users.set(id, nickname);
    renderUsers();
  });

  socket.on("room-users", (usersInRoom) => {
    usersInRoom.forEach(({ id, nickname }) => {
      users.set(id, nickname);
    });
    renderUsers();
  });

  socket.on("user-joined", async ({ id, nickname, peerId }) => {
    users.set(id, nickname);
    renderUsers();
  });

  socket.on("user-left", (id) => {
    peers[id]?.close();
    delete peers[id];
    users.delete(id);
    renderUsers();
  });
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant