/// import type { Worker as NodeWorker, MessagePort as NodeMessagePort } from 'worker_threads'; import * as rx from 'rxjs'; import { ReactorComposite } from '../epic'; import { Action, ActionFunctions } from '../control'; export declare const brokerOutputTableFor: readonly ["newWorkerReady", "workerInputs", "assignWorker", "portOfWorker"]; export type Broker = WorkerControl> = ReactorComposite, [], typeof brokerOutputTableFor>; export type ForkWorkerInput = { exit(): void; onFork(targetAction: Action, port: NodeMessagePort | MessagePort): void; /** set actions which are supposed to be sent to parent main thread by "messagePort.postMessage()", * consumer program should subscribe to `broker`'s outputTable.l.newWorkerReady to obtain lifted RxController * to dispatch or observe actions directly to or from worker threads */ setLiftUpActions(action$: rx.Observable>): void; }; export type ForkWorkerOutput = { workerInited(workerNo: string | number, logPrefix: string, mainWorkerPort: MessagePort | NodeMessagePort | null): void; fork(targetAction: Action): void; /** Informs broker that current step is waiting on forked function returns*/ wait(): void; /** Informs broker that current function step is be awake and continue on other instructions */ stopWaiting(): void; returned(): void; log(...obj: any[]): void; warn(...obj: any[]): void; /** broker implementation should react to this event*/ forkByBroker(targetAction: Action, messagePort: NodeMessagePort | MessagePort): void; }; export declare const workerInputTableFor: readonly ["setLiftUpActions", "exit"]; export declare const workerOutputTableFor: readonly ["workerInited", "log", "warn"]; export type WorkerControl, O extends ActionFunctions = Record, LI extends ReadonlyArray = readonly [], LO extends ReadonlyArray = readonly []> = ReactorComposite, ReadonlyArray>; export type BrokerInput = { ensureInitWorker(workerNo: number, worker: Worker | NodeWorker): void; /** Send message to worker to stop all event listerners on it */ letWorkerExit(worker: Worker | NodeWorker): void; /** Since Web worker doesn't have "close" event, there is no way currently this ca * work in web browser */ letAllWorkerExit(): void; workerAssigned(worketNo: number, worker: Worker | NodeWorker | 'main'): void; }; export type BrokerEvent = WorkerControl> = { workerInited(workerNo: number, newPort: MessagePort | NodeMessagePort | null, action$FromWorker: W['o'], skipped: boolean): void; newWorkerReady(workerNo: number, action$FromWorker: W['o'], workerInput: W['i']): void; workerInputs(byWorkerNo: Map): void; onWorkerError(workerNo: number, error: unknown, type?: string): void; onWorkerExit(workerNo: number, exitCode: number): void; onAllWorkerExit(): void; assignWorker(): void; portOfWorker(map: Map): void; };