ruffle/web/packages/extension/src/utils.ts

120 lines
4.5 KiB
TypeScript
Raw Normal View History

2021-03-09 19:50:47 +00:00
const DEFAULT_OPTIONS = {
ruffleEnable: true,
ignoreOptout: false,
};
export let i18n: any;
export let storage: any;
export let tabs: {
reload(tabId: number): Promise<void>,
query(query: chrome.tabs.QueryInfo & browser.tabs._QueryQueryInfo): Promise<chrome.tabs.Tab[] | browser.tabs.Tab[]>,
sendMessage(tabId: number, message: any, options?: chrome.tabs.MessageSendOptions & browser.tabs._SendMessageOptions): Promise<any>,
};
export let runtime: any;
export let openOptionsPage: any;
2021-03-09 19:50:47 +00:00
function promisify<T>(func: (callback: (result?: T) => void) => void): Promise<T> {
2021-03-09 19:50:47 +00:00
return new Promise((resolve, reject) => {
func((result) => {
const error = chrome.runtime.lastError;
if (error) {
reject(error);
} else {
resolve(result!);
2021-03-09 19:50:47 +00:00
}
});
});
}
if (typeof chrome !== "undefined") {
i18n = {
getMessage: (name: string) => chrome.i18n.getMessage(name),
2021-03-09 19:50:47 +00:00
};
storage = {
local: {
get: (keys: string[]) =>
2021-03-09 19:50:47 +00:00
promisify((cb) => chrome.storage.local.get(keys, cb)),
remove: (keys: string[]) =>
2021-03-09 19:50:47 +00:00
promisify((cb) => chrome.storage.local.remove(keys, cb)),
set: (items: object) =>
2021-03-09 19:50:47 +00:00
promisify((cb) => chrome.storage.local.set(items, cb)),
},
sync: {
get: (keys: string[]) => promisify((cb) => chrome.storage.sync.get(keys, cb)),
remove: (keys: string[]) =>
2021-03-09 19:50:47 +00:00
promisify((cb) => chrome.storage.sync.remove(keys, cb)),
set: (items: object) =>
2021-03-09 19:50:47 +00:00
promisify((cb) => chrome.storage.sync.set(items, cb)),
},
onChanged: {
addListener: (listener: (changes: chrome.storage.StorageChange, areaName: string) => void) =>
2021-03-09 19:50:47 +00:00
chrome.storage.onChanged.addListener(listener),
},
};
tabs = {
reload: (tabId: number) => promisify((cb) => chrome.tabs.reload(tabId, undefined, cb)),
query: (query: chrome.tabs.QueryInfo) => promisify((cb) => chrome.tabs.query(query, cb)),
sendMessage: (tabId: number, message: any, options: chrome.tabs.MessageSendOptions) =>
promisify((cb) => chrome.tabs.sendMessage(tabId, message, options, cb)),
2021-03-09 19:50:47 +00:00
};
runtime = {
onMessage: {
addListener: (listener: (message: any, sender: chrome.runtime.MessageSender, sendResponse: (response?: any) => void) => void) =>
2021-03-09 19:50:47 +00:00
chrome.runtime.onMessage.addListener(listener),
},
getURL: (path: string) => chrome.runtime.getURL(path),
2021-03-09 19:50:47 +00:00
};
2021-02-14 11:30:16 +00:00
openOptionsPage = () => chrome.tabs.create({ url: "/options.html" });
2021-03-09 19:50:47 +00:00
} else if (typeof browser !== "undefined") {
i18n = {
getMessage: (name: string) => browser.i18n.getMessage(name),
2021-03-09 19:50:47 +00:00
};
storage = {
local: {
get: (keys: string[]) => browser.storage.local.get(keys),
remove: (keys: string[]) => browser.storage.local.remove(keys),
set: (items: Record<string, any>) => browser.storage.local.set(items),
2021-03-09 19:50:47 +00:00
},
sync: {
get: (keys: string[]) => browser.storage.sync.get(keys),
remove: (keys: string[]) => browser.storage.sync.remove(keys),
set: (items: Record<string, any>) => browser.storage.sync.set(items),
2021-03-09 19:50:47 +00:00
},
onChanged: {
addListener: (listener: (changes: Record<string, browser.storage.StorageChange>, areaName: string) => void) =>
2021-03-09 19:50:47 +00:00
browser.storage.onChanged.addListener(listener),
},
};
tabs = {
reload: (tabId: number) => browser.tabs.reload(tabId),
query: (query: browser.tabs._QueryQueryInfo) => browser.tabs.query(query),
sendMessage: (tabId: number, message: any, options: browser.tabs._SendMessageOptions) =>
2021-03-09 19:50:47 +00:00
browser.tabs.sendMessage(tabId, message, options),
};
runtime = {
onMessage: {
addListener: (listener: (message: any, sender: browser.runtime.MessageSender, sendResponse: (response?: any) => void) => boolean | Promise<any> | void) =>
2021-03-09 19:50:47 +00:00
browser.runtime.onMessage.addListener(listener),
},
getURL: (path: string) => browser.runtime.getURL(path),
2021-03-09 19:50:47 +00:00
};
openOptionsPage = () => browser.runtime.openOptionsPage();
} else {
throw new Error("Extension API not found.");
}
export async function getOptions(keys: string[]) {
2021-03-09 19:50:47 +00:00
const options = await storage.sync.get(keys);
// Copy over default options if they don't exist yet.
return { ...DEFAULT_OPTIONS, ...options };
}