hsync 0.18.0 → 0.18.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hsync.js +2 -2
- package/dist/hsync.min.js +1 -1
- package/lib/peers.js +15 -3
- package/lib/rtc-node.js +4 -4
- package/lib/rtc-web.js +4 -4
- package/package.json +1 -1
package/dist/hsync.js
CHANGED
|
@@ -55,7 +55,7 @@ eval("const fetch = __webpack_require__(/*! isomorphic-fetch */ \"./node_modules
|
|
|
55
55
|
\**********************/
|
|
56
56
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
57
57
|
|
|
58
|
-
eval("const rawr = __webpack_require__(/*! rawr */ \"./node_modules/rawr/index.js\");\nconst b64id = __webpack_require__(/*! b64id */ \"./node_modules/b64id/index.js\");\nconst debug = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:peers');\nconst EventEmitter = (__webpack_require__(/*! events */ \"./node_modules/events/events.js\").EventEmitter);\nconst buffer = __webpack_require__(/*! buffer */ \"./node_modules/buffer/index.js\");\nconst mqttPacket = __webpack_require__(/*! mqtt-packet-web */ \"./node_modules/mqtt-packet-web/index.js\");\n\nglobalThis.Buffer = buffer.Buffer;\n\nconst { handleSocketPacket } = __webpack_require__(/*! ./socket-map */ \"./lib/socket-map.js\");\nconst fetch = __webpack_require__(/*! ./fetch */ \"./lib/fetch.js\");\n\nconst peers = {};\n\nlet rtc;\n\nfunction setRTC(rtcImpl) {\n rtc = rtcImpl;\n}\n\nfunction createPacket(topic, payload) {\n let payloadStr = payload;\n // console.log('mqttPacket', { topic, payload });\n // if (payload instanceof Uint8Array) {\n // console.log('str payload', new TextDecoder().decode(payload));\n // }\n const packet = mqttPacket.generate({\n qos: 0,\n cmd: 'publish',\n topic,\n payload: payloadStr,\n });\n // console.log('packet', packet);\n return packet;\n}\n\nfunction parsePacket(packet) {\n const parser = mqttPacket.parser();\n return new Promise((resolve, reject) => {\n parser.on('packet', resolve);\n parser.on('error', reject);\n parser.parse(packet);\n });\n}\n\nfunction getRPCPeer(options = {}) {\n const { hostName, temporary, timeout = 10000, hsyncClient } = options;\n let peer = peers[hostName];\n if (!peer) {\n debug('CREATING peer', hostName);\n peer = createRPCPeer({hostName, hsyncClient, timeout});\n if (temporary) {\n peer.rpcTemporary = true;\n }\n peers[hostName] = peer;\n }\n return peer;\n}\n\nfunction createRPCPeer(options = {}) {\n const { hostName, hsyncClient, timeout = 10000, useRTC = true } = options;\n if (!hostName) {\n throw new Error('No hostname specified');\n }\n if (hostName === hsyncClient.myHostName) {\n throw new Error('Peer must be a different host');\n }\n const myAuth = b64id.generateId();\n const transport = new EventEmitter();\n const peer = rawr({transport, methods: Object.assign({}, hsyncClient.peerMethods), timeout, idGenerator: b64id.generateId});\n peer.hostName = hostName;\n peer.rtcEvents = new EventEmitter();\n peer.localMethods = Object.assign({}, hsyncClient.peerMethods);\n peer.sockets = {};\n\n peer.localMethods.rtcSignal = (peerInfo, signal) => {\n debug('rtcSignal', signal.type);\n if (signal.type === 'offer' && !peer.rtcCon && !signal.alreadySent) {\n rtc.answerPeer(peer, signal);\n } else if (signal.type === 'answer') {\n peer.handleRtcAnswer(signal);\n }\n return 'rtcSignal ok';\n }\n\n peer.rtcEvents.on('packet', async (packet) => {\n try {\n const msg = await parsePacket(
|
|
58
|
+
eval("const rawr = __webpack_require__(/*! rawr */ \"./node_modules/rawr/index.js\");\nconst b64id = __webpack_require__(/*! b64id */ \"./node_modules/b64id/index.js\");\nconst debug = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:peers');\nconst EventEmitter = (__webpack_require__(/*! events */ \"./node_modules/events/events.js\").EventEmitter);\nconst buffer = __webpack_require__(/*! buffer */ \"./node_modules/buffer/index.js\");\nconst mqttPacket = __webpack_require__(/*! mqtt-packet-web */ \"./node_modules/mqtt-packet-web/index.js\");\n\nglobalThis.Buffer = buffer.Buffer;\n\nconst { handleSocketPacket } = __webpack_require__(/*! ./socket-map */ \"./lib/socket-map.js\");\nconst fetch = __webpack_require__(/*! ./fetch */ \"./lib/fetch.js\");\n\nconst peers = {};\n\nlet rtc;\n\nfunction setRTC(rtcImpl) {\n rtc = rtcImpl;\n}\n\nfunction createPacket(topic, payload) {\n let payloadStr = payload;\n // console.log('mqttPacket', { topic, payload });\n // if (payload instanceof Uint8Array) {\n // console.log('str payload', new TextDecoder().decode(payload));\n // }\n const packet = mqttPacket.generate({\n qos: 0,\n cmd: 'publish',\n topic,\n payload: payloadStr,\n });\n // console.log('packet', packet);\n return packet;\n}\n\nfunction parsePacket(packet) {\n const parser = mqttPacket.parser();\n return new Promise((resolve, reject) => {\n parser.on('packet', resolve);\n parser.on('error', reject);\n parser.parse(packet);\n });\n}\n\nfunction getRPCPeer(options = {}) {\n const { hostName, temporary, timeout = 10000, hsyncClient } = options;\n let peer = peers[hostName];\n if (!peer) {\n debug('CREATING peer', hostName);\n peer = createRPCPeer({hostName, hsyncClient, timeout});\n if (temporary) {\n peer.rpcTemporary = true;\n }\n peers[hostName] = peer;\n }\n return peer;\n}\n\nfunction createRPCPeer(options = {}) {\n const { hostName, hsyncClient, timeout = 10000, useRTC = true } = options;\n if (!hostName) {\n throw new Error('No hostname specified');\n }\n if (hostName === hsyncClient.myHostName) {\n throw new Error('Peer must be a different host');\n }\n const myAuth = b64id.generateId();\n const transport = new EventEmitter();\n const peer = rawr({transport, methods: Object.assign({}, hsyncClient.peerMethods), timeout, idGenerator: b64id.generateId});\n peer.hostName = hostName;\n peer.rtcEvents = new EventEmitter();\n peer.localMethods = Object.assign({}, hsyncClient.peerMethods);\n peer.sockets = {};\n\n peer.localMethods.rtcSignal = (peerInfo, signal) => {\n debug('rtcSignal', signal.type);\n if (signal.type === 'offer' && !peer.rtcCon && !signal.alreadySent) {\n rtc.answerPeer(peer, signal);\n } else if (signal.type === 'answer') {\n peer.handleRtcAnswer(signal);\n }\n return 'rtcSignal ok';\n }\n\n peer.rtcEvents.on('packet', async (packet) => {\n debug('↓ on packet', packet);\n let toParse = packet;\n try {\n if (packet instanceof Blob) {\n toParse = await packet.arrayBuffer();\n }\n const msg = await parsePacket(toParse);\n const [p1, p2, p3] = msg.topic.split('/');\n if (p1 === 'rpc') {\n transport.receiveData(JSON.parse(msg.payload.toString()));\n } else if (p1 === 'socketData') {\n handleSocketPacket(msg);\n } else if (p1 === 'test') {\n debug('test topic', msg.payload);\n } else {\n debug('other topic', msg.topic);\n }\n } catch (e) {\n debug('bad packet', e, packet);\n }\n });\n\n peer.rtcEvents.on('dcOpen', () => {\n debug('dcOpen');\n peer.packAndSend = (topic, payload) => {\n const packet = createPacket(topic, payload);\n if (topic === 'test') {\n debug('sending test packet', packet);\n }\n peer.rtcSend(packet);\n }\n // firefox is weird about the first bit of data, so send a test packet\n peer.packAndSend('test', 'test');\n });\n\n peer.rtcEvents.on('closed', () => {\n peer.dcOpen = false;\n delete peer.packAndSend;\n debug('rtc closed');\n for (s in peer.sockets) {\n try {\n debug('closing socket', s);\n peer.sockets[s].destroy();\n delete peer.sockets[s];\n } catch (e) {\n debug('error closing socket', e);\n }\n }\n });\n\n peer.rtcEvents.on('disconnected', () => {\n peer.dcOpen = false;\n delete peer.packAndSend;\n debug('rtc disconnected');\n for (s in peer.sockets) {\n try {\n debug('closing socket', s);\n peer.sockets[s].destroy();\n delete peer.sockets[s];\n } catch (e) {\n debug('error closing socket', e);\n }\n }\n });\n\n peer.connectRTC = async () => {\n debug('connectRTC');\n \n return new Promise(async (resolve, reject) => {\n try {\n const offer = await rtc.offerPeer(peer);\n peer.rtcEvents.once('dcOpen', () => {\n debug('dcOpen!');\n resolve(offer);\n });\n } catch (e) {\n reject(e);\n }\n });\n };\n\n transport.send = async (msg) => {\n const fullMsg = {\n msg,\n myAuth,\n toHost: hostName,\n fromHost: hsyncClient.webUrl,\n };\n\n debug('↑ peer rpc', peer.dcOpen ? 'RTC' : 'REST', `${hostName}/_hs/rpc`, msg.method);\n\n if (peer.dcOpen) {\n let payload = msg;\n if (typeof msg === 'object') {\n payload = JSON.stringify(payload);\n }\n const packet = createPacket('rpc', payload);\n peer.rtcSend(packet);\n return;\n }\n\n try {\n debug('fetching', fullMsg, useRTC);\n const result = await fetch.post(`${hostName}/_hs/rpc`, fullMsg);\n debug('fetch result', result);\n if (msg.id) {\n transport.receiveData({id: msg.id, result, jsonrpc: msg.jsonrpc});\n }\n // if (!peer.rtcCon && useRTC) {\n // debug('STARTING rtc creation');\n // rtc.offerPeer(peer);\n // }\n } catch(e) {\n debug('error sending peer RPC request', e);\n transport.receiveData({id: msg.id, error: e, method: msg.method, jsonrpc: msg.jsonrpc});\n }\n \n };\n\n transport.receiveData = (msg) => {\n if(typeof msg === 'string') {\n msg = JSON.parse(msg);\n }\n debug('↓ peer rpc receivedData', msg, msg.params);\n if (msg.params && Array.isArray(msg.params)) {\n debug('unshifting', msg.params);\n msg.params.unshift(peer);\n }\n transport.emit('rpc', msg);\n };\n\n peer.myAuth = myAuth;\n peer.hostName = hostName;\n return peer;\n}\n\nfunction createServerPeer(hsyncClient, methods) {\n const transport = new EventEmitter();\n transport.send = (msg) => {\n if(typeof msg === 'object') {\n msg = JSON.stringify(msg);\n }\n const topic = `srpc/${hsyncClient.myHostName}`;\n debug('↑ server rpc request', msg);\n hsyncClient.mqConn.publish(topic, Buffer.from(msg));\n };\n transport.receiveData = (msg) => {\n if(msg) {\n msg = JSON.parse(msg);\n }\n debug('↓ server rpc reply', msg.method, msg.id);\n transport.emit('rpc', msg);\n };\n const peer = rawr({transport, methods, timeout: 5000});\n return peer;\n}\n\nmodule.exports = {\n createRPCPeer,\n createServerPeer,\n getRPCPeer,\n setRTC,\n};\n\n\n//# sourceURL=webpack://hsync/./lib/peers.js?");
|
|
59
59
|
|
|
60
60
|
/***/ }),
|
|
61
61
|
|
|
@@ -65,7 +65,7 @@ eval("const rawr = __webpack_require__(/*! rawr */ \"./node_modules/rawr/index.j
|
|
|
65
65
|
\************************/
|
|
66
66
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
67
67
|
|
|
68
|
-
eval("const debug = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:rtc-web');\nconst debugError = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('errors');\n\nconst rtc = {\n PeerConnection: RTCPeerConnection,\n};\n\n\nconst defaultOptions = {\n // Recommended for libdatachannel\n // bundlePolicy: \"max-bundle\",\n iceServers: [{ 'urls': 'stun:stun.l.google.com:19302' }] \n};\n\nconst GATHERING_TIMEOUT = 4000;\n\nasync function offerPeer(peer) {\n\n const con = new RTCPeerConnection(defaultOptions);\n // window.rtc = rtc;\n\n peer.rtcCon = con;\n peer.rtcOfferer = true;\n \n let gatheringComplete = false;\n let offerSent = false;\n const start = Date.now();\n\n function sendOffer(alreadySent) {\n debug('send offer', alreadySent);\n const desc = con.localDescription;\n peer.methods.rtcSignal({type: desc.type, sdp: desc.sdp, alreadySent});\n }\n\n con.onicegatheringstatechange = (state) => {\n debug('state change', con.iceGatheringState);\n if (con.iceGatheringState === 'complete') {\n debug('icegathering done', Date.now() - start);\n gatheringComplete = true;\n // We only want to provide an answer once all of our candidates have been added to the SDP.\n sendOffer(offerSent);\n }\n }\n\n con.onicecandidate = (ice) => {\n debug('ice candidate', ice);\n };\n\n con.onconnectionstatechange = (event) => {\n debug('connection state', con.connectionState, event);\n if(con.connectionState === 'connected') {\n peer.connected = true;\n peer.rtcEvents.emit('connected', con);\n }\n };\n\n con.ondatachannel = (event) => {\n debug('dc from answerer', event);\n peer.dc = event.channel;\n };\n\n const dc = con.createDataChannel('from web');\n\n peer.dc = dc;\n dc.onmessage = (event) => { \n debug('dc
|
|
68
|
+
eval("const debug = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:rtc-web');\nconst debugError = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('errors');\n\nconst rtc = {\n PeerConnection: RTCPeerConnection,\n};\n\n\nconst defaultOptions = {\n // Recommended for libdatachannel\n // bundlePolicy: \"max-bundle\",\n iceServers: [{ 'urls': 'stun:stun.l.google.com:19302' }] \n};\n\nconst GATHERING_TIMEOUT = 4000;\n\nasync function offerPeer(peer) {\n\n const con = new RTCPeerConnection(defaultOptions);\n // window.rtc = rtc;\n\n peer.rtcCon = con;\n peer.rtcOfferer = true;\n \n let gatheringComplete = false;\n let offerSent = false;\n const start = Date.now();\n\n function sendOffer(alreadySent) {\n debug('send offer', alreadySent);\n const desc = con.localDescription;\n peer.methods.rtcSignal({type: desc.type, sdp: desc.sdp, alreadySent});\n }\n\n con.onicegatheringstatechange = (state) => {\n debug('state change', con.iceGatheringState);\n if (con.iceGatheringState === 'complete') {\n debug('icegathering done', Date.now() - start);\n gatheringComplete = true;\n // We only want to provide an answer once all of our candidates have been added to the SDP.\n sendOffer(offerSent);\n }\n }\n\n con.onicecandidate = (ice) => {\n debug('ice candidate', ice);\n };\n\n con.onconnectionstatechange = (event) => {\n debug('connection state', con.connectionState, event);\n if(con.connectionState === 'connected') {\n peer.connected = true;\n peer.rtcEvents.emit('connected', con);\n }\n };\n\n con.ondatachannel = (event) => {\n debug('dc from answerer', event);\n peer.dc = event.channel;\n };\n\n const dc = con.createDataChannel('from web');\n\n peer.dc = dc;\n dc.onmessage = (event) => { \n debug('dc.onmessage', event.data);\n peer.rtcEvents.emit('packet', event.data);\n };\n dc.onopen = (event) => { \n peer.dcOpen = true;\n peer.dc = dc;\n peer.rtcSend = (packet) => {\n dc.send(packet);\n };\n peer.rtcEvents.emit('dcOpen', dc);\n // dc.send('yo waddup from the browser');\n };\n\n const offer = await con.createOffer({offerToReceiveAudio:true, offerToReceiveVideo:true});\n await con.setLocalDescription(offer);\n\n setTimeout(() => {\n if (!gatheringComplete) {\n debug('didnt finish gathering');\n sendOffer();\n offerSent = true;\n }\n }, GATHERING_TIMEOUT);\n\n peer.handleRtcAnswer = (answer) => {\n debug('node handleRtcAnswer', answer.sdp.length);\n con.setRemoteDescription(answer);\n return 'web handleRtcAnswer ok';\n }\n}\n\nasync function answerPeer(peer, offer) {\n const options = {...defaultOptions, bundlePolicy: \"max-bundle\"};\n const con = new RTCPeerConnection(options);\n // window.rtc = rtc;\n\n peer.rtcCon = con;\n \n let gatheringComplete = false;\n const start = Date.now();\n\n function sendAnswer() {\n const desc = con.localDescription;\n peer.methods.rtcSignal({type: desc.type, sdp: desc.sdp});\n }\n\n con.onicegatheringstatechange = (state) => {\n if (con.iceGatheringState === 'complete') {\n gatheringComplete = true;\n debug('answerer icegathering done', Date.now() - start);\n sendAnswer();\n }\n }\n await con.setRemoteDescription(offer);\n\n let answer = await con.createAnswer();\n await con.setLocalDescription(answer);\n\n con.onicecandidate = (ice) => {\n debug('ice candidate', ice);\n };\n\n con.onconnectionstatechange = (event) => {\n debug('connection state', con.connectionState, event);\n if(con.connectionState === 'connected') {\n peer.connected = true;\n peer.rtcEvents.emit('connected', con);\n } else if (con.connectionState === 'disconnected') {\n peer.connected = false;\n peer.rtcEvents.emit('disconnected', con);\n peer.rtcCon = null;\n peer.dc = null;\n } else if (con.connectionState === 'closed') {\n peer.connected = false;\n peer.rtcEvents.emit('closed', con);\n peer.rtcCon = null;\n peer.dc = null;\n }\n };\n\n con.ondatachannel = (event) => {\n debug('ondatachannel', event);\n peer.dcOpen = true;\n peer.dc = event.channel;\n peer.rtcSend = (packet) => {\n peer.dc.send(packet);\n };\n peer.rtcEvents.emit('dcOpen', peer.dc);\n peer.dc.onmessage = (event) => {\n peer.rtcEvents.emit('packet', event.data);\n };\n };\n\n setTimeout(() => {\n if (!gatheringComplete) {\n debug('didnt finish gathering');\n sendAnswer();\n }\n }, GATHERING_TIMEOUT);\n\n}\n\n\nrtc.offerPeer = offerPeer;\nrtc.answerPeer = answerPeer;\n\nmodule.exports = rtc;\n\n//# sourceURL=webpack://hsync/./lib/rtc-web.js?");
|
|
69
69
|
|
|
70
70
|
/***/ }),
|
|
71
71
|
|