diff --git a/package.json b/package.json index 8c31191b..449dd7c2 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "graphviz": "0.0.8", "grpc": "1.24.4", "gun": "git://github.com/amark/gun#97aa976c97e6219a9f93095d32c220dcd371ca62", + "hybrid-relay-client": "git://github.com/shocknet/hybridRelayClient#43478046e160f2b85a18cea4400c3076389dda64", "husky": "^4.2.5", "jsonfile": "^4.0.0", "jsonwebtoken": "^8.3.0", diff --git a/src/cors.js b/src/cors.js index dcbf1599..0c6ef438 100644 --- a/src/cors.js +++ b/src/cors.js @@ -3,7 +3,7 @@ const setAccessControlHeaders = (req, res) => { res.header("Access-Control-Allow-Methods", "OPTIONS,POST,GET,PUT,DELETE") res.header( "Access-Control-Allow-Headers", - "Origin, X-Requested-With, Content-Type, Accept, Authorization, public-key-for-decryption, encryption-device-id, public-key-for-decryption" + "Origin, X-Requested-With, Content-Type, Accept, Authorization, public-key-for-decryption, encryption-device-id, public-key-for-decryption,x-shock-hybrid-relay-id-x" ); }; diff --git a/src/server.js b/src/server.js index 35fbdce3..0ac283a8 100644 --- a/src/server.js +++ b/src/server.js @@ -17,8 +17,6 @@ const server = program => { const Path = require('path') const { Logger: CommonLogger } = require('shock-common') const binaryParser = require('socket.io-msgpack-parser') - const { fork } = require('child_process') - const EventEmitter = require('events') const ECC = require('../utils/ECC') const LightningServices = require('../utils/lightningServices') @@ -30,6 +28,7 @@ const server = program => { const session = require('express-session') const methodOverride = require('method-override') const qrcode = require('qrcode-terminal') + const relayClient = require('hybrid-relay-client/build') const { unprotectedRoutes, sensitiveRoutes, @@ -59,31 +58,6 @@ const server = program => { require('../utils/server-utils')(module) logger.info('Mainnet Mode:', !!program.mainnet) - const tunnelTimeout = 5000 - let latestAliveTunnel = 0 - let tunnelHealthInterval = null - const tunnelHealthManager = new EventEmitter() - tunnelHealthManager.on('fork', ({ params, cb }) => { - if (latestAliveTunnel !== 0 && latestAliveTunnel < tunnelTimeout) { - return - } - clearInterval(tunnelHealthInterval) - tunnelHealthInterval = setInterval(() => { - if (Date.now() - latestAliveTunnel > tunnelTimeout) { - console.log('oh no! tunnel is dead, will restart it now') - tunnelHealthManager.emit('fork', { params, cb }) - } - }, 2000) - const forked = fork('src/tunnel.js') - forked.on('message', msg => { - //console.log('Message from child', msg); - if (msg && msg.type === 'info') { - cb(msg.tunnel) - } - latestAliveTunnel = Date.now() - }) - forked.send(params) - }) if (process.env.SHOCK_ENCRYPTION_ECC === 'false') { logger.error('Encryption Mode: false') @@ -426,58 +400,40 @@ const server = program => { app.use(modifyResponseBody) } - serverInstance.listen(serverPort, serverHost) - if (program.tunnel) { - // setup localtunnel ========== - const [tunnelToken, tunnelSubdomain, tunnelUrl] = await Promise.all([ - Storage.getItem('tunnel/token'), - Storage.getItem('tunnel/subdomain'), - Storage.getItem('tunnel/url') + const [relayToken, relayId, relayUrl] = await Promise.all([ + Storage.getItem('relay/token'), + Storage.getItem('relay/id'), + Storage.getItem('relay/url') ]) - const tunnelOpts = { - port: serverPort, - host: tunnelHost, - print_requests: true + const opts = { + relayId, + relayToken, + address: tunnelHost, + port: serverPort } - if (tunnelToken && tunnelSubdomain) { - tunnelOpts.tunnelToken = tunnelToken - tunnelOpts.subdomain = tunnelSubdomain - logger.info('Recreating tunnel... with subdomain: ' + tunnelSubdomain) - } else { - logger.info('Creating new tunnel...This will require a pair ') - } - tunnelHealthManager.emit('fork', { - params: tunnelOpts, - cb: async tunnel => { - if (tunnelSubdomain !== tunnel.clientId && !tunnel.token) { - logger.error( - 'An error occurred while opening tunnel, will try again in 2 sec with a new one' - ) - - return - } - logger.info('Tunnel created! connect to: ' + tunnel.url) + console.log(opts) + relayClient.default(opts, async (connected, params) => { + if (connected) { + await Promise.all([ + Storage.setItem('relay/token', params.relayToken), + Storage.setItem('relay/id', params.relayId), + Storage.setItem('relay/url', params.address) + ]) const dataToQr = JSON.stringify({ - internalIP: tunnel.url, + internalIP: `${params.relayId}@${params.address}`, walletPort: 443, - externalIP: tunnel.url + externalIP: `${params.relayId}@${params.address}` }) qrcode.generate(dataToQr, { small: true }) - if (tunnel.token) { - console.log('writing to storage...') - await Promise.all([ - Storage.setItem('tunnel/token', tunnel.token), - Storage.setItem('tunnel/subdomain', tunnel.clientId), - Storage.setItem('tunnel/url', tunnel.url) - ]) - } + console.log(`connect to ${params.relayId}@${params.address}`) + } else { + logger.error('!! Relay did not connect to server !!') } }) } - + serverInstance.listen(serverPort, serverHost) logger.info('App listening on ' + serverHost + ' port ' + serverPort) - module.server = serverInstance } catch (err) { logger.error({ exception: err, message: err.message, code: err.code }) diff --git a/yarn.lock b/yarn.lock index b4e987cd..3340ca2e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1361,6 +1361,11 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== +backo2@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -2463,7 +2468,22 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -engine.io-parser@~4.0.0: +engine.io-client@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-5.1.1.tgz#f5c3aaaef1bdc9443aac6ffde48b3b2fb2dc56fc" + integrity sha512-jPFpw2HLL0lhZ2KY0BpZhIJdleQcUO9W1xkIpo0h3d6s+5D6+EV/xgQw9qWOmymszv2WXef/6KUUehyxEKomlQ== + dependencies: + base64-arraybuffer "0.1.4" + component-emitter "~1.3.0" + debug "~4.3.1" + engine.io-parser "~4.0.1" + has-cors "1.1.0" + parseqs "0.0.6" + parseuri "0.0.6" + ws "~7.4.2" + yeast "0.1.2" + +engine.io-parser@~4.0.0, engine.io-parser@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.2.tgz#e41d0b3fb66f7bf4a3671d2038a154024edb501e" integrity sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg== @@ -3410,6 +3430,11 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3581,6 +3606,14 @@ husky@^4.2.5: slash "^3.0.0" which-pm-runs "^1.0.0" +"hybrid-relay-client@git://github.com/shocknet/hybridRelayClient#43478046e160f2b85a18cea4400c3076389dda64": + version "1.0.0" + resolved "git://github.com/shocknet/hybridRelayClient#43478046e160f2b85a18cea4400c3076389dda64" + dependencies: + node-fetch "^2.6.1" + socket.io-client "^4.1.2" + socket.io-msgpack-parser "^3.0.1" + iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5623,6 +5656,16 @@ parse5@4.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== +parseqs@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" + integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== + +parseuri@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" + integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== + parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -6579,6 +6622,19 @@ socket.io-adapter@~2.2.0: resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.2.0.tgz#43af9157c4609e74b8addc6867873ac7eb48fda2" integrity sha512-rG49L+FwaVEwuAdeBRq49M97YI3ElVabJPzvHT9S6a2CWhDKnjSFasvwAwSYPRhQzfn4NtDIbCaGYgOCOU/rlg== +socket.io-client@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.1.2.tgz#95ad7113318ea01fba0860237b96d71e1b1fd2eb" + integrity sha512-RDpWJP4DQT1XeexmeDyDkm0vrFc0+bUsHDKiVGaNISJvJonhQQOMqV9Vwfg0ZpPJ27LCdan7iqTI92FRSOkFWQ== + dependencies: + "@types/component-emitter" "^1.2.10" + backo2 "~1.0.2" + component-emitter "~1.3.0" + debug "~4.3.1" + engine.io-client "~5.1.1" + parseuri "0.0.6" + socket.io-parser "~4.0.4" + socket.io-msgpack-parser@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/socket.io-msgpack-parser/-/socket.io-msgpack-parser-3.0.1.tgz#48ea37b51f1fa1b09253bc97073be9204664f3c6" @@ -6587,7 +6643,7 @@ socket.io-msgpack-parser@^3.0.1: component-emitter "~1.3.0" notepack.io "~2.2.0" -socket.io-parser@~4.0.3: +socket.io-parser@~4.0.3, socket.io-parser@~4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== @@ -7707,6 +7763,11 @@ yargs@^3.10.0: window-size "^0.1.4" y18n "^3.2.0" +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"