Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

new version of host #1

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/bundle.yml
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
.env
deno.lock
/apps
/apps

/local_test
22 changes: 0 additions & 22 deletions git.js

This file was deleted.

4 changes: 0 additions & 4 deletions serve.bash

This file was deleted.

26 changes: 0 additions & 26 deletions src/acme.js

This file was deleted.

113 changes: 58 additions & 55 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,44 +1,52 @@
import "https://deno.land/[email protected]/dotenv/load.ts";
import { serve, serveTls } from "https://deno.land/[email protected]/http/server.ts";
import middleware from "https://deno.land/x/[email protected]/index.js";
import { Octokit } from "npm:octokit";
import { readerFromStreamReader } from "https://deno.land/std/streams/mod.ts";
import { serveFile } from "https://deno.land/[email protected]/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 = {
Expand Down Expand Up @@ -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));
})
9 changes: 9 additions & 0 deletions src/worker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { tgz } from "https://deno.land/x/[email protected]/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");
};