From 53b22edff3ea72bc8c5d21da7837b52be8674862 Mon Sep 17 00:00:00 2001 From: Error Date: Sun, 26 Jul 2026 12:35:54 +0800 Subject: [PATCH] refine public HTML artifacts package --- .github/workflows/publish-self-hosted.yml | 62 +++ .github/workflows/publish.yml | 2 +- README.zh-CN.md | 10 +- dist/browser.d.ts | 73 +++- dist/browser.d.ts.map | 2 +- dist/browser.js | 466 +++++++++++--------- dist/browser.js.map | 2 +- dist/protocol.d.ts | 28 ++ dist/protocol.d.ts.map | 2 +- dist/protocol.js | 50 +++ dist/protocol.js.map | 2 +- docs/api.zh-CN.md | 151 +++++++ package-lock.json | 4 +- package.json | 16 +- scripts/check-package-contract.mjs | 161 +++++++ src/browser.ts | 510 +++++++++++++--------- src/protocol.ts | 72 +++ tests/browser.test.mjs | 34 +- tests/protocol.test.mjs | 30 ++ 19 files changed, 1227 insertions(+), 450 deletions(-) create mode 100644 .github/workflows/publish-self-hosted.yml create mode 100644 docs/api.zh-CN.md create mode 100644 scripts/check-package-contract.mjs diff --git a/.github/workflows/publish-self-hosted.yml b/.github/workflows/publish-self-hosted.yml new file mode 100644 index 0000000..1561938 --- /dev/null +++ b/.github/workflows/publish-self-hosted.yml @@ -0,0 +1,62 @@ +name: Publish package (self-hosted fallback) + +on: + workflow_dispatch: + inputs: + release_tag: + description: Existing v-prefixed tag matching package.json + required: true + type: string + source_sha: + description: Exact 40-character source commit SHA to publish + required: true + type: string + +permissions: + contents: read + packages: write + +jobs: + npm: + runs-on: [self-hosted, macOS, ARM64, velaros-package-publish] + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ inputs.source_sha }} + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + registry-url: https://npm.pkg.github.com + scope: '@velaros-ai' + - name: Verify immutable release source + env: + RELEASE_TAG: ${{ inputs.release_tag }} + SOURCE_SHA: ${{ inputs.source_sha }} + run: | + test "$(git rev-parse HEAD)" = "$SOURCE_SHA" + test "$(git rev-parse "${RELEASE_TAG}^{commit}")" = "$SOURCE_SHA" + - run: npm ci + - run: npm run check + - id: release + name: Build the immutable release bundle + env: + RELEASE_TAG: ${{ inputs.release_tag }} + SOURCE_SHA: ${{ inputs.source_sha }} + run: | + node scripts/prepare-release.mjs \ + --tag "$RELEASE_TAG" \ + --source-sha "$SOURCE_SHA" \ + --out-dir release \ + --require-tag + echo "tarball=$(node -p 'require("./release/release-manifest.json").tarball.fileName')" >> "$GITHUB_OUTPUT" + - uses: actions/upload-artifact@v4 + with: + name: html-artifacts-${{ inputs.release_tag }}-${{ inputs.source_sha }} + path: release/ + if-no-files-found: error + retention-days: 90 + - run: npm publish "./release/${{ steps.release.outputs.tarball }}" --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3fb46fa..bc450b7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -57,6 +57,6 @@ jobs: path: release/ if-no-files-found: error retention-days: 90 - - run: npm publish "./release/${{ steps.release.outputs.tarball }}" --access restricted + - run: npm publish "./release/${{ steps.release.outputs.tarball }}" --access public env: NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.zh-CN.md b/README.zh-CN.md index a229e1f..134eaff 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -6,6 +6,9 @@ VelarOS HTML Artifacts 是一个零运行时依赖的浏览器库。它统一负 [English](./README.md) +完整的中文公共接口、生命周期、依赖注入与扩展约定见 +[中文 API 文档](./docs/api.zh-CN.md)。 + ## 安装 为 GitHub Packages 的私有 `@velaros-ai` scope 配置 npm 认证后安装: @@ -118,14 +121,13 @@ v1 协议保持有意的小规模: ## 高级 API -绝大多数应用只需要从包根入口使用 `mountHtmlArtifact()`。需要自定义宿主时,再使用下面两个底层入口: +绝大多数应用只需要从包根入口使用 `mountHtmlArtifact()` 或 +`HtmlArtifactRuntime`。需要自定义宿主时,再使用下面的稳定子路径: ```ts // 与渲染器无关的增量协议解析器。 import { - applyHtmlArtifactProtocolChunk, - createHtmlArtifactProtocolStreamState, - finalizeHtmlArtifactProtocol, + HtmlArtifactProtocolParser, } from '@velaros-ai/html-artifacts/protocol' // iframe 文档、高度适配与 URL 安全原语。 diff --git a/dist/browser.d.ts b/dist/browser.d.ts index 8581ac3..5c57f0a 100644 --- a/dist/browser.d.ts +++ b/dist/browser.d.ts @@ -7,6 +7,19 @@ export interface HtmlArtifactHostError { patchId?: string; patchType?: string; } +/** + * Browser operations used by the artifact runtime. + * + * Applications can provide an implementation for alternate DOM hosts, tests, or embedded + * webviews without patching browser globals. + */ +export interface HtmlArtifactBrowserEnvironment { + createBridgeId(): string; + createIframe(): HTMLIFrameElement; + addMessageListener(listener: (event: MessageEvent) => void): void; + removeMessageListener(listener: (event: MessageEvent) => void): void; + scrollBy(deltaX: number, deltaY: number): void; +} export interface MountHtmlArtifactOptions { /** Accessible title applied to the generated iframe. */ title?: string; @@ -28,6 +41,8 @@ export interface MountHtmlArtifactOptions { protocolLimits?: HtmlArtifactProtocolLimits; /** URL protocols handed to `onLink`. Defaults to HTTP and HTTPS. */ allowedLinkProtocols?: readonly string[]; + /** Browser boundary used to create the iframe and subscribe to messages. */ + environment?: HtmlArtifactBrowserEnvironment; onMarkdown?: (text: string) => void; onPrompt?: (prompt: string) => void; onLink?: (url: string) => void; @@ -48,10 +63,62 @@ export interface HtmlArtifactController { dispose(): void; } /** - * Mount one streaming HTML artifact surface into a DOM element. + * Default DOM implementation used by {@link HtmlArtifactRuntime}. * - * The controller owns protocol parsing, iframe creation, sandbox transport, height negotiation, - * action validation, and cleanup. Callers only feed model text and handle explicit capabilities. + * Keeping browser access behind this object makes runtime ownership explicit and lets other + * applications adapt the library to webviews or test environments. + */ +export declare class DomHtmlArtifactEnvironment implements HtmlArtifactBrowserEnvironment { + private readonly browserWindow; + private readonly browserDocument; + private fallbackId; + constructor(browserWindow?: Window, browserDocument?: Document); + createBridgeId(): string; + createIframe(): HTMLIFrameElement; + addMessageListener(listener: (event: MessageEvent) => void): void; + removeMessageListener(listener: (event: MessageEvent) => void): void; + scrollBy(deltaX: number, deltaY: number): void; +} +/** + * Owns one artifact parser, iframe transport, host callbacks, and their complete lifecycle. + */ +export declare class HtmlArtifactRuntime implements HtmlArtifactController { + private readonly options; + readonly iframe: HTMLIFrameElement; + readonly ready: Promise; + private readonly environment; + private readonly minHeight; + private readonly maxHeight; + private readonly initialHeight; + private readonly parser; + private bridgeMessages; + private latestArtifactId; + private disposed; + private consuming; + private frameReady; + private settleReady; + private readonly pendingMessages; + constructor(target: HTMLElement, options?: MountHtmlArtifactOptions); + readonly write: (chunk: string) => HtmlArtifactProtocolEvent[]; + readonly finish: () => HtmlArtifactProtocolEvent[]; + readonly consume: (chunks: AsyncIterable | Iterable) => Promise; + readonly getSnapshot: (artifactId?: string) => HtmlArtifactSnapshot | null; + readonly reset: () => void; + readonly dispose: () => void; + private configureIframe; + private createBridgeMessages; + private createShellDocument; + private reportError; + private invoke; + private assertActive; + private post; + private dispatch; + private applyReportedHeight; + private readonly handleMessage; + private readonly handleLoad; +} +/** + * Compatibility factory for applications that prefer a function entry point. */ export declare function mountHtmlArtifact(target: HTMLElement, options?: MountHtmlArtifactOptions): HtmlArtifactController; //# sourceMappingURL=browser.d.ts.map \ No newline at end of file diff --git a/dist/browser.d.ts.map b/dist/browser.d.ts.map index cafbe07..a479394 100644 --- a/dist/browser.d.ts.map +++ b/dist/browser.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAE/B,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAA;AAStB,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;AAErF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,0BAA0B,CAAA;IACjC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,cAAc,CAAC,EAAE,0BAA0B,CAAA;IAC3C,oEAAoE;IACpE,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAClD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAA;IACpD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAA;CACjD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAClC,gGAAgG;IAChG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC1C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,yBAAyB,EAAE,CAAA;IACjD,MAAM,IAAI,yBAAyB,EAAE,CAAA;IACrC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAA;IAC/F,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAA;IAC7D,KAAK,IAAI,IAAI,CAAA;IACb,OAAO,IAAI,IAAI,CAAA;CAChB;AA6CD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,wBAA6B,GACrC,sBAAsB,CA6PxB"} \ No newline at end of file +{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/browser.js b/dist/browser.js index ed814a0..234d346 100644 --- a/dist/browser.js +++ b/dist/browser.js @@ -1,26 +1,40 @@ -import { applyHtmlArtifactProtocolChunk, createHtmlArtifactProtocolStreamState, DEFAULT_HTML_ARTIFACT_HEIGHT, finalizeHtmlArtifactProtocol, } from './protocol.js'; +import { DEFAULT_HTML_ARTIFACT_HEIGHT, HtmlArtifactProtocolParser, } from './protocol.js'; import { normalizeHtmlArtifactExternalUrl } from './security.js'; import { buildHtmlArtifactShellDocument, DEFAULT_HTML_ARTIFACT_MAX_REPORTED_HEIGHT, HTML_ARTIFACT_WHEEL_MESSAGE_TYPE, } from './shell.js'; -let nextBridgeId = 0; -function createBridgeId() { - const cryptoApi = globalThis.crypto; - if (cryptoApi && typeof cryptoApi.randomUUID === 'function') { - return cryptoApi.randomUUID(); +/** + * Default DOM implementation used by {@link HtmlArtifactRuntime}. + * + * Keeping browser access behind this object makes runtime ownership explicit and lets other + * applications adapt the library to webviews or test environments. + */ +export class DomHtmlArtifactEnvironment { + browserWindow; + browserDocument; + fallbackId = 0; + constructor(browserWindow = window, browserDocument = document) { + this.browserWindow = browserWindow; + this.browserDocument = browserDocument; + } + createBridgeId() { + const cryptoApi = globalThis.crypto; + if (cryptoApi && typeof cryptoApi.randomUUID === 'function') { + return cryptoApi.randomUUID(); + } + this.fallbackId += 1; + return `${Date.now().toString(36)}-${this.fallbackId.toString(36)}`; + } + createIframe() { + return this.browserDocument.createElement('iframe'); + } + addMessageListener(listener) { + this.browserWindow.addEventListener('message', listener); + } + removeMessageListener(listener) { + this.browserWindow.removeEventListener('message', listener); + } + scrollBy(deltaX, deltaY) { + this.browserWindow.scrollBy({ left: deltaX, top: deltaY }); } - nextBridgeId += 1; - return `${Date.now().toString(36)}-${nextBridgeId.toString(36)}`; -} -function createBridgeMessages() { - const prefix = `velaros:html-artifact:${createBridgeId()}`; - return { - render: `${prefix}:render`, - patch: `${prefix}:patch`, - resize: `${prefix}:resize`, - sendPrompt: `${prefix}:prompt`, - openLink: `${prefix}:link`, - generic: `${prefix}:message`, - error: `${prefix}:error`, - }; } function normalizeDimension(value, fallback) { return typeof value === 'number' && Number.isFinite(value) && value > 0 @@ -37,255 +51,279 @@ function readString(value) { return typeof value === 'string' ? value : ''; } /** - * Mount one streaming HTML artifact surface into a DOM element. - * - * The controller owns protocol parsing, iframe creation, sandbox transport, height negotiation, - * action validation, and cleanup. Callers only feed model text and handle explicit capabilities. + * Owns one artifact parser, iframe transport, host callbacks, and their complete lifecycle. */ -export function mountHtmlArtifact(target, options = {}) { - if (!target || typeof target.replaceChildren !== 'function') { - throw new TypeError('mountHtmlArtifact target must be an HTMLElement'); +export class HtmlArtifactRuntime { + options; + iframe; + ready; + environment; + minHeight; + maxHeight; + initialHeight; + parser; + bridgeMessages; + latestArtifactId = null; + disposed = false; + consuming = false; + frameReady = false; + settleReady = () => undefined; + pendingMessages = []; + constructor(target, options = {}) { + this.options = options; + if (!target || typeof target.replaceChildren !== 'function') { + throw new TypeError('HtmlArtifactRuntime target must be an HTMLElement'); + } + this.environment = options.environment ?? new DomHtmlArtifactEnvironment(); + this.minHeight = normalizeDimension(options.minHeight, 1); + this.maxHeight = Math.max(this.minHeight, normalizeDimension(options.maxHeight, DEFAULT_HTML_ARTIFACT_MAX_REPORTED_HEIGHT)); + this.initialHeight = Math.min(this.maxHeight, Math.max(this.minHeight, normalizeDimension(options.initialHeight, DEFAULT_HTML_ARTIFACT_HEIGHT))); + this.parser = new HtmlArtifactProtocolParser({ + enabled: true, + limits: options.protocolLimits, + }); + this.bridgeMessages = this.createBridgeMessages(); + this.iframe = this.environment.createIframe(); + this.ready = new Promise((resolve) => { + this.settleReady = resolve; + }); + this.configureIframe(); + this.environment.addMessageListener(this.handleMessage); + target.replaceChildren(this.iframe); } - const minHeight = normalizeDimension(options.minHeight, 1); - const maxHeight = Math.max(minHeight, normalizeDimension(options.maxHeight, DEFAULT_HTML_ARTIFACT_MAX_REPORTED_HEIGHT)); - const initialHeight = Math.min(maxHeight, Math.max(minHeight, normalizeDimension(options.initialHeight, DEFAULT_HTML_ARTIFACT_HEIGHT))); - let bridgeMessages = createBridgeMessages(); - const iframe = document.createElement('iframe'); - let shellDocument = createShellDocument(bridgeMessages); - let state = createHtmlArtifactProtocolStreamState({ - enabled: true, - limits: options.protocolLimits, - }); - let latestArtifactId = null; - let disposed = false; - let consuming = false; - let frameReady = false; - let settleReady = () => undefined; - const pendingMessages = []; - const ready = new Promise((resolve) => { - settleReady = resolve; - }); - function createShellDocument(messages) { + write = (chunk) => { + this.assertActive(); + return this.dispatch(this.parser.write(chunk)); + }; + finish = () => { + this.assertActive(); + return this.dispatch(this.parser.finish()); + }; + consume = async (chunks) => { + this.assertActive(); + if (this.consuming) + throw new Error('HTML artifact runtime is already consuming a stream'); + this.consuming = true; + try { + for await (const chunk of chunks) { + this.write(chunk); + } + this.finish(); + return this.getSnapshot(); + } + finally { + this.consuming = false; + } + }; + getSnapshot = (artifactId = this.latestArtifactId ?? '') => { + return this.parser.getSnapshot(artifactId); + }; + reset = () => { + this.assertActive(); + this.parser.reset(); + this.latestArtifactId = null; + this.pendingMessages.length = 0; + this.frameReady = false; + this.bridgeMessages = this.createBridgeMessages(); + this.iframe.style.height = `${this.initialHeight}px`; + this.iframe.addEventListener('load', this.handleLoad, { once: true }); + // Assigning a new shell removes scripts, styles, timers, observers, and listeners while + // retaining the iframe identity expected by the host application. + this.iframe.srcdoc = this.createShellDocument(); + }; + dispose = () => { + if (this.disposed) + return; + this.disposed = true; + this.consuming = false; + this.pendingMessages.length = 0; + this.iframe.removeEventListener('load', this.handleLoad); + this.environment.removeMessageListener(this.handleMessage); + this.iframe.remove(); + this.settleReady(this.iframe); + }; + configureIframe() { + this.iframe.title = this.options.title ?? 'HTML artifact preview'; + if (this.options.className) + this.iframe.className = this.options.className; + this.iframe.setAttribute('sandbox', this.options.sandbox ?? 'allow-scripts'); + this.iframe.referrerPolicy = 'no-referrer'; + this.iframe.style.display = 'block'; + this.iframe.style.width = '100%'; + this.iframe.style.height = `${this.initialHeight}px`; + this.iframe.style.border = '0'; + this.iframe.addEventListener('load', this.handleLoad, { once: true }); + this.iframe.srcdoc = this.createShellDocument(); + } + createBridgeMessages() { + const prefix = `velaros:html-artifact:${this.environment.createBridgeId()}`; + return { + render: `${prefix}:render`, + patch: `${prefix}:patch`, + resize: `${prefix}:resize`, + sendPrompt: `${prefix}:prompt`, + openLink: `${prefix}:link`, + generic: `${prefix}:message`, + error: `${prefix}:error`, + }; + } + createShellDocument() { return buildHtmlArtifactShellDocument({ - bridgeMessages: messages, - designCss: options.designCss, - maxReportedHeight: maxHeight, - rootId: options.rootId, + bridgeMessages: this.bridgeMessages, + designCss: this.options.designCss, + maxReportedHeight: this.maxHeight, + rootId: this.options.rootId, }); } - function reportError(error) { + reportError(error) { try { - options.onError?.(error); + this.options.onError?.(error); } catch { // Error callbacks are an application boundary and must not destabilize the stream runtime. } } - function invoke(callback, callbackName, ...args) { + invoke(callback, callbackName, ...args) { if (!callback) return; try { callback(...args); } catch (cause) { - reportError({ + this.reportError({ phase: 'host', message: `${callbackName} callback failed`, cause, }); } } - function assertActive() { - if (disposed) - throw new Error('HTML artifact controller has been disposed'); + assertActive() { + if (this.disposed) + throw new Error('HTML artifact runtime has been disposed'); } - function post(payload) { - if (!frameReady) { - pendingMessages.push(payload); + post(payload) { + if (!this.frameReady) { + this.pendingMessages.push(payload); return; } - const frameWindow = iframe.contentWindow; + const frameWindow = this.iframe.contentWindow; if (!frameWindow) { - reportError({ phase: 'host', message: 'HTML artifact iframe is not available' }); + this.reportError({ phase: 'host', message: 'HTML artifact iframe is not available' }); return; } frameWindow.postMessage(payload, '*'); } - function dispatch(events) { + dispatch(events) { for (const event of events) { - if (event.type === 'markdown') { - invoke(options.onMarkdown, 'onMarkdown', event.text); - } - else if (event.type === 'artifact-open') { - latestArtifactId = event.artifact.id; - } - else if (event.type === 'artifact-update') { - latestArtifactId = event.artifact.id; - post({ type: bridgeMessages.render, html: event.html, patches: [] }); - } - else if (event.type === 'artifact-patch') { - latestArtifactId = event.artifact.id; - post({ type: bridgeMessages.patch, patches: [event.patch] }); + switch (event.type) { + case 'markdown': + this.invoke(this.options.onMarkdown, 'onMarkdown', event.text); + break; + case 'artifact-open': + this.latestArtifactId = event.artifact.id; + break; + case 'artifact-update': + this.latestArtifactId = event.artifact.id; + this.post({ type: this.bridgeMessages.render, html: event.html, patches: [] }); + break; + case 'artifact-patch': + this.latestArtifactId = event.artifact.id; + this.post({ type: this.bridgeMessages.patch, patches: [event.patch] }); + break; + case 'artifact-diagnostic': + this.reportError({ + phase: 'protocol', + message: event.diagnostic.message, + patchId: event.diagnostic.patchId, + patchType: event.diagnostic.patchType, + }); + break; + case 'artifact-close': + this.latestArtifactId = event.artifact.id; + break; } - else if (event.type === 'artifact-diagnostic') { - reportError({ - phase: 'protocol', - message: event.diagnostic.message, - patchId: event.diagnostic.patchId, - patchType: event.diagnostic.patchType, - }); - } - else if (event.type === 'artifact-close') { - latestArtifactId = event.artifact.id; - } - invoke(options.onEvent, 'onEvent', event); + this.invoke(this.options.onEvent, 'onEvent', event); } return events; } - function getSnapshot(artifactId = latestArtifactId ?? '') { - const snapshot = state.artifactsById[artifactId]; - return snapshot ? { ...snapshot } : null; - } - function applyReportedHeight(payload) { + applyReportedHeight(payload) { const candidate = Number(payload.naturalHeight ?? payload.height); if (!Number.isFinite(candidate) || candidate <= 0) return; - const height = Math.min(maxHeight, Math.max(minHeight, Math.ceil(candidate))); - if (Math.round(iframe.getBoundingClientRect().height) !== height) { - iframe.style.height = `${height}px`; + const height = Math.min(this.maxHeight, Math.max(this.minHeight, Math.ceil(candidate))); + if (Math.round(this.iframe.getBoundingClientRect().height) !== height) { + this.iframe.style.height = `${height}px`; } } - function handleMessage(event) { - if (disposed) + handleMessage = (event) => { + if (this.disposed) return; const payload = readMessagePayload(event.data); if (!payload) return; - const frameWindow = iframe.contentWindow; + const frameWindow = this.iframe.contentWindow; if (!frameWindow || event.source !== frameWindow) return; - if (payload.type === bridgeMessages.resize) { - applyReportedHeight(payload); - } - else if (payload.type === bridgeMessages.sendPrompt) { - invoke(options.onPrompt, 'onPrompt', readString(payload.prompt)); - } - else if (payload.type === bridgeMessages.openLink) { - const url = normalizeHtmlArtifactExternalUrl(payload.url, { - allowedProtocols: options.allowedLinkProtocols, - }); - if (url) { - invoke(options.onLink, 'onLink', url); - } - else { - reportError({ phase: 'security', message: 'Blocked an invalid artifact URL' }); - } - } - else if (payload.type === bridgeMessages.generic) { - invoke(options.onMessage, 'onMessage', payload.payload); - } - else if (payload.type === bridgeMessages.error) { - reportError({ - phase: 'runtime', - message: readString(payload.message) || 'Artifact runtime error', - patchId: readString(payload.patchId) || undefined, - patchType: readString(payload.patchType) || undefined, - }); - } - else if (payload.type === HTML_ARTIFACT_WHEEL_MESSAGE_TYPE) { - const deltaX = Number(payload.deltaX) || 0; - const deltaY = Number(payload.deltaY) || 0; - if (options.onWheel) { - invoke(options.onWheel, 'onWheel', deltaX, deltaY); + switch (payload.type) { + case this.bridgeMessages.resize: + this.applyReportedHeight(payload); + break; + case this.bridgeMessages.sendPrompt: + this.invoke(this.options.onPrompt, 'onPrompt', readString(payload.prompt)); + break; + case this.bridgeMessages.openLink: { + const url = normalizeHtmlArtifactExternalUrl(payload.url, { + allowedProtocols: this.options.allowedLinkProtocols, + }); + if (url) { + this.invoke(this.options.onLink, 'onLink', url); + } + else { + this.reportError({ phase: 'security', message: 'Blocked an invalid artifact URL' }); + } + break; } - else { - window.scrollBy({ left: deltaX, top: deltaY }); + case this.bridgeMessages.generic: + this.invoke(this.options.onMessage, 'onMessage', payload.payload); + break; + case this.bridgeMessages.error: + this.reportError({ + phase: 'runtime', + message: readString(payload.message) || 'Artifact runtime error', + patchId: readString(payload.patchId) || undefined, + patchType: readString(payload.patchType) || undefined, + }); + break; + case HTML_ARTIFACT_WHEEL_MESSAGE_TYPE: { + const deltaX = Number(payload.deltaX) || 0; + const deltaY = Number(payload.deltaY) || 0; + if (this.options.onWheel) { + this.invoke(this.options.onWheel, 'onWheel', deltaX, deltaY); + } + else { + this.environment.scrollBy(deltaX, deltaY); + } + break; } } - } - function handleLoad() { - if (disposed) + }; + handleLoad = () => { + if (this.disposed) return; - frameReady = true; - const frameWindow = iframe.contentWindow; + this.frameReady = true; + const frameWindow = this.iframe.contentWindow; if (frameWindow) { - for (const payload of pendingMessages.splice(0)) { + for (const payload of this.pendingMessages.splice(0)) { frameWindow.postMessage(payload, '*'); } } - settleReady(iframe); - } - iframe.title = options.title ?? 'HTML artifact preview'; - if (options.className) - iframe.className = options.className; - iframe.setAttribute('sandbox', options.sandbox ?? 'allow-scripts'); - iframe.referrerPolicy = 'no-referrer'; - iframe.style.display = 'block'; - iframe.style.width = '100%'; - iframe.style.height = `${initialHeight}px`; - iframe.style.border = '0'; - iframe.addEventListener('load', handleLoad, { once: true }); - iframe.srcdoc = shellDocument; - window.addEventListener('message', handleMessage); - target.replaceChildren(iframe); - function write(chunk) { - assertActive(); - return dispatch(applyHtmlArtifactProtocolChunk(state, chunk)); - } - function finish() { - assertActive(); - return dispatch(finalizeHtmlArtifactProtocol(state)); - } - return { - iframe, - ready, - write, - finish, - async consume(chunks) { - assertActive(); - if (consuming) - throw new Error('HTML artifact controller is already consuming a stream'); - consuming = true; - try { - for await (const chunk of chunks) { - write(chunk); - } - finish(); - return getSnapshot(); - } - finally { - consuming = false; - } - }, - getSnapshot, - reset() { - assertActive(); - state = createHtmlArtifactProtocolStreamState({ - enabled: true, - limits: options.protocolLimits, - }); - latestArtifactId = null; - pendingMessages.length = 0; - frameReady = false; - bridgeMessages = createBridgeMessages(); - shellDocument = createShellDocument(bridgeMessages); - iframe.style.height = `${initialHeight}px`; - iframe.addEventListener('load', handleLoad, { once: true }); - // Reloading the same shell keeps the iframe element stable while removing prior document - // scripts, styles, timers, observers, and event listeners before the next artifact stream. - iframe.srcdoc = shellDocument; - }, - dispose() { - if (disposed) - return; - disposed = true; - consuming = false; - pendingMessages.length = 0; - iframe.removeEventListener('load', handleLoad); - window.removeEventListener('message', handleMessage); - iframe.remove(); - settleReady(iframe); - }, + this.settleReady(this.iframe); }; } +/** + * Compatibility factory for applications that prefer a function entry point. + */ +export function mountHtmlArtifact(target, options = {}) { + return new HtmlArtifactRuntime(target, options); +} //# sourceMappingURL=browser.js.map \ No newline at end of file diff --git a/dist/browser.js.map b/dist/browser.js.map index fb730dd..35ce944 100644 --- a/dist/browser.js.map +++ b/dist/browser.js.map @@ -1 +1 @@ -{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/protocol.d.ts b/dist/protocol.d.ts index 7c94c9c..ca3a4f0 100644 --- a/dist/protocol.d.ts +++ b/dist/protocol.d.ts @@ -70,6 +70,34 @@ export interface HtmlArtifactProtocolStreamOptions { initialArtifacts?: HtmlArtifactSnapshot[]; limits?: HtmlArtifactProtocolLimits; } +export interface HtmlArtifactProtocolStateSnapshot { + readonly enabled: boolean; + readonly mode: HtmlArtifactProtocolMode; + readonly buffer: string; + readonly activeArtifact: Readonly | null; + readonly activeAction: (Readonly> & { + readonly emittedDiagnostics: readonly string[]; + }) | null; + readonly artifactsById: Readonly>>; + readonly anonymousArtifactCounter: number; + readonly limits: Readonly>; +} +/** + * Stateful incremental parser for the HTML Artifact protocol. + * + * The class is the preferred API for long-lived streams. The standalone functions below remain + * available for consumers that intentionally manage and persist the protocol state themselves. + */ +export declare class HtmlArtifactProtocolParser { + private readonly options; + private currentState; + constructor(options?: HtmlArtifactProtocolStreamOptions); + get state(): HtmlArtifactProtocolStateSnapshot; + write(chunk: string): HtmlArtifactProtocolEvent[]; + finish(): HtmlArtifactProtocolEvent[]; + getSnapshot(artifactId: string): HtmlArtifactSnapshot | null; + reset(): void; +} export type HtmlArtifactProtocolEvent = { type: 'markdown'; text: string; diff --git a/dist/protocol.d.ts.map b/dist/protocol.d.ts.map index 42beee5..ae73d7a 100644 --- a/dist/protocol.d.ts.map +++ b/dist/protocol.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/protocol.js b/dist/protocol.js index 2b088c6..d7aee21 100644 --- a/dist/protocol.js +++ b/dist/protocol.js @@ -29,6 +29,56 @@ const VOID_HTML_TAGS = new Set([ 'track', 'wbr', ]); +/** + * Stateful incremental parser for the HTML Artifact protocol. + * + * The class is the preferred API for long-lived streams. The standalone functions below remain + * available for consumers that intentionally manage and persist the protocol state themselves. + */ +export class HtmlArtifactProtocolParser { + options; + currentState; + constructor(options = {}) { + this.options = options; + this.currentState = createHtmlArtifactProtocolStreamState(options); + } + get state() { + const artifactsById = Object.fromEntries(Object.entries(this.currentState.artifactsById).map(([id, artifact]) => [ + id, + Object.freeze({ ...artifact }), + ])); + const activeAction = this.currentState.activeAction + ? Object.freeze({ + ...this.currentState.activeAction, + emittedDiagnostics: Object.freeze([ + ...this.currentState.activeAction.emittedDiagnostics, + ]), + }) + : null; + return Object.freeze({ + ...this.currentState, + activeArtifact: this.currentState.activeArtifact + ? Object.freeze({ ...this.currentState.activeArtifact }) + : null, + activeAction, + artifactsById: Object.freeze(artifactsById), + limits: Object.freeze({ ...this.currentState.limits }), + }); + } + write(chunk) { + return applyHtmlArtifactProtocolChunk(this.currentState, chunk); + } + finish() { + return finalizeHtmlArtifactProtocol(this.currentState); + } + getSnapshot(artifactId) { + const snapshot = this.currentState.artifactsById[artifactId]; + return snapshot ? { ...snapshot } : null; + } + reset() { + this.currentState = createHtmlArtifactProtocolStreamState(this.options); + } +} export function createHtmlArtifactProtocolStreamState(options = {}) { const artifactsById = {}; const limits = resolveProtocolLimits(options.limits); diff --git a/dist/protocol.js.map b/dist/protocol.js.map index e4350cc..b08cc74 100644 --- a/dist/protocol.js.map +++ b/dist/protocol.js.map @@ -1 +1 @@ -{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/docs/api.zh-CN.md b/docs/api.zh-CN.md new file mode 100644 index 0000000..7fe1cbe --- /dev/null +++ b/docs/api.zh-CN.md @@ -0,0 +1,151 @@ +# `@velaros-ai/html-artifacts` 中文 API + +## 定位与非目标 + +本包提供框架无关的流式 HTML Artifact 协议、受控 iframe 运行时和安全原语。它可以接入任意 +`Iterable` 或 `AsyncIterable` 模型输出,不依赖 React、Electron、VelarOS +Kernel、特定模型 SDK 或产品状态。 + +本包不负责模型调用、聊天记录、权限决策、用户身份、业务组件和宿主导航。Artifact 请求继续生成、 +打开链接或发送自定义消息时,宿主必须通过显式回调决定是否执行。 + +## 安装 + +```bash +npm install @velaros-ai/html-artifacts +``` + +运行环境需要 Node.js 20 以上用于构建;浏览器运行时需要标准 DOM、iframe 和 +`postMessage` 能力。包本身没有运行时依赖。 + +## 公共入口 + +| 入口 | 用途 | +| --- | --- | +| `@velaros-ai/html-artifacts` | 浏览器运行时、协议和沙箱公共 API | +| `@velaros-ai/html-artifacts/browser` | 只引入浏览器 Runtime 与宿主接口 | +| `@velaros-ai/html-artifacts/protocol` | 不依赖 DOM 的增量协议解析 | +| `@velaros-ai/html-artifacts/sandbox` | iframe Shell、尺寸和 URL 安全原语 | +| `@velaros-ai/html-artifacts/runtime` | `sandbox` 的兼容别名,新代码不建议使用 | + +## 核心类与接口 + +### `HtmlArtifactRuntime` + +`HtmlArtifactRuntime` 实现 `HtmlArtifactController`,独占一个解析器、iframe、消息队列和监听器: + +```ts +const runtime = new HtmlArtifactRuntime(container, { + maxHeight: 720, + onPrompt: (prompt) => model.continue(prompt), + onLink: (url) => navigation.open(url), +}) + +await runtime.consume(model.stream()) +runtime.dispose() +``` + +`mountHtmlArtifact(target, options)` 是保留给函数式接入方式的兼容工厂,等价于创建 +`HtmlArtifactRuntime`。 + +### `HtmlArtifactProtocolParser` + +该类拥有一次增量解析会话的全部可变状态: + +```ts +const parser = new HtmlArtifactProtocolParser({ enabled: true }) +const events = parser.write(chunk) +const tailEvents = parser.finish() +const snapshot = parser.getSnapshot('artifact-id') +parser.reset() +``` + +需要自己持久化或迁移状态的高级宿主仍可使用 +`createHtmlArtifactProtocolStreamState()`、`applyHtmlArtifactProtocolChunk()` 和 +`finalizeHtmlArtifactProtocol()`。 + +### `HtmlArtifactBrowserEnvironment` + +该接口隔离 iframe 创建、消息订阅、滚动和桥接 ID 生成。默认实现 +`DomHtmlArtifactEnvironment` 使用当前 `window` 与 `document`。WebView、测试 DOM 或多窗口应用 +可以注入自己的实现,无需修改全局对象。 + +## 生命周期/并发 + +一个 Runtime 同一时刻只允许一个 `consume()`。已有流未结束时再次调用会抛出错误。手动 +`write()`/`finish()` 的调用顺序由宿主负责。 + +- `ready`:首次 iframe Shell 加载并冲刷消息队列后完成。 +- `reset()`:保留 iframe 节点,重建解析状态、消息命名空间和 Shell 文档。 +- `dispose()`:幂等;移除 iframe、窗口消息监听器和待发送消息。 +- `dispose()` 后调用写入、结束或重置方法会抛出错误。 + +## 依赖注入 + +浏览器边界通过 `MountHtmlArtifactOptions.environment` 注入: + +```ts +const runtime = new HtmlArtifactRuntime(container, { + environment: { + createBridgeId: () => crypto.randomUUID(), + createIframe: () => webviewDocument.createElement('iframe'), + addMessageListener: (listener) => hostMessages.subscribe(listener), + removeMessageListener: (listener) => hostMessages.unsubscribe(listener), + scrollBy: (x, y) => viewport.scrollBy(x, y), + }, +}) +``` + +模型、导航、日志和业务行为通过回调注入。本包不会读取应用单例或 VelarOS 私有状态。 + +## 错误模型 + +`onError` 接收 `HtmlArtifactHostError`,`phase` 明确错误边界: + +- `host`:宿主回调或 iframe 可用性错误。 +- `protocol`:协议诊断。 +- `runtime`:iframe 内执行错误。 +- `security`:URL 等不可信输入被拒绝。 + +宿主回调抛出的异常会转成 `host` 错误,不会中断解析器。未提供 `onError` 时错误不会跨越宿主边界 +抛出;非法生命周期调用仍会直接抛出。 + +## 最小第三方示例 + +```ts +import { HtmlArtifactRuntime } from '@velaros-ai/html-artifacts/browser' + +const target = document.querySelector('#artifact') +if (!target) throw new Error('Missing artifact target') + +const runtime = new HtmlArtifactRuntime(target, { + title: 'AI generated preview', + allowedLinkProtocols: ['https:'], + onLink: (url) => window.open(url, '_blank', 'noopener,noreferrer'), +}) + +try { + await runtime.consume(fetchModelChunks()) +} finally { + runtime.dispose() +} +``` + +## 扩展点 + +- 用 `HtmlArtifactBrowserEnvironment` 适配不同浏览器或 WebView 宿主。 +- 用 `onEvent` 把协议事件接入日志、调试器或遥测系统。 +- 用 `designCss` 提供产品中立的基础设计令牌。 +- 用 `protocolLimits` 限制缓冲、HTML、协议文本和 Patch 载荷。 +- 直接组合 `protocol` 与 `sandbox` 子路径可实现非默认渲染器。 + +纯尺寸、URL 校验和协议解析算法保留为函数;只有拥有状态和生命周期的解析会话与浏览器运行时使用 +类,避免无意义的对象包装。 + +## 兼容策略 + +- 已发布的 `mountHtmlArtifact()` 和底层协议函数继续保留。 +- 新的类 API 与函数 API 使用相同事件、快照和限制类型,不做重复 DTO 转换。 +- `runtime` 子路径暂时作为 `sandbox` 的兼容别名;新接入应使用语义明确的 `browser` 或 + `sandbox`。 +- 公共 API 的破坏性变更只在主版本升级时进行。 diff --git a/package-lock.json b/package-lock.json index 512fb3f..7708c4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@velaros-ai/html-artifacts", - "version": "0.1.1", + "version": "0.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@velaros-ai/html-artifacts", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT", "devDependencies": { "typescript": "^5.7.0", diff --git a/package.json b/package.json index c7f33dd..b2ef918 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@velaros-ai/html-artifacts", - "version": "0.1.1", - "description": "A streaming HTML artifact protocol and sandboxed iframe runtime extracted from VelarOS.", + "version": "0.1.2", + "description": "A framework-neutral streaming HTML artifact protocol and sandboxed iframe runtime.", "keywords": [ "ai", "artifact", @@ -32,6 +32,10 @@ "types": "./dist/protocol.d.ts", "import": "./dist/protocol.js" }, + "./browser": { + "types": "./dist/browser.d.ts", + "import": "./dist/browser.js" + }, "./sandbox": { "types": "./dist/sandbox.d.ts", "import": "./dist/sandbox.js" @@ -45,7 +49,8 @@ "dist", "LICENSE", "README.md", - "README.zh-CN.md" + "README.zh-CN.md", + "docs" ], "scripts": { "clean": "node scripts/clean.mjs", @@ -55,7 +60,8 @@ "demo": "npm run build && vite demo", "demo:build": "npm run build && vite build demo --outDir ../demo-dist --emptyOutDir", "check:dist": "npm run build && node scripts/check-dist.mjs", - "check": "npm run typecheck && npm test && npm run demo:build && npm run check:dist && npm pack --dry-run", + "check:package-contract": "npm run build && node scripts/check-package-contract.mjs", + "check": "npm run typecheck && npm test && npm run demo:build && npm run check:package-contract && npm run check:dist", "release:dry-run": "npm run check && node scripts/prepare-release.mjs --dry-run", "prepack": "npm run build" }, @@ -67,7 +73,7 @@ "node": ">=20" }, "publishConfig": { - "access": "restricted", + "access": "public", "registry": "https://npm.pkg.github.com" } } diff --git a/scripts/check-package-contract.mjs b/scripts/check-package-contract.mjs new file mode 100644 index 0000000..6c6f019 --- /dev/null +++ b/scripts/check-package-contract.mjs @@ -0,0 +1,161 @@ +import { spawnSync } from 'node:child_process' +import { access, mkdtemp, readFile, readdir, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') +const manifest = JSON.parse(await readFile(path.join(repositoryRoot, 'package.json'), 'utf8')) +const documentation = await readFile( + path.join(repositoryRoot, 'docs/api.zh-CN.md'), + 'utf8' +) +const requiredDocumentSections = [ + '定位与非目标', + '安装', + '公共入口', + '核心类与接口', + '生命周期/并发', + '依赖注入', + '错误模型', + '最小第三方示例', + '扩展点', + '兼容策略', +] + +for (const field of ['description', 'license', 'repository']) { + if (!manifest[field]) throw new Error(`${manifest.name} is missing package.json#${field}`) +} +if (!manifest.engines?.node) throw new Error(`${manifest.name} is missing a Node.js engine range`) +if (manifest.sideEffects === undefined) throw new Error(`${manifest.name} must declare sideEffects`) +if (!manifest.files?.includes('docs')) throw new Error(`${manifest.name} does not publish docs`) +for (const section of requiredDocumentSections) { + if (!documentation.includes(`## ${section}`)) { + throw new Error(`${manifest.name} API documentation is missing "${section}"`) + } +} + +for (const [publicPath, declaration] of Object.entries(manifest.exports ?? {})) { + for (const target of readExportTargets(declaration)) { + try { + await access(path.join(repositoryRoot, target)) + } catch { + throw new Error(`${manifest.name} export ${publicPath} points to missing ${target}`) + } + } +} + +const temporaryDirectory = await mkdtemp(path.join(tmpdir(), 'velaros-html-consumer-')) +try { + capture( + 'npm', + ['pack', '--json', '--ignore-scripts', '--pack-destination', temporaryDirectory], + repositoryRoot + ) + const tarballs = (await readdir(temporaryDirectory)).filter((file) => file.endsWith('.tgz')) + if (tarballs.length !== 1) { + throw new Error(`${manifest.name} produced ${tarballs.length} tarballs`) + } + const tarball = path.join(temporaryDirectory, tarballs[0]) + await writeFile( + path.join(temporaryDirectory, 'package.json'), + JSON.stringify({ private: true, type: 'module' }) + ) + await writeFile( + path.join(temporaryDirectory, 'consumer.mjs'), + Object.keys(manifest.exports) + .map((publicPath, index) => { + const specifier = + publicPath === '.' ? manifest.name : `${manifest.name}/${publicPath.slice(2)}` + return `import * as entry${index} from ${JSON.stringify(specifier)}\nvoid entry${index}\n` + }) + .join('') + ) + await writeFile( + path.join(temporaryDirectory, 'consumer.ts'), + Object.keys(manifest.exports) + .map((publicPath, index) => { + const specifier = + publicPath === '.' ? manifest.name : `${manifest.name}/${publicPath.slice(2)}` + return `import * as Entry${index} from ${JSON.stringify(specifier)}\nvoid Entry${index}\n` + }) + .join('') + ) + await writeFile( + path.join(temporaryDirectory, 'tsconfig.json'), + JSON.stringify({ + compilerOptions: { + lib: ['ES2023', 'DOM', 'DOM.Iterable'], + module: 'NodeNext', + moduleResolution: 'NodeNext', + noEmit: true, + skipLibCheck: false, + strict: true, + target: 'ES2023', + }, + files: ['./consumer.ts'], + }) + ) + + capture( + 'npm', + ['install', '--ignore-scripts', '--no-audit', '--no-fund', '--no-package-lock', tarball], + temporaryDirectory + ) + capture(process.execPath, ['./consumer.mjs'], temporaryDirectory) + capture( + process.execPath, + [path.join(repositoryRoot, 'node_modules/typescript/bin/tsc'), '-p', 'tsconfig.json'], + temporaryDirectory + ) + + const packedManifest = JSON.parse( + await readFile( + path.join(temporaryDirectory, 'node_modules', ...manifest.name.split('/'), 'package.json'), + 'utf8' + ) + ) + for (const requiredFile of [ + 'README.md', + 'README.zh-CN.md', + 'docs/api.zh-CN.md', + ]) { + await access( + path.join( + temporaryDirectory, + 'node_modules', + ...manifest.name.split('/'), + requiredFile + ) + ) + } + if (packedManifest.version !== manifest.version) { + throw new Error(`${manifest.name} packed version does not match source manifest`) + } +} finally { + await rm(temporaryDirectory, { recursive: true, force: true }) +} + +console.info( + 'HTML Artifacts package contract: metadata, exports, docs, runtime imports, and strict external types are valid.' +) + +function readExportTargets(declaration) { + if (typeof declaration === 'string') return [declaration] + if (!declaration || typeof declaration !== 'object') return [] + return Object.values(declaration).filter((value) => typeof value === 'string') +} + +function capture(command, args, cwd) { + const result = spawnSync(command, args, { + cwd, + encoding: 'utf8', + env: process.env, + }) + if (result.status !== 0) { + throw new Error( + `${command} ${args.join(' ')} failed:\n${result.stdout || ''}\n${result.stderr || ''}` + ) + } + return result.stdout.trim() +} diff --git a/src/browser.ts b/src/browser.ts index f91f3bf..0c78afc 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -1,11 +1,8 @@ import { - applyHtmlArtifactProtocolChunk, - createHtmlArtifactProtocolStreamState, DEFAULT_HTML_ARTIFACT_HEIGHT, - finalizeHtmlArtifactProtocol, + HtmlArtifactProtocolParser, type HtmlArtifactProtocolEvent, type HtmlArtifactProtocolLimits, - type HtmlArtifactProtocolStreamState, type HtmlArtifactSnapshot, } from './protocol.js' import { normalizeHtmlArtifactExternalUrl } from './security.js' @@ -26,6 +23,20 @@ export interface HtmlArtifactHostError { patchType?: string } +/** + * Browser operations used by the artifact runtime. + * + * Applications can provide an implementation for alternate DOM hosts, tests, or embedded + * webviews without patching browser globals. + */ +export interface HtmlArtifactBrowserEnvironment { + createBridgeId(): string + createIframe(): HTMLIFrameElement + addMessageListener(listener: (event: MessageEvent) => void): void + removeMessageListener(listener: (event: MessageEvent) => void): void + scrollBy(deltaX: number, deltaY: number): void +} + export interface MountHtmlArtifactOptions { /** Accessible title applied to the generated iframe. */ title?: string @@ -47,6 +58,8 @@ export interface MountHtmlArtifactOptions { protocolLimits?: HtmlArtifactProtocolLimits /** URL protocols handed to `onLink`. Defaults to HTTP and HTTPS. */ allowedLinkProtocols?: readonly string[] + /** Browser boundary used to create the iframe and subscribe to messages. */ + environment?: HtmlArtifactBrowserEnvironment onMarkdown?: (text: string) => void onPrompt?: (prompt: string) => void onLink?: (url: string) => void @@ -70,28 +83,44 @@ export interface HtmlArtifactController { type MessagePayload = Record & { type: string } -let nextBridgeId = 0 +/** + * Default DOM implementation used by {@link HtmlArtifactRuntime}. + * + * Keeping browser access behind this object makes runtime ownership explicit and lets other + * applications adapt the library to webviews or test environments. + */ +export class DomHtmlArtifactEnvironment implements HtmlArtifactBrowserEnvironment { + private fallbackId = 0 + + constructor( + private readonly browserWindow: Window = window, + private readonly browserDocument: Document = document + ) {} + + createBridgeId(): string { + const cryptoApi = globalThis.crypto + if (cryptoApi && typeof cryptoApi.randomUUID === 'function') { + return cryptoApi.randomUUID() + } -function createBridgeId(): string { - const cryptoApi = globalThis.crypto - if (cryptoApi && typeof cryptoApi.randomUUID === 'function') { - return cryptoApi.randomUUID() + this.fallbackId += 1 + return `${Date.now().toString(36)}-${this.fallbackId.toString(36)}` } - nextBridgeId += 1 - return `${Date.now().toString(36)}-${nextBridgeId.toString(36)}` -} + createIframe(): HTMLIFrameElement { + return this.browserDocument.createElement('iframe') + } + + addMessageListener(listener: (event: MessageEvent) => void): void { + this.browserWindow.addEventListener('message', listener) + } + + removeMessageListener(listener: (event: MessageEvent) => void): void { + this.browserWindow.removeEventListener('message', listener) + } -function createBridgeMessages(): HtmlArtifactBridgeMessages { - const prefix = `velaros:html-artifact:${createBridgeId()}` - return { - render: `${prefix}:render`, - patch: `${prefix}:patch`, - resize: `${prefix}:resize`, - sendPrompt: `${prefix}:prompt`, - openLink: `${prefix}:link`, - generic: `${prefix}:message`, - error: `${prefix}:error`, + scrollBy(deltaX: number, deltaY: number): void { + this.browserWindow.scrollBy({ left: deltaX, top: deltaY }) } } @@ -112,64 +141,165 @@ function readString(value: unknown): string { } /** - * Mount one streaming HTML artifact surface into a DOM element. - * - * The controller owns protocol parsing, iframe creation, sandbox transport, height negotiation, - * action validation, and cleanup. Callers only feed model text and handle explicit capabilities. + * Owns one artifact parser, iframe transport, host callbacks, and their complete lifecycle. */ -export function mountHtmlArtifact( - target: HTMLElement, - options: MountHtmlArtifactOptions = {} -): HtmlArtifactController { - if (!target || typeof target.replaceChildren !== 'function') { - throw new TypeError('mountHtmlArtifact target must be an HTMLElement') +export class HtmlArtifactRuntime implements HtmlArtifactController { + readonly iframe: HTMLIFrameElement + readonly ready: Promise + + private readonly environment: HtmlArtifactBrowserEnvironment + private readonly minHeight: number + private readonly maxHeight: number + private readonly initialHeight: number + private readonly parser: HtmlArtifactProtocolParser + private bridgeMessages: HtmlArtifactBridgeMessages + private latestArtifactId: string | null = null + private disposed = false + private consuming = false + private frameReady = false + private settleReady: (frame: HTMLIFrameElement) => void = () => undefined + private readonly pendingMessages: MessagePayload[] = [] + + constructor( + target: HTMLElement, + private readonly options: MountHtmlArtifactOptions = {} + ) { + if (!target || typeof target.replaceChildren !== 'function') { + throw new TypeError('HtmlArtifactRuntime target must be an HTMLElement') + } + + this.environment = options.environment ?? new DomHtmlArtifactEnvironment() + this.minHeight = normalizeDimension(options.minHeight, 1) + this.maxHeight = Math.max( + this.minHeight, + normalizeDimension(options.maxHeight, DEFAULT_HTML_ARTIFACT_MAX_REPORTED_HEIGHT) + ) + this.initialHeight = Math.min( + this.maxHeight, + Math.max( + this.minHeight, + normalizeDimension(options.initialHeight, DEFAULT_HTML_ARTIFACT_HEIGHT) + ) + ) + this.parser = new HtmlArtifactProtocolParser({ + enabled: true, + limits: options.protocolLimits, + }) + this.bridgeMessages = this.createBridgeMessages() + this.iframe = this.environment.createIframe() + this.ready = new Promise((resolve) => { + this.settleReady = resolve + }) + + this.configureIframe() + this.environment.addMessageListener(this.handleMessage) + target.replaceChildren(this.iframe) + } + + readonly write = (chunk: string): HtmlArtifactProtocolEvent[] => { + this.assertActive() + return this.dispatch(this.parser.write(chunk)) + } + + readonly finish = (): HtmlArtifactProtocolEvent[] => { + this.assertActive() + return this.dispatch(this.parser.finish()) + } + + readonly consume = async ( + chunks: AsyncIterable | Iterable + ): Promise => { + this.assertActive() + if (this.consuming) throw new Error('HTML artifact runtime is already consuming a stream') + + this.consuming = true + try { + for await (const chunk of chunks) { + this.write(chunk) + } + this.finish() + return this.getSnapshot() + } finally { + this.consuming = false + } } - const minHeight = normalizeDimension(options.minHeight, 1) - const maxHeight = Math.max( - minHeight, - normalizeDimension(options.maxHeight, DEFAULT_HTML_ARTIFACT_MAX_REPORTED_HEIGHT) - ) - const initialHeight = Math.min( - maxHeight, - Math.max(minHeight, normalizeDimension(options.initialHeight, DEFAULT_HTML_ARTIFACT_HEIGHT)) - ) - let bridgeMessages = createBridgeMessages() - const iframe = document.createElement('iframe') - let shellDocument = createShellDocument(bridgeMessages) - let state: HtmlArtifactProtocolStreamState = createHtmlArtifactProtocolStreamState({ - enabled: true, - limits: options.protocolLimits, - }) - let latestArtifactId: string | null = null - let disposed = false - let consuming = false - let frameReady = false - let settleReady: (frame: HTMLIFrameElement) => void = () => undefined - const pendingMessages: MessagePayload[] = [] - - const ready = new Promise((resolve) => { - settleReady = resolve - }) - - function createShellDocument(messages: HtmlArtifactBridgeMessages): string { + readonly getSnapshot = ( + artifactId = this.latestArtifactId ?? '' + ): HtmlArtifactSnapshot | null => { + return this.parser.getSnapshot(artifactId) + } + + readonly reset = (): void => { + this.assertActive() + this.parser.reset() + this.latestArtifactId = null + this.pendingMessages.length = 0 + this.frameReady = false + this.bridgeMessages = this.createBridgeMessages() + this.iframe.style.height = `${this.initialHeight}px` + this.iframe.addEventListener('load', this.handleLoad, { once: true }) + // Assigning a new shell removes scripts, styles, timers, observers, and listeners while + // retaining the iframe identity expected by the host application. + this.iframe.srcdoc = this.createShellDocument() + } + + readonly dispose = (): void => { + if (this.disposed) return + + this.disposed = true + this.consuming = false + this.pendingMessages.length = 0 + this.iframe.removeEventListener('load', this.handleLoad) + this.environment.removeMessageListener(this.handleMessage) + this.iframe.remove() + this.settleReady(this.iframe) + } + + private configureIframe(): void { + this.iframe.title = this.options.title ?? 'HTML artifact preview' + if (this.options.className) this.iframe.className = this.options.className + this.iframe.setAttribute('sandbox', this.options.sandbox ?? 'allow-scripts') + this.iframe.referrerPolicy = 'no-referrer' + this.iframe.style.display = 'block' + this.iframe.style.width = '100%' + this.iframe.style.height = `${this.initialHeight}px` + this.iframe.style.border = '0' + this.iframe.addEventListener('load', this.handleLoad, { once: true }) + this.iframe.srcdoc = this.createShellDocument() + } + + private createBridgeMessages(): HtmlArtifactBridgeMessages { + const prefix = `velaros:html-artifact:${this.environment.createBridgeId()}` + return { + render: `${prefix}:render`, + patch: `${prefix}:patch`, + resize: `${prefix}:resize`, + sendPrompt: `${prefix}:prompt`, + openLink: `${prefix}:link`, + generic: `${prefix}:message`, + error: `${prefix}:error`, + } + } + + private createShellDocument(): string { return buildHtmlArtifactShellDocument({ - bridgeMessages: messages, - designCss: options.designCss, - maxReportedHeight: maxHeight, - rootId: options.rootId, + bridgeMessages: this.bridgeMessages, + designCss: this.options.designCss, + maxReportedHeight: this.maxHeight, + rootId: this.options.rootId, }) } - function reportError(error: HtmlArtifactHostError): void { + private reportError(error: HtmlArtifactHostError): void { try { - options.onError?.(error) + this.options.onError?.(error) } catch { // Error callbacks are an application boundary and must not destabilize the stream runtime. } } - function invoke( + private invoke( callback: ((...args: T) => void) | undefined, callbackName: string, ...args: T @@ -178,7 +308,7 @@ export function mountHtmlArtifact( try { callback(...args) } catch (cause) { - reportError({ + this.reportError({ phase: 'host', message: `${callbackName} callback failed`, cause, @@ -186,191 +316,139 @@ export function mountHtmlArtifact( } } - function assertActive(): void { - if (disposed) throw new Error('HTML artifact controller has been disposed') + private assertActive(): void { + if (this.disposed) throw new Error('HTML artifact runtime has been disposed') } - function post(payload: MessagePayload): void { - if (!frameReady) { - pendingMessages.push(payload) + private post(payload: MessagePayload): void { + if (!this.frameReady) { + this.pendingMessages.push(payload) return } - const frameWindow = iframe.contentWindow + const frameWindow = this.iframe.contentWindow if (!frameWindow) { - reportError({ phase: 'host', message: 'HTML artifact iframe is not available' }) + this.reportError({ phase: 'host', message: 'HTML artifact iframe is not available' }) return } frameWindow.postMessage(payload, '*') } - function dispatch(events: HtmlArtifactProtocolEvent[]): HtmlArtifactProtocolEvent[] { + private dispatch(events: HtmlArtifactProtocolEvent[]): HtmlArtifactProtocolEvent[] { for (const event of events) { - if (event.type === 'markdown') { - invoke(options.onMarkdown, 'onMarkdown', event.text) - } else if (event.type === 'artifact-open') { - latestArtifactId = event.artifact.id - } else if (event.type === 'artifact-update') { - latestArtifactId = event.artifact.id - post({ type: bridgeMessages.render, html: event.html, patches: [] }) - } else if (event.type === 'artifact-patch') { - latestArtifactId = event.artifact.id - post({ type: bridgeMessages.patch, patches: [event.patch] }) - } else if (event.type === 'artifact-diagnostic') { - reportError({ - phase: 'protocol', - message: event.diagnostic.message, - patchId: event.diagnostic.patchId, - patchType: event.diagnostic.patchType, - }) - } else if (event.type === 'artifact-close') { - latestArtifactId = event.artifact.id + switch (event.type) { + case 'markdown': + this.invoke(this.options.onMarkdown, 'onMarkdown', event.text) + break + case 'artifact-open': + this.latestArtifactId = event.artifact.id + break + case 'artifact-update': + this.latestArtifactId = event.artifact.id + this.post({ type: this.bridgeMessages.render, html: event.html, patches: [] }) + break + case 'artifact-patch': + this.latestArtifactId = event.artifact.id + this.post({ type: this.bridgeMessages.patch, patches: [event.patch] }) + break + case 'artifact-diagnostic': + this.reportError({ + phase: 'protocol', + message: event.diagnostic.message, + patchId: event.diagnostic.patchId, + patchType: event.diagnostic.patchType, + }) + break + case 'artifact-close': + this.latestArtifactId = event.artifact.id + break } - invoke(options.onEvent, 'onEvent', event) + this.invoke(this.options.onEvent, 'onEvent', event) } return events } - function getSnapshot(artifactId = latestArtifactId ?? ''): HtmlArtifactSnapshot | null { - const snapshot = state.artifactsById[artifactId] - return snapshot ? { ...snapshot } : null - } - - function applyReportedHeight(payload: MessagePayload): void { + private applyReportedHeight(payload: MessagePayload): void { const candidate = Number(payload.naturalHeight ?? payload.height) if (!Number.isFinite(candidate) || candidate <= 0) return - const height = Math.min(maxHeight, Math.max(minHeight, Math.ceil(candidate))) - if (Math.round(iframe.getBoundingClientRect().height) !== height) { - iframe.style.height = `${height}px` + + const height = Math.min(this.maxHeight, Math.max(this.minHeight, Math.ceil(candidate))) + if (Math.round(this.iframe.getBoundingClientRect().height) !== height) { + this.iframe.style.height = `${height}px` } } - function handleMessage(event: MessageEvent): void { - if (disposed) return + private readonly handleMessage = (event: MessageEvent): void => { + if (this.disposed) return const payload = readMessagePayload(event.data) if (!payload) return - const frameWindow = iframe.contentWindow + const frameWindow = this.iframe.contentWindow if (!frameWindow || event.source !== frameWindow) return - if (payload.type === bridgeMessages.resize) { - applyReportedHeight(payload) - } else if (payload.type === bridgeMessages.sendPrompt) { - invoke(options.onPrompt, 'onPrompt', readString(payload.prompt)) - } else if (payload.type === bridgeMessages.openLink) { - const url = normalizeHtmlArtifactExternalUrl(payload.url, { - allowedProtocols: options.allowedLinkProtocols, - }) - if (url) { - invoke(options.onLink, 'onLink', url) - } else { - reportError({ phase: 'security', message: 'Blocked an invalid artifact URL' }) + switch (payload.type) { + case this.bridgeMessages.resize: + this.applyReportedHeight(payload) + break + case this.bridgeMessages.sendPrompt: + this.invoke(this.options.onPrompt, 'onPrompt', readString(payload.prompt)) + break + case this.bridgeMessages.openLink: { + const url = normalizeHtmlArtifactExternalUrl(payload.url, { + allowedProtocols: this.options.allowedLinkProtocols, + }) + if (url) { + this.invoke(this.options.onLink, 'onLink', url) + } else { + this.reportError({ phase: 'security', message: 'Blocked an invalid artifact URL' }) + } + break } - } else if (payload.type === bridgeMessages.generic) { - invoke(options.onMessage, 'onMessage', payload.payload) - } else if (payload.type === bridgeMessages.error) { - reportError({ - phase: 'runtime', - message: readString(payload.message) || 'Artifact runtime error', - patchId: readString(payload.patchId) || undefined, - patchType: readString(payload.patchType) || undefined, - }) - } else if (payload.type === HTML_ARTIFACT_WHEEL_MESSAGE_TYPE) { - const deltaX = Number(payload.deltaX) || 0 - const deltaY = Number(payload.deltaY) || 0 - if (options.onWheel) { - invoke(options.onWheel, 'onWheel', deltaX, deltaY) - } else { - window.scrollBy({ left: deltaX, top: deltaY }) + case this.bridgeMessages.generic: + this.invoke(this.options.onMessage, 'onMessage', payload.payload) + break + case this.bridgeMessages.error: + this.reportError({ + phase: 'runtime', + message: readString(payload.message) || 'Artifact runtime error', + patchId: readString(payload.patchId) || undefined, + patchType: readString(payload.patchType) || undefined, + }) + break + case HTML_ARTIFACT_WHEEL_MESSAGE_TYPE: { + const deltaX = Number(payload.deltaX) || 0 + const deltaY = Number(payload.deltaY) || 0 + if (this.options.onWheel) { + this.invoke(this.options.onWheel, 'onWheel', deltaX, deltaY) + } else { + this.environment.scrollBy(deltaX, deltaY) + } + break } } } - function handleLoad(): void { - if (disposed) return - frameReady = true - const frameWindow = iframe.contentWindow + private readonly handleLoad = (): void => { + if (this.disposed) return + this.frameReady = true + + const frameWindow = this.iframe.contentWindow if (frameWindow) { - for (const payload of pendingMessages.splice(0)) { + for (const payload of this.pendingMessages.splice(0)) { frameWindow.postMessage(payload, '*') } } - settleReady(iframe) - } - - iframe.title = options.title ?? 'HTML artifact preview' - if (options.className) iframe.className = options.className - iframe.setAttribute('sandbox', options.sandbox ?? 'allow-scripts') - iframe.referrerPolicy = 'no-referrer' - iframe.style.display = 'block' - iframe.style.width = '100%' - iframe.style.height = `${initialHeight}px` - iframe.style.border = '0' - iframe.addEventListener('load', handleLoad, { once: true }) - iframe.srcdoc = shellDocument - - window.addEventListener('message', handleMessage) - target.replaceChildren(iframe) - - function write(chunk: string): HtmlArtifactProtocolEvent[] { - assertActive() - return dispatch(applyHtmlArtifactProtocolChunk(state, chunk)) - } - - function finish(): HtmlArtifactProtocolEvent[] { - assertActive() - return dispatch(finalizeHtmlArtifactProtocol(state)) + this.settleReady(this.iframe) } +} - return { - iframe, - ready, - write, - finish, - async consume( - chunks: AsyncIterable | Iterable - ): Promise { - assertActive() - if (consuming) throw new Error('HTML artifact controller is already consuming a stream') - consuming = true - try { - for await (const chunk of chunks) { - write(chunk) - } - finish() - return getSnapshot() - } finally { - consuming = false - } - }, - getSnapshot, - reset(): void { - assertActive() - state = createHtmlArtifactProtocolStreamState({ - enabled: true, - limits: options.protocolLimits, - }) - latestArtifactId = null - pendingMessages.length = 0 - frameReady = false - bridgeMessages = createBridgeMessages() - shellDocument = createShellDocument(bridgeMessages) - iframe.style.height = `${initialHeight}px` - iframe.addEventListener('load', handleLoad, { once: true }) - // Reloading the same shell keeps the iframe element stable while removing prior document - // scripts, styles, timers, observers, and event listeners before the next artifact stream. - iframe.srcdoc = shellDocument - }, - dispose(): void { - if (disposed) return - disposed = true - consuming = false - pendingMessages.length = 0 - iframe.removeEventListener('load', handleLoad) - window.removeEventListener('message', handleMessage) - iframe.remove() - settleReady(iframe) - }, - } +/** + * Compatibility factory for applications that prefer a function entry point. + */ +export function mountHtmlArtifact( + target: HTMLElement, + options: MountHtmlArtifactOptions = {} +): HtmlArtifactController { + return new HtmlArtifactRuntime(target, options) } diff --git a/src/protocol.ts b/src/protocol.ts index 8557108..1894510 100644 --- a/src/protocol.ts +++ b/src/protocol.ts @@ -98,6 +98,78 @@ export interface HtmlArtifactProtocolStreamOptions { limits?: HtmlArtifactProtocolLimits } +export interface HtmlArtifactProtocolStateSnapshot { + readonly enabled: boolean + readonly mode: HtmlArtifactProtocolMode + readonly buffer: string + readonly activeArtifact: Readonly | null + readonly activeAction: + | (Readonly> & { + readonly emittedDiagnostics: readonly string[] + }) + | null + readonly artifactsById: Readonly>> + readonly anonymousArtifactCounter: number + readonly limits: Readonly> +} + +/** + * Stateful incremental parser for the HTML Artifact protocol. + * + * The class is the preferred API for long-lived streams. The standalone functions below remain + * available for consumers that intentionally manage and persist the protocol state themselves. + */ +export class HtmlArtifactProtocolParser { + private currentState: HtmlArtifactProtocolStreamState + + constructor(private readonly options: HtmlArtifactProtocolStreamOptions = {}) { + this.currentState = createHtmlArtifactProtocolStreamState(options) + } + + get state(): HtmlArtifactProtocolStateSnapshot { + const artifactsById = Object.fromEntries( + Object.entries(this.currentState.artifactsById).map(([id, artifact]) => [ + id, + Object.freeze({ ...artifact }), + ]) + ) + const activeAction = this.currentState.activeAction + ? Object.freeze({ + ...this.currentState.activeAction, + emittedDiagnostics: Object.freeze([ + ...this.currentState.activeAction.emittedDiagnostics, + ]), + }) + : null + return Object.freeze({ + ...this.currentState, + activeArtifact: this.currentState.activeArtifact + ? Object.freeze({ ...this.currentState.activeArtifact }) + : null, + activeAction, + artifactsById: Object.freeze(artifactsById), + limits: Object.freeze({ ...this.currentState.limits }), + }) + } + + write(chunk: string): HtmlArtifactProtocolEvent[] { + return applyHtmlArtifactProtocolChunk(this.currentState, chunk) + } + + finish(): HtmlArtifactProtocolEvent[] { + return finalizeHtmlArtifactProtocol(this.currentState) + } + + getSnapshot(artifactId: string): HtmlArtifactSnapshot | null { + const snapshot = this.currentState.artifactsById[artifactId] + return snapshot ? { ...snapshot } : null + } + + reset(): void { + this.currentState = createHtmlArtifactProtocolStreamState(this.options) + } +} + export type HtmlArtifactProtocolEvent = | { type: 'markdown'; text: string } | { type: 'artifact-open'; artifact: HtmlArtifactDescriptor; protocolText: string } diff --git a/tests/browser.test.mjs b/tests/browser.test.mjs index 405614d..2a66c56 100644 --- a/tests/browser.test.mjs +++ b/tests/browser.test.mjs @@ -1,7 +1,7 @@ import assert from 'node:assert/strict' import { describe, test } from 'node:test' -import { mountHtmlArtifact } from '../dist/index.js' +import { HtmlArtifactRuntime, mountHtmlArtifact } from '../dist/index.js' class FakeEventTarget { listeners = new Map() @@ -97,6 +97,38 @@ async function withFakeDom(run) { } describe('browser host', () => { + test('accepts an explicit browser environment and exposes the runtime class', async () => { + const document = new FakeDocument() + const window = new FakeWindow() + let nextId = 0 + const environment = { + createBridgeId: () => `test-${(nextId += 1)}`, + createIframe: () => document.createElement('iframe'), + addMessageListener: (listener) => window.addEventListener('message', listener), + removeMessageListener: (listener) => window.removeEventListener('message', listener), + scrollBy: (deltaX, deltaY) => window.scrollBy({ left: deltaX, top: deltaY }), + } + + const runtime = new HtmlArtifactRuntime(new FakeTarget(), { environment }) + assert.match(runtime.iframe.srcdoc, /velaros:html-artifact:test-1:render/) + runtime.reset() + assert.match(runtime.iframe.srcdoc, /velaros:html-artifact:test-2:render/) + runtime.dispose() + assert.equal(window.listeners.get('message')?.size ?? 0, 0) + }) + + test('keeps compatibility controller methods bound when destructured', async () => { + await withFakeDom(async () => { + const controller = mountHtmlArtifact(new FakeTarget()) + const { write, finish, reset, dispose } = controller + + assert.doesNotThrow(() => write('plain markdown')) + assert.doesNotThrow(() => finish()) + assert.doesNotThrow(() => reset()) + assert.doesNotThrow(() => dispose()) + }) + }) + test('owns streaming, sandbox transport, bounded sizing, callbacks, reset, and cleanup', async () => { await withFakeDom(async ({ document, window }) => { const prompts = [] diff --git a/tests/protocol.test.mjs b/tests/protocol.test.mjs index 7cde1c7..41f166f 100644 --- a/tests/protocol.test.mjs +++ b/tests/protocol.test.mjs @@ -5,6 +5,7 @@ import { applyHtmlArtifactProtocolChunk, createHtmlArtifactProtocolStreamState, finalizeHtmlArtifactProtocol, + HtmlArtifactProtocolParser, } from '../dist/protocol.js' function streamInChunks(source, chunkSize = 7) { @@ -20,6 +21,35 @@ function streamInChunks(source, chunkSize = 7) { } describe('HTML artifact protocol', () => { + test('offers an owned parser lifecycle without exposing mutable setup state', () => { + const parser = new HtmlArtifactProtocolParser({ enabled: true }) + + parser.write('') + parser.write('

Ready

') + parser.finish() + + assert.match(parser.getSnapshot('owned')?.html ?? '', /Ready/) + parser.reset() + assert.equal(parser.getSnapshot('owned'), null) + assert.equal(parser.state.mode, 'markdown') + }) + + test('returns an immutable parser state snapshot', () => { + const parser = new HtmlArtifactProtocolParser({ enabled: true }) + parser.write( + 'hello' + ) + const state = parser.state + + assert.throws(() => { + state.artifactsById.one = { id: 'two', title: 'Two', html: 'changed' } + }, TypeError) + assert.throws(() => { + state.limits.maxBufferLength = 1 + }, TypeError) + assert.equal(parser.getSnapshot('one')?.html, 'hello') + }) + test('parses a complete artifact across arbitrary chunk boundaries', () => { const source = [ '',