96 lines
2.5 KiB
JavaScript
96 lines
2.5 KiB
JavaScript
importScripts("/workerware/WWError.js");
|
|
const dbg = console.log.bind(console, "[WorkerWare]");
|
|
|
|
const defaultOpt = {
|
|
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 {
|
|
constructor(opt) {
|
|
this._opt = opt;
|
|
this._middlewares = [];
|
|
}
|
|
use(middleware) {
|
|
let validateMW = this.validateMiddleware(middleware);
|
|
if (validateMW.error) throw new WWError(validateMW.error);
|
|
// 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(event) {
|
|
const middlewares = this._middlewares;
|
|
const returnList = [];
|
|
let fn = async () => {
|
|
for (let i = 0; i < middlewares.length; i++) {
|
|
if (middlewares[i].events.includes(event.type)) {
|
|
returnList.push(await middlewares[i].function(event));
|
|
}
|
|
}
|
|
return returnList;
|
|
};
|
|
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,
|
|
};
|
|
}
|
|
}
|