Path: blob/main/src/vs/workbench/api/node/extHostConsoleForwarder.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 { AbstractExtHostConsoleForwarder } from '../common/extHostConsoleForwarder.js';6import { IExtHostInitDataService } from '../common/extHostInitDataService.js';7import { IExtHostRpcService } from '../common/extHostRpcService.js';8import { NativeLogMarkers } from '../../services/extensions/common/extensionHostProtocol.js';910const MAX_STREAM_BUFFER_LENGTH = 1024 * 1024;1112export class ExtHostConsoleForwarder extends AbstractExtHostConsoleForwarder {1314private _isMakingConsoleCall: boolean = false;1516constructor(17@IExtHostRpcService extHostRpc: IExtHostRpcService,18@IExtHostInitDataService initData: IExtHostInitDataService,19) {20super(extHostRpc, initData);2122this._wrapStream('stderr', 'error');23this._wrapStream('stdout', 'log');24}2526protected override _nativeConsoleLogMessage(method: 'log' | 'info' | 'warn' | 'error' | 'debug', original: (...args: any[]) => void, args: IArguments) {27const stream = method === 'error' || method === 'warn' ? process.stderr : process.stdout;28this._isMakingConsoleCall = true;29stream.write(`\n${NativeLogMarkers.Start}\n`);30original.apply(console, args as any);31stream.write(`\n${NativeLogMarkers.End}\n`);32this._isMakingConsoleCall = false;33}3435/**36* Wraps process.stderr/stdout.write() so that it is transmitted to the37* renderer or CLI. It both calls through to the original method as well38* as to console.log with complete lines so that they're made available39* to the debugger/CLI.40*/41private _wrapStream(streamName: 'stdout' | 'stderr', severity: 'log' | 'warn' | 'error') {42const stream = process[streamName];43const original = stream.write;4445let buf = '';4647Object.defineProperty(stream, 'write', {48set: () => { },49get: () => (chunk: Uint8Array | string, encoding?: BufferEncoding, callback?: (err?: Error) => void) => {50if (!this._isMakingConsoleCall) {51buf += (chunk as any).toString(encoding);52const eol = buf.length > MAX_STREAM_BUFFER_LENGTH ? buf.length : buf.lastIndexOf('\n');53if (eol !== -1) {54console[severity](buf.slice(0, eol));55buf = buf.slice(eol + 1);56}57}5859original.call(stream, chunk, encoding, callback);60},61});62}63}646566