From 84a2092fc5e95a2f5c698fbe394d8f2b85011a28 Mon Sep 17 00:00:00 2001 From: rawk akani Date: Wed, 12 Jul 2023 22:01:47 +0200 Subject: [PATCH] new version of host --- .github/workflows/bundle.yml | 6 +- .gitignore | 4 +- git.js | 22 ------- serve.bash | 4 -- src/acme.js | 26 -------- src/index.js | 113 ++++++++++++++++++----------------- src/worker.js | 9 +++ 7 files changed, 75 insertions(+), 109 deletions(-) delete mode 100644 git.js delete mode 100755 serve.bash delete mode 100644 src/acme.js create mode 100644 src/worker.js diff --git a/.github/workflows/bundle.yml b/.github/workflows/bundle.yml index 7735102..67b447f 100644 --- a/.github/workflows/bundle.yml +++ b/.github/workflows/bundle.yml @@ -1,5 +1,9 @@ +#https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions name: Bundle host -on: [push] +on: + push: + branches: + - main jobs: test: diff --git a/.gitignore b/.gitignore index b83b62d..56acf97 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .env deno.lock -/apps \ No newline at end of file +/apps + +/local_test \ No newline at end of file diff --git a/git.js b/git.js deleted file mode 100644 index ea02a50..0000000 --- a/git.js +++ /dev/null @@ -1,22 +0,0 @@ -self.onmessage = async (e) => { - console.log("new git process starting"); - - try { - const { host, isDev } = e.data; - console.log(host, Deno.cwd(), `${isDev ? "./" : "/apps/home/"}${host}`); - const cmd = [ - `${isDev ? "./space/" : "/apps/space/"}serve.bash`, - `${isDev ? "./" : "/apps/home/"}${host}`, - ]; - // create subprocess - - const p = Deno.run({ cmd }); - - // await its completion - await p.status(); - - self.close(); - } catch (err) { - console.log(err); - } -}; diff --git a/serve.bash b/serve.bash deleted file mode 100755 index a05df52..0000000 --- a/serve.bash +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - - -cd $1 && git pull origin main diff --git a/src/acme.js b/src/acme.js deleted file mode 100644 index 40221c8..0000000 --- a/src/acme.js +++ /dev/null @@ -1,26 +0,0 @@ -import "https://deno.land/std@0.170.0/dotenv/load.ts"; -import { serve } from "https://deno.land/std@0.170.0/http/server.ts"; -import { serveFile } from "https://deno.land/std@0.170.0/http/file_server.ts"; - -const isDev = Deno.env.get("env") === "dev"; -const port = isDev ? 9000 : 80; - -const service = async (req, info) => { - const { pathname } = new URL(req.url); - - console.log(req); - const host = req.headers.get("host"); - - if (pathname.includes(".well-known")) { - return serveFile(req, `/apps${pathname}`); - } else { - return new Response(null, { - status: 301, - headers: { - Location: `https://${host.replace("www.", "")}${pathname}`, - }, - }); - } -}; - -serve(service, { port }); diff --git a/src/index.js b/src/index.js index 428dc92..e0c8c44 100644 --- a/src/index.js +++ b/src/index.js @@ -1,44 +1,52 @@ import "https://deno.land/std@0.170.0/dotenv/load.ts"; -import { serve, serveTls } from "https://deno.land/std@0.170.0/http/server.ts"; import middleware from "https://deno.land/x/sauveur@0.1.5/index.js"; import { Octokit } from "npm:octokit"; import { readerFromStreamReader } from "https://deno.land/std/streams/mod.ts"; +import { serveFile } from "https://deno.land/std@0.170.0/http/file_server.ts"; + +const deploy = async (reader,name) => { + let time = 0; + const appPath = `/deploy/${name}.tar.gz` +// to be able to test locally will move this to env variables when stable +// const appPath = `./deploy/${name}.tar.gz` + const intervalID = setInterval(() => time += 1); + const f = await Deno.open(appPath, { + create: true, + write: true, + }); + await Deno.copy(readerFromStreamReader(reader), f); + await f.close(); + + const deployWorker = new Worker( + new URL("./worker.js", import.meta.url).href, + { type: "module" }, + ); + deployWorker.postMessage({ path: appPath }); -// Deno.env.get("env") === "dev" ? localStorage.setItem('dev',true) : '' + clearInterval(intervalID); + return time; +}; -// localStorage.clear() +const decoder = new TextDecoder("utf-8"); -// const isDev = localStorage.getItem('dev') -const port = Deno.env.get("env") === "dev" ? 9090 : 443; -const certFile = Deno.env.get("CERT"); -const keyFile = Deno.env.get("KEY"); +const port = Deno.env.get("env") === "dev" ? 9091 : 443; +const cert = decoder.decode(await Deno.readFile(Deno.env.get("CERT"))); +const key = decoder.decode(await Deno.readFile(Deno.env.get("KEY"))); const options = { port, - certFile, - keyFile, - alpnProtocols: ["h2", "http/1.1"], -}; + key, + cert, +}; // new Worker(new URL("./job.js", import.meta.url).href, { type: "module" }); -// const dev_domains = ["space.sauveur.xyz", "localhost:9001"]; +const special_domains = ["sauveur.cloud", "sauveur.shop"]; const service = async (req, info) => { const { pathname, hostname, username, hash, search, searchParams } = new URL( req.url, ); - // const uri = `${req.headers.get('referer') ? req.headers.get('referer') : `https://${req.headers.get("host")}`}${pathname}` - // const {pathname:newPathname} = new URL(uri) - // - // const pathnameArray = newPathname.replace('/','').split('/') - // window._cwd = `/apps/${pathnameArray.shift()}` - // console.log(window._cwd) - - // if(pathname === '/_log' && searchParams.get("secret")){ - // return Response.json(get_log()) - // } - if (pathname === "/octo" && req.method === "POST") { let data = await req.json(); const deployMeta = { @@ -112,50 +120,45 @@ const service = async (req, info) => { return new Response("A new dawn is upon us"); } + if (pathname === "/deploy" && req.method === "POST") { + console.time("saving file"); + const reader = req?.body?.getReader(); + const deployResp = await deploy(reader, searchParams.get('name')); + console.timeEnd("saving file"); + console.log(deployResp, "ms"); + return new Response("deployed"); + } + try { window._cwd = `/apps/${req.headers.get("host")}`; console.log(window._cwd); return middleware(req, info); } catch (err) { - console.log(err); - // dispatchEvent(new CustomEvent('log',{detail:{host,msg:err.message, err}})) - window.dispatchLog({ msg: err.message, err }); + + return new Response( "Happy new year, Wishing you success in achievement of your resolutions", ); } }; -const logger = (e) => { - let logs = get_log(); - - if (logs[window._host]) { - logs[window._host].push(e.detail); - } else { - logs[window._host] = [e.detail]; - } +Deno.env.get("env") === "dev" ? Deno.serve(service) : Deno.serve(options, service); - localStorage.setItem(window._host, JSON.stringify(logs)); - console.log("logged to ->", window._host); -}; +//ACME service +Deno.serve({port:Deno.env.get("env") === "dev" ? 9003 : 80},(req) => { + const { pathname } = new URL(req.url); -const get_log = () => { - try { - const data = JSON.parse(localStorage.getItem(window._host)); + console.log(req); + const host = req.headers.get("host"); - return data ? data : {}; - } catch { - return {}; + if (pathname.includes(".well-known")) { + return serveFile(req, `/apps${pathname}`); + } else { + return new Response(null, { + status: 301, + headers: { + Location: `https://${host.replace("www.", "")}${pathname}`, + }, + }); } -}; - -addEventListener("log", (e) => logger(e)); - -// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent -window.dispatchLog = (data) => - dispatchEvent(new CustomEvent("log", { detail: data })); - -await serveTls(service, options); - -//we will test this again when we have certs -//Deno.serve({ port }, (_req, _info) => service(_req,_info)); +}) diff --git a/src/worker.js b/src/worker.js new file mode 100644 index 0000000..83d4542 --- /dev/null +++ b/src/worker.js @@ -0,0 +1,9 @@ +import { tgz } from "https://deno.land/x/compress@v0.4.4/mod.ts"; + +self.onmessage = async (evt) => { + console.log(evt.data); + const path = evt.data.path; + await tgz.uncompress(path, "/apps"); +// for when testing locally will be moved to env variables when stable +// await tgz.uncompress(path, "./apps"); +};