diff --git a/.bundle/config b/.bundle/config index 7351fba2..fc56b363 100644 --- a/.bundle/config +++ b/.bundle/config @@ -1,3 +1,3 @@ --- -BUNDLE_WITHOUT: "test:development" -BUNDLE_PATH: vendor/ +BUNDLE_PATH: "vendor/" +BUNDLE_WITHOUT: "development" diff --git a/Gemfile b/Gemfile index 89f93c12..033f43dc 100644 --- a/Gemfile +++ b/Gemfile @@ -21,6 +21,6 @@ gem 'thor' gem 'readline' gem 'readline-ext' gem "rack-reverse-proxy", require: "rack/reverse_proxy" -group :development, :test do +group :development do gem "rerun" end diff --git a/main.rb b/main.rb index a984b3d2..27e88b2d 100644 --- a/main.rb +++ b/main.rb @@ -72,6 +72,12 @@ set :dynamicPath, File.join(settings.root, 'node_modules', '@nebula-services', 'dynamic', 'dist') dynamicPath() +set :epoxyPath, File.join(settings.root, 'node_modules', '@mercuryworkshop', 'epoxy-transport', 'dist') +epoxyPath() + +set :baremuxPath, File.join(settings.root, 'node_modules', '@mercuryworkshop', 'bare-mux', 'dist') +baremuxPath() + # Other routes get '/rubyHealth/?' do return "OK" diff --git a/node-server/server-dev.js b/node-server/server-dev.js index 78059bef..b11319f9 100644 --- a/node-server/server-dev.js +++ b/node-server/server-dev.js @@ -12,6 +12,7 @@ const __dirname = path.resolve(); const settings = YAML.parse(fs.readFileSync(path.join(__dirname, '/config/settings.yml'), 'utf8')); import chalk from 'chalk'; import compile from './compile.js'; +import wisp from 'wisp-server-node'; //import getLatestRelease from './version.js'; let rubyPort = process.argv.find((arg) => arg.startsWith('--ruby-port')).split('=')[1] || 9292; let nodePort = process.argv.find((arg) => arg.startsWith('--node-port')).split('=')[1] || 9293; @@ -49,6 +50,9 @@ const proxyHandler = (handler, opts) => { else if (shouldRouteRh(req)) { routeRhUpgrade(req, socket, head); } + else if (req.url.endsWith('/wisp/')) { + wisp.routeRequest(req, socket, head); + } }); }; diff --git a/node-server/server.js b/node-server/server.js index 0ae553ff..913d6a4c 100644 --- a/node-server/server.js +++ b/node-server/server.js @@ -13,6 +13,7 @@ const settings = YAML.parse(fs.readFileSync(path.join(__dirname, '/config/settin import chalk from 'chalk'; import compile from './compile.js'; import getLatestRelease from './version.js'; +import wisp from 'wisp-server-node'; let rubyPort = process.argv.find((arg) => arg.startsWith('--ruby-port')).split('=')[1] || 9292; let nodePort = process.argv.find((arg) => arg.startsWith('--node-port')).split('=')[1] || 9293; @@ -49,6 +50,9 @@ const proxyHandler = (handler, opts) => { else if (shouldRouteRh(req)) { routeRhUpgrade(req, socket, head); } + else if (req.url.endsWith('/wisp/')) { + wisp.routeRequest(req, socket, head); + } }); }; diff --git a/package.json b/package.json index f1fb5493..b84df935 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,10 @@ "dependencies": { "@fastify/http-proxy": "^9.2.1", "@fastify/middie": "^8.3.0", + "@mercuryworkshop/bare-mux": "^1.0.4", + "@mercuryworkshop/epoxy-transport": "^1.0.2", "@nebula-services/dynamic": "^0.7.2-patch.2", - "@titaniumnetwork-dev/ultraviolet": "^2.0.0", + "@titaniumnetwork-dev/ultraviolet": "^3.0.0", "@tomphttp/bare-server-node": "^2.0.0", "chalk": "^5.2.0", "fastify": "^4.21.0", @@ -26,6 +28,7 @@ "rammerhead": "https://github.com/Ruby-Network/rammerhead/releases/download/v1/rammerhead-2.tgz", "sass": "^1.62.1", "typescript": "^5.3.3", + "wisp-server-node": "^1.0.1", "yaml": "^2.3.1" } } diff --git a/ruby/proxyPaths.rb b/ruby/proxyPaths.rb index e498560e..85813a32 100644 --- a/ruby/proxyPaths.rb +++ b/ruby/proxyPaths.rb @@ -17,3 +17,18 @@ def dynamicPath end end end + +def epoxyPath + get '/epoxy/*' do + send_file File.join(settings.epoxyPath, params[:splat][0]) + end +end + +def baremuxPath + get '/baremux/*' do + if params[:splat][0].end_with?('.cjs') + headers['Content-Type'] = 'application/javascript' + end + send_file File.join(settings.baremuxPath, params[:splat][0]) + end +end diff --git a/src/public/js/register.js b/src/public/js/register.js index 1d58fe66..d8014419 100644 --- a/src/public/js/register.js +++ b/src/public/js/register.js @@ -1,9 +1,10 @@ 'serviceWorker' in navigator && - window.addEventListener('load', function () { - navigator.serviceWorker.register('/sw.js', { scope: '/' }) + window.addEventListener('load', async function () { + await navigator.serviceWorker.register('/sw.js', { scope: '/' }) //uv SW - navigator.serviceWorker.register('/js/sw/uv.js', { scope: '/js/sw/service/uv/' }) - navigator.serviceWorker.register('/js/sw/dynamic.js', { scope: '/js/sw/service/dynamic/' }) + await navigator.serviceWorker.register('/js/sw/uv.js', { scope: '/js/sw/service/uv/' }) + await navigator.serviceWorker.register('/js/sw/dynamic.js', { scope: '/js/sw/service/dynamic/' }) + setDefaultTransport(); }); function regSW() { 'serviceWorker' in navigator && diff --git a/src/public/js/settings.js b/src/public/js/settings.js index fcb77f41..b8beab9d 100644 --- a/src/public/js/settings.js +++ b/src/public/js/settings.js @@ -103,21 +103,27 @@ function setItems() { let searchInput = document.getElementById('searchInput'); let proxySelect = document.getElementById('proxySelect'); let fullscreenSelect = document.getElementById('fullscreenSelect'); - let bareInput = document.getElementById('bareInput'); + let wispInput = document.getElementById('wispInput'); + let transportSelect = document.getElementById('transportSelect'); + //let bareInput = document.getElementById('bareInput'); let title = localStorage.getItem('title'); let favicon = localStorage.getItem('favicon'); let theme = localStorage.getItem('theme'); let search = localStorage.getItem('searchEngine'); let proxy = localStorage.getItem('proxy'); let fullscreen = localStorage.getItem('fullScreen'); - let bare = localStorage.getItem('bare'); + let wispUrl = localStorage.getItem('wispUrl'); + let transports = localStorage.getItem('transports'); + //let bare = localStorage.getItem('bare'); titleInput.value = title; faviconInput.value = favicon; themeSelect.value = theme; searchInput.value = search; proxySelect.value = proxy; fullscreenSelect.value = fullscreen; - if (bare === window.location.origin + '/bare/') { bareInput.value = '/bare/'; } else { bareInput.value = bare; } + wispInput.value = wispUrl; + transportSelect.value = transports; + //if (bare === window.location.origin + '/bare/') { bareInput.value = '/bare/'; } else { bareInput.value = bare; } document.documentElement.className = localStorage.getItem('theme'); document.title = title; document.getElementById('favicon').href = favicon; @@ -131,6 +137,7 @@ function reset() { searchSettings('https://www.google.com/search?q=%s'); proxyChange('uv'); fullScreenChange('page'); + setDefaultTransport(); setItems(); } function exportSettings() { @@ -142,6 +149,8 @@ function exportSettings() { let fullscreen = localStorage.getItem('fullScreen'); let bare = localStorage.getItem('bare'); let password = localStorage.getItem('password'); + let transports = localStorage.getItem('transports'); + let wispUrl = localStorage.getItem('wispUrl'); let settings = { title: title, favicon: favicon, @@ -151,6 +160,8 @@ function exportSettings() { fullscreen: fullscreen, bare: bare, password: password, + transports: transports, + wispUrl: wispUrl } let a = document.createElement('a'); let file = new Blob([JSON.stringify(settings)], { type: 'text/plain' }); @@ -179,6 +190,8 @@ function importSettings() { localStorage.setItem('fullScreen', settings.fullscreen); localStorage.setItem('bare', settings.bare); localStorage.setItem('password', settings.password); + localStorage.setItem('transports', settings.transports); + changeWisp(settings.wispUrl); setItems(); console.log('Imported settings'); window.location.reload(); @@ -209,6 +222,27 @@ function passwordKeybinds() { console.log("Password Keybind initalized"); } +function changeWisp(value) { + if (value.startsWith('http://')) { + value = value.replace('http://', 'ws://'); + } + else if (value.startsWith('https://')) { + value = value.replace('https://', 'wss://'); + } + localStorage.setItem('wispUrl', value); + setTransports(); +} + +function transportChange(value) { + if (value === 'soon') { + return; + } + else { + localStorage.setItem('transports', value); + setTransports(); + } +} + function init() { let init = localStorage.getItem('init'); if (init === null || init === undefined || init === 'false') { @@ -220,7 +254,7 @@ function init() { localStorage.setItem('searchEngine', 'https://www.google.com/search?q=%s'); localStorage.setItem('proxy', 'uv'); localStorage.setItem('bare', window.location.origin + '/bare/'); - localStorage.setItem('fullScreen', 'page'); + localStorage.setItem('fullScreen', 'page'); setItems(); } else { diff --git a/src/public/js/sw/uv.js b/src/public/js/sw/uv.js index 2d044913..5105f495 100644 --- a/src/public/js/sw/uv.js +++ b/src/public/js/sw/uv.js @@ -1,4 +1,5 @@ //all Ultraviolet realted stuff goes here +importScripts('/epoxy/index.js'); importScripts('/uv/uv.bundle.js'); importScripts('/uv/uv.config.js'); importScripts('/js/lib/localforage.js'); diff --git a/src/public/js/transports.js b/src/public/js/transports.js new file mode 100644 index 00000000..12a0f641 --- /dev/null +++ b/src/public/js/transports.js @@ -0,0 +1,24 @@ +const transports = localStorage.getItem('transports'); +const wispUrl = localStorage.getItem('wispUrl') || (location.protocol === "https:" ? "wss" : "ws") + "://" + location.host + "/wisp/"; + +function setTransports() { + switch (transports) { + case 'epoxy': + setEpoxyTransport(); + break; + default: + setEpoxyTransport(); + break; + } +} + +function setDefaultTransport() { + if (!transports) { + localStorage.setItem('transports', 'epoxy'); + setEpoxyTransport(); + } +} + +function setEpoxyTransport() { + BareMux.SetTransport('EpxMod.EpoxyClient', { wisp: localStorage.getItem('wispUrl') || wispUrl }); +} diff --git a/src/public/js/uv/uv.config.js b/src/public/js/uv/uv.config.js index c19fee5a..5a226aaf 100644 --- a/src/public/js/uv/uv.config.js +++ b/src/public/js/uv/uv.config.js @@ -1,6 +1,6 @@ self.__uv$config = { prefix: '/js/sw/service/uv/', - bare: '/bare/', + //bare: '/bare/', encodeUrl: Ultraviolet.codec.xor.encode, decodeUrl: Ultraviolet.codec.xor.decode, handler: '/uv/uv.handler.js', diff --git a/src/views/components/settings.erb b/src/views/components/settings.erb index f296a0ef..c8cf31b2 100644 --- a/src/views/components/settings.erb +++ b/src/views/components/settings.erb @@ -14,10 +14,15 @@ -
+ +
+

Wisp Server

+ +

Search Engine

@@ -34,10 +39,17 @@

Proxy

+
+

Transport

+ +

Theme