/**
 * Invokes the wrapped function in a non-blocking way when trigger() is called.
 * Invocation requests are ignored until the function was actually invoked.
 */
export class ThrottledInvoker {
    _channel: MessageChannel | undefined;
    _triggered: boolean;
    _methodToThrottle: Function;

    constructor(methodToThrottle: Function) {
        this._methodToThrottle = methodToThrottle;
        this._triggered = false;
        this._channel = new MessageChannel();
        this._channel.port2.onmessage = () => {
            this._triggered = false;
            this._methodToThrottle();
        };
    }

    trigger(): void {
        if (this._triggered) {
            return;
        }
        this._triggered = true;
        this._channel?.port1.postMessage(true);
    }

    remove(): void {
        delete this._channel;
        this._methodToThrottle = () => {};
    }
}
