import { IpcMainImpl } from '@electron/internal/browser/ipc-main-impl';

const { ServiceWorkerMain } = process._linkedBinding('electron_browser_service_worker_main');

Object.defineProperty(ServiceWorkerMain.prototype, 'ipc', {
  get() {
    const ipc = new IpcMainImpl();
    Object.defineProperty(this, 'ipc', { value: ipc });
    return ipc;
  }
});

ServiceWorkerMain.prototype.send = function (channel, ...args) {
  if (typeof channel !== 'string') {
    throw new TypeError('Missing required channel argument');
  }

  try {
    return this._send(false /* internal */, channel, args);
  } catch (e) {
    console.error('Error sending from ServiceWorkerMain: ', e);
  }
};

ServiceWorkerMain.prototype.startTask = function () {
  // TODO(samuelmaddock): maybe make timeout configurable in the future
  const hasTimeout = false;
  const { id, ok } = this._startExternalRequest(hasTimeout);

  if (!ok) {
    throw new Error('Unable to start service worker task.');
  }

  return {
    end: () => this._finishExternalRequest(id)
  };
};

module.exports = ServiceWorkerMain;
