From eabe08e4e9c0ecab0e4e44a05a1976b4932b84ba Mon Sep 17 00:00:00 2001 From: MotorTruck1221 Date: Sun, 17 Mar 2024 05:24:44 -0600 Subject: [PATCH] Remove the need for node --- cli/cli.rb | 12 ++++ config/puma.rb | 32 +-------- docker/Dockerfile | 6 +- main.rb | 25 ++++++- node-server/server-dev.js | 108 ----------------------------- node-server/version.js | 8 --- {node-server => nodeJS}/compile.js | 3 +- {node-server => nodeJS}/server.js | 46 ++---------- package.json | 9 +-- rammerhead/rh.ts | 9 +-- require.rb | 1 + ruby/release.rb | 11 +++ src/public/js/omnibox.js | 4 +- src/public/js/omnibox.js.min.js | 2 +- src/public/js/rh/rh.js | 9 +-- src/public/js/rh/rh.js.min.js | 2 +- src/public/js/settings.js | 1 + src/public/js/settings.js.min.js | 2 +- src/public/js/updates.js | 22 +++--- src/public/js/updates.js.min.js | 2 +- 20 files changed, 89 insertions(+), 225 deletions(-) delete mode 100644 node-server/server-dev.js delete mode 100644 node-server/version.js rename {node-server => nodeJS}/compile.js (95%) rename {node-server => nodeJS}/server.js (62%) create mode 100644 ruby/release.rb diff --git a/cli/cli.rb b/cli/cli.rb index 86a1d131..dae9079e 100644 --- a/cli/cli.rb +++ b/cli/cli.rb @@ -13,6 +13,18 @@ $database = ENV['DB_DATABASE'] || settings['database']['dbname'].to_s class RubyCLI < Thor + desc "start", "Start the server" + option :node, :type => :boolean + def start + if options[:node] + puts "Starting with node server...".red + system("node nodeJS/server.js --node-port=9294 &") + system("bundle exec puma -e production -q") + else + puts "Starting the server...".red + system("bundle exec puma -e production -q") + end + end desc "create", "Create a new user" def create puts "Creating a new user...".red diff --git a/config/puma.rb b/config/puma.rb index 7e3990f2..720dd868 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -1,31 +1,17 @@ require 'etc' require 'os' require 'colorize' -# get the ruby Implementation + if OS.windows? puts "You are using Windows. Not multi-threading...".colorize(:red) puts "Starting Server...".colorize(:green) - rubyPort = 9292 - rubyPort = ARGV[ARGV.index('-p') + 1] || ARGV[ARGV.index('--port') + 1] if ARGV.include?('-p') || ARGV.include?('--port') - if ENV['RACK_ENV'] == 'production' - system("node node-server/server.js --ruby-port=#{rubyPort} --node-port=9293 &") - else - system("node node-server/server-dev.js --ruby-port=#{rubyPort} --node-port=9293 &") - end elsif ENV['WP'] != nil workers ENV['WP'].to_i before_fork do puts "The amount of proccesses is: #{ENV['WP']}".colorize(:green) puts "Master Process ID: #{Process.pid}".colorize(:green) puts "Starting Server...".colorize(:green) - rubyPort = 9292 cpuCount = Etc.nprocessors - rubyPort = ARGV[ARGV.index('-p') + 1] || ARGV[ARGV.index('--port') + 1] if ARGV.include?('-p') || ARGV.include?('--port') - if ENV['RACK_ENV'] == 'production' - system("node node-server/server.js --ruby-port=#{rubyPort} --node-port=9293 &") - else - system("node node-server/server-dev.js --ruby-port=#{rubyPort} --node-port=9293 &") - end end else if RUBY_ENGINE != 'jruby' && RUBY_ENGINE != 'truffleruby' @@ -33,27 +19,13 @@ before_fork do puts "Master Process ID: #{Process.pid}".colorize(:green) puts "Starting Server...".colorize(:green) - rubyPort = 9292 cpuCount = Etc.nprocessors - rubyPort = ARGV[ARGV.index('-p') + 1] || ARGV[ARGV.index('--port') + 1] if ARGV.include?('-p') || ARGV.include?('--port') - if ENV['RACK_ENV'] == 'production' - system("node node-server/server.js --ruby-port=#{rubyPort} --node-port=9293 &") - else - system("node node-server/server-dev.js --ruby-port=#{rubyPort} --node-port=9293 &") - end end else puts "You are using JRuby or TruffleRuby. Not using workers...".colorize(:red) puts "Starting Server...".colorize(:green) - rubyPort = 9292 - rubyPort = ARGV[ARGV.index('-p') + 1] || ARGV[ARGV.index('--port') + 1] if ARGV.include?('-p') || ARGV.include?('--port') - if ENV['RACK_ENV'] == 'production' - system("node node-server/server.js --ruby-port=#{rubyPort} --node-port=9293 &") - else - system("node node-server/server-dev.js --ruby-port=#{rubyPort} --node-port=9293 &") - end end end preload_app! -port ENV['PORT'] || 9292 +port ENV['PORT'] || 9293 diff --git a/docker/Dockerfile b/docker/Dockerfile index f4cdf4d7..18fb0668 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -16,7 +16,7 @@ RUN cp config/settings.example.yml config/settings.yml VOLUME /usr/src/app/config/ # Run the app EXPOSE 9293 -CMD ["pnpm", "start"] +CMD ["pnpm", "start", "--node"] FROM node:latest as jruby WORKDIR /usr/src/app @@ -40,7 +40,7 @@ RUN cp config/settings.example.yml config/settings.yml VOLUME /usr/src/app/config/ # Run the app EXPOSE 9293 -CMD ["pnpm", "start"] +CMD ["pnpm", "start", "--node"] FROM ghcr.io/graalvm/truffleruby-community:23.1.2-debian as truffleruby WORKDIR /usr/src/app @@ -59,4 +59,4 @@ RUN cp config/settings.example.yml config/settings.yml VOLUME /usr/src/app/config/ # Run the app EXPOSE 9293 -CMD ["pnpm", "start"] +CMD ["pnpm", "start", "--node"] diff --git a/main.rb b/main.rb index 6df7681e..0976db7e 100644 --- a/main.rb +++ b/main.rb @@ -24,7 +24,7 @@ logging = false end set :logging, logging -set :show_exceptions, logging +set :show_exceptions, logging set :components, File.join(settings.root, 'src', 'views', 'components') cookie_options = { :key => 'UserAllowed', @@ -34,6 +34,7 @@ :secure => true, :httponly => true } + #Validate the YML file validateYML() #Validate the ENV variables @@ -83,15 +84,33 @@ mime_type :wasm, 'application/wasm' +latestRelease = getLatestRelease() + # Other routes -get '/rubyHealth/?' do - return "OK" +get '/health/?' do + return { status: "ok" }.to_json end get '/:unlock?' do erb :index, :layout => :"layouts/index" end +get '/version/?' do + return { version: latestRelease }.to_json +end + +use Rack::ReverseProxy do + reverse_proxy /^\/gms(\/.*)$/, 'https://rawcdn.githack.com/$1' +end + +get '/search/:q?' do + content_type :json + query = params[:q] + resp = HTTParty.get("https://search.brave.com/api/suggest?q=#{query}&format=json") + return resp.body +end + + #Auth to login to the site post '/auth' do if Settings.corlink.enabled == "true" && Settings.private == "false" diff --git a/node-server/server-dev.js b/node-server/server-dev.js deleted file mode 100644 index d7474443..00000000 --- a/node-server/server-dev.js +++ /dev/null @@ -1,108 +0,0 @@ -import Fastify from 'fastify'; -import fastifyMiddie from '@fastify/middie'; -import fastifyHttpProxy from '@fastify/http-proxy'; -import { fileURLToPath } from 'node:url'; -import { createBareServer } from '@tomphttp/bare-server-node'; -import createRammerhead from "rammerhead/src/server/index.js"; -import { createServer } from 'http'; -import fs from 'fs' -import YAML from 'yaml'; -import path from 'path'; -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 fastifyCaching from '@fastify/caching' -//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; - -const latestRelease = 'dev'; -const bare = createBareServer('/bare/'); -const rh = createRammerhead(); -const rammerheadScopes = [ "/rammerhead.js", "/hammerhead.js", "/transport-worker.js", "/task.js", "/iframe-task.js", "/worker-hammerhead.js", "/messaging", "/sessionexists", "/deletesession", "/newsession", "/editsession", "/needpassword", "/syncLocalStorage", "/api/shuffleDict", "/mainport" ]; -const rammerheadSession = /^\/[a-z0-9]{32}/; -function shouldRouteRh(req) { - const url = new URL(req.url, "http://0.0.0.0"); - return (rammerheadScopes.includes(url.pathname) || rammerheadSession.test(url.pathname)); -} -function routeRhRequest(req, res) { rh.emit("request", req, res) } -function routeRhUpgrade(req, socket, head) { rh.emit("upgrade", req, socket, head) } -console.log(chalk.red('Compiling...')) -compile(); - -const proxyHandler = (handler, opts) => { - return createServer().on('request', (req, res) => { - if (bare.shouldRoute(req)) { - bare.routeRequest(req, res); - } - else if (shouldRouteRh(req)) { - routeRhRequest(req, res); - } - else { - handler(req, res); - } - }) - .on('upgrade', (req, socket, head) => { - if (bare.shouldRoute(req)) { - bare.routeUpgrade(req, socket, head); - } - else if (shouldRouteRh(req)) { - routeRhUpgrade(req, socket, head); - } - else if (req.url.endsWith('/wisp/')) { - wisp.routeRequest(req, socket, head); - } - }); -}; - -const app = Fastify({ logger: false, serverFactory: proxyHandler }) -await app - .register(fastifyCaching, { - privacy: fastifyCaching.privacy.NOCACHE - }) - .register(fastifyHttpProxy, { - upstream: 'http://localhost:9292', - prefix: '/', - http2: false, - replyOptions: { - rewriteRequestHeaders: (originalReq, headers) => { - headers['host'] = originalReq.headers['host']; - headers['origin'] = originalReq.headers['origin']; - return headers; - } - } - }) - .register(fastifyHttpProxy, { - upstream: 'https://rawcdn.githack.com', - prefix: '/gms/', - http2: false, - }) - .register(fastifyMiddie) -app.get('/search=:query', async (req, res) => { - const { query } = req.params; - try { - const resp = await fetch(`https://search.brave.com/api/suggest?q=${query}&format=json`).then((res) => res.json()); - res.send(resp); - } - catch (err) { - reply.code(500).send({ error: "Internal Server Error" }); - } -}); -app.get('/version', async (req, res) => { - res.send({ version: latestRelease }); -}); -app.get('/health', async (req, res) => { - //get the /rubyHealth response - const resp = await fetch(`http://localhost:${rubyPort}/rubyHealth`); - if (resp.status === 200) { - res.send({ status: 'ok' }); - } - else { - res.send({ status: 'error' }); - } -}); - -app.listen({ port: nodePort, host: '0.0.0.0' }); -console.log(chalk.green(`Server listening on port ${chalk.red(nodePort)}`)); diff --git a/node-server/version.js b/node-server/version.js deleted file mode 100644 index 66097edd..00000000 --- a/node-server/version.js +++ /dev/null @@ -1,8 +0,0 @@ -async function getLatestRelease() { - console.log('Fetching latest release...') - let version = await fetch('https://api.github.com/repos/Ruby-Network/ruby/releases/latest').then((res) => res.json()); - console.log('Latest release fetched.') - return version.tag_name; -} - -export default getLatestRelease; \ No newline at end of file diff --git a/node-server/compile.js b/nodeJS/compile.js similarity index 95% rename from node-server/compile.js rename to nodeJS/compile.js index b7c3f400..f7fafe95 100644 --- a/node-server/compile.js +++ b/nodeJS/compile.js @@ -16,4 +16,5 @@ async function compile() { } await logger(compileSCSS(), 'Compiling SCSS'); } -export default compile; +compile(); +//export default compile; diff --git a/node-server/server.js b/nodeJS/server.js similarity index 62% rename from node-server/server.js rename to nodeJS/server.js index d048b279..0d7c7965 100644 --- a/node-server/server.js +++ b/nodeJS/server.js @@ -1,36 +1,25 @@ import Fastify from 'fastify'; import fastifyMiddie from '@fastify/middie'; import fastifyHttpProxy from '@fastify/http-proxy'; -import { fileURLToPath } from 'node:url'; import { createBareServer } from '@tomphttp/bare-server-node'; import createRammerhead from "rammerhead/src/server/index.js"; import { createServer } from 'http'; -import fs from 'fs' -import YAML from 'yaml'; import path from 'path'; 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 getLatestRelease from './version.js'; import wisp from 'wisp-server-node'; import fastifyCaching from '@fastify/caching'; -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; - -const latestRelease = await getLatestRelease(); +let nodePort = process.argv.find((arg) => arg.startsWith('--node-port')).split('=')[1] || 9294; const bare = createBareServer('/bare/'); const rh = createRammerhead(); const rammerheadScopes = [ "/rammerhead.js", "/hammerhead.js", "/transport-worker.js", "/task.js", "/iframe-task.js", "/worker-hammerhead.js", "/messaging", "/sessionexists", "/deletesession", "/newsession", "/editsession", "/needpassword", "/syncLocalStorage", "/api/shuffleDict", "/mainport" ]; const rammerheadSession = /^\/[a-z0-9]{32}/; function shouldRouteRh(req) { const url = new URL(req.url, "http://0.0.0.0"); - return (rammerheadScopes.includes(url.pathname) || rammerheadSession.test(url.pathname)); + return (rammerheadScopes.includes("/rammer/" + url.pathname) || rammerheadSession.test("/rammer/" + url.pathname)); } function routeRhRequest(req, res) { rh.emit("request", req, res) } function routeRhUpgrade(req, socket, head) { rh.emit("upgrade", req, socket, head) } -console.log(chalk.red('Compiling...')) -compile(); const proxyHandler = (handler, opts) => { return createServer().on('request', (req, res) => { @@ -63,7 +52,7 @@ await app privacy: fastifyCaching.privacy.NOCACHE }) .register(fastifyHttpProxy, { - upstream: 'http://localhost:9292', + upstream: 'http://localhost:9293', prefix: '/', http2: false, replyOptions: { @@ -74,34 +63,7 @@ await app } } }) - .register(fastifyHttpProxy, { - upstream: 'https://rawcdn.githack.com', - prefix: '/gms/', - http2: false, - }) .register(fastifyMiddie) -app.get('/search=:query', async (req, res) => { - const { query } = req.params; - try { - const resp = await fetch(`https://search.brave.com/api/suggest?q=${query}&format=json`).then((res) => res.json()); - res.send(resp); - } - catch (err) { - reply.code(500).send({ error: "Internal Server Error" }); - } -}); -app.get('/version', (req, res) => { - res.send({ version: latestRelease }); -}); -app.get('/health', async (req, res) => { - let resp = await fetch(`http://localhost:${rubyPort}/rubyHealth`); - if (resp.status === 200) { - res.send({ status: 'ok' }); - } - else { - res.send({ status: 'error' }); - } -}); app.listen({ port: nodePort, host: '0.0.0.0' }); -console.log(chalk.green(`Server listening on port ${chalk.red(nodePort)}`)); +console.log(chalk.green(`NodeJS Server listening on port ${chalk.red(nodePort)}`)); diff --git a/package.json b/package.json index 01c945ae..76ec11cb 100644 --- a/package.json +++ b/package.json @@ -6,12 +6,13 @@ "author": "Ruby Network", "scripts": { "preinstall": "npx -y only-allow pnpm", - "dev": "bundle exec rerun --ignore 'src/public/css/*' --signal 'TERM' -c -w 5 --no-notify -- puma", - "start": "bundle exec puma -e production", + "dev": "bundle exec rerun --ignore 'src/public/css/*' --ignore 'node_modules/*' --signal 'TERM' -c -w 5 --no-notify -- puma", + "start": "bundle exec ruby cli/cli.rb start", "install": "pnpm run build && bundle install", "build:rh": "tsc -p ./rammerhead/tsconfig.json", "build:epoxytransport": "cd ./epoxytransport/ && npm run build", - "build": "pnpm run build:rh && pnpm run build:epoxytransport", + "build:css": "node ./nodeJS/compile.js", + "build": "pnpm run build:rh && pnpm run build:epoxytransport && pnpm run build:css", "cli": "bundle exec ruby ./cli/cli.rb" }, "engines": { @@ -31,7 +32,7 @@ "chalk": "^5.3.0", "fastify": "^4.26.2", "progress-estimator": "^0.3.1", - "rammerhead": "https://github.com/Ruby-Network/rammerhead/releases/download/v1/rammerhead-2.tgz", + "rammerhead": "https://github.com/Ruby-Network/rammerhead/releases/download/v1.0.5/rammerhead-1.2.41-ruby.1.tgz", "sass": "^1.71.1", "terser": "^5.29.2", "typescript": "^5.4.2", diff --git a/rammerhead/rh.ts b/rammerhead/rh.ts index 1aa58fa4..46e54500 100644 --- a/rammerhead/rh.ts +++ b/rammerhead/rh.ts @@ -89,10 +89,10 @@ function RammerheadEncode(baseUrl) { } var api = { newsession(callback) { - get("/newsession", callback); + get("/rammer/newsession", callback); }, sessionexists(id, callback) { - get("/sessionexists?id=" + encodeURIComponent(id), function (res) { + get("/rammer/sessionexists?id=" + encodeURIComponent(id), function (res) { if (res === "exists") return callback(true); if (res === "not found") return callback(false); console.log("unexpected response from server. received" + res); @@ -100,7 +100,7 @@ function RammerheadEncode(baseUrl) { }, shuffleDict(id, callback) { console.log("Shuffling", id); - get("/api/shuffleDict?id=" + encodeURIComponent(id), function (res) { + get("/rammer/api/shuffleDict?id=" + encodeURIComponent(id), function (res) { callback(JSON.parse(res)); }); } @@ -168,7 +168,8 @@ function RammerheadEncode(baseUrl) { return new Promise((resolve, reject) => { api.shuffleDict(id, function (shuffleDict) { var shuffler = new StrShuffler(shuffleDict); - ProxyHref = "/" + id + "/" + shuffler.shuffle(baseUrl); + ProxyHref = "/rammer/" + id + "/" + shuffler.shuffle(baseUrl); + console.log(ProxyHref); resolve(ProxyHref); }); }); diff --git a/require.rb b/require.rb index 3f35a11a..2f9a3f22 100644 --- a/require.rb +++ b/require.rb @@ -18,3 +18,4 @@ require './ruby/auth.rb' require './ruby/validator.rb' require './ruby/db.rb' +require './ruby/release.rb' diff --git a/ruby/release.rb b/ruby/release.rb new file mode 100644 index 00000000..0a28c01d --- /dev/null +++ b/ruby/release.rb @@ -0,0 +1,11 @@ +def getLatestRelease() + puts 'Fetching latest release...'.colorize(:yellow) + if ENV['RACK_ENV'] == 'development' + return "dev" + end + res = HTTParty.get('https://api.github.com/repos/Ruby-Network/ruby/releases/latest') + version = JSON.parse(res.body) + puts 'Latest version: ' + version['tag_name'].colorize(:green) + puts 'Latest release fetched.'.colorize(:green) + return version['tag_name'] +end diff --git a/src/public/js/omnibox.js b/src/public/js/omnibox.js index bba6a079..17b94705 100644 --- a/src/public/js/omnibox.js +++ b/src/public/js/omnibox.js @@ -4,7 +4,7 @@ async function omniBox(query) { results = [[], []]; } else { - results = await fetch(`/search=${query}`).then((res) => res.json()).catch((err) => console.log("OmniBox Error ignoring...")); + results = await fetch(`/search/?q=${query}`).then((res) => res.json()).catch((err) => console.log("OmniBox Error ignoring...")); } document.getElementById("omnibox-list").innerHTML = ''; document.getElementById("uv-form").style.marginTop = "120px"; @@ -39,4 +39,4 @@ function resetOmniBox() { document.getElementById("uv-form").style.marginTop = "20px"; document.getElementById("omnibox").setAttribute("class", "dnone"); document.getElementById("omnibox-list").innerHTML = '' -} \ No newline at end of file +} diff --git a/src/public/js/omnibox.js.min.js b/src/public/js/omnibox.js.min.js index ba667b4b..55f81342 100644 --- a/src/public/js/omnibox.js.min.js +++ b/src/public/js/omnibox.js.min.js @@ -1 +1 @@ -async function omniBox(e){let t;t=e.startsWith("http:")||e.startsWith("https:")?[[],[]]:await fetch(`/search=${e}`).then((e=>e.json())).catch((e=>console.log("OmniBox Error ignoring..."))),document.getElementById("omnibox-list").innerHTML="",document.getElementById("uv-form").style.marginTop="120px",document.getElementById("omnibox").removeAttribute("class","dnone");try{await t[1].forEach((e=>{document.getElementById("omnibox-list").innerHTML+=`\n
  • ${e}
  • \n
    \n `}))}catch(e){t=[[],[]]}0==t[1].length&&(document.getElementById("omnibox-list").innerHTML="",document.getElementById("uv-form").style.marginTop="20px",document.getElementById("omnibox").setAttribute("class","dnone"))}function omniBoxSelect(e){document.getElementById("uv-address").value=e,document.getElementById("uv-form").style.marginTop="20px",document.getElementById("omnibox").setAttribute("class","dnone"),document.getElementById("omnibox-list").innerHTML="",document.getElementById("uv-address").focus(),document.getElementById("uv-form").dispatchEvent(new Event("submit"))}function resetOmniBox(){document.getElementById("uv-form").style.marginTop="20px",document.getElementById("omnibox").setAttribute("class","dnone"),document.getElementById("omnibox-list").innerHTML=""} \ No newline at end of file +async function omniBox(e){let t;t=e.startsWith("http:")||e.startsWith("https:")?[[],[]]:await fetch(`/search/?q=${e}`).then((e=>e.json())).catch((e=>console.log("OmniBox Error ignoring..."))),document.getElementById("omnibox-list").innerHTML="",document.getElementById("uv-form").style.marginTop="120px",document.getElementById("omnibox").removeAttribute("class","dnone");try{await t[1].forEach((e=>{document.getElementById("omnibox-list").innerHTML+=`\n
  • ${e}
  • \n
    \n `}))}catch(e){t=[[],[]]}0==t[1].length&&(document.getElementById("omnibox-list").innerHTML="",document.getElementById("uv-form").style.marginTop="20px",document.getElementById("omnibox").setAttribute("class","dnone"))}function omniBoxSelect(e){document.getElementById("uv-address").value=e,document.getElementById("uv-form").style.marginTop="20px",document.getElementById("omnibox").setAttribute("class","dnone"),document.getElementById("omnibox-list").innerHTML="",document.getElementById("uv-address").focus(),document.getElementById("uv-form").dispatchEvent(new Event("submit"))}function resetOmniBox(){document.getElementById("uv-form").style.marginTop="20px",document.getElementById("omnibox").setAttribute("class","dnone"),document.getElementById("omnibox-list").innerHTML=""} \ No newline at end of file diff --git a/src/public/js/rh/rh.js b/src/public/js/rh/rh.js index 8627495b..28529d57 100644 --- a/src/public/js/rh/rh.js +++ b/src/public/js/rh/rh.js @@ -82,10 +82,10 @@ function RammerheadEncode(baseUrl) { } var api = { newsession(callback) { - get("/newsession", callback); + get("/rammer/newsession", callback); }, sessionexists(id, callback) { - get("/sessionexists?id=" + encodeURIComponent(id), function (res) { + get("/rammer/sessionexists?id=" + encodeURIComponent(id), function (res) { if (res === "exists") return callback(true); if (res === "not found") @@ -95,7 +95,7 @@ function RammerheadEncode(baseUrl) { }, shuffleDict(id, callback) { console.log("Shuffling", id); - get("/api/shuffleDict?id=" + encodeURIComponent(id), function (res) { + get("/rammer/api/shuffleDict?id=" + encodeURIComponent(id), function (res) { callback(JSON.parse(res)); }); } @@ -168,7 +168,8 @@ function RammerheadEncode(baseUrl) { return new Promise((resolve, reject) => { api.shuffleDict(id, function (shuffleDict) { var shuffler = new StrShuffler(shuffleDict); - ProxyHref = "/" + id + "/" + shuffler.shuffle(baseUrl); + ProxyHref = "/rammer/" + id + "/" + shuffler.shuffle(baseUrl); + console.log(ProxyHref); resolve(ProxyHref); }); }); diff --git a/src/public/js/rh/rh.js.min.js b/src/public/js/rh/rh.js.min.js index e60f1083..f54e7c73 100644 --- a/src/public/js/rh/rh.js.min.js +++ b/src/public/js/rh/rh.js.min.js @@ -1 +1 @@ -function RammerheadEncode(e){const t=(e,t)=>(e%t+t)%t,n="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~-",r="_rhs";class s{constructor(e=function(){let e="";const t=n.split("");for(;t.length>0;)e+=t.splice(Math.floor(Math.random()*t.length),1)[0];return e}()){this.dictionary=e}shuffle(e){if(e.startsWith(r))return e;let s="";for(let r=0;r=3?(s+=o,s+=e.charAt(++r),s+=e.charAt(++r)):s+=-1===i?o:this.dictionary.charAt(t(i+r,64))}return r+s}unshuffle(e){if(!e.startsWith(r))return e;e=e.slice(4);let s="";for(let r=0;r=3?(s+=o,s+=e.charAt(++r),s+=e.charAt(++r)):s+=-1===i?o:n.charAt(t(i-r,64))}return s}}function o(e,t,n=!1){var r=new XMLHttpRequest;r.open("GET",e,!0),r.send(),r.onerror=function(){n||console.log("Cannot communicate with the server")},r.onload=function(){200===r.status?t(r.responseText):n||console.log('unexpected server response to not match "200". Server says "'+r.responseText+'"')}}var i,a={newsession(e){o("/newsession",e)},sessionexists(e,t){o("/sessionexists?id="+encodeURIComponent(e),(function(e){return"exists"===e?t(!0):"not found"===e?t(!1):void console.log("unexpected response from server. received"+e)}))},shuffleDict(e,t){console.log("Shuffling",e),o("/api/shuffleDict?id="+encodeURIComponent(e),(function(e){t(JSON.parse(e))}))}},c="rammerhead_sessionids",l="rammerhead_default_sessionid",f={get(){var e=localStorage.getItem(c);if(!e)return[];try{var t=JSON.parse(e);if(!Array.isArray(t))throw"getout";return t}catch(e){return[]}},set(e){if(!e||!Array.isArray(e))throw new TypeError("must be array");localStorage.setItem(c,JSON.stringify(e))},getDefault(){var e=localStorage.getItem(l);if(e){var t=f.get();if(t.filter((function(t){return t.id===e})),t.length)return t[0]}return null},setDefault(e){localStorage.setItem(l,e)}};return new Promise((e=>{var t=localStorage.getItem("session-string");a.sessionexists(t,(function(n){n?e(t):(console.log("Session validation failed"),a.newsession((function(t){!function(e){var t=f.get();t.unshift({id:e,createdOn:(new Date).toLocaleString()}),f.set(t)}(t),localStorage.setItem("session-string",t),console.log(t),console.log("^ new id"),e(t)})))}))})).then((t=>new Promise(((n,r)=>{a.shuffleDict(t,(function(r){var o=new s(r);i="/"+t+"/"+o.shuffle(e),n(i)}))}))))} \ No newline at end of file +function RammerheadEncode(e){const t=(e,t)=>(e%t+t)%t,n="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~-",r="_rhs";class o{constructor(e=function(){let e="";const t=n.split("");for(;t.length>0;)e+=t.splice(Math.floor(Math.random()*t.length),1)[0];return e}()){this.dictionary=e}shuffle(e){if(e.startsWith(r))return e;let o="";for(let r=0;r=3?(o+=s,o+=e.charAt(++r),o+=e.charAt(++r)):o+=-1===i?s:this.dictionary.charAt(t(i+r,64))}return r+o}unshuffle(e){if(!e.startsWith(r))return e;e=e.slice(4);let o="";for(let r=0;r=3?(o+=s,o+=e.charAt(++r),o+=e.charAt(++r)):o+=-1===i?s:n.charAt(t(i-r,64))}return o}}function s(e,t,n=!1){var r=new XMLHttpRequest;r.open("GET",e,!0),r.send(),r.onerror=function(){n||console.log("Cannot communicate with the server")},r.onload=function(){200===r.status?t(r.responseText):n||console.log('unexpected server response to not match "200". Server says "'+r.responseText+'"')}}var i,a={newsession(e){s("/rammer/newsession",e)},sessionexists(e,t){s("/rammer/sessionexists?id="+encodeURIComponent(e),(function(e){return"exists"===e?t(!0):"not found"===e?t(!1):void console.log("unexpected response from server. received"+e)}))},shuffleDict(e,t){console.log("Shuffling",e),s("/rammer/api/shuffleDict?id="+encodeURIComponent(e),(function(e){t(JSON.parse(e))}))}},c="rammerhead_sessionids",l="rammerhead_default_sessionid",f={get(){var e=localStorage.getItem(c);if(!e)return[];try{var t=JSON.parse(e);if(!Array.isArray(t))throw"getout";return t}catch(e){return[]}},set(e){if(!e||!Array.isArray(e))throw new TypeError("must be array");localStorage.setItem(c,JSON.stringify(e))},getDefault(){var e=localStorage.getItem(l);if(e){var t=f.get();if(t.filter((function(t){return t.id===e})),t.length)return t[0]}return null},setDefault(e){localStorage.setItem(l,e)}};return new Promise((e=>{var t=localStorage.getItem("session-string");a.sessionexists(t,(function(n){n?e(t):(console.log("Session validation failed"),a.newsession((function(t){!function(e){var t=f.get();t.unshift({id:e,createdOn:(new Date).toLocaleString()}),f.set(t)}(t),localStorage.setItem("session-string",t),console.log(t),console.log("^ new id"),e(t)})))}))})).then((t=>new Promise(((n,r)=>{a.shuffleDict(t,(function(r){var s=new o(r);i="/rammer/"+t+"/"+s.shuffle(e),console.log(i),n(i)}))}))))} \ No newline at end of file diff --git a/src/public/js/settings.js b/src/public/js/settings.js index 36f63263..2a4c7c9a 100644 --- a/src/public/js/settings.js +++ b/src/public/js/settings.js @@ -143,6 +143,7 @@ function reset() { fullScreenChange('page'); setDefaultTransport(); setItems(); + uninstallAllSW(); } function exportSettings() { let title = localStorage.getItem('title'); diff --git a/src/public/js/settings.js.min.js b/src/public/js/settings.js.min.js index da85f3d4..88c3a1fb 100644 --- a/src/public/js/settings.js.min.js +++ b/src/public/js/settings.js.min.js @@ -1 +1 @@ -function bare(e){e.endsWith("/")||(e+="/"),e.startsWith("http://")||e.startsWith("https://")||"/bare/"===e||"/bare"===e||(e="https://"+e),"/bare/"!==e&&"/bare"!==e?fetch(e).then((function(t){if(200!==t.status)return!1;bareChange(e),localStorage.setItem("bare",e)})).catch((function(e){console.log("Fetch Error :-S",e),bareChange("/bare/")})):bareChange(e)}function setTitle(e){localStorage.setItem("title",e),document.title=e}function favicon(e){localStorage.setItem("favicon",e),document.getElementById("favicon").href=e}function theme(e){localStorage.setItem("theme",e),document.documentElement.className=e}function searchSettings(e){localStorage.setItem("searchEngine",e)}function proxyChange(e){const t=function(){localStorage.setItem("proxy",e)},o=function(){setItems()};"dynamic"===e&¬ifyBeta("Dynamic",t,o),"rammerhead"===e?notifyWithConfirm("Rammerhead","is a server based proxy so it MAY run slower, as well as breaking the URL bar of the browser. Are you sure you want to use Rammerhead?",t,o):t()}function aboutBlank(){window.location.replace("https://google.com");const e=window.open();e.document.body.style.margin="0",e.document.body.style.height="100vh";const t=e.document.createElement("iframe");t.style.border="none",t.style.width="100%",t.style.height="100%",t.style.margin="0";const o=window.location.href;t.src=o,e.document.body.appendChild(t)}function jsBLOB(){const e=`\n \n \n \n \n \n \n \n \n \n `;window.location.replace("https://google.com");const t=new Blob([e],{type:"text/html"}),o=URL.createObjectURL(t);window.open(o,"_blank")}function promptCloaking(){promptCloakingNotify(aboutBlank,jsBLOB)}function fullScreenChange(e){localStorage.setItem("fullScreen",e)}function setItems(){let e=document.getElementById("titleInput"),t=document.getElementById("faviconInput"),o=document.getElementById("themeSelect"),a=document.getElementById("searchInput"),n=document.getElementById("proxySelect"),r=document.getElementById("fullscreenSelect"),l=document.getElementById("wispInput"),s=document.getElementById("bareInput"),c=document.getElementById("transportSelect"),i=localStorage.getItem("title"),m=localStorage.getItem("favicon"),g=localStorage.getItem("theme"),p=localStorage.getItem("searchEngine"),u=localStorage.getItem("proxy"),d=localStorage.getItem("fullScreen"),h=localStorage.getItem("wispUrl"),f=localStorage.getItem("bare"),I=localStorage.getItem("transports");e.value=i,t.value=m,o.value=g,a.value=p,n.value=u,r.value=d,l.value=h,s.value=f,c.value=I,bareOrWisp(I),document.documentElement.className=localStorage.getItem("theme"),document.title=i,document.getElementById("favicon").href=m}function reset(){localStorage.clear(),bareChange(window.location.origin+"/bare/"),setTitle("Ruby"),favicon("/favicon.ico"),theme("default"),searchSettings("https://www.google.com/search?q=%s"),proxyChange("uv"),fullScreenChange("page"),setDefaultTransport(),setItems()}function exportSettings(){let e={title:localStorage.getItem("title"),favicon:localStorage.getItem("favicon"),theme:localStorage.getItem("theme"),search:localStorage.getItem("searchEngine"),proxy:localStorage.getItem("proxy"),fullscreen:localStorage.getItem("fullScreen"),bare:localStorage.getItem("bare"),password:localStorage.getItem("password"),transports:localStorage.getItem("transports"),wispUrl:localStorage.getItem("wispUrl")},t=document.createElement("a"),o=new Blob([JSON.stringify(e)],{type:"text/plain"}),a=URL.createObjectURL(o);t.href=a,t.download="ruby_settings.json",t.click(),URL.revokeObjectURL(a),t.remove()}function importSettings(){let e=document.createElement("input");e.type="file",e.accept=".json",e.onchange=function(){let t=e.files[0],o=new FileReader;o.readAsText(t),o.onload=function(){let e=JSON.parse(o.result);localStorage.setItem("title",e.title),localStorage.setItem("favicon",e.favicon),localStorage.setItem("theme",e.theme),localStorage.setItem("searchEngine",e.search),localStorage.setItem("proxy",e.proxy),localStorage.setItem("fullScreen",e.fullscreen),localStorage.setItem("bare",e.bare),localStorage.setItem("password",e.password),localStorage.setItem("transports",e.transports),changeWisp(e.wispUrl),setItems(),console.log("Imported settings"),window.location.reload()}},e.click()}function importExportSettings(){settingsImportExportChoice(exportSettings,importSettings)}function password(){localStorage.getItem("password")?passwordIsThere():passwordPrompt()}function passwordKeybinds(){document.addEventListener("keydown",(function(e){e.altKey&&"l"===e.key&&passwordLock()})),console.log("Password Keybind initalized")}function changeWisp(e){e.startsWith("http://")?e=e.replace("http://","ws://"):e.startsWith("https://")&&(e=e.replace("https://","wss://")),localStorage.setItem("wispUrl",e),setTransports()}function transportChange(e){function t(){const e=localStorage.getItem("transports");setTransports(e),bareOrWisp(e),setItems()}return"epoxy"===e?notifyWithConfirm("Epoxy","is a less stable. Are you sure you want to use Epoxy?",(function(){localStorage.setItem("transports","epoxy"),setTransports("epoxy"),bareOrWisp("epoxy")}),t):"bare"===e?notifyWithConfirm("Bare","is a less secure option then the others. Are you sure you want to use Bare?",(function(){localStorage.setItem("transports","bare"),setTransports("bare"),bareOrWisp("bare")}),t):(localStorage.setItem("transports",e),setTransports(e),void bareOrWisp(e))}function bareOrWisp(e){const t=document.getElementsByClassName("wisp")[0],o=document.getElementsByClassName("bare")[0];"bare"===e?(t.classList.add("dnone"),o.classList.remove("dnone")):(o.classList.add("dnone"),t.classList.remove("dnone"))}function init(){let e=localStorage.getItem("init");null==e||"false"===e?(bareInit(),localStorage.setItem("init",!0),localStorage.setItem("title","Ruby"),localStorage.setItem("favicon","/favicon.ico"),localStorage.setItem("theme","default"),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("transports","libcurl"),localStorage.setItem("wispUrl",("https:"===location.protocol?"wss":"ws")+"://"+location.host+"/wisp/"),setItems()):("false"===localStorage.getItem("unlocked")&&passwordLock(),setItems())}localforage.config({driver:localforage.INDEXEDDB,name:"Ruby",version:1,storeName:"ruby_config",description:"Ruby Config for things in sw"}),init(); \ No newline at end of file +function bare(e){e.endsWith("/")||(e+="/"),e.startsWith("http://")||e.startsWith("https://")||"/bare/"===e||"/bare"===e||(e="https://"+e),"/bare/"!==e&&"/bare"!==e?fetch(e).then((function(t){if(200!==t.status)return!1;bareChange(e),localStorage.setItem("bare",e)})).catch((function(e){console.log("Fetch Error :-S",e),bareChange("/bare/")})):bareChange(e)}function setTitle(e){localStorage.setItem("title",e),document.title=e}function favicon(e){localStorage.setItem("favicon",e),document.getElementById("favicon").href=e}function theme(e){localStorage.setItem("theme",e),document.documentElement.className=e}function searchSettings(e){localStorage.setItem("searchEngine",e)}function proxyChange(e){const t=function(){localStorage.setItem("proxy",e)},o=function(){setItems()};"dynamic"===e&¬ifyBeta("Dynamic",t,o),"rammerhead"===e?notifyWithConfirm("Rammerhead","is a server based proxy so it MAY run slower, as well as breaking the URL bar of the browser. Are you sure you want to use Rammerhead?",t,o):t()}function aboutBlank(){window.location.replace("https://google.com");const e=window.open();e.document.body.style.margin="0",e.document.body.style.height="100vh";const t=e.document.createElement("iframe");t.style.border="none",t.style.width="100%",t.style.height="100%",t.style.margin="0";const o=window.location.href;t.src=o,e.document.body.appendChild(t)}function jsBLOB(){const e=`\n \n \n \n \n \n \n \n \n \n `;window.location.replace("https://google.com");const t=new Blob([e],{type:"text/html"}),o=URL.createObjectURL(t);window.open(o,"_blank")}function promptCloaking(){promptCloakingNotify(aboutBlank,jsBLOB)}function fullScreenChange(e){localStorage.setItem("fullScreen",e)}function setItems(){let e=document.getElementById("titleInput"),t=document.getElementById("faviconInput"),o=document.getElementById("themeSelect"),a=document.getElementById("searchInput"),n=document.getElementById("proxySelect"),r=document.getElementById("fullscreenSelect"),l=document.getElementById("wispInput"),s=document.getElementById("bareInput"),c=document.getElementById("transportSelect"),i=localStorage.getItem("title"),m=localStorage.getItem("favicon"),g=localStorage.getItem("theme"),u=localStorage.getItem("searchEngine"),p=localStorage.getItem("proxy"),d=localStorage.getItem("fullScreen"),h=localStorage.getItem("wispUrl"),f=localStorage.getItem("bare"),I=localStorage.getItem("transports");e.value=i,t.value=m,o.value=g,a.value=u,n.value=p,r.value=d,l.value=h,s.value=f,c.value=I,bareOrWisp(I),document.documentElement.className=localStorage.getItem("theme"),document.title=i,document.getElementById("favicon").href=m}function reset(){localStorage.clear(),bareChange(window.location.origin+"/bare/"),setTitle("Ruby"),favicon("/favicon.ico"),theme("default"),searchSettings("https://www.google.com/search?q=%s"),proxyChange("uv"),fullScreenChange("page"),setDefaultTransport(),setItems(),uninstallAllSW()}function exportSettings(){let e={title:localStorage.getItem("title"),favicon:localStorage.getItem("favicon"),theme:localStorage.getItem("theme"),search:localStorage.getItem("searchEngine"),proxy:localStorage.getItem("proxy"),fullscreen:localStorage.getItem("fullScreen"),bare:localStorage.getItem("bare"),password:localStorage.getItem("password"),transports:localStorage.getItem("transports"),wispUrl:localStorage.getItem("wispUrl")},t=document.createElement("a"),o=new Blob([JSON.stringify(e)],{type:"text/plain"}),a=URL.createObjectURL(o);t.href=a,t.download="ruby_settings.json",t.click(),URL.revokeObjectURL(a),t.remove()}function importSettings(){let e=document.createElement("input");e.type="file",e.accept=".json",e.onchange=function(){let t=e.files[0],o=new FileReader;o.readAsText(t),o.onload=function(){let e=JSON.parse(o.result);localStorage.setItem("title",e.title),localStorage.setItem("favicon",e.favicon),localStorage.setItem("theme",e.theme),localStorage.setItem("searchEngine",e.search),localStorage.setItem("proxy",e.proxy),localStorage.setItem("fullScreen",e.fullscreen),localStorage.setItem("bare",e.bare),localStorage.setItem("password",e.password),localStorage.setItem("transports",e.transports),changeWisp(e.wispUrl),setItems(),console.log("Imported settings"),window.location.reload()}},e.click()}function importExportSettings(){settingsImportExportChoice(exportSettings,importSettings)}function password(){localStorage.getItem("password")?passwordIsThere():passwordPrompt()}function passwordKeybinds(){document.addEventListener("keydown",(function(e){e.altKey&&"l"===e.key&&passwordLock()})),console.log("Password Keybind initalized")}function changeWisp(e){e.startsWith("http://")?e=e.replace("http://","ws://"):e.startsWith("https://")&&(e=e.replace("https://","wss://")),localStorage.setItem("wispUrl",e),setTransports()}function transportChange(e){function t(){const e=localStorage.getItem("transports");setTransports(e),bareOrWisp(e),setItems()}return"epoxy"===e?notifyWithConfirm("Epoxy","is a less stable. Are you sure you want to use Epoxy?",(function(){localStorage.setItem("transports","epoxy"),setTransports("epoxy"),bareOrWisp("epoxy")}),t):"bare"===e?notifyWithConfirm("Bare","is a less secure option then the others. Are you sure you want to use Bare?",(function(){localStorage.setItem("transports","bare"),setTransports("bare"),bareOrWisp("bare")}),t):(localStorage.setItem("transports",e),setTransports(e),void bareOrWisp(e))}function bareOrWisp(e){const t=document.getElementsByClassName("wisp")[0],o=document.getElementsByClassName("bare")[0];"bare"===e?(t.classList.add("dnone"),o.classList.remove("dnone")):(o.classList.add("dnone"),t.classList.remove("dnone"))}function init(){let e=localStorage.getItem("init");null==e||"false"===e?(bareInit(),localStorage.setItem("init",!0),localStorage.setItem("title","Ruby"),localStorage.setItem("favicon","/favicon.ico"),localStorage.setItem("theme","default"),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("transports","libcurl"),localStorage.setItem("wispUrl",("https:"===location.protocol?"wss":"ws")+"://"+location.host+"/wisp/"),setItems()):("false"===localStorage.getItem("unlocked")&&passwordLock(),setItems())}localforage.config({driver:localforage.INDEXEDDB,name:"Ruby",version:1,storeName:"ruby_config",description:"Ruby Config for things in sw"}),init(); \ No newline at end of file diff --git a/src/public/js/updates.js b/src/public/js/updates.js index 1ab735a2..372f6fcd 100644 --- a/src/public/js/updates.js +++ b/src/public/js/updates.js @@ -1,15 +1,13 @@ //This file is here to handle updated of the website. function getLatestRelease() { - let xhr = new XMLHttpRequest(); - xhr.open('GET', '/version', false); - xhr.send(); - let textResp = xhr.responseText; - return JSON.parse(textResp) -} -const userVersion = localStorage.getItem('version'); -let latestRelease = getLatestRelease(); -if (userVersion != latestRelease.version || userVersion == null || userVersion == undefined) { - localStorage.setItem('updated', true); - localStorage.setItem('version', latestRelease.version); - uninstallAllSW(); + fetch('/version/').then((res) => res.json()).then((data) => { + const userVersion = localStorage.getItem('version'); + if (userVersion != data.version || userVersion == null || userVersion == undefined) { + localStorage.setItem('updated', true); + localStorage.setItem('version', data.version); + uninstallAllSW(); + } + }); } + +getLatestRelease(); diff --git a/src/public/js/updates.js.min.js b/src/public/js/updates.js.min.js index 3369a5e6..bfb31d9a 100644 --- a/src/public/js/updates.js.min.js +++ b/src/public/js/updates.js.min.js @@ -1 +1 @@ -function getLatestRelease(){let e=new XMLHttpRequest;e.open("GET","/version",!1),e.send();let t=e.responseText;return JSON.parse(t)}const userVersion=localStorage.getItem("version");let latestRelease=getLatestRelease();userVersion==latestRelease.version&&null!=userVersion&&null!=userVersion||(localStorage.setItem("updated",!0),localStorage.setItem("version",latestRelease.version),uninstallAllSW()); \ No newline at end of file +function getLatestRelease(){fetch("/version/").then((e=>e.json())).then((e=>{const t=localStorage.getItem("version");t==e.version&&null!=t&&null!=t||(localStorage.setItem("updated",!0),localStorage.setItem("version",e.version),uninstallAllSW())}))}getLatestRelease(); \ No newline at end of file