Add alarms api

This commit is contained in:
a 2020-09-07 18:49:35 +02:00
parent ad0a7fe22a
commit bb183f4211
1 changed files with 54 additions and 0 deletions

View File

@ -16,3 +16,57 @@ export const rotateArray = <T>(arr: T[], reverse = false): T[] => {
else arr.push(arr.shift()!);
return arr;
};
type resolveCallback<T> = (value: T) => void;
type rejectCallback = (reason?: unknown) => void;
export const newPromise = <T>(): [
Promise<T>,
resolveCallback<T>,
rejectCallback
] => {
let resolve: resolveCallback<T>;
let reject: rejectCallback;
const promise = new Promise(
(res: resolveCallback<T>, rej: rejectCallback) => {
resolve = res;
reject = rej;
}
);
return [promise, resolve!, reject!];
};
declare global {
interface Window {
alarmsMap?: Map<any, [Promise<void>, rejectCallback]>;
}
}
//Clone of the https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/alarms
export namespace Alarms {
const getMap = () => {
window.alarmsMap ??= new Map();
return window.alarmsMap;
};
export const create = (delay: number, name?: any) => {
const map = getMap();
const alrm = map.get(name);
if (alrm) alrm[1]();
const [promise, resolve, reject] = newPromise<void>();
const timeout = setTimeout(resolve, delay);
promise.catch(() => window.clearTimeout(timeout));
if (name != undefined) map.set(name, [promise, reject]);
return promise;
};
export const get = (name: any) => (getMap().get(name) ?? [])[0];
export const getAll = () => Array.from(getMap().entries()).map((a) => a[0]);
export const clear = (name: any) => {
const alrm = getMap().get(name);
if (alrm) alrm[1]();
};
export const clearAll = () => getMap().forEach((a) => a[1]());
}