text: // tslint:disable max-classes-per-file
  import { getBundleURL } from "./get-bundle-url.browser";
  export const defaultPoolSize = typeof navigator !== "undefined" && navigator.hardwareConcurrency
      ? navigator.hardwareConcurrency
      : 4;
  const isAbsoluteURL = (value) => /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(value);
  function createSourceBlobURL(code) {
      const blob = new Blob([code], { type: "application/javascript" });
      return URL.createObjectURL(blob);
  }
  function selectWorkerImplementation() {
      if (typeof Worker === "undefined") {
          // Might happen on Safari, for instance
          // The idea is to only fail if the constructor is actually used
          return class NoWebWorker {
              constructor() {
                  throw Error("No web worker implementation available. You might have tried to spawn a worker within a worker in a browser that doesn't support workers in workers.");
              }
          };
      }
      class WebWorker extends Worker {
          constructor(url, options) {
              var _a, _b;
              if (typeof url === "string" && options && options._baseURL) {
                  url = new URL(url, options._baseURL);
              }
              else if (typeof url === "string" && !isAbsoluteURL(url) && getBundleURL().match(/^file:\/\//i)) {
                  url = new URL(url, getBundleURL().replace(/\/[^\/]+$/, "/"));
                  if ((_a = options === null || options === void 0 ? void 0 : options.CORSWorkaround) !== null && _a !== void 0 ? _a : true) {
                      url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`);
                  }
              }
              if (typeof url === "string" && isAbsoluteURL(url)) {
                  // Create source code blob loading JS file via `importScripts()`
                  // to circumvent worker CORS restrictions
                  if ((_b = options === null || options === void 0 ? void 0 : options.CORSWorkaround) !== null && _b !== void 0 ? _b : true) {
                      url = createSourceBlobURL(`importScripts(${JSON.stringify(url)});`);
                  }
              }
              super(url, options);
          }
      }
      class BlobWorker extends WebWorker {
          constructor(blob, options) {
              const url = window.URL.createObjectURL(blob);
              super(url, options);
          }
          static fromText(source, options) {
              const blob = new window.Blob([source], { type: "text/javascript" });
              return new BlobWorker(blob, options);
          }
      }
      return {
          blob: BlobWorker,
          default: WebWorker
      };
  }
  let implementation;
  export function getWorkerImplementation() {
      if (!implementation) {
          implementation = selectWorkerImplementation();
      }
      return implementation;
  }
  export function isWorkerRuntime() {
      const isWindowContext = typeof self !== "undefined" && typeof Window !== "undefined" && self instanceof Window;
      return typeof self !== "undefined" && self.postMessage && !isWindowContext ? true : false;
  }
  