Path: blob/main/src/vs/workbench/api/browser/mainThreadChatOutputRenderer.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { VSBuffer } from '../../../base/common/buffer.js';6import { Disposable, IDisposable } from '../../../base/common/lifecycle.js';7import { URI, UriComponents } from '../../../base/common/uri.js';8import { ExtensionIdentifier } from '../../../platform/extensions/common/extensions.js';9import { IChatOutputRendererService } from '../../contrib/chat/browser/chatOutputItemRenderer.js';10import { IExtHostContext } from '../../services/extensions/common/extHostCustomers.js';11import { ExtHostChatOutputRendererShape, ExtHostContext, MainThreadChatOutputRendererShape } from '../common/extHost.protocol.js';12import { MainThreadWebviews } from './mainThreadWebviews.js';1314export class MainThreadChatOutputRenderer extends Disposable implements MainThreadChatOutputRendererShape {1516private readonly _proxy: ExtHostChatOutputRendererShape;1718private _webviewHandlePool = 0;1920private readonly registeredRenderers = new Map</* viewType */ string, IDisposable>();2122constructor(23extHostContext: IExtHostContext,24private readonly _mainThreadWebview: MainThreadWebviews,25@IChatOutputRendererService private readonly _rendererService: IChatOutputRendererService,26) {27super();28this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostChatOutputRenderer);29}3031override dispose(): void {32super.dispose();3334this.registeredRenderers.forEach(disposable => disposable.dispose());35this.registeredRenderers.clear();36}3738$registerChatOutputRenderer(viewType: string, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): void {39this._rendererService.registerRenderer(viewType, {40renderOutputPart: async (mime, data, webview, token) => {41const webviewHandle = `chat-output-${++this._webviewHandlePool}`;4243this._mainThreadWebview.addWebview(webviewHandle, webview, {44serializeBuffersForPostMessage: true,45});4647this._proxy.$renderChatOutput(viewType, mime, VSBuffer.wrap(data), webviewHandle, token);48},49}, {50extension: { id: extensionId, location: URI.revive(extensionLocation) }51});52}5354$unregisterChatOutputRenderer(viewType: string): void {55this.registeredRenderers.get(viewType)?.dispose();56}57}585960