@loaders.gl/worker-utils
Version:
Utilities for running tasks on worker threads
8 lines • 74.4 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../src/index.ts", "../src/lib/npm-tag.ts", "../src/lib/env-utils/version.ts", "../src/lib/env-utils/assert.ts", "../src/lib/env-utils/globals.ts", "../src/lib/worker-farm/worker-job.ts", "../src/lib/node/worker_threads-browser.ts", "../src/lib/worker-utils/get-loadable-worker-url.ts", "../src/lib/worker-utils/get-transfer-list.ts", "../src/lib/worker-farm/worker-thread.ts", "../src/lib/worker-farm/worker-pool.ts", "../src/lib/worker-farm/worker-farm.ts", "../src/lib/worker-farm/worker-body.ts", "../src/lib/worker-api/get-worker-url.ts", "../src/lib/worker-api/process-on-worker.ts", "../src/lib/async-queue/async-queue.ts", "../src/lib/worker-api/create-worker.ts", "../src/lib/worker-api/validate-worker-version.ts", "../src/lib/library-utils/library-utils.ts", "../src/lib/process-utils/child-process-proxy.browser.ts"],
"sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WorkerObject} from './types';\nimport {VERSION} from './lib/env-utils/version';\n\n// TYPES\nexport type {\n WorkerObject,\n WorkerOptions,\n // Protocol\n WorkerMessage,\n WorkerMessageType,\n WorkerMessageData,\n WorkerMessagePayload\n} from './types';\n\n// GENERAL UTILS\nexport {assert} from './lib/env-utils/assert';\nexport {isBrowser, isWorker} from './lib/env-utils/globals';\n\n// WORKER UTILS - TYPES\nexport {default as WorkerJob} from './lib/worker-farm/worker-job';\nexport {default as WorkerThread} from './lib/worker-farm/worker-thread';\n\n// WORKER FARMS\nexport {default as WorkerFarm} from './lib/worker-farm/worker-farm';\nexport {default as WorkerPool} from './lib/worker-farm/worker-pool';\nexport {default as WorkerBody} from './lib/worker-farm/worker-body';\n\n// PROCESS ON WORKER\nexport type {ProcessOnWorkerOptions} from './lib/worker-api/process-on-worker';\nexport {processOnWorker, canProcessOnWorker} from './lib/worker-api/process-on-worker';\nexport {createWorker} from './lib/worker-api/create-worker';\n\n// WORKER UTILS - EXPORTS\nexport {getWorkerURL} from './lib/worker-api/get-worker-url';\nexport {validateWorkerVersion} from './lib/worker-api/validate-worker-version';\nexport {getTransferList, getTransferListForWriter} from './lib/worker-utils/get-transfer-list';\n\n// LIBRARY UTILS\nexport {\n extractLoadLibraryOptions,\n getLibraryUrl,\n loadLibrary,\n type LoadLibraryOptions\n} from './lib/library-utils/library-utils';\n\n// PARSER UTILS\nexport {default as AsyncQueue} from './lib/async-queue/async-queue';\n\n// PROCESS UTILS\nexport {default as ChildProcessProxy} from './lib/process-utils/child-process-proxy';\n\n// WORKER OBJECTS\n\n/** A null worker to test that worker processing is functional */\nexport const NullWorker: WorkerObject = {\n id: 'null',\n name: 'null',\n module: 'worker-utils',\n version: VERSION,\n options: {\n null: {}\n }\n};\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * NPM tag to use when loading modules from unpkg.com\n * 'beta' on beta branch, 'latest' on prod branch\n * @note Change between 'beta' and 'latest' depending on whether publishing alpha or prod releases\n * @todo - unpkg.com doesn't seem to have a `latest` specifier for alpha releases...\n */\nexport const NPM_TAG = 'latest';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {NPM_TAG} from '../npm-tag';\n\n// Version constant cannot be imported, it needs to correspond to the build version of **this** module.\ndeclare let __VERSION__: string;\n\nlet warningIssued = false;\n\nfunction getVersion() {\n if (!globalThis._loadersgl_?.version) {\n globalThis._loadersgl_ = globalThis._loadersgl_ || {};\n // __VERSION__ is injected by babel-plugin-version-inline\n if (typeof __VERSION__ === 'undefined' && !warningIssued) {\n // eslint-disable-next-line\n console.warn(\n 'loaders.gl: The __VERSION__ variable is not injected using babel plugin. Latest unstable workers would be fetched from the CDN.'\n );\n globalThis._loadersgl_.version = NPM_TAG;\n warningIssued = true;\n } else {\n globalThis._loadersgl_.version = __VERSION__;\n }\n }\n\n return globalThis._loadersgl_.version;\n}\n\nexport const VERSION = getVersion();\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Replacement for the external assert method to reduce bundle size\n// Note: We don't use the second \"message\" argument in calling code,\n// so no need to support it here\n\n/** Throws an `Error` with the optional `message` if `condition` is falsy */\nexport function assert(condition: any, message?: string): void {\n if (!condition) {\n throw new Error(message || 'loaders.gl assertion failed.');\n }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Purpose: include this in your module to avoids adding dependencies on\n// micro modules like 'global' and 'is-browser';\n\n/* eslint-disable no-restricted-globals */\nconst globals = {\n self: typeof self !== 'undefined' && self,\n window: typeof window !== 'undefined' && window,\n global: typeof global !== 'undefined' && global,\n document: typeof document !== 'undefined' && document\n};\n\nconst self_: {[key: string]: any} = globals.self || globals.window || globals.global || {};\nconst window_: {[key: string]: any} = globals.window || globals.self || globals.global || {};\nconst global_: {[key: string]: any} = globals.global || globals.self || globals.window || {};\nconst document_: {[key: string]: any} = globals.document || {};\n\nexport {self_ as self, window_ as window, global_ as global, document_ as document};\n\n/** true if running in the browser, false if running in Node.js */\nexport const isBrowser: boolean =\n // @ts-ignore process.browser\n typeof process !== 'object' || String(process) !== '[object process]' || process.browser;\n\n/** true if running on a worker thread */\nexport const isWorker: boolean = typeof importScripts === 'function';\n\n/** true if running on a mobile device */\nexport const isMobile: boolean =\n typeof window !== 'undefined' && typeof window.orientation !== 'undefined';\n\n// Extract node major version\nconst matches =\n typeof process !== 'undefined' && process.version && /v([0-9]*)/.exec(process.version);\n\n/** Version of Node.js if running under Node, otherwise 0 */\nexport const nodeVersion: number = (matches && parseFloat(matches[1])) || 0;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WorkerMessageType, WorkerMessagePayload} from '../../types';\nimport WorkerThread from './worker-thread';\nimport {assert} from '../env-utils/assert';\n\n/**\n * Represents one Job handled by a WorkerPool or WorkerFarm\n */\nexport default class WorkerJob {\n readonly name: string;\n readonly workerThread: WorkerThread;\n isRunning: boolean = true;\n /** Promise that resolves when Job is done */\n readonly result: Promise<any>;\n\n private _resolve: (value: any) => void = () => {};\n private _reject: (reason?: any) => void = () => {};\n\n constructor(jobName: string, workerThread: WorkerThread) {\n this.name = jobName;\n this.workerThread = workerThread;\n this.result = new Promise((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n }\n\n /**\n * Send a message to the job's worker thread\n * @param data any data structure, ideally consisting mostly of transferrable objects\n */\n postMessage(type: WorkerMessageType, payload: WorkerMessagePayload): void {\n this.workerThread.postMessage({\n source: 'loaders.gl', // Lets worker ignore unrelated messages\n type,\n payload\n });\n }\n\n /**\n * Call to resolve the `result` Promise with the supplied value\n */\n done(value: any): void {\n assert(this.isRunning);\n this.isRunning = false;\n this._resolve(value);\n }\n\n /**\n * Call to reject the `result` Promise with the supplied error\n */\n error(error: Error): void {\n assert(this.isRunning);\n this.isRunning = false;\n this._reject(error);\n }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/** Browser polyfill for Node.js built-in `worker_threads` module.\n * These fills are non-functional, and just intended to ensure that\n * `import 'worker_threads` doesn't break browser builds.\n * The replacement is done in package.json browser field\n */\nexport class NodeWorker {\n terminate() {}\n}\n\nexport type {NodeWorker as NodeWorkerType};\n\nexport const parentPort = null;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {assert} from '../env-utils/assert';\n\nconst workerURLCache = new Map();\n\n/**\n * Creates a loadable URL from worker source or URL\n * that can be used to create `Worker` instances.\n * Due to CORS issues it may be necessary to wrap a URL in a small importScripts\n * @param props\n * @param props.source Worker source\n * @param props.url Worker URL\n * @returns loadable url\n */\nexport function getLoadableWorkerURL(props: {source?: string; url?: string}) {\n assert((props.source && !props.url) || (!props.source && props.url)); // Either source or url must be defined\n\n let workerURL = workerURLCache.get(props.source || props.url);\n if (!workerURL) {\n // Differentiate worker urls from worker source code\n if (props.url) {\n workerURL = getLoadableWorkerURLFromURL(props.url);\n workerURLCache.set(props.url, workerURL);\n }\n\n if (props.source) {\n workerURL = getLoadableWorkerURLFromSource(props.source);\n workerURLCache.set(props.source, workerURL);\n }\n }\n\n assert(workerURL);\n return workerURL;\n}\n\n/**\n * Build a loadable worker URL from worker URL\n * @param url\n * @returns loadable URL\n */\nfunction getLoadableWorkerURLFromURL(url: string): string {\n // A local script url, we can use it to initialize a Worker directly\n if (!url.startsWith('http')) {\n return url;\n }\n\n // A remote script, we need to use `importScripts` to load from different origin\n const workerSource = buildScriptSource(url);\n return getLoadableWorkerURLFromSource(workerSource);\n}\n\n/**\n * Build a loadable worker URL from worker source\n * @param workerSource\n * @returns loadable url\n */\nfunction getLoadableWorkerURLFromSource(workerSource: string): string {\n const blob = new Blob([workerSource], {type: 'application/javascript'});\n return URL.createObjectURL(blob);\n}\n\n/**\n * Per spec, worker cannot be initialized with a script from a different origin\n * However a local worker script can still import scripts from other origins,\n * so we simply build a wrapper script.\n *\n * @param workerUrl\n * @returns source\n */\nfunction buildScriptSource(workerUrl: string): string {\n return `\\\ntry {\n importScripts('${workerUrl}');\n} catch (error) {\n console.error(error);\n throw error;\n}`;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// NOTE - there is a copy of this function is both in core and loader-utils\n// core does not need all the utils in loader-utils, just this one.\n\n/**\n * Returns an array of Transferrable objects that can be used with postMessage\n * https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage\n * @param object data to be sent via postMessage\n * @param recursive - not for application use\n * @param transfers - not for application use\n * @returns a transfer list that can be passed to postMessage\n */\nexport function getTransferList(\n object: any,\n recursive: boolean = true,\n transfers?: Set<any>\n): Transferable[] {\n // Make sure that items in the transfer list is unique\n const transfersSet = transfers || new Set();\n\n if (!object) {\n // ignore\n } else if (isTransferable(object)) {\n transfersSet.add(object);\n } else if (isTransferable(object.buffer)) {\n // Typed array\n transfersSet.add(object.buffer);\n } else if (ArrayBuffer.isView(object)) {\n // object is a TypeArray viewing into a SharedArrayBuffer (not transferable)\n // Do not iterate through the content in this case\n } else if (recursive && typeof object === 'object') {\n for (const key in object) {\n // Avoid perf hit - only go one level deep\n getTransferList(object[key], recursive, transfersSet);\n }\n }\n\n // If transfers is defined, is internal recursive call\n // Otherwise it's called by the user\n return transfers === undefined ? Array.from(transfersSet) : [];\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Transferable\nfunction isTransferable(object: unknown) {\n if (!object) {\n return false;\n }\n if (object instanceof ArrayBuffer) {\n return true;\n }\n if (typeof MessagePort !== 'undefined' && object instanceof MessagePort) {\n return true;\n }\n if (typeof ImageBitmap !== 'undefined' && object instanceof ImageBitmap) {\n return true;\n }\n // @ts-ignore\n if (typeof OffscreenCanvas !== 'undefined' && object instanceof OffscreenCanvas) {\n return true;\n }\n return false;\n}\n\n/**\n * Recursively drop non serializable values like functions and regexps.\n * @param object\n */\nexport function getTransferListForWriter(object: object | null): object {\n if (object === null) {\n return {};\n }\n const clone = Object.assign({}, object);\n\n Object.keys(clone).forEach((key) => {\n // Typed Arrays and Arrays are passed with no change\n if (\n typeof object[key] === 'object' &&\n !ArrayBuffer.isView(object[key]) &&\n !(object[key] instanceof Array)\n ) {\n clone[key] = getTransferListForWriter(object[key]);\n } else if (typeof clone[key] === 'function' || clone[key] instanceof RegExp) {\n clone[key] = {};\n } else {\n clone[key] = object[key];\n }\n });\n\n return clone;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {NodeWorker, NodeWorkerType} from '../node/worker_threads';\nimport {isBrowser} from '../env-utils/globals';\nimport {assert} from '../env-utils/assert';\nimport {getLoadableWorkerURL} from '../worker-utils/get-loadable-worker-url';\nimport {getTransferList} from '../worker-utils/get-transfer-list';\n\nconst NOOP = () => {};\n\nexport type WorkerThreadProps = {\n name: string;\n source?: string;\n url?: string;\n};\n\n/**\n * Represents one worker thread\n */\nexport default class WorkerThread {\n readonly name: string;\n readonly source: string | undefined;\n readonly url: string | undefined;\n terminated: boolean = false;\n worker: Worker | NodeWorkerType;\n onMessage: (message: any) => void;\n onError: (error: Error) => void;\n\n private _loadableURL: string = '';\n\n /** Checks if workers are supported on this platform */\n static isSupported(): boolean {\n return (\n (typeof Worker !== 'undefined' && isBrowser) ||\n (typeof NodeWorker !== 'undefined' && !isBrowser)\n );\n }\n\n constructor(props: WorkerThreadProps) {\n const {name, source, url} = props;\n assert(source || url); // Either source or url must be defined\n this.name = name;\n this.source = source;\n this.url = url;\n this.onMessage = NOOP;\n this.onError = (error) => console.log(error); // eslint-disable-line\n\n this.worker = isBrowser ? this._createBrowserWorker() : this._createNodeWorker();\n }\n\n /**\n * Terminate this worker thread\n * @note Can free up significant memory\n */\n destroy(): void {\n this.onMessage = NOOP;\n this.onError = NOOP;\n this.worker.terminate(); // eslint-disable-line @typescript-eslint/no-floating-promises\n this.terminated = true;\n }\n\n get isRunning() {\n return Boolean(this.onMessage);\n }\n\n /**\n * Send a message to this worker thread\n * @param data any data structure, ideally consisting mostly of transferrable objects\n * @param transferList If not supplied, calculated automatically by traversing data\n */\n postMessage(data: any, transferList?: any[]): void {\n transferList = transferList || getTransferList(data);\n // @ts-ignore\n this.worker.postMessage(data, transferList);\n }\n\n // PRIVATE\n\n /**\n * Generate a standard Error from an ErrorEvent\n * @param event\n */\n _getErrorFromErrorEvent(event: ErrorEvent): Error {\n // Note Error object does not have the expected fields if loading failed completely\n // https://developer.mozilla.org/en-US/docs/Web/API/Worker#Event_handlers\n // https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent\n let message = 'Failed to load ';\n message += `worker ${this.name} from ${this.url}. `;\n if (event.message) {\n message += `${event.message} in `;\n }\n // const hasFilename = event.filename && !event.filename.startsWith('blob:');\n // message += hasFilename ? event.filename : this.source.slice(0, 100);\n if (event.lineno) {\n message += `:${event.lineno}:${event.colno}`;\n }\n return new Error(message);\n }\n\n /**\n * Creates a worker thread on the browser\n */\n _createBrowserWorker(): Worker {\n this._loadableURL = getLoadableWorkerURL({source: this.source, url: this.url});\n const worker = new Worker(this._loadableURL, {name: this.name});\n\n worker.onmessage = (event) => {\n if (!event.data) {\n this.onError(new Error('No data received'));\n } else {\n this.onMessage(event.data);\n }\n };\n // This callback represents an uncaught exception in the worker thread\n worker.onerror = (error: ErrorEvent): void => {\n this.onError(this._getErrorFromErrorEvent(error));\n this.terminated = true;\n };\n // TODO - not clear when this would be called, for now just log in case it happens\n worker.onmessageerror = (event) => console.error(event); // eslint-disable-line\n\n return worker;\n }\n\n /**\n * Creates a worker thread in node.js\n * @todo https://nodejs.org/api/async_hooks.html#async-resource-worker-pool\n */\n _createNodeWorker(): NodeWorkerType {\n let worker: NodeWorkerType;\n if (this.url) {\n // Make sure relative URLs start with './'\n const absolute = this.url.includes(':/') || this.url.startsWith('/');\n const url = absolute ? this.url : `./${this.url}`;\n const type = this.url.endsWith('.ts') || this.url.endsWith('.mjs') ? 'module' : 'commonjs';\n // console.log('Starting work from', url);\n // @ts-expect-error type is not known\n worker = new NodeWorker(url, {eval: false, type});\n } else if (this.source) {\n worker = new NodeWorker(this.source, {eval: true});\n } else {\n throw new Error('no worker');\n }\n worker.on('message', (data) => {\n // console.error('message', data);\n this.onMessage(data);\n });\n worker.on('error', (error) => {\n this.onError(error as Error);\n });\n worker.on('exit', (code) => {\n // console.error('exit', code);\n });\n return worker;\n }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WorkerMessageType, WorkerMessagePayload} from '../../types';\nimport {isMobile, isBrowser} from '../env-utils/globals';\nimport WorkerThread from './worker-thread';\nimport WorkerJob from './worker-job';\n\n/** WorkerPool onDebug Callback Parameters */\ntype OnDebugParameters = {\n message: string;\n worker: string;\n name: string;\n job: string;\n backlog: number;\n workerThread: WorkerThread;\n};\n\n/** WorkerPool Properties */\nexport type WorkerPoolProps = {\n name?: string;\n source?: string; // | Function;\n url?: string;\n maxConcurrency?: number;\n maxMobileConcurrency?: number;\n onDebug?: (options: OnDebugParameters) => any;\n reuseWorkers?: boolean;\n};\n\n/** Private helper types */\ntype OnMessage = (job: WorkerJob, type: WorkerMessageType, payload: WorkerMessagePayload) => void;\ntype OnError = (job: WorkerJob, error: Error) => void;\n\ntype QueuedJob = {\n name: string;\n onMessage: OnMessage;\n onError: OnError;\n onStart: (value: any) => void; // Resolve job start promise\n};\n\n/**\n * Process multiple data messages with small pool of identical workers\n */\nexport default class WorkerPool {\n name: string = 'unnamed';\n source?: string; // | Function;\n url?: string;\n maxConcurrency: number = 1;\n maxMobileConcurrency: number = 1;\n onDebug: (options: OnDebugParameters) => any = () => {};\n reuseWorkers: boolean = true;\n\n private props: WorkerPoolProps = {};\n private jobQueue: QueuedJob[] = [];\n private idleQueue: WorkerThread[] = [];\n private count = 0;\n private isDestroyed = false;\n\n /** Checks if workers are supported on this platform */\n static isSupported(): boolean {\n return WorkerThread.isSupported();\n }\n\n /**\n * @param processor - worker function\n * @param maxConcurrency - max count of workers\n */\n constructor(props: WorkerPoolProps) {\n this.source = props.source;\n this.url = props.url;\n this.setProps(props);\n }\n\n /**\n * Terminates all workers in the pool\n * @note Can free up significant memory\n */\n destroy(): void {\n // Destroy idle workers, active Workers will be destroyed on completion\n this.idleQueue.forEach((worker) => worker.destroy());\n this.isDestroyed = true;\n }\n\n setProps(props: WorkerPoolProps) {\n this.props = {...this.props, ...props};\n\n if (props.name !== undefined) {\n this.name = props.name;\n }\n if (props.maxConcurrency !== undefined) {\n this.maxConcurrency = props.maxConcurrency;\n }\n if (props.maxMobileConcurrency !== undefined) {\n this.maxMobileConcurrency = props.maxMobileConcurrency;\n }\n if (props.reuseWorkers !== undefined) {\n this.reuseWorkers = props.reuseWorkers;\n }\n if (props.onDebug !== undefined) {\n this.onDebug = props.onDebug;\n }\n }\n\n async startJob(\n name: string,\n onMessage: OnMessage = (job, type, data) => job.done(data),\n onError: OnError = (job, error) => job.error(error)\n ): Promise<WorkerJob> {\n // Promise resolves when thread starts working on this job\n const startPromise = new Promise<WorkerJob>((onStart) => {\n // Promise resolves when thread completes or fails working on this job\n this.jobQueue.push({name, onMessage, onError, onStart});\n return this;\n });\n this._startQueuedJob(); // eslint-disable-line @typescript-eslint/no-floating-promises\n return await startPromise;\n }\n\n // PRIVATE\n\n /**\n * Starts first queued job if worker is available or can be created\n * Called when job is started and whenever a worker returns to the idleQueue\n */\n async _startQueuedJob(): Promise<void> {\n if (!this.jobQueue.length) {\n return;\n }\n\n const workerThread = this._getAvailableWorker();\n if (!workerThread) {\n return;\n }\n\n // We have a worker, dequeue and start the job\n const queuedJob = this.jobQueue.shift();\n if (queuedJob) {\n // Emit a debug event\n // @ts-ignore\n this.onDebug({\n message: 'Starting job',\n name: queuedJob.name,\n workerThread,\n backlog: this.jobQueue.length\n });\n\n // Create a worker job to let the app access thread and manage job completion\n const job = new WorkerJob(queuedJob.name, workerThread);\n\n // Set the worker thread's message handlers\n workerThread.onMessage = (data) => queuedJob.onMessage(job, data.type, data.payload);\n workerThread.onError = (error) => queuedJob.onError(job, error);\n\n // Resolve the start promise so that the app can start sending messages to worker\n queuedJob.onStart(job);\n\n // Wait for the app to signal that the job is complete, then return worker to queue\n try {\n await job.result;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Worker exception: ${error}`);\n } finally {\n this.returnWorkerToQueue(workerThread);\n }\n }\n }\n\n /**\n * Returns a worker to the idle queue\n * Destroys the worker if\n * - pool is destroyed\n * - if this pool doesn't reuse workers\n * - if maxConcurrency has been lowered\n * @param worker\n */\n returnWorkerToQueue(worker: WorkerThread) {\n const shouldDestroyWorker =\n // Workers on Node.js prevent the process from exiting.\n // Until we figure out how to close them before exit, we always destroy them\n !isBrowser ||\n // If the pool is destroyed, there is no reason to keep the worker around\n this.isDestroyed ||\n // If the app has disabled worker reuse, any completed workers should be destroyed\n !this.reuseWorkers ||\n // If concurrency has been lowered, this worker might be surplus to requirements\n this.count > this._getMaxConcurrency();\n\n if (shouldDestroyWorker) {\n worker.destroy();\n this.count--;\n } else {\n this.idleQueue.push(worker);\n }\n\n if (!this.isDestroyed) {\n this._startQueuedJob(); // eslint-disable-line @typescript-eslint/no-floating-promises\n }\n }\n\n /**\n * Returns idle worker or creates new worker if maxConcurrency has not been reached\n */\n _getAvailableWorker(): WorkerThread | null {\n // If a worker has completed and returned to the queue, it can be used\n if (this.idleQueue.length > 0) {\n return this.idleQueue.shift() || null;\n }\n\n // Create fresh worker if we haven't yet created the max amount of worker threads for this worker source\n if (this.count < this._getMaxConcurrency()) {\n this.count++;\n const name = `${this.name.toLowerCase()} (#${this.count} of ${this.maxConcurrency})`;\n return new WorkerThread({name, source: this.source, url: this.url});\n }\n\n // No worker available, have to wait\n return null;\n }\n\n _getMaxConcurrency() {\n return isMobile ? this.maxMobileConcurrency : this.maxConcurrency;\n }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport WorkerPool from './worker-pool';\nimport WorkerThread from './worker-thread';\n\n/**\n * @param maxConcurrency - max count of workers\n * @param maxMobileConcurrency - max count of workers on mobile\n * @param maxConcurrency - max count of workers\n * @param reuseWorkers - if false, destroys workers when task is completed\n * @param onDebug - callback intended to allow application to log worker pool activity\n */\nexport type WorkerFarmProps = {\n maxConcurrency?: number;\n maxMobileConcurrency?: number;\n reuseWorkers?: boolean;\n onDebug?: () => void;\n};\n\nconst DEFAULT_PROPS: Required<WorkerFarmProps> = {\n maxConcurrency: 3,\n maxMobileConcurrency: 1,\n reuseWorkers: true,\n onDebug: () => {}\n};\n\n/**\n * Process multiple jobs with a \"farm\" of different workers in worker pools.\n */\nexport default class WorkerFarm {\n private props: WorkerFarmProps;\n private workerPools = new Map<string, WorkerPool>();\n // singleton\n private static _workerFarm?: WorkerFarm;\n\n /** Checks if workers are supported on this platform */\n static isSupported(): boolean {\n return WorkerThread.isSupported();\n }\n\n /** Get the singleton instance of the global worker farm */\n static getWorkerFarm(props: WorkerFarmProps = {}): WorkerFarm {\n WorkerFarm._workerFarm = WorkerFarm._workerFarm || new WorkerFarm({});\n WorkerFarm._workerFarm.setProps(props);\n return WorkerFarm._workerFarm;\n }\n\n /** get global instance with WorkerFarm.getWorkerFarm() */\n private constructor(props: WorkerFarmProps) {\n this.props = {...DEFAULT_PROPS};\n this.setProps(props);\n /** @type Map<string, WorkerPool>} */\n this.workerPools = new Map();\n }\n\n /**\n * Terminate all workers in the farm\n * @note Can free up significant memory\n */\n destroy(): void {\n for (const workerPool of this.workerPools.values()) {\n workerPool.destroy();\n }\n this.workerPools = new Map<string, WorkerPool>();\n }\n\n /**\n * Set props used when initializing worker pools\n * @param props\n */\n setProps(props: WorkerFarmProps): void {\n this.props = {...this.props, ...props};\n // Update worker pool props\n for (const workerPool of this.workerPools.values()) {\n workerPool.setProps(this._getWorkerPoolProps());\n }\n }\n\n /**\n * Returns a worker pool for the specified worker\n * @param options - only used first time for a specific worker name\n * @param options.name - the name of the worker - used to identify worker pool\n * @param options.url -\n * @param options.source -\n * @example\n * const job = WorkerFarm.getWorkerFarm().getWorkerPool({name, url}).startJob(...);\n */\n getWorkerPool(options: {name: string; source?: string; url?: string}): WorkerPool {\n const {name, source, url} = options;\n let workerPool = this.workerPools.get(name);\n if (!workerPool) {\n workerPool = new WorkerPool({\n name,\n source,\n url\n });\n workerPool.setProps(this._getWorkerPoolProps());\n this.workerPools.set(name, workerPool);\n }\n return workerPool;\n }\n\n _getWorkerPoolProps() {\n return {\n maxConcurrency: this.props.maxConcurrency,\n maxMobileConcurrency: this.props.maxMobileConcurrency,\n reuseWorkers: this.props.reuseWorkers,\n onDebug: this.props.onDebug\n };\n }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WorkerMessageData, WorkerMessageType, WorkerMessagePayload} from '../../types';\nimport {getTransferList} from '../worker-utils/get-transfer-list';\n// import type {TransferListItem} from '../node/worker_threads';\nimport {parentPort} from '../node/worker_threads';\n\ntype TransferListItem = any;\n\n/** Vile hack to defeat over-zealous bundlers from stripping out the require */\nasync function getParentPort() {\n // const isNode = globalThis.process;\n // let parentPort;\n // try {\n // // prettier-ignore\n // eval('globalThis.parentPort = require(\\'worker_threads\\').parentPort'); // eslint-disable-line no-eval\n // parentPort = globalThis.parentPort;\n // } catch {\n // try {\n // // prettier-ignore\n // eval('globalThis.workerThreadsPromise = import(\\'worker_threads\\')'); // eslint-disable-line no-eval\n // const workerThreads = await globalThis.workerThreadsPromise;\n // parentPort = workerThreads.parentPort;\n // } catch (error) {\n // console.error((error as Error).message); // eslint-disable-line no-console\n // }\n // }\n return parentPort;\n}\n\nconst onMessageWrapperMap = new Map();\n\n/**\n * Type safe wrapper for worker code\n */\nexport default class WorkerBody {\n /** Check that we are actually in a worker thread */\n static async inWorkerThread(): Promise<boolean> {\n return typeof self !== 'undefined' || Boolean(await getParentPort());\n }\n\n /*\n * (type: WorkerMessageType, payload: WorkerMessagePayload) => any\n */\n static set onmessage(onMessage: (type: WorkerMessageType, payload: WorkerMessagePayload) => any) {\n async function handleMessage(message) {\n const parentPort = await getParentPort();\n // Confusingly the message itself also has a 'type' field which is always set to 'message'\n const {type, payload} = parentPort ? message : message.data;\n // if (!isKnownMessage(message)) {\n // return;\n // }\n onMessage(type, payload);\n }\n\n getParentPort().then((parentPort) => {\n if (parentPort) {\n parentPort.on('message', (message) => {\n handleMessage(message);\n });\n // if (message == 'exit') { parentPort.unref(); }\n // eslint-disable-next-line\n parentPort.on('exit', () => console.debug('Node worker closing'));\n } else {\n // eslint-disable-next-line no-restricted-globals\n globalThis.onmessage = handleMessage;\n }\n });\n }\n\n static async addEventListener(\n onMessage: (type: WorkerMessageType, payload: WorkerMessagePayload) => any\n ) {\n let onMessageWrapper = onMessageWrapperMap.get(onMessage);\n\n if (!onMessageWrapper) {\n onMessageWrapper = async (message: MessageEvent<any>) => {\n if (!isKnownMessage(message)) {\n return;\n }\n\n const parentPort = await getParentPort();\n // Confusingly in the browser, the message itself also has a 'type' field which is always set to 'message'\n const {type, payload} = parentPort ? message : message.data;\n onMessage(type, payload);\n };\n }\n\n const parentPort = await getParentPort();\n if (parentPort) {\n console.error('not implemented'); // eslint-disable-line\n } else {\n globalThis.addEventListener('message', onMessageWrapper);\n }\n }\n\n static async removeEventListener(\n onMessage: (type: WorkerMessageType, payload: WorkerMessagePayload) => any\n ) {\n const onMessageWrapper = onMessageWrapperMap.get(onMessage);\n onMessageWrapperMap.delete(onMessage);\n const parentPort = await getParentPort();\n if (parentPort) {\n console.error('not implemented'); // eslint-disable-line\n } else {\n globalThis.removeEventListener('message', onMessageWrapper);\n }\n }\n\n /**\n * Send a message from a worker to creating thread (main thread)\n * @param type\n * @param payload\n */\n static async postMessage(type: WorkerMessageType, payload: WorkerMessagePayload): Promise<void> {\n const data: WorkerMessageData = {source: 'loaders.gl', type, payload};\n // console.log('posting message', data);\n\n // Cast to Node compatible transfer list\n const transferList = getTransferList(payload) as TransferListItem[];\n\n const parentPort = await getParentPort();\n if (parentPort) {\n parentPort.postMessage(data, transferList);\n // console.log('posted message', data);\n } else {\n // @ts-expect-error Outside of worker scopes this call has a third parameter\n globalThis.postMessage(data, transferList);\n }\n }\n}\n\n// Filter out noise messages sent to workers\nfunction isKnownMessage(message: MessageEvent<any>) {\n const {type, data} = message;\n return (\n type === 'message' &&\n data &&\n typeof data.source === 'string' &&\n data.source.startsWith('loaders.gl')\n );\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WorkerObject, WorkerOptions} from '../../types';\nimport {assert} from '../env-utils/assert';\nimport {isBrowser} from '../env-utils/globals';\nimport {VERSION} from '../env-utils/version';\nimport {NPM_TAG} from '../npm-tag';\n\n/**\n * Gets worker object's name (for debugging in Chrome thread inspector window)\n */\nexport function getWorkerName(worker: WorkerObject): string {\n const warning = worker.version !== VERSION ? ` (worker-utils@${VERSION})` : '';\n return `${worker.name}@${worker.version}${warning}`;\n}\n\n/**\n * Generate a worker URL based on worker object and options\n * @returns A URL to one of the following:\n * - a published worker on unpkg CDN\n * - a local test worker\n * - a URL provided by the user in options\n */\nexport function getWorkerURL(worker: WorkerObject, options: WorkerOptions = {}): string {\n const workerOptions = options[worker.id] || {};\n\n const workerFile = isBrowser ? `${worker.id}-worker.js` : `${worker.id}-worker-node.js`;\n\n let url = workerOptions.workerUrl;\n\n // HACK: Allow for non-nested workerUrl for the CompressionWorker.\n // For the compression worker, workerOptions is currently not nested correctly. For most loaders,\n // you'd have options within an object, i.e. `{mvt: {coordinates: ...}}` but the CompressionWorker\n // puts options at the top level, not within a `compression` key (its `id`). For this reason, the\n // above `workerOptions` will always be a string (i.e. `'gzip'`) for the CompressionWorker. To not\n // break backwards compatibility, we allow the CompressionWorker to have options at the top level.\n if (!url && worker.id === 'compression') {\n url = options.workerUrl;\n }\n\n // If URL is test, generate local loaders.gl url\n // @ts-ignore _workerType\n const workerType = (options as any)._workerType || (options as any)?.core?._workerType;\n if (workerType === 'test') {\n if (isBrowser) {\n url = `modules/${worker.module}/dist/${workerFile}`;\n } else {\n // In the test environment the ts-node loader requires TypeScript code\n url = `modules/${worker.module}/src/workers/${worker.id}-worker-node.ts`;\n }\n }\n\n // If url override is not provided, generate a URL to published version on npm CDN unpkg.com\n if (!url) {\n // GENERATE\n let version = worker.version;\n // On master we need to load npm alpha releases published with the `beta` tag\n if (version === 'latest') {\n // throw new Error('latest worker version specified');\n version = NPM_TAG;\n }\n const versionTag = version ? `@${version}` : '';\n url = `https://unpkg.com/@loaders.gl/${worker.module}${versionTag}/dist/${workerFile}`;\n }\n\n assert(url);\n\n // Allow user to override location\n return url;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n WorkerObject,\n WorkerOptions,\n WorkerContext,\n WorkerMessageType,\n WorkerMessagePayload\n} from '../../types';\nimport type WorkerJob from '../worker-farm/worker-job';\nimport WorkerFarm from '../worker-farm/worker-farm';\nimport {getWorkerURL, getWorkerName} from './get-worker-url';\nimport {getTransferListForWriter} from '../worker-utils/get-transfer-list';\n\n/** Options for worker processing */\nexport type ProcessOnWorkerOptions = WorkerOptions & {\n jobName?: string;\n [key: string]: any;\n};\n\n/**\n * Determines if we can parse with worker\n * @param loader\n * @param data\n * @param options\n */\nexport function canProcessOnWorker(worker: WorkerObject, options?: WorkerOptions) {\n if (!WorkerFarm.isSupported()) {\n return false;\n }\n\n return worker.worker && options?.worker;\n}\n\n/**\n * This function expects that the worker thread sends certain messages,\n * Creating such a worker can be automated if the worker is wrapper by a call to\n * createWorker in @loaders.gl/worker-utils.\n */\nexport async function processOnWorker(\n worker: WorkerObject,\n data: any,\n options: ProcessOnWorkerOptions = {},\n context: WorkerContext = {}\n): Promise<any> {\n const name = getWorkerName(worker);\n\n const workerFarm = WorkerFarm.getWorkerFarm(options);\n const {source} = options;\n const workerPoolProps: {name: string; source?: string; url?: string} = {name, source};\n if (!source) {\n workerPoolProps.url = getWorkerURL(worker, options);\n }\n const workerPool = workerFarm.getWorkerPool(workerPoolProps);\n\n const jobName = options.jobName || worker.name;\n const job = await workerPool.startJob(\n jobName,\n // eslint-disable-next-line\n onMessage.bind(null, context)\n );\n\n // Kick off the processing in the worker\n const transferableOptions = getTransferListForWriter(options);\n job.postMessage('process', {input: data, options: transferableOptions});\n\n const result = await job.result;\n return result.result;\n}\n\n/**\n * Job completes when we receive the result\n * @param job\n * @param message\n */\nasync function onMessage(\n context: WorkerContext,\n job: WorkerJob,\n type: WorkerMessageType,\n payload: WorkerMessagePayload\n) {\n switch (type) {\n case 'done':\n // Worker is done\n job.done(payload);\n break;\n\n case 'error':\n // Worker encountered an error\n job.error(new Error(payload.error));\n break;\n\n case 'process':\n // Worker is asking for us (main thread) to process something\n const {id, input, options} = payload;\n try {\n if (!context.process) {\n job.postMessage('error', {id, error: 'Worker not set up to process on main thread'});\n return;\n }\n const result = await context.process(input, options);\n job.postMessage('done', {id, result});\n } catch (error) {\n const message = error instanceof Error ? error.message : 'unknown error';\n job.postMessage('error', {id, error: message});\n }\n break;\n\n default:\n // eslint-disable-next-line\n console.warn(`process-on-worker: unknown message ${type}`);\n }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// From https://github.com/rauschma/async-iter-demo/tree/master/src under MIT license\n// http://2ality.com/2016/10/asynchronous-iteration.html\n\n/**\n * Async Queue\n * - AsyncIterable: An async iterator can be\n * - Values can be pushed onto the queue\n * @example\n * const asyncQueue = new AsyncQueue();\n * setTimeout(() => asyncQueue.enqueue('tick'), 1000);\n * setTimeout(() => asyncQueue.enqueue(new Error('done')), 10000);\n * for await (const value of asyncQueue) {\n * console.log(value); // tick\n * }\n */\nexport default class AsyncQueue<T> {\n private _values: any[];\n private _settlers: any[];\n private _closed: boolean;\n\n constructor() {\n this._values = []; // enqueues > dequeues\n this._settlers = []; // dequeues > enqueues\n this._closed = false;\n }\n\n /** Return an async iterator for this queue */\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return this;\n }\n\n /** Push a new value - the async iterator will yield a promise resolved to this value */\n push(value: T): void {\n return this.enqueue(value);\n }\n\n /**\n * Push a new value - the async iterator will yield a promise resolved to this value\n * Add an error - the async iterator will yield a promise rejected with this value\n */\n enqueue(value: T | Error): void {\n if (this._closed) {\n throw new Error('Closed');\n }\n\n if (this._settlers.length > 0) {\n if (this._values.length > 0) {\n throw new Error('Illegal internal state');\n }\n const settler = this._settlers.shift();\n if (value instanceof Error) {\n settler.reject(value);\n } else {\n settler.resolve({value});\n }\n } else {\n this._values.push(value);\n }\n }\n\n /** Indicate that we not waiting for more values - The async iterator will be done */\n close(): void {\n while (this._settlers.length > 0) {\n const settler = this._settlers.shift();\n settler.resolve({done: true});\n }\n this._closed = true;\n }\n\n // ITERATOR IMPLEMENTATION\n\n /** @returns a Promise for an IteratorResult */\n next(): Promise<IteratorResult<T, any>> {\n // If values in queue, yield the first value\n if (this._values.length > 0) {\n const value = this._values.shift();\n if (value instanceof Error) {\n return Promise.reject(value);\n }\n return Promise.resolve({done: false, value});\n }\n\n // If queue is closed, the iterator is done\n if (this._closed) {\n if (this._settlers.length > 0) {\n throw new Error('Illegal internal state');\n }\n return Promise.resolve({done: true, value: undefined});\n }\n\n // Yield a promise that waits for new values to be enqueued\n return new Promise((resolve, reject) => {\n this._settlers.push({resolve, reject});\n });\n }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n WorkerMessageType,\n WorkerMessagePayload,\n WorkerContext,\n Process,\n ProcessInBatches\n} from '../../types';\nimport AsyncQueue from '../async-queue/async-queue';\nimport WorkerBody from '../worker-farm/worker-body';\n// import {validateWorkerVersion} from './validate-worker-version';\n\n/** Counter for jobs */\nlet requestId = 0;\nlet inputBatches: AsyncQueue<any>;\nlet options: {[key: string]: any};\n\nexport type ProcessOnMainThread = (\n data: any,\n options?: {[key: string]: any},\n context?: WorkerContext\n) => any;\n\n/**\n * Set up a WebWorkerGlobalScope to talk with the main thread\n */\nexport async function createWorker(\n process: Process,\n processInBatches?: ProcessInBatches\n): Promise<void> {\n if (!(await WorkerBody.inWorkerThread())) {\n return;\n }\n\n const context: WorkerContext = {\n process: processOnMainThread\n };\n\n // eslint-disable-next-line complexity\n WorkerBody.onmessage = async (type: WorkerMessageType, payload: WorkerMessagePayload) => {\n try {\n switch (type) {\n case 'process':\n if (!process) {\n throw new Error('Worker does not support atomic processing');\n }\n const result = await process(payload.input, payload.options || {}, context);\n WorkerBody.postMessage('done', {result});\n break;\n\n case 'process-in-batches':\n if (!processInBatches) {\n throw new Error('Worker does not support batched processing');\n }\n inputBatches = new AsyncQueue<any>();\n options = payload.options || {};\n const resultIterator = processInBatches(inputBatches, options, context);\n for await (const batch of resultIterator) {\n WorkerBody.postMessage('output-batch', {result: batch});\n }\n WorkerBody.postMessage('done', {});\n break;\n\n case 'input-batch':\n inputBatches.push(payload.input);\n break;\n\n case 'input-done':\n inputBatches.close();\n break;\n\n default:\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : '';\n WorkerBody.postMessage('error', {error: message});\n }\n };\n}\n\nfunction processOnMainThread(arrayBuffer: ArrayBuffer, options = {}) {\n return new Promise((resolve, reject) => {\n const id = requestId++;\n\n /**\n */\n const onMessage = (type: string, payload: WorkerMessagePayload) => {\n if (payload.id !== id) {\n // not ours\n return;\n }\n\n switch (type) {\n case 'done':\n WorkerBody.removeEventListener(onMessage);\n resolve(payload.result);\n break;\n\n case 'error':\n WorkerBody.removeEventListener(onMessage);\n reject(payload.error);\n break;\n\n default:\n // ignore\n }\n };\n\n WorkerBody.addEventListener(onMessage);\n\n // Ask the main thread to decode data\n const payload = {id, input: arrayBuffer, options};\n WorkerBody.postMessage('process', payload);\n });\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WorkerObject} from '../../types';\nimport {assert} from '../env-utils/assert';\nimport {VERSION} from '../env-utils/version';\n\n/**\n * Check if worker is compatible with this library version\n * @param worker\n * @param libVersion\n * @returns `true` if the two versions are compatible\n */\nexport function validateWorkerVersion(\n worker: WorkerObject,\n coreVersion: string = VERSION\n): boolean {\n assert(worker, 'no worker provided');\n\n const workerVersion = worker.version;\n if (!coreVersion || !workerVersion) {\n return false;\n }\n\n // TODO enable when fix the __version__ injection\n // const coreVersions = parseVersion(coreVersion);\n // const workerVersions = parseVersion(workerVersion);\n // assert(\n // coreVersion.major === workerVersion.major && coreVersion.minor <= workerVersion.minor,\n // `worker: ${worker.name} is not compatible. ${coreVersion.major}.${\n // coreVersion.minor\n // }+ is required.`\n // );\n\n return true;\n}\n\n// @ts-ignore\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction parseVersion(version) {\n const parts = version.split('.').map(Number);\n return {major: parts[0], minor: parts[1]};\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* global importScripts */\nimport {isBrowser, isWorker} from '../env-utils/globals';\nimport {assert} from '../env-utils/assert';\nimport {VERSION} from '../env-utils/version';\n\nexport type LoadLibraryOptions<ModulesT extends Record<string, any> = Record<string, any>> = {\n useLocalLibraries?: boolean;\n CDN?: string | null;\n modules?: ModulesT;\n // Core must not be supplied\n core?: never;\n};\n\ntype ExtractableLoadLibraryOptions<ModulesT extends Record<string, any> = Record<string, any>> = {\n useLocalLibraries?: boolean;\n CDN?: string | null;\n modules?: ModulesT;\n core?: {\n useLocalLibraries?: boolean;\n CDN?: string | null;\n } | null;\n};\n\nconst loadLibraryPromises: Record<string, Promise<any>> = {}; // promises\n\nexport function extractLoadLibraryOptions<\n ModulesT extends Record<string, any> = Record<string, any>\n>(options: ExtractableLoadLibraryOptions<ModulesT> = {}): LoadLibraryOptions<ModulesT> {\n const useLocalLibraries = options.useLocalLibraries ?? options.core?.useLocalLibraries;\n const CDN = options.CDN ?? options.core?.CDN;\n const modules = options.modules;\n\n return {\n ...(useLocalLibraries !== undefined ? {useLocalLibraries} : {}),\n ...(CDN !== undefined ? {CDN} : {}),\n ...(modules !== undefined ? {modules} : {})\n };\n}\n\n/**\n * Dynamically loads a library (\"module\")\n *\n * - wasm library: Array buffer is returned\n * - js library: Parse JS is returned\n *\n * Method depends on environment\n * - browser - script element is created and installed on document\n * - worker - eval is called on global context\n * - node - file is required\n *\n * @param libraryUrl\n * @param moduleName\n * @param options\n */\nexport async function loadLibrary(\n libraryUrl: string,\n moduleName: string | null = null,\n options: LoadLibraryOptions = {},\n libraryName: string | null = null\n): Promise<any> {\n if (moduleName) {\n libraryUrl = getLibraryUrl(libraryUrl, moduleName, options, libraryName);\n }\n // Ensure libraries are only loaded once\n\n loadLibraryPromises[libraryUrl] =\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n loadLibraryPromises[libraryUrl] || loadLibraryFromFile(libraryUrl);\n return await loadLibraryPromises[libraryUrl];\n}\n\n// TODO - sort out how to resolve paths for main/worker and dev/prod\nexport function getLibraryUrl(\n library: string,\n moduleName?: string,\n options: LoadLibraryOptions = {},\n libraryName: string | null = null\n): string {\n if (options?.core) {\n throw new Error('loadLibrary: options.core must be pre-normalized');\n }\n\n // Check if already a URL\n if (!options.useLocalLibraries && library.startsWith('http')) {\n return library;\n }\n\n libraryName = libraryName || library;\n\n // Allow application to import and supply libraries through `options.modules`\n // TODO - See js-module-utils in loader-utils\n const modules = options.modules || {};\n if (modules[libraryName]) {\n return modules[libraryName];\n }\n\n // Load from local files, not from CDN scripts in Node.js\n // TODO - needs to locate the modules directory when installed!\n if (!isBrowser) {\n return `modules/${moduleName}/dist/libs/${libraryName}`;\n }\n\n // In browser, load from external scripts\n if (options.CDN) {\n assert(options.CDN.startsWith('http'));\n return `${options.CDN}/${moduleName}@${VERSION}/dist/libs/${libraryName}`;\n }\n\n // TODO - loading inside workers requires paths relative to worker script location...\n if (isWorker) {\n return `../src/libs/${libraryName}`;\n }\n\n return `modules/${moduleName}/src/libs/${libraryName}`;\n}\n\nasync function loadLibraryFromFile(libraryUrl: string): Promise<any> {\n if (libraryUrl.endsWith('wasm')) {\n return await loadAsArrayBuffer(libraryUrl);\n }\n\n if (!isBrowser) {\n // TODO - Node doesn't yet support dynamic import from https URLs\n // try {\n // return await import(libraryUrl);\n // } catch (error) {\n // console.error(error);\n // }\n const {requireFromFile} = globalThis.loaders || {};\n try {\n const result = await requireFromFile?.(libraryUrl);\n if (result || !libraryUrl.includes('/dist/libs/')) {\n return result;\n }\n return await requireFromFile?.(libraryUrl.replace('/dist/libs/', '/src/libs/'));\n } catch (error) {\n if (libraryUrl.includes('/dist/libs/')) {\n try {\n return await requireFromFile?.(libraryUrl.replace('/dist/libs/', '/src/libs/'));\n } catch {\n // ignore\n }\n }\n console.error(error); // eslint-disable-line no-console\n return null;\n }\n }\n if (isWorker) {\n return importScripts(libraryUrl);\n }\n // TODO - fix - should be more secure than string parsing since observes CORS\n // if (isBrowser) {\n // return await loadScriptFromFile(libraryUrl);\n // }\n\n const scriptSource = await loadAsText(libraryUrl);\n return loadLibraryFromString(scriptSource, libraryUrl);\n}\n\n// TODO - Needs security audit...\n// - Raw eval call\n// - Potentially bypasses CORS\n// Upside is that this separates fetching and parsing\n// we could create a`LibraryLoader` or`ModuleLoader`\nfunction loadLibraryFromString(scriptSource: string, id: string): null | any {\n if (!isBrowser) {\n const {requireFromString} = globalThis.loaders || {};\n return requireFromString?.(scriptSource, id);\n }\n\n if (isWorker) {\n // Use lvalue trick to make eval run in global scope\n eval.call(globalThis, scriptSource); // eslint-disable-line no-eval\n // https://stackoverflow.com/questions/9107240/1-evalthis-vs-evalthis-in-javascript\n // http://perfectionkills.com/global-eval-what-are-the-options/\n return null;\n }\n\n const script = document.createElement('script');\n script.id = id;\n // most browsers like a separate text node but some throw an error. The second method covers those.\n try {\n script.appendChild(document.createTextNode(scriptSource));\n } catch (e) {\n script.text = scriptSource;\n }\n document.body.appendChild(script);\n return null;\n}\n\nasync function loadAsArrayBuffer(url: string): Promise<ArrayBuffer> {\n const {readFileAsArrayBuffer} = globalThis.loaders || {};\n if (isBrowser || !readFileAsArrayBuffer || url.startsWith('http')) {\n const response = await fetch(url);\n return await response.arrayBuffer();\n }\n try {\n return await readFileAsArrayBuffer(url);\n } catch {\n if (url.includes('/dist/libs/')) {\n return await readFileAsArrayBuffer(url.replace('/dist/libs/', '/src/libs/'));\n }\n throw new Error(`Failed to load ArrayBuffer from ${url}`);\n }\n}\n\n/**\n * Load a file from local file system\n * @param filename\n * @returns\n */\nasync function loadAsText(url: string): Promise<string> {\n const {readFileAsText} = globalThis.loaders || {};\n if (isBrowser || !readFileAsText || url.startsWith('http')) {\n const response = await fetch(url);\n return await response.text();\n }\n try {\n return await readFileAsText(url);\n } catch {\n if (url.includes('/dist/libs/')) {\n return await readFileAsText(url.replace('/dist/libs/', '/src/libs/'));\n }\n throw new Error(`Failed to load text from ${url}`);\n }\n}\n\n/*\nasync function loadScriptFromFile(libraryUrl) {\n const script = document.createElement('script');\n script.src = libraryUrl;\n return await new Promise((resolve, reject) => {\n script.onload = data => {\n resolve(data);\n };\n script.onerror = reject;\n });\n}\n*/\n\n// TODO - technique for module injection into worker, from THREE.DracoLoader...\n/*\nfunction combineWorkerWithLibrary(worker, jsContent) {\n var fn = wWorker.toString();\n var body = [\n '// injected',\n jsContent,\n '',\n '// worker',\n fn.substring(fn.indexOf('{') + 1, fn.lastIndexOf('}'))\n ].join('\\n');\n this.workerSourceURL = URL.createObjectURL(new Blob([body]));\n}\n*/\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ChildProcessProxyProps} from './child-process-proxy';\n\nexport default class ChildProcessProxy {\n constructor() {\n throw new Error('ChildProcessProxy is not available in browser environments');\n }\n\n async start(props?: ChildProcessProxyProps): Promise<object> {\n return await Promise.resolve({});\n }\n\n async stop(): Promise<void> {\n return await Promise.resolve();\n }\n\n async exit(): Promise<void> {\n return await Promise.resolve();\n }\n}\n"],
"mappings": "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",
"names": ["onMessage", "options", "onMessage", "parentPort", "options", "options", "process", "options", "onMessage", "payload", "options"]
}