hsync 0.23.0 → 0.24.0

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/connection.js CHANGED
@@ -20,8 +20,6 @@ debugError.color = 1;
20
20
 
21
21
  let mqtt;
22
22
 
23
- console.log('connection from hsync');
24
-
25
23
  function setNet(netImpl) {
26
24
  webSetNet(netImpl);
27
25
  listenSetNet(netImpl);
@@ -185,6 +183,7 @@ async function createHsync(config) {
185
183
  const { msg } = requestInfo;
186
184
  debug('peerRpc handler', requestInfo.fromHost, msg.method);
187
185
  const peer = hsyncClient.peers.getRPCPeer({hostName: requestInfo.fromHost, hsyncClient});
186
+ requestInfo.peer = peer;
188
187
  if (!msg.id) {
189
188
  // notification
190
189
  if (Array.isArray(msg.params)) {
package/dist/hsync.js CHANGED
@@ -25,7 +25,7 @@ eval("let process = __webpack_require__.g.process || {env: {}};\n\nconst baseCon
25
25
  \***********************/
26
26
  /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
27
27
 
28
- eval("const EventEmitter = (__webpack_require__(/*! events */ \"./node_modules/events/events.js\").EventEmitter);\nconst debug = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:info');\nconst debugVerbose = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:verbose');\nconst debugError = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:error');\nconst { initPeers } = __webpack_require__(/*! ./lib/peers */ \"./lib/peers.js\");\nconst { createWebHandler, setNet: webSetNet } = __webpack_require__(/*! ./lib/web-handler */ \"./lib/web-handler.js\");\nconst { \n setNet: listenSetNet,\n initListeners,\n} = __webpack_require__(/*! ./lib/socket-listeners */ \"./lib/socket-listeners.js\");\nconst {\n setNet: relaySetNet,\n initRelays,\n} = __webpack_require__(/*! ./lib/socket-relays */ \"./lib/socket-relays.js\");\nconst fetch = __webpack_require__(/*! ./lib/fetch */ \"./lib/fetch.js\");\n\ndebug.color = 3;\ndebugVerbose.color = 2;\ndebugError.color = 1;\n\nlet mqtt;\n\nconsole.log('connection from hsync');\n\nfunction setNet(netImpl) {\n webSetNet(netImpl);\n listenSetNet(netImpl);\n relaySetNet(netImpl);\n}\n\nfunction setMqtt(mqttImpl) {\n mqtt = mqttImpl;\n}\n\nasync function createHsync(config) {\n let {\n hsyncServer,\n hsyncSecret,\n localHost,\n port,\n hsyncBase,\n keepalive,\n dynamicHost,\n listenerLocalPort,\n listenerTargetHost,\n listenerTargetPort,\n relayInboundPort,\n relayTargetHost,\n relayTargetPort,\n } = config;\n\n // console.log('config', config);\n\n let dynamicTimeout;\n\n if (dynamicHost && !hsyncSecret) {\n const result = await fetch.post(`${dynamicHost}/${hsyncBase}/dyn`, {});\n if (dynamicHost.toLowerCase().startsWith('https')) {\n hsyncServer = `wss://${result.url}`;\n } else {\n hsyncServer = `ws://${result.url}`;\n }\n hsyncSecret = result.secret;\n dynamicTimeout = result.timeout;\n }\n\n const hsyncClient = {\n setNet,\n config,\n status: 'connecting',\n };\n\n hsyncClient.peers = initPeers(hsyncClient);\n hsyncClient.listeners = initListeners(hsyncClient);\n hsyncClient.relays = initRelays(hsyncClient);\n\n const events = new EventEmitter();\n \n hsyncClient.on = events.on.bind(events);\n hsyncClient.emit = events.emit.bind(events);\n hsyncClient.removeListener = events.removeListener.bind(events);\n hsyncClient.removeAllListeners = events.removeAllListeners.bind(events);\n \n let lastConnect;\n const hsu = new URL(hsyncServer.toLowerCase());\n // console.log(hsu);\n let protocol = hsu.protocol;\n if (hsu.protocol === 'https:') {\n protocol = 'wss:';\n } else if (hsu.protocol === 'http:') {\n protocol = 'ws:';\n }\n const connectURL = `${protocol}//${hsu.hostname}${hsu.port ? `:${hsu.port}` : ''}/${hsyncBase}`;\n // const connectURL = `${hsyncServer}${hsyncServer.endsWith('/') ? '' : '/'}${hsyncBase}`;\n // console.log('connectURL', connectURL);\n const myHostName = hsu.hostname;\n hsyncClient.myHostName = myHostName;\n \n debug('connecting to', connectURL, '…' );\n const mqConn = mqtt.connect(connectURL, { password: hsyncSecret, username: myHostName, keepalive });\n mqConn.myHostName = myHostName;\n hsyncClient.mqConn = mqConn;\n\n const webHandler = config.webHandler || createWebHandler({myHostName, localHost, port, mqConn});\n hsyncClient.webHandler = webHandler;\n\n mqConn.on('connect', () => {\n const now = Date.now();\n debug('connected to', myHostName, lastConnect ? (now - lastConnect) : '', lastConnect ? 'since last connect' : '');\n lastConnect = now;\n hsyncClient.emit('connected', config);\n hsyncClient.status = 'connected';\n });\n\n mqConn.on('error', (error) => {\n debugError('error on mqConn', myHostName, error.code, error);\n if ((error.code === 4) || (error.code === 5)) {\n debug('ending');\n mqConn.end();\n // if (globalThis.process) {\n // process.exit(1);\n // }\n hsyncClient.emit('connect_error', error);\n }\n });\n\n mqConn.on('message', (topic, message) => {\n if (!topic) {\n return;\n }\n // message is Buffer\n const [name, hostName, segment3, action, segment5] = topic.split('/');\n debugVerbose('\\n↓ MQTT' , topic);\n if (name === 'web') {\n webHandler.handleWebRequest(hostName, segment3, action, message);\n return;\n } else if (name === 'msg') {\n const from = segment3;\n if (action === 'json') {\n try {\n const msg = JSON.parse(message.toString());\n msg.from = from;\n hsyncClient.emit('json', msg);\n } catch (e) {\n debugError('error parsing json message');\n }\n }\n else if (!action && (segment3 === 'srpc')) {\n hsyncClient.serverPeer.transport.receiveData(message.toString());\n }\n }\n\n });\n\n function endClient(force, callback) {\n if (force) {\n mqConn.end(force);\n hsyncClient.status = 'disconnected';\n if (webHandler.end) {\n webHandler.end();\n }\n return;\n }\n mqConn.end(force, (a, b) => {\n hsyncClient.status = 'disconnected';\n if (webHandler.end) {\n webHandler.end();\n }\n if (callback) {\n callback(a, b);\n }\n })\n }\n\n const serverReplyMethods = {\n ping: (greeting) => {\n return `${greeting} back atcha from client. ${Date.now()}`;\n },\n addSocketListener: hsyncClient.addSocketListener,\n getSocketListeners: hsyncClient.getSocketListeners,\n addSocketRelay: hsyncClient.addSocketRelay,\n getSocketRelays: hsyncClient.getSocketRelays,\n peerRpc: async (requestInfo) => {\n requestInfo.hsyncClient = hsyncClient;\n const { msg } = requestInfo;\n debug('peerRpc handler', requestInfo.fromHost, msg.method);\n const peer = hsyncClient.peers.getRPCPeer({hostName: requestInfo.fromHost, hsyncClient});\n if (!msg.id) {\n // notification\n if (Array.isArray(msg.params)) {\n msg.params.unshift(peer);\n }\n peer.transport.emit('rpc', msg);\n return { result: {}, id: msg.id};\n }\n const reply = {id: msg.id, jsonrpc:'2.0'};\n try {\n if (!peer.localMethods[msg.method]) {\n const notFoundError = new Error('method not found');\n notFoundError.code = -32601;\n throw notFoundError;\n }\n const result = await peer.localMethods[msg.method](requestInfo, ...msg.params);\n reply.result = result;\n return result;\n } catch (e) {\n debug('peer rpc error', e, msg);\n reply.error = {\n code: e.code || 500,\n message: e.toString(),\n };\n return reply;\n }\n }\n };\n\n const peerMethods = {\n ping: (remotePeer, greeting) => {\n debug('ping called', remotePeer.hostName, greeting);\n return `${greeting} back atcha, ${remotePeer.hostName}.`;\n },\n validatePeer: (remotePeer, secret) => {\n return hsyncClient.getPeer(remotePeer.hostName).myAuth === secret;\n },\n connectSocket: hsyncClient.connectSocket,\n // closeListenerSocket: hsyncClient.closeListenerSocket,\n // closeRelaySocket: hsyncClient.closeRelaySocket,\n // receiveListenerData: hsyncClient.receiveListenerData,\n // receiveRelayData: hsyncClient.receiveRelayData,\n };\n\n hsyncClient.serverPeer = hsyncClient.peers.createServerPeer(hsyncClient, serverReplyMethods);\n hsyncClient.serverPeer.notifications.onexternal_message((msg) => {\n hsyncClient.emit('external_message', msg);\n });\n hsyncClient.getPeer = (hostName) => {\n return hsyncClient.peers.getRPCPeer({ hostName });\n };\n hsyncClient.hsyncBase = hsyncBase;\n hsyncClient.endClient = endClient;\n hsyncClient.serverReplyMethods = serverReplyMethods;\n hsyncClient.getRPCPeer = hsyncClient.peers.getRPCPeer;\n hsyncClient.peerMethods = peerMethods;\n hsyncClient.hsyncSecret = hsyncSecret;\n hsyncClient.hsyncServer = hsyncServer;\n hsyncClient.dynamicTimeout = dynamicTimeout;\n // const { host, protocol } = new URL(hsyncServer);\n if (hsu.protocol === 'wss:') {\n hsyncClient.webUrl = `https://${hsu.host}`;\n } else if (hsu.protocol === 'ws:') {\n hsyncClient.webUrl = `http://${hsu.host}`;\n } else {\n hsyncClient.webUrl = hsyncServer;\n }\n \n debug('URL', hsu.host, hsu.protocol, hsyncClient.webUrl);\n hsyncClient.webAdmin = `${hsyncClient.webUrl}/${hsyncBase}/admin`;\n hsyncClient.webBase = `${hsyncClient.webUrl}/${hsyncBase}`;\n hsyncClient.port = port;\n\n if (listenerLocalPort) {\n listenerLocalPort.forEach((llp, i) => {\n let lth = listenerTargetHost ? listenerTargetHost[i] || listenerTargetHost[0] : null;\n if (lth) {\n if (lth.endsWith('/')) {\n lth = lth.substring(0, lth.length - 1);\n }\n const ltp = listenerTargetPort ? listenerTargetPort[i] : llp;\n hsyncClient.addSocketListener({ port: llp, targetPort: ltp, targetHost: lth });\n debug('relaying local', llp, 'to', lth, ltp);\n }\n });\n }\n\n if (relayInboundPort) {\n relayInboundPort.forEach((rip, i) => {\n debug('relayInboundPort', rip, i, relayTargetHost);\n const firstRth = relayTargetHost ? relayTargetHost[0] : null;\n const rth = relayTargetHost ? relayTargetHost[i] : firstRth || 'localhost';\n if (rth) {\n if (rth.endsWith('/')) {\n rth = rth.substring(0, rth.length - 1);\n }\n const rtp = relayTargetPort ? relayTargetPort[i] : rip;\n hsyncClient.addSocketRelay({ port: rip, targetHost: rth, targetPort: rtp });\n debug('relaying inbound', rip, 'to', rth, rtp);\n }\n });\n }\n\n return hsyncClient;\n}\n\nmodule.exports = {\n createHsync,\n setNet,\n setMqtt,\n};\n\n\n//# sourceURL=webpack://hsync/./connection.js?");
28
+ eval("const EventEmitter = (__webpack_require__(/*! events */ \"./node_modules/events/events.js\").EventEmitter);\nconst debug = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:info');\nconst debugVerbose = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:verbose');\nconst debugError = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:error');\nconst { initPeers } = __webpack_require__(/*! ./lib/peers */ \"./lib/peers.js\");\nconst { createWebHandler, setNet: webSetNet } = __webpack_require__(/*! ./lib/web-handler */ \"./lib/web-handler.js\");\nconst { \n setNet: listenSetNet,\n initListeners,\n} = __webpack_require__(/*! ./lib/socket-listeners */ \"./lib/socket-listeners.js\");\nconst {\n setNet: relaySetNet,\n initRelays,\n} = __webpack_require__(/*! ./lib/socket-relays */ \"./lib/socket-relays.js\");\nconst fetch = __webpack_require__(/*! ./lib/fetch */ \"./lib/fetch.js\");\n\ndebug.color = 3;\ndebugVerbose.color = 2;\ndebugError.color = 1;\n\nlet mqtt;\n\nfunction setNet(netImpl) {\n webSetNet(netImpl);\n listenSetNet(netImpl);\n relaySetNet(netImpl);\n}\n\nfunction setMqtt(mqttImpl) {\n mqtt = mqttImpl;\n}\n\nasync function createHsync(config) {\n let {\n hsyncServer,\n hsyncSecret,\n localHost,\n port,\n hsyncBase,\n keepalive,\n dynamicHost,\n listenerLocalPort,\n listenerTargetHost,\n listenerTargetPort,\n relayInboundPort,\n relayTargetHost,\n relayTargetPort,\n } = config;\n\n // console.log('config', config);\n\n let dynamicTimeout;\n\n if (dynamicHost && !hsyncSecret) {\n const result = await fetch.post(`${dynamicHost}/${hsyncBase}/dyn`, {});\n if (dynamicHost.toLowerCase().startsWith('https')) {\n hsyncServer = `wss://${result.url}`;\n } else {\n hsyncServer = `ws://${result.url}`;\n }\n hsyncSecret = result.secret;\n dynamicTimeout = result.timeout;\n }\n\n const hsyncClient = {\n setNet,\n config,\n status: 'connecting',\n };\n\n hsyncClient.peers = initPeers(hsyncClient);\n hsyncClient.listeners = initListeners(hsyncClient);\n hsyncClient.relays = initRelays(hsyncClient);\n\n const events = new EventEmitter();\n \n hsyncClient.on = events.on.bind(events);\n hsyncClient.emit = events.emit.bind(events);\n hsyncClient.removeListener = events.removeListener.bind(events);\n hsyncClient.removeAllListeners = events.removeAllListeners.bind(events);\n \n let lastConnect;\n const hsu = new URL(hsyncServer.toLowerCase());\n // console.log(hsu);\n let protocol = hsu.protocol;\n if (hsu.protocol === 'https:') {\n protocol = 'wss:';\n } else if (hsu.protocol === 'http:') {\n protocol = 'ws:';\n }\n const connectURL = `${protocol}//${hsu.hostname}${hsu.port ? `:${hsu.port}` : ''}/${hsyncBase}`;\n // const connectURL = `${hsyncServer}${hsyncServer.endsWith('/') ? '' : '/'}${hsyncBase}`;\n // console.log('connectURL', connectURL);\n const myHostName = hsu.hostname;\n hsyncClient.myHostName = myHostName;\n \n debug('connecting to', connectURL, '…' );\n const mqConn = mqtt.connect(connectURL, { password: hsyncSecret, username: myHostName, keepalive });\n mqConn.myHostName = myHostName;\n hsyncClient.mqConn = mqConn;\n\n const webHandler = config.webHandler || createWebHandler({myHostName, localHost, port, mqConn});\n hsyncClient.webHandler = webHandler;\n\n mqConn.on('connect', () => {\n const now = Date.now();\n debug('connected to', myHostName, lastConnect ? (now - lastConnect) : '', lastConnect ? 'since last connect' : '');\n lastConnect = now;\n hsyncClient.emit('connected', config);\n hsyncClient.status = 'connected';\n });\n\n mqConn.on('error', (error) => {\n debugError('error on mqConn', myHostName, error.code, error);\n if ((error.code === 4) || (error.code === 5)) {\n debug('ending');\n mqConn.end();\n // if (globalThis.process) {\n // process.exit(1);\n // }\n hsyncClient.emit('connect_error', error);\n }\n });\n\n mqConn.on('message', (topic, message) => {\n if (!topic) {\n return;\n }\n // message is Buffer\n const [name, hostName, segment3, action, segment5] = topic.split('/');\n debugVerbose('\\n↓ MQTT' , topic);\n if (name === 'web') {\n webHandler.handleWebRequest(hostName, segment3, action, message);\n return;\n } else if (name === 'msg') {\n const from = segment3;\n if (action === 'json') {\n try {\n const msg = JSON.parse(message.toString());\n msg.from = from;\n hsyncClient.emit('json', msg);\n } catch (e) {\n debugError('error parsing json message');\n }\n }\n else if (!action && (segment3 === 'srpc')) {\n hsyncClient.serverPeer.transport.receiveData(message.toString());\n }\n }\n\n });\n\n function endClient(force, callback) {\n if (force) {\n mqConn.end(force);\n hsyncClient.status = 'disconnected';\n if (webHandler.end) {\n webHandler.end();\n }\n return;\n }\n mqConn.end(force, (a, b) => {\n hsyncClient.status = 'disconnected';\n if (webHandler.end) {\n webHandler.end();\n }\n if (callback) {\n callback(a, b);\n }\n })\n }\n\n const serverReplyMethods = {\n ping: (greeting) => {\n return `${greeting} back atcha from client. ${Date.now()}`;\n },\n addSocketListener: hsyncClient.addSocketListener,\n getSocketListeners: hsyncClient.getSocketListeners,\n addSocketRelay: hsyncClient.addSocketRelay,\n getSocketRelays: hsyncClient.getSocketRelays,\n peerRpc: async (requestInfo) => {\n requestInfo.hsyncClient = hsyncClient;\n const { msg } = requestInfo;\n debug('peerRpc handler', requestInfo.fromHost, msg.method);\n const peer = hsyncClient.peers.getRPCPeer({hostName: requestInfo.fromHost, hsyncClient});\n requestInfo.peer = peer;\n if (!msg.id) {\n // notification\n if (Array.isArray(msg.params)) {\n msg.params.unshift(peer);\n }\n peer.transport.emit('rpc', msg);\n return { result: {}, id: msg.id};\n }\n const reply = {id: msg.id, jsonrpc:'2.0'};\n try {\n if (!peer.localMethods[msg.method]) {\n const notFoundError = new Error('method not found');\n notFoundError.code = -32601;\n throw notFoundError;\n }\n const result = await peer.localMethods[msg.method](requestInfo, ...msg.params);\n reply.result = result;\n return result;\n } catch (e) {\n debug('peer rpc error', e, msg);\n reply.error = {\n code: e.code || 500,\n message: e.toString(),\n };\n return reply;\n }\n }\n };\n\n const peerMethods = {\n ping: (remotePeer, greeting) => {\n debug('ping called', remotePeer.hostName, greeting);\n return `${greeting} back atcha, ${remotePeer.hostName}.`;\n },\n validatePeer: (remotePeer, secret) => {\n return hsyncClient.getPeer(remotePeer.hostName).myAuth === secret;\n },\n connectSocket: hsyncClient.connectSocket,\n // closeListenerSocket: hsyncClient.closeListenerSocket,\n // closeRelaySocket: hsyncClient.closeRelaySocket,\n // receiveListenerData: hsyncClient.receiveListenerData,\n // receiveRelayData: hsyncClient.receiveRelayData,\n };\n\n hsyncClient.serverPeer = hsyncClient.peers.createServerPeer(hsyncClient, serverReplyMethods);\n hsyncClient.serverPeer.notifications.onexternal_message((msg) => {\n hsyncClient.emit('external_message', msg);\n });\n hsyncClient.getPeer = (hostName) => {\n return hsyncClient.peers.getRPCPeer({ hostName });\n };\n hsyncClient.hsyncBase = hsyncBase;\n hsyncClient.endClient = endClient;\n hsyncClient.serverReplyMethods = serverReplyMethods;\n hsyncClient.getRPCPeer = hsyncClient.peers.getRPCPeer;\n hsyncClient.peerMethods = peerMethods;\n hsyncClient.hsyncSecret = hsyncSecret;\n hsyncClient.hsyncServer = hsyncServer;\n hsyncClient.dynamicTimeout = dynamicTimeout;\n // const { host, protocol } = new URL(hsyncServer);\n if (hsu.protocol === 'wss:') {\n hsyncClient.webUrl = `https://${hsu.host}`;\n } else if (hsu.protocol === 'ws:') {\n hsyncClient.webUrl = `http://${hsu.host}`;\n } else {\n hsyncClient.webUrl = hsyncServer;\n }\n \n debug('URL', hsu.host, hsu.protocol, hsyncClient.webUrl);\n hsyncClient.webAdmin = `${hsyncClient.webUrl}/${hsyncBase}/admin`;\n hsyncClient.webBase = `${hsyncClient.webUrl}/${hsyncBase}`;\n hsyncClient.port = port;\n\n if (listenerLocalPort) {\n listenerLocalPort.forEach((llp, i) => {\n let lth = listenerTargetHost ? listenerTargetHost[i] || listenerTargetHost[0] : null;\n if (lth) {\n if (lth.endsWith('/')) {\n lth = lth.substring(0, lth.length - 1);\n }\n const ltp = listenerTargetPort ? listenerTargetPort[i] : llp;\n hsyncClient.addSocketListener({ port: llp, targetPort: ltp, targetHost: lth });\n debug('relaying local', llp, 'to', lth, ltp);\n }\n });\n }\n\n if (relayInboundPort) {\n relayInboundPort.forEach((rip, i) => {\n debug('relayInboundPort', rip, i, relayTargetHost);\n const firstRth = relayTargetHost ? relayTargetHost[0] : null;\n const rth = relayTargetHost ? relayTargetHost[i] : firstRth || 'localhost';\n if (rth) {\n if (rth.endsWith('/')) {\n rth = rth.substring(0, rth.length - 1);\n }\n const rtp = relayTargetPort ? relayTargetPort[i] : rip;\n hsyncClient.addSocketRelay({ port: rip, targetHost: rth, targetPort: rtp });\n debug('relaying inbound', rip, 'to', rth, rtp);\n }\n });\n }\n\n return hsyncClient;\n}\n\nmodule.exports = {\n createHsync,\n setNet,\n setMqtt,\n};\n\n\n//# sourceURL=webpack://hsync/./connection.js?");
29
29
 
30
30
  /***/ }),
31
31
 
@@ -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\nfunction createPacket(topic, payload) {\n let payloadStr = payload;\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\n\nlet rtc;\n\nfunction setRTC(rtcImpl) {\n rtc = rtcImpl;\n}\n\nfunction initPeers(hsyncClient) {\n const cachedPeers = {};\n function getRPCPeer(options = {}) {\n const { hostName, temporary, timeout = 10000, hsyncClient } = options;\n let peer = cachedPeers[hostName];\n if (!peer) {\n debug('CREATING peer', hostName);\n peer = createRPCPeer({hostName, hsyncClient, timeout});\n peer.myAuth = b64id.generateId();\n if (temporary) {\n peer.rpcTemporary = true;\n }\n cachedPeers[hostName] = peer;\n }\n return peer;\n }\n \n function createRPCPeer(options = {}) {\n const { hostName, 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 peer.rtcStatus = 'connecting';\n rtc.answerPeer(peer, signal);\n } else if (signal.type === 'answer') {\n peer.handleRtcAnswer(signal);\n }\n return `rtcSignal ${signal.type} handled 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 const rpcMsg = JSON.parse(msg.payload.toString());\n debug('↓ peer RTC rpc', rpcMsg);\n // if (rpcMsg.method) {\n transport.receiveData(rpcMsg);\n // return;\n // }\n } else if (p1 === 'jsonMsg') {\n try {\n const jsonMsg = JSON.parse(msg.payload.toString());\n peer.rtcEvents.emit('jsonMsg', jsonMsg);\n } catch (e) {\n debug('error parsing jsonMsg', e);\n }\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(peer.answerer ? 'answerer' : 'offerer', '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 peer.rtcStatus = 'connecting';\n peer.rtcEvents.emit('connecting');\n return new Promise(async (resolve, reject) => {\n try {\n const offer = await rtc.offerPeer(peer);\n debug('offer', offer);\n peer.rtcEvents.once('dcOpen', () => {\n peer.rtcStatus = 'connected';\n debug('offerer dcOpen!');\n resolve(offer);\n });\n } catch (e) {\n debug('error connecting to rtc', e);\n peer.rtcStatus = 'error';\n reject(e);\n }\n });\n };\n\n peer.sendJSONMsg = (msg) => {\n if (typeof msg !== 'object') {\n throw new Error('sendJSONMsg requires an object');\n }\n if (!peer.packAndSend) {\n throw new Error('peer not connected');\n }\n const payload = JSON.stringify(msg);\n peer.packAndSend('jsonMsg', payload);\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 const path = `${hostName}/_hs/rpc`;\n debug('fetching', path, fullMsg, useRTC);\n const result = await fetch.post(path, fullMsg);\n debug('fetch result', result);\n if (msg.id) {\n transport.receiveData({id: msg.id, result, jsonrpc: msg.jsonrpc});\n }\n } catch(e) {\n debug('error sending peer RPC request', e);\n if (msg.id) { // only send error if it's a request, not a notification\n transport.receiveData({\n id: msg.id,\n error: e.message,\n method: msg.method,\n jsonrpc: msg.jsonrpc\n });\n }\n }\n \n };\n \n transport.receiveData = (msg) => {\n debug('↓ transport.receiveData', msg);\n if(typeof msg === 'string') {\n msg = JSON.parse(msg);\n }\n debug('↓ peer rpc receivedData', msg);\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 // debug('transport emitted', msg);\n };\n \n peer.myAuth = myAuth;\n peer.hostName = hostName;\n return peer;\n }\n \n function 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 outbound', 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 inbound', msg);\n transport.emit('rpc', msg);\n };\n const peer = rawr({transport, methods, timeout: 5000});\n return peer;\n }\n\n hsyncClient.cachedPeers = cachedPeers;\n hsyncClient.getRPCPeer = getRPCPeer;\n hsyncClient.createServerPeer = createServerPeer;\n\n return {\n getRPCPeer,\n createRPCPeer,\n createServerPeer,\n };\n}\n\nmodule.exports = {\n initPeers,\n setRTC,\n};\n\n\n//# sourceURL=webpack://hsync/./lib/peers.js?");
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\nfunction createPacket(topic, payload) {\n let payloadStr = payload;\n const packet = mqttPacket.generate({\n qos: 0,\n cmd: 'publish',\n topic,\n payload: payloadStr,\n });\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\n\nlet rtc;\n\nfunction setRTC(rtcImpl) {\n rtc = rtcImpl;\n}\n\nfunction initPeers(hsyncClient) {\n const cachedPeers = {};\n function getRPCPeer(options = {}) {\n const { hostName, temporary, timeout = 10000, hsyncClient } = options;\n let peer = cachedPeers[hostName];\n if (!peer) {\n debug('CREATING peer', hostName);\n peer = createRPCPeer({hostName, hsyncClient, timeout});\n peer.myAuth = b64id.generateId();\n if (temporary) {\n peer.rpcTemporary = true;\n }\n cachedPeers[hostName] = peer;\n }\n return peer;\n }\n \n function createRPCPeer(options = {}) {\n const { hostName, 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 debug('createRPCPeer rawr', peer);\n \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 peer.rtcStatus = 'connecting';\n rtc.answerPeer(peer, signal);\n } else if (signal.type === 'answer') {\n peer.handleRtcAnswer(signal);\n }\n return `rtcSignal ${signal.type} handled 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 const rpcMsg = JSON.parse(msg.payload.toString());\n debug('↓ peer RTC rpc', rpcMsg);\n // if (rpcMsg.method) {\n transport.receiveData(rpcMsg);\n // return;\n // }\n } else if (p1 === 'jsonMsg') {\n try {\n const jsonMsg = JSON.parse(msg.payload.toString());\n peer.rtcEvents.emit('jsonMsg', jsonMsg);\n } catch (e) {\n debug('error parsing jsonMsg', e);\n }\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(peer.answerer ? 'answerer' : 'offerer', '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 peer.rtcStatus = 'connecting';\n peer.rtcEvents.emit('connecting');\n return new Promise(async (resolve, reject) => {\n try {\n const offer = await rtc.offerPeer(peer);\n debug('offer', offer);\n peer.rtcEvents.once('dcOpen', () => {\n peer.rtcStatus = 'connected';\n debug('offerer dcOpen!');\n resolve(offer);\n });\n } catch (e) {\n debug('error connecting to rtc', e);\n peer.rtcStatus = 'error';\n reject(e);\n }\n });\n };\n\n peer.sendJSONMsg = (msg) => {\n if (typeof msg !== 'object') {\n throw new Error('sendJSONMsg requires an object');\n }\n if (!peer.packAndSend) {\n throw new Error('peer not connected');\n }\n const payload = JSON.stringify(msg);\n peer.packAndSend('jsonMsg', payload);\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 const path = `${hostName}/_hs/rpc`;\n debug('fetching', path, fullMsg, useRTC);\n const result = await fetch.post(path, fullMsg);\n debug('fetch result', result);\n if (msg.id) {\n transport.receiveData({id: msg.id, result, jsonrpc: msg.jsonrpc});\n }\n } catch(e) {\n debug('error sending peer RPC request', e);\n if (msg.id) { // only send error if it's a request, not a notification\n transport.receiveData({\n id: msg.id,\n error: e.message,\n method: msg.method,\n jsonrpc: msg.jsonrpc\n });\n }\n }\n \n };\n \n transport.receiveData = (msg) => {\n debug('↓ transport.receiveData', msg);\n if(typeof msg === 'string') {\n msg = JSON.parse(msg);\n }\n debug('↓ peer rpc receivedData', msg);\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 // debug('transport emitted', msg);\n };\n \n peer.myAuth = myAuth;\n peer.hostName = hostName;\n return peer;\n }\n \n function 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 outbound', 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 inbound', msg);\n transport.emit('rpc', msg);\n };\n const peer = rawr({transport, methods, timeout: 5000});\n return peer;\n }\n\n hsyncClient.cachedPeers = cachedPeers;\n hsyncClient.getRPCPeer = getRPCPeer;\n hsyncClient.createServerPeer = createServerPeer;\n\n return {\n getRPCPeer,\n createRPCPeer,\n createServerPeer,\n };\n}\n\nmodule.exports = {\n initPeers,\n setRTC,\n};\n\n\n//# sourceURL=webpack://hsync/./lib/peers.js?");
59
59
 
60
60
  /***/ }),
61
61
 
@@ -75,7 +75,7 @@ eval("const debug = __webpack_require__(/*! debug */ \"./node_modules/debug/src/
75
75
  \*********************************/
76
76
  /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
77
77
 
78
- eval("const b64id = __webpack_require__(/*! b64id */ \"./node_modules/b64id/index.js\");\nconst debug = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:listener');\nconst debugError = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:error');\n\nconst { sockets } = __webpack_require__(/*! ./socket-map */ \"./lib/socket-map.js\");\n\nlet net;\n\nfunction setNet(netImpl) {\n net = netImpl;\n}\n\ndebugError.color = 1;\n\nfunction initListeners(hsyncClient) {\n const socketListeners = {};\n\n function getSocketListeners() {\n const hKeys = Object.keys(socketListeners);\n debug('getSocketListeners', hKeys);\n let retVal = hKeys.map((hk) => {\n const l = socketListeners[hk];\n return {\n port: l.port,\n targetHost: l.targetHost,\n targetPort: l.targetPort,\n };\n });\n return retVal;\n }\n\n function addSocketListener(options = {}) {\n const { port, targetPort, targetHost } = options;\n debug('creating handler', port, targetHost);\n \n const rpcPeer = hsyncClient.getRPCPeer({ hostName: targetHost });\n\n const socketServer = net.createServer(async (socket) => {\n\n if (!rpcPeer.rtcCon) {\n try {\n debug('initiating connectRTC from socket listener');\n await rpcPeer.connectRTC();\n } catch (e) {\n debug('error connecting to rtc', e);\n socket.end();\n return;\n }\n }\n\n rpcPeer.notifications.oncloseListenerSocket((remotePeer, { socketId }) => {\n debug('closeListenerSocket', socketId, !!sockets[socketId]);\n if (sockets[socketId]) {\n sockets[socketId].end();\n delete sockets[socketId];\n return 'closeListenerSocket ok';\n }\n return `closeListenerSocket no matching socket for ${socketId}`;\n });\n\n socket.socketId = b64id.generateId();\n sockets[socket.socketId] = socket;\n rpcPeer.sockets[socket.socketId] = socket;\n socket.listenerSocket = true;\n debug('connected to local listener', port, socket.socketId);\n socket.peerConnected = false;\n // const pubTopic = `msg/${hostName}/${hsyncClient.myHostName}/socketData/${socket.socketId}`;\n // const closeTopic = `msg/${hostName}/${hsyncClient.myHostName}/socketClose/${socket.socketId}`;\n const dataQueue = [];\n\n async function sendData(data) {\n // TODO queue data if not connected\n if (rpcPeer.packAndSend) {\n debug('sending data via rtc', targetHost, socket.socketId, data.length);\n rpcPeer.packAndSend(`socketData/${socket.socketId}`, data);\n return;\n }\n // debug('sending data via rpc', targetHost, data.length);\n // // hsyncClient.mqConn.publish(pubTopic, data);\n // const result = await rpcPeer.methods.receiveListenerData({\n // socketId: socket.socketId,\n // data: Buffer.from(data).toString('base64'),\n // });\n // debug('sendData from Listener', result);\n }\n\n socket.on('data', async (data) => {\n debug('socket data', data ? data.length : '');\n // if (!socket.peerConnected) {\n // dataQueue.push(data);\n // return;\n // }\n sendData(data);\n });\n \n socket.on('close', (a, b, c) => {\n debug('listener socket closed', port, socket.socketId, a, b, c);\n if (sockets[socket.socketId]) {\n delete sockets[socket.socketId];\n try {\n rpcPeer.notifiers.closeRelaySocket({\n socketId: socket.socketId,\n });\n } catch (e) {\n debug('error closing relay socket', e);\n }\n }\n });\n \n socket.on('error', (error) => {\n debug('socket error', targetHost, socket.socketId, error);\n if (sockets[socket.socketId]) {\n delete sockets[socket.socketId];\n }\n });\n \n try {\n debug('connecting remotely', socket.socketId, targetPort, rpcPeer.hostName, targetHost);\n const result = await rpcPeer.methods.connectSocket({\n socketId: socket.socketId,\n port: targetPort,\n hostName: rpcPeer.hostName,\n });\n debug('connect result', result);\n socket.peerConnected = true;\n dataQueue.forEach(sendData); \n } catch (e) {\n debugError('cant connect remotely', targetHost, targetPort, e);\n if (sockets[socket.socketId]) {\n delete sockets[socket.socketId];\n }\n socket.end();\n }\n });\n\n socketServer.listen(port);\n\n function end() {\n const sockKeys = Object.keys(sockets);\n sockKeys.forEach((sk) => {\n try {\n if (sockets[sk].listenerSocket) {\n sockets[sk].end();\n delete sockets[sk];\n }\n }\n catch(e) {\n debug('error closing socket', e);\n }\n });\n }\n\n const listener = {\n socketServer,\n sockets,\n end,\n targetHost,\n targetPort,\n port,\n };\n\n socketListeners['p' + port] = listener;\n return listener;\n }\n\n hsyncClient.socketListeners = socketListeners;\n hsyncClient.addSocketListener = addSocketListener;\n // hsyncClient.receiveRelayData = receiveRelayData;\n hsyncClient.getSocketListeners = getSocketListeners;\n // hsyncClient.closeListenerSocket = closeListenerSocket;\n\n return {\n addSocketListener,\n // receiveRelayData,\n getSocketListeners,\n };\n}\n\nmodule.exports = { \n initListeners,\n setNet,\n};\n\n//# sourceURL=webpack://hsync/./lib/socket-listeners.js?");
78
+ eval("const b64id = __webpack_require__(/*! b64id */ \"./node_modules/b64id/index.js\");\nconst debug = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:listener');\nconst debugError = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:error');\n\nconst { sockets } = __webpack_require__(/*! ./socket-map */ \"./lib/socket-map.js\");\n\nlet net;\n\nfunction setNet(netImpl) {\n net = netImpl;\n}\n\ndebugError.color = 1;\n\nfunction initListeners(hsyncClient) {\n const socketListeners = {};\n\n function getSocketListeners() {\n const hKeys = Object.keys(socketListeners);\n debug('getSocketListeners', hKeys);\n let retVal = hKeys.map((hk) => {\n const l = socketListeners[hk];\n return {\n port: l.port,\n targetHost: l.targetHost,\n targetPort: l.targetPort,\n };\n });\n return retVal;\n }\n\n function addSocketListener(options = {}) {\n const { port, targetPort, targetHost } = options;\n if (!targetHost) {\n throw new Error('no targetHost');\n }\n let cleanHost = targetHost.trim();\n if (cleanHost.endsWith('/')) {\n cleanHost = cleanHost.substring(0, cleanHost.length - 1);\n }\n const url = new URL(cleanHost);\n if (url.hostname.toLowerCase() === hsyncClient.myHostName.toLowerCase()) {\n throw new Error('targetHost must be a different host');\n }\n debug('creating handler', port, cleanHost);\n if (cleanHost !== targetHost) {\n debug('targetHost cleaned UP', targetHost, cleanHost);\n }\n \n const rpcPeer = hsyncClient.getRPCPeer({ hostName: cleanHost });\n\n const socketServer = net.createServer(async (socket) => {\n\n if (!rpcPeer.rtcCon) {\n try {\n debug('initiating connectRTC from socket listener');\n await rpcPeer.connectRTC();\n } catch (e) {\n debug('error connecting to rtc', e);\n socket.end();\n return;\n }\n }\n\n rpcPeer.notifications.oncloseListenerSocket((remotePeer, { socketId }) => {\n debug('closeListenerSocket', socketId, !!sockets[socketId]);\n if (sockets[socketId]) {\n sockets[socketId].end();\n delete sockets[socketId];\n return 'closeListenerSocket ok';\n }\n return `closeListenerSocket no matching socket for ${socketId}`;\n });\n\n socket.socketId = b64id.generateId();\n sockets[socket.socketId] = socket;\n rpcPeer.sockets[socket.socketId] = socket;\n socket.listenerSocket = true;\n debug('connected to local listener', port, socket.socketId);\n socket.peerConnected = false;\n // const pubTopic = `msg/${hostName}/${hsyncClient.myHostName}/socketData/${socket.socketId}`;\n // const closeTopic = `msg/${hostName}/${hsyncClient.myHostName}/socketClose/${socket.socketId}`;\n const dataQueue = [];\n\n async function sendData(data) {\n // TODO queue data if not connected\n if (rpcPeer.packAndSend) {\n debug('sending data via rtc', targetHost, socket.socketId, data.length);\n rpcPeer.packAndSend(`socketData/${socket.socketId}`, data);\n return;\n }\n // debug('sending data via rpc', targetHost, data.length);\n // // hsyncClient.mqConn.publish(pubTopic, data);\n // const result = await rpcPeer.methods.receiveListenerData({\n // socketId: socket.socketId,\n // data: Buffer.from(data).toString('base64'),\n // });\n // debug('sendData from Listener', result);\n }\n\n socket.on('data', async (data) => {\n debug('socket data', data ? data.length : '');\n // if (!socket.peerConnected) {\n // dataQueue.push(data);\n // return;\n // }\n sendData(data);\n });\n \n socket.on('close', (a, b, c) => {\n debug('listener socket closed', port, socket.socketId, a, b, c);\n if (sockets[socket.socketId]) {\n delete sockets[socket.socketId];\n try {\n rpcPeer.notifiers.closeRelaySocket({\n socketId: socket.socketId,\n });\n } catch (e) {\n debug('error closing relay socket', e);\n }\n }\n });\n \n socket.on('error', (error) => {\n debug('socket error', targetHost, socket.socketId, error);\n if (sockets[socket.socketId]) {\n delete sockets[socket.socketId];\n }\n });\n \n try {\n debug('connecting remotely', socket.socketId, targetPort, rpcPeer.hostName, targetHost);\n const result = await rpcPeer.methods.connectSocket({\n socketId: socket.socketId,\n port: targetPort || port,\n hostName: rpcPeer.hostName,\n });\n debug('connect result', result);\n socket.peerConnected = true;\n dataQueue.forEach(sendData); \n } catch (e) {\n debugError('cant connect remotely', targetHost, targetPort, e);\n if (sockets[socket.socketId]) {\n delete sockets[socket.socketId];\n }\n socket.end();\n }\n });\n\n socketServer.listen(port);\n\n function end() {\n const sockKeys = Object.keys(sockets);\n sockKeys.forEach((sk) => {\n try {\n if (sockets[sk].listenerSocket) {\n sockets[sk].end();\n delete sockets[sk];\n }\n }\n catch(e) {\n debug('error closing socket', e);\n }\n });\n }\n\n const listener = {\n socketServer,\n sockets,\n end,\n targetHost: cleanHost,\n targetPort: targetPort || port,\n port,\n };\n\n socketListeners['p' + port] = listener;\n return listener;\n }\n\n hsyncClient.socketListeners = socketListeners;\n hsyncClient.addSocketListener = addSocketListener;\n // hsyncClient.receiveRelayData = receiveRelayData;\n hsyncClient.getSocketListeners = getSocketListeners;\n // hsyncClient.closeListenerSocket = closeListenerSocket;\n\n return {\n addSocketListener,\n // receiveRelayData,\n getSocketListeners,\n };\n}\n\nmodule.exports = { \n initListeners,\n setNet,\n};\n\n//# sourceURL=webpack://hsync/./lib/socket-listeners.js?");
79
79
 
80
80
  /***/ }),
81
81
 
@@ -95,7 +95,7 @@ eval("const debug = __webpack_require__(/*! debug */ \"./node_modules/debug/src/
95
95
  \******************************/
96
96
  /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
97
97
 
98
- eval("const debug = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:relay');\nconst debugError = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:error');\nconst { sockets } = __webpack_require__(/*! ./socket-map */ \"./lib/socket-map.js\");\n\ndebugError.color = 1;\n\nlet net;\n\nfunction setNet(netImpl) {\n net = netImpl;\n}\n\nfunction initRelays(hsyncClient) {\n const cachedRelays = {};\n\n function getSocketRelays() {\n const hKeys = Object.keys(cachedRelays);\n debug('getSocketListeners', hKeys);\n let retVal = hKeys.map((hk) => {\n const l = cachedRelays[hk];\n return {\n port: l.port,\n targetHost: l.targetHost,\n targetPort: l.targetPort,\n whitelist: l.whitelist || '',\n blacklist: l.blacklist || '',\n };\n });\n return retVal;\n }\n\n function connectSocket(remotePeer, { port, socketId }) {\n\n remotePeer.notifications.oncloseRelaySocket((remotePeer, { socketId }) => {\n debug('closeRelaySocket', socketId);\n if (sockets[socketId]) {\n sockets[socketId].end();\n delete sockets[socketId];\n return 'closeRelaySocket ok';\n }\n return `closeRelaySocket no matching socket for ${socketId}`;\n });\n\n const relay = cachedRelays['p' + port];\n debug('connect relay', port, socketId, remotePeer.hostName);\n if (!relay) {\n throw new Error('no relay found for port: ' + port);\n }\n\n // TODO: check white and black lists on remotePeer\n\n // const relayDataTopic = `msg/${hostName}/${hsyncClient.myHostName}/relayData/${socketId}`;\n return new Promise((resolve, reject) => {\n const socket = new net.Socket();\n socket.socketId = socketId;\n sockets[socketId] = socket;\n socket.connect(relay.targetPort, relay.targetHost, () => {\n debug(`CONNECTED TO LOCAL SERVER`, socket.socketId, socket.hostName, port);\n resolve({socketId, targetHost: relay.targetHost, targetPort: relay.targetPort});\n });\n\n socket.on('data', async (data) => {\n debug(`data in ${socket.socketId}`, relay.targetPort, relay.targetHost, data.length);\n // TODO: queue data if remotePeer is not ready\n if (remotePeer.packAndSend) {\n debug('sending relay data via rtc', socket.socketId, data.length);\n remotePeer.packAndSend(`socketData/${socket.socketId}`, Buffer.from(data));\n return;\n }\n });\n socket.on('close', async () => {\n debug(`LOCAL CONNECTION CLOSED`, socket.socketId);\n if (sockets[socket.socketId]) {\n try {\n await remotePeer.notifiers.closeListenerSocket({socketId});\n } catch (e) {\n debug('error closing socket', e);\n }\n delete sockets[socket.socketId];\n }\n });\n\n socket.on('error', (e) => {\n debugError(`LOCAL CONNECTION ERROR`, socket.socketId, e);\n delete sockets[socket.socketId];\n reject(e);\n });\n \n });\n\n }\n\n function addSocketRelay({whitelist, blacklist, port, targetPort, targetHost = 'localhost'}) {\n targetPort = targetPort || port;\n debug('creating relay', whitelist, blacklist, port, targetPort, targetHost);\n const newRelay = {\n whitelist,\n blacklist,\n port,\n targetPort,\n targetHost,\n };\n cachedRelays['p' + port] = newRelay;\n return newRelay;\n }\n\n hsyncClient.cachedRelays = cachedRelays;\n hsyncClient.addSocketRelay = addSocketRelay;\n hsyncClient.getSocketRelays = getSocketRelays;\n hsyncClient.connectSocket = connectSocket;\n \n return {\n // receiveListenerData,\n getSocketRelays,\n connectSocket,\n addSocketRelay,\n };\n}\n\nmodule.exports = {\n initRelays,\n setNet,\n};\n\n//# sourceURL=webpack://hsync/./lib/socket-relays.js?");
98
+ eval("const debug = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:relay');\nconst debugError = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\")('hsync:error');\nconst { sockets } = __webpack_require__(/*! ./socket-map */ \"./lib/socket-map.js\");\n\ndebugError.color = 1;\n\nlet net;\n\nfunction setNet(netImpl) {\n net = netImpl;\n}\n\nfunction initRelays(hsyncClient) {\n const cachedRelays = {};\n\n function getSocketRelays() {\n const hKeys = Object.keys(cachedRelays);\n debug('getSocketListeners', hKeys);\n let retVal = hKeys.map((hk) => {\n const l = cachedRelays[hk];\n return {\n port: l.port,\n targetHost: l.targetHost,\n targetPort: l.targetPort,\n whitelist: l.whitelist || '',\n blacklist: l.blacklist || '',\n hostName: l.targetHost,\n };\n });\n return retVal;\n }\n\n function connectSocket(peer, { port, socketId, hostName }) {\n debug('connectSocket', port, socketId, hostName);\n\n peer.notifications.oncloseRelaySocket((peer, { socketId }) => {\n debug('closeRelaySocket', socketId);\n if (sockets[socketId]) {\n sockets[socketId].end();\n delete sockets[socketId];\n return 'closeRelaySocket ok';\n }\n return `closeRelaySocket no matching socket for ${socketId}`;\n });\n\n const relay = cachedRelays['p' + port];\n debug('connect relay', port, socketId, peer.hostName);\n if (!relay) {\n throw new Error('no relay found for port: ' + port);\n }\n\n // TODO: check white and black lists on peer\n\n // const relayDataTopic = `msg/${hostName}/${hsyncClient.myHostName}/relayData/${socketId}`;\n return new Promise((resolve, reject) => {\n const socket = new net.Socket();\n socket.socketId = socketId;\n sockets[socketId] = socket;\n socket.connect(relay.targetPort, relay.targetHost, () => {\n debug(`CONNECTED TO LOCAL SERVER`, socket.socketId, socket.hostName, port);\n resolve({socketId, targetHost: relay.targetHost, targetPort: relay.targetPort});\n });\n\n socket.on('data', async (data) => {\n debug(`data in ${socket.socketId}`, relay.targetPort, relay.targetHost, data.length);\n // TODO: queue data if peer is not ready\n if (peer.packAndSend) {\n debug('sending relay data via rtc', socket.socketId, data.length);\n peer.packAndSend(`socketData/${socket.socketId}`, Buffer.from(data));\n return;\n }\n });\n socket.on('close', async () => {\n debug(`LOCAL CONNECTION CLOSED`, socket.socketId);\n if (sockets[socket.socketId]) {\n try {\n await peer.notifiers.closeListenerSocket({socketId});\n } catch (e) {\n debug('error closing socket', e);\n }\n delete sockets[socket.socketId];\n }\n });\n\n socket.on('error', (e) => {\n debugError(`LOCAL CONNECTION ERROR`, socket.socketId, e);\n delete sockets[socket.socketId];\n reject(e);\n });\n \n });\n\n }\n\n function addSocketRelay({whitelist, blacklist, port, targetPort, targetHost}) {\n targetPort = targetPort || port;\n targetHost = targetHost || 'localhost';\n debug('creating relay', whitelist, blacklist, port, targetPort, targetHost);\n const newRelay = {\n whitelist,\n blacklist,\n port,\n targetPort,\n targetHost,\n hostName: targetHost,\n };\n cachedRelays['p' + port] = newRelay;\n return newRelay;\n }\n\n hsyncClient.cachedRelays = cachedRelays;\n hsyncClient.addSocketRelay = addSocketRelay;\n hsyncClient.getSocketRelays = getSocketRelays;\n hsyncClient.connectSocket = connectSocket;\n \n return {\n // receiveListenerData,\n getSocketRelays,\n connectSocket,\n addSocketRelay,\n };\n}\n\nmodule.exports = {\n initRelays,\n setNet,\n};\n\n//# sourceURL=webpack://hsync/./lib/socket-relays.js?");
99
99
 
100
100
  /***/ }),
101
101