add middlewareManifest type, ensure events to hook into are valid when calling use(middleware)

This commit is contained in:
wearrrrr 2024-06-17 02:09:12 -05:00
parent 4395c41041
commit 6f4f234c82
8 changed files with 330 additions and 249 deletions

View file

@ -1,5 +1,5 @@
import path from "path"; import path from "path";
import fs from "fs" import fs from "fs";
const failureFile = fs.readFileSync("Checkfailed.html", "utf8"); const failureFile = fs.readFileSync("Checkfailed.html", "utf8");

View file

@ -10,20 +10,22 @@ const ww = new WorkerWare({
debug: true, debug: true,
}); });
function logContext(ctx, event) { function logContext(event) {
console.log("Context:", ctx);
console.log("Event:", event); console.log("Event:", event);
return void 0; return undefined;
} }
ww.use(logContext) ww.use({
function: logContext,
events: ["fetch"],
});
const uv = new UVServiceWorker(); const uv = new UVServiceWorker();
self.addEventListener("fetch", async (event) => { self.addEventListener("fetch", async (event) => {
let middleware = await ww.run(self, event)(); let mwResponse = await ww.run(event)();
if (middleware.includes(null)) { if (mwResponse.includes(null)) {
console.log("Aborting Request!") console.log("Aborting Request!");
return; return;
} }
event.respondWith( event.respondWith(

View file

@ -0,0 +1,6 @@
class WWError extends Error {
constructor(message) {
super(message);
this.name = "[WorkerWare Exception]";
}
}

View file

@ -1,28 +1,97 @@
importScripts("/workerware/WWError.js");
const dbg = console.log.bind(console, "[WorkerWare]"); const dbg = console.log.bind(console, "[WorkerWare]");
const defaultOpt = { const defaultOpt = {
debug: false, debug: false,
} };
// type middlewareManifest = {
// function: Function,
// name?: string,
// events: string[], // Should be a union of validEvents.
// }
const validEvents = [
"abortpayment",
"activate",
"backgroundfetchabort",
"backgroundfetchclick",
"backgroundfetchfail",
"backgroundfetchsuccess",
"canmakepayment",
"contentdelete",
"cookiechange",
"fetch",
"install",
"message",
"messageerror",
"notificationclick",
"notificationclose",
"paymentrequest",
"periodicsync",
"push",
"pushsubscriptionchange",
"sync",
];
class WorkerWare { class WorkerWare {
constructor(opt) { constructor(opt) {
this._opt = opt; this._opt = opt;
this._middlewares = []; this._middlewares = [];
} }
use(fn) { use(middleware) {
if (typeof fn !== 'function') throw new TypeError('[WorkerWare] Middleware must be a function!'); let validateMW = this.validateMiddleware(middleware);
if (this._opt.debug) dbg("Added middleware", fn.name || "<anonymous>"); if (validateMW.error) throw new WWError(validateMW.error);
this._middlewares.push(fn); // This means the middleware is an anonymous function, or the user is silly and named their function "function"
if (middleware.function.name == "function") middleware.name = crypto.randomUUID();
if (!middleware.name) middleware.name = middleware.function.name;
if (this._opt.debug) dbg("Adding middleware:", middleware.name);
this._middlewares.push(middleware);
} }
run(ctx, event) { run(event) {
const middlewares = this._middlewares; const middlewares = this._middlewares;
const returnList = []; const returnList = [];
let fn = async () => { let fn = async () => {
for (let i = 0; i < middlewares.length; i++) { for (let i = 0; i < middlewares.length; i++) {
returnList.push(await middlewares[i](ctx, event)); dbg(middlewares[i], event.type);
if (middlewares[i].events.includes(event.type)) {
returnList.push(await middlewares[i].function(event));
}
} }
return returnList; return returnList;
}; };
return fn; return fn;
} }
runMW(id, event) {
const middlewares = this._middlewares;
if (this._opt.debug) dbg("Running middleware:", id);
if (middlewares.includes(id)) {
return middlewares[id](event);
}
}
validateMiddleware(middleware) {
if (!middleware.function)
return {
error: "middleware.function is required",
};
if (typeof middleware.function !== "function")
return {
error: "middleware.function must be typeof function",
};
if (!middleware.events)
return {
error: "middleware.events is required",
};
if (!Array.isArray(middleware.events))
return {
error: "middleware.events must be an array",
};
if (middleware.events.some((ev) => !validEvents.includes(ev)))
return {
error: "Invalid event type! Must be one of the following: " + validEvents.join(", "),
};
return {
error: undefined,
};
}
} }

View file

@ -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,

View file

@ -72,7 +72,7 @@ export async function registerSW() {
}); });
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) => {
console.log("Registered SW!") console.log("Registered SW!");
resolve(null); resolve(null);
}); });
}); });

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

@ -21,21 +21,21 @@ import Layout from "src/layouts/Layout.astro";
<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>
@ -49,8 +49,9 @@ import Layout from "src/layouts/Layout.astro";
<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
conditions.
</p> </p>
<p>You must not:</p> <p>You must not:</p>
@ -72,12 +73,12 @@ import Layout from "src/layouts/Layout.astro";
<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>
@ -88,7 +89,9 @@ import Layout from "src/layouts/Layout.astro";
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>
@ -101,25 +104,26 @@ import Layout from "src/layouts/Layout.astro";
</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
site.
</p> </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>
@ -158,24 +162,25 @@ import Layout from "src/layouts/Layout.astro";
<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
and conditions.
</p> </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>
@ -190,7 +195,8 @@ import Layout from "src/layouts/Layout.astro";
<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;
or
</li> </li>
<li>exclude any of our or your liabilities that may not be excluded under applicable law.</li> <li>exclude any of our or your liabilities that may not be excluded under applicable law.</li>
</ul> </ul>
@ -214,4 +220,4 @@ import Layout from "src/layouts/Layout.astro";
width: 90%; width: 90%;
margin: 0 auto; margin: 0 auto;
} }
</style> </style>