import { Request, Response } from './types'; import { BaseRequestSystem } from './base_request_system'; import { requestSystemManager } from './registry'; /** * * @param name the name of the type of request (must be unique) * @param handleAsyncInTab handler of requests in the tab * @param handleAsyncInServiceWorker handler of requests in the service worker * @returns */ export function createRequestSystem( name: string, handleAsyncInTab: ( request: Request, sender: chrome.runtime.MessageSender ) => Promise>, handleAsyncInServiceWorker: ( request: Request, sender: chrome.runtime.MessageSender ) => Promise> ) { class RequestSystem extends BaseRequestSystem { canHandle(request: Request<{}>): boolean { return request.name === name; } protected async handleAsyncInTab( request: Request, sender: chrome.runtime.MessageSender ): Promise> { return await handleAsyncInTab(request, sender); } protected async handleAsyncInServiceWorker( request: Request, sender: chrome.runtime.MessageSender ): Promise> { return await handleAsyncInServiceWorker(request, sender); } } const requestSystem = new RequestSystem(); const createRequest = (params: T): Request => { return { name, data: { ...params, }, }; }; return { requestSystem, createRequest, }; } export function registerRequestSystem( requestSystem: BaseRequestSystem<{}, {}> ) { requestSystemManager.add(requestSystem); } /** * * @param name the name of the type of request (must be unique) * @param handleAsyncInTab handler of requests in the tab * @param handleAsyncInServiceWorker handler of requests in the service worker * @returns */ export function createAndRegisterRequestSystem( name: string, handleAsyncInTab: ( request: Request, sender: chrome.runtime.MessageSender ) => Promise>, handleAsyncInServiceWorker: ( request: Request, sender: chrome.runtime.MessageSender ) => Promise> ) { const { requestSystem, createRequest } = createRequestSystem( name, handleAsyncInTab, handleAsyncInServiceWorker ); registerRequestSystem(requestSystem); return { requestSystem, createRequest }; }