@stream-mdx/worker 0.0.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +22 -40
- package/dist/hosted/markdown-worker.js +23 -16833
- package/dist/index.cjs +0 -1
- package/dist/index.mjs +0 -1
- package/dist/mdx-compile.cjs +81 -0
- package/dist/mdx-compile.d.cts +13 -0
- package/dist/mdx-compile.d.ts +13 -0
- package/dist/mdx-compile.mjs +46 -0
- package/dist/streaming/custom-matcher.cjs +3 -119
- package/dist/streaming/custom-matcher.d.cts +1 -54
- package/dist/streaming/custom-matcher.d.ts +1 -54
- package/dist/streaming/custom-matcher.mjs +1 -114
- package/dist/worker-client.cjs +0 -1
- package/dist/worker-client.d.cts +1 -0
- package/dist/worker-client.d.ts +1 -0
- package/dist/worker-client.mjs +0 -1
- package/package.json +18 -5
- package/dist/hosted/markdown-worker.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/streaming/custom-matcher.cjs.map +0 -1
- package/dist/streaming/custom-matcher.mjs.map +0 -1
- package/dist/worker-client.cjs.map +0 -1
- package/dist/worker-client.mjs.map +0 -1
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/create-default-worker.ts","../src/worker-client.ts"],"sourcesContent":["export * from \"./worker-client\";\nexport * from \"./create-default-worker\";\n","const DEFAULT_WORKER_PATH = \"/workers/markdown-worker.js\";\n\nconst BLOB_REGISTRY = new WeakMap<Worker, string>();\n\nexport type DefaultWorkerMode = \"auto\" | \"hosted\" | \"blob\";\n\nexport interface CreateDefaultWorkerOptions {\n /**\n * Selects how the helper instantiates the worker.\n * - `auto` (default) tries to use inline source when available, then falls back to hosted URL.\n * - `hosted` always instantiates from the provided URL.\n * - `blob` requires `inlineSource` (or an inline `<script data-markdown-v2-worker-source>` element) and never touches the hosted URL.\n */\n mode?: DefaultWorkerMode;\n /**\n * Hosted worker URL. Defaults to `/workers/markdown-worker.js` or whatever is declared via\n * `<script data-markdown-v2-worker-url=\"...\">`.\n */\n url?: string | URL;\n /**\n * Inline worker source (module string) used when `mode` is `blob` or `auto`.\n */\n inlineSource?: string;\n /**\n * Override the worker name (shows up in devtools).\n */\n name?: string;\n /**\n * Credentials to use when instantiating a hosted worker.\n */\n credentials?: WorkerOptions[\"credentials\"];\n}\n\nexport function createDefaultWorker(options: CreateDefaultWorkerOptions = {}): Worker | null {\n if (typeof window === \"undefined\" || typeof Worker === \"undefined\") {\n return null;\n }\n\n const mode = options.mode ?? \"auto\";\n const workerName = options.name ?? \"markdown-v2\";\n const workerOptions: WorkerOptions = {\n type: \"module\",\n name: workerName,\n credentials: options.credentials ?? \"same-origin\",\n };\n\n const inlineSource = resolveInlineSource(options.inlineSource);\n\n if ((mode === \"auto\" || mode === \"blob\") && inlineSource) {\n const blobWorker = instantiateBlobWorker(inlineSource, workerOptions);\n if (blobWorker) {\n return blobWorker;\n }\n if (mode === \"blob\") {\n return null;\n }\n } else if (mode === \"blob\") {\n console.warn(\"[markdown-v2] Blob worker requested but no inline source was provided.\");\n return null;\n }\n\n const hostedUrl = resolveHostedUrl(options.url);\n try {\n return new Worker(hostedUrl, workerOptions);\n } catch (error) {\n console.error(\"[markdown-v2] Unable to instantiate hosted worker:\", error);\n return null;\n }\n}\n\nexport function releaseDefaultWorker(worker: Worker | null | undefined): void {\n if (!worker) return;\n const blobUrl = BLOB_REGISTRY.get(worker);\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n BLOB_REGISTRY.delete(worker);\n }\n}\n\nfunction instantiateBlobWorker(source: string, workerOptions: WorkerOptions): Worker | null {\n try {\n const blob = new Blob([source], { type: \"text/javascript\" });\n const blobUrl = URL.createObjectURL(blob);\n const worker = new Worker(blobUrl, workerOptions);\n BLOB_REGISTRY.set(worker, blobUrl);\n return worker;\n } catch (error) {\n console.warn(\"[markdown-v2] Failed to instantiate blob worker:\", error);\n return null;\n }\n}\n\nfunction resolveHostedUrl(explicit?: string | URL): string | URL {\n if (explicit) {\n return explicit;\n }\n if (typeof document !== \"undefined\") {\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-url]');\n if (script?.dataset?.markdownV2WorkerUrl) {\n return script.dataset.markdownV2WorkerUrl;\n }\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"markdown-v2:worker\"]');\n if (meta?.content) {\n return meta.content;\n }\n }\n return DEFAULT_WORKER_PATH;\n}\n\nfunction resolveInlineSource(explicit?: string): string | undefined {\n if (typeof explicit === \"string\" && explicit.trim().length > 0) {\n return explicit;\n }\n if (typeof document === \"undefined\") {\n return undefined;\n }\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-source]');\n const text = script?.textContent;\n return text && text.trim().length > 0 ? text : undefined;\n}\n","// V2 Worker Client for Markdown Renderer\n// Similar interface to the V1 streaming worker client\n\nimport type { WorkerIn, WorkerOut } from \"@stream-mdx/core\";\nimport { createDefaultWorker, releaseDefaultWorker, type CreateDefaultWorkerOptions } from \"./create-default-worker\";\n\nexport interface MarkdownWorkerClientOptions {\n worker?: Worker | (() => Worker);\n workerUrl?: string | URL;\n name?: string;\n defaultWorker?: CreateDefaultWorkerOptions;\n}\n\nexport class MarkdownWorkerClient {\n private worker?: Worker;\n private readonly ownsWorker: boolean;\n private listeners = new Set<(msg: WorkerOut) => void>();\n private messageListener?: (event: MessageEvent<WorkerOut>) => void;\n private errorListener?: (event: ErrorEvent) => void;\n private messageErrorListener?: (event: MessageEvent<unknown>) => void;\n private cleanupCallbacks: Array<() => void> = [];\n\n constructor(options: MarkdownWorkerClientOptions = {}) {\n let owned = false;\n if (typeof window !== \"undefined\" && typeof Worker !== \"undefined\") {\n try {\n const worker = this.createWorkerInstance(options);\n if (worker) {\n owned = !options.worker;\n this.worker = worker;\n this.messageListener = (ev: MessageEvent<WorkerOut>) => {\n for (const listener of this.listeners) {\n listener(ev.data);\n }\n };\n this.errorListener = (error: Event) => {\n if (error instanceof ErrorEvent) {\n const stack = error.error && typeof error.error === \"object\" ? (error.error as Error).stack : undefined;\n console.error(\"V2 Markdown Worker error:\", error.message, \"at\", error.filename, `${error.lineno}:${error.colno}`, stack ?? \"<no-stack>\");\n } else {\n console.error(\"V2 Markdown Worker error:\", error);\n }\n };\n this.messageErrorListener = (event: MessageEvent<unknown>) => {\n console.error(\"V2 Markdown Worker message error:\", event.data);\n };\n this.worker.addEventListener(\"message\", this.messageListener);\n this.worker.addEventListener(\"error\", this.errorListener);\n this.worker.addEventListener(\"messageerror\", this.messageErrorListener);\n }\n } catch (error) {\n console.warn(\"Failed to create V2 Markdown Worker:\", error);\n }\n }\n this.ownsWorker = owned;\n }\n\n private createWorkerInstance(options: MarkdownWorkerClientOptions): Worker | undefined {\n const { worker, workerUrl, name, defaultWorker } = options;\n try {\n if (worker) {\n return typeof worker === \"function\" ? worker() : worker;\n }\n const auto = createDefaultWorker({\n ...defaultWorker,\n url: workerUrl ?? defaultWorker?.url,\n name: name ?? defaultWorker?.name,\n });\n if (auto) {\n this.cleanupCallbacks.push(() => releaseDefaultWorker(auto));\n return auto;\n }\n const script = workerUrl ?? \"/workers/markdown-worker.js\";\n return new Worker(script instanceof URL ? script : script, { type: \"module\", name: name ?? \"markdown-v2\" });\n } catch (error) {\n console.warn(\"Unable to instantiate markdown worker:\", error);\n return undefined;\n }\n }\n\n onMessage(cb: (msg: WorkerOut) => void) {\n this.listeners.add(cb);\n return () => this.listeners.delete(cb);\n }\n\n init(\n initialContent?: string,\n prewarmLangs?: string[],\n docPlugins?: { footnotes?: boolean; html?: boolean; mdx?: boolean; tables?: boolean; callouts?: boolean },\n mdxOptions?: { compileMode?: \"server\" | \"worker\" },\n ) {\n this.post({\n type: \"INIT\",\n initialContent,\n prewarmLangs,\n docPlugins,\n mdx: mdxOptions,\n } as WorkerIn);\n }\n\n append(text: string) {\n this.post({ type: \"APPEND\", text });\n }\n\n finalize() {\n this.post({ type: \"FINALIZE\" } as WorkerIn);\n }\n\n setCredits(credits: number) {\n const value = Math.max(0, Math.min(1, credits));\n this.post({ type: \"SET_CREDITS\", credits: value } as WorkerIn);\n }\n\n setMdxCompiled(blockId: string, compiledId: string) {\n this.post({ type: \"MDX_COMPILED\", blockId, compiledId } as WorkerIn);\n }\n\n setMdxError(blockId: string, error?: string) {\n this.post({ type: \"MDX_ERROR\", blockId, error } as WorkerIn);\n }\n\n terminate(options: { force?: boolean } = {}) {\n if (this.worker) {\n if (this.messageListener) {\n this.worker.removeEventListener(\"message\", this.messageListener);\n }\n if (this.errorListener) {\n this.worker.removeEventListener(\"error\", this.errorListener);\n }\n if (this.messageErrorListener) {\n this.worker.removeEventListener(\"messageerror\", this.messageErrorListener);\n }\n const shouldTerminate = options.force ?? this.ownsWorker;\n if (shouldTerminate && typeof this.worker.terminate === \"function\") {\n this.worker.terminate();\n }\n }\n this.worker = undefined;\n this.messageListener = undefined;\n this.errorListener = undefined;\n this.messageErrorListener = undefined;\n this.listeners.clear();\n if (this.cleanupCallbacks.length > 0) {\n for (const cleanup of this.cleanupCallbacks.splice(0, this.cleanupCallbacks.length)) {\n try {\n cleanup();\n } catch (error) {\n console.warn(\"Failed to clean up worker resources\", error);\n }\n }\n }\n }\n\n getWorker(): Worker | undefined {\n return this.worker;\n }\n\n private post(msg: WorkerIn) {\n if (this.worker) {\n this.worker.postMessage(msg);\n } else {\n console.warn(\"V2 Markdown Worker not available\");\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAM,sBAAsB;AAE5B,IAAM,gBAAgB,oBAAI,QAAwB;AA+B3C,SAAS,oBAAoB,UAAsC,CAAC,GAAkB;AAC3F,MAAI,OAAO,WAAW,eAAe,OAAO,WAAW,aAAa;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,aAAa,QAAQ,QAAQ;AACnC,QAAM,gBAA+B;AAAA,IACnC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa,QAAQ,eAAe;AAAA,EACtC;AAEA,QAAM,eAAe,oBAAoB,QAAQ,YAAY;AAE7D,OAAK,SAAS,UAAU,SAAS,WAAW,cAAc;AACxD,UAAM,aAAa,sBAAsB,cAAc,aAAa;AACpE,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AACA,QAAI,SAAS,QAAQ;AACnB,aAAO;AAAA,IACT;AAAA,EACF,WAAW,SAAS,QAAQ;AAC1B,YAAQ,KAAK,wEAAwE;AACrF,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,iBAAiB,QAAQ,GAAG;AAC9C,MAAI;AACF,WAAO,IAAI,OAAO,WAAW,aAAa;AAAA,EAC5C,SAAS,OAAO;AACd,YAAQ,MAAM,sDAAsD,KAAK;AACzE,WAAO;AAAA,EACT;AACF;AAEO,SAAS,qBAAqB,QAAyC;AAC5E,MAAI,CAAC,OAAQ;AACb,QAAM,UAAU,cAAc,IAAI,MAAM;AACxC,MAAI,SAAS;AACX,QAAI,gBAAgB,OAAO;AAC3B,kBAAc,OAAO,MAAM;AAAA,EAC7B;AACF;AAEA,SAAS,sBAAsB,QAAgB,eAA6C;AAC1F,MAAI;AACF,UAAM,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC3D,UAAM,UAAU,IAAI,gBAAgB,IAAI;AACxC,UAAM,SAAS,IAAI,OAAO,SAAS,aAAa;AAChD,kBAAc,IAAI,QAAQ,OAAO;AACjC,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,KAAK,oDAAoD,KAAK;AACtE,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,UAAuC;AAC/D,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,SAAS,SAAS,cAAiC,qCAAqC;AAC9F,QAAI,QAAQ,SAAS,qBAAqB;AACxC,aAAO,OAAO,QAAQ;AAAA,IACxB;AACA,UAAM,OAAO,SAAS,cAA+B,iCAAiC;AACtF,QAAI,MAAM,SAAS;AACjB,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,UAAuC;AAClE,MAAI,OAAO,aAAa,YAAY,SAAS,KAAK,EAAE,SAAS,GAAG;AAC9D,WAAO;AAAA,EACT;AACA,MAAI,OAAO,aAAa,aAAa;AACnC,WAAO;AAAA,EACT;AACA,QAAM,SAAS,SAAS,cAAiC,wCAAwC;AACjG,QAAM,OAAO,QAAQ;AACrB,SAAO,QAAQ,KAAK,KAAK,EAAE,SAAS,IAAI,OAAO;AACjD;;;AC1GO,IAAM,uBAAN,MAA2B;AAAA,EAShC,YAAY,UAAuC,CAAC,GAAG;AANvD,SAAQ,YAAY,oBAAI,IAA8B;AAItD,SAAQ,mBAAsC,CAAC;AAG7C,QAAI,QAAQ;AACZ,QAAI,OAAO,WAAW,eAAe,OAAO,WAAW,aAAa;AAClE,UAAI;AACF,cAAM,SAAS,KAAK,qBAAqB,OAAO;AAChD,YAAI,QAAQ;AACV,kBAAQ,CAAC,QAAQ;AACjB,eAAK,SAAS;AACd,eAAK,kBAAkB,CAAC,OAAgC;AACtD,uBAAW,YAAY,KAAK,WAAW;AACrC,uBAAS,GAAG,IAAI;AAAA,YAClB;AAAA,UACF;AACA,eAAK,gBAAgB,CAAC,UAAiB;AACrC,gBAAI,iBAAiB,YAAY;AAC/B,oBAAM,QAAQ,MAAM,SAAS,OAAO,MAAM,UAAU,WAAY,MAAM,MAAgB,QAAQ;AAC9F,sBAAQ,MAAM,6BAA6B,MAAM,SAAS,MAAM,MAAM,UAAU,GAAG,MAAM,MAAM,IAAI,MAAM,KAAK,IAAI,SAAS,YAAY;AAAA,YACzI,OAAO;AACL,sBAAQ,MAAM,6BAA6B,KAAK;AAAA,YAClD;AAAA,UACF;AACA,eAAK,uBAAuB,CAAC,UAAiC;AAC5D,oBAAQ,MAAM,qCAAqC,MAAM,IAAI;AAAA,UAC/D;AACA,eAAK,OAAO,iBAAiB,WAAW,KAAK,eAAe;AAC5D,eAAK,OAAO,iBAAiB,SAAS,KAAK,aAAa;AACxD,eAAK,OAAO,iBAAiB,gBAAgB,KAAK,oBAAoB;AAAA,QACxE;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,KAAK,wCAAwC,KAAK;AAAA,MAC5D;AAAA,IACF;AACA,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,qBAAqB,SAA0D;AACrF,UAAM,EAAE,QAAQ,WAAW,MAAM,cAAc,IAAI;AACnD,QAAI;AACF,UAAI,QAAQ;AACV,eAAO,OAAO,WAAW,aAAa,OAAO,IAAI;AAAA,MACnD;AACA,YAAM,OAAO,oBAAoB;AAAA,QAC/B,GAAG;AAAA,QACH,KAAK,aAAa,eAAe;AAAA,QACjC,MAAM,QAAQ,eAAe;AAAA,MAC/B,CAAC;AACD,UAAI,MAAM;AACR,aAAK,iBAAiB,KAAK,MAAM,qBAAqB,IAAI,CAAC;AAC3D,eAAO;AAAA,MACT;AACA,YAAM,SAAS,aAAa;AAC5B,aAAO,IAAI,OAAO,kBAAkB,MAAM,SAAS,QAAQ,EAAE,MAAM,UAAU,MAAM,QAAQ,cAAc,CAAC;AAAA,IAC5G,SAAS,OAAO;AACd,cAAQ,KAAK,0CAA0C,KAAK;AAC5D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,UAAU,IAA8B;AACtC,SAAK,UAAU,IAAI,EAAE;AACrB,WAAO,MAAM,KAAK,UAAU,OAAO,EAAE;AAAA,EACvC;AAAA,EAEA,KACE,gBACA,cACA,YACA,YACA;AACA,SAAK,KAAK;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP,CAAa;AAAA,EACf;AAAA,EAEA,OAAO,MAAc;AACnB,SAAK,KAAK,EAAE,MAAM,UAAU,KAAK,CAAC;AAAA,EACpC;AAAA,EAEA,WAAW;AACT,SAAK,KAAK,EAAE,MAAM,WAAW,CAAa;AAAA,EAC5C;AAAA,EAEA,WAAW,SAAiB;AAC1B,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC;AAC9C,SAAK,KAAK,EAAE,MAAM,eAAe,SAAS,MAAM,CAAa;AAAA,EAC/D;AAAA,EAEA,eAAe,SAAiB,YAAoB;AAClD,SAAK,KAAK,EAAE,MAAM,gBAAgB,SAAS,WAAW,CAAa;AAAA,EACrE;AAAA,EAEA,YAAY,SAAiB,OAAgB;AAC3C,SAAK,KAAK,EAAE,MAAM,aAAa,SAAS,MAAM,CAAa;AAAA,EAC7D;AAAA,EAEA,UAAU,UAA+B,CAAC,GAAG;AAC3C,QAAI,KAAK,QAAQ;AACf,UAAI,KAAK,iBAAiB;AACxB,aAAK,OAAO,oBAAoB,WAAW,KAAK,eAAe;AAAA,MACjE;AACA,UAAI,KAAK,eAAe;AACtB,aAAK,OAAO,oBAAoB,SAAS,KAAK,aAAa;AAAA,MAC7D;AACA,UAAI,KAAK,sBAAsB;AAC7B,aAAK,OAAO,oBAAoB,gBAAgB,KAAK,oBAAoB;AAAA,MAC3E;AACA,YAAM,kBAAkB,QAAQ,SAAS,KAAK;AAC9C,UAAI,mBAAmB,OAAO,KAAK,OAAO,cAAc,YAAY;AAClE,aAAK,OAAO,UAAU;AAAA,MACxB;AAAA,IACF;AACA,SAAK,SAAS;AACd,SAAK,kBAAkB;AACvB,SAAK,gBAAgB;AACrB,SAAK,uBAAuB;AAC5B,SAAK,UAAU,MAAM;AACrB,QAAI,KAAK,iBAAiB,SAAS,GAAG;AACpC,iBAAW,WAAW,KAAK,iBAAiB,OAAO,GAAG,KAAK,iBAAiB,MAAM,GAAG;AACnF,YAAI;AACF,kBAAQ;AAAA,QACV,SAAS,OAAO;AACd,kBAAQ,KAAK,uCAAuC,KAAK;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAgC;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,KAAK,KAAe;AAC1B,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,YAAY,GAAG;AAAA,IAC7B,OAAO;AACL,cAAQ,KAAK,kCAAkC;AAAA,IACjD;AAAA,EACF;AACF;","names":[]}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/create-default-worker.ts","../src/worker-client.ts"],"sourcesContent":["const DEFAULT_WORKER_PATH = \"/workers/markdown-worker.js\";\n\nconst BLOB_REGISTRY = new WeakMap<Worker, string>();\n\nexport type DefaultWorkerMode = \"auto\" | \"hosted\" | \"blob\";\n\nexport interface CreateDefaultWorkerOptions {\n /**\n * Selects how the helper instantiates the worker.\n * - `auto` (default) tries to use inline source when available, then falls back to hosted URL.\n * - `hosted` always instantiates from the provided URL.\n * - `blob` requires `inlineSource` (or an inline `<script data-markdown-v2-worker-source>` element) and never touches the hosted URL.\n */\n mode?: DefaultWorkerMode;\n /**\n * Hosted worker URL. Defaults to `/workers/markdown-worker.js` or whatever is declared via\n * `<script data-markdown-v2-worker-url=\"...\">`.\n */\n url?: string | URL;\n /**\n * Inline worker source (module string) used when `mode` is `blob` or `auto`.\n */\n inlineSource?: string;\n /**\n * Override the worker name (shows up in devtools).\n */\n name?: string;\n /**\n * Credentials to use when instantiating a hosted worker.\n */\n credentials?: WorkerOptions[\"credentials\"];\n}\n\nexport function createDefaultWorker(options: CreateDefaultWorkerOptions = {}): Worker | null {\n if (typeof window === \"undefined\" || typeof Worker === \"undefined\") {\n return null;\n }\n\n const mode = options.mode ?? \"auto\";\n const workerName = options.name ?? \"markdown-v2\";\n const workerOptions: WorkerOptions = {\n type: \"module\",\n name: workerName,\n credentials: options.credentials ?? \"same-origin\",\n };\n\n const inlineSource = resolveInlineSource(options.inlineSource);\n\n if ((mode === \"auto\" || mode === \"blob\") && inlineSource) {\n const blobWorker = instantiateBlobWorker(inlineSource, workerOptions);\n if (blobWorker) {\n return blobWorker;\n }\n if (mode === \"blob\") {\n return null;\n }\n } else if (mode === \"blob\") {\n console.warn(\"[markdown-v2] Blob worker requested but no inline source was provided.\");\n return null;\n }\n\n const hostedUrl = resolveHostedUrl(options.url);\n try {\n return new Worker(hostedUrl, workerOptions);\n } catch (error) {\n console.error(\"[markdown-v2] Unable to instantiate hosted worker:\", error);\n return null;\n }\n}\n\nexport function releaseDefaultWorker(worker: Worker | null | undefined): void {\n if (!worker) return;\n const blobUrl = BLOB_REGISTRY.get(worker);\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n BLOB_REGISTRY.delete(worker);\n }\n}\n\nfunction instantiateBlobWorker(source: string, workerOptions: WorkerOptions): Worker | null {\n try {\n const blob = new Blob([source], { type: \"text/javascript\" });\n const blobUrl = URL.createObjectURL(blob);\n const worker = new Worker(blobUrl, workerOptions);\n BLOB_REGISTRY.set(worker, blobUrl);\n return worker;\n } catch (error) {\n console.warn(\"[markdown-v2] Failed to instantiate blob worker:\", error);\n return null;\n }\n}\n\nfunction resolveHostedUrl(explicit?: string | URL): string | URL {\n if (explicit) {\n return explicit;\n }\n if (typeof document !== \"undefined\") {\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-url]');\n if (script?.dataset?.markdownV2WorkerUrl) {\n return script.dataset.markdownV2WorkerUrl;\n }\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"markdown-v2:worker\"]');\n if (meta?.content) {\n return meta.content;\n }\n }\n return DEFAULT_WORKER_PATH;\n}\n\nfunction resolveInlineSource(explicit?: string): string | undefined {\n if (typeof explicit === \"string\" && explicit.trim().length > 0) {\n return explicit;\n }\n if (typeof document === \"undefined\") {\n return undefined;\n }\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-source]');\n const text = script?.textContent;\n return text && text.trim().length > 0 ? text : undefined;\n}\n","// V2 Worker Client for Markdown Renderer\n// Similar interface to the V1 streaming worker client\n\nimport type { WorkerIn, WorkerOut } from \"@stream-mdx/core\";\nimport { createDefaultWorker, releaseDefaultWorker, type CreateDefaultWorkerOptions } from \"./create-default-worker\";\n\nexport interface MarkdownWorkerClientOptions {\n worker?: Worker | (() => Worker);\n workerUrl?: string | URL;\n name?: string;\n defaultWorker?: CreateDefaultWorkerOptions;\n}\n\nexport class MarkdownWorkerClient {\n private worker?: Worker;\n private readonly ownsWorker: boolean;\n private listeners = new Set<(msg: WorkerOut) => void>();\n private messageListener?: (event: MessageEvent<WorkerOut>) => void;\n private errorListener?: (event: ErrorEvent) => void;\n private messageErrorListener?: (event: MessageEvent<unknown>) => void;\n private cleanupCallbacks: Array<() => void> = [];\n\n constructor(options: MarkdownWorkerClientOptions = {}) {\n let owned = false;\n if (typeof window !== \"undefined\" && typeof Worker !== \"undefined\") {\n try {\n const worker = this.createWorkerInstance(options);\n if (worker) {\n owned = !options.worker;\n this.worker = worker;\n this.messageListener = (ev: MessageEvent<WorkerOut>) => {\n for (const listener of this.listeners) {\n listener(ev.data);\n }\n };\n this.errorListener = (error: Event) => {\n if (error instanceof ErrorEvent) {\n const stack = error.error && typeof error.error === \"object\" ? (error.error as Error).stack : undefined;\n console.error(\"V2 Markdown Worker error:\", error.message, \"at\", error.filename, `${error.lineno}:${error.colno}`, stack ?? \"<no-stack>\");\n } else {\n console.error(\"V2 Markdown Worker error:\", error);\n }\n };\n this.messageErrorListener = (event: MessageEvent<unknown>) => {\n console.error(\"V2 Markdown Worker message error:\", event.data);\n };\n this.worker.addEventListener(\"message\", this.messageListener);\n this.worker.addEventListener(\"error\", this.errorListener);\n this.worker.addEventListener(\"messageerror\", this.messageErrorListener);\n }\n } catch (error) {\n console.warn(\"Failed to create V2 Markdown Worker:\", error);\n }\n }\n this.ownsWorker = owned;\n }\n\n private createWorkerInstance(options: MarkdownWorkerClientOptions): Worker | undefined {\n const { worker, workerUrl, name, defaultWorker } = options;\n try {\n if (worker) {\n return typeof worker === \"function\" ? worker() : worker;\n }\n const auto = createDefaultWorker({\n ...defaultWorker,\n url: workerUrl ?? defaultWorker?.url,\n name: name ?? defaultWorker?.name,\n });\n if (auto) {\n this.cleanupCallbacks.push(() => releaseDefaultWorker(auto));\n return auto;\n }\n const script = workerUrl ?? \"/workers/markdown-worker.js\";\n return new Worker(script instanceof URL ? script : script, { type: \"module\", name: name ?? \"markdown-v2\" });\n } catch (error) {\n console.warn(\"Unable to instantiate markdown worker:\", error);\n return undefined;\n }\n }\n\n onMessage(cb: (msg: WorkerOut) => void) {\n this.listeners.add(cb);\n return () => this.listeners.delete(cb);\n }\n\n init(\n initialContent?: string,\n prewarmLangs?: string[],\n docPlugins?: { footnotes?: boolean; html?: boolean; mdx?: boolean; tables?: boolean; callouts?: boolean },\n mdxOptions?: { compileMode?: \"server\" | \"worker\" },\n ) {\n this.post({\n type: \"INIT\",\n initialContent,\n prewarmLangs,\n docPlugins,\n mdx: mdxOptions,\n } as WorkerIn);\n }\n\n append(text: string) {\n this.post({ type: \"APPEND\", text });\n }\n\n finalize() {\n this.post({ type: \"FINALIZE\" } as WorkerIn);\n }\n\n setCredits(credits: number) {\n const value = Math.max(0, Math.min(1, credits));\n this.post({ type: \"SET_CREDITS\", credits: value } as WorkerIn);\n }\n\n setMdxCompiled(blockId: string, compiledId: string) {\n this.post({ type: \"MDX_COMPILED\", blockId, compiledId } as WorkerIn);\n }\n\n setMdxError(blockId: string, error?: string) {\n this.post({ type: \"MDX_ERROR\", blockId, error } as WorkerIn);\n }\n\n terminate(options: { force?: boolean } = {}) {\n if (this.worker) {\n if (this.messageListener) {\n this.worker.removeEventListener(\"message\", this.messageListener);\n }\n if (this.errorListener) {\n this.worker.removeEventListener(\"error\", this.errorListener);\n }\n if (this.messageErrorListener) {\n this.worker.removeEventListener(\"messageerror\", this.messageErrorListener);\n }\n const shouldTerminate = options.force ?? this.ownsWorker;\n if (shouldTerminate && typeof this.worker.terminate === \"function\") {\n this.worker.terminate();\n }\n }\n this.worker = undefined;\n this.messageListener = undefined;\n this.errorListener = undefined;\n this.messageErrorListener = undefined;\n this.listeners.clear();\n if (this.cleanupCallbacks.length > 0) {\n for (const cleanup of this.cleanupCallbacks.splice(0, this.cleanupCallbacks.length)) {\n try {\n cleanup();\n } catch (error) {\n console.warn(\"Failed to clean up worker resources\", error);\n }\n }\n }\n }\n\n getWorker(): Worker | undefined {\n return this.worker;\n }\n\n private post(msg: WorkerIn) {\n if (this.worker) {\n this.worker.postMessage(msg);\n } else {\n console.warn(\"V2 Markdown Worker not available\");\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/streaming/custom-matcher.ts"],"sourcesContent":["// Custom streaming regex matcher to replace problematic incr-regex-package\n\n/**\n * Custom streaming pattern matcher\n */\nexport class CustomStreamingMatcher {\n private pattern: RegExp;\n private buffer = \"\";\n private possibleMatches: PossibleMatch[] = [];\n\n constructor(pattern: RegExp) {\n this.pattern = pattern;\n }\n\n /**\n * Add character to buffer and check for matches\n */\n addCharacter(char: string): MatchResult {\n this.buffer += char;\n\n // Check for complete matches\n const fullMatch = this.buffer.match(this.pattern);\n if (fullMatch && fullMatch.index === 0) {\n const match = {\n matched: true,\n content: fullMatch[0],\n length: fullMatch[0].length,\n isComplete: true,\n };\n\n // Clean up buffer\n this.buffer = this.buffer.slice(fullMatch[0].length);\n this.possibleMatches = [];\n\n return match;\n }\n\n // Check for partial matches\n const confidence = this.calculatePartialConfidence();\n\n return {\n matched: false,\n content: this.buffer,\n length: this.buffer.length,\n isComplete: false,\n confidence,\n };\n }\n\n /**\n * Add string to buffer and check for matches\n */\n addString(str: string): MatchResult[] {\n const results: MatchResult[] = [];\n\n for (const char of str) {\n const result = this.addCharacter(char);\n if (result.matched) {\n results.push(result);\n }\n }\n\n // If no complete matches, return the final partial state\n if (results.length === 0 && this.buffer.length > 0) {\n results.push({\n matched: false,\n content: this.buffer,\n length: this.buffer.length,\n isComplete: false,\n confidence: this.calculatePartialConfidence(),\n });\n }\n\n return results;\n }\n\n /**\n * Check if current buffer could lead to a match\n */\n couldMatch(): boolean {\n if (this.buffer.length === 0) return true;\n\n // Create a test pattern that matches the start of our full pattern\n const patternSource = this.pattern.source;\n const flags = this.pattern.flags;\n\n try {\n // Create partial pattern by making the rest optional\n const partialPattern = new RegExp(`^${patternSource.replace(/\\$$/, \"\")}`, flags);\n const testString = this.buffer + \"X\".repeat(100); // Add potential completion\n return partialPattern.test(testString);\n } catch {\n // Fallback: check if buffer is a prefix of any potential match\n return this.isValidPrefix();\n }\n }\n\n /**\n * Reset the matcher\n */\n reset(): void {\n this.buffer = \"\";\n this.possibleMatches = [];\n }\n\n /**\n * Get current buffer content\n */\n getBuffer(): string {\n return this.buffer;\n }\n\n /**\n * Calculate confidence for partial matches\n */\n private calculatePartialConfidence(): number {\n if (this.buffer.length === 0) return 0;\n\n let confidence = 0.1; // Base confidence\n\n // Higher confidence for longer buffers\n confidence += Math.min(0.4, this.buffer.length * 0.1);\n\n // Higher confidence if buffer matches start of pattern\n if (this.couldMatch()) {\n confidence += 0.3;\n }\n\n // Special case for common patterns\n if (this.buffer.startsWith(\"$\")) confidence += 0.2;\n if (this.buffer.startsWith(\"$$\")) confidence += 0.3;\n\n return Math.min(1, confidence);\n }\n\n /**\n * Check if current buffer is a valid prefix\n */\n private isValidPrefix(): boolean {\n const patternStr = this.pattern.source;\n\n // Simple prefix checking for common patterns\n if (patternStr.includes(\"\\\\$\\\\$\") && (this.buffer === \"$\" || this.buffer === \"$$\")) {\n return true;\n }\n\n if (patternStr.includes(\"\\\\$\") && this.buffer === \"$\") {\n return true;\n }\n\n return false;\n }\n}\n\n/**\n * Result of streaming match attempt\n */\nexport interface MatchResult {\n /** Whether a complete match was found */\n matched: boolean;\n\n /** Content that was matched or current buffer */\n content: string;\n\n /** Length of match or buffer */\n length: number;\n\n /** Whether this is a complete match */\n isComplete: boolean;\n\n /** Confidence that this will become a match (0-1) */\n confidence?: number;\n}\n\n/**\n * Possible partial match tracking\n */\ninterface PossibleMatch {\n startIndex: number;\n pattern: RegExp;\n confidence: number;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/streaming/custom-matcher.ts"],"sourcesContent":["// Custom streaming regex matcher to replace problematic incr-regex-package\n\n/**\n * Custom streaming pattern matcher\n */\nexport class CustomStreamingMatcher {\n private pattern: RegExp;\n private buffer = \"\";\n private possibleMatches: PossibleMatch[] = [];\n\n constructor(pattern: RegExp) {\n this.pattern = pattern;\n }\n\n /**\n * Add character to buffer and check for matches\n */\n addCharacter(char: string): MatchResult {\n this.buffer += char;\n\n // Check for complete matches\n const fullMatch = this.buffer.match(this.pattern);\n if (fullMatch && fullMatch.index === 0) {\n const match = {\n matched: true,\n content: fullMatch[0],\n length: fullMatch[0].length,\n isComplete: true,\n };\n\n // Clean up buffer\n this.buffer = this.buffer.slice(fullMatch[0].length);\n this.possibleMatches = [];\n\n return match;\n }\n\n // Check for partial matches\n const confidence = this.calculatePartialConfidence();\n\n return {\n matched: false,\n content: this.buffer,\n length: this.buffer.length,\n isComplete: false,\n confidence,\n };\n }\n\n /**\n * Add string to buffer and check for matches\n */\n addString(str: string): MatchResult[] {\n const results: MatchResult[] = [];\n\n for (const char of str) {\n const result = this.addCharacter(char);\n if (result.matched) {\n results.push(result);\n }\n }\n\n // If no complete matches, return the final partial state\n if (results.length === 0 && this.buffer.length > 0) {\n results.push({\n matched: false,\n content: this.buffer,\n length: this.buffer.length,\n isComplete: false,\n confidence: this.calculatePartialConfidence(),\n });\n }\n\n return results;\n }\n\n /**\n * Check if current buffer could lead to a match\n */\n couldMatch(): boolean {\n if (this.buffer.length === 0) return true;\n\n // Create a test pattern that matches the start of our full pattern\n const patternSource = this.pattern.source;\n const flags = this.pattern.flags;\n\n try {\n // Create partial pattern by making the rest optional\n const partialPattern = new RegExp(`^${patternSource.replace(/\\$$/, \"\")}`, flags);\n const testString = this.buffer + \"X\".repeat(100); // Add potential completion\n return partialPattern.test(testString);\n } catch {\n // Fallback: check if buffer is a prefix of any potential match\n return this.isValidPrefix();\n }\n }\n\n /**\n * Reset the matcher\n */\n reset(): void {\n this.buffer = \"\";\n this.possibleMatches = [];\n }\n\n /**\n * Get current buffer content\n */\n getBuffer(): string {\n return this.buffer;\n }\n\n /**\n * Calculate confidence for partial matches\n */\n private calculatePartialConfidence(): number {\n if (this.buffer.length === 0) return 0;\n\n let confidence = 0.1; // Base confidence\n\n // Higher confidence for longer buffers\n confidence += Math.min(0.4, this.buffer.length * 0.1);\n\n // Higher confidence if buffer matches start of pattern\n if (this.couldMatch()) {\n confidence += 0.3;\n }\n\n // Special case for common patterns\n if (this.buffer.startsWith(\"$\")) confidence += 0.2;\n if (this.buffer.startsWith(\"$$\")) confidence += 0.3;\n\n return Math.min(1, confidence);\n }\n\n /**\n * Check if current buffer is a valid prefix\n */\n private isValidPrefix(): boolean {\n const patternStr = this.pattern.source;\n\n // Simple prefix checking for common patterns\n if (patternStr.includes(\"\\\\$\\\\$\") && (this.buffer === \"$\" || this.buffer === \"$$\")) {\n return true;\n }\n\n if (patternStr.includes(\"\\\\$\") && this.buffer === \"$\") {\n return true;\n }\n\n return false;\n }\n}\n\n/**\n * Result of streaming match attempt\n */\nexport interface MatchResult {\n /** Whether a complete match was found */\n matched: boolean;\n\n /** Content that was matched or current buffer */\n content: string;\n\n /** Length of match or buffer */\n length: number;\n\n /** Whether this is a complete match */\n isComplete: boolean;\n\n /** Confidence that this will become a match (0-1) */\n confidence?: number;\n}\n\n/**\n * Possible partial match tracking\n */\ninterface PossibleMatch {\n startIndex: number;\n pattern: RegExp;\n confidence: number;\n}\n"],"mappings":";AAKO,IAAM,yBAAN,MAA6B;AAAA,EAKlC,YAAY,SAAiB;AAH7B,SAAQ,SAAS;AACjB,SAAQ,kBAAmC,CAAC;AAG1C,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAA2B;AACtC,SAAK,UAAU;AAGf,UAAM,YAAY,KAAK,OAAO,MAAM,KAAK,OAAO;AAChD,QAAI,aAAa,UAAU,UAAU,GAAG;AACtC,YAAM,QAAQ;AAAA,QACZ,SAAS;AAAA,QACT,SAAS,UAAU,CAAC;AAAA,QACpB,QAAQ,UAAU,CAAC,EAAE;AAAA,QACrB,YAAY;AAAA,MACd;AAGA,WAAK,SAAS,KAAK,OAAO,MAAM,UAAU,CAAC,EAAE,MAAM;AACnD,WAAK,kBAAkB,CAAC;AAExB,aAAO;AAAA,IACT;AAGA,UAAM,aAAa,KAAK,2BAA2B;AAEnD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK,OAAO;AAAA,MACpB,YAAY;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,KAA4B;AACpC,UAAM,UAAyB,CAAC;AAEhC,eAAW,QAAQ,KAAK;AACtB,YAAM,SAAS,KAAK,aAAa,IAAI;AACrC,UAAI,OAAO,SAAS;AAClB,gBAAQ,KAAK,MAAM;AAAA,MACrB;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,KAAK,KAAK,OAAO,SAAS,GAAG;AAClD,cAAQ,KAAK;AAAA,QACX,SAAS;AAAA,QACT,SAAS,KAAK;AAAA,QACd,QAAQ,KAAK,OAAO;AAAA,QACpB,YAAY;AAAA,QACZ,YAAY,KAAK,2BAA2B;AAAA,MAC9C,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAsB;AACpB,QAAI,KAAK,OAAO,WAAW,EAAG,QAAO;AAGrC,UAAM,gBAAgB,KAAK,QAAQ;AACnC,UAAM,QAAQ,KAAK,QAAQ;AAE3B,QAAI;AAEF,YAAM,iBAAiB,IAAI,OAAO,IAAI,cAAc,QAAQ,OAAO,EAAE,CAAC,IAAI,KAAK;AAC/E,YAAM,aAAa,KAAK,SAAS,IAAI,OAAO,GAAG;AAC/C,aAAO,eAAe,KAAK,UAAU;AAAA,IACvC,QAAQ;AAEN,aAAO,KAAK,cAAc;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,SAAS;AACd,SAAK,kBAAkB,CAAC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,6BAAqC;AAC3C,QAAI,KAAK,OAAO,WAAW,EAAG,QAAO;AAErC,QAAI,aAAa;AAGjB,kBAAc,KAAK,IAAI,KAAK,KAAK,OAAO,SAAS,GAAG;AAGpD,QAAI,KAAK,WAAW,GAAG;AACrB,oBAAc;AAAA,IAChB;AAGA,QAAI,KAAK,OAAO,WAAW,GAAG,EAAG,eAAc;AAC/C,QAAI,KAAK,OAAO,WAAW,IAAI,EAAG,eAAc;AAEhD,WAAO,KAAK,IAAI,GAAG,UAAU;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAyB;AAC/B,UAAM,aAAa,KAAK,QAAQ;AAGhC,QAAI,WAAW,SAAS,QAAQ,MAAM,KAAK,WAAW,OAAO,KAAK,WAAW,OAAO;AAClF,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,SAAS,KAAK,KAAK,KAAK,WAAW,KAAK;AACrD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/worker-client.ts","../src/create-default-worker.ts"],"sourcesContent":["// V2 Worker Client for Markdown Renderer\n// Similar interface to the V1 streaming worker client\n\nimport type { WorkerIn, WorkerOut } from \"@stream-mdx/core\";\nimport { createDefaultWorker, releaseDefaultWorker, type CreateDefaultWorkerOptions } from \"./create-default-worker\";\n\nexport interface MarkdownWorkerClientOptions {\n worker?: Worker | (() => Worker);\n workerUrl?: string | URL;\n name?: string;\n defaultWorker?: CreateDefaultWorkerOptions;\n}\n\nexport class MarkdownWorkerClient {\n private worker?: Worker;\n private readonly ownsWorker: boolean;\n private listeners = new Set<(msg: WorkerOut) => void>();\n private messageListener?: (event: MessageEvent<WorkerOut>) => void;\n private errorListener?: (event: ErrorEvent) => void;\n private messageErrorListener?: (event: MessageEvent<unknown>) => void;\n private cleanupCallbacks: Array<() => void> = [];\n\n constructor(options: MarkdownWorkerClientOptions = {}) {\n let owned = false;\n if (typeof window !== \"undefined\" && typeof Worker !== \"undefined\") {\n try {\n const worker = this.createWorkerInstance(options);\n if (worker) {\n owned = !options.worker;\n this.worker = worker;\n this.messageListener = (ev: MessageEvent<WorkerOut>) => {\n for (const listener of this.listeners) {\n listener(ev.data);\n }\n };\n this.errorListener = (error: Event) => {\n if (error instanceof ErrorEvent) {\n const stack = error.error && typeof error.error === \"object\" ? (error.error as Error).stack : undefined;\n console.error(\"V2 Markdown Worker error:\", error.message, \"at\", error.filename, `${error.lineno}:${error.colno}`, stack ?? \"<no-stack>\");\n } else {\n console.error(\"V2 Markdown Worker error:\", error);\n }\n };\n this.messageErrorListener = (event: MessageEvent<unknown>) => {\n console.error(\"V2 Markdown Worker message error:\", event.data);\n };\n this.worker.addEventListener(\"message\", this.messageListener);\n this.worker.addEventListener(\"error\", this.errorListener);\n this.worker.addEventListener(\"messageerror\", this.messageErrorListener);\n }\n } catch (error) {\n console.warn(\"Failed to create V2 Markdown Worker:\", error);\n }\n }\n this.ownsWorker = owned;\n }\n\n private createWorkerInstance(options: MarkdownWorkerClientOptions): Worker | undefined {\n const { worker, workerUrl, name, defaultWorker } = options;\n try {\n if (worker) {\n return typeof worker === \"function\" ? worker() : worker;\n }\n const auto = createDefaultWorker({\n ...defaultWorker,\n url: workerUrl ?? defaultWorker?.url,\n name: name ?? defaultWorker?.name,\n });\n if (auto) {\n this.cleanupCallbacks.push(() => releaseDefaultWorker(auto));\n return auto;\n }\n const script = workerUrl ?? \"/workers/markdown-worker.js\";\n return new Worker(script instanceof URL ? script : script, { type: \"module\", name: name ?? \"markdown-v2\" });\n } catch (error) {\n console.warn(\"Unable to instantiate markdown worker:\", error);\n return undefined;\n }\n }\n\n onMessage(cb: (msg: WorkerOut) => void) {\n this.listeners.add(cb);\n return () => this.listeners.delete(cb);\n }\n\n init(\n initialContent?: string,\n prewarmLangs?: string[],\n docPlugins?: { footnotes?: boolean; html?: boolean; mdx?: boolean; tables?: boolean; callouts?: boolean },\n mdxOptions?: { compileMode?: \"server\" | \"worker\" },\n ) {\n this.post({\n type: \"INIT\",\n initialContent,\n prewarmLangs,\n docPlugins,\n mdx: mdxOptions,\n } as WorkerIn);\n }\n\n append(text: string) {\n this.post({ type: \"APPEND\", text });\n }\n\n finalize() {\n this.post({ type: \"FINALIZE\" } as WorkerIn);\n }\n\n setCredits(credits: number) {\n const value = Math.max(0, Math.min(1, credits));\n this.post({ type: \"SET_CREDITS\", credits: value } as WorkerIn);\n }\n\n setMdxCompiled(blockId: string, compiledId: string) {\n this.post({ type: \"MDX_COMPILED\", blockId, compiledId } as WorkerIn);\n }\n\n setMdxError(blockId: string, error?: string) {\n this.post({ type: \"MDX_ERROR\", blockId, error } as WorkerIn);\n }\n\n terminate(options: { force?: boolean } = {}) {\n if (this.worker) {\n if (this.messageListener) {\n this.worker.removeEventListener(\"message\", this.messageListener);\n }\n if (this.errorListener) {\n this.worker.removeEventListener(\"error\", this.errorListener);\n }\n if (this.messageErrorListener) {\n this.worker.removeEventListener(\"messageerror\", this.messageErrorListener);\n }\n const shouldTerminate = options.force ?? this.ownsWorker;\n if (shouldTerminate && typeof this.worker.terminate === \"function\") {\n this.worker.terminate();\n }\n }\n this.worker = undefined;\n this.messageListener = undefined;\n this.errorListener = undefined;\n this.messageErrorListener = undefined;\n this.listeners.clear();\n if (this.cleanupCallbacks.length > 0) {\n for (const cleanup of this.cleanupCallbacks.splice(0, this.cleanupCallbacks.length)) {\n try {\n cleanup();\n } catch (error) {\n console.warn(\"Failed to clean up worker resources\", error);\n }\n }\n }\n }\n\n getWorker(): Worker | undefined {\n return this.worker;\n }\n\n private post(msg: WorkerIn) {\n if (this.worker) {\n this.worker.postMessage(msg);\n } else {\n console.warn(\"V2 Markdown Worker not available\");\n }\n }\n}\n","const DEFAULT_WORKER_PATH = \"/workers/markdown-worker.js\";\n\nconst BLOB_REGISTRY = new WeakMap<Worker, string>();\n\nexport type DefaultWorkerMode = \"auto\" | \"hosted\" | \"blob\";\n\nexport interface CreateDefaultWorkerOptions {\n /**\n * Selects how the helper instantiates the worker.\n * - `auto` (default) tries to use inline source when available, then falls back to hosted URL.\n * - `hosted` always instantiates from the provided URL.\n * - `blob` requires `inlineSource` (or an inline `<script data-markdown-v2-worker-source>` element) and never touches the hosted URL.\n */\n mode?: DefaultWorkerMode;\n /**\n * Hosted worker URL. Defaults to `/workers/markdown-worker.js` or whatever is declared via\n * `<script data-markdown-v2-worker-url=\"...\">`.\n */\n url?: string | URL;\n /**\n * Inline worker source (module string) used when `mode` is `blob` or `auto`.\n */\n inlineSource?: string;\n /**\n * Override the worker name (shows up in devtools).\n */\n name?: string;\n /**\n * Credentials to use when instantiating a hosted worker.\n */\n credentials?: WorkerOptions[\"credentials\"];\n}\n\nexport function createDefaultWorker(options: CreateDefaultWorkerOptions = {}): Worker | null {\n if (typeof window === \"undefined\" || typeof Worker === \"undefined\") {\n return null;\n }\n\n const mode = options.mode ?? \"auto\";\n const workerName = options.name ?? \"markdown-v2\";\n const workerOptions: WorkerOptions = {\n type: \"module\",\n name: workerName,\n credentials: options.credentials ?? \"same-origin\",\n };\n\n const inlineSource = resolveInlineSource(options.inlineSource);\n\n if ((mode === \"auto\" || mode === \"blob\") && inlineSource) {\n const blobWorker = instantiateBlobWorker(inlineSource, workerOptions);\n if (blobWorker) {\n return blobWorker;\n }\n if (mode === \"blob\") {\n return null;\n }\n } else if (mode === \"blob\") {\n console.warn(\"[markdown-v2] Blob worker requested but no inline source was provided.\");\n return null;\n }\n\n const hostedUrl = resolveHostedUrl(options.url);\n try {\n return new Worker(hostedUrl, workerOptions);\n } catch (error) {\n console.error(\"[markdown-v2] Unable to instantiate hosted worker:\", error);\n return null;\n }\n}\n\nexport function releaseDefaultWorker(worker: Worker | null | undefined): void {\n if (!worker) return;\n const blobUrl = BLOB_REGISTRY.get(worker);\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n BLOB_REGISTRY.delete(worker);\n }\n}\n\nfunction instantiateBlobWorker(source: string, workerOptions: WorkerOptions): Worker | null {\n try {\n const blob = new Blob([source], { type: \"text/javascript\" });\n const blobUrl = URL.createObjectURL(blob);\n const worker = new Worker(blobUrl, workerOptions);\n BLOB_REGISTRY.set(worker, blobUrl);\n return worker;\n } catch (error) {\n console.warn(\"[markdown-v2] Failed to instantiate blob worker:\", error);\n return null;\n }\n}\n\nfunction resolveHostedUrl(explicit?: string | URL): string | URL {\n if (explicit) {\n return explicit;\n }\n if (typeof document !== \"undefined\") {\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-url]');\n if (script?.dataset?.markdownV2WorkerUrl) {\n return script.dataset.markdownV2WorkerUrl;\n }\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"markdown-v2:worker\"]');\n if (meta?.content) {\n return meta.content;\n }\n }\n return DEFAULT_WORKER_PATH;\n}\n\nfunction resolveInlineSource(explicit?: string): string | undefined {\n if (typeof explicit === \"string\" && explicit.trim().length > 0) {\n return explicit;\n }\n if (typeof document === \"undefined\") {\n return undefined;\n }\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-source]');\n const text = script?.textContent;\n return text && text.trim().length > 0 ? text : undefined;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/create-default-worker.ts","../src/worker-client.ts"],"sourcesContent":["const DEFAULT_WORKER_PATH = \"/workers/markdown-worker.js\";\n\nconst BLOB_REGISTRY = new WeakMap<Worker, string>();\n\nexport type DefaultWorkerMode = \"auto\" | \"hosted\" | \"blob\";\n\nexport interface CreateDefaultWorkerOptions {\n /**\n * Selects how the helper instantiates the worker.\n * - `auto` (default) tries to use inline source when available, then falls back to hosted URL.\n * - `hosted` always instantiates from the provided URL.\n * - `blob` requires `inlineSource` (or an inline `<script data-markdown-v2-worker-source>` element) and never touches the hosted URL.\n */\n mode?: DefaultWorkerMode;\n /**\n * Hosted worker URL. Defaults to `/workers/markdown-worker.js` or whatever is declared via\n * `<script data-markdown-v2-worker-url=\"...\">`.\n */\n url?: string | URL;\n /**\n * Inline worker source (module string) used when `mode` is `blob` or `auto`.\n */\n inlineSource?: string;\n /**\n * Override the worker name (shows up in devtools).\n */\n name?: string;\n /**\n * Credentials to use when instantiating a hosted worker.\n */\n credentials?: WorkerOptions[\"credentials\"];\n}\n\nexport function createDefaultWorker(options: CreateDefaultWorkerOptions = {}): Worker | null {\n if (typeof window === \"undefined\" || typeof Worker === \"undefined\") {\n return null;\n }\n\n const mode = options.mode ?? \"auto\";\n const workerName = options.name ?? \"markdown-v2\";\n const workerOptions: WorkerOptions = {\n type: \"module\",\n name: workerName,\n credentials: options.credentials ?? \"same-origin\",\n };\n\n const inlineSource = resolveInlineSource(options.inlineSource);\n\n if ((mode === \"auto\" || mode === \"blob\") && inlineSource) {\n const blobWorker = instantiateBlobWorker(inlineSource, workerOptions);\n if (blobWorker) {\n return blobWorker;\n }\n if (mode === \"blob\") {\n return null;\n }\n } else if (mode === \"blob\") {\n console.warn(\"[markdown-v2] Blob worker requested but no inline source was provided.\");\n return null;\n }\n\n const hostedUrl = resolveHostedUrl(options.url);\n try {\n return new Worker(hostedUrl, workerOptions);\n } catch (error) {\n console.error(\"[markdown-v2] Unable to instantiate hosted worker:\", error);\n return null;\n }\n}\n\nexport function releaseDefaultWorker(worker: Worker | null | undefined): void {\n if (!worker) return;\n const blobUrl = BLOB_REGISTRY.get(worker);\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n BLOB_REGISTRY.delete(worker);\n }\n}\n\nfunction instantiateBlobWorker(source: string, workerOptions: WorkerOptions): Worker | null {\n try {\n const blob = new Blob([source], { type: \"text/javascript\" });\n const blobUrl = URL.createObjectURL(blob);\n const worker = new Worker(blobUrl, workerOptions);\n BLOB_REGISTRY.set(worker, blobUrl);\n return worker;\n } catch (error) {\n console.warn(\"[markdown-v2] Failed to instantiate blob worker:\", error);\n return null;\n }\n}\n\nfunction resolveHostedUrl(explicit?: string | URL): string | URL {\n if (explicit) {\n return explicit;\n }\n if (typeof document !== \"undefined\") {\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-url]');\n if (script?.dataset?.markdownV2WorkerUrl) {\n return script.dataset.markdownV2WorkerUrl;\n }\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"markdown-v2:worker\"]');\n if (meta?.content) {\n return meta.content;\n }\n }\n return DEFAULT_WORKER_PATH;\n}\n\nfunction resolveInlineSource(explicit?: string): string | undefined {\n if (typeof explicit === \"string\" && explicit.trim().length > 0) {\n return explicit;\n }\n if (typeof document === \"undefined\") {\n return undefined;\n }\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-source]');\n const text = script?.textContent;\n return text && text.trim().length > 0 ? text : undefined;\n}\n","// V2 Worker Client for Markdown Renderer\n// Similar interface to the V1 streaming worker client\n\nimport type { WorkerIn, WorkerOut } from \"@stream-mdx/core\";\nimport { createDefaultWorker, releaseDefaultWorker, type CreateDefaultWorkerOptions } from \"./create-default-worker\";\n\nexport interface MarkdownWorkerClientOptions {\n worker?: Worker | (() => Worker);\n workerUrl?: string | URL;\n name?: string;\n defaultWorker?: CreateDefaultWorkerOptions;\n}\n\nexport class MarkdownWorkerClient {\n private worker?: Worker;\n private readonly ownsWorker: boolean;\n private listeners = new Set<(msg: WorkerOut) => void>();\n private messageListener?: (event: MessageEvent<WorkerOut>) => void;\n private errorListener?: (event: ErrorEvent) => void;\n private messageErrorListener?: (event: MessageEvent<unknown>) => void;\n private cleanupCallbacks: Array<() => void> = [];\n\n constructor(options: MarkdownWorkerClientOptions = {}) {\n let owned = false;\n if (typeof window !== \"undefined\" && typeof Worker !== \"undefined\") {\n try {\n const worker = this.createWorkerInstance(options);\n if (worker) {\n owned = !options.worker;\n this.worker = worker;\n this.messageListener = (ev: MessageEvent<WorkerOut>) => {\n for (const listener of this.listeners) {\n listener(ev.data);\n }\n };\n this.errorListener = (error: Event) => {\n if (error instanceof ErrorEvent) {\n const stack = error.error && typeof error.error === \"object\" ? (error.error as Error).stack : undefined;\n console.error(\"V2 Markdown Worker error:\", error.message, \"at\", error.filename, `${error.lineno}:${error.colno}`, stack ?? \"<no-stack>\");\n } else {\n console.error(\"V2 Markdown Worker error:\", error);\n }\n };\n this.messageErrorListener = (event: MessageEvent<unknown>) => {\n console.error(\"V2 Markdown Worker message error:\", event.data);\n };\n this.worker.addEventListener(\"message\", this.messageListener);\n this.worker.addEventListener(\"error\", this.errorListener);\n this.worker.addEventListener(\"messageerror\", this.messageErrorListener);\n }\n } catch (error) {\n console.warn(\"Failed to create V2 Markdown Worker:\", error);\n }\n }\n this.ownsWorker = owned;\n }\n\n private createWorkerInstance(options: MarkdownWorkerClientOptions): Worker | undefined {\n const { worker, workerUrl, name, defaultWorker } = options;\n try {\n if (worker) {\n return typeof worker === \"function\" ? worker() : worker;\n }\n const auto = createDefaultWorker({\n ...defaultWorker,\n url: workerUrl ?? defaultWorker?.url,\n name: name ?? defaultWorker?.name,\n });\n if (auto) {\n this.cleanupCallbacks.push(() => releaseDefaultWorker(auto));\n return auto;\n }\n const script = workerUrl ?? \"/workers/markdown-worker.js\";\n return new Worker(script instanceof URL ? script : script, { type: \"module\", name: name ?? \"markdown-v2\" });\n } catch (error) {\n console.warn(\"Unable to instantiate markdown worker:\", error);\n return undefined;\n }\n }\n\n onMessage(cb: (msg: WorkerOut) => void) {\n this.listeners.add(cb);\n return () => this.listeners.delete(cb);\n }\n\n init(\n initialContent?: string,\n prewarmLangs?: string[],\n docPlugins?: { footnotes?: boolean; html?: boolean; mdx?: boolean; tables?: boolean; callouts?: boolean },\n mdxOptions?: { compileMode?: \"server\" | \"worker\" },\n ) {\n this.post({\n type: \"INIT\",\n initialContent,\n prewarmLangs,\n docPlugins,\n mdx: mdxOptions,\n } as WorkerIn);\n }\n\n append(text: string) {\n this.post({ type: \"APPEND\", text });\n }\n\n finalize() {\n this.post({ type: \"FINALIZE\" } as WorkerIn);\n }\n\n setCredits(credits: number) {\n const value = Math.max(0, Math.min(1, credits));\n this.post({ type: \"SET_CREDITS\", credits: value } as WorkerIn);\n }\n\n setMdxCompiled(blockId: string, compiledId: string) {\n this.post({ type: \"MDX_COMPILED\", blockId, compiledId } as WorkerIn);\n }\n\n setMdxError(blockId: string, error?: string) {\n this.post({ type: \"MDX_ERROR\", blockId, error } as WorkerIn);\n }\n\n terminate(options: { force?: boolean } = {}) {\n if (this.worker) {\n if (this.messageListener) {\n this.worker.removeEventListener(\"message\", this.messageListener);\n }\n if (this.errorListener) {\n this.worker.removeEventListener(\"error\", this.errorListener);\n }\n if (this.messageErrorListener) {\n this.worker.removeEventListener(\"messageerror\", this.messageErrorListener);\n }\n const shouldTerminate = options.force ?? this.ownsWorker;\n if (shouldTerminate && typeof this.worker.terminate === \"function\") {\n this.worker.terminate();\n }\n }\n this.worker = undefined;\n this.messageListener = undefined;\n this.errorListener = undefined;\n this.messageErrorListener = undefined;\n this.listeners.clear();\n if (this.cleanupCallbacks.length > 0) {\n for (const cleanup of this.cleanupCallbacks.splice(0, this.cleanupCallbacks.length)) {\n try {\n cleanup();\n } catch (error) {\n console.warn(\"Failed to clean up worker resources\", error);\n }\n }\n }\n }\n\n getWorker(): Worker | undefined {\n return this.worker;\n }\n\n private post(msg: WorkerIn) {\n if (this.worker) {\n this.worker.postMessage(msg);\n } else {\n console.warn(\"V2 Markdown Worker not available\");\n }\n }\n}\n"],"mappings":"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","names":[]}
|