Extractor.watch()

This commit is contained in:
2020-01-15 17:53:23 +08:00
parent 3338f78d91
commit 7644a1363f
6 changed files with 122 additions and 31 deletions

View File

@ -1,6 +1,6 @@
import { Request, Actions } from "../common";
import { getTabByID } from "./actions";
import { caches, logger } from "./common";
import { logger } from "./common";
/**
* Sending a message to target tab repeatedly until the response is not undefined.
@ -78,14 +78,41 @@ export function sendMessage<T>(
});
}
chrome.runtime.onMessage.addListener(function (request: Request, sender, sendResponse) {
switch (request.action) {
case Actions.UPLOAD_STATE:
sendResponse('recieved!');
caches.setState(request.fileName, request.state)
break;
default:
sendResponse("Request not supported.");
break;
export type ActionSubscriber = (request: Request, sender: chrome.runtime.MessageSender, sendResponse: (response?: any) => void) => void | Promise<void>;
class MessageSubscribers {
private listeners: { [key: number]: ActionSubscriber[] } = {};
addListener(action: Actions, subscriber: ActionSubscriber) {
this.listeners[action] || (this.listeners[action] = []);
this.listeners[action].push(subscriber);
}
removeListener(action: Actions, subscriber: ActionSubscriber) {
this.listeners[action] || (this.listeners[action] = []);
for (let i = 0; i < this.listeners[action].length; i++) {
if (this.listeners[action][i] == subscriber) {
this.listeners[action].splice(i, 1);
i--;
}
}
logger.debug(`${this.listeners[action].length} subscriber(s) remained for action ${Actions[action]}`);
}
getListeners(action: Actions): ActionSubscriber[] {
return this.listeners[action]
}
}
export const messageSubscribers = new MessageSubscribers();
chrome.runtime.onMessage.addListener(function (request: Request, sender, sendResponse) {
let subscribers = messageSubscribers.getListeners(request.action);
if (!subscribers || !subscribers.length) {
sendResponse("Request not supported.");
return;
}
let promises: Promise<any>[] = [];
for (let subscriber of subscribers) {
let p = subscriber(request, sender, sendResponse);
if (p instanceof Promise) promises.push(p);
}
if (promises.length)
return Promise.all(promises);
return;
});