All files / core/src/thread thread.ts

100% Statements 55/55
100% Branches 6/6
100% Functions 0/0
100% Lines 55/55

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 561x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 3x 3x 3x 3x 3x 3x 3x 3x 1x 1x 1x 1x 4x 1x 1x  
import { expose, Remote } from 'comlink';
import { TypeOf } from '../utility/type-of';
 
/**
 * Type alias describing an exposed class in a remote context. Represented by
 * wrapping a {@link Remote} in a {@link Promise}. Used and intended to be used
 * in conjunction with the {@link Thread} decorator.
 *
 * @typeParam T - The {@link Remote} **Thread** type.
 *
 * @see {@link Thread}
 */
export type Thread<T> = Promise<Remote<T>>;
 
/**
 * Class decorator factory. {@link expose}s an instance of the decorated class
 * as {@link Worker} **Thread**.
 *
 * @returns A class constructor decorator.
 *
 * @example
 * ExampleWorker **Thread**:
 * ```ts
 * import { Thread } from '@sgrud/core';
 *
 * ⁠@Thread()
 * export class ExampleWorker {}
 * ```
 *
 * @see {@link Spawn}
 */
export function Thread() {
 
  /**
   * @param constructor - The class `constructor` to be decorated.
   * @throws A {@link ReferenceError} when the environment is incompatible.
   */
  return function(constructor: new () => any): void {
    if (TypeOf.function(globalThis.importScripts)) {
      expose(new constructor());
    } else if (TypeOf.process(globalThis.process)) {
      const { isMainThread, parentPort } = require('worker_threads');
 
      if (!isMainThread) {
        const nodeEndpoint = require('comlink/dist/umd/node-adapter');
        expose(new constructor(), nodeEndpoint(parentPort));
      } else {
        throw new TypeError(constructor.name);
      }
    } else {
      throw new TypeError(constructor.name);
    }
  };
 
}