start work to upgrade alu to bare mux 2.0

This commit is contained in:
Percs 2024-07-11 01:55:11 -05:00
parent 118d62f392
commit 62b9925767
11 changed files with 1995 additions and 2670 deletions

View file

@ -1,6 +1,8 @@
import { uvPath } from "@titaniumnetwork-dev/ultraviolet"; import { uvPath } from "@titaniumnetwork-dev/ultraviolet";
import { epoxyPath } from "@mercuryworkshop/epoxy-transport"; import { epoxyPath } from "@mercuryworkshop/epoxy-transport";
import { libcurlPath } from "@mercuryworkshop/libcurl-transport"; import { libcurlPath } from "@mercuryworkshop/libcurl-transport";
import { baremuxPath } from "@mercuryworkshop/bare-mux/node";
import { bareModulePath } from "@mercuryworkshop/bare-as-module3";
import { createBareServer } from "@tomphttp/bare-server-node"; import { createBareServer } from "@tomphttp/bare-server-node";
import express from "express"; import express from "express";
import { createServer } from "http"; import { createServer } from "http";
@ -65,6 +67,8 @@ app.use(express.static(path.join(process.cwd(), "build")));
app.use("/uv/", express.static(uvPath)); app.use("/uv/", express.static(uvPath));
app.use("/epoxy/", express.static(epoxyPath)); app.use("/epoxy/", express.static(epoxyPath));
app.use("/libcurl/", express.static(libcurlPath)); app.use("/libcurl/", express.static(libcurlPath));
app.use("/baremux/", express.static(baremuxPath));
app.use("/baremod/", express.static(bareModulePath));
app.use(express.json()); app.use(express.json());
app.use( app.use(
@ -86,9 +90,7 @@ app.use("/custom-favicon", async (req, res) => {
const buffer = new Buffer.from(await response.arrayBuffer()); const buffer = new Buffer.from(await response.arrayBuffer());
res.set("Content-Type", "image/png"); res.set("Content-Type", "image/png");
res.send(buffer); res.send(buffer);
} catch { } catch {}
}
}); });
app.use("/", express.static("dist/client/")); app.use("/", express.static("dist/client/"));
app.get("/favicon.ico", (req, res) => { app.get("/favicon.ico", (req, res) => {

3540
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -13,10 +13,11 @@
"dependencies": { "dependencies": {
"@astrojs/node": "^8.2.5", "@astrojs/node": "^8.2.5",
"@astrojs/sitemap": "^3.1.4", "@astrojs/sitemap": "^3.1.4",
"@mercuryworkshop/bare-mux": "^1.0.9", "@mercuryworkshop/bare-mux": "^2.0.1",
"@mercuryworkshop/epoxy-transport": "^1.1.0", "@mercuryworkshop/epoxy-transport": "^2.1.2",
"@mercuryworkshop/libcurl-transport": "^1.3.1", "@mercuryworkshop/libcurl-transport": "^1.3.2",
"@titaniumnetwork-dev/ultraviolet": "^3.1.0", "@mercuryworkshop/bare-as-module3": "^2.2.2",
"@titaniumnetwork-dev/ultraviolet": "^3.2.1",
"@tomphttp/bare-server-node": "^2.0.3", "@tomphttp/bare-server-node": "^2.0.3",
"astro": "^4.7.0", "astro": "^4.7.0",
"chalk": "^5.3.0", "chalk": "^5.3.0",
@ -27,7 +28,7 @@
"node-fetch": "^3.3.2", "node-fetch": "^3.3.2",
"notyf": "^3.10.0", "notyf": "^3.10.0",
"rammerhead": "https://github.com/NebulaServices/rammerhead/releases/download/rammerhead-1.2.41-nebula.8/rammerhead-1.2.41-nebula.7.tgz", "rammerhead": "https://github.com/NebulaServices/rammerhead/releases/download/rammerhead-1.2.41-nebula.8/rammerhead-1.2.41-nebula.7.tgz",
"wisp-server-node": "^1.0.6" "wisp-server-node": "^1.1.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/eslint-parser": "^7.24.1", "@babel/eslint-parser": "^7.24.1",

View file

@ -1,589 +0,0 @@
//Built from: https://github.com/motortruck1221/bare-as-module3 (commit: 36759f801e0009027878edecff156408b06404c6)
(function (global, factory) {
typeof exports === "object" && typeof module !== "undefined"
? factory(exports)
: typeof define === "function" && define.amd
? define(["exports"], factory)
: ((global = typeof globalThis !== "undefined" ? globalThis : global || self),
factory((global.BareMod = {})));
})(this, function (exports) {
"use strict";
// The user likely has overwritten all networking functions after importing bare-client
// It is our responsibility to make sure components of Bare-Client are using native networking functions
// These exports are provided to plugins by @rollup/plugin-inject
const fetch = globalThis.fetch;
const WebSocket = globalThis.WebSocket;
const WebSocketFields = {
prototype: {
send: WebSocket.prototype.send,
},
CLOSED: WebSocket.CLOSED,
CLOSING: WebSocket.CLOSING,
CONNECTING: WebSocket.CONNECTING,
OPEN: WebSocket.OPEN,
};
class BareError extends Error {
status;
body;
constructor(status, body) {
super(body.message || body.code);
this.status = status;
this.body = body;
}
}
class Client {
base;
/**
*
* @param version Version provided by extension
* @param server Bare Server URL provided by BareClient
*/
constructor(version, server) {
this.base = new URL(`./v${version}/`, server);
}
}
/*
* JavaScript MD5
* Adopted from https://github.com/blueimp/JavaScript-MD5
*
* Copyright 2011, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*
* Based on
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for more info.
*/
/**
* Add integers, wrapping at 2^32.
* This uses 16-bit operations internally to work around bugs in interpreters.
*
* @param x First integer
* @param y Second integer
* @returns Sum
*/
function safeAdd(x, y) {
const lsw = (x & 0xffff) + (y & 0xffff);
const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xffff);
}
/**
* Bitwise rotate a 32-bit number to the left.
*
* @param num 32-bit number
* @param cnt Rotation count
* @returns Rotated number
*/
function bitRotateLeft(num, cnt) {
return (num << cnt) | (num >>> (32 - cnt));
}
/**
* Basic operation the algorithm uses.
*
* @param q q
* @param a a
* @param b b
* @param x x
* @param s s
* @param t t
* @returns Result
*/
function md5cmn(q, a, b, x, s, t) {
return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}
/**
* Basic operation the algorithm uses.
*
* @param a a
* @param b b
* @param c c
* @param d d
* @param x x
* @param s s
* @param t t
* @returns Result
*/
function md5ff(a, b, c, d, x, s, t) {
return md5cmn((b & c) | (~b & d), a, b, x, s, t);
}
/**
* Basic operation the algorithm uses.
*
* @param a a
* @param b b
* @param c c
* @param d d
* @param x x
* @param s s
* @param t t
* @returns Result
*/
function md5gg(a, b, c, d, x, s, t) {
return md5cmn((b & d) | (c & ~d), a, b, x, s, t);
}
/**
* Basic operation the algorithm uses.
*
* @param a a
* @param b b
* @param c c
* @param d d
* @param x x
* @param s s
* @param t t
* @returns Result
*/
function md5hh(a, b, c, d, x, s, t) {
return md5cmn(b ^ c ^ d, a, b, x, s, t);
}
/**
* Basic operation the algorithm uses.
*
* @param a a
* @param b b
* @param c c
* @param d d
* @param x x
* @param s s
* @param t t
* @returns Result
*/
function md5ii(a, b, c, d, x, s, t) {
return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}
/**
* Calculate the MD5 of an array of little-endian words, and a bit length.
*
* @param x Array of little-endian words
* @param len Bit length
* @returns MD5 Array
*/
function binlMD5(x, len) {
/* append padding */
x[len >> 5] |= 0x80 << len % 32;
x[(((len + 64) >>> 9) << 4) + 14] = len;
let a = 1732584193;
let b = -271733879;
let c = -1732584194;
let d = 271733878;
for (let i = 0; i < x.length; i += 16) {
const olda = a;
const oldb = b;
const oldc = c;
const oldd = d;
a = md5ff(a, b, c, d, x[i], 7, -680876936);
d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
b = md5gg(b, c, d, a, x[i], 20, -373897302);
a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
d = md5hh(d, a, b, c, x[i], 11, -358537222);
c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
a = md5ii(a, b, c, d, x[i], 6, -198630844);
d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
a = safeAdd(a, olda);
b = safeAdd(b, oldb);
c = safeAdd(c, oldc);
d = safeAdd(d, oldd);
}
return [a, b, c, d];
}
/**
* Convert an array of little-endian words to a string
*
* @param input MD5 Array
* @returns MD5 string
*/
function binl2rstr(input) {
let output = "";
const length32 = input.length * 32;
for (let i = 0; i < length32; i += 8) {
output += String.fromCharCode((input[i >> 5] >>> i % 32) & 0xff);
}
return output;
}
/**
* Convert a raw string to an array of little-endian words
* Characters >255 have their high-byte silently ignored.
*
* @param input Raw input string
* @returns Array of little-endian words
*/
function rstr2binl(input) {
const output = [];
const outputLen = input.length >> 2;
for (let i = 0; i < outputLen; i += 1) {
output[i] = 0;
}
const length8 = input.length * 8;
for (let i = 0; i < length8; i += 8) {
output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32;
}
return output;
}
/**
* Calculate the MD5 of a raw string
*
* @param s Input string
* @returns Raw MD5 string
*/
function rstrMD5(s) {
return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));
}
/**
* Calculates the HMAC-MD5 of a key and some data (raw strings)
*
* @param key HMAC key
* @param data Raw input string
* @returns Raw MD5 string
*/
function rstrHMACMD5(key, data) {
let bkey = rstr2binl(key);
const ipad = [];
const opad = [];
if (bkey.length > 16) {
bkey = binlMD5(bkey, key.length * 8);
}
for (let i = 0; i < 16; i += 1) {
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5c5c5c5c;
}
const hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));
}
/**
* Convert a raw string to a hex string
*
* @param input Raw input string
* @returns Hex encoded string
*/
function rstr2hex(input) {
const hexTab = "0123456789abcdef";
let output = "";
for (let i = 0; i < input.length; i += 1) {
const x = input.charCodeAt(i);
output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);
}
return output;
}
/**
* Encode a string as UTF-8
*
* @param input Input string
* @returns UTF8 string
*/
function str2rstrUTF8(input) {
return unescape(encodeURIComponent(input));
}
/**
* Encodes input string as raw MD5 string
*
* @param s Input string
* @returns Raw MD5 string
*/
function rawMD5(s) {
return rstrMD5(str2rstrUTF8(s));
}
/**
* Encodes input string as Hex encoded string
*
* @param s Input string
* @returns Hex encoded string
*/
function hexMD5(s) {
return rstr2hex(rawMD5(s));
}
/**
* Calculates the raw HMAC-MD5 for the given key and data
*
* @param k HMAC key
* @param d Input string
* @returns Raw MD5 string
*/
function rawHMACMD5(k, d) {
return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));
}
/**
* Calculates the Hex encoded HMAC-MD5 for the given key and data
*
* @param k HMAC key
* @param d Input string
* @returns Raw MD5 string
*/
function hexHMACMD5(k, d) {
return rstr2hex(rawHMACMD5(k, d));
}
/**
* Calculates MD5 value for a given string.
* If a key is provided, calculates the HMAC-MD5 value.
* Returns a Hex encoded string unless the raw argument is given.
*
* @param string Input string
* @param key HMAC key
* @param raw Raw output switch
* @returns MD5 output
*/
function md5(string, key, raw) {
if (!key) {
if (!raw) {
return hexMD5(string);
}
return rawMD5(string);
}
if (!raw) {
return hexHMACMD5(key, string);
}
return rawHMACMD5(key, string);
}
const MAX_HEADER_VALUE = 3072;
/**
*
* Splits headers according to spec
* @param headers
* @returns Split headers
*/
function splitHeaders(headers) {
const output = new Headers(headers);
if (headers.has("x-bare-headers")) {
const value = headers.get("x-bare-headers");
if (value.length > MAX_HEADER_VALUE) {
output.delete("x-bare-headers");
let split = 0;
for (let i = 0; i < value.length; i += MAX_HEADER_VALUE) {
const part = value.slice(i, i + MAX_HEADER_VALUE);
const id = split++;
output.set(`x-bare-headers-${id}`, `;${part}`);
}
}
}
return output;
}
/**
* Joins headers according to spec
* @param headers
* @returns Joined headers
*/
function joinHeaders(headers) {
const output = new Headers(headers);
const prefix = "x-bare-headers";
if (headers.has(`${prefix}-0`)) {
const join = [];
for (const [header, value] of headers) {
if (!header.startsWith(prefix)) {
continue;
}
if (!value.startsWith(";")) {
throw new BareError(400, {
code: "INVALID_BARE_HEADER",
id: `request.headers.${header}`,
message: `Value didn't begin with semi-colon.`,
});
}
const id = parseInt(header.slice(prefix.length + 1));
join[id] = value.slice(1);
output.delete(header);
}
output.set(prefix, join.join(""));
}
return output;
}
class ClientV3 extends Client {
ws;
http;
meta() {
return {};
}
constructor(server) {
super(3, server);
this.ws = new URL(this.base);
this.http = new URL(this.base);
if (this.ws.protocol === "https:") {
this.ws.protocol = "wss:";
} else {
this.ws.protocol = "ws:";
}
}
ready = true;
async init() {
this.ready = true;
}
connect(url, origin, protocols, requestHeaders, onopen, onmessage, onclose, onerror) {
const ws = new WebSocket(this.ws);
const cleanup = () => {
ws.removeEventListener("close", closeListener);
ws.removeEventListener("message", messageListener);
};
const closeListener = () => {
cleanup();
};
const messageListener = (event) => {
cleanup();
// ws.binaryType is irrelevant when sending text
if (typeof event.data !== "string")
throw new TypeError("the first websocket message was not a text frame");
const message = JSON.parse(event.data);
// finally
if (message.type !== "open") throw new TypeError("message was not of open type");
// onMeta({
// protocol: message.protocol,
// setCookies: message.setCookies,
// });
onopen(message.protocol);
// TODO
ws.addEventListener("message", (ev) => {
onmessage(ev.data);
});
};
ws.addEventListener("close", closeListener);
ws.addEventListener("message", messageListener);
// CONNECTED TO THE BARE SERVER, NOT THE REMOTE
ws.addEventListener(
"open",
(event) => {
// getRequestHeaders().then((headers:any) =>
WebSocketFields.prototype.send.call(
ws,
JSON.stringify({
type: "connect",
remote: url.toString(),
protocols,
headers: requestHeaders,
forwardHeaders: [],
})
);
// );
},
// only block the open event once
{ once: true }
);
return ws.send.bind(ws);
}
async request(remote, method, body, headers, signal) {
const options = {
credentials: "omit",
method: method,
signal,
};
if (body !== undefined) {
options.body = body;
}
options.headers = this.createBareHeaders(remote, headers);
const response = await fetch(this.http + "?cache=" + md5(remote.toString()), options);
const readResponse = await this.readBareResponse(response);
// const result: Response & Partial<BareResponse> = new Response(
// statusEmpty.includes(readResponse.status!) ? undefined : response.body,
// {
// status: readResponse.status,
// statusText: readResponse.statusText ?? undefined,
// headers: new Headers(readResponse.headers as HeadersInit),
// }
// );
//
// result.rawHeaders = readResponse.headers;
// result.rawResponse = response;
return {
body: response.body,
headers: readResponse.headers,
status: readResponse.status,
statusText: readResponse.statusText,
};
}
async readBareResponse(response) {
if (!response.ok) {
throw new BareError(response.status, await response.json());
}
const responseHeaders = joinHeaders(response.headers);
const result = {};
const xBareStatus = responseHeaders.get("x-bare-status");
if (xBareStatus !== null) result.status = parseInt(xBareStatus);
const xBareStatusText = responseHeaders.get("x-bare-status-text");
if (xBareStatusText !== null) result.statusText = xBareStatusText;
const xBareHeaders = responseHeaders.get("x-bare-headers");
if (xBareHeaders !== null) result.headers = JSON.parse(xBareHeaders);
return result;
}
createBareHeaders(remote, bareHeaders, forwardHeaders = [], passHeaders = [], passStatus = []) {
const headers = new Headers();
headers.set("x-bare-url", remote.toString());
headers.set("x-bare-headers", JSON.stringify(bareHeaders));
for (const header of forwardHeaders) {
headers.append("x-bare-forward-headers", header);
}
for (const header of passHeaders) {
headers.append("x-bare-pass-headers", header);
}
for (const status of passStatus) {
headers.append("x-bare-pass-status", status.toString());
}
splitHeaders(headers);
return headers;
}
}
exports.BareClient = ClientV3;
});

View file

@ -1,6 +1,3 @@
importScripts("/libcurl/index.js");
importScripts("/epoxy/index.js");
importScripts("/bare_transport.js");
importScripts("/uv/uv.bundle.js"); importScripts("/uv/uv.bundle.js");
importScripts("/uv.config.js"); importScripts("/uv.config.js");
importScripts(__uv$config.sw); importScripts(__uv$config.sw);

View file

@ -1,7 +1,6 @@
/*global Ultraviolet*/ /*global Ultraviolet*/
self.__uv$config = { self.__uv$config = {
prefix: "/service/", prefix: "/service/",
bare: "/bare/",
encodeUrl: Ultraviolet.codec.xor.encode, encodeUrl: Ultraviolet.codec.xor.encode,
decodeUrl: Ultraviolet.codec.xor.decode, decodeUrl: Ultraviolet.codec.xor.decode,
handler: "/uv/uv.handler.js", handler: "/uv/uv.handler.js",

View file

@ -1,5 +1,5 @@
<script> <script>
import { TransportMgr, initTransport, loadSelectedTransportScript } from "./ts/TransportManager"; import { TransportMgr, initTransport } from "./ts/TransportManager";
import "notyf/notyf.min.css"; import "notyf/notyf.min.css";
import { Notyf } from "notyf"; import { Notyf } from "notyf";
@ -48,9 +48,7 @@
} }
function getUVProxyURL(frame: HTMLIFrameElement) { function getUVProxyURL(frame: HTMLIFrameElement) {
return window.__uv$config.decodeUrl( return window.__uv$config.decodeUrl(frame.contentWindow!.location.href.split("/service/")[1]);
frame.contentWindow!.location.href.split("/service/")[1]
)
} }
async function loadContent() { async function loadContent() {
@ -209,9 +207,7 @@
input!.value.trim() input!.value.trim()
); );
} else { } else {
navigator.clipboard.writeText( navigator.clipboard.writeText(getUVProxyURL(proxyFrame));
getUVProxyURL(proxyFrame)
);
} }
new Notyf({ new Notyf({
duration: 2000, duration: 2000,
@ -227,14 +223,12 @@
async function formEventListener(event: Event) { async function formEventListener(event: Event) {
event.preventDefault(); event.preventDefault();
event.stopImmediatePropagation(); event.stopImmediatePropagation();
await loadSelectedTransportScript(); await TransportMgr.updateTransport();
TransportMgr.updateTransport();
setTimeout(() => { setTimeout(() => {
loadContent(); loadContent();
}, 200); }, 200);
} }
window.loadFormContent = loadContent; window.loadFormContent = loadContent;
window.loadSelectedTransport = loadSelectedTransportScript;
function isUrl(val = "") { function isUrl(val = "") {
if (/^http(s?):\/\//.test(val) || (val.includes(".") && val.substr(0, 1) !== " ")) return true; if (/^http(s?):\/\//.test(val) || (val.includes(".") && val.substr(0, 1) !== " ")) return true;

View file

@ -25,9 +25,9 @@ const openPageWith = [
]; ];
const transportsList = [ const transportsList = [
{ name: "Epoxy", value: "EpxMod.EpoxyClient" }, { name: "Epoxy", value: "/epoxy/index.mjs" },
{ name: "Libcurl", value: "CurlMod.LibcurlClient" }, { name: "Libcurl", value: "/libcurl/index.mjs" },
{ name: "Bare", value: "BareMod.BareClient" }, { name: "Bare", value: "/bare/index.mjs" },
]; ];
--- ---

View file

@ -1,6 +1,6 @@
// @ts-ignore // @ts-ignore
// For some reason, VSCode can't find the bare-mux package. It exists and compiling works, but vscode throws a fit. // For some reason, VSCode can't find the bare-mux package. It exists and compiling works, but vscode throws a fit.
import { SetTransport, registerRemoteListener } from "@mercuryworkshop/bare-mux"; import { BareMuxConnection } from "@mercuryworkshop/bare-mux";
// @ts-check // @ts-check
declare global { declare global {
interface Window { interface Window {
@ -24,9 +24,11 @@ type transportConfig =
export const wispURLDefault = export const wispURLDefault =
(location.protocol === "https:" ? "wss://" : "ws://") + location.host + "/wisp/"; (location.protocol === "https:" ? "wss://" : "ws://") + location.host + "/wisp/";
export default class TransportManager { export default class TransportManager {
connection: BareMuxConnection;
private transport = "EpxMod.EpoxyClient"; private transport = "EpxMod.EpoxyClient";
constructor(transport?: string) { constructor(transport?: string) {
this.connection = new BareMuxConnection("/baremux/worker.js");
if (transport) { if (transport) {
this.transport = transport; this.transport = transport;
} }
@ -38,10 +40,10 @@ export default class TransportManager {
localStorage.setItem("alu__selectedTransport", JSON.stringify({ value: this.transport })); localStorage.setItem("alu__selectedTransport", JSON.stringify({ value: this.transport }));
} }
} }
updateTransport() { async updateTransport() {
try { try {
this.setTransport(JSON.parse(localStorage.getItem("alu__selectedTransport")!).value);
console.log(this.transport); console.log(this.transport);
await this.setTransport(JSON.parse(localStorage.getItem("alu__selectedTransport")!).value);
} catch { } catch {
console.log("Failed to update transport! Falling back to old transport."); console.log("Failed to update transport! Falling back to old transport.");
this.setTransport(this.transport); this.setTransport(this.transport);
@ -52,24 +54,21 @@ export default class TransportManager {
return this.transport; return this.transport;
} }
setTransport(transport: string, wispURL = wispURLDefault) { async setTransport(transport: string, wispURL = wispURLDefault) {
this.transport = transport; this.transport = transport;
let transportConfig: transportConfig = { wisp: wispURL }; let transportConfig: transportConfig = { wisp: wispURL };
if (this.transport == "BareMod.BareClient") { if (this.transport == "/baremod/index.mjs") {
transportConfig = localStorage.getItem("alu__bareUrl") || window.location.origin + "/bare/"; transportConfig = localStorage.getItem("alu__bareUrl") || window.location.origin + "/bare/";
} }
SetTransport(this.transport, transportConfig); await this.connection.setTransport(transport, [transportConfig]);
} }
} }
export const TransportMgr = new TransportManager(); export const TransportMgr = new TransportManager();
export async function registerSW() { export async function registerSW() {
navigator.serviceWorker.ready.then(async (sw) => {
await registerRemoteListener(sw.active!);
});
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
await navigator.serviceWorker.register("/sw.js").then((registration) => { await navigator.serviceWorker.register("/sw.js").then((registration) => {
registration.update().then(() => { registration.update().then(() => {
@ -81,52 +80,8 @@ export async function registerSW() {
} }
export async function initTransport() { export async function initTransport() {
await registerRemoteListener(navigator.serviceWorker.controller!);
TransportMgr.setTransport( TransportMgr.setTransport(
TransportMgr.getTransport(), TransportMgr.getTransport(),
localStorage.getItem("alu__wispUrl") || wispURLDefault localStorage.getItem("alu__wispUrl") || wispURLDefault
); );
} }
export async function loadSelectedTransportScript(): Promise<void> {
return new Promise((resolve) => {
let selectedTransport = localStorage.getItem("alu__selectedTransport");
if (!selectedTransport) {
localStorage.setItem("alu__selectedTransport", JSON.stringify({ value: "uv" }));
return;
}
let transport = JSON.parse(selectedTransport).value;
console.log(`Loading script for ${transport}`);
let script;
switch (transport) {
case "EpxMod.EpoxyClient": {
script = document.createElement("script");
script.src = "/epoxy/index.js";
script.defer = true;
break;
}
case "CurlMod.LibcurlClient": {
script = document.createElement("script");
script.src = "/libcurl/index.js";
script.defer = true;
break;
}
case "BareMod.BareClient": {
script = document.createElement("script");
script.src = "/bare_transport.js";
script.defer = true;
break;
}
default: {
script = document.createElement("script");
script.src = "/epoxy/index.js";
script.defer = true;
break;
}
}
document.body.appendChild(script);
script.onload = () => {
resolve();
};
});
}

View file

@ -57,10 +57,12 @@ const { title, optionalPreloads } = Astro.props;
<script src="https://www.googletagmanager.com/gtag/js?id=G-P1JX4G9KSF" is:inline></script> <script src="https://www.googletagmanager.com/gtag/js?id=G-P1JX4G9KSF" is:inline></script>
<script is:inline> <script is:inline>
window.dataLayer = window.dataLayer || []; window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);} function gtag() {
gtag('js', new Date()); dataLayer.push(arguments);
}
gtag("js", new Date());
gtag('config', 'G-P1JX4G9KSF'); gtag("config", "G-P1JX4G9KSF");
</script> </script>
<meta name="generator" content={Astro.generator} /> <meta name="generator" content={Astro.generator} />
<title>{title}</title> <title>{title}</title>

View file

@ -3,215 +3,221 @@ import Layout from "src/layouts/Layout.astro";
--- ---
<Layout title="Terms and Conditions | Alu"> <Layout title="Terms and Conditions | Alu">
<div id="main-content"> <div id="main-content">
<h2><strong>Terms and Conditions</strong></h2> <h2><strong>Terms and Conditions</strong></h2>
<p>Welcome to Alu!</p> <p>Welcome to Alu!</p>
<p> <p>
These terms and conditions outline the rules and regulations for the use of Alu Project's These terms and conditions outline the rules and regulations for the use of Alu Project's
Website, located at https://aluu.xyz. Website, located at https://aluu.xyz.
</p> </p>
<p> <p>
By accessing this website we assume you accept these terms and conditions. Do not continue to By accessing this website we assume you accept these terms and conditions. Do not continue to
use Alu if you do not agree to take all of the terms and conditions stated on this page. use Alu if you do not agree to take all of the terms and conditions stated on this page.
</p> </p>
<p> <p>
The following terminology applies to these Terms and Conditions, Privacy Statement and The following terminology applies to these Terms and Conditions, Privacy Statement and
Disclaimer Notice and all Agreements: "Client", "You" and "Your" refers to you, the person log Disclaimer Notice and all Agreements: "Client", "You" and "Your" refers to you, the person log
on this website and compliant to the Company's terms and conditions. "The Company", "Ourselves", on this website and compliant to the Company's terms and conditions. "The Company",
"We", "Our" and "Us", refers to our Company. "Party", "Parties", or "Us", refers to both the "Ourselves", "We", "Our" and "Us", refers to our Company. "Party", "Parties", or "Us", refers
Client and ourselves. All terms refer to the offer, acceptance and consideration of payment to both the Client and ourselves. All terms refer to the offer, acceptance and consideration
necessary to undertake the process of our assistance to the Client in the most appropriate of payment necessary to undertake the process of our assistance to the Client in the most
manner for the express purpose of meeting the Client's needs in respect of provision of the appropriate manner for the express purpose of meeting the Client's needs in respect of
Company's stated services, in accordance with and subject to, prevailing law of us. Any use of provision of the Company's stated services, in accordance with and subject to, prevailing law
the above terminology or other words in the singular, plural, capitalization and/or he/she or of us. Any use of the above terminology or other words in the singular, plural, capitalization
they, are taken as interchangeable and therefore as referring to same. and/or he/she or they, are taken as interchangeable and therefore as referring to same.
</p> </p>
<h3><strong>Cookies</strong></h3> <h3><strong>Cookies</strong></h3>
<p> <p>
We employ the use of cookies. By accessing Alu, you agreed to use cookies in agreement with the We employ the use of cookies. By accessing Alu, you agreed to use cookies in agreement with
Alu Project's Privacy Policy. the Alu Project's Privacy Policy.
</p> </p>
<p> <p>
Most interactive websites use cookies to let us retrieve the user's details for each visit. Most interactive websites use cookies to let us retrieve the user's details for each visit.
Cookies are used by our website to enable the functionality of certain areas to make it easier Cookies are used by our website to enable the functionality of certain areas to make it easier
for people visiting our website. Some of our affiliate/advertising partners may also use for people visiting our website. Some of our affiliate/advertising partners may also use
cookies. cookies.
</p> </p>
<h3><strong>License</strong></h3> <h3><strong>License</strong></h3>
<p> <p>
Unless otherwise stated, Alu Project and/or its licensors own the intellectual property rights Unless otherwise stated, Alu Project and/or its licensors own the intellectual property rights
for all material on Alu. All intellectual property rights are reserved. You may access this from for all material on Alu. All intellectual property rights are reserved. You may access this
Alu for your own personal use subjected to restrictions set in these terms and conditions. from Alu for your own personal use subjected to restrictions set in these terms and
</p> conditions.
</p>
<p>You must not:</p> <p>You must not:</p>
<ul> <ul>
<li>Republish material from Alu</li> <li>Republish material from Alu</li>
<li>Sell, rent or sub-license material from Alu</li> <li>Sell, rent or sub-license material from Alu</li>
<li>Reproduce, duplicate or copy material from Alu</li> <li>Reproduce, duplicate or copy material from Alu</li>
<li>Redistribute content from Alu</li> <li>Redistribute content from Alu</li>
</ul> </ul>
<p>This Agreement shall begin on the date hereof.</p> <p>This Agreement shall begin on the date hereof.</p>
<h3><strong>Hyperlinking to our Content</strong></h3> <h3><strong>Hyperlinking to our Content</strong></h3>
<p>The following organizations may link to our Website without prior written approval:</p> <p>The following organizations may link to our Website without prior written approval:</p>
<ul> <ul>
<li>Government agencies;</li> <li>Government agencies;</li>
<li>Search engines;</li> <li>Search engines;</li>
<li>News organizations;</li> <li>News organizations;</li>
<li> <li>
Online directory distributors may link to our Website in the same manner as they hyperlink to Online directory distributors may link to our Website in the same manner as they hyperlink
the Websites of other listed businesses; and to the Websites of other listed businesses; and
</li> </li>
<li> <li>
System wide Accredited Businesses except soliciting non-profit organizations, charity shopping System wide Accredited Businesses except soliciting non-profit organizations, charity
malls, and charity fundraising groups which may not hyperlink to our Web site. shopping malls, and charity fundraising groups which may not hyperlink to our Web site.
</li> </li>
</ul> </ul>
<p> <p>
These organizations may link to our home page, to publications or to other Website information These organizations may link to our home page, to publications or to other Website information
so long as the link: (a) is not in any way deceptive; (b) does not falsely imply sponsorship, so long as the link: (a) is not in any way deceptive; (b) does not falsely imply sponsorship,
endorsement or approval of the linking party and its products and/or services; and (c) fits endorsement or approval of the linking party and its products and/or services; and (c) fits
within the context of the linking party's site. within the context of the linking party's site.
</p> </p>
<p>We may consider and approve other link requests from the following types of organizations:</p> <p>
We may consider and approve other link requests from the following types of organizations:
</p>
<ul> <ul>
<li>commonly-known consumer and/or business information sources;</li> <li>commonly-known consumer and/or business information sources;</li>
<li>dot.com community sites;</li> <li>dot.com community sites;</li>
<li>associations or other groups representing charities;</li> <li>associations or other groups representing charities;</li>
<li>online directory distributors;</li> <li>online directory distributors;</li>
<li>internet portals;</li> <li>internet portals;</li>
<li>accounting, law and consulting firms; and</li> <li>accounting, law and consulting firms; and</li>
<li>educational institutions and trade associations.</li> <li>educational institutions and trade associations.</li>
</ul> </ul>
<p> <p>
We will approve link requests from these organizations if we decide that: (a) the link would not We will approve link requests from these organizations if we decide that: (a) the link would
make us look unfavorably to ourselves or to our accredited businesses; (b) the organization does not make us look unfavorably to ourselves or to our accredited businesses; (b) the
not have any negative records with us; (c) the benefit to us from the visibility of the organization does not have any negative records with us; (c) the benefit to us from the
hyperlink compensates the absence of Alu Project; and (d) the link is in the context of general visibility of the hyperlink compensates the absence of Alu Project; and (d) the link is in the
resource information. context of general resource information.
</p> </p>
<p> <p>
These organizations may link to our home page so long as the link: (a) is not in any way These organizations may link to our home page so long as the link: (a) is not in any way
deceptive; (b) does not falsely imply sponsorship, endorsement or approval of the linking party deceptive; (b) does not falsely imply sponsorship, endorsement or approval of the linking
and its products or services; and (c) fits within the context of the linking party's site. party and its products or services; and (c) fits within the context of the linking party's
</p> site.
</p>
<p> <p>
If you are one of the organizations listed in paragraph 2 above and are interested in linking to If you are one of the organizations listed in paragraph 2 above and are interested in linking
our website, you must inform us by sending an e-mail to Alu Project. Please include your name, to our website, you must inform us by sending an e-mail to Alu Project. Please include your
your organization name, contact information as well as the URL of your site, a list of any URLs name, your organization name, contact information as well as the URL of your site, a list of
from which you intend to link to our Website, and a list of the URLs on our site to which you any URLs from which you intend to link to our Website, and a list of the URLs on our site to
would like to link. Wait 2-3 weeks for a response. which you would like to link. Wait 2-3 weeks for a response.
</p> </p>
<p>Approved organizations may hyperlink to our Website as follows:</p> <p>Approved organizations may hyperlink to our Website as follows:</p>
<ul> <ul>
<li>By use of our corporate name; or</li> <li>By use of our corporate name; or</li>
<li>By use of the uniform resource locator being linked to; or</li> <li>By use of the uniform resource locator being linked to; or</li>
<li> <li>
By use of any other description of our Website being linked to that makes sense within the By use of any other description of our Website being linked to that makes sense within the
context and format of content on the linking party's site. context and format of content on the linking party's site.
</li> </li>
</ul> </ul>
<p> <p>
No use of Alu Project's logo or other artwork will be allowed for linking absent a trademark No use of Alu Project's logo or other artwork will be allowed for linking absent a trademark
license agreement. license agreement.
</p> </p>
<h3><strong>iFrames</strong></h3> <h3><strong>iFrames</strong></h3>
<p> <p>
Without prior approval and written permission, you may not create frames around our Webpages Without prior approval and written permission, you may not create frames around our Webpages
that alter in any way the visual presentation or appearance of our Website. that alter in any way the visual presentation or appearance of our Website.
</p> </p>
<h3><strong>Content Liability</strong></h3> <h3><strong>Content Liability</strong></h3>
<p> <p>
We shall not be hold responsible for any content that appears on your Website. You agree to We shall not be hold responsible for any content that appears on your Website. You agree to
protect and defend us against all claims that is rising on your Website. No link(s) should protect and defend us against all claims that is rising on your Website. No link(s) should
appear on any Website that may be interpreted as libelous, obscene or criminal, or which appear on any Website that may be interpreted as libelous, obscene or criminal, or which
infringes, otherwise violates, or advocates the infringement or other violation of, any third infringes, otherwise violates, or advocates the infringement or other violation of, any third
party rights. party rights.
</p> </p>
<h3><strong>Reservation of Rights</strong></h3> <h3><strong>Reservation of Rights</strong></h3>
<p> <p>
We reserve the right to request that you remove all links or any particular link to our Website. We reserve the right to request that you remove all links or any particular link to our
You approve to immediately remove all links to our Website upon request. We also reserve the Website. You approve to immediately remove all links to our Website upon request. We also
right to amen these terms and conditions and it's linking policy at any time. By continuously reserve the right to amen these terms and conditions and it's linking policy at any time. By
linking to our Website, you agree to be bound to and follow these linking terms and conditions. continuously linking to our Website, you agree to be bound to and follow these linking terms
</p> and conditions.
</p>
<h3><strong>Removal of links from our website</strong></h3> <h3><strong>Removal of links from our website</strong></h3>
<p> <p>
If you find any link on our Website that is offensive for any reason, you are free to contact If you find any link on our Website that is offensive for any reason, you are free to contact
and inform us any moment. We will consider requests to remove links but we are not obligated to and inform us any moment. We will consider requests to remove links but we are not obligated
or so or to respond to you directly. to or so or to respond to you directly.
</p> </p>
<p> <p>
We do not ensure that the information on this website is correct, we do not warrant its We do not ensure that the information on this website is correct, we do not warrant its
completeness or accuracy; nor do we promise to ensure that the website remains available or that completeness or accuracy; nor do we promise to ensure that the website remains available or
the material on the website is kept up to date. that the material on the website is kept up to date.
</p> </p>
<h3><strong>Disclaimer</strong></h3> <h3><strong>Disclaimer</strong></h3>
<p> <p>
To the maximum extent permitted by applicable law, we exclude all representations, warranties To the maximum extent permitted by applicable law, we exclude all representations, warranties
and conditions relating to our website and the use of this website. Nothing in this disclaimer and conditions relating to our website and the use of this website. Nothing in this disclaimer
will: will:
</p> </p>
<ul> <ul>
<li>limit or exclude our or your liability for death or personal injury;</li> <li>limit or exclude our or your liability for death or personal injury;</li>
<li>limit or exclude our or your liability for fraud or fraudulent misrepresentation;</li> <li>limit or exclude our or your liability for fraud or fraudulent misrepresentation;</li>
<li> <li>
limit any of our or your liabilities in any way that is not permitted under applicable law; or limit any of our or your liabilities in any way that is not permitted under applicable law;
</li> or
<li>exclude any of our or your liabilities that may not be excluded under applicable law.</li> </li>
</ul> <li>exclude any of our or your liabilities that may not be excluded under applicable law.</li>
</ul>
<p> <p>
The limitations and prohibitions of liability set in this Section and elsewhere in this The limitations and prohibitions of liability set in this Section and elsewhere in this
disclaimer: (a) are subject to the preceding paragraph; and (b) govern all liabilities arising disclaimer: (a) are subject to the preceding paragraph; and (b) govern all liabilities arising
under the disclaimer, including liabilities arising in contract, in tort and for breach of under the disclaimer, including liabilities arising in contract, in tort and for breach of
statutory duty. statutory duty.
</p> </p>
<p> <p>
As long as the website and the information and services on the website are provided free of As long as the website and the information and services on the website are provided free of
charge, we will not be liable for any loss or damage of any nature. charge, we will not be liable for any loss or damage of any nature.
</p> </p>
</div> </div>
</Layout> </Layout>
<style> <style>
#main-content { #main-content {
width: 90%; width: 90%;
margin: 0 auto; margin: 0 auto;
} }
</style> </style>