UNPKG

@webrtc-remote-control/core

Version:

Thin abstraction layer above peerjs that will let you be more productive at making WebRTC data channels based apps.

81 lines (76 loc) 2.6 kB
/* eslint-disable import/no-relative-packages,import/no-extraneous-dependencies */ import EventEmitter from "eventemitter3"; import { makeConnectionFilterUtilities } from "../../shared/common"; export { prepareUtils } from "../../shared/common"; function makePeerConnection(peer, masterPeerId, ee, onConnectionOpened) { const { connMetadata } = makeConnectionFilterUtilities(); // to ensure connections with iOs, must use json serialization const conn = peer.connect(masterPeerId, { serialization: "json", metadata: connMetadata, // will let us identify which connections are managed by the package / by the user }); conn.on("open", () => { if (typeof onConnectionOpened === "function") { onConnectionOpened(); } }); conn.on("data", (data) => { ee.emit("data", { from: "master" }, data); }); return conn; } export default function prepare({ humanizeError, getPeerId, setPeerIdToSessionStorage, }) { return { humanizeError, getPeerId, bindConnection(peer, masterPeerId) { return new Promise((res) => { let conn = null; const ee = new EventEmitter(); const wrcRemote = { send(payload) { if (conn) { conn.send(payload); } else { // eslint-disable-next-line no-console console.warning("You called `send` with no connection"); } }, on: ee.on.bind(ee), off: ee.off.bind(ee), }; const createPeerConnectionWithReconnectOnClose = ( onConnectionOpened ) => { conn = null; conn = makePeerConnection(peer, masterPeerId, ee, onConnectionOpened); conn.on("close", () => { ee.emit("remote.disconnect", { id: peer.id }); createPeerConnectionWithReconnectOnClose(() => { ee.emit("remote.reconnect", { id: peer.id }); }); }); }; peer.on("open", (peerId) => { setPeerIdToSessionStorage(peerId); createPeerConnectionWithReconnectOnClose(() => res(wrcRemote)); conn.on("error", (e) => { // todo emit some error ? same on master ? console.log("conn.error", e); }); // ensure to disconnect remote when the page is closed const onBeforeUnloadPeerDisconnect = () => { if (conn && conn.disconnect) { conn.disconnect(); } }; window.addEventListener("beforeunload", onBeforeUnloadPeerDisconnect); }); }); }, }; }