Skip to content

Conversation

@ozanbaskan
Copy link

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