blob: bd2459a060da0ac2193fce73871a3a18f09b1e08 [file] [log] [blame]
import { AutoRollService, AutoRollServiceClient } from './rpc';
export * from './rpc';
const host = `${window.location.protocol}//${window.location.host}`;
let rpcClient: AutoRollService = new AutoRollServiceClient(
host,
window.fetch.bind(window)
);
/**
* GetAutoRollService returns an AutoRollService implementation which dispatches
* events indicating when requests have started and ended.
*
* @param ele The parent element, used to dispatch events.
*/
export function GetAutoRollService(ele: HTMLElement): AutoRollService {
const handler = {
get(target: any, propKey: any, receiver: any) {
const origMethod = target[propKey];
return function (...args: any[]) {
ele.dispatchEvent(new CustomEvent('begin-task', { bubbles: true }));
return origMethod
.apply(rpcClient, args)
.then((v: any) => {
ele.dispatchEvent(new CustomEvent('end-task', { bubbles: true }));
return v;
})
.catch((err: any) => {
ele.dispatchEvent(
new CustomEvent('fetch-error', {
detail: {
error: err,
loading: propKey,
},
bubbles: true,
})
);
Promise.reject(err);
});
};
},
};
return new Proxy(rpcClient, handler);
}
/**
* MockRPCsForTesting switches this module to use the given AutoRollService for
* testing purposes.
*/
export function MockRPCsForTesting(repl: AutoRollService) {
rpcClient = repl;
}