Path: blob/main/src/vs/platform/log/electron-main/loggerService.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 { ResourceMap } from '../../../base/common/map.js';6import { URI } from '../../../base/common/uri.js';7import { Event } from '../../../base/common/event.js';8import { refineServiceDecorator } from '../../instantiation/common/instantiation.js';9import { DidChangeLoggersEvent, ILogger, ILoggerOptions, ILoggerResource, ILoggerService, LogLevel, isLogLevel } from '../common/log.js';10import { LoggerService } from '../node/loggerService.js';1112export const ILoggerMainService = refineServiceDecorator<ILoggerService, ILoggerMainService>(ILoggerService);1314export interface ILoggerMainService extends ILoggerService {1516getOnDidChangeLogLevelEvent(windowId: number): Event<LogLevel | [URI, LogLevel]>;1718getOnDidChangeVisibilityEvent(windowId: number): Event<[URI, boolean]>;1920getOnDidChangeLoggersEvent(windowId: number): Event<DidChangeLoggersEvent>;2122createLogger(resource: URI, options?: ILoggerOptions, windowId?: number): ILogger;2324createLogger(id: string, options?: Omit<ILoggerOptions, 'id'>, windowId?: number): ILogger;2526registerLogger(resource: ILoggerResource, windowId?: number): void;2728getGlobalLoggers(): ILoggerResource[];2930deregisterLoggers(windowId: number): void;3132}3334export class LoggerMainService extends LoggerService implements ILoggerMainService {3536private readonly loggerResourcesByWindow = new ResourceMap<number>();3738override createLogger(idOrResource: URI | string, options?: ILoggerOptions, windowId?: number): ILogger {39if (windowId !== undefined) {40this.loggerResourcesByWindow.set(this.toResource(idOrResource), windowId);41}42try {43return super.createLogger(idOrResource, options);44} catch (error) {45this.loggerResourcesByWindow.delete(this.toResource(idOrResource));46throw error;47}48}4950override registerLogger(resource: ILoggerResource, windowId?: number): void {51if (windowId !== undefined) {52this.loggerResourcesByWindow.set(resource.resource, windowId);53}54super.registerLogger(resource);55}5657override deregisterLogger(resource: URI): void {58this.loggerResourcesByWindow.delete(resource);59super.deregisterLogger(resource);60}6162getGlobalLoggers(): ILoggerResource[] {63const resources: ILoggerResource[] = [];64for (const resource of super.getRegisteredLoggers()) {65if (!this.loggerResourcesByWindow.has(resource.resource)) {66resources.push(resource);67}68}69return resources;70}7172getOnDidChangeLogLevelEvent(windowId: number): Event<LogLevel | [URI, LogLevel]> {73return Event.filter(this.onDidChangeLogLevel, arg => isLogLevel(arg) || this.isInterestedLoggerResource(arg[0], windowId));74}7576getOnDidChangeVisibilityEvent(windowId: number): Event<[URI, boolean]> {77return Event.filter(this.onDidChangeVisibility, ([resource]) => this.isInterestedLoggerResource(resource, windowId));78}7980getOnDidChangeLoggersEvent(windowId: number): Event<DidChangeLoggersEvent> {81return Event.filter(82Event.map(this.onDidChangeLoggers, e => {83const r = {84added: [...e.added].filter(loggerResource => this.isInterestedLoggerResource(loggerResource.resource, windowId)),85removed: [...e.removed].filter(loggerResource => this.isInterestedLoggerResource(loggerResource.resource, windowId)),86};87return r;88}), e => e.added.length > 0 || e.removed.length > 0);89}9091deregisterLoggers(windowId: number): void {92for (const [resource, resourceWindow] of this.loggerResourcesByWindow) {93if (resourceWindow === windowId) {94this.deregisterLogger(resource);95}96}97}9899private isInterestedLoggerResource(resource: URI, windowId: number | undefined): boolean {100const loggerWindowId = this.loggerResourcesByWindow.get(resource);101return loggerWindowId === undefined || loggerWindowId === windowId;102}103104override dispose(): void {105super.dispose();106this.loggerResourcesByWindow.clear();107}108}109110111112