constructor(size = defaultPoolSize, createWorker = create) {
    this.workerWrappers = null;
    if (size) {
      this.workerWrappers = (async () => {
        const workerWrappers = [];
        for (let i = 0; i < size; i++) {
          const worker = createWorker();
          const wrapper = new WorkerWrapper(worker);
          workerWrappers.push(wrapper);
          finalizationRegistry.register(wrapper, worker, wrapper);
        }
        return workerWrappers;
      })();
    }
  }
@constructor
@param {Number} [size] The size of the pool. Defaults to the number of CPUs
                     available. When this parameter is `null` or 0, then the
                     decoding will be done in the main thread.
@param {function(): Worker} [createWorker] A function that creates the decoder worker.
Defaults to a worker with all decoders that ship with geotiff.js. The `createWorker()`
function is expected to return a `Worker` compatible with Web Workers. For code that
runs in Node, [web-worker](https://www.npmjs.com/package/web-worker) is a good choice.

A worker that uses a custom lzw decoder would look like this `my-custom-worker.js` file:
```js
import { addDecoder, getDecoder } from 'geotiff';
addDecoder(5, () => import ('./my-custom-lzw').then((m) => m.default));
self.addEventListener('message', async (e) => {
  const { id, fileDirectory, buffer } = e.data;
  const decoder = await getDecoder(fileDirectory);
  const decoded = await decoder.decode(fileDirectory, buffer);
  self.postMessage({ decoded, id }, [decoded]);
});
```
The way the above code is built into a worker by the `createWorker()` function
depends on the used bundler. For most bundlers, something like this will work:
```js
function createWorker() {
  return new Worker(new URL('./my-custom-worker.js', import.meta.url));
}
```