|
importScripts("/workerware/WWError.js");
|
|
const dbg = console.log.bind(console, "[WorkerWare]");
|
|
const time = console.time.bind(console, "[WorkerWare]");
|
|
const timeEnd = console.timeEnd.bind(console, "[WorkerWare]");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const defaultOpt = {
|
|
debug: false,
|
|
randomNames: false,
|
|
timing: false
|
|
};
|
|
|
|
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 = Object.assign({}, defaultOpt, opt);
|
|
this._middlewares = [];
|
|
}
|
|
info() {
|
|
return {
|
|
version: "0.1.0",
|
|
middlewares: this._middlewares,
|
|
options: this._opt
|
|
};
|
|
}
|
|
use(middleware) {
|
|
let validateMW = this.validateMiddleware(middleware);
|
|
if (validateMW.error) throw new WWError(validateMW.error);
|
|
|
|
if (middleware.function.name == "function") middleware.name = crypto.randomUUID();
|
|
if (!middleware.name) middleware.name = middleware.function.name;
|
|
if (this._opt.randomNames) middleware.name = crypto.randomUUID();
|
|
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)) {
|
|
if (this._opt.timing) console.time(middlewares[i].name);
|
|
|
|
event.workerware = {
|
|
config: middlewares[i].configuration || {}
|
|
};
|
|
if (!middlewares[i].explicitCall) {
|
|
let res = await middlewares[i].function(event);
|
|
if (this._opt.timing) console.timeEnd(middlewares[i].name);
|
|
returnList.push(res);
|
|
}
|
|
}
|
|
}
|
|
return returnList;
|
|
};
|
|
return fn;
|
|
}
|
|
deleteByName(middlewareID) {
|
|
if (this._opt.debug) dbg("Deleting middleware:", middlewareID);
|
|
this._middlewares = this._middlewares.filter((mw) => mw.name !== middlewareID);
|
|
}
|
|
deleteByEvent(middlewareEvent) {
|
|
if (this._opt.debug) dbg("Deleting middleware by event:", middlewareEvent);
|
|
this._middlewares = this._middlewares.filter((mw) => !mw.events.includes(middlewareEvent));
|
|
}
|
|
get() {
|
|
return this._middlewares;
|
|
}
|
|
|
|
|
|
|
|
|
|
runMW(name, event) {
|
|
const middlewares = this._middlewares;
|
|
if (this._opt.debug) dbg("Running middleware:", name);
|
|
|
|
|
|
|
|
|
|
|
|
let didCall = false;
|
|
for (let i = 0; i < middlewares.length; i++) {
|
|
if (middlewares[i].name == name) {
|
|
didCall = true;
|
|
event.workerware = {
|
|
config: middlewares[i].configuration || {}
|
|
};
|
|
if (this._opt.timing) console.time(middlewares[i].name);
|
|
let call = middlewares[i].function(event);
|
|
if (this._opt.timing) console.timeEnd(middlewares[i].name);
|
|
return call;
|
|
}
|
|
}
|
|
if (!didCall) {
|
|
throw new WWError("Middleware not found!");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 (
|
|
typeof middleware.configuration !== "object" &&
|
|
middleware.configuration !== undefined
|
|
) {
|
|
return {
|
|
error: "middleware.configuration must be typeof object"
|
|
};
|
|
}
|
|
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(", ")
|
|
};
|
|
if (middleware.explicitCall && typeof middleware.explicitCall !== "boolean") {
|
|
return {
|
|
error: "middleware.explicitCall must be typeof boolean"
|
|
};
|
|
}
|
|
return {
|
|
error: undefined
|
|
};
|
|
}
|
|
}
|
|
|