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.

1 lines 10.5 kB
{"version":3,"file":"index.cjs","sources":["../shared/common.js","../remote/src/core.remote.js","../master/src/core.master.js"],"sourcesContent":["export function makeStoreAccessor(\n sessionStorageKey = \"webrtc-remote-control-peer-id\"\n) {\n return {\n getPeerId() {\n return sessionStorage.getItem(sessionStorageKey);\n },\n setPeerIdToSessionStorage(peerId) {\n sessionStorage.setItem(sessionStorageKey, peerId);\n },\n };\n}\n\nexport function makeConnectionFilterUtilities() {\n const connMetadata = \"from-webrtc-remote-control\";\n return {\n isConnectionFromRemote(conn) {\n return conn.metadata === connMetadata;\n },\n connMetadata,\n };\n}\n\n/**\n * Pass mapping of error.type / message\n * You can pass `default` key a function that accepts an `error` and returns a string\n */\nexport function makeHumanizeError(\n { mapping: overrideMapping, withTechicalErrorMessage } = {\n mapping: {},\n withTechicalErrorMessage: true,\n }\n) {\n const mapping = {\n \"browser-incompatible\":\n \"Your browser doesn't support WebRTC features, please try with a recent browser.\",\n disconnected:\n \"You are disconnected and can't make any more peer connection, please reload.\",\n network: \"It seems you're experimenting some network problems.\",\n \"peer-unavailable\":\n \"The peer you were connected to seems to have lost connection, try to reload it.\",\n \"server-error\":\n \"An error occured on the signaling server. Sorry, try to come back later.\",\n default: (error) =>\n `An error occured${error.type ? ` - type: ${error.type}` : \"\"}`,\n ...overrideMapping,\n };\n return function humanizeError(error) {\n const humanError =\n mapping[error.type] ||\n (typeof mapping.default === \"function\"\n ? mapping.default(error)\n : mapping.default);\n return humanError && error.message && withTechicalErrorMessage\n ? `${humanError} (${error.message})`\n : humanError;\n };\n}\n\nexport function prepareUtils({ sessionStorageKey, humanErrors } = {}) {\n const humanizeError = makeHumanizeError(humanErrors);\n const { isConnectionFromRemote } = makeConnectionFilterUtilities();\n const { getPeerId, setPeerIdToSessionStorage } =\n makeStoreAccessor(sessionStorageKey);\n return {\n humanizeError,\n isConnectionFromRemote,\n getPeerId,\n setPeerIdToSessionStorage,\n };\n}\n","/* eslint-disable import/no-relative-packages,import/no-extraneous-dependencies */\nimport EventEmitter from \"eventemitter3\";\n\nimport { makeConnectionFilterUtilities } from \"../../shared/common\";\n\nexport { prepareUtils } from \"../../shared/common\";\n\nfunction makePeerConnection(peer, masterPeerId, ee, onConnectionOpened) {\n const { connMetadata } = makeConnectionFilterUtilities();\n // to ensure connections with iOs, must use json serialization\n const conn = peer.connect(masterPeerId, {\n serialization: \"json\",\n metadata: connMetadata, // will let us identify which connections are managed by the package / by the user\n });\n conn.on(\"open\", () => {\n if (typeof onConnectionOpened === \"function\") {\n onConnectionOpened();\n }\n });\n conn.on(\"data\", (data) => {\n ee.emit(\"data\", { from: \"master\" }, data);\n });\n return conn;\n}\n\nexport default function prepare({\n humanizeError,\n getPeerId,\n setPeerIdToSessionStorage,\n}) {\n return {\n humanizeError,\n getPeerId,\n bindConnection(peer, masterPeerId) {\n return new Promise((res) => {\n let conn = null;\n const ee = new EventEmitter();\n const wrcRemote = {\n send(payload) {\n if (conn) {\n conn.send(payload);\n } else {\n // eslint-disable-next-line no-console\n console.warning(\"You called `send` with no connection\");\n }\n },\n on: ee.on.bind(ee),\n off: ee.off.bind(ee),\n };\n const createPeerConnectionWithReconnectOnClose = (\n onConnectionOpened\n ) => {\n conn = null;\n conn = makePeerConnection(peer, masterPeerId, ee, onConnectionOpened);\n conn.on(\"close\", () => {\n ee.emit(\"remote.disconnect\", { id: peer.id });\n createPeerConnectionWithReconnectOnClose(() => {\n ee.emit(\"remote.reconnect\", { id: peer.id });\n });\n });\n };\n peer.on(\"open\", (peerId) => {\n setPeerIdToSessionStorage(peerId);\n createPeerConnectionWithReconnectOnClose(() => res(wrcRemote));\n conn.on(\"error\", (e) => {\n // todo emit some error ? same on master ?\n console.log(\"conn.error\", e);\n });\n // ensure to disconnect remote when the page is closed\n const onBeforeUnloadPeerDisconnect = () => {\n if (conn && conn.disconnect) {\n conn.disconnect();\n }\n };\n window.addEventListener(\"beforeunload\", onBeforeUnloadPeerDisconnect);\n });\n });\n },\n };\n}\n","/* eslint-disable import/no-relative-packages,import/no-extraneous-dependencies */\nimport EventEmitter from \"eventemitter3\";\n\nexport { prepareUtils } from \"../../shared/common\";\n\nexport default function prepare({\n humanizeError,\n isConnectionFromRemote,\n getPeerId,\n setPeerIdToSessionStorage,\n}) {\n return {\n humanizeError,\n isConnectionFromRemote,\n getPeerId,\n bindConnection(peer) {\n return new Promise((res) => {\n const ee = new EventEmitter();\n const connections = new Map();\n const wrcMaster = {\n sendTo(id, payload) {\n const conn = connections.get(id);\n if (conn) {\n return conn.send(payload);\n }\n return null;\n },\n sendAll(payload) {\n [...connections.values()].forEach((conn) => {\n conn.send(payload);\n });\n },\n on: ee.on.bind(ee),\n off: ee.off.bind(ee),\n };\n peer.on(\"open\", (peerId) => {\n setPeerIdToSessionStorage(peerId);\n res(wrcMaster);\n });\n peer.on(\"connection\", (conn) => {\n // we don't track the connections made by the user directly using `peer.connect`\n if (!isConnectionFromRemote(conn)) {\n return;\n }\n // if this is a reconnect from the same peer, replace connection with the latest one\n connections.set(conn.peer, conn);\n conn.on(\"open\", () => {\n ee.emit(\"remote.connect\", { id: conn.peer });\n console.log(\"connections\", connections);\n });\n conn.on(\"data\", (data) => {\n ee.emit(\"data\", { id: conn.peer, from: \"remote\" }, data);\n });\n conn.on(\"close\", () => {\n connections.delete(conn.peer);\n ee.emit(\"remote.disconnect\", { id: conn.peer });\n console.log(\"connections\", connections);\n });\n });\n });\n },\n };\n}\n"],"names":["makeConnectionFilterUtilities","connMetadata","isConnectionFromRemote","conn","metadata","prepareUtils","sessionStorageKey","humanErrors","humanizeError","mapping","overrideMapping","withTechicalErrorMessage","disconnected","network","default","error","type","humanError","message","makeHumanizeError","getPeerId","setPeerIdToSessionStorage","sessionStorage","getItem","peerId","setItem","makeStoreAccessor","bindConnection","peer","masterPeerId","Promise","res","ee","EventEmitter","wrcRemote","send","payload","console","warning","on","bind","off","createPeerConnectionWithReconnectOnClose","onConnectionOpened","connect","serialization","data","emit","from","makePeerConnection","id","e","log","window","addEventListener","disconnect","connections","Map","wrcMaster","sendTo","get","sendAll","values","forEach","set","delete"],"mappings":"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"}