threads
Advanced tools
Comparing version 1.6.2 to 1.6.3-callbacks
@@ -1,5 +0,6 @@ | ||
export { registerSerializer } from "./common"; | ||
export { Callback } from "./common/callbacks"; | ||
export { registerSerializer } from "./common/serialization"; | ||
export * from "./master/index"; | ||
export { expose } from "./worker/index"; | ||
export { DefaultSerializer } from "./serializers"; | ||
export { Transfer } from "./transferable"; | ||
export { DefaultSerializer } from "./serializers/index"; | ||
export { Transfer } from "./common/transferable"; |
@@ -154,3 +154,3 @@ /// <reference lib="dom" /> | ||
this.onerror = (error) => this.emitter.emit("error", error); | ||
this.onmessage = (message) => this.emitter.emit("message", message); | ||
this.onmessage = (event) => this.emitter.emit("message", event); | ||
} | ||
@@ -157,0 +157,0 @@ addEventListener(eventName, listener) { |
import { getWorkerImplementation, isWorkerRuntime } from "./implementation"; | ||
export { Callback } from "../common/callbacks"; | ||
export { Pool } from "./pool"; | ||
@@ -3,0 +4,0 @@ export { spawn } from "./spawn"; |
@@ -220,6 +220,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
} | ||
const taskCompleted = () => this.taskCompletion(task.id); | ||
let taskCompletionDotThen; | ||
const taskID = this.nextTaskID++; | ||
const taskCompletion = this.taskCompletion(taskID); | ||
taskCompletion.catch((error) => { | ||
// Prevent unhandled rejections here as we assume the user will use | ||
// `pool.completed()`, `pool.settled()` or `task.catch()` to handle errors | ||
this.debug(`Task #${taskID} errored:`, error); | ||
}); | ||
const task = { | ||
id: this.nextTaskID++, | ||
id: taskID, | ||
run: taskFunction, | ||
@@ -235,9 +240,3 @@ cancel: () => { | ||
}, | ||
get then() { | ||
if (!taskCompletionDotThen) { | ||
const promise = taskCompleted(); | ||
taskCompletionDotThen = promise.then.bind(promise); | ||
} | ||
return taskCompletionDotThen; | ||
} | ||
then: taskCompletion.then.bind(taskCompletion) | ||
}; | ||
@@ -244,0 +243,0 @@ if (this.taskQueue.length >= maxQueuedJobs) { |
@@ -12,7 +12,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
import { Observable } from "observable-fns"; | ||
import { deserialize } from "../common"; | ||
import { createPromiseWithResolver } from "../promise"; | ||
import { createProxyFunction, createProxyModule, handleFunctionInvocations } from "../common/call-proxy"; | ||
import { deserialize, getRegisteredSerializer } from "../common/serialization"; | ||
import { $errors, $events, $terminate, $worker } from "../symbols"; | ||
import { WorkerEventType } from "../types/master"; | ||
import { createProxyFunction, createProxyModule } from "./invocation-proxy"; | ||
import { createPromiseWithResolver } from "../util/promise"; | ||
const debugMessages = DebugLogger("threads:master:messages"); | ||
@@ -50,3 +50,3 @@ const debugSpawn = DebugLogger("threads:master:spawn"); | ||
worker.removeEventListener("message", messageHandler); | ||
reject(deserialize(event.data.error)); | ||
reject(deserialize(event.data.error, worker)); | ||
} | ||
@@ -125,8 +125,11 @@ }); | ||
const events = createEventObservable(worker, termination); | ||
const serializer = getRegisteredSerializer(); | ||
if (exposed.type === "function") { | ||
const proxy = createProxyFunction(worker); | ||
const proxy = createProxyFunction(worker, serializer, 0, debugMessages); | ||
handleFunctionInvocations(worker, serializer, debugMessages); | ||
return setPrivateThreadProps(proxy, worker, events, terminate); | ||
} | ||
else if (exposed.type === "module") { | ||
const proxy = createProxyModule(worker, exposed.methods); | ||
const proxy = createProxyModule(worker, serializer, exposed.methods, debugMessages); | ||
handleFunctionInvocations(worker, serializer, debugMessages); | ||
return setPrivateThreadProps(proxy, worker, events, terminate); | ||
@@ -133,0 +136,0 @@ } |
@@ -0,1 +1,2 @@ | ||
export const $callback = Symbol("thread.callback"); | ||
export const $errors = Symbol("thread.errors"); | ||
@@ -2,0 +3,0 @@ export const $events = Symbol("thread.events"); |
@@ -1,8 +0,9 @@ | ||
///////////////////////////// | ||
// Messages sent by master: | ||
export var MasterMessageType; | ||
(function (MasterMessageType) { | ||
MasterMessageType["cancel"] = "cancel"; | ||
MasterMessageType["run"] = "run"; | ||
})(MasterMessageType || (MasterMessageType = {})); | ||
export var CommonMessageType; | ||
(function (CommonMessageType) { | ||
CommonMessageType["cancel"] = "call:cancel"; | ||
CommonMessageType["error"] = "call:error"; | ||
CommonMessageType["invoke"] = "call:invoke"; | ||
CommonMessageType["result"] = "call:result"; | ||
CommonMessageType["running"] = "call:running"; | ||
})(CommonMessageType || (CommonMessageType = {})); | ||
//////////////////////////// | ||
@@ -12,7 +13,4 @@ // Messages sent by worker: | ||
(function (WorkerMessageType) { | ||
WorkerMessageType["error"] = "error"; | ||
WorkerMessageType["init"] = "init"; | ||
WorkerMessageType["result"] = "result"; | ||
WorkerMessageType["running"] = "running"; | ||
WorkerMessageType["uncaughtError"] = "uncaughtError"; | ||
})(WorkerMessageType || (WorkerMessageType = {})); |
/// <reference lib="dom" /> | ||
// tslint:disable no-shadowed-variable | ||
import { multiplexEventTarget } from "../util/events"; | ||
const isWorkerRuntime = function isWorkerRuntime() { | ||
@@ -7,19 +8,18 @@ const isWindowContext = typeof self !== "undefined" && typeof Window !== "undefined" && self instanceof Window; | ||
}; | ||
const postMessageToMaster = function postMessageToMaster(data, transferList) { | ||
const postMessage = function postMessageToMaster(data, transferList) { | ||
self.postMessage(data, transferList); | ||
}; | ||
const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) { | ||
const messageHandler = (messageEvent) => { | ||
onMessage(messageEvent.data); | ||
}; | ||
const unsubscribe = () => { | ||
self.removeEventListener("message", messageHandler); | ||
}; | ||
self.addEventListener("message", messageHandler); | ||
return unsubscribe; | ||
}; | ||
export default { | ||
let muxedSelfEvents; | ||
const Implementation = { | ||
addEventListener(event, handler) { | ||
muxedSelfEvents = muxedSelfEvents || multiplexEventTarget(self); | ||
return muxedSelfEvents.addEventListener(event, handler); | ||
}, | ||
removeEventListener(event, handler) { | ||
muxedSelfEvents = muxedSelfEvents || multiplexEventTarget(self); | ||
return muxedSelfEvents.removeEventListener(event, handler); | ||
}, | ||
isWorkerRuntime, | ||
postMessageToMaster, | ||
subscribeToMasterMessages | ||
postMessage | ||
}; | ||
export default Implementation; |
/// <reference lib="dom" /> | ||
// tslint:disable no-shadowed-variable | ||
import { multiplexEventTarget } from "../util/events"; | ||
if (typeof self === "undefined") { | ||
@@ -9,25 +10,8 @@ global.self = global; | ||
}; | ||
const postMessageToMaster = function postMessageToMaster(data) { | ||
const postMessage = function postMessage(data) { | ||
// TODO: Warn that Transferables are not supported on first attempt to use feature | ||
self.postMessage(data); | ||
}; | ||
let muxingHandlerSetUp = false; | ||
const messageHandlers = new Set(); | ||
const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) { | ||
if (!muxingHandlerSetUp) { | ||
// We have one multiplexing message handler as tiny-worker's | ||
// addEventListener() only allows you to set a single message handler | ||
self.addEventListener("message", ((event) => { | ||
messageHandlers.forEach(handler => handler(event.data)); | ||
})); | ||
muxingHandlerSetUp = true; | ||
} | ||
messageHandlers.add(onMessage); | ||
const unsubscribe = () => messageHandlers.delete(onMessage); | ||
return unsubscribe; | ||
}; | ||
export default { | ||
isWorkerRuntime, | ||
postMessageToMaster, | ||
subscribeToMasterMessages | ||
}; | ||
const Implementation = Object.assign(Object.assign({}, multiplexEventTarget(self)), { isWorkerRuntime, | ||
postMessage }); | ||
export default Implementation; |
@@ -11,19 +11,5 @@ import WorkerThreads from "../worker_threads"; | ||
}; | ||
const postMessageToMaster = function postMessageToMaster(data, transferList) { | ||
const postMessage = function postMessage(data, transferList) { | ||
assertMessagePort(WorkerThreads().parentPort).postMessage(data, transferList); | ||
}; | ||
const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) { | ||
const parentPort = WorkerThreads().parentPort; | ||
if (!parentPort) { | ||
throw Error("Invariant violation: MessagePort to parent is not available."); | ||
} | ||
const messageHandler = (message) => { | ||
onMessage(message); | ||
}; | ||
const unsubscribe = () => { | ||
assertMessagePort(parentPort).off("message", messageHandler); | ||
}; | ||
assertMessagePort(parentPort).on("message", messageHandler); | ||
return unsubscribe; | ||
}; | ||
function testImplementation() { | ||
@@ -33,7 +19,17 @@ // Will throw if `worker_threads` are not available | ||
} | ||
export default { | ||
const Implementation = { | ||
addEventListener(event, listener) { | ||
const port = assertMessagePort(WorkerThreads().parentPort); | ||
return event === "message" | ||
? port.on(event, (data) => listener({ data })) | ||
: port.on(event, listener); | ||
}, | ||
removeEventListener(event, listener) { | ||
const port = assertMessagePort(WorkerThreads().parentPort); | ||
return port.off(event, listener); | ||
}, | ||
isWorkerRuntime, | ||
postMessageToMaster, | ||
subscribeToMasterMessages, | ||
postMessage, | ||
testImplementation | ||
}; | ||
export default Implementation; |
@@ -1,36 +0,14 @@ | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
import isSomeObservable from "is-observable"; | ||
import { deserialize, serialize } from "../common"; | ||
import { isTransferDescriptor } from "../transferable"; | ||
import { MasterMessageType, WorkerMessageType } from "../types/messages"; | ||
import DebugLogger from "debug"; | ||
import { handleCallCancellations, handleFunctionInvocations } from "../common/call-proxy"; | ||
import { Callback, SingleExposedCallback } from "../common/callbacks"; | ||
import { getRegisteredSerializer, serialize } from "../common/serialization"; | ||
import { WorkerMessageType } from "../types/messages"; | ||
import Implementation from "./implementation"; | ||
export { registerSerializer } from "../common"; | ||
export { Transfer } from "../transferable"; | ||
export { Callback } from "../common/callbacks"; | ||
export { registerSerializer } from "../common/serialization"; | ||
export { Transfer } from "../common/transferable"; | ||
/** Returns `true` if this code is currently running in a worker. */ | ||
export const isWorkerRuntime = Implementation.isWorkerRuntime; | ||
let exposeCalled = false; | ||
const activeSubscriptions = new Map(); | ||
const isMasterJobCancelMessage = (thing) => thing && thing.type === MasterMessageType.cancel; | ||
const isMasterJobRunMessage = (thing) => thing && thing.type === MasterMessageType.run; | ||
/** | ||
* There are issues with `is-observable` not recognizing zen-observable's instances. | ||
* We are using `observable-fns`, but it's based on zen-observable, too. | ||
*/ | ||
const isObservable = (thing) => isSomeObservable(thing) || isZenObservable(thing); | ||
function isZenObservable(thing) { | ||
return thing && typeof thing === "object" && typeof thing.subscribe === "function"; | ||
} | ||
function deconstructTransfer(thing) { | ||
return isTransferDescriptor(thing) | ||
? { payload: thing.send, transferables: thing.transferables } | ||
: { payload: thing, transferables: undefined }; | ||
} | ||
const debugIncomingMessages = DebugLogger("threads:worker:messages"); | ||
function postFunctionInitMessage() { | ||
@@ -43,5 +21,5 @@ const initMessage = { | ||
}; | ||
Implementation.postMessageToMaster(initMessage); | ||
Implementation.postMessage(initMessage); | ||
} | ||
function postModuleInitMessage(methodNames) { | ||
function postModuleInitMessage(methods) { | ||
const initMessage = { | ||
@@ -51,34 +29,7 @@ type: WorkerMessageType.init, | ||
type: "module", | ||
methods: methodNames | ||
methods | ||
} | ||
}; | ||
Implementation.postMessageToMaster(initMessage); | ||
Implementation.postMessage(initMessage); | ||
} | ||
function postJobErrorMessage(uid, rawError) { | ||
const { payload: error, transferables } = deconstructTransfer(rawError); | ||
const errorMessage = { | ||
type: WorkerMessageType.error, | ||
uid, | ||
error: serialize(error) | ||
}; | ||
Implementation.postMessageToMaster(errorMessage, transferables); | ||
} | ||
function postJobResultMessage(uid, completed, resultValue) { | ||
const { payload, transferables } = deconstructTransfer(resultValue); | ||
const resultMessage = { | ||
type: WorkerMessageType.result, | ||
uid, | ||
complete: completed ? true : undefined, | ||
payload | ||
}; | ||
Implementation.postMessageToMaster(resultMessage, transferables); | ||
} | ||
function postJobStartMessage(uid, resultType) { | ||
const startMessage = { | ||
type: WorkerMessageType.running, | ||
uid, | ||
resultType | ||
}; | ||
Implementation.postMessageToMaster(startMessage); | ||
} | ||
function postUncaughtErrorMessage(error) { | ||
@@ -90,3 +41,3 @@ try { | ||
}; | ||
Implementation.postMessageToMaster(errorMessage); | ||
Implementation.postMessage(errorMessage); | ||
} | ||
@@ -100,34 +51,2 @@ catch (subError) { | ||
} | ||
function runFunction(jobUID, fn, args) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
let syncResult; | ||
try { | ||
syncResult = fn(...args); | ||
} | ||
catch (error) { | ||
return postJobErrorMessage(jobUID, error); | ||
} | ||
const resultType = isObservable(syncResult) ? "observable" : "promise"; | ||
postJobStartMessage(jobUID, resultType); | ||
if (isObservable(syncResult)) { | ||
const subscription = syncResult.subscribe(value => postJobResultMessage(jobUID, false, serialize(value)), error => { | ||
postJobErrorMessage(jobUID, serialize(error)); | ||
activeSubscriptions.delete(jobUID); | ||
}, () => { | ||
postJobResultMessage(jobUID, true); | ||
activeSubscriptions.delete(jobUID); | ||
}); | ||
activeSubscriptions.set(jobUID, subscription); | ||
} | ||
else { | ||
try { | ||
const result = yield syncResult; | ||
postJobResultMessage(jobUID, true, serialize(result)); | ||
} | ||
catch (error) { | ||
postJobErrorMessage(jobUID, serialize(error)); | ||
} | ||
} | ||
}); | ||
} | ||
/** | ||
@@ -149,17 +68,13 @@ * Expose a function or a module (an object whose values are functions) | ||
if (typeof exposed === "function") { | ||
Implementation.subscribeToMasterMessages(messageData => { | ||
if (isMasterJobRunMessage(messageData) && !messageData.method) { | ||
runFunction(messageData.uid, exposed, messageData.args.map(deserialize)); | ||
} | ||
}); | ||
SingleExposedCallback(exposed); | ||
handleFunctionInvocations(Implementation, getRegisteredSerializer(), debugIncomingMessages); | ||
postFunctionInitMessage(); | ||
} | ||
else if (typeof exposed === "object" && exposed) { | ||
Implementation.subscribeToMasterMessages(messageData => { | ||
if (isMasterJobRunMessage(messageData) && messageData.method) { | ||
runFunction(messageData.uid, exposed[messageData.method], messageData.args.map(deserialize)); | ||
} | ||
}); | ||
const methodNames = Object.keys(exposed).filter(key => typeof exposed[key] === "function"); | ||
postModuleInitMessage(methodNames); | ||
const methods = Object.keys(exposed).reduce((reduced, methodName) => { | ||
const callback = Callback(exposed[methodName]); | ||
return Object.assign(Object.assign({}, reduced), { [methodName]: callback.id }); | ||
}, {}); | ||
handleFunctionInvocations(Implementation, getRegisteredSerializer(), debugIncomingMessages); | ||
postModuleInitMessage(methods); | ||
} | ||
@@ -169,12 +84,3 @@ else { | ||
} | ||
Implementation.subscribeToMasterMessages(messageData => { | ||
if (isMasterJobCancelMessage(messageData)) { | ||
const jobUID = messageData.uid; | ||
const subscription = activeSubscriptions.get(jobUID); | ||
if (subscription) { | ||
subscription.unsubscribe(); | ||
activeSubscriptions.delete(jobUID); | ||
} | ||
} | ||
}); | ||
handleCallCancellations(Implementation, debugIncomingMessages); | ||
} | ||
@@ -181,0 +87,0 @@ if (typeof self !== "undefined" && typeof self.addEventListener === "function" && Implementation.isWorkerRuntime()) { |
@@ -1,5 +0,6 @@ | ||
export { registerSerializer } from "./common"; | ||
export { Callback } from "./common/callbacks"; | ||
export { registerSerializer } from "./common/serialization"; | ||
export * from "./master/index"; | ||
export { expose } from "./worker/index"; | ||
export { DefaultSerializer, JsonSerializable, Serializer, SerializerImplementation } from "./serializers"; | ||
export { Transfer, TransferDescriptor } from "./transferable"; | ||
export { DefaultSerializer, JsonSerializable, Serializer, SerializerImplementation } from "./serializers/index"; | ||
export { Transfer, TransferDescriptor } from "./common/transferable"; |
@@ -13,10 +13,12 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var common_1 = require("./common"); | ||
Object.defineProperty(exports, "registerSerializer", { enumerable: true, get: function () { return common_1.registerSerializer; } }); | ||
var callbacks_1 = require("./common/callbacks"); | ||
Object.defineProperty(exports, "Callback", { enumerable: true, get: function () { return callbacks_1.Callback; } }); | ||
var serialization_1 = require("./common/serialization"); | ||
Object.defineProperty(exports, "registerSerializer", { enumerable: true, get: function () { return serialization_1.registerSerializer; } }); | ||
__exportStar(require("./master/index"), exports); | ||
var index_1 = require("./worker/index"); | ||
Object.defineProperty(exports, "expose", { enumerable: true, get: function () { return index_1.expose; } }); | ||
var serializers_1 = require("./serializers"); | ||
Object.defineProperty(exports, "DefaultSerializer", { enumerable: true, get: function () { return serializers_1.DefaultSerializer; } }); | ||
var transferable_1 = require("./transferable"); | ||
var index_2 = require("./serializers/index"); | ||
Object.defineProperty(exports, "DefaultSerializer", { enumerable: true, get: function () { return index_2.DefaultSerializer; } }); | ||
var transferable_1 = require("./common/transferable"); | ||
Object.defineProperty(exports, "Transfer", { enumerable: true, get: function () { return transferable_1.Transfer; } }); |
@@ -179,3 +179,3 @@ "use strict"; | ||
this.onerror = (error) => this.emitter.emit("error", error); | ||
this.onmessage = (message) => this.emitter.emit("message", message); | ||
this.onmessage = (event) => this.emitter.emit("message", event); | ||
} | ||
@@ -182,0 +182,0 @@ addEventListener(eventName, listener) { |
import type { BlobWorker as BlobWorkerClass } from "../types/master"; | ||
import { Worker as WorkerType } from "../types/master"; | ||
import { isWorkerRuntime } from "./implementation"; | ||
export { Callback } from "../common/callbacks"; | ||
export { FunctionThread, ModuleThread } from "../types/master"; | ||
@@ -5,0 +6,0 @@ export { Pool } from "./pool"; |
@@ -6,2 +6,4 @@ "use strict"; | ||
Object.defineProperty(exports, "isWorkerRuntime", { enumerable: true, get: function () { return implementation_1.isWorkerRuntime; } }); | ||
var callbacks_1 = require("../common/callbacks"); | ||
Object.defineProperty(exports, "Callback", { enumerable: true, get: function () { return callbacks_1.Callback; } }); | ||
var pool_1 = require("./pool"); | ||
@@ -8,0 +10,0 @@ Object.defineProperty(exports, "Pool", { enumerable: true, get: function () { return pool_1.Pool; } }); |
@@ -227,6 +227,11 @@ "use strict"; | ||
} | ||
const taskCompleted = () => this.taskCompletion(task.id); | ||
let taskCompletionDotThen; | ||
const taskID = this.nextTaskID++; | ||
const taskCompletion = this.taskCompletion(taskID); | ||
taskCompletion.catch((error) => { | ||
// Prevent unhandled rejections here as we assume the user will use | ||
// `pool.completed()`, `pool.settled()` or `task.catch()` to handle errors | ||
this.debug(`Task #${taskID} errored:`, error); | ||
}); | ||
const task = { | ||
id: this.nextTaskID++, | ||
id: taskID, | ||
run: taskFunction, | ||
@@ -242,9 +247,3 @@ cancel: () => { | ||
}, | ||
get then() { | ||
if (!taskCompletionDotThen) { | ||
const promise = taskCompleted(); | ||
taskCompletionDotThen = promise.then.bind(promise); | ||
} | ||
return taskCompletionDotThen; | ||
} | ||
then: taskCompletion.then.bind(taskCompletion) | ||
}; | ||
@@ -251,0 +250,0 @@ if (this.taskQueue.length >= maxQueuedJobs) { |
@@ -18,7 +18,7 @@ "use strict"; | ||
const observable_fns_1 = require("observable-fns"); | ||
const common_1 = require("../common"); | ||
const promise_1 = require("../promise"); | ||
const call_proxy_1 = require("../common/call-proxy"); | ||
const serialization_1 = require("../common/serialization"); | ||
const symbols_1 = require("../symbols"); | ||
const master_1 = require("../types/master"); | ||
const invocation_proxy_1 = require("./invocation-proxy"); | ||
const promise_1 = require("../util/promise"); | ||
const debugMessages = debug_1.default("threads:master:messages"); | ||
@@ -56,3 +56,3 @@ const debugSpawn = debug_1.default("threads:master:spawn"); | ||
worker.removeEventListener("message", messageHandler); | ||
reject(common_1.deserialize(event.data.error)); | ||
reject(serialization_1.deserialize(event.data.error, worker)); | ||
} | ||
@@ -131,8 +131,11 @@ }); | ||
const events = createEventObservable(worker, termination); | ||
const serializer = serialization_1.getRegisteredSerializer(); | ||
if (exposed.type === "function") { | ||
const proxy = invocation_proxy_1.createProxyFunction(worker); | ||
const proxy = call_proxy_1.createProxyFunction(worker, serializer, 0, debugMessages); | ||
call_proxy_1.handleFunctionInvocations(worker, serializer, debugMessages); | ||
return setPrivateThreadProps(proxy, worker, events, terminate); | ||
} | ||
else if (exposed.type === "module") { | ||
const proxy = invocation_proxy_1.createProxyModule(worker, exposed.methods); | ||
const proxy = call_proxy_1.createProxyModule(worker, serializer, exposed.methods, debugMessages); | ||
call_proxy_1.handleFunctionInvocations(worker, serializer, debugMessages); | ||
return setPrivateThreadProps(proxy, worker, events, terminate); | ||
@@ -139,0 +142,0 @@ } |
@@ -0,1 +1,2 @@ | ||
export declare const $callback: unique symbol; | ||
export declare const $errors: unique symbol; | ||
@@ -2,0 +3,0 @@ export declare const $events: unique symbol; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.$worker = exports.$transferable = exports.$terminate = exports.$events = exports.$errors = void 0; | ||
exports.$worker = exports.$transferable = exports.$terminate = exports.$events = exports.$errors = exports.$callback = void 0; | ||
exports.$callback = Symbol("thread.callback"); | ||
exports.$errors = Symbol("thread.errors"); | ||
@@ -5,0 +6,0 @@ exports.$events = Symbol("thread.events"); |
/// <reference lib="dom" /> | ||
import { Observable } from "observable-fns"; | ||
import { ObservablePromise } from "../observable-promise"; | ||
import { ObservablePromise } from "../common/observable-promise"; | ||
import { $errors, $events, $terminate, $worker } from "../symbols"; | ||
import { MessageRelay, TransferList } from "./common"; | ||
interface ObservableLikeSubscription { | ||
@@ -17,6 +18,7 @@ unsubscribe(): any; | ||
export declare type StripAsync<Type> = Type extends Promise<infer PromiseBaseType> ? PromiseBaseType : Type extends ObservableLike<infer ObservableBaseType> ? ObservableBaseType : Type; | ||
export declare type AsyncifyIterator<Type> = Type extends Iterator<infer T> ? AsyncIterator<T> & AsyncIterable<T> : Type extends AsyncIterator<infer T2> ? AsyncIterator<T2> & AsyncIterable<T2> : Type; | ||
export declare type ModuleMethods = { | ||
[methodName: string]: (...args: any) => any; | ||
}; | ||
export declare type ProxyableFunction<Args extends any[], ReturnType> = Args extends [] ? () => ObservablePromise<StripAsync<ReturnType>> : (...args: Args) => ObservablePromise<StripAsync<ReturnType>>; | ||
export declare type ProxyableFunction<Args extends any[], ReturnType> = Args extends [] ? () => ObservablePromise<AsyncifyIterator<StripAsync<ReturnType>>> : (...args: Args) => ObservablePromise<AsyncifyIterator<StripAsync<ReturnType>>>; | ||
export declare type ModuleProxy<Methods extends ModuleMethods> = { | ||
@@ -40,6 +42,5 @@ [method in keyof Methods]: ProxyableFunction<Parameters<Methods[method]>, ReturnType<Methods[method]>>; | ||
export declare type Thread = AnyFunctionThread | AnyModuleThread; | ||
export declare type TransferList = Transferable[]; | ||
/** Worker instance. Either a web worker or a node.js Worker provided by `worker_threads` or `tiny-worker`. */ | ||
export interface Worker extends EventTarget { | ||
postMessage(value: any, transferList?: TransferList): void; | ||
export interface Worker extends MessageRelay { | ||
removeEventListener(event: string, listener: EventListener): any; | ||
terminate(callback?: (error?: Error, exitCode?: number) => void): void; | ||
@@ -59,2 +60,3 @@ } | ||
}; | ||
timeout?: number; | ||
} | ||
@@ -64,3 +66,5 @@ /** Worker implementation. Either web worker or a node.js Worker class. */ | ||
constructor(path: string, options?: ThreadsWorkerOptions); | ||
addEventListener: MessageRelay["addEventListener"]; | ||
postMessage(value: any, transferList?: TransferList): void; | ||
removeEventListener(event: string, listener: EventListener): any; | ||
terminate(): void; | ||
@@ -67,0 +71,0 @@ } |
@@ -1,27 +0,39 @@ | ||
export interface SerializedError { | ||
__error_marker: "$$error"; | ||
message: string; | ||
name: string; | ||
stack?: string; | ||
import { SerializedError } from "./serializers"; | ||
export declare enum CommonMessageType { | ||
cancel = "call:cancel", | ||
error = "call:error", | ||
invoke = "call:invoke", | ||
result = "call:result", | ||
running = "call:running" | ||
} | ||
export declare enum MasterMessageType { | ||
cancel = "cancel", | ||
run = "run" | ||
} | ||
export declare type MasterJobCancelMessage = { | ||
type: MasterMessageType.cancel; | ||
export declare type CallCancelMessage = { | ||
type: CommonMessageType.cancel; | ||
uid: number; | ||
}; | ||
export declare type MasterJobRunMessage = { | ||
type: MasterMessageType.run; | ||
export declare type CallErrorMessage = { | ||
type: CommonMessageType.error; | ||
uid: number; | ||
method?: string; | ||
error: SerializedError; | ||
}; | ||
export declare type CallInvocationMessage = { | ||
type: CommonMessageType.invoke; | ||
/** Function ID */ | ||
fid: number; | ||
/** Unique call ID */ | ||
uid: number; | ||
args: any[]; | ||
}; | ||
export declare type MasterSentMessage = MasterJobCancelMessage | MasterJobRunMessage; | ||
export declare type CallResultMessage = { | ||
type: CommonMessageType.result; | ||
uid: number; | ||
complete?: true; | ||
payload?: any; | ||
}; | ||
export declare type CallRunningMessage = { | ||
type: CommonMessageType.running; | ||
uid: number; | ||
resultType: "observable" | "promise"; | ||
}; | ||
export declare enum WorkerMessageType { | ||
error = "error", | ||
init = "init", | ||
result = "result", | ||
running = "running", | ||
uncaughtError = "uncaughtError" | ||
@@ -43,21 +55,4 @@ } | ||
type: "module"; | ||
methods: string[]; | ||
methods: Record<string, number>; | ||
}; | ||
}; | ||
export declare type WorkerJobErrorMessage = { | ||
type: WorkerMessageType.error; | ||
uid: number; | ||
error: SerializedError; | ||
}; | ||
export declare type WorkerJobResultMessage = { | ||
type: WorkerMessageType.result; | ||
uid: number; | ||
complete?: true; | ||
payload?: any; | ||
}; | ||
export declare type WorkerJobStartMessage = { | ||
type: WorkerMessageType.running; | ||
uid: number; | ||
resultType: "observable" | "promise"; | ||
}; | ||
export declare type WorkerSentMessage = WorkerInitMessage | WorkerJobErrorMessage | WorkerJobResultMessage | WorkerJobStartMessage | WorkerUncaughtErrorMessage; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.WorkerMessageType = exports.MasterMessageType = void 0; | ||
///////////////////////////// | ||
// Messages sent by master: | ||
var MasterMessageType; | ||
(function (MasterMessageType) { | ||
MasterMessageType["cancel"] = "cancel"; | ||
MasterMessageType["run"] = "run"; | ||
})(MasterMessageType = exports.MasterMessageType || (exports.MasterMessageType = {})); | ||
exports.WorkerMessageType = exports.CommonMessageType = void 0; | ||
var CommonMessageType; | ||
(function (CommonMessageType) { | ||
CommonMessageType["cancel"] = "call:cancel"; | ||
CommonMessageType["error"] = "call:error"; | ||
CommonMessageType["invoke"] = "call:invoke"; | ||
CommonMessageType["result"] = "call:result"; | ||
CommonMessageType["running"] = "call:running"; | ||
})(CommonMessageType = exports.CommonMessageType || (exports.CommonMessageType = {})); | ||
//////////////////////////// | ||
@@ -15,7 +16,4 @@ // Messages sent by worker: | ||
(function (WorkerMessageType) { | ||
WorkerMessageType["error"] = "error"; | ||
WorkerMessageType["init"] = "init"; | ||
WorkerMessageType["result"] = "result"; | ||
WorkerMessageType["running"] = "running"; | ||
WorkerMessageType["uncaughtError"] = "uncaughtError"; | ||
})(WorkerMessageType = exports.WorkerMessageType || (exports.WorkerMessageType = {})); |
@@ -1,6 +0,4 @@ | ||
declare type UnsubscribeFn = () => void; | ||
export interface AbstractedWorkerAPI { | ||
import { MessageRelay } from "./common"; | ||
export interface AbstractedWorkerAPI extends MessageRelay { | ||
isWorkerRuntime(): boolean; | ||
postMessageToMaster(message: any, transferList?: Transferable[]): void; | ||
subscribeToMasterMessages(onMessage: (data: any) => void): UnsubscribeFn; | ||
} | ||
@@ -11,2 +9,1 @@ export declare type WorkerFunction = ((...args: any[]) => any) | (() => any); | ||
}; | ||
export {}; |
/// <reference lib="dom" /> | ||
declare const _default: { | ||
isWorkerRuntime: () => boolean; | ||
postMessageToMaster: (message: any, transferList?: Transferable[] | undefined) => void; | ||
subscribeToMasterMessages: (onMessage: (data: any) => void) => () => void; | ||
}; | ||
export default _default; | ||
import { AbstractedWorkerAPI } from "../types/worker"; | ||
declare const Implementation: AbstractedWorkerAPI; | ||
export default Implementation; |
@@ -5,2 +5,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const events_1 = require("../util/events"); | ||
const isWorkerRuntime = function isWorkerRuntime() { | ||
@@ -10,19 +11,18 @@ const isWindowContext = typeof self !== "undefined" && typeof Window !== "undefined" && self instanceof Window; | ||
}; | ||
const postMessageToMaster = function postMessageToMaster(data, transferList) { | ||
const postMessage = function postMessageToMaster(data, transferList) { | ||
self.postMessage(data, transferList); | ||
}; | ||
const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) { | ||
const messageHandler = (messageEvent) => { | ||
onMessage(messageEvent.data); | ||
}; | ||
const unsubscribe = () => { | ||
self.removeEventListener("message", messageHandler); | ||
}; | ||
self.addEventListener("message", messageHandler); | ||
return unsubscribe; | ||
}; | ||
exports.default = { | ||
let muxedSelfEvents; | ||
const Implementation = { | ||
addEventListener(event, handler) { | ||
muxedSelfEvents = muxedSelfEvents || events_1.multiplexEventTarget(self); | ||
return muxedSelfEvents.addEventListener(event, handler); | ||
}, | ||
removeEventListener(event, handler) { | ||
muxedSelfEvents = muxedSelfEvents || events_1.multiplexEventTarget(self); | ||
return muxedSelfEvents.removeEventListener(event, handler); | ||
}, | ||
isWorkerRuntime, | ||
postMessageToMaster, | ||
subscribeToMasterMessages | ||
postMessage | ||
}; | ||
exports.default = Implementation; |
/// <reference lib="dom" /> | ||
declare const _default: { | ||
isWorkerRuntime: () => boolean; | ||
postMessageToMaster: (message: any, transferList?: Transferable[] | undefined) => void; | ||
subscribeToMasterMessages: (onMessage: (data: any) => void) => () => void; | ||
}; | ||
export default _default; | ||
import { AbstractedWorkerAPI } from "../types/worker"; | ||
declare const Implementation: AbstractedWorkerAPI; | ||
export default Implementation; |
@@ -5,2 +5,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const events_1 = require("../util/events"); | ||
if (typeof self === "undefined") { | ||
@@ -12,25 +13,8 @@ global.self = global; | ||
}; | ||
const postMessageToMaster = function postMessageToMaster(data) { | ||
const postMessage = function postMessage(data) { | ||
// TODO: Warn that Transferables are not supported on first attempt to use feature | ||
self.postMessage(data); | ||
}; | ||
let muxingHandlerSetUp = false; | ||
const messageHandlers = new Set(); | ||
const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) { | ||
if (!muxingHandlerSetUp) { | ||
// We have one multiplexing message handler as tiny-worker's | ||
// addEventListener() only allows you to set a single message handler | ||
self.addEventListener("message", ((event) => { | ||
messageHandlers.forEach(handler => handler(event.data)); | ||
})); | ||
muxingHandlerSetUp = true; | ||
} | ||
messageHandlers.add(onMessage); | ||
const unsubscribe = () => messageHandlers.delete(onMessage); | ||
return unsubscribe; | ||
}; | ||
exports.default = { | ||
isWorkerRuntime, | ||
postMessageToMaster, | ||
subscribeToMasterMessages | ||
}; | ||
const Implementation = Object.assign(Object.assign({}, events_1.multiplexEventTarget(self)), { isWorkerRuntime, | ||
postMessage }); | ||
exports.default = Implementation; |
@@ -0,8 +1,6 @@ | ||
import { AbstractedWorkerAPI } from "../types/worker"; | ||
declare function testImplementation(): void; | ||
declare const _default: { | ||
isWorkerRuntime: () => boolean; | ||
postMessageToMaster: (message: any, transferList?: Transferable[] | undefined) => void; | ||
subscribeToMasterMessages: (onMessage: (data: any) => void) => () => void; | ||
declare const Implementation: AbstractedWorkerAPI & { | ||
testImplementation: typeof testImplementation; | ||
}; | ||
export default _default; | ||
export default Implementation; |
@@ -16,19 +16,5 @@ "use strict"; | ||
}; | ||
const postMessageToMaster = function postMessageToMaster(data, transferList) { | ||
const postMessage = function postMessage(data, transferList) { | ||
assertMessagePort(worker_threads_1.default().parentPort).postMessage(data, transferList); | ||
}; | ||
const subscribeToMasterMessages = function subscribeToMasterMessages(onMessage) { | ||
const parentPort = worker_threads_1.default().parentPort; | ||
if (!parentPort) { | ||
throw Error("Invariant violation: MessagePort to parent is not available."); | ||
} | ||
const messageHandler = (message) => { | ||
onMessage(message); | ||
}; | ||
const unsubscribe = () => { | ||
assertMessagePort(parentPort).off("message", messageHandler); | ||
}; | ||
assertMessagePort(parentPort).on("message", messageHandler); | ||
return unsubscribe; | ||
}; | ||
function testImplementation() { | ||
@@ -38,7 +24,17 @@ // Will throw if `worker_threads` are not available | ||
} | ||
exports.default = { | ||
const Implementation = { | ||
addEventListener(event, listener) { | ||
const port = assertMessagePort(worker_threads_1.default().parentPort); | ||
return event === "message" | ||
? port.on(event, (data) => listener({ data })) | ||
: port.on(event, listener); | ||
}, | ||
removeEventListener(event, listener) { | ||
const port = assertMessagePort(worker_threads_1.default().parentPort); | ||
return port.off(event, listener); | ||
}, | ||
isWorkerRuntime, | ||
postMessageToMaster, | ||
subscribeToMasterMessages, | ||
postMessage, | ||
testImplementation | ||
}; | ||
exports.default = Implementation; |
import { WorkerFunction, WorkerModule } from "../types/worker"; | ||
export { registerSerializer } from "../common"; | ||
export { Transfer } from "../transferable"; | ||
export { Callback } from "../common/callbacks"; | ||
export { registerSerializer } from "../common/serialization"; | ||
export { Transfer } from "../common/transferable"; | ||
/** Returns `true` if this code is currently running in a worker. */ | ||
@@ -5,0 +6,0 @@ export declare const isWorkerRuntime: () => boolean; |
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
@@ -16,30 +7,18 @@ return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
exports.expose = exports.isWorkerRuntime = void 0; | ||
const is_observable_1 = __importDefault(require("is-observable")); | ||
const common_1 = require("../common"); | ||
const transferable_1 = require("../transferable"); | ||
const debug_1 = __importDefault(require("debug")); | ||
const call_proxy_1 = require("../common/call-proxy"); | ||
const callbacks_1 = require("../common/callbacks"); | ||
const serialization_1 = require("../common/serialization"); | ||
const messages_1 = require("../types/messages"); | ||
const implementation_1 = __importDefault(require("./implementation")); | ||
var common_2 = require("../common"); | ||
Object.defineProperty(exports, "registerSerializer", { enumerable: true, get: function () { return common_2.registerSerializer; } }); | ||
var transferable_2 = require("../transferable"); | ||
Object.defineProperty(exports, "Transfer", { enumerable: true, get: function () { return transferable_2.Transfer; } }); | ||
var callbacks_2 = require("../common/callbacks"); | ||
Object.defineProperty(exports, "Callback", { enumerable: true, get: function () { return callbacks_2.Callback; } }); | ||
var serialization_2 = require("../common/serialization"); | ||
Object.defineProperty(exports, "registerSerializer", { enumerable: true, get: function () { return serialization_2.registerSerializer; } }); | ||
var transferable_1 = require("../common/transferable"); | ||
Object.defineProperty(exports, "Transfer", { enumerable: true, get: function () { return transferable_1.Transfer; } }); | ||
/** Returns `true` if this code is currently running in a worker. */ | ||
exports.isWorkerRuntime = implementation_1.default.isWorkerRuntime; | ||
let exposeCalled = false; | ||
const activeSubscriptions = new Map(); | ||
const isMasterJobCancelMessage = (thing) => thing && thing.type === messages_1.MasterMessageType.cancel; | ||
const isMasterJobRunMessage = (thing) => thing && thing.type === messages_1.MasterMessageType.run; | ||
/** | ||
* There are issues with `is-observable` not recognizing zen-observable's instances. | ||
* We are using `observable-fns`, but it's based on zen-observable, too. | ||
*/ | ||
const isObservable = (thing) => is_observable_1.default(thing) || isZenObservable(thing); | ||
function isZenObservable(thing) { | ||
return thing && typeof thing === "object" && typeof thing.subscribe === "function"; | ||
} | ||
function deconstructTransfer(thing) { | ||
return transferable_1.isTransferDescriptor(thing) | ||
? { payload: thing.send, transferables: thing.transferables } | ||
: { payload: thing, transferables: undefined }; | ||
} | ||
const debugIncomingMessages = debug_1.default("threads:worker:messages"); | ||
function postFunctionInitMessage() { | ||
@@ -52,5 +31,5 @@ const initMessage = { | ||
}; | ||
implementation_1.default.postMessageToMaster(initMessage); | ||
implementation_1.default.postMessage(initMessage); | ||
} | ||
function postModuleInitMessage(methodNames) { | ||
function postModuleInitMessage(methods) { | ||
const initMessage = { | ||
@@ -60,34 +39,7 @@ type: messages_1.WorkerMessageType.init, | ||
type: "module", | ||
methods: methodNames | ||
methods | ||
} | ||
}; | ||
implementation_1.default.postMessageToMaster(initMessage); | ||
implementation_1.default.postMessage(initMessage); | ||
} | ||
function postJobErrorMessage(uid, rawError) { | ||
const { payload: error, transferables } = deconstructTransfer(rawError); | ||
const errorMessage = { | ||
type: messages_1.WorkerMessageType.error, | ||
uid, | ||
error: common_1.serialize(error) | ||
}; | ||
implementation_1.default.postMessageToMaster(errorMessage, transferables); | ||
} | ||
function postJobResultMessage(uid, completed, resultValue) { | ||
const { payload, transferables } = deconstructTransfer(resultValue); | ||
const resultMessage = { | ||
type: messages_1.WorkerMessageType.result, | ||
uid, | ||
complete: completed ? true : undefined, | ||
payload | ||
}; | ||
implementation_1.default.postMessageToMaster(resultMessage, transferables); | ||
} | ||
function postJobStartMessage(uid, resultType) { | ||
const startMessage = { | ||
type: messages_1.WorkerMessageType.running, | ||
uid, | ||
resultType | ||
}; | ||
implementation_1.default.postMessageToMaster(startMessage); | ||
} | ||
function postUncaughtErrorMessage(error) { | ||
@@ -97,5 +49,5 @@ try { | ||
type: messages_1.WorkerMessageType.uncaughtError, | ||
error: common_1.serialize(error) | ||
error: serialization_1.serialize(error) | ||
}; | ||
implementation_1.default.postMessageToMaster(errorMessage); | ||
implementation_1.default.postMessage(errorMessage); | ||
} | ||
@@ -109,34 +61,2 @@ catch (subError) { | ||
} | ||
function runFunction(jobUID, fn, args) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
let syncResult; | ||
try { | ||
syncResult = fn(...args); | ||
} | ||
catch (error) { | ||
return postJobErrorMessage(jobUID, error); | ||
} | ||
const resultType = isObservable(syncResult) ? "observable" : "promise"; | ||
postJobStartMessage(jobUID, resultType); | ||
if (isObservable(syncResult)) { | ||
const subscription = syncResult.subscribe(value => postJobResultMessage(jobUID, false, common_1.serialize(value)), error => { | ||
postJobErrorMessage(jobUID, common_1.serialize(error)); | ||
activeSubscriptions.delete(jobUID); | ||
}, () => { | ||
postJobResultMessage(jobUID, true); | ||
activeSubscriptions.delete(jobUID); | ||
}); | ||
activeSubscriptions.set(jobUID, subscription); | ||
} | ||
else { | ||
try { | ||
const result = yield syncResult; | ||
postJobResultMessage(jobUID, true, common_1.serialize(result)); | ||
} | ||
catch (error) { | ||
postJobErrorMessage(jobUID, common_1.serialize(error)); | ||
} | ||
} | ||
}); | ||
} | ||
/** | ||
@@ -158,17 +78,13 @@ * Expose a function or a module (an object whose values are functions) | ||
if (typeof exposed === "function") { | ||
implementation_1.default.subscribeToMasterMessages(messageData => { | ||
if (isMasterJobRunMessage(messageData) && !messageData.method) { | ||
runFunction(messageData.uid, exposed, messageData.args.map(common_1.deserialize)); | ||
} | ||
}); | ||
callbacks_1.SingleExposedCallback(exposed); | ||
call_proxy_1.handleFunctionInvocations(implementation_1.default, serialization_1.getRegisteredSerializer(), debugIncomingMessages); | ||
postFunctionInitMessage(); | ||
} | ||
else if (typeof exposed === "object" && exposed) { | ||
implementation_1.default.subscribeToMasterMessages(messageData => { | ||
if (isMasterJobRunMessage(messageData) && messageData.method) { | ||
runFunction(messageData.uid, exposed[messageData.method], messageData.args.map(common_1.deserialize)); | ||
} | ||
}); | ||
const methodNames = Object.keys(exposed).filter(key => typeof exposed[key] === "function"); | ||
postModuleInitMessage(methodNames); | ||
const methods = Object.keys(exposed).reduce((reduced, methodName) => { | ||
const callback = callbacks_1.Callback(exposed[methodName]); | ||
return Object.assign(Object.assign({}, reduced), { [methodName]: callback.id }); | ||
}, {}); | ||
call_proxy_1.handleFunctionInvocations(implementation_1.default, serialization_1.getRegisteredSerializer(), debugIncomingMessages); | ||
postModuleInitMessage(methods); | ||
} | ||
@@ -178,12 +94,3 @@ else { | ||
} | ||
implementation_1.default.subscribeToMasterMessages(messageData => { | ||
if (isMasterJobCancelMessage(messageData)) { | ||
const jobUID = messageData.uid; | ||
const subscription = activeSubscriptions.get(jobUID); | ||
if (subscription) { | ||
subscription.unsubscribe(); | ||
activeSubscriptions.delete(jobUID); | ||
} | ||
} | ||
}); | ||
call_proxy_1.handleCallCancellations(implementation_1.default, debugIncomingMessages); | ||
} | ||
@@ -190,0 +97,0 @@ exports.expose = expose; |
@@ -1,1 +0,1 @@ | ||
export * from "./dist/observable" | ||
export * from "./dist/util/observable" |
@@ -1,1 +0,1 @@ | ||
module.exports = require("./dist/observable") | ||
module.exports = require("./dist/util/observable") |
{ | ||
"name": "threads", | ||
"version": "1.6.2", | ||
"version": "1.6.3-callbacks", | ||
"description": "Web workers & worker threads as simple as a function call", | ||
@@ -91,3 +91,3 @@ "main": "dist/index.js", | ||
"rollup-plugin-node-resolve": "^5.1.0", | ||
"threads-plugin": "^1.2.0", | ||
"threads-plugin": "^1.3.2", | ||
"tiny-worker": "^2.2.0", | ||
@@ -94,0 +94,0 @@ "ts-loader": "^6.0.1", |
Sorry, the diff of this file is not supported yet
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
197937
126
4410
6
1