generated from hrbrmstr/slightly-more-than-minimal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebr.mjs.map
7 lines (7 loc) · 172 KB
/
webr.mjs.map
1
2
3
4
5
6
7
{
"version": 3,
"sources": ["../src/webR/compat.ts", "../src/webR/utils.ts", "../src/webR/chan/task-common.ts", "../src/webR/chan/message.ts", "../src/webR/chan/task-main.ts", "../src/webR/chan/queue.ts", "../src/webR/payload.ts", "../src/webR/chan/channel.ts", "../src/webR/chan/task-worker.ts", "../src/webR/emscripten.ts", "../src/webR/chan/channel-shared.ts", "../src/webR/chan/channel-service.ts", "../src/webR/chan/channel-common.ts", "../src/webR/config.ts", "../src/webR/robj-main.ts", "../src/webR/robj.ts", "../src/webR/utils-r.ts", "../src/webR/robj-worker.ts", "../src/webR/proxy.ts", "../src/console/console.ts", "../src/webR/webr-main.ts"],
"sourcesContent": ["interface Process {\n browser: string | undefined;\n release: { [key: string]: string };\n}\ndeclare let process: Process;\n\nexport const IN_NODE =\n typeof process !== 'undefined' &&\n process.release &&\n process.release.name === 'node';\n\n// Adapted from https://github.com/pyodide/pyodide/blob/main/src/js/compat.ts\nexport let loadScript: (url: string) => Promise<void>;\nif (globalThis.document) {\n loadScript = (url) =>\n new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = url;\n script.onload = () => resolve();\n script.onerror = reject;\n document.head.appendChild(script);\n });\n} else if (globalThis.importScripts) {\n loadScript = async (url) => {\n try {\n globalThis.importScripts(url);\n } catch (e) {\n if (e instanceof TypeError) {\n await import(url);\n } else {\n throw e;\n }\n }\n };\n} else if (IN_NODE) {\n loadScript = async (url: string) => {\n const nodePathMod = (await import('path')).default;\n await import(nodePathMod.resolve(url));\n };\n} else {\n throw new Error('Cannot determine runtime environment');\n}\n", "import { IN_NODE } from './compat';\n\nexport type ResolveFn = (_value?: unknown) => void;\nexport type RejectFn = (_reason?: any) => void;\n\nexport function promiseHandles() {\n const out = {\n resolve: (_value?: unknown) => {},\n reject: (_reason?: any) => {},\n promise: null as unknown as Promise<unknown>,\n };\n\n const promise = new Promise((resolve, reject) => {\n out.resolve = resolve;\n out.reject = reject;\n });\n out.promise = promise;\n\n return out;\n}\n\nexport function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function replaceInObject<T>(\n obj: T | T[],\n test: (obj: any) => boolean,\n replacer: (obj: any, ...replacerArgs: any[]) => unknown,\n ...replacerArgs: unknown[]\n): T | T[] {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n if (test(obj)) {\n return replacer(obj, ...replacerArgs) as T;\n }\n if (Array.isArray(obj) || ArrayBuffer.isView(obj)) {\n return (obj as unknown[]).map((v) =>\n replaceInObject(v, test, replacer, ...replacerArgs)\n ) as T[];\n }\n return Object.fromEntries(\n Object.entries(obj).map(([k, v], i) => [k, replaceInObject(v, test, replacer, ...replacerArgs)])\n ) as T;\n}\n\n/* Workaround for loading a cross-origin script.\n *\n * When fetching a worker script, the fetch is required by the spec to\n * use \"same-origin\" mode. This is to avoid loading a worker with a\n * cross-origin global scope, which can allow for a cross-origin\n * restriction bypass.\n *\n * When the fetch URL begins with 'http', we assume the request is\n * cross-origin. We download the content of the URL using a XHR first,\n * create a blob URL containing the requested content, then load the\n * blob URL as a script.\n *\n * The origin of a blob URL is the same as that of the environment that\n * created the URL, and so the global scope of the resulting worker is\n * no longer cross-origin. In that case, the cross-origin restriction\n * bypass is not possible, and the script is permitted to be loaded.\n */\nexport function newCrossOriginWorker(url: string, cb: (worker: Worker) => void): void {\n const req = new XMLHttpRequest();\n req.open('get', url, true);\n req.onload = () => {\n const worker = new Worker(URL.createObjectURL(new Blob([req.responseText])));\n cb(worker);\n };\n req.send();\n}\n\nexport function isCrossOrigin(urlString: string) {\n if (IN_NODE) return false;\n const url1 = new URL(location.href);\n const url2 = new URL(urlString, location.origin);\n if (url1.host === url2.host && url1.port === url2.port && url1.protocol === url2.protocol) {\n return false;\n }\n return true;\n}\n\nexport function throwUnreachable(context?: string) {\n let msg = 'Reached the unreachable';\n msg = msg + (context ? ': ' + context : '.');\n\n throw new Error(msg);\n}\n", "// Original code from Synclink and Comlink. Released under Apache 2.0.\n\nexport const SZ_BUF_DOESNT_FIT = 0;\nexport const SZ_BUF_FITS_IDX = 1;\nexport const SZ_BUF_SIZE_IDX = 0;\n\nexport interface Endpoint extends EventSource {\n postMessage(message: any, transfer?: Transferable[]): void;\n start?: () => void;\n}\n\nexport interface EventSource {\n addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: {}): void;\n\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: {}\n ): void;\n}\n\nexport function toWireValue(value: any): [any, Transferable[]] {\n return [value, transferCache.get(value) || []];\n}\n\nconst transferCache = new WeakMap<any, Transferable[]>();\nexport function transfer<T>(obj: T, transfers: Transferable[]): T {\n transferCache.set(obj, transfers);\n return obj;\n}\n\nexport type UUID = string;\n\nexport function isUUID(x: any): x is UUID {\n return typeof x === 'string' && x.length === UUID_LENGTH;\n}\n\nexport const UUID_LENGTH = 63;\n\nexport function generateUUID(): UUID {\n const result = Array.from({ length: 4 }, randomSegment).join('-');\n if (result.length !== UUID_LENGTH) {\n throw new Error('comlink internal error: UUID has the wrong length');\n }\n return result;\n}\n\nfunction randomSegment() {\n let result = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16);\n const pad = 15 - result.length;\n if (pad > 0) {\n result = Array.from({ length: pad }, () => 0).join('') + result;\n }\n return result;\n}\n", "/**\n * WebR communication channel messaging and request types.\n * @module Message\n */\nimport { generateUUID, transfer, UUID } from './task-common';\n\n/** A webR communication channel message. */\nexport interface Message {\n type: string;\n data?: any;\n}\n\n/** A webR communication channel request. */\nexport interface Request {\n type: 'request';\n data: {\n uuid: UUID;\n msg: Message;\n };\n}\n\n/** A webR communication channel response. */\nexport interface Response {\n type: 'response';\n data: {\n uuid: UUID;\n resp: unknown;\n };\n}\n\n/** @internal */\nexport function newRequest(msg: Message, transferables?: [Transferable]): Request {\n return newRequestResponseMessage(\n {\n type: 'request',\n data: {\n uuid: generateUUID(),\n msg: msg,\n },\n },\n transferables\n );\n}\n\n/** @internal */\nexport function newResponse(uuid: UUID, resp: unknown, transferables?: [Transferable]): Response {\n return newRequestResponseMessage(\n {\n type: 'response',\n data: {\n uuid,\n resp,\n },\n },\n transferables\n );\n}\n\n/** @internal */\nfunction newRequestResponseMessage<T>(msg: T, transferables?: [Transferable]): T {\n // Signal to Synclink that the data contains objects we wish to\n // transfer, as in `postMessage()`\n if (transferables) {\n transfer(msg, transferables);\n }\n return msg;\n}\n\n/** A webR communication channel sync-request.\n * @internal\n */\nexport interface SyncRequest {\n type: 'sync-request';\n data: {\n msg: Message;\n reqData: SyncRequestData;\n };\n}\n\n/** Transfer data required when using sync-request with SharedArrayBuffer.\n * @internal */\nexport interface SyncRequestData {\n taskId?: number;\n sizeBuffer: Int32Array;\n signalBuffer: Int32Array;\n dataBuffer: Uint8Array;\n}\n\n/** @internal */\nexport function newSyncRequest(msg: Message, data: SyncRequestData): SyncRequest {\n return {\n type: 'sync-request',\n data: { msg, reqData: data },\n };\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder('utf-8');\n\n/**\n * Encode data for transfering from worker thread to main thread.\n * @param {any} data The message data to be serialised and encoded.\n * @return {Uint8Array} The encoded data.\n * @internal\n * */\nexport function encodeData(data: any): Uint8Array {\n // TODO: Pass a `replacer` function\n return encoder.encode(JSON.stringify(data));\n}\n\n/**\n * Decode data that has been transferred from worker thread to main thread.\n * @param {any} data The message data to be decoded.\n * @return {unknown} The data after decoding.\n * @internal\n * */\nexport function decodeData(data: Uint8Array): unknown {\n return JSON.parse(decoder.decode(data)) as unknown;\n}\n", "// Original code from Synclink and Comlink. Released under Apache 2.0.\n\nimport { Endpoint, SZ_BUF_FITS_IDX, SZ_BUF_SIZE_IDX, generateUUID } from './task-common';\n\nimport { sleep } from '../utils';\nimport { SyncRequestData, encodeData } from './message';\n\nimport { IN_NODE } from '../compat';\nimport type { Worker as NodeWorker } from 'worker_threads';\n\nconst encoder = new TextEncoder();\n\n/**\n * Respond to a blocking request. Most of the work has already been done in\n * asynclink, we are just responsible here for getting the return value back to\n * the requester through this slightly convoluted Atomics protocol.\n *\n * @param {Endpoint} endpoint A message port to receive messages from. Other\n * thread is blocked, so we can't send messages back.\n * @param {SyncRequestData} data The message that was recieved. We will use it\n * to read out the buffers to write the answer into. NOTE: requester\n * owns buffers.\n * @param {any} response The value we want to send back to the requester. We\n * have to encode it into data_buffer.\n */\nexport async function syncResponse(endpoint: Endpoint, data: SyncRequestData, response: any) {\n try {\n let { taskId, sizeBuffer, dataBuffer, signalBuffer } = data;\n // console.warn(msg);\n\n const bytes = encodeData(response);\n const fits = bytes.length <= dataBuffer.length;\n\n Atomics.store(sizeBuffer, SZ_BUF_SIZE_IDX, bytes.length);\n Atomics.store(sizeBuffer, SZ_BUF_FITS_IDX, +fits);\n if (!fits) {\n // console.log(\" need larger buffer\", taskId)\n // Request larger buffer\n const [uuid, dataPromise] = requestResponseMessage(endpoint);\n\n // Write UUID into dataBuffer so syncRequest knows where to respond to.\n dataBuffer.set(encoder.encode(uuid));\n await signalRequester(signalBuffer, taskId!);\n\n // Wait for response with new bigger dataBuffer\n dataBuffer = (await dataPromise).dataBuffer as Uint8Array;\n }\n\n // Encode result into dataBuffer\n dataBuffer.set(bytes);\n Atomics.store(sizeBuffer, SZ_BUF_FITS_IDX, +true);\n\n // console.log(\" signaling completion\", taskId)\n await signalRequester(signalBuffer, taskId as number);\n } catch (e) {\n console.warn(e);\n }\n}\n\nfunction requestResponseMessage(ep: Endpoint): [string, Promise<any>] {\n const id = generateUUID();\n return [\n id,\n new Promise((resolve) => {\n if (IN_NODE) {\n (ep as unknown as NodeWorker).once('message', (message: any) => {\n if (!message.id || message.id !== id) {\n return;\n }\n resolve(message);\n });\n } else {\n ep.addEventListener('message', function l(ev: MessageEvent) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener('message', l as EventListenerOrEventListenerObject);\n resolve(ev.data);\n } as EventListenerOrEventListenerObject);\n }\n if (ep.start) {\n ep.start();\n }\n }),\n ];\n}\n\nasync function signalRequester(signalBuffer: Int32Array, taskId: number) {\n const index = (taskId >> 1) % 32;\n let sleepTime = 1;\n while (Atomics.compareExchange(signalBuffer, index + 1, 0, taskId) !== 0) {\n // No Atomics.asyncWait except on Chrome =(\n await sleep(sleepTime);\n if (sleepTime < 32) {\n // exponential backoff\n sleepTime *= 2;\n }\n }\n Atomics.or(signalBuffer, 0, 1 << index);\n Atomics.notify(signalBuffer, 0);\n}\n", "// From https://stackoverflow.com/questions/47157428/how-to-implement-a-pseudo-blocking-async-queue-in-js-ts\n/**\n * @module Queue\n */\n\n/**\n * Asynchronous queue mechanism to be used by the communication channels.\n * @typeParam T The type of item to be stored in the queue.\n */\nexport class AsyncQueue<T> {\n #promises: Promise<T>[];\n #resolvers: ((t: T) => void)[];\n\n constructor() {\n this.#resolvers = [];\n this.#promises = [];\n }\n\n put(t: T) {\n if (!this.#resolvers.length) {\n this.#add();\n }\n const resolve = this.#resolvers.shift()!;\n resolve(t);\n }\n\n async get() {\n if (!this.#promises.length) {\n this.#add();\n }\n const promise = this.#promises.shift()!;\n return promise;\n }\n\n isEmpty() {\n return !this.#promises.length;\n }\n\n isBlocked() {\n return !!this.#resolvers.length;\n }\n\n get length() {\n return this.#promises.length - this.#resolvers.length;\n }\n\n #add() {\n this.#promises.push(\n new Promise((resolve) => {\n this.#resolvers.push(resolve);\n })\n );\n }\n}\n", "/**\n * Types containing references to R objects, raw data or errors over the webR\n * communication channel.\n * @module Payload\n */\nimport { WebRDataRaw, RPtr, RType } from './robj';\n\nexport type WebRPayloadRaw = {\n obj: WebRDataRaw;\n payloadType: 'raw';\n};\n\nexport type WebRPayloadPtr = {\n obj: {\n type?: RType;\n ptr: RPtr;\n methods?: string[];\n };\n payloadType: 'ptr';\n};\n\nexport type WebRPayloadErr = {\n obj: {\n message: string;\n name: string;\n stack?: string;\n };\n payloadType: 'err';\n};\n\n// On the main side we shouldn't see any error payload as these are\n// rethrown as JS exceptions\nexport type WebRPayload = WebRPayloadRaw | WebRPayloadPtr;\nexport type WebRPayloadWorker = WebRPayloadRaw | WebRPayloadPtr | WebRPayloadErr;\n\n/* @internal */\nexport function webRPayloadError(payload: WebRPayloadErr): Error {\n const e = new Error(payload.obj.message);\n e.name = payload.obj.name;\n e.stack = payload.obj.stack;\n return e;\n}\n\n/**\n * Test for an WebRPayload instance.\n *\n * @param {any} value The object to test.\n * @returns {boolean} True if the object is an instance of an WebRPayload.\n */\nexport function isWebRPayload(value: any): value is WebRPayload {\n return value && typeof value === 'object' && 'payloadType' in value && 'obj' in value;\n}\n\n/**\n * Test for an WebRPayloadPtr instance.\n *\n * @param {any} value The object to test.\n * @returns {boolean} True if the object is an instance of an WebRPayloadPtr.\n */\nexport function isWebRPayloadPtr(value: any): value is WebRPayloadPtr {\n return isWebRPayload(value) && value.payloadType === 'ptr';\n}\n\n/**\n * Test for an WebRPayloadRaw instance.\n *\n * @param {any} value The object to test.\n * @returns {boolean} True if the object is an instance of an WebRPayloadRaw.\n */\nexport function isWebRPayloadRaw(value: any): value is WebRPayloadRaw {\n return isWebRPayload(value) && value.payloadType === 'raw';\n}\n", "/**\n * Interfaces for the webR main and worker thread communication channels.\n * @module Channel\n */\n\nimport { promiseHandles, ResolveFn, RejectFn } from '../utils';\nimport { AsyncQueue } from './queue';\nimport { Message, newRequest, Response } from './message';\nimport { WebRPayload, WebRPayloadWorker, webRPayloadError } from '../payload';\n\n// The channel structure is asymetric:\n//\n// - The main thread maintains the input and output queues. All\n// messages sent from main are stored in the input queue. The input\n// queue is pull-based, it's the worker that initiates a transfer\n// via a sync-request.\n//\n// The output queue is filled at the initiative of the worker. The\n// main thread asynchronously reads from this queue, typically in an\n// async infloop.\n//\n// - The worker synchronously reads from the input queue. Reading a\n// message blocks until an input is available. Writing a message to\n// the output queue is equivalent to calling `postMessage()` and\n// returns immediately.\n//\n// Note that the messages sent from main to worker need to be\n// serialised. There is no structured cloning involved, and\n// ArrayBuffers can't be transferred, only copied.\n\nexport abstract class ChannelMain {\n inputQueue = new AsyncQueue<Message>();\n outputQueue = new AsyncQueue<Message>();\n\n #parked = new Map<string, { resolve: ResolveFn; reject: RejectFn }>();\n\n abstract initialised: Promise<unknown>;\n abstract close(): void;\n abstract interrupt(): void;\n\n async read(): Promise<Message> {\n return await this.outputQueue.get();\n }\n\n async flush(): Promise<Message[]> {\n const msg: Message[] = [];\n while (!this.outputQueue.isEmpty()) {\n msg.push(await this.read());\n }\n return msg;\n }\n\n write(msg: Message): void {\n this.inputQueue.put(msg);\n }\n\n async request(msg: Message, transferables?: [Transferable]): Promise<WebRPayload> {\n const req = newRequest(msg, transferables);\n\n const { resolve, reject, promise } = promiseHandles();\n this.#parked.set(req.data.uuid, { resolve, reject });\n\n this.write(req);\n return promise as Promise<WebRPayload>;\n }\n\n protected resolveResponse(msg: Response) {\n const uuid = msg.data.uuid;\n const handles = this.#parked.get(uuid);\n\n if (handles) {\n const payload = msg.data.resp as WebRPayloadWorker;\n this.#parked.delete(uuid);\n\n if (payload.payloadType === 'err') {\n handles.reject(webRPayloadError(payload));\n } else {\n handles.resolve(payload);\n }\n } else {\n console.warn(\"Can't find request.\");\n }\n }\n}\n\nexport interface ChannelWorker {\n resolve(): void;\n write(msg: Message, transfer?: [Transferable]): void;\n read(): Message;\n handleInterrupt(): void;\n setInterrupt(interrupt: () => void): void;\n run(args: string[]): void;\n inputOrDispatch: () => number;\n setDispatchHandler: (dispatch: (msg: Message) => void) => void;\n}\n", "// Original code from Synclink and Comlink. Released under Apache 2.0.\n\nimport {\n Endpoint,\n SZ_BUF_DOESNT_FIT,\n SZ_BUF_FITS_IDX,\n SZ_BUF_SIZE_IDX,\n UUID_LENGTH,\n} from './task-common';\n\nimport { newSyncRequest, Message, decodeData } from './message';\n\nconst decoder = new TextDecoder('utf-8');\n\nexport class SyncTask {\n endpoint: Endpoint;\n msg: Message;\n transfers: Transferable[];\n\n #scheduled = false;\n #resolved: boolean;\n #result?: any;\n #exception?: any;\n\n // sync only\n taskId?: number;\n #syncGen?: Generator<void, unknown, void>;\n sizeBuffer?: Int32Array;\n signalBuffer?: Int32Array;\n syncifier = new _Syncifier();\n\n constructor(endpoint: Endpoint, msg: Message, transfers: Transferable[] = []) {\n this.endpoint = endpoint;\n this.msg = msg;\n this.transfers = transfers;\n this.#resolved = false;\n }\n\n scheduleSync() {\n if (this.#scheduled) {\n return;\n }\n this.#scheduled = true;\n\n this.syncifier.scheduleTask(this);\n this.#syncGen = this.doSync();\n this.#syncGen.next();\n return this;\n }\n\n poll() {\n if (!this.#scheduled) {\n throw new Error('Task not synchronously scheduled');\n }\n\n const { done, value } = this.#syncGen!.next();\n if (!done) {\n return false;\n }\n\n this.#resolved = true;\n this.#result = value;\n\n return true;\n }\n\n *doSync() {\n // just use syncRequest.\n const { endpoint, msg, transfers } = this;\n const sizeBuffer = new Int32Array(new SharedArrayBuffer(8));\n const signalBuffer = this.signalBuffer!;\n const taskId = this.taskId;\n\n // Ensure status is cleared. We will notify\n let dataBuffer = acquireDataBuffer(UUID_LENGTH);\n // console.log(\"===requesting\", taskId);\n\n const syncMsg = newSyncRequest(msg, {\n sizeBuffer,\n dataBuffer,\n signalBuffer,\n taskId,\n });\n\n endpoint.postMessage(syncMsg, transfers);\n yield;\n\n if (Atomics.load(sizeBuffer, SZ_BUF_FITS_IDX) === SZ_BUF_DOESNT_FIT) {\n // There wasn't enough space, make a bigger dataBuffer.\n // First read uuid for response out of current dataBuffer\n const id = decoder.decode(dataBuffer.slice(0, UUID_LENGTH));\n releaseDataBuffer(dataBuffer);\n const size = Atomics.load(sizeBuffer, SZ_BUF_SIZE_IDX);\n dataBuffer = acquireDataBuffer(size);\n // console.log(\"===bigger data buffer\", taskId);\n endpoint.postMessage({ id, dataBuffer });\n yield;\n }\n\n const size = Atomics.load(sizeBuffer, SZ_BUF_SIZE_IDX);\n // console.log(\"===completing\", taskId);\n return decodeData(dataBuffer.slice(0, size));\n }\n\n get result() {\n if (this.#exception) {\n throw this.#exception;\n }\n // console.log(this.#resolved);\n if (this.#resolved) {\n return this.#result as unknown;\n }\n throw new Error('Not ready.');\n }\n\n syncify(): any {\n this.scheduleSync();\n this.syncifier.syncifyTask(this);\n return this.result;\n }\n}\n\nclass _Syncifier {\n nextTaskId: Int32Array;\n signalBuffer: Int32Array;\n tasks: Map<number, SyncTask>;\n\n constructor() {\n this.nextTaskId = new Int32Array([1]);\n this.signalBuffer = new Int32Array(new SharedArrayBuffer(32 * 4 + 4));\n this.tasks = new Map();\n }\n\n scheduleTask(task: SyncTask) {\n task.taskId = this.nextTaskId[0];\n this.nextTaskId[0] += 2;\n task.signalBuffer = this.signalBuffer;\n this.tasks.set(task.taskId, task);\n }\n\n waitOnSignalBuffer() {\n const timeout = 50;\n for (;;) {\n const status = Atomics.wait(this.signalBuffer, 0, 0, timeout);\n switch (status) {\n case 'ok':\n case 'not-equal':\n return;\n case 'timed-out':\n if (interruptBuffer[0] !== 0) {\n handleInterrupt();\n }\n break;\n default:\n throw new Error('Unreachable');\n }\n }\n }\n\n *tasksIdsToWakeup() {\n const flag = Atomics.load(this.signalBuffer, 0);\n for (let i = 0; i < 32; i++) {\n const bit = 1 << i;\n if (flag & bit) {\n Atomics.and(this.signalBuffer, 0, ~bit);\n const wokenTask = Atomics.exchange(this.signalBuffer, i + 1, 0);\n yield wokenTask;\n }\n }\n }\n\n pollTasks(task?: SyncTask) {\n let result = false;\n for (const wokenTaskId of this.tasksIdsToWakeup()) {\n // console.log(\"poll task\", wokenTaskId, \"looking for\",task);\n const wokenTask = this.tasks.get(wokenTaskId);\n if (!wokenTask) {\n throw new Error(`Assertion error: unknown taskId ${wokenTaskId}.`);\n }\n if (wokenTask.poll()) {\n // console.log(\"completed task \", wokenTaskId, wokenTask, wokenTask._result);\n this.tasks.delete(wokenTaskId);\n if (wokenTask === task) {\n result = true;\n }\n }\n }\n return result;\n }\n\n syncifyTask(task: SyncTask) {\n for (;;) {\n this.waitOnSignalBuffer();\n // console.log(\"syncifyTask:: woke\");\n if (this.pollTasks(task)) {\n return;\n }\n }\n }\n}\n\nconst dataBuffers: Uint8Array[][] = [];\n\nfunction acquireDataBuffer(size: number): Uint8Array {\n const powerof2 = Math.ceil(Math.log2(size));\n if (!dataBuffers[powerof2]) {\n dataBuffers[powerof2] = [];\n }\n const result = dataBuffers[powerof2].pop();\n if (result) {\n result.fill(0);\n return result;\n }\n return new Uint8Array(new SharedArrayBuffer(2 ** powerof2));\n}\n\nfunction releaseDataBuffer(buffer: Uint8Array) {\n const powerof2 = Math.ceil(Math.log2(buffer.byteLength));\n dataBuffers[powerof2].push(buffer);\n}\n\nlet interruptBuffer = new Int32Array(new ArrayBuffer(4));\n\nlet handleInterrupt = (): void => {\n interruptBuffer[0] = 0;\n throw new Error('Interrupted!');\n};\n\n/**\n * Sets the interrupt handler. This is called when the computation is\n * interrupted. Should zero the interrupt buffer and throw an exception.\n * @internal\n */\nexport function setInterruptHandler(handler: () => void) {\n handleInterrupt = handler;\n}\n\n/**\n * Sets the interrupt buffer. Should be a shared array buffer. When element 0\n * is set non-zero it signals an interrupt.\n * @internal\n */\nexport function setInterruptBuffer(buffer: ArrayBufferLike) {\n interruptBuffer = new Int32Array(buffer);\n}\n", "import type { RPtr, RTypeNumber } from './robj';\nimport type { UnwindProtectException } from './utils-r';\n\nexport interface Module extends EmscriptenModule {\n /* Add mkdirTree to FS namespace, missing from @types/emscripten at the\n * time of writing.\n */\n FS: typeof FS & {\n mkdirTree(path: string): void;\n };\n ENV: { [key: string]: string };\n LDSO: {\n loadedLibsByName: { [key: string]: any };\n loadedLibsByHandle: { [key: number]: any };\n };\n monitorRunDependencies: (n: number) => void;\n noImageDecoding: boolean;\n noAudioDecoding: boolean;\n noWasmDecoding: boolean;\n setPrompt: (prompt: string) => void;\n canvasExec: (op: string) => void;\n downloadFileContent: (\n URL: string,\n headers: Array<string>\n ) => {\n status: number;\n response: string | ArrayBuffer;\n };\n // Exported Emscripten JS API\n allocateUTF8: typeof allocateUTF8;\n allocateUTF8OnStack: typeof allocateUTF8OnStack;\n getValue: typeof getValue;\n setValue: typeof setValue;\n UTF8ToString: typeof UTF8ToString;\n callMain: (args: string[]) => void;\n // R symbols from Rinternals.h\n _ATTRIB: (ptr: RPtr) => RPtr;\n _CAR: (ptr: RPtr) => RPtr;\n _CDR: (ptr: RPtr) => RPtr;\n _CLOENV: (ptr: RPtr) => RPtr;\n _COMPLEX: (ptr: RPtr) => RPtr;\n _FRAME: (ptr: RPtr) => RPtr;\n _INTEGER: (ptr: RPtr) => RPtr;\n _INTERNAL: (ptr: RPtr) => RPtr;\n _LENGTH: (ptr: RPtr) => number;\n _LOGICAL: (ptr: RPtr) => RPtr;\n _PRINTNAME: (ptr: RPtr) => RPtr;\n _R_CHAR: (ptr: RPtr) => RPtr;\n _RAW: (ptr: RPtr) => RPtr;\n _REAL: (ptr: RPtr) => RPtr;\n _SETCAR: (x: RPtr, y: RPtr) => void;\n _STRING_ELT: (ptr: RPtr, idx: number) => RPtr;\n _STRING_PTR: (ptr: RPtr) => RPtr;\n _SYMVALUE: (ptr: RPtr) => RPtr;\n _TAG: (ptr: RPtr) => RPtr;\n _TYPEOF: (ptr: RPtr) => RPtr;\n _VECTOR_ELT: (ptr: RPtr, idx: number) => RPtr;\n _R_lsInternal3: (env: RPtr, all: number, sorted: number) => RPtr;\n _R_MakeExternalPtr: (p: number, tag: RPtr, prot: RPtr) => RPtr;\n _R_NewEnv: (enclos: RPtr, hash: number, size: number) => RPtr;\n _R_ParseEvalString: (code: number, env: RPtr) => RPtr;\n _R_PreserveObject: (ptr: RPtr) => void;\n _R_ReleaseObject: (ptr: RPtr) => void;\n _Rf_ScalarReal: (n: number) => RPtr;\n _Rf_ScalarLogical: (l: number) => RPtr;\n _Rf_ScalarInteger: (n: number) => RPtr;\n _Rf_ScalarString: (s: string) => RPtr;\n _Rf_allocList: (len: number) => RPtr;\n _Rf_allocVector: (type: RTypeNumber, len: number) => RPtr;\n _Rf_defineVar: (symbol: RPtr, value: RPtr, env: RPtr) => void;\n _Rf_error: (msg: EmPtr) => void;\n _Rf_eval: (call: RPtr, env: RPtr) => RPtr;\n _Rf_findVarInFrame: (rho: RPtr, symbol: RPtr) => RPtr;\n _Rf_listAppend: (source: RPtr, target: RPtr) => RPtr;\n _Rf_getAttrib: (ptr1: RPtr, ptr2: RPtr) => RPtr;\n _Rf_install: (ptr: number) => RPtr;\n _Rf_installTrChar: (name: RPtr) => RPtr;\n _Rf_lang1: (ptr1: RPtr) => RPtr;\n _Rf_lang2: (ptr1: RPtr, ptr2: RPtr) => RPtr;\n _Rf_lang3: (ptr1: RPtr, ptr2: RPtr, ptr3: RPtr) => RPtr;\n _Rf_lang4: (ptr1: RPtr, ptr2: RPtr, ptr3: RPtr, ptr4: RPtr) => RPtr;\n _Rf_lang5: (ptr1: RPtr, ptr2: RPtr, ptr3: RPtr, ptr4: RPtr, ptr5: RPtr) => RPtr;\n _Rf_lang6: (ptr1: RPtr, ptr2: RPtr, ptr3: RPtr, ptr4: RPtr, ptr5: RPtr, ptr6: RPtr) => RPtr;\n _Rf_mkChar: (ptr: number) => RPtr;\n _Rf_mkString: (ptr: number) => RPtr;\n _Rf_onintr: () => void;\n _Rf_protect: (ptr: RPtr) => RPtr;\n _R_ContinueUnwind: (cont: RPtr) => never;\n _R_ProtectWithIndex: (ptr1: RPtr, ptr2: RPtr) => void;\n _R_Reprotect: (ptr1: RPtr, ptr2: RPtr) => void;\n _Rf_setAttrib: (ptr1: RPtr, ptr2: RPtr, ptr3: RPtr) => RPtr;\n _Rf_unprotect: (n: number) => void;\n _Rf_unprotect_ptr: (ptr: RPtr) => void;\n _R_BaseEnv: RPtr;\n _R_BracketSymbol: RPtr;\n _R_Bracket2Symbol: RPtr;\n _R_DollarSymbol: RPtr;\n _R_EmptyEnv: RPtr;\n _R_FalseValue: RPtr;\n _R_GlobalEnv: RPtr;\n _R_Interactive: RPtr;\n _R_NaInt: RPtr;\n _R_NaReal: RPtr;\n _R_NaString: RPtr;\n _R_LogicalNAValue: RPtr;\n _R_NilValue: RPtr;\n _R_TrueValue: RPtr;\n _R_NamesSymbol: RPtr;\n _R_UnboundValue: RPtr;\n _SET_STRING_ELT: (ptr: RPtr, idx: number, val: RPtr) => void;\n _SET_VECTOR_ELT: (ptr: RPtr, idx: number, val: RPtr) => void;\n // TODO: Namespace all webR properties\n webr: {\n UnwindProtectException: typeof UnwindProtectException;\n readConsole: () => number;\n resolveInit: () => void;\n handleEvents: () => void;\n evalJs: (code: RPtr) => number;\n };\n}\n\nexport const Module = {} as Module;\n\ntype EmPtr = ReturnType<typeof Module.allocateUTF8>;\n\nexport interface DictEmPtrs {\n [key: string]: EmPtr;\n}\n\nexport function dictEmFree(dict: { [key: string | number]: EmPtr }) {\n Object.keys(dict).forEach((key) => Module._free(dict[key]));\n}\n", "import { promiseHandles, newCrossOriginWorker, isCrossOrigin } from '../utils';\nimport { Message, Response, SyncRequest } from './message';\nimport { Endpoint } from './task-common';\nimport { syncResponse } from './task-main';\nimport { ChannelMain, ChannelWorker } from './channel';\nimport { ChannelType } from './channel-common';\nimport { WebROptions } from '../webr-main';\n\nimport { IN_NODE } from '../compat';\nimport type { Worker as NodeWorker } from 'worker_threads';\nif (IN_NODE) {\n (globalThis as any).Worker = require('worker_threads').Worker as NodeWorker;\n}\n\n// Main ----------------------------------------------------------------\n\nexport class SharedBufferChannelMain extends ChannelMain {\n #interruptBuffer?: Int32Array;\n\n initialised: Promise<unknown>;\n resolve: (_?: unknown) => void;\n close = () => {};\n\n constructor(config: Required<WebROptions>) {\n super();\n const initWorker = (worker: Worker) => {\n this.#handleEventsFromWorker(worker);\n this.close = () => worker.terminate();\n const msg = {\n type: 'init',\n data: { config, channelType: ChannelType.SharedArrayBuffer },\n } as Message;\n worker.postMessage(msg);\n };\n\n if (isCrossOrigin(config.baseUrl)) {\n newCrossOriginWorker(`${config.baseUrl}webr-worker.js`, (worker: Worker) =>\n initWorker(worker)\n );\n } else {\n const worker = new Worker(`${config.baseUrl}webr-worker.js`);\n initWorker(worker);\n }\n\n ({ resolve: this.resolve, promise: this.initialised } = promiseHandles());\n }\n\n interrupt() {\n if (!this.#interruptBuffer) {\n throw new Error('Failed attempt to interrupt before initialising interruptBuffer');\n }\n this.#interruptBuffer[0] = 1;\n }\n\n #handleEventsFromWorker(worker: Worker) {\n if (IN_NODE) {\n (worker as unknown as NodeWorker).on('message', (message: Message) => {\n this.#onMessageFromWorker(worker, message);\n });\n } else {\n worker.onmessage = (ev: MessageEvent) =>\n this.#onMessageFromWorker(worker, ev.data as Message);\n }\n }\n\n #onMessageFromWorker = async (worker: Worker, message: Message) => {\n if (!message || !message.type) {\n return;\n }\n\n switch (message.type) {\n case 'resolve':\n this.#interruptBuffer = new Int32Array(message.data as SharedArrayBuffer);\n this.resolve();\n return;\n\n case 'response':\n this.resolveResponse(message as Response);\n return;\n\n default:\n this.outputQueue.put(message);\n return;\n\n case 'sync-request': {\n const msg = message as SyncRequest;\n const payload = msg.data.msg;\n const reqData = msg.data.reqData;\n\n switch (payload.type) {\n case 'read': {\n const response = await this.inputQueue.get();\n await syncResponse(worker, reqData, response);\n break;\n }\n default:\n throw new TypeError(`Unsupported request type '${payload.type}'.`);\n }\n return;\n }\n case 'request':\n throw new TypeError(\n \"Can't send messages of type 'request' from a worker. Please Use 'sync-request' instead.\"\n );\n }\n };\n}\n\n// Worker --------------------------------------------------------------\n\nimport { SyncTask, setInterruptHandler, setInterruptBuffer } from './task-worker';\nimport { Module } from '../emscripten';\n\nexport class SharedBufferChannelWorker implements ChannelWorker {\n #ep: Endpoint;\n #dispatch: (msg: Message) => void = () => 0;\n #interruptBuffer = new Int32Array(new SharedArrayBuffer(4));\n #interrupt = () => {};\n\n constructor() {\n this.#ep = (IN_NODE ? require('worker_threads').parentPort : globalThis) as Endpoint;\n setInterruptBuffer(this.#interruptBuffer.buffer);\n setInterruptHandler(() => this.handleInterrupt());\n }\n\n resolve() {\n this.write({ type: 'resolve', data: this.#interruptBuffer.buffer });\n }\n\n write(msg: Message, transfer?: [Transferable]) {\n this.#ep.postMessage(msg, transfer);\n }\n\n read(): Message {\n const msg = { type: 'read' } as Message;\n const task = new SyncTask(this.#ep, msg);\n return task.syncify() as Message;\n }\n\n inputOrDispatch(): number {\n for (;;) {\n const msg = this.read();\n if (msg.type === 'stdin') {\n return Module.allocateUTF8(msg.data as string);\n }\n this.#dispatch(msg);\n }\n }\n\n run(args: string[]) {\n Module.callMain(args);\n }\n\n setInterrupt(interrupt: () => void) {\n this.#interrupt = interrupt;\n }\n\n handleInterrupt() {\n if (this.#interruptBuffer[0] !== 0) {\n this.#interruptBuffer[0] = 0;\n this.#interrupt();\n }\n }\n\n setDispatchHandler(dispatch: (msg: Message) => void) {\n this.#dispatch = dispatch;\n }\n}\n", "import { promiseHandles, newCrossOriginWorker, isCrossOrigin } from '../utils';\nimport {\n Message,\n newRequest,\n Response,\n Request,\n newResponse,\n encodeData,\n decodeData,\n} from './message';\nimport { Endpoint } from './task-common';\nimport { ChannelMain, ChannelWorker } from './channel';\nimport { ChannelType } from './channel-common';\nimport { WebROptions } from '../webr-main';\n\nimport { IN_NODE } from '../compat';\nimport type { Worker as NodeWorker } from 'worker_threads';\nif (IN_NODE) {\n (globalThis as any).Worker = require('worker_threads').Worker as NodeWorker;\n}\n\n// Main ----------------------------------------------------------------\n\nexport class ServiceWorkerChannelMain extends ChannelMain {\n initialised: Promise<unknown>;\n\n resolve: (_?: unknown) => void;\n close = () => {};\n\n #syncMessageCache = new Map<string, Message>();\n #registration?: ServiceWorkerRegistration;\n #interrupted = false;\n\n constructor(config: Required<WebROptions>) {\n super();\n const initWorker = (worker: Worker) => {\n this.#handleEventsFromWorker(worker);\n this.close = () => worker.terminate();\n this.#registerServiceWorker(`${config.serviceWorkerUrl}webr-serviceworker.js`).then(\n (clientId) => {\n const msg = {\n type: 'init',\n data: {\n config,\n channelType: ChannelType.ServiceWorker,\n clientId,\n location: window.location.href,\n },\n } as Message;\n worker.postMessage(msg);\n }\n );\n };\n\n if (isCrossOrigin(config.serviceWorkerUrl)) {\n newCrossOriginWorker(`${config.serviceWorkerUrl}webr-worker.js`, (worker: Worker) =>\n initWorker(worker)\n );\n } else {\n const worker = new Worker(`${config.serviceWorkerUrl}webr-worker.js`);\n initWorker(worker);\n }\n\n ({ resolve: this.resolve, promise: this.initialised } = promiseHandles());\n }\n\n activeRegistration(): ServiceWorker {\n if (!this.#registration?.active) {\n throw new Error('Attempted to obtain a non-existent active registration.');\n }\n return this.#registration.active;\n }\n\n interrupt() {\n this.#interrupted = true;\n }\n\n async #registerServiceWorker(url: string): Promise<string> {\n // Register service worker\n this.#registration = await navigator.serviceWorker.register(url);\n await navigator.serviceWorker.ready;\n window.addEventListener('beforeunload', () => {\n this.#registration?.unregister();\n });\n\n // Ensure we can communicate with service worker and we have a client ID\n const clientId = await new Promise<string>((resolve) => {\n navigator.serviceWorker.addEventListener(\n 'message',\n function listener(event: MessageEvent<{ type: string; clientId: string }>) {\n if (event.data.type === 'registration-successful') {\n navigator.serviceWorker.removeEventListener('message', listener);\n resolve(event.data.clientId);\n }\n }\n );\n this.activeRegistration().postMessage({ type: 'register-client-main' });\n });\n\n // Setup listener for service worker messages\n navigator.serviceWorker.addEventListener('message', (event: MessageEvent<Request>) => {\n this.#onMessageFromServiceWorker(event);\n });\n return clientId;\n }\n\n async #onMessageFromServiceWorker(event: MessageEvent<Message>) {\n if (event.data.type === 'request') {\n const uuid = event.data.data as string;\n const message = this.#syncMessageCache.get(uuid);\n if (!message) {\n throw new Error('Request not found during service worker XHR request');\n }\n this.#syncMessageCache.delete(uuid);\n switch (message.type) {\n case 'read': {\n const response = await this.inputQueue.get();\n this.activeRegistration().postMessage({\n type: 'wasm-webr-fetch-response',\n uuid: uuid,\n response: newResponse(uuid, response),\n });\n break;\n }\n case 'interrupt': {\n const response = this.#interrupted;\n this.activeRegistration().postMessage({\n type: 'wasm-webr-fetch-response',\n uuid: uuid,\n response: newResponse(uuid, response),\n });\n this.#interrupted = false;\n break;\n }\n default:\n throw new TypeError(`Unsupported request type '${message.type}'.`);\n }\n return;\n }\n }\n\n #handleEventsFromWorker(worker: Worker) {\n if (IN_NODE) {\n (worker as unknown as NodeWorker).on('message', (message: Message) => {\n this.#onMessageFromWorker(worker, message);\n });\n } else {\n worker.onmessage = (ev: MessageEvent) =>\n this.#onMessageFromWorker(worker, ev.data as Message);\n }\n }\n\n #onMessageFromWorker = async (worker: Worker, message: Message) => {\n if (!message || !message.type) {\n return;\n }\n\n switch (message.type) {\n case 'resolve':\n this.resolve();\n return;\n\n case 'response':\n this.resolveResponse(message as Response);\n return;\n\n default:\n this.outputQueue.put(message);\n return;\n\n case 'sync-request': {\n const request = message.data as Request;\n this.#syncMessageCache.set(request.data.uuid, request.data.msg);\n return;\n }\n\n case 'request':\n throw new TypeError(\n \"Can't send messages of type 'request' from a worker.\" +\n 'Use service worker fetch request instead.'\n );\n }\n };\n}\n\n// Worker --------------------------------------------------------------\n\nimport { Module } from '../emscripten';\n\nexport class ServiceWorkerChannelWorker implements ChannelWorker {\n #ep: Endpoint;\n #mainThreadId: string;\n #location: string;\n #dispatch: (msg: Message) => void = () => 0;\n #interrupt = () => {};\n onMessageFromMainThread: (msg: Message) => void = () => {};\n\n constructor(data: { clientId?: string; location?: string }) {\n if (!data.clientId || !data.location) {\n throw Error(\"Can't start service worker channel\");\n }\n this.#mainThreadId = data.clientId;\n this.#location = data.location;\n this.#ep = (IN_NODE ? require('worker_threads').parentPort : globalThis) as Endpoint;\n }\n\n resolve() {\n this.write({ type: 'resolve' });\n }\n\n write(msg: Message, transfer?: [Transferable]) {\n this.#ep.postMessage(msg, transfer);\n }\n\n syncRequest(message: Message): Response {\n /*\n * Browsers timeout service workers after about 5 minutes on inactivity.\n * See e.g. service_worker_version.cc in Chromium.\n *\n * To avoid the service worker being shut down, we timeout our XHR after\n * 1 minute and then resend the request as a keep-alive. The service worker\n * uses the message UUID to identify the request and continue waiting for a\n * response from where it left off.\n */\n const request = newRequest(message);\n this.write({ type: 'sync-request', data: request });\n\n let retryCount = 0;\n for (;;) {\n try {\n const url = new URL('__wasm__/webr-fetch-request/', this.#location);\n const xhr = new XMLHttpRequest();\n xhr.timeout = 60000;\n xhr.responseType = 'arraybuffer';\n xhr.open('POST', url, false);\n const fetchReqBody = {\n clientId: this.#mainThreadId,\n uuid: request.data.uuid,\n };\n xhr.send(encodeData(fetchReqBody));\n return decodeData(new Uint8Array(xhr.response as ArrayBuffer)) as Response;\n } catch (e: any) {\n if (e instanceof DOMException && retryCount++ < 1000) {\n console.log('Service worker request failed - resending request');\n } else {\n throw e;\n }\n }\n }\n }\n\n read(): Message {\n const response = this.syncRequest({ type: 'read' });\n return response.data.resp as Message;\n }\n\n inputOrDispatch(): number {\n for (;;) {\n const msg = this.read();\n if (msg.type === 'stdin') {\n return Module.allocateUTF8(msg.data as string);\n }\n this.#dispatch(msg);\n }\n }\n\n run(args: string[]) {\n Module.callMain(args);\n }\n\n setInterrupt(interrupt: () => void) {\n this.#interrupt = interrupt;\n }\n\n handleInterrupt() {\n /* During R computation we have no way to directly interrupt the worker\n * thread. Instead, we hook into R's PolledEvents. Since we are not using\n * SharedArrayBuffer as a signal method, we instead send a message to the\n * main thread to ask if we should interrupt R.\n */\n const response = this.syncRequest({ type: 'interrupt' });\n const interrupted = response.data.resp as boolean;\n if (interrupted) {\n this.#interrupt();\n }\n }\n\n setDispatchHandler(dispatch: (msg: Message) => void) {\n this.#dispatch = dispatch;\n }\n}\n", "import { SharedBufferChannelMain, SharedBufferChannelWorker } from './channel-shared';\nimport { ServiceWorkerChannelMain, ServiceWorkerChannelWorker } from './channel-service';\nimport { WebROptions } from '../webr-main';\nimport { isCrossOrigin } from '../utils';\nimport { IN_NODE } from '../compat';\n\n// This file refers to objects imported from `./channel-shared` and\n// `./channel-service.` These can't be included in `./channel` as this\n// causes a circular dependency issue.\n\nexport const ChannelType = {\n Automatic: 0,\n SharedArrayBuffer: 1,\n ServiceWorker: 2,\n} as const;\n\nexport type ChannelInitMessage = {\n type: string;\n data: {\n config: Required<WebROptions>;\n channelType: Exclude<\n (typeof ChannelType)[keyof typeof ChannelType],\n typeof ChannelType.Automatic\n >;\n clientId?: string;\n location?: string;\n };\n};\n\nexport function newChannelMain(data: Required<WebROptions>) {\n switch (data.channelType) {\n case ChannelType.SharedArrayBuffer:\n return new SharedBufferChannelMain(data);\n case ChannelType.ServiceWorker:\n return new ServiceWorkerChannelMain(data);\n case ChannelType.Automatic:\n default:\n if (IN_NODE || crossOriginIsolated) {\n return new SharedBufferChannelMain(data);\n }\n /*\n * TODO: If we are not cross-origin isolated but we can still use service\n * workers, we could setup a service worker to inject the relevant headers\n * to enable cross-origin isolation.\n */\n if ('serviceWorker' in navigator && !isCrossOrigin(data.serviceWorkerUrl)) {\n return new ServiceWorkerChannelMain(data);\n }\n throw new Error(\"Can't initialise main thread communication channel\");\n }\n}\n\nexport function newChannelWorker(msg: ChannelInitMessage) {\n switch (msg.data.channelType) {\n case ChannelType.SharedArrayBuffer:\n return new SharedBufferChannelWorker();\n case ChannelType.ServiceWorker:\n return new ServiceWorkerChannelWorker(msg.data);\n default:\n throw new Error('Unknown worker channel type recieved');\n }\n}\n", "import { IN_NODE } from './compat';\n\nexport const BASE_URL = IN_NODE ? __dirname + '/' : './';\nexport const PKG_BASE_URL = 'https://repo.r-wasm.org';\n", "/**\n * Module for working with R objects on the main thead through\n * JavaScript proxies. The `RObject` types in `RMain` are aliases for\n * proxies to the corresponding types in `RWorker`. For instance,\n * `RMain.RCharacter` is an alias for `RMain.RProxy<RWorker.RCharacter>`.\n * The proxies automatically and asynchronously forward method and\n * getter calls to the implementations on the R worker side.\n * @module RMain\n */\nimport type { RProxy } from './proxy';\nimport { isWebRPayloadPtr } from './payload';\nimport * as RWorker from './robj-worker';\n\n// RProxy<RWorker.RObject> type aliases\nexport type RObject = RProxy<RWorker.RObject>;\nexport type RNull = RProxy<RWorker.RNull>;\nexport type RSymbol = RProxy<RWorker.RSymbol>;\nexport type RPairlist = RProxy<RWorker.RPairlist>;\nexport type REnvironment = RProxy<RWorker.REnvironment>;\nexport type RString = RProxy<RWorker.RString>;\nexport type RLogical = RProxy<RWorker.RLogical>;\nexport type RInteger = RProxy<RWorker.RInteger>;\nexport type RDouble = RProxy<RWorker.RDouble>;\nexport type RComplex = RProxy<RWorker.RComplex>;\nexport type RCharacter = RProxy<RWorker.RCharacter>;\nexport type RList = RProxy<RWorker.RList>;\nexport type RRaw = RProxy<RWorker.RRaw>;\nexport type RCall = RProxy<RWorker.RCall>;\n// RFunction proxies are callable\nexport type RFunction = RProxy<RWorker.RFunction> & ((...args: unknown[]) => Promise<unknown>);\n\n/**\n * Test for an RObject instance\n *\n * RObject is the user facing interface to R objects.\n *\n * @param {any} value The object to test.\n * @returns {boolean} True if the object is an instance of an RObject.\n */\nexport function isRObject(value: any): value is RObject {\n return (\n value &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'payloadType' in value &&\n isWebRPayloadPtr(value._payload)\n );\n}\n\n/**\n * Test for an RFunction instance\n *\n * @param {any} value The object to test.\n * @returns {boolean} True if the object is an instance of an RFunction.\n */\nexport function isRFunction(value: any): value is RFunction {\n return Boolean(isRObject(value) && value._payload.obj.methods?.includes('exec'));\n}\n", "/**\n * Common module for working with R objects.\n * @module RObject\n */\nimport * as RMain from './robj-main';\nimport * as RWorker from './robj-worker';\n\nexport type RPtr = number;\n\nexport const RTypeMap = {\n null: 0,\n symbol: 1,\n pairlist: 2,\n closure: 3,\n environment: 4,\n promise: 5,\n call: 6,\n special: 7,\n builtin: 8,\n string: 9,\n logical: 10,\n integer: 13,\n double: 14,\n complex: 15,\n character: 16,\n dots: 17,\n any: 18,\n list: 19,\n expression: 20,\n bytecode: 21,\n pointer: 22,\n weakref: 23,\n raw: 24,\n s4: 25,\n new: 30,\n free: 31,\n function: 99,\n} as const;\nexport type RType = keyof typeof RTypeMap;\nexport type RTypeNumber = (typeof RTypeMap)[keyof typeof RTypeMap];\n\nexport type Complex = {\n re: number;\n im: number;\n};\n\nexport type WebRDataRaw =\n | number\n | string\n | boolean\n | undefined\n | null\n | void\n | Complex\n | Error\n | ArrayBuffer\n | ArrayBufferView\n | Array<WebRDataRaw>\n | Map<WebRDataRaw, WebRDataRaw>\n | Set<WebRDataRaw>\n | { [key: string]: WebRDataRaw };\n\nexport type NamedEntries<T> = [string | null, T][];\nexport type NamedObject<T> = { [key: string]: T };\n\n/**\n * A union of JavaScript types that are able to be converted into an R object.\n *\n * `WebRData` is used both as a general input argument for R object construction\n * and also as a general return type when converting R objects into JavaScript.\n *\n */\nexport type WebRData =\n | RMain.RObject\n | RWorker.RObjectBase\n | RWorker.RObject\n | WebRDataRaw\n | WebRDataJs\n | WebRData[]\n | { [key: string]: WebRData };\n\n/**\n * A subset of {@link WebRData} for JavaScript objects that can be converted\n * into R atomic vectors.\n *\n * @typeParam T The JavaScript scalar type associated with the atomic vector.\n */\nexport type WebRDataAtomic<T> =\n | WebRDataScalar<T>\n | (T | null)[]\n | WebRDataJsAtomic<T>\n | NamedObject<T | null>;\n\n/**\n * `WebRDataJs` objects form a tree structure, used when serialising R objects\n * into a JavaScript respresentation.\n *\n * Nested R objects are serialised using the {@link WebRDataJsNode} type,\n * forming branches in the resulting tree structure, with leaves formed by the\n * remaining types.\n */\nexport type WebRDataJs =\n | WebRDataJsNull\n | WebRDataJsString\n | WebRDataJsSymbol\n | WebRDataJsNode\n | WebRDataJsAtomic<RWorker.atomicType>;\n\nexport type WebRDataJsNull = {\n type: 'null';\n};\n\nexport type WebRDataJsString = {\n type: 'string';\n value: string;\n};\n\nexport type WebRDataJsSymbol = {\n type: 'symbol';\n printname: string | null;\n symvalue: RPtr | null;\n internal: RPtr | null;\n};\n\nexport type WebRDataJsNode = {\n type: 'list' | 'pairlist' | 'environment';\n names: (string | null)[] | null;\n values: (WebRDataRaw | RWorker.RObject | RMain.RObject | WebRDataJs)[];\n};\n\nexport type WebRDataJsAtomic<T> = {\n type: 'logical' | 'integer' | 'double' | 'complex' | 'character' | 'raw';\n names: (string | null)[] | null;\n values: (T | null)[];\n};\n\n/**\n * Test for a {@link WebRDataJs} instance.\n *\n * @param {any} value The object to test.\n * @returns {boolean} True if the object is an instance of a {@link WebRDataJs}.\n */\nexport function isWebRDataJs(value: any): value is WebRDataJs {\n return value && typeof value === 'object' && Object.keys(RTypeMap).includes(value.type as string);\n}\n\n/**\n * A subset of WebRData for scalar JavaScript objects.\n */\nexport type WebRDataScalar<T> = T | RMain.RObject | RWorker.RObjectBase;\n\n/**\n * Test if an object is of type {@link Complex}.\n *\n * @param {any} value The object to test.\n * @returns {boolean} True if the object is of type {@link Complex}.\n */\nexport function isComplex(value: any): value is Complex {\n return value && typeof value === 'object' && 're' in value && 'im' in value;\n}\n", "import { Module, DictEmPtrs, dictEmFree } from './emscripten';\nimport { WebRData, RPtr } from './robj';\nimport { RObject, REnvironment, RHandle, handlePtr } from './robj-worker';\n\nexport function protect<T extends RHandle>(x: T): T {\n Module._Rf_protect(handlePtr(x));\n return x;\n}\n\nexport function protectInc<T extends RHandle>(x: T, prot: { n: number }): T {\n Module._Rf_protect(handlePtr(x));\n ++prot.n;\n return x;\n}\n\nexport function protectWithIndex(x: RHandle): { loc: number; ptr: RPtr } {\n // Integer size hardcoded to 4 bytes. This is fine but is there a\n // way to call sizeof?\n const pLoc = Module._malloc(4);\n\n Module._R_ProtectWithIndex(handlePtr(x), pLoc);\n const loc = Module.getValue(pLoc, 'i32');\n\n return { loc: loc, ptr: pLoc };\n}\n\nexport function unprotectIndex(index: { ptr: RPtr }): void {\n Module._Rf_unprotect(1);\n Module._free(index.ptr);\n}\n\nexport function reprotect<T extends RHandle>(x: T, index: { loc: number; ptr: RPtr }): T {\n Module._R_Reprotect(handlePtr(x), index.loc);\n return x;\n}\n\nexport function unprotect(n: number) {\n Module._Rf_unprotect(n);\n}\n\n// rlang convention: `env`-prefixed functions consistently take `env`\n// as first argument\nexport function envPoke(env: RHandle, sym: RHandle, value: RHandle) {\n Module._Rf_defineVar(handlePtr(sym), handlePtr(value), handlePtr(env));\n}\n\nexport function parseEvalBare(code: string, env: WebRData): RObject {\n const strings: DictEmPtrs = {};\n const prot = { n: 0 };\n\n try {\n const envObj = new REnvironment(env);\n protectInc(envObj, prot);\n\n strings.code = Module.allocateUTF8(code);\n\n const out = Module._R_ParseEvalString(strings.code, envObj.ptr);\n return RObject.wrap(out);\n } finally {\n dictEmFree(strings);\n unprotect(prot.n);\n }\n}\n\nexport class UnwindProtectException extends Error {\n cont: RPtr;\n constructor(message: string, cont: RPtr) {\n super(message);\n this.name = 'UnwindProtectException';\n this.cont = cont;\n }\n}\n\nexport function safeEval(call: RHandle, env: RHandle): RPtr {\n return Module.LDSO.loadedLibsByName['/usr/lib/R/library/webr/libs/webr.so'].module.ffi_safe_eval(\n handlePtr(call),\n handlePtr(env)\n );\n}\n", "/**\n * Module for working with R objects on the worker thead.\n * @module RWorker\n */\nimport { Module } from './emscripten';\nimport { Complex, isComplex, NamedEntries, NamedObject, WebRDataRaw, WebRDataScalar } from './robj';\nimport { WebRData, WebRDataAtomic, RPtr, RType, RTypeMap, RTypeNumber } from './robj';\nimport { isWebRDataJs, WebRDataJs, WebRDataJsAtomic, WebRDataJsNode } from './robj';\nimport { WebRDataJsNull, WebRDataJsString, WebRDataJsSymbol } from './robj';\nimport { envPoke, parseEvalBare, protect, protectInc, unprotect } from './utils-r';\nimport { protectWithIndex, reprotect, unprotectIndex, safeEval } from './utils-r';\nimport { ShelterID, isShelterID } from './webr-chan';\n\nexport type RHandle = RObject | RPtr;\n\nexport function handlePtr(x: RHandle): RPtr {\n if (isRObject(x)) {\n return x.ptr;\n } else {\n return x;\n }\n}\n\n// Throw if an R object does not match a certain R type\nfunction assertRType(obj: RObjectBase, type: RType) {\n if (Module._TYPEOF(obj.ptr) !== RTypeMap[type]) {\n throw new Error(`Unexpected object type \"${obj.type()}\" when expecting type \"${type}\"`);\n }\n}\n\n// TODO: Shelter should be a dictionary not an array\nexport const shelters = new Map<ShelterID, RPtr[]>();\n\n// Use this for implicit protection of objects sent to the main\n// thread. Currently uses the precious list but could use a different\n// mechanism in the future. Unprotection is explicit through\n// `Shelter.destroy()`.\nexport function keep(shelter: ShelterID, x: RHandle) {\n const ptr = handlePtr(x);\n Module._R_PreserveObject(ptr);\n\n // TODO: Remove when shelter transition is complete\n if (shelter === undefined) {\n return;\n }\n\n if (isShelterID(shelter)) {\n shelters.get(shelter)!.push(ptr);\n return;\n }\n\n throw new Error('Unexpected shelter type ' + typeof shelter);\n}\n\n// Frees objects preserved with `keep()`. This method is called by\n// users in the main thread to release objects that were automatically\n// protected before being sent away.\nexport function destroy(shelter: ShelterID, x: RHandle) {\n const ptr = handlePtr(x);\n Module._R_ReleaseObject(ptr);\n\n const objs: RPtr[] = shelters.get(shelter)!;\n const loc = objs.indexOf(ptr);\n\n if (loc < 0) {\n throw new Error(\"Can't find object in shelter.\");\n }\n\n objs.splice(loc, 1);\n}\n\nexport function purge(shelter: ShelterID) {\n const ptrs: RPtr[] = shelters.get(shelter)!;\n\n for (const ptr of ptrs) {\n try {\n Module._R_ReleaseObject(ptr);\n } catch (e) {\n console.error(e);\n }\n }\n\n shelters.set(shelter, []);\n}\n\nexport interface ToJsOptions {\n depth: number;\n}\n\nexport type Nullable<T> = T | RNull;\n\nfunction newObjectFromData(obj: WebRData): RObject {\n // Conversion of WebRDataJs type JS objects\n if (isWebRDataJs(obj)) {\n return new (getRWorkerClass(RTypeMap[obj.type]))(obj);\n }\n\n // Conversion of explicit R NULL value\n if (obj && typeof obj === 'object' && 'type' in obj && obj.type === 'null') {\n return new RNull();\n }\n\n // Direct conversion of scalar JS values\n if (obj === null) {\n return new RLogical({ type: 'logical', names: null, values: [null] });\n }\n if (typeof obj === 'boolean') {\n return new RLogical(obj);\n }\n if (typeof obj === 'number') {\n return new RDouble(obj);\n }\n if (typeof obj === 'string') {\n return new RCharacter(obj);\n }\n if (isComplex(obj)) {\n return new RComplex(obj);\n }\n if (Array.isArray(obj)) {\n return newObjectFromArray(obj);\n }\n\n throw new Error('Robj construction for this JS object is not yet supported');\n}\n\n// JS arrays are interpreted using R's c() function, so as to match\n// R's built in coercion rules\nfunction newObjectFromArray(arr: WebRData[]) {\n const prot = { n: 0 };\n\n try {\n const call = new RCall([new RSymbol('c'), ...arr]);\n protectInc(call, prot);\n return call.eval();\n } finally {\n unprotect(prot.n);\n }\n}\n\nexport class RObjectBase {\n ptr: RPtr;\n constructor(ptr: RPtr) {\n this.ptr = ptr;\n }\n\n type(): RType {\n const typeNumber = Module._TYPEOF(this.ptr) as RTypeNumber;\n const type = Object.keys(RTypeMap).find(\n (typeName) => RTypeMap[typeName as RType] === typeNumber\n );\n return type as RType;\n }\n}\n\nexport class RObject extends RObjectBase {\n constructor(data: WebRData) {\n if (!(data instanceof RObjectBase)) {\n return newObjectFromData(data);\n }\n\n super(data.ptr);\n }\n\n static wrap<T extends typeof RObject>(this: T, ptr: RPtr): InstanceType<T> {\n const type = Module._TYPEOF(ptr);\n return new (getRWorkerClass(type as RTypeNumber))(new RObjectBase(ptr)) as InstanceType<T>;\n }\n\n get [Symbol.toStringTag](): string {\n return `RObject:${this.type()}`;\n }\n\n /** @internal */\n static getPersistentObject(prop: keyof typeof objs): unknown {\n return objs[prop];\n }\n\n /** @internal */\n getPropertyValue(prop: keyof this): unknown {\n return this[prop];\n }\n\n inspect(): void {\n parseEvalBare('.Internal(inspect(x))', { x: this });\n }\n\n isNull(): this is RNull {\n return Module._TYPEOF(this.ptr) === RTypeMap.null;\n }\n\n isUnbound(): boolean {\n return this.ptr === objs.unboundValue.ptr;\n }\n\n attrs(): Nullable<RPairlist> {\n return RPairlist.wrap(Module._ATTRIB(this.ptr));\n }\n\n setNames(values: (string | null)[] | null): this {\n let namesObj: RObject;\n\n if (values === null) {\n namesObj = objs.null;\n } else if (Array.isArray(values) && values.every((v) => typeof v === 'string' || v === null)) {\n namesObj = new RCharacter(values);\n } else {\n throw new Error('Argument to setNames must be null or an Array of strings or null');\n }\n\n // `setAttrib()` protects its inputs\n Module._Rf_setAttrib(this.ptr, objs.namesSymbol.ptr, namesObj.ptr);\n return this;\n }\n\n names(): (string | null)[] | null {\n const names = RCharacter.wrap(Module._Rf_getAttrib(this.ptr, objs.namesSymbol.ptr));\n if (names.isNull()) {\n return null;\n } else {\n return names.toArray();\n }\n }\n\n includes(name: string) {\n const names = this.names();\n return names && names.includes(name);\n }\n\n toJs(options: ToJsOptions = { depth: 0 }, depth = 1): WebRDataJs {\n throw new Error('This R object cannot be converted to JS');\n }\n\n subset(prop: number | string): RObject {\n return this.#slice(prop, objs.bracketSymbol.ptr);\n }\n\n get(prop: number | string): RObject {\n return this.#slice(prop, objs.bracket2Symbol.ptr);\n }\n\n getDollar(prop: string): RObject {\n return this.#slice(prop, objs.dollarSymbol.ptr);\n }\n\n #slice(prop: number | string, op: RPtr): RObject {\n const prot = { n: 0 };\n\n try {\n const idx = new RObject(prop);\n protectInc(idx, prot);\n\n const call = Module._Rf_lang3(op, this.ptr, idx.ptr);\n protectInc(call, prot);\n\n return RObject.wrap(safeEval(call, objs.baseEnv));\n } finally {\n unprotect(prot.n);\n }\n }\n\n pluck(...path: (string | number)[]): RObject | undefined {\n const index = protectWithIndex(objs.null);\n\n try {\n const getter = (obj: RObject, prop: string | number): RObject => {\n const out = obj.get(prop);\n return reprotect(out, index);\n };\n const result = path.reduce(getter, this);\n\n return result.isNull() ? undefined : result;\n } finally {\n unprotectIndex(index);\n }\n }\n\n set(prop: string | number, value: RObject | WebRDataRaw): RObject {\n const prot = { n: 0 };\n\n try {\n const idx = new RObject(prop);\n protectInc(idx, prot);\n\n const valueObj = new RObject(value);\n protectInc(valueObj, prot);\n\n const assign = new RSymbol('[[<-');\n const call = Module._Rf_lang4(assign.ptr, this.ptr, idx.ptr, valueObj.ptr);\n protectInc(call, prot);\n\n return RObject.wrap(safeEval(call, objs.baseEnv));\n } finally {\n unprotect(prot.n);\n }\n }\n\n /** @internal */\n static getMethods(obj: RObject) {\n const props = new Set<string>();\n let cur: unknown = obj;\n do {\n Object.getOwnPropertyNames(cur).map((p) => props.add(p));\n } while ((cur = Object.getPrototypeOf(cur)));\n return [...props.keys()].filter((i) => typeof obj[i as keyof typeof obj] === 'function');\n }\n}\n\nexport class RNull extends RObject {\n constructor() {\n super(new RObjectBase(Module.getValue(Module._R_NilValue, '*')));\n return this;\n }\n\n toJs(): WebRDataJsNull {\n return { type: 'null' };\n }\n}\n\nexport class RSymbol extends RObject {\n // Note that symbols don't need to be protected. This also means\n // that allocating symbols in loops with random data is probably a\n // bad idea because this leaks memory.\n constructor(x: WebRDataScalar<string>) {\n if (x instanceof RObjectBase) {\n assertRType(x, 'symbol');\n super(x);\n return;\n }\n const name = Module.allocateUTF8(x as string);\n try {\n super(new RObjectBase(Module._Rf_install(name)));\n } finally {\n Module._free(name);\n }\n }\n\n toJs(): WebRDataJsSymbol {\n const obj = this.toObject();\n return {\n type: 'symbol',\n printname: obj.printname,\n symvalue: obj.symvalue,\n internal: obj.internal,\n };\n }\n\n toObject(): {\n printname: string | null;\n symvalue: RPtr | null;\n internal: RPtr | null;\n } {\n return {\n printname: this.printname().isUnbound() ? null : this.printname().toString(),\n symvalue: this.symvalue().isUnbound() ? null : this.symvalue().ptr,\n internal: this.internal().isNull() ? null : this.internal().ptr,\n };\n }\n\n toString(): string {\n return this.printname().toString();\n }\n\n printname(): RString {\n return RString.wrap(Module._PRINTNAME(this.ptr));\n }\n symvalue(): RObject {\n return RObject.wrap(Module._SYMVALUE(this.ptr));\n }\n internal(): RObject {\n return RObject.wrap(Module._INTERNAL(this.ptr));\n }\n}\n\nexport class RPairlist extends RObject {\n constructor(val: WebRData) {\n if (val instanceof RObjectBase) {\n assertRType(val, 'pairlist');\n super(val);\n return this;\n }\n\n const prot = { n: 0 };\n\n try {\n const { names, values } = toWebRData(val);\n\n const list = RPairlist.wrap(Module._Rf_allocList(values.length));\n protectInc(list, prot);\n\n for (\n let [i, next] = [0, list as Nullable<RPairlist>];\n !next.isNull();\n [i, next] = [i + 1, next.cdr()]\n ) {\n next.setcar(new RObject(values[i]));\n }\n\n list.setNames(names);\n super(list);\n } finally {\n unprotect(prot.n);\n }\n }\n\n get length(): number {\n return this.toArray().length;\n }\n\n toArray(options: ToJsOptions = { depth: 1 }): WebRData[] {\n return this.toJs(options).values;\n }\n\n toObject({\n allowDuplicateKey = true,\n allowEmptyKey = false,\n depth = 1,\n } = {}): NamedObject<WebRData> {\n const entries = this.entries({ depth });\n const keys = entries.map(([k, v]) => k);\n if (!allowDuplicateKey && new Set(keys).size !== keys.length) {\n throw new Error('Duplicate key when converting pairlist without allowDuplicateKey enabled');\n }\n if (!allowEmptyKey && keys.some((k) => !k)) {\n throw new Error('Empty or null key when converting pairlist without allowEmptyKey enabled');\n }\n return Object.fromEntries(\n entries.filter((u, idx) => entries.findIndex((v) => v[0] === u[0]) === idx)\n );\n }\n\n entries(options: ToJsOptions = { depth: 1 }): NamedEntries<WebRData> {\n const obj = this.toJs(options);\n return obj.values.map((v, i) => [obj.names ? obj.names[i] : null, v]);\n }\n\n toJs(options: ToJsOptions = { depth: 0 }, depth = 1): WebRDataJsNode {\n const namesArray: string[] = [];\n let hasNames = false;\n const values: WebRDataJsNode['values'] = [];\n\n for (let next = this as Nullable<RPairlist>; !next.isNull(); next = next.cdr()) {\n const symbol = next.tag();\n if (symbol.isNull()) {\n namesArray.push('');\n } else {\n hasNames = true;\n namesArray.push(symbol.toString());\n }\n if (options.depth && depth >= options.depth) {\n values.push(next.car());\n } else {\n values.push(next.car().toJs(options, depth + 1));\n }\n }\n const names = hasNames ? namesArray : null;\n return { type: 'pairlist', names, values };\n }\n\n includes(name: string): boolean {\n return name in this.toObject();\n }\n\n setcar(obj: RObject): void {\n Module._SETCAR(this.ptr, obj.ptr);\n }\n\n car(): RObject {\n return RObject.wrap(Module._CAR(this.ptr));\n }\n\n cdr(): Nullable<RPairlist> {\n return RObject.wrap(Module._CDR(this.ptr)) as Nullable<RPairlist>;\n }\n\n tag(): Nullable<RSymbol> {\n return RObject.wrap(Module._TAG(this.ptr)) as Nullable<RSymbol>;\n }\n}\n\nexport class RCall extends RObject {\n constructor(val: WebRData) {\n if (val instanceof RObjectBase) {\n assertRType(val, 'call');\n super(val);\n return this;\n }\n const prot = { n: 0 };\n\n try {\n const { values } = toWebRData(val);\n const objs = values.map((value) => protectInc(new RObject(value), prot));\n const call = RCall.wrap(Module._Rf_allocVector(RTypeMap.call, values.length));\n protectInc(call, prot);\n\n for (\n let [i, next] = [0, call as Nullable<RPairlist>];\n !next.isNull();\n [i, next] = [i + 1, next.cdr()]\n ) {\n next.setcar(objs[i]);\n }\n super(call);\n } finally {\n unprotect(prot.n);\n }\n }\n\n setcar(obj: RObject): void {\n Module._SETCAR(this.ptr, obj.ptr);\n }\n\n car(): RObject {\n return RObject.wrap(Module._CAR(this.ptr));\n }\n\n cdr(): Nullable<RPairlist> {\n return RObject.wrap(Module._CDR(this.ptr)) as Nullable<RPairlist>;\n }\n\n eval(): RObject {\n return RObject.wrap(safeEval(this.ptr, objs.baseEnv));\n }\n}\n\nexport class RList extends RObject {\n constructor(val: WebRData) {\n if (val instanceof RObjectBase) {\n assertRType(val, 'list');\n super(val);\n return this;\n }\n\n const prot = { n: 0 };\n\n try {\n const { names, values } = toWebRData(val);\n const ptr = Module._Rf_allocVector(RTypeMap.list, values.length);\n protectInc(ptr, prot);\n\n values.forEach((v, i) => {\n Module._SET_VECTOR_ELT(ptr, i, new RObject(v).ptr);\n });\n\n RObject.wrap(ptr).setNames(names);\n\n super(new RObjectBase(ptr));\n } finally {\n unprotect(prot.n);\n }\n }\n\n get length(): number {\n return Module._LENGTH(this.ptr);\n }\n\n toArray(options: { depth: number } = { depth: 1 }): WebRData[] {\n return this.toJs(options).values;\n }\n\n toObject({\n allowDuplicateKey = true,\n allowEmptyKey = false,\n depth = 1,\n } = {}): NamedObject<WebRData> {\n const entries = this.entries({ depth });\n const keys = entries.map(([k, v]) => k);\n if (!allowDuplicateKey && new Set(keys).size !== keys.length) {\n throw new Error('Duplicate key when converting list without allowDuplicateKey enabled');\n }\n if (!allowEmptyKey && keys.some((k) => !k)) {\n throw new Error('Empty or null key when converting list without allowEmptyKey enabled');\n }\n return Object.fromEntries(\n entries.filter((u, idx) => entries.findIndex((v) => v[0] === u[0]) === idx)\n );\n }\n\n entries(options: { depth: number } = { depth: 1 }): NamedEntries<WebRData> {\n const obj = this.toJs(options);\n return obj.values.map((v, i) => [obj.names ? obj.names[i] : null, v]);\n }\n\n toJs(options: { depth: number } = { depth: 0 }, depth = 1): WebRDataJsNode {\n return {\n type: 'list',\n names: this.names(),\n values: [...Array(this.length).keys()].map((i) => {\n if (options.depth && depth >= options.depth) {\n return this.get(i + 1);\n } else {\n return this.get(i + 1).toJs(options, depth + 1);\n }\n }),\n };\n }\n}\n\nexport class RFunction extends RObject {\n exec(...args: (WebRDataRaw | RObject)[]): RObject {\n const prot = { n: 0 };\n\n try {\n const call = new RCall([this, ...args]);\n protectInc(call, prot);\n return call.eval();\n } finally {\n unprotect(prot.n);\n }\n }\n}\n\nexport class RString extends RObject {\n // Unlike symbols, strings are not cached and must thus be protected\n constructor(x: WebRDataScalar<string>) {\n if (x instanceof RObjectBase) {\n assertRType(x, 'string');\n super(x);\n return;\n }\n\n const name = Module.allocateUTF8(x as string);\n\n try {\n super(new RObjectBase(Module._Rf_mkChar(name)));\n } finally {\n Module._free(name);\n }\n }\n\n toString(): string {\n return Module.UTF8ToString(Module._R_CHAR(this.ptr));\n }\n\n toJs(): WebRDataJsString {\n return {\n type: 'string',\n value: this.toString(),\n };\n }\n}\n\nexport class REnvironment extends RObject {\n constructor(val: WebRData = {}) {\n if (val instanceof RObjectBase) {\n assertRType(val, 'environment');\n super(val);\n return this;\n }\n let nProt = 0;\n\n try {\n const { names, values } = toWebRData(val);\n\n const ptr = protect(Module._R_NewEnv(objs.globalEnv.ptr, 0, 0));\n ++nProt;\n\n values.forEach((v, i) => {\n const name = names ? names[i] : null;\n if (!name) {\n throw new Error(\"Can't create object in new environment with empty symbol name\");\n }\n\n const sym = new RSymbol(name);\n const vObj = protect(new RObject(v));\n try {\n envPoke(ptr, sym, vObj);\n } finally {\n unprotect(1);\n }\n });\n\n super(new RObjectBase(ptr));\n } finally {\n unprotect(nProt);\n }\n }\n\n ls(all = false, sorted = true): string[] {\n const ls = RCharacter.wrap(Module._R_lsInternal3(this.ptr, Number(all), Number(sorted)));\n return ls.toArray() as string[];\n }\n\n bind(name: string, value: WebRData): void {\n const sym = new RSymbol(name);\n const valueObj = protect(new RObject(value));\n\n try {\n envPoke(this, sym, valueObj);\n } finally {\n unprotect(1);\n }\n }\n\n names(): string[] {\n return this.ls(true, true);\n }\n\n frame(): RObject {\n return RObject.wrap(Module._FRAME(this.ptr));\n }\n\n subset(prop: number | string): RObject {\n if (typeof prop === 'number') {\n throw new Error('Object of type environment is not subsettable');\n }\n return this.getDollar(prop);\n }\n\n toObject({ depth = 0 } = {}): NamedObject<WebRData> {\n const symbols = this.names();\n return Object.fromEntries(\n [...Array(symbols.length).keys()].map((i) => {\n return [symbols[i], this.getDollar(symbols[i]).toJs({ depth })];\n })\n );\n }\n\n toJs(options: { depth: number } = { depth: 0 }, depth = 1): WebRDataJsNode {\n const names = this.names();\n const values = [...Array(names.length).keys()].map((i) => {\n if (options.depth && depth >= options.depth) {\n return this.getDollar(names[i]);\n } else {\n return this.getDollar(names[i]).toJs(options, depth + 1);\n }\n });\n\n return {\n type: 'environment',\n names,\n values,\n };\n }\n}\n\ntype TypedArray =\n | Int8Array\n | Uint8Array\n | Int16Array\n | Uint16Array\n | Int32Array\n | Uint32Array\n | Float32Array\n | Float64Array;\n\nexport type atomicType = number | boolean | Complex | string;\n\nabstract class RVectorAtomic<T extends atomicType> extends RObject {\n constructor(\n val: WebRDataAtomic<T>,\n kind: RType,\n newSetter: (ptr: RPtr) => (v: any, i: number) => void\n ) {\n if (val instanceof RObjectBase) {\n assertRType(val, kind);\n super(val);\n return this;\n }\n\n const prot = { n: 0 };\n\n try {\n const { names, values } = toWebRData(val);\n\n const ptr = Module._Rf_allocVector(RTypeMap[kind], values.length);\n protectInc(ptr, prot);\n\n values.forEach(newSetter(ptr));\n RObject.wrap(ptr).setNames(names);\n\n super(new RObjectBase(ptr));\n } finally {\n unprotect(prot.n);\n }\n }\n\n get length(): number {\n return Module._LENGTH(this.ptr);\n }\n\n get(prop: number | string): this {\n return super.get(prop) as this;\n }\n\n subset(prop: number | string): this {\n return super.subset(prop) as this;\n }\n\n getDollar(prop: string): RObject {\n throw new Error('$ operator is invalid for atomic vectors');\n }\n\n detectMissing(): boolean[] {\n const prot = { n: 0 };\n\n try {\n const call = Module._Rf_lang2(new RSymbol('is.na').ptr, this.ptr);\n protectInc(call, prot);\n\n const val = RLogical.wrap(safeEval(call, objs.baseEnv));\n protectInc(val, prot);\n\n const ret = val.toTypedArray();\n return Array.from(ret).map((elt) => Boolean(elt));\n } finally {\n unprotect(prot.n);\n }\n }\n\n abstract toTypedArray(): TypedArray;\n\n toArray(): (T | null)[] {\n const arr = this.toTypedArray();\n return this.detectMissing().map((m, idx) => (m ? null : (arr[idx] as T)));\n }\n\n toObject({ allowDuplicateKey = true, allowEmptyKey = false } = {}): NamedObject<T | null> {\n const entries = this.entries();\n const keys = entries.map(([k, v]) => k);\n if (!allowDuplicateKey && new Set(keys).size !== keys.length) {\n throw new Error(\n 'Duplicate key when converting atomic vector without allowDuplicateKey enabled'\n );\n }\n if (!allowEmptyKey && keys.some((k) => !k)) {\n throw new Error(\n 'Empty or null key when converting atomic vector without allowEmptyKey enabled'\n );\n }\n return Object.fromEntries(\n entries.filter((u, idx) => entries.findIndex((v) => v[0] === u[0]) === idx)\n );\n }\n\n entries(): NamedEntries<T | null> {\n const values = this.toArray();\n const names = this.names();\n return values.map((v, i) => [names ? names[i] : null, v]);\n }\n\n toJs(): WebRDataJsAtomic<T> {\n return {\n type: this.type() as 'logical' | 'integer' | 'double' | 'complex' | 'character' | 'raw',\n names: this.names(),\n values: this.toArray(),\n };\n }\n}\n\nexport class RLogical extends RVectorAtomic<boolean> {\n constructor(val: WebRDataAtomic<boolean>) {\n super(val, 'logical', RLogical.#newSetter);\n }\n\n static #newSetter = (ptr: RPtr) => {\n const data = Module._LOGICAL(ptr);\n const naLogical = Module.getValue(Module._R_NaInt, 'i32');\n return (v: null | boolean, i: number) => {\n Module.setValue(data + 4 * i, v === null ? naLogical : Boolean(v), 'i32');\n };\n };\n\n getBoolean(idx: number): boolean | null {\n return this.get(idx).toArray()[0];\n }\n\n toBoolean(): boolean {\n if (this.length !== 1) {\n throw new Error(\"Can't convert atomic vector of length > 1 to a scalar JS value\");\n }\n const val = this.getBoolean(1);\n if (val === null) {\n throw new Error(\"Can't convert missing value `NA` to a JS boolean\");\n }\n return val;\n }\n\n toTypedArray(): Int32Array {\n return new Int32Array(\n Module.HEAP32.subarray(\n Module._LOGICAL(this.ptr) / 4,\n Module._LOGICAL(this.ptr) / 4 + this.length\n )\n );\n }\n\n toArray(): (boolean | null)[] {\n const arr = this.toTypedArray();\n return this.detectMissing().map((m, idx) => (m ? null : Boolean(arr[idx])));\n }\n}\n\nexport class RInteger extends RVectorAtomic<number> {\n constructor(val: WebRDataAtomic<number>) {\n super(val, 'integer', RInteger.#newSetter);\n }\n\n static #newSetter = (ptr: RPtr) => {\n const data = Module._INTEGER(ptr);\n const naInteger = Module.getValue(Module._R_NaInt, 'i32');\n\n return (v: null | number, i: number) => {\n Module.setValue(data + 4 * i, v === null ? naInteger : Math.round(Number(v)), 'i32');\n };\n };\n\n getNumber(idx: number): number | null {\n return this.get(idx).toArray()[0];\n }\n\n toNumber(): number {\n if (this.length !== 1) {\n throw new Error(\"Can't convert atomic vector of length > 1 to a scalar JS value\");\n }\n const val = this.getNumber(1);\n if (val === null) {\n throw new Error(\"Can't convert missing value `NA` to a JS number\");\n }\n return val;\n }\n\n toTypedArray(): Int32Array {\n return new Int32Array(\n Module.HEAP32.subarray(\n Module._INTEGER(this.ptr) / 4,\n Module._INTEGER(this.ptr) / 4 + this.length\n )\n );\n }\n}\n\nexport class RDouble extends RVectorAtomic<number> {\n constructor(val: WebRDataAtomic<number>) {\n super(val, 'double', RDouble.#newSetter);\n }\n\n static #newSetter = (ptr: RPtr) => {\n const data = Module._REAL(ptr);\n const naDouble = Module.getValue(Module._R_NaReal, 'double');\n\n return (v: null | number, i: number) => {\n Module.setValue(data + 8 * i, v === null ? naDouble : v, 'double');\n };\n };\n\n getNumber(idx: number): number | null {\n return this.get(idx).toArray()[0];\n }\n\n toNumber(): number {\n if (this.length !== 1) {\n throw new Error(\"Can't convert atomic vector of length > 1 to a scalar JS value\");\n }\n const val = this.getNumber(1);\n if (val === null) {\n throw new Error(\"Can't convert missing value `NA` to a JS number\");\n }\n return val;\n }\n\n toTypedArray(): Float64Array {\n return new Float64Array(\n Module.HEAPF64.subarray(Module._REAL(this.ptr) / 8, Module._REAL(this.ptr) / 8 + this.length)\n );\n }\n}\n\nexport class RComplex extends RVectorAtomic<Complex> {\n constructor(val: WebRDataAtomic<Complex>) {\n super(val, 'complex', RComplex.#newSetter);\n }\n\n static #newSetter = (ptr: RPtr) => {\n const data = Module._COMPLEX(ptr);\n const naDouble = Module.getValue(Module._R_NaReal, 'double');\n\n return (v: null | Complex, i: number) => {\n Module.setValue(data + 8 * (2 * i), v === null ? naDouble : v.re, 'double');\n Module.setValue(data + 8 * (2 * i + 1), v === null ? naDouble : v.im, 'double');\n };\n };\n\n getComplex(idx: number): Complex | null {\n return this.get(idx).toArray()[0];\n }\n\n toComplex(): Complex {\n if (this.length !== 1) {\n throw new Error(\"Can't convert atomic vector of length > 1 to a scalar JS value\");\n }\n const val = this.getComplex(1);\n if (val === null) {\n throw new Error(\"Can't convert missing value `NA` to a JS object\");\n }\n return val;\n }\n\n toTypedArray(): Float64Array {\n return new Float64Array(\n Module.HEAPF64.subarray(\n Module._COMPLEX(this.ptr) / 8,\n Module._COMPLEX(this.ptr) / 8 + 2 * this.length\n )\n );\n }\n\n toArray(): (Complex | null)[] {\n const arr = this.toTypedArray();\n return this.detectMissing().map((m, idx) =>\n m ? null : { re: arr[2 * idx], im: arr[2 * idx + 1] }\n );\n }\n}\n\nexport class RCharacter extends RVectorAtomic<string> {\n constructor(val: WebRDataAtomic<string>) {\n super(val, 'character', RCharacter.#newSetter);\n }\n\n static #newSetter = (ptr: RPtr) => {\n return (v: null | string, i: number) => {\n if (v === null) {\n Module._SET_STRING_ELT(ptr, i, objs.naString.ptr);\n } else {\n Module._SET_STRING_ELT(ptr, i, new RString(v).ptr);\n }\n };\n };\n\n getString(idx: number): string | null {\n return this.get(idx).toArray()[0];\n }\n\n toString(): string {\n if (this.length !== 1) {\n throw new Error(\"Can't convert atomic vector of length > 1 to a scalar JS value\");\n }\n const val = this.getString(1);\n if (val === null) {\n throw new Error(\"Can't convert missing value `NA` to a JS string\");\n }\n return val;\n }\n\n toTypedArray(): Uint32Array {\n return new Uint32Array(\n Module.HEAPU32.subarray(\n Module._STRING_PTR(this.ptr) / 4,\n Module._STRING_PTR(this.ptr) / 4 + this.length\n )\n );\n }\n\n toArray(): (string | null)[] {\n return this.detectMissing().map((m, idx) =>\n m ? null : Module.UTF8ToString(Module._R_CHAR(Module._STRING_ELT(this.ptr, idx)))\n );\n }\n}\n\nexport class RRaw extends RVectorAtomic<number> {\n constructor(val: WebRDataAtomic<number>) {\n super(val, 'raw', RRaw.#newSetter);\n }\n\n static #newSetter = (ptr: RPtr) => {\n const data = Module._RAW(ptr);\n\n return (v: number, i: number) => {\n Module.setValue(data + i, Number(v), 'i8');\n };\n };\n\n getNumber(idx: number): number | null {\n return this.get(idx).toArray()[0];\n }\n\n toNumber(): number {\n if (this.length !== 1) {\n throw new Error(\"Can't convert atomic vector of length > 1 to a scalar JS value\");\n }\n const val = this.getNumber(1);\n if (val === null) {\n throw new Error(\"Can't convert missing value `NA` to a JS number\");\n }\n return val;\n }\n\n toTypedArray(): Uint8Array {\n return new Uint8Array(\n Module.HEAPU8.subarray(Module._RAW(this.ptr), Module._RAW(this.ptr) + this.length)\n );\n }\n}\n\n/*\n * Convert the various types possible in the type union WebRData into\n * consistently typed arrays of names and values.\n */\nfunction toWebRData<T>(jsObj: WebRDataAtomic<T>): {\n names: (string | null)[] | null;\n values: (T | null)[];\n};\nfunction toWebRData(jsObj: WebRData): WebRData;\nfunction toWebRData(jsObj: WebRData): WebRData {\n if (isWebRDataJs(jsObj)) {\n return jsObj;\n } else if (Array.isArray(jsObj)) {\n return { names: null, values: jsObj };\n } else if (jsObj && typeof jsObj === 'object' && !isComplex(jsObj)) {\n return {\n names: Object.keys(jsObj),\n values: Object.values(jsObj),\n };\n }\n return { names: null, values: [jsObj] };\n}\n\nexport function getRWorkerClass(type: RTypeNumber): typeof RObject {\n const typeClasses: { [key: number]: typeof RObject } = {\n [RTypeMap.null]: RNull,\n [RTypeMap.symbol]: RSymbol,\n [RTypeMap.pairlist]: RPairlist,\n [RTypeMap.closure]: RFunction,\n [RTypeMap.environment]: REnvironment,\n [RTypeMap.call]: RCall,\n [RTypeMap.special]: RFunction,\n [RTypeMap.builtin]: RFunction,\n [RTypeMap.string]: RString,\n [RTypeMap.logical]: RLogical,\n [RTypeMap.integer]: RInteger,\n [RTypeMap.double]: RDouble,\n [RTypeMap.complex]: RComplex,\n [RTypeMap.character]: RCharacter,\n [RTypeMap.list]: RList,\n [RTypeMap.raw]: RRaw,\n [RTypeMap.function]: RFunction,\n };\n if (type in typeClasses) {\n return typeClasses[type];\n }\n return RObject;\n}\n\n/**\n * Test for an RWorker.RObject instance.\n *\n * RWorker.RObject is the internal interface to R objects, intended to be used\n * on the worker thread.\n *\n * @private\n * @param {any} value The object to test.\n * @return {boolean} True if the object is an instance of an RObject.\n */\nexport function isRObject(value: any): value is RObject {\n return value instanceof RObject;\n}\n\n/**\n * A store for persistent R objects, initialised at R startup.\n */\nexport let objs: {\n baseEnv: REnvironment,\n bracket2Symbol: RSymbol,\n bracketSymbol: RSymbol,\n dollarSymbol: RSymbol,\n emptyEnv: REnvironment,\n false: RLogical,\n globalEnv: REnvironment,\n na: RLogical,\n namesSymbol: RSymbol,\n naString: RObject,\n null: RNull,\n true: RLogical,\n unboundValue: RObject,\n};\n\n/**\n * Populate the persistent R object store.\n * @internal\n */\nexport function initPersistentObjects(){\n objs = {\n baseEnv: REnvironment.wrap(Module.getValue(Module._R_BaseEnv, '*')),\n bracket2Symbol: RSymbol.wrap(Module.getValue(Module._R_Bracket2Symbol, '*')),\n bracketSymbol: RSymbol.wrap(Module.getValue(Module._R_BracketSymbol, '*')),\n dollarSymbol: RSymbol.wrap(Module.getValue(Module._R_DollarSymbol, '*')),\n emptyEnv: REnvironment.wrap(Module.getValue(Module._R_EmptyEnv, '*')),\n false: RLogical.wrap(Module.getValue(Module._R_FalseValue, '*')),\n globalEnv: REnvironment.wrap(Module.getValue(Module._R_GlobalEnv, '*')),\n na: RLogical.wrap(Module.getValue(Module._R_LogicalNAValue, '*')),\n namesSymbol: RSymbol.wrap(Module.getValue(Module._R_NamesSymbol, '*')),\n naString: RObject.wrap(Module.getValue(Module._R_NaString, '*')),\n null: RNull.wrap(Module.getValue(Module._R_NilValue, '*')),\n true: RLogical.wrap(Module.getValue(Module._R_TrueValue, '*')),\n unboundValue: RObject.wrap(Module.getValue(Module._R_UnboundValue, '*')),\n };\n}\n", "/**\n * Proxy R objects on the webR worker thread so that they can be accessed from\n * the main thread.\n * @module Proxy\n */\nimport { ChannelMain } from './chan/channel';\nimport { replaceInObject } from './utils';\nimport { isWebRPayloadPtr, WebRPayloadPtr, WebRPayload } from './payload';\nimport { RType, WebRData, WebRDataRaw } from './robj';\nimport { isRObject, RObject, isRFunction } from './robj-main';\nimport * as RWorker from './robj-worker';\nimport { ShelterID, CallRObjectMethodMessage, NewRObjectMessage } from './webr-chan';\n\n/**\n * Obtain a union of the keys corresponding to methods of a given class `T`.\n * @typeParam T The type to provide the methods for.\n */\nexport type Methods<T> = {\n [P in keyof T]: T[P] extends (...args: any) => any ? P : never;\n}[keyof T];\n\n/**\n * Distributive conditional type for {@link RProxy}.\n *\n * Distributes {@link RProxy} over any {@link RWorker.RObject} in the given\n * union type U.\n *\n * @typeParam U The type union to distribute {@link RProxy} over.\n */\nexport type DistProxy<U> = U extends RWorker.RObject ? RProxy<U> : U;\n\n/**\n * Convert {@link RWorker.RObject} properties for use with an {@link RProxy}.\n *\n * Properties in the type parameter `T` are mapped so that {@link RProxy} is\n * distributed over any {@link RWorker.RObject} types, then wrapped in a\n * Promise.\n *\n * Function signatures are mapped so that arguments with {@link RWorker.RObject}\n * type instead take {@link RProxy}<{@link RWorker.RObject}> type. Other\n * function arguments remain as they are. The function return type is also\n * converted to a corresponding type using `RProxify` recursively.\n *\n * @typeParam T The type to convert.\n */\nexport type RProxify<T> = T extends Array<any>\n ? Promise<DistProxy<T[0]>[]>\n : T extends (...args: infer U) => any\n ? (\n ...args: {\n [V in keyof U]: DistProxy<U[V]>;\n }\n ) => RProxify<ReturnType<T>>\n : Promise<DistProxy<T>>;\n\n/**\n * Create an {@link RProxy} based on an {@link RWorker.RObject} type parameter.\n *\n * R objects created via an {@link RProxy} are intended to be used in place of\n * {@link RWorker.RObject} on the main thread. An {@link RProxy} object has the\n * same instance methods as the given {@link RWorker.RObject} parameter, with\n * the following differences:\n * * Method arguments take `RProxy` in place of {@link RWorker.RObject}.\n *\n * * Where an {@link RWorker.RObject} would be returned, an `RProxy` is\n * returned instead.\n *\n * * All return types are wrapped in a Promise.\n *\n * If required, the {@link Payload.WebRPayloadPtr} object associated with the\n * proxy can be accessed directly through the `_payload` property.\n *\n * @typeParam T The {@link RWorker.RObject} type to convert into `RProxy` type.\n */\nexport type RProxy<T extends RWorker.RObject> = { [P in Methods<T>]: RProxify<T[P]> } & {\n _payload: WebRPayloadPtr;\n [Symbol.asyncIterator](): AsyncGenerator<RProxy<RWorker.RObject>, void, unknown>;\n};\n\n/**\n * Create a proxy constructor based on a {@link RWorker.RObject} class.\n *\n * The class constructors and static methods of the given subclass of\n * {@link RWorker.RObject} are proxied, and the proxied constructor returns a\n * promise to an R object of a given {@link RProxy} type.\n *\n * @typeParam T The type of the {@link RWorker.RObject} class to be proxied.\n * @typeParam R The type to be returned from the proxied class constructor.\n */\nexport type ProxyConstructor<T,R> = (T extends abstract new (...args: infer U) => any\n ? {\n new (\n ...args: {\n [V in keyof U]: U[V];\n }\n ): Promise<R>;\n }\n : never) & {\n [P in Methods<typeof RWorker.RObject>]: RProxify<(typeof RWorker.RObject)[P]>;\n };\n\n/* The empty function is used as base when we are proxying RFunction objects.\n * This enables function call semantics on the proxy using the apply hook.\n */\nfunction empty() {}\n\n/* Proxy the asyncIterator property for R objects with a length. This allows us\n * to use the `for await (i of obj){}` JavaScript syntax.\n */\nfunction targetAsyncIterator(chan: ChannelMain, proxy: RProxy<RWorker.RObject>) {\n return async function* () {\n // Get the R object's length\n const msg: CallRObjectMethodMessage = {\n type: 'callRObjectMethod',\n data: {\n payload: proxy._payload,\n prop: 'getPropertyValue',\n args: [{ payloadType: 'raw', obj: 'length' }],\n shelter: undefined, // TODO\n },\n };\n const reply = await chan.request(msg);\n\n // Throw an error if there was some problem accessing the object length\n if (typeof reply.obj !== 'number') {\n throw new Error('Cannot iterate over object, unexpected type for length property.');\n }\n\n // Loop through the object and yield values\n for (let i = 1; i <= reply.obj; i++) {\n yield proxy.get(i);\n }\n };\n}\n\n/**\n * Proxy an R object method by providing an async function that requests that\n * the worker thread calls the method and then returns the result.\n *\n * When the optional payload argument has not been provided, an\n * {@link RWorker.RObject} static method is called.\n * @internal\n */\nexport function targetMethod(chan: ChannelMain, prop: string): any;\nexport function targetMethod(chan: ChannelMain, prop: string, payload: WebRPayloadPtr): any;\nexport function targetMethod(chan: ChannelMain, prop: string, payload?: WebRPayloadPtr): any {\n return async (..._args: WebRData[]) => {\n const args = _args.map((arg) => {\n if (isRObject(arg)) {\n return arg._payload;\n }\n return {\n obj: replaceInObject(arg, isRObject, (obj: RObject) => obj._payload),\n payloadType: 'raw',\n } as WebRPayload;\n });\n\n const msg: CallRObjectMethodMessage = {\n type: 'callRObjectMethod',\n data: { payload, prop, args: args },\n };\n const reply = await chan.request(msg);\n\n switch (reply.payloadType) {\n case 'ptr':\n return newRProxy(chan, reply);\n case 'raw': {\n const proxyReply = replaceInObject(\n reply,\n isWebRPayloadPtr,\n (obj: WebRPayloadPtr, chan: ChannelMain) => newRProxy(chan, obj),\n chan\n ) as WebRPayload;\n return proxyReply.obj;\n }\n }\n };\n}\n\n/* Proxy the `RWorker` class constructors. This allows us to create a new R\n * object on the worker thread from a given JS object.\n */\nasync function newRObject(\n chan: ChannelMain,\n objType: RType | 'object',\n shelter: ShelterID,\n value: WebRData\n) {\n const msg: NewRObjectMessage = {\n type: 'newRObject',\n data: {\n objType,\n obj: replaceInObject(value, isRObject, (obj: RObject) => obj._payload),\n shelter: shelter,\n },\n };\n const payload = await chan.request(msg);\n switch (payload.payloadType) {\n case 'raw':\n throw new Error('Unexpected raw payload type returned from newRObject');\n case 'ptr':\n return newRProxy(chan, payload);\n }\n}\n\n/**\n * Proxy an R object.\n *\n * The proxy targets a particular R object in WebAssembly memory. Methods of the\n * relevant subclass of {@link RWorker.RObject} are proxied, enabling\n * structured manipulation of R objects from the main thread.\n *\n * @param {ChannelMain} chan The current main thread communication channel.\n * @param {WebRPayloadPtr} payload A webR payload referencing an R object.\n * @returns {RProxy<RWorker.RObject>} An {@link RObject} corresponding to the\n * referenced R object.\n */\nexport function newRProxy(chan: ChannelMain, payload: WebRPayloadPtr): RProxy<RWorker.RObject> {\n const proxy = new Proxy(\n // Assume we are proxying an RFunction if the methods list contains 'exec'.\n payload.obj.methods?.includes('exec') ? Object.assign(empty, { ...payload }) : payload,\n {\n get: (_: WebRPayload, prop: string | number | symbol) => {\n if (prop === '_payload') {\n return payload;\n } else if (prop === Symbol.asyncIterator) {\n return targetAsyncIterator(chan, proxy);\n } else if (payload.obj.methods?.includes(prop.toString())) {\n return targetMethod(chan, prop.toString(), payload);\n }\n },\n apply: async (_: WebRPayload, _thisArg, args: (WebRDataRaw | RProxy<RWorker.RObject>)[]) => {\n const res = await (newRProxy(chan, payload) as RProxy<RWorker.RFunction>).exec(...args);\n return isRFunction(res) ? res : res.toJs();\n },\n }\n ) as unknown as RProxy<RWorker.RObject>;\n return proxy;\n}\n\n/**\n * Proxy an {@link RWorker.RObject} class.\n *\n * @param {ChannelMain} chan The current main thread communication channel.\n * @param {ShelterID} shelter The shelter ID to protect returned objects with.\n * @param {(RType | 'object')} objType The R object type, or `'object'` for the\n * generic {@link RWorker.RObject} class.\n * @returns {ProxyConstructor} A proxy to the R object subclass corresponding to\n * the given value of the `objType` argument.\n * @typeParam T The type of the {@link RWorker.RObject} class to be proxied.\n * @typeParam R The type to be returned from the proxied class constructor.\n */\nexport function newRClassProxy<T, R>(\n chan: ChannelMain,\n shelter: ShelterID,\n objType: RType | 'object'\n) {\n return new Proxy(RWorker.RObject, {\n construct: (_, args: [WebRData]) => newRObject(chan, objType, shelter, ...args),\n get: (_, prop: string | number | symbol) => {\n return targetMethod(chan, prop.toString());\n },\n }) as unknown as ProxyConstructor<T,R>;\n}\n", "import { IN_NODE } from '../webR/compat';\nimport { WebR, WebROptions } from '../webR/webr-main';\n\nexport interface ConsoleCallbacks {\n stdout?: (line: string) => void;\n stderr?: (line: string) => void;\n prompt?: (line: string) => void;\n canvasExec?: (line: string) => void;\n}\n\n/**\n * Text-based Interactive Console for WebR\n *\n * A helper application to assist in creating an interactive R REPL based on\n * JavaScript callbacks.\n *\n * Callback functions ``stdout`` and ``stderr`` are called with a single line\n * of output as the first argument. The default implementation of `stdout` and\n * `stderr` writes to the console using `console.log` and `console.error`.\n *\n * R code can be sent as input by calling the ``stdin`` method with a single\n * line of textual input.\n *\n * A long running R computation can be interrupted by calling the `interrupt`\n * method.\n *\n * The ``prompt`` callback function is called when webR produces a prompt at\n * the REPL console and is therefore awaiting user input. The prompt character\n * (usually ``>`` or ``+``) is given as the first argument to the callback\n * function. The default implementation of `prompt` shows a JavaScript prompt\n * asking the user for input, and then sends the user input to `stdin`.\n *\n * The ``canvasExec`` callback function is called when webR writes plots to\n * the built-in HTML canvas graphics device.\n *\n * Once constructed, start the Console using the ``run`` method. The `run`\n * method starts an asynchronous infinite loop that waits for output from the\n * webR worker and then calls the relevant callbacks.\n */\nexport class Console {\n /** The supporting instance of webR */\n webR: WebR;\n /**\n * A HTML canvas element\n *\n * The canvas graphics device writes to this element by default. Undefined\n * when HTML canvas is unsupported.\n */\n canvas: HTMLCanvasElement | undefined;\n /** Called when webR outputs to ``stdout`` */\n #stdout: (line: string) => void;\n /** Called when webR outputs to ``stderr`` */\n #stderr: (line: string) => void;\n /** Called when webR prompts for input */\n #prompt: (line: string) => void;\n /** Called when webR writes to the HTML canvas element */\n #canvasExec: (line: string) => void;\n\n /**\n * @param {ConsoleCallbacks} callbacks A list of webR Console callbacks to\n * be used for this console.\n * @param {WebROptions} options The options to use for the new instance of\n * webR started to support this console.\n */\n constructor(\n callbacks: ConsoleCallbacks = {},\n options: WebROptions = {\n REnv: {\n R_HOME: '/usr/lib/R',\n R_ENABLE_JIT: '0',\n R_DEFAULT_DEVICE: 'canvas',\n },\n }\n ) {\n this.webR = new WebR(options);\n if (!IN_NODE) {\n this.canvas = document.createElement('canvas');\n this.canvas.setAttribute('width', '1008');\n this.canvas.setAttribute('height', '1008');\n }\n this.#stdout = callbacks.stdout || this.#defaultStdout;\n this.#stderr = callbacks.stderr || this.#defaultStderr;\n this.#prompt = callbacks.prompt || this.#defaultPrompt;\n this.#canvasExec = callbacks.canvasExec || this.#defaultCanvasExec;\n }\n\n /**\n * Write a line of input to webR's REPL through ``stdin``\n * @param {string} input A line of input text.\n */\n stdin(input: string) {\n this.webR.writeConsole(input);\n }\n\n /**\n * Interrupt a long running R computation and return to the prompt\n */\n interrupt() {\n this.webR.interrupt();\n }\n\n /**\n * The default function called when webR outputs to ``stdout``\n * @param {string} text The line sent to stdout by webR.\n */\n #defaultStdout = (text: string) => {\n console.log(text);\n };\n\n /**\n * The default function called when webR outputs to ``stderr``\n * @param {string} text The line sent to stderr by webR.\n */\n #defaultStderr = (text: string) => {\n console.error(text);\n };\n\n /**\n * The default function called when webR writes out a prompt\n * @param {string} text The text content of the prompt.\n */\n #defaultPrompt = (text: string) => {\n const input = prompt(text);\n if (input) this.stdin(`${input}\\n`);\n };\n\n /**\n * The default function called when webR writes to HTML canvas\n * @param {string} exec The canvas API command as a text string.\n */\n #defaultCanvasExec = (exec: string) => {\n if (IN_NODE) {\n throw new Error('Plotting with HTML canvas is not yet supported under Node');\n }\n Function(`this.getContext('2d').${exec}`).bind(this.canvas)();\n };\n\n /**\n * Start the webR console\n */\n run() {\n this.#run();\n }\n\n /*\n * Start the asynchronous infinite loop\n *\n * This loop waits for output from webR and dispatches callbacks based on the\n * message recieved.\n *\n * The promise returned by this asynchronous function never resolves.\n */\n async #run() {\n for (;;) {\n const output = await this.webR.read();\n switch (output.type) {\n case 'stdout':\n this.#stdout(output.data as string);\n break;\n case 'stderr':\n this.#stderr(output.data as string);\n break;\n case 'prompt':\n this.#prompt(output.data as string);\n break;\n case 'canvasExec':\n this.#canvasExec(output.data as string);\n break;\n default:\n console.warn(`Unhandled output type for webR Console: ${output.type}.`);\n }\n }\n }\n}\n", "/**\n * The webR JavaScript API.\n * @module WebR\n */\n\nimport { ChannelMain } from './chan/channel';\nimport { newChannelMain, ChannelType } from './chan/channel-common';\nimport { Message } from './chan/message';\nimport { BASE_URL, PKG_BASE_URL } from './config';\nimport { WebRPayloadPtr } from './payload';\nimport { newRProxy, newRClassProxy } from './proxy';\nimport { isRObject, RCharacter, RComplex, RDouble } from './robj-main';\nimport { REnvironment, RSymbol, RInteger } from './robj-main';\nimport { RList, RLogical, RNull, RObject, RPairlist, RRaw, RString, RCall } from './robj-main';\nimport { replaceInObject } from './utils';\nimport * as RWorker from './robj-worker';\n\nimport {\n CaptureRMessage,\n EvalRMessage,\n EvalRMessageOutputType,\n EvalRMessageRaw,\n EvalROptions,\n FSMessage,\n FSReadFileMessage,\n FSWriteFileMessage,\n NewShelterMessage,\n ShelterDestroyMessage,\n ShelterMessage,\n} from './webr-chan';\n\nexport { Console, ConsoleCallbacks } from '../console/console';\n\n/**\n * The webR FS API for interacting with the Emscripten Virtual File System.\n */\nexport interface WebRFS {\n /**\n * Lookup information about a file or directory node in the Emscripten\n * virtual file system.\n * @param {string} path Path to the requested node.\n * @returns {Promise<FSNode>} The requested node.\n */\n lookupPath: (path: string) => Promise<FSNode>;\n /**\n * Create a directory on the Emscripten virtual file system.\n * @param {string} path Path of the directory to create.\n * @returns {Promise<FSNode>} The newly created directory node.\n */\n mkdir: (path: string) => Promise<FSNode>;\n /**\n * Get the content of a file on the Emscripten virtual file system.\n * @param {string} path Path of the file to read.\n * @param {string} [flags] Open the file with the specified flags.\n * @returns {Promise<Uint8Array>} The content of the requested file.\n */\n readFile: (path: string, flags?: string) => Promise<Uint8Array>;\n /**\n * Remove a directory on the Emscripten virtual file system.\n * @param {string} path Path of the directory to remove.\n */\n rmdir: (path: string) => Promise<void>;\n /**\n * Write a new file to the Emscripten virtual file system.\n * @param {string} path Path of the new file.\n * @param {Uint8Array} data The content of the new file.\n * @param {string} [flags] Open the file with the specified flags.\n */\n writeFile: (path: string, data: ArrayBufferView, flags?: string) => Promise<void>;\n /**\n * Unlink a node on the Emscripten virtual file system. If that node was the\n * last link to a file it is is deleted.\n * @param {string} path Path of the target node.\n */\n unlink: (path: string) => Promise<void>;\n}\n\n/** A filesystem entry in the Emscripten Virtual File System */\nexport type FSNode = {\n id: number;\n name: string;\n mode: number;\n isFolder: boolean;\n contents: { [key: string]: FSNode };\n};\n\n/**\n * The configuration settings to be used when starting webR.\n */\nexport interface WebROptions {\n /**\n * Command line arguments to be passed to R.\n * Default: `[]`.\n */\n RArgs?: string[];\n\n /**\n * Environment variables to be made available for the R process.\n * Default: `{ R_HOME: '/usr/lib/R', R_ENABLE_JIT: 0 }`.\n */\n REnv?: { [key: string]: string };\n\n /**\n * The base URL used for downloading R WebAssembly binaries.\n * Default: `'https://webr.r-wasm.org/[version]/'`\n */\n baseUrl?: string;\n\n /**\n * The repo URL to use when downloading R WebAssembly packages.\n * Default: `'https://repo.r-wasm.org/`\n */\n repoUrl?: string;\n\n /**\n * The base URL from where to load JavaScript worker scripts when loading\n * webR with the ServiceWorker communication channel mode.\n * Default: `''`\n */\n serviceWorkerUrl?: string;\n\n /**\n * The WebAssembly user's home directory and initial working directory.\n * Default: `'/home/web_user'`\n */\n homedir?: string;\n\n /**\n * Start R in interactive mode?\n * Default: `true`.\n */\n interactive?: boolean;\n\n /**\n * Set the communication channel type to be used.\n * Deafult: `channelType.Automatic`\n */\n channelType?: (typeof ChannelType)[keyof typeof ChannelType];\n}\n\nconst defaultEnv = {\n R_HOME: '/usr/lib/R',\n R_ENABLE_JIT: '0',\n};\n\nconst defaultOptions = {\n RArgs: [],\n REnv: defaultEnv,\n baseUrl: BASE_URL,\n serviceWorkerUrl: '',\n repoUrl: PKG_BASE_URL,\n homedir: '/home/web_user',\n interactive: true,\n channelType: ChannelType.Automatic,\n};\n\n/**\n * The webR class is used to initialize and interact with the webR system.\n *\n * Start webR by constructing an instance of the WebR class, optionally passing\n * an options argument of type {@link WebROptions}. WebR will begin to download\n * and start a version of R built for WebAssembly in a worker thread.\n */\nexport class WebR {\n #chan!: ChannelMain;\n globalShelter!: Shelter;\n\n RObject!: ReturnType<typeof newRClassProxy<typeof RWorker.RObject, RObject>>;\n RLogical!: ReturnType<typeof newRClassProxy<typeof RWorker.RLogical, RLogical>>;\n RInteger!: ReturnType<typeof newRClassProxy<typeof RWorker.RInteger, RInteger>>;\n RDouble!: ReturnType<typeof newRClassProxy<typeof RWorker.RDouble, RDouble>>;\n RCharacter!: ReturnType<typeof newRClassProxy<typeof RWorker.RCharacter, RCharacter>>;\n RComplex!: ReturnType<typeof newRClassProxy<typeof RWorker.RComplex, RComplex>>;\n RRaw!: ReturnType<typeof newRClassProxy<typeof RWorker.RRaw, RRaw>>;\n RList!: ReturnType<typeof newRClassProxy<typeof RWorker.RList, RList>>;\n RPairlist!: ReturnType<typeof newRClassProxy<typeof RWorker.RPairlist, RPairlist>>;\n REnvironment!: ReturnType<typeof newRClassProxy<typeof RWorker.REnvironment, REnvironment>>;\n RSymbol!: ReturnType<typeof newRClassProxy<typeof RWorker.RSymbol, RSymbol>>;\n RString!: ReturnType<typeof newRClassProxy<typeof RWorker.RString, RString>>;\n RCall!: ReturnType<typeof newRClassProxy<typeof RWorker.RCall, RCall>>;\n\n objs: {\n baseEnv: REnvironment;\n globalEnv: REnvironment;\n null: RNull;\n true: RLogical;\n false: RLogical;\n na: RLogical;\n };\n\n Shelter;\n\n constructor(options: WebROptions = {}) {\n const config: Required<WebROptions> = Object.assign(defaultOptions, options);\n this.#chan = newChannelMain(config);\n\n this.objs = {} as typeof this.objs;\n this.Shelter = newShelterProxy(this.#chan);\n }\n\n /**\n * @returns {Promise<void>} A promise that resolves once webR has been\n * intialised.\n */\n async init() {\n const init = await this.#chan.initialised;\n\n this.globalShelter = await new this.Shelter();\n\n this.RObject = this.globalShelter.RObject;\n this.RLogical = this.globalShelter.RLogical;\n this.RInteger = this.globalShelter.RInteger;\n this.RDouble = this.globalShelter.RDouble;\n this.RComplex = this.globalShelter.RComplex;\n this.RCharacter = this.globalShelter.RCharacter;\n this.RRaw = this.globalShelter.RRaw;\n this.RList = this.globalShelter.RList;\n this.RPairlist = this.globalShelter.RPairlist;\n this.REnvironment = this.globalShelter.REnvironment;\n this.RSymbol = this.globalShelter.RSymbol;\n this.RString = this.globalShelter.RString;\n this.RCall = this.globalShelter.RCall;\n\n this.objs = {\n baseEnv: (await this.RObject.getPersistentObject('baseEnv')) as REnvironment,\n globalEnv: (await this.RObject.getPersistentObject('globalEnv')) as REnvironment,\n null: (await this.RObject.getPersistentObject('null')) as RNull,\n true: (await this.RObject.getPersistentObject('true')) as RLogical,\n false: (await this.RObject.getPersistentObject('false')) as RLogical,\n na: (await this.RObject.getPersistentObject('na')) as RLogical,\n };\n\n return init;\n }\n\n /**\n * Close the communication channel between the main thread and the worker\n * thread cleanly. Once this has been executed, webR will be unable to\n * continue.\n */\n close() {\n this.#chan.close();\n }\n\n /**\n * Read from the communication channel and return an output message.\n * @returns {Promise<Message>} The output message\n */\n async read(): Promise<Message> {\n return await this.#chan.read();\n }\n\n /**\n * Flush the output queue in the communication channel and return all output\n * messages.\n * @returns {Promise<Message[]>} The output messages\n */\n async flush(): Promise<Message[]> {\n return await this.#chan.flush();\n }\n\n /**\n * Send a message to the communication channel input queue.\n * @param {Message} msg Message to be added to the input queue.\n */\n write(msg: Message) {\n this.#chan.write(msg);\n }\n\n /**\n * Send a line of standard input to the communication channel input queue.\n * @param {string} input Message to be added to the input queue.\n */\n writeConsole(input: string) {\n this.write({ type: 'stdin', data: input + '\\n' });\n }\n\n /** Attempt to interrupt a running R computation. */\n interrupt() {\n this.#chan.interrupt();\n }\n\n /**\n * Install a list of R packages from the default webR CRAN-like repo.\n * @param {string[]} packages An array of R pacakge names.\n */\n async installPackages(packages: string[]) {\n for (const pkg of packages) {\n const msg = { type: 'installPackage', data: { name: pkg } };\n await this.#chan.request(msg);\n }\n }\n\n /**\n * Destroy an R object reference.\n * @param {RObject} x An R object reference.\n */\n async destroy(x: RObject) {\n await this.globalShelter.destroy(x);\n }\n\n /**\n * Evaluate the given R code.\n *\n * Stream outputs and any conditions raised during exectution are written to\n * the JavaScript console.\n *\n * @param {string} code The R code to evaluate.\n * @param {EvalROptions} [options] Options for the execution environment.\n * @returns {Promise<RObject>} The result of the computation.\n */\n async evalR(code: string, options?: EvalROptions): Promise<RObject> {\n return this.globalShelter.evalR(code, options);\n }\n\n async evalRVoid(code: string, options?: EvalROptions) {\n return this.evalRRaw(code, 'void', options);\n }\n\n async evalRBoolean(code: string, options?: EvalROptions) {\n return this.evalRRaw(code, 'boolean', options);\n }\n\n async evalRNumber(code: string, options?: EvalROptions) {\n return this.evalRRaw(code, 'number', options);\n }\n\n async evalRString(code: string, options?: EvalROptions) {\n return this.evalRRaw(code, 'string', options);\n }\n\n /**\n * Evaluate the given R code, returning the result as a raw JavaScript object.\n *\n * @param {string} code The R code to evaluate.\n * @param {EvalRMessageOutputType} outputType JavaScript type to return the result as.\n * @param {EvalROptions} [options] Options for the execution environment.\n * @returns {Promise<unknown>} The result of the computation.\n */\n async evalRRaw(code: string, outputType: 'void', options?: EvalROptions): Promise<void>;\n async evalRRaw(code: string, outputType: 'boolean', options?: EvalROptions): Promise<boolean>;\n async evalRRaw(code: string, outputType: 'boolean[]', options?: EvalROptions): Promise<boolean[]>;\n async evalRRaw(code: string, outputType: 'number', options?: EvalROptions): Promise<number>;\n async evalRRaw(code: string, outputType: 'number[]', options?: EvalROptions): Promise<number[]>;\n async evalRRaw(code: string, outputType: 'string', options?: EvalROptions): Promise<string>;\n async evalRRaw(code: string, outputType: 'string[]', options?: EvalROptions): Promise<string[]>;\n async evalRRaw(code: string, outputType: EvalRMessageOutputType, options: EvalROptions = {}) {\n const opts = replaceInObject(options, isRObject, (obj: RObject) => obj._payload);\n const msg: EvalRMessageRaw = {\n type: 'evalRRaw',\n data: { code: code, options: opts as EvalROptions, outputType: outputType },\n };\n const payload = await this.#chan.request(msg);\n\n switch (payload.payloadType) {\n case 'raw':\n return payload.obj;\n case 'ptr':\n throw new Error('Unexpected ptr payload type returned from evalRVoid');\n }\n }\n\n FS = {\n lookupPath: async (path: string): Promise<FSNode> => {\n const msg: FSMessage = { type: 'lookupPath', data: { path } };\n const payload = await this.#chan.request(msg);\n return payload.obj as FSNode;\n },\n mkdir: async (path: string): Promise<FSNode> => {\n const msg: FSMessage = { type: 'mkdir', data: { path } };\n const payload = await this.#chan.request(msg);\n return payload.obj as FSNode;\n },\n readFile: async (path: string, flags?: string): Promise<Uint8Array> => {\n const msg: FSReadFileMessage = { type: 'readFile', data: { path, flags } };\n const payload = await this.#chan.request(msg);\n return payload.obj as Uint8Array;\n },\n rmdir: async (path: string): Promise<void> => {\n const msg: FSMessage = { type: 'rmdir', data: { path } };\n await this.#chan.request(msg);\n },\n writeFile: async (path: string, data: ArrayBufferView, flags?: string): Promise<void> => {\n const msg: FSWriteFileMessage = { type: 'writeFile', data: { path, data, flags } };\n await this.#chan.request(msg);\n },\n unlink: async (path: string): Promise<void> => {\n const msg: FSMessage = { type: 'unlink', data: { path } };\n await this.#chan.request(msg);\n },\n };\n}\n\n/** WebR shelters provide fine-grained control over the lifetime of R objects. */\nexport class Shelter {\n #id = '';\n #chan: ChannelMain;\n #initialised = false;\n\n RObject!: ReturnType<typeof newRClassProxy<typeof RWorker.RObject, RObject>>;\n RLogical!: ReturnType<typeof newRClassProxy<typeof RWorker.RLogical, RLogical>>;\n RInteger!: ReturnType<typeof newRClassProxy<typeof RWorker.RInteger, RInteger>>;\n RDouble!: ReturnType<typeof newRClassProxy<typeof RWorker.RDouble, RDouble>>;\n RCharacter!: ReturnType<typeof newRClassProxy<typeof RWorker.RCharacter, RCharacter>>;\n RComplex!: ReturnType<typeof newRClassProxy<typeof RWorker.RComplex, RComplex>>;\n RRaw!: ReturnType<typeof newRClassProxy<typeof RWorker.RRaw, RRaw>>;\n RList!: ReturnType<typeof newRClassProxy<typeof RWorker.RList, RList>>;\n RPairlist!: ReturnType<typeof newRClassProxy<typeof RWorker.RPairlist, RPairlist>>;\n REnvironment!: ReturnType<typeof newRClassProxy<typeof RWorker.REnvironment, REnvironment>>;\n RSymbol!: ReturnType<typeof newRClassProxy<typeof RWorker.RSymbol, RSymbol>>;\n RString!: ReturnType<typeof newRClassProxy<typeof RWorker.RString, RString>>;\n RCall!: ReturnType<typeof newRClassProxy<typeof RWorker.RCall, RCall>>;\n\n /** @internal */\n constructor(chan: ChannelMain) {\n this.#chan = chan;\n }\n\n /** @internal */\n async init() {\n if (this.#initialised) {\n return;\n }\n\n const msg = { type: 'newShelter' } as NewShelterMessage;\n const payload = await this.#chan.request(msg);\n this.#id = payload.obj as string;\n\n this.RObject = newRClassProxy<typeof RWorker.RObject, RObject>(this.#chan, this.#id, 'object');\n this.RLogical = newRClassProxy<typeof RWorker.RLogical, RLogical>(this.#chan, this.#id, 'logical');\n this.RInteger = newRClassProxy<typeof RWorker.RInteger, RInteger>(this.#chan, this.#id, 'integer');\n this.RDouble = newRClassProxy<typeof RWorker.RDouble, RDouble>(this.#chan, this.#id, 'double');\n this.RComplex = newRClassProxy<typeof RWorker.RComplex, RComplex>(this.#chan, this.#id, 'complex');\n this.RCharacter = newRClassProxy<typeof RWorker.RCharacter, RCharacter>(this.#chan, this.#id, 'character');\n this.RRaw = newRClassProxy<typeof RWorker.RRaw, RRaw>(this.#chan, this.#id, 'raw');\n this.RList = newRClassProxy<typeof RWorker.RList, RList>(this.#chan, this.#id, 'list');\n this.RPairlist = newRClassProxy<typeof RWorker.RPairlist, RPairlist>(this.#chan, this.#id, 'pairlist');\n this.REnvironment = newRClassProxy<typeof RWorker.REnvironment, REnvironment>(this.#chan, this.#id, 'environment');\n this.RSymbol = newRClassProxy<typeof RWorker.RSymbol, RSymbol>(this.#chan, this.#id, 'symbol');\n this.RString = newRClassProxy<typeof RWorker.RString, RString>(this.#chan, this.#id, 'string');\n this.RCall = newRClassProxy<typeof RWorker.RCall, RCall>(this.#chan, this.#id, 'call');\n\n this.#initialised = true;\n }\n\n async purge() {\n const msg: ShelterMessage = {\n type: 'shelterPurge',\n data: this.#id,\n };\n await this.#chan.request(msg);\n }\n\n async destroy(x: RObject) {\n const msg: ShelterDestroyMessage = {\n type: 'shelterDestroy',\n data: { id: this.#id, obj: x._payload },\n };\n await this.#chan.request(msg);\n }\n\n async size(): Promise<number> {\n const msg: ShelterMessage = {\n type: 'shelterSize',\n data: this.#id,\n };\n const payload = await this.#chan.request(msg);\n return payload.obj as number;\n }\n\n /**\n * Evaluate the given R code.\n *\n * Stream outputs and any conditions raised during exectution are written to\n * the JavaScript console. The returned R object is protected by the shelter.\n *\n * @param {string} code The R code to evaluate.\n * @param {EvalROptions} [options] Options for the execution environment.\n * @returns {Promise<RObject>} The result of the computation.\n */\n async evalR(code: string, options: EvalROptions = {}): Promise<RObject> {\n const opts = replaceInObject(options, isRObject, (obj: RObject) => obj._payload);\n const msg: EvalRMessage = {\n type: 'evalR',\n data: { code: code, options: opts as EvalROptions, shelter: this.#id },\n };\n const payload = await this.#chan.request(msg);\n\n switch (payload.payloadType) {\n case 'raw':\n throw new Error('Unexpected payload type returned from evalR');\n default:\n return newRProxy(this.#chan, payload);\n }\n }\n\n /**\n * Evaluate the given R code, capturing output.\n *\n * Stream outputs and conditions raised during exectution are captured and\n * returned as part of the output of this function. Returned R objects are\n * protected by the shelter.\n *\n * @param {string} code The R code to evaluate.\n * @param {EvalROptions} [options] Options for the execution environment.\n * @returns {Promise<{result: RObject, output: unknown[]}>} An object\n * containing the result of the computation and and array of captured output.\n */\n async captureR(code: string, options: EvalROptions = {}): Promise<{\n result: RObject;\n output: unknown[];\n }> {\n const opts = replaceInObject(options, isRObject, (obj: RObject) => obj._payload);\n const msg: CaptureRMessage = {\n type: 'captureR',\n data: {\n code: code,\n options: opts as EvalROptions,\n shelter: this.#id,\n },\n };\n const payload = await this.#chan.request(msg);\n\n switch (payload.payloadType) {\n case 'ptr':\n throw new Error('Unexpected payload type returned from evalR');\n\n case 'raw': {\n const data = payload.obj as {\n result: WebRPayloadPtr;\n output: { type: string; data: any }[];\n };\n const result = newRProxy(this.#chan, data.result);\n const output = data.output;\n\n for (let i = 0; i < output.length; ++i) {\n if (output[i].type !== 'stdout' && output[i].type !== 'stderr') {\n output[i].data = newRProxy(this.#chan, output[i].data as WebRPayloadPtr);\n }\n }\n\n return { result, output };\n }\n }\n }\n}\n\nfunction newShelterProxy(chan: ChannelMain) {\n return new Proxy(Shelter, {\n construct: async () => {\n const out = new Shelter(chan);\n await out.init();\n return out;\n },\n }) as unknown as {\n new (): Promise<Shelter>;\n };\n}\n"],
"mappings": "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",
"names": ["IN_NODE", "loadScript", "url", "resolve", "reject", "script", "__toESM", "__require", "nodePathMod", "promiseHandles", "out", "_value", "_reason", "promise", "resolve", "reject", "sleep", "ms", "replaceInObject", "obj", "test", "replacer", "replacerArgs", "v", "k", "i", "newCrossOriginWorker", "url", "cb", "req", "worker", "isCrossOrigin", "urlString", "IN_NODE", "url1", "url2", "transferCache", "transfer", "obj", "transfers", "UUID_LENGTH", "generateUUID", "result", "randomSegment", "pad", "newRequest", "msg", "transferables", "newRequestResponseMessage", "generateUUID", "newResponse", "uuid", "resp", "transfer", "newSyncRequest", "data", "encoder", "decoder", "encodeData", "decodeData", "encoder", "syncResponse", "endpoint", "data", "response", "taskId", "sizeBuffer", "dataBuffer", "signalBuffer", "bytes", "encodeData", "fits", "uuid", "dataPromise", "requestResponseMessage", "signalRequester", "e", "ep", "id", "generateUUID", "resolve", "IN_NODE", "message", "l", "ev", "index", "sleepTime", "sleep", "_promises", "_resolvers", "_add", "add_fn", "AsyncQueue", "__privateAdd", "__privateSet", "t", "__privateGet", "__privateMethod", "resolve", "webRPayloadError", "payload", "isWebRPayload", "value", "isWebRPayloadPtr", "_parked", "ChannelMain", "AsyncQueue", "__privateAdd", "msg", "transferables", "req", "newRequest", "resolve", "reject", "promise", "promiseHandles", "__privateGet", "uuid", "handles", "payload", "webRPayloadError", "decoder", "_scheduled", "_resolved", "_result", "_exception", "_syncGen", "SyncTask", "endpoint", "msg", "transfers", "__privateAdd", "_Syncifier", "__privateSet", "__privateGet", "done", "value", "sizeBuffer", "signalBuffer", "taskId", "dataBuffer", "acquireDataBuffer", "UUID_LENGTH", "syncMsg", "newSyncRequest", "id", "releaseDataBuffer", "size", "decodeData", "task", "interruptBuffer", "handleInterrupt", "flag", "i", "bit", "result", "wokenTaskId", "wokenTask", "dataBuffers", "powerof2", "buffer", "setInterruptHandler", "handler", "setInterruptBuffer", "Module", "dictEmFree", "dict", "key", "IN_NODE", "_interruptBuffer", "_handleEventsFromWorker", "handleEventsFromWorker_fn", "_onMessageFromWorker", "SharedBufferChannelMain", "ChannelMain", "config", "__privateAdd", "worker", "message", "__privateSet", "msg", "payload", "reqData", "response", "syncResponse", "initWorker", "__privateMethod", "ChannelType", "isCrossOrigin", "newCrossOriginWorker", "promiseHandles", "__privateGet", "ev", "_ep", "_dispatch", "_interrupt", "SharedBufferChannelWorker", "setInterruptBuffer", "setInterruptHandler", "transfer", "SyncTask", "Module", "args", "interrupt", "dispatch", "IN_NODE", "_syncMessageCache", "_registration", "_interrupted", "_registerServiceWorker", "registerServiceWorker_fn", "_onMessageFromServiceWorker", "onMessageFromServiceWorker_fn", "_handleEventsFromWorker", "handleEventsFromWorker_fn", "_onMessageFromWorker", "ServiceWorkerChannelMain", "ChannelMain", "config", "__privateAdd", "worker", "message", "request", "__privateGet", "initWorker", "__privateMethod", "clientId", "msg", "ChannelType", "isCrossOrigin", "newCrossOriginWorker", "promiseHandles", "_a", "__privateSet", "url", "resolve", "listener", "event", "uuid", "response", "newResponse", "ev", "_ep", "_mainThreadId", "_location", "_dispatch", "_interrupt", "ServiceWorkerChannelWorker", "data", "transfer", "newRequest", "retryCount", "xhr", "fetchReqBody", "encodeData", "decodeData", "e", "Module", "args", "interrupt", "dispatch", "ChannelType", "newChannelMain", "data", "SharedBufferChannelMain", "ServiceWorkerChannelMain", "IN_NODE", "isCrossOrigin", "BASE_URL", "IN_NODE", "PKG_BASE_URL", "isRObject", "value", "isWebRPayloadPtr", "isRFunction", "_a", "RTypeMap", "isWebRDataJs", "value", "isComplex", "protect", "x", "Module", "handlePtr", "protectInc", "prot", "protectWithIndex", "pLoc", "unprotectIndex", "index", "reprotect", "unprotect", "n", "envPoke", "env", "sym", "value", "parseEvalBare", "code", "strings", "envObj", "REnvironment", "out", "RObject", "dictEmFree", "safeEval", "call", "env", "Module", "handlePtr", "handlePtr", "x", "isRObject", "assertRType", "obj", "type", "Module", "RTypeMap", "newObjectFromData", "obj", "isWebRDataJs", "getRWorkerClass", "RTypeMap", "RNull", "RLogical", "RDouble", "RCharacter", "isComplex", "RComplex", "newObjectFromArray", "arr", "prot", "call", "RCall", "RSymbol", "protectInc", "unprotect", "RObjectBase", "ptr", "typeNumber", "Module", "typeName", "_slice", "slice_fn", "_RObject", "data", "__privateAdd", "type", "prop", "objs", "parseEvalBare", "RPairlist", "values", "namesObj", "v", "names", "name", "options", "depth", "__privateMethod", "path", "index", "protectWithIndex", "getter", "out", "reprotect", "result", "unprotectIndex", "value", "idx", "valueObj", "assign", "safeEval", "props", "cur", "p", "i", "RObject", "op", "x", "assertRType", "RString", "val", "toWebRData", "list", "next", "allowDuplicateKey", "allowEmptyKey", "entries", "keys", "k", "u", "namesArray", "hasNames", "symbol", "RList", "RFunction", "args", "REnvironment", "nProt", "protect", "sym", "vObj", "envPoke", "all", "sorted", "symbols", "RVectorAtomic", "kind", "newSetter", "ret", "elt", "m", "_newSetter", "_RLogical", "__privateGet", "naLogical", "_RInteger", "RInteger", "naInteger", "_RDouble", "naDouble", "_RComplex", "_RCharacter", "_RRaw", "RRaw", "jsObj", "typeClasses", "isRObject", "empty", "targetAsyncIterator", "chan", "proxy", "msg", "reply", "i", "targetMethod", "prop", "payload", "_args", "args", "arg", "isRObject", "replaceInObject", "obj", "newRProxy", "isWebRPayloadPtr", "newRObject", "objType", "shelter", "value", "_a", "_", "_thisArg", "res", "isRFunction", "newRClassProxy", "RObject", "_stdout", "_stderr", "_prompt", "_canvasExec", "_defaultStdout", "_defaultStderr", "_defaultPrompt", "_defaultCanvasExec", "_run", "run_fn", "Console", "callbacks", "options", "__privateAdd", "text", "input", "exec", "IN_NODE", "WebR", "__privateSet", "__privateGet", "__privateMethod", "output", "defaultEnv", "defaultOptions", "BASE_URL", "PKG_BASE_URL", "ChannelType", "_chan", "WebR", "options", "__privateAdd", "path", "msg", "__privateGet", "flags", "data", "config", "__privateSet", "newChannelMain", "newShelterProxy", "init", "input", "packages", "pkg", "x", "code", "outputType", "opts", "replaceInObject", "isRObject", "obj", "payload", "_id", "_initialised", "Shelter", "chan", "newRClassProxy", "newRProxy", "result", "output", "i", "out"]
}