UNPKG

@xylabs/threads

Version:

Web workers & worker threads as simple as a function call

1 lines 27.5 kB
{"version":3,"sources":["../../../src/worker/expose.ts","../../../src/serializers.ts","../../../src/common.ts","../../../src/symbols.ts","../../../src/transferable.ts","../../../src/types/messages.ts","../../../src/worker/worker.browser.ts"],"sourcesContent":["/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-floating-promises */\n\nimport isSomeObservable from 'is-observable-2-1-0'\nimport type { Observable, Subscription } from 'observable-fns'\n\nimport { deserialize, serialize } from '../common.ts'\nimport type { TransferDescriptor } from '../transferable.ts'\nimport { isTransferDescriptor } from '../transferable.ts'\nimport type {\n MasterJobCancelMessage,\n MasterJobRunMessage,\n SerializedError,\n WorkerInitMessage,\n WorkerJobErrorMessage,\n WorkerJobResultMessage,\n WorkerJobStartMessage,\n WorkerUncaughtErrorMessage,\n} from '../types/messages.ts'\nimport {\n MasterMessageType,\n WorkerMessageType,\n} from '../types/messages.ts'\nimport type {\n AbstractedWorkerAPI, WorkerFunction, WorkerModule,\n} from '../types/worker.ts'\nimport type { WorkerGlobalScope } from './WorkerGlobalScope.ts'\n\nconst isErrorEvent = (value: Event): value is ErrorEvent => value && (value as ErrorEvent).error\n\nexport function createExpose(implementation: AbstractedWorkerAPI, self: WorkerGlobalScope) {\n let exposeCalled = false\n\n const activeSubscriptions = new Map<number, Subscription<any>>()\n\n const isMasterJobCancelMessage = (thing: any): thing is MasterJobCancelMessage => thing && thing.type === MasterMessageType.cancel\n const isMasterJobRunMessage = (thing: any): thing is MasterJobRunMessage => thing && thing.type === MasterMessageType.run\n\n /**\n * There are issues with `is-observable` not recognizing zen-observable's instances.\n * We are using `observable-fns`, but it's based on zen-observable, too.\n */\n const isObservable = (thing: any): thing is Observable<any> => isSomeObservable(thing) || isZenObservable(thing)\n\n function isZenObservable(thing: any): thing is Observable<any> {\n return thing && typeof thing === 'object' && typeof thing.subscribe === 'function'\n }\n\n function deconstructTransfer(thing: any) {\n return isTransferDescriptor(thing) ? { payload: thing.send, transferables: thing.transferables } : { payload: thing, transferables: undefined }\n }\n\n function postFunctionInitMessage() {\n const initMessage: WorkerInitMessage = {\n exposed: { type: 'function' },\n type: WorkerMessageType.init,\n }\n implementation.postMessageToMaster(initMessage)\n }\n\n function postModuleInitMessage(methodNames: string[]) {\n const initMessage: WorkerInitMessage = {\n exposed: {\n methods: methodNames,\n type: 'module',\n },\n type: WorkerMessageType.init,\n }\n implementation.postMessageToMaster(initMessage)\n }\n\n function postJobErrorMessage(uid: number, rawError: Error | TransferDescriptor<Error>) {\n const { payload: error, transferables } = deconstructTransfer(rawError)\n const errorMessage: WorkerJobErrorMessage = {\n error: serialize(error) as any as SerializedError,\n type: WorkerMessageType.error,\n uid,\n }\n implementation.postMessageToMaster(errorMessage, transferables)\n }\n\n function postJobResultMessage(uid: number, completed: boolean, resultValue?: any) {\n const { payload, transferables } = deconstructTransfer(resultValue)\n const resultMessage: WorkerJobResultMessage = {\n complete: completed ? true : undefined,\n payload,\n type: WorkerMessageType.result,\n uid,\n }\n implementation.postMessageToMaster(resultMessage, transferables)\n }\n\n function postJobStartMessage(uid: number, resultType: WorkerJobStartMessage['resultType']) {\n const startMessage: WorkerJobStartMessage = {\n resultType,\n type: WorkerMessageType.running,\n uid,\n }\n implementation.postMessageToMaster(startMessage)\n }\n\n function postUncaughtErrorMessage(error: Error) {\n try {\n const errorMessage: WorkerUncaughtErrorMessage = {\n error: serialize(error) as any as SerializedError,\n type: WorkerMessageType.uncaughtError,\n }\n implementation.postMessageToMaster(errorMessage)\n } catch (subError) {\n // tslint:disable-next-line no-console\n console.error(\n 'Not reporting uncaught error back to master thread as it ' + 'occured while reporting an uncaught error already.' + '\\nLatest error:',\n subError,\n '\\nOriginal error:',\n error,\n )\n }\n }\n\n async function runFunction(jobUID: number, fn: WorkerFunction, args: any[]) {\n let syncResult: any\n\n try {\n syncResult = fn(...args)\n } catch (ex) {\n const error = ex as Error\n return postJobErrorMessage(jobUID, error)\n }\n\n const resultType = isObservable(syncResult) ? 'observable' : 'promise'\n postJobStartMessage(jobUID, resultType)\n\n if (isObservable(syncResult)) {\n const subscription = syncResult.subscribe(\n value => postJobResultMessage(jobUID, false, serialize(value)),\n (error) => {\n postJobErrorMessage(jobUID, serialize(error) as any)\n activeSubscriptions.delete(jobUID)\n },\n () => {\n postJobResultMessage(jobUID, true)\n activeSubscriptions.delete(jobUID)\n },\n )\n activeSubscriptions.set(jobUID, subscription)\n } else {\n try {\n const result = await syncResult\n postJobResultMessage(jobUID, true, serialize(result))\n } catch (error) {\n postJobErrorMessage(jobUID, serialize(error) as any)\n }\n }\n }\n\n /**\n * Expose a function or a module (an object whose values are functions)\n * to the main thread. Must be called exactly once in every worker thread\n * to signal its API to the main thread.\n *\n * @param exposed Function or object whose values are functions\n */\n const expose = (exposed: WorkerFunction | WorkerModule<any>) => {\n if (!implementation.isWorkerRuntime()) {\n throw new Error('expose() called in the master thread.')\n }\n if (exposeCalled) {\n throw new Error('expose() called more than once. This is not possible. Pass an object to expose() if you want to expose multiple functions.')\n }\n exposeCalled = true\n\n if (typeof exposed === 'function') {\n implementation.subscribeToMasterMessages((messageData: unknown) => {\n if (isMasterJobRunMessage(messageData) && !messageData.method) {\n runFunction(messageData.uid, exposed, messageData.args.map(deserialize))\n }\n })\n postFunctionInitMessage()\n } else if (typeof exposed === 'object' && exposed) {\n implementation.subscribeToMasterMessages((messageData: unknown) => {\n if (isMasterJobRunMessage(messageData) && messageData.method) {\n runFunction(messageData.uid, exposed[messageData.method], messageData.args.map(deserialize))\n }\n })\n\n const methodNames = Object.keys(exposed).filter(key => typeof exposed[key] === 'function')\n postModuleInitMessage(methodNames)\n } else {\n throw new Error(`Invalid argument passed to expose(). Expected a function or an object, got: ${exposed}`)\n }\n\n implementation.subscribeToMasterMessages((messageData: unknown) => {\n if (isMasterJobCancelMessage(messageData)) {\n const jobUID = messageData.uid\n const subscription = activeSubscriptions.get(jobUID)\n\n if (subscription) {\n subscription.unsubscribe()\n activeSubscriptions.delete(jobUID)\n }\n }\n })\n }\n\n if (typeof globalThis !== 'undefined' && typeof self.addEventListener === 'function' && implementation.isWorkerRuntime()) {\n self.addEventListener('error', (event) => {\n // Post with some delay, so the master had some time to subscribe to messages\n setTimeout(() => postUncaughtErrorMessage(isErrorEvent(event) ? event.error : event), 250)\n })\n self.addEventListener('unhandledrejection', (event) => {\n const error = (event as any).reason\n if (error && typeof (error as any).message === 'string') {\n // Post with some delay, so the master had some time to subscribe to messages\n setTimeout(() => postUncaughtErrorMessage(error), 250)\n }\n })\n }\n\n if (typeof process !== 'undefined' && typeof process.on === 'function' && implementation.isWorkerRuntime()) {\n process.on('uncaughtException', (error) => {\n // Post with some delay, so the master had some time to subscribe to messages\n setTimeout(() => postUncaughtErrorMessage(error), 250)\n })\n process.on('unhandledRejection', (error) => {\n if (error && typeof (error as any).message === 'string') {\n // Post with some delay, so the master had some time to subscribe to messages\n setTimeout(() => postUncaughtErrorMessage(error as any), 250)\n }\n })\n }\n\n return expose\n}\n","/* eslint-disable import-x/no-internal-modules */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { SerializedError } from './types/messages.ts'\n\nexport interface Serializer<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg): Input\n serialize(input: Input): Msg\n}\n\nexport interface SerializerImplementation<Msg = JsonSerializable, Input = any> {\n deserialize(message: Msg, defaultDeserialize: (msg: Msg) => Input): Input\n serialize(input: Input, defaultSerialize: (inp: Input) => Msg): Msg\n}\n\nexport function extendSerializer<MessageType, InputType = any>(\n extend: Serializer<MessageType, InputType>,\n implementation: SerializerImplementation<MessageType, InputType>,\n): Serializer<MessageType, InputType> {\n const fallbackDeserializer = extend.deserialize.bind(extend)\n const fallbackSerializer = extend.serialize.bind(extend)\n\n return {\n deserialize(message: MessageType): InputType {\n return implementation.deserialize(message, fallbackDeserializer)\n },\n\n serialize(input: InputType): MessageType {\n return implementation.serialize(input, fallbackSerializer)\n },\n }\n}\n\ntype JsonSerializablePrimitive = string | number | boolean | null\n\ntype JsonSerializableObject = {\n [key: string]: JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[] | undefined\n}\n\nexport type JsonSerializable = JsonSerializablePrimitive | JsonSerializablePrimitive[] | JsonSerializableObject | JsonSerializableObject[]\n\nconst DefaultErrorSerializer: Serializer<SerializedError, Error> = {\n deserialize(message: SerializedError): Error {\n return Object.assign(new Error(message.message), {\n name: message.name,\n stack: message.stack,\n })\n },\n serialize(error: Error): SerializedError {\n return {\n __error_marker: '$$error',\n message: error.message,\n name: error.name,\n stack: error.stack,\n }\n },\n}\n\nconst isSerializedError = (thing: any): thing is SerializedError =>\n thing && typeof thing === 'object' && '__error_marker' in thing && thing.__error_marker === '$$error'\n\nexport const DefaultSerializer: Serializer<JsonSerializable> = {\n deserialize(message: JsonSerializable): any {\n return isSerializedError(message) ? DefaultErrorSerializer.deserialize(message) : message\n },\n serialize(input: any): JsonSerializable {\n return input instanceof Error ? (DefaultErrorSerializer.serialize(input) as any as JsonSerializable) : input\n },\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n JsonSerializable, Serializer, SerializerImplementation,\n} from './serializers.ts'\nimport { DefaultSerializer, extendSerializer } from './serializers.ts'\n\ndeclare global {\n var registeredSerializer: Serializer<JsonSerializable>\n}\n\nglobalThis.registeredSerializer = globalThis.registeredSerializer ?? DefaultSerializer\n\nexport function registerSerializer(serializer: SerializerImplementation<JsonSerializable>) {\n globalThis.registeredSerializer = extendSerializer(globalThis.registeredSerializer, serializer)\n}\n\nexport function deserialize(message: JsonSerializable): any {\n return globalThis.registeredSerializer.deserialize(message)\n}\n\nexport function serialize(input: any): JsonSerializable {\n return globalThis.registeredSerializer.serialize(input)\n}\n","export const $errors = Symbol('thread.errors')\nexport const $events = Symbol('thread.events')\nexport const $terminate = Symbol('thread.terminate')\nexport const $transferable = Symbol('thread.transferable')\nexport const $worker = Symbol('thread.worker')\n","/// <reference lib=\"webworker\" />\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { $transferable } from './symbols.ts'\n\nexport interface TransferDescriptor<T = any> {\n [$transferable]: true\n send: T\n transferables: Transferable[]\n}\n\nfunction isTransferable(thing: any): thing is Transferable {\n if (!thing || typeof thing !== 'object') return false\n // Don't check too thoroughly, since the list of transferable things in JS might grow over time\n return true\n}\n\nexport function isTransferDescriptor(thing: any): thing is TransferDescriptor {\n return thing && typeof thing === 'object' && thing[$transferable]\n}\n\n/**\n * Mark a transferable object as such, so it will no be serialized and\n * deserialized on messaging with the main thread, but to transfer\n * ownership of it to the receiving thread.\n *\n * Only works with array buffers, message ports and few more special\n * types of objects, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @param transferable Array buffer, message port or similar.\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer(transferable: Transferable): TransferDescriptor\n\n/**\n * Mark transferable objects within an arbitrary object or array as\n * being a transferable object. They will then not be serialized\n * and deserialized on messaging with the main thread, but ownership\n * of them will be tranferred to the receiving thread.\n *\n * Only array buffers, message ports and few more special types of\n * objects can be transferred, but it's much faster than serializing and\n * deserializing them.\n *\n * Note:\n * The transferable object cannot be accessed by this thread again\n * unless the receiving thread transfers it back again!\n *\n * @param transferable Array buffer, message port or similar.\n * @see <https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast>\n */\nexport function Transfer<T>(payload: T, transferables: Transferable[]): TransferDescriptor\n\nexport function Transfer<T>(payload: T, transferables?: Transferable[]): TransferDescriptor {\n console.log('Transfer')\n if (!transferables) {\n if (!isTransferable(payload)) throw new Error('Not transferable')\n transferables = [payload]\n }\n\n return {\n [$transferable]: true,\n send: payload,\n transferables,\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/member-ordering */\nexport interface SerializedError {\n __error_marker: '$$error'\n message: string\n name: string\n stack?: string\n}\n\n/////////////////////////////\n// Messages sent by master:\n\nexport enum MasterMessageType {\n cancel = 'cancel',\n run = 'run',\n}\n\nexport type MasterJobCancelMessage = {\n type: MasterMessageType.cancel\n uid: number\n}\n\nexport type MasterJobRunMessage = {\n type: MasterMessageType.run\n uid: number\n method?: string\n args: any[]\n}\n\n////////////////////////////\n// Messages sent by worker:\n\nexport enum WorkerMessageType {\n error = 'error',\n init = 'init',\n result = 'result',\n running = 'running',\n uncaughtError = 'uncaughtError',\n}\n\nexport type WorkerUncaughtErrorMessage = {\n type: WorkerMessageType.uncaughtError\n error: {\n message: string\n name: string\n stack?: string\n }\n}\n\nexport type WorkerInitMessage = {\n type: WorkerMessageType.init\n exposed: { type: 'function' } | { type: 'module'; methods: string[] }\n}\n\nexport type WorkerJobErrorMessage = {\n type: WorkerMessageType.error\n uid: number\n error: SerializedError\n}\n\nexport type WorkerJobResultMessage = {\n type: WorkerMessageType.result\n uid: number\n complete?: true\n payload?: any\n}\n\nexport type WorkerJobStartMessage = {\n type: WorkerMessageType.running\n uid: number\n resultType: 'observable' | 'promise'\n}\n","/* eslint-disable import-x/no-internal-modules */\n\n/// <reference lib=\"dom\" />\n// tslint:disable no-shadowed-variable\n\nimport type { AbstractedWorkerAPI } from '../types/worker.ts'\nimport { createExpose } from './expose.ts'\nimport type { WorkerGlobalScope } from './WorkerGlobalScope.ts'\n\ndeclare const self: WorkerGlobalScope\n\nconst isWorkerRuntime: AbstractedWorkerAPI['isWorkerRuntime'] = function isWorkerRuntime() {\n const isWindowContext = self !== undefined && typeof Window !== 'undefined' && self instanceof Window\n return self !== undefined && self['postMessage'] && !isWindowContext ? true : false\n}\n\nconst postMessageToMaster: AbstractedWorkerAPI['postMessageToMaster'] = function postMessageToMaster(data, transferList?) {\n self.postMessage(data, transferList)\n}\n\nconst subscribeToMasterMessages: AbstractedWorkerAPI['subscribeToMasterMessages'] = function subscribeToMasterMessages(onMessage) {\n const messageHandler = (messageEvent: MessageEvent) => {\n onMessage(messageEvent.data)\n }\n const unsubscribe = () => {\n self.removeEventListener('message', messageHandler as EventListener)\n }\n self.addEventListener('message', messageHandler as EventListener)\n return unsubscribe\n}\n\nconst addEventListener = self.addEventListener.bind(this)\nconst postMessage = self.postMessage.bind(this)\nconst removeEventListener = self.removeEventListener.bind(this)\n\nexport {\n addEventListener,\n postMessage,\n removeEventListener,\n}\n\nconst expose = createExpose({\n isWorkerRuntime, postMessageToMaster, subscribeToMasterMessages,\n}, {\n addEventListener, postMessage, removeEventListener,\n})\n\nexport {\n isWorkerRuntime,\n postMessageToMaster,\n subscribeToMasterMessages,\n}\n\nexport { registerSerializer } from '../common.ts'\nexport { Transfer } from '../transferable.ts'\nexport { expose }\n"],"mappings":"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","names":["isSomeObservable","extendSerializer","extend","implementation","fallbackDeserializer","deserialize","bind","fallbackSerializer","serialize","message","input","DefaultErrorSerializer","Object","assign","Error","name","stack","error","__error_marker","isSerializedError","thing","DefaultSerializer","globalThis","registeredSerializer","DefaultSerializer","registerSerializer","serializer","extendSerializer","deserialize","message","serialize","input","$errors","Symbol","$events","$terminate","$transferable","$worker","isTransferable","thing","isTransferDescriptor","$transferable","Transfer","payload","transferables","console","log","Error","send","MasterMessageType","WorkerMessageType","isErrorEvent","value","error","createExpose","implementation","self","exposeCalled","activeSubscriptions","Map","isMasterJobCancelMessage","thing","type","MasterMessageType","cancel","isMasterJobRunMessage","run","isObservable","isSomeObservable","isZenObservable","subscribe","deconstructTransfer","isTransferDescriptor","payload","send","transferables","undefined","postFunctionInitMessage","initMessage","exposed","WorkerMessageType","init","postMessageToMaster","postModuleInitMessage","methodNames","methods","postJobErrorMessage","uid","rawError","errorMessage","serialize","postJobResultMessage","completed","resultValue","resultMessage","complete","result","postJobStartMessage","resultType","startMessage","running","postUncaughtErrorMessage","uncaughtError","subError","console","runFunction","jobUID","fn","args","syncResult","ex","subscription","delete","set","expose","isWorkerRuntime","Error","subscribeToMasterMessages","messageData","method","map","deserialize","Object","keys","filter","key","get","unsubscribe","globalThis","addEventListener","event","setTimeout","reason","message","process","on","isWorkerRuntime","isWindowContext","self","undefined","Window","postMessageToMaster","data","transferList","postMessage","subscribeToMasterMessages","onMessage","messageHandler","messageEvent","unsubscribe","removeEventListener","addEventListener","bind","expose","createExpose","isWorkerRuntime","postMessageToMaster","subscribeToMasterMessages","addEventListener","postMessage","removeEventListener"]}