// import type { Readable, Writable } from "node:stream"; // import type { WorkerOptions } from "node:worker_threads"; declare const self: typeof globalThis; type WebWorker = InstanceType; const EventEmitter = require("node:events"); const { throwNotImplemented } = require("../internal/shared"); const { MessageChannel, BroadcastChannel, Worker: WebWorker } = globalThis; const SHARE_ENV = Symbol("nodejs.worker_threads.SHARE_ENV"); const isMainThread = Bun.isMainThread; let [_workerData, _threadId, _receiveMessageOnPort] = $lazy("worker_threads"); type NodeWorkerOptions = import("node:worker_threads").WorkerOptions; const emittedWarnings = new Set(); function emitWarning(type, message) { if (emittedWarnings.has(type)) return; emittedWarnings.add(type); // process.emitWarning(message); // our printing is bad console.warn("[bun] Warning:", message); } function injectFakeEmitter(Class) { function messageEventHandler(event: MessageEvent) { return event.data; } function errorEventHandler(event: ErrorEvent) { return event.error; } const wrappedListener = Symbol("wrappedListener"); function wrapped(run, listener) { const callback = function (event) { return listener(run(event)); }; listener[wrappedListener] = callback; return callback; } function functionForEventType(event, listener) { switch (event) { case "error": case "messageerror": { return wrapped(errorEventHandler, listener); } default: { return wrapped(messageEventHandler, listener); } } } Class.prototype.on = function (event, listener) { this.addEventListener(event, functionForEventType(event, listener)); return this; }; Class.prototype.off = function (event, listener) { if (listener) { this.removeEventListener(event, listener[wrappedListener] || listener); } else { this.removeEventListener(event); } return this; }; Class.prototype.once = function (event, listener) { this.addEventListener(event, functionForEventType(event, listener), { once: true }); return this; }; function EventClass(eventName) { if (eventName === "error" || eventName === "messageerror") { return ErrorEvent; } return MessageEvent; } Class.prototype.emit = function (event, ...args) { this.dispatchEvent(new (EventClass(event))(event, ...args)); return this; }; Class.prototype.prependListener = Class.prototype.on; Class.prototype.prependOnceListener = Class.prototype.once; } const _MessagePort = globalThis.MessagePort; injectFakeEmitter(_MessagePort); const MessagePort = _MessagePort; let resourceLimits = {}; let workerData = _workerData; let threadId = _threadId; function receiveMessageOnPort(port: MessagePort) { let res = _receiveMessageOnPort(port); if (!res) return undefined; return { message: res, }; } function fakeParentPort() { const fake = Object.create(MessagePort.prototype); Object.defineProperty(fake, "onmessage", { get() { return self.onmessage; }, set(value) { self.onmessage = value; }, }); Object.defineProperty(fake, "onmessageerror", { get() { return self.onmessageerror; }, set(value) {}, }); Object.defineProperty(fake, "postMessage", { value(...args: [any, any]) { return self.postMessage(...args); }, }); Object.defineProperty(fake, "close", { value() { return process.exit(0); }, }); Object.defineProperty(fake, "start", { value() {}, }); Object.defineProperty(fake, "unref", { value() {}, }); Object.defineProperty(fake, "ref", { value() {}, }); Object.defineProperty(fake, "hasRef", { value() { return false; }, }); Object.defineProperty(fake, "setEncoding", { value() {}, }); Object.defineProperty(fake, "addEventListener", { value: self.addEventListener.bind(self), }); Object.defineProperty(fake, "removeEventListener", { value: self.removeEventListener.bind(self), }); return fake; } let parentPort: MessagePort | null = isMainThread ? null : fakeParentPort(); function getEnvironmentData() { return process.env; } function setEnvironmentData(env: any) { process.env = env; } function markAsUntransferable() { throwNotImplemented("worker_threads.markAsUntransferable"); } function moveMessagePortToContext() { throwNotImplemented("worker_threads.moveMessagePortToContext"); } const unsupportedOptions = [ "eval", "argv", "execArgv", "stdin", "stdout", "stderr", "trackedUnmanagedFds", "resourceLimits", ]; class Worker extends EventEmitter { #worker: WebWorker; #performance; // this is used by wt.Worker.terminate(); // either is the exit code if exited, a promise resolving to the exit code, or undefined if we havent sent .terminate() yet #onExitPromise: Promise | number | undefined = undefined; constructor(filename: string, options: NodeWorkerOptions = {}) { super(); for (const key of unsupportedOptions) { if (key in options) { emitWarning("option." + key, `worker_threads.Worker option "${key}" is not implemented.`); } } this.#worker = new WebWorker(filename, options); this.#worker.addEventListener("close", this.#onClose.bind(this)); this.#worker.addEventListener("error", this.#onError.bind(this)); this.#worker.addEventListener("message", this.#onMessage.bind(this)); this.#worker.addEventListener("messageerror", this.#onMessageError.bind(this)); this.#worker.addEventListener("open", this.#onOpen.bind(this)); } ref() { this.#worker.ref(); } unref() { this.#worker.unref(); } get stdin() { // TODO: return null; } get stdout() { // TODO: return null; } get stderr() { // TODO: return null; } get performance() { return (this.#performance ??= { eventLoopUtilization() { emitWarning("performance", "worker_threads.Worker.performance is not implemented."); return { idle: 0, active: 0, utilization: 0, }; }, }); } terminate() { var onExitPromise = this.#onExitPromise; if (onExitPromise) { return $isPromise(onExitPromise) ? onExitPromise : Promise.resolve(onExitPromise); } const { resolve, promise } = Promise.withResolvers(); this.#worker.addEventListener( "close", event => { resolve(event.code); }, { once: true }, ); this.#worker.terminate(); return (this.#onExitPromise = promise); } postMessage(...args: [any, any]) { return this.#worker.postMessage(...args); } #onClose(e) { this.#onExitPromise = e.code; this.emit("exit", e.code); } #onError(error: ErrorEvent) { this.emit("error", error); } #onMessage(event: MessageEvent) { // TODO: is this right? this.emit("message", event.data); } #onMessageError(event: MessageEvent) { // TODO: is this right? this.emit("messageerror", (event as any).error ?? event.data ?? event); } #onOpen() { this.emit("online"); } async getHeapSnapshot() { throwNotImplemented("worker_threads.Worker.getHeapSnapshot"); } } export default { Worker, workerData, parentPort, resourceLimits, isMainThread, MessageChannel, BroadcastChannel, MessagePort, getEnvironmentData, setEnvironmentData, getHeapSnapshot() { return {}; }, markAsUntransferable, moveMessagePortToContext, receiveMessageOnPort, SHARE_ENV, threadId, }; onents Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
AgeCommit message (Expand)AuthorFilesLines
2022-09-30Update seven-shrimps-hope.md (#4934)Gravatar Tony Sullivan 1-1/+1
2022-09-30[ci] update lockfile (#4927)Gravatar Fred K. Bot 1-280/+280
2022-09-30Move module declarations for Markdown and MDX so they're available everywhere...Gravatar Erika 4-35/+46
2022-09-29[ci] formatGravatar tony-sull 4-17/+29
2022-09-29[@astrojs/image] adding caching support for SSG builds (#4909)Gravatar Tony Sullivan 8-10/+240
2022-09-29[ci] release (#4903)astro@1.4.0@astrojs/vue@1.1.0@astrojs/vercel@2.1.0@astrojs/telemetry@1.0.1@astrojs/tailwind@2.0.2@astrojs/svelte@1.0.1@astrojs/rss@1.0.2@astrojs/preact@1.1.1@astrojs/node@1.1.0@astrojs/netlify@1.1.0@astrojs/mdx@0.11.3@astrojs/markdown-remark@1.1.3@astrojs/image@0.8.1@astrojs/deno@1.1.0@astrojs/cloudflare@2.1.0Gravatar Fred K. Bot 65-235/+512
2022-09-29[ci] update lockfile (#4899)Gravatar Fred K. Bot 1-735/+718
2022-09-29[ci] formatGravatar matthewp 1-1/+3
2022-09-29fix trailing slash mismatch in dev vs build in docs example (#4912)Gravatar Rishi Raj Jain 1-1/+1
2022-09-29[ci] formatGravatar bluwy 1-1/+1
2022-09-29Support Vue JSX (#4897)Gravatar Bjorn Lu 12-5/+329
2022-09-28[ci] formatGravatar matthewp 1-8/+4
2022-09-28Fix CSS ordering between imported and Astro styles (#4907)Gravatar Matthew Phillips 12-7/+218
2022-09-28[ci] formatGravatar matthewp 23-137/+127
2022-09-28Astro.cookies implementation (#4876)Gravatar Matthew Phillips 32-29/+943
2022-09-28Fix: let Squoosh default image quality internally (#4906)Gravatar Tony Sullivan 5-11/+20
2022-09-28Update README.md (#4898)Gravatar stijlmassi 1-2/+3
2022-09-28Fix test (#4904)Gravatar Bjorn Lu 2-1/+7
2022-09-28[ci] formatGravatar FredKSchott 2-4/+4
2022-09-28redesign basics template (#4879)Gravatar Fred K. Schott 3-88/+34
2022-09-28[ci] formatGravatar bluwy 1-2/+2
2022-09-28Remove shamefully-hoist (#4842)Gravatar Bjorn Lu 104-527/+768
2022-09-28[ci] formatGravatar matthewp 4-14/+16
2022-09-28Hoist hydration script out of slot templates (#4891)Gravatar Matthew Phillips 13-43/+165
2022-09-28Ensure head content rendered once with lazy layouts (#4892)Gravatar Matthew Phillips 9-3/+59
2022-09-27fixed typing (#4893)Gravatar tweenietomatoes 1-1/+1
2022-09-27[ci] release (#4846)create-astro@1.1.0astro@1.3.1@astrojs/webapi@1.1.0@astrojs/vercel@2.0.1@astrojs/mdx@0.11.2@astrojs/image@0.8.0Gravatar Fred K. Bot 60-185/+169
2022-09-27fix: post API routes in SSG should warn or error during dev mode (#4878)Gravatar Rishi Raj Jain 3-2/+17
2022-09-27docs: Fix links to Tailwind examples (#4883)Gravatar Deanmv 1-1/+1
2022-09-27Set SSR target webworker for Vercel edge (#4884)Gravatar Bjorn Lu 2-0/+6
2022-09-27[ci] update lockfile (#4885)Gravatar Fred K. Bot 1-86/+79
2022-09-26[ci] formatGravatar bholmesdev 3-23/+19
2022-09-26Fix: correctly transform `import.meta.env.*` in MDX (#4858)Gravatar Ben Holmes 12-233/+454
2022-09-26Change negative lookbehind to lookahead (#4866)Gravatar Rishi Raj Jain 1-1/+1
2022-09-26add double check on astro file return type to display more human readable err...Gravatar Steven Yung 6-2/+61
2022-09-26[ci] update lockfile (#4862)Gravatar Fred K. Bot 1-81/+81
2022-09-26fix: Script with innerHTML not working on Safari (#4861)Gravatar Rishi Raj Jain 3-3/+10
2022-09-26Prevent /undefined catch-all routes in dev (#4873)Gravatar Bjorn Lu 6-9/+66
2022-09-26fix: 🐛 BUG: class:list directive adding class attribute when undefined (#4...Gravatar Rishi Raj Jain 2-2/+9
2022-09-26docs: Standardize common integration READMEs (#4874)Gravatar Jake Strawn 7-6/+66
2022-09-26docs: Update references to support channel in Discord. (#4872)Gravatar Jake Strawn 12-12/+12
2022-09-26[ci] formatGravatar bluwy 1-1/+1
2022-09-26fix: "chunks" directory appears in build output, if custom modules are import...Gravatar Rishi Raj Jain 2-6/+34
2022-09-23[ci] formatGravatar matthewp 1-1/+1
2022-09-23Define toStringTag another way (#4855)Gravatar Matthew Phillips 2-4/+12
2022-09-23update SSR example to match recent change on Astro API Context (#4854)Gravatar Steven Yung 2-4/+6
2022-09-23[ci] update lockfile (#4852)Gravatar Fred K. Bot 1-373/+402