{"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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"}