Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/log/electron-main/loggerService.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { ResourceMap } from '../../../base/common/map.js';
7
import { URI } from '../../../base/common/uri.js';
8
import { Event } from '../../../base/common/event.js';
9
import { refineServiceDecorator } from '../../instantiation/common/instantiation.js';
10
import { DidChangeLoggersEvent, ILogger, ILoggerOptions, ILoggerResource, ILoggerService, LogLevel, isLogLevel } from '../common/log.js';
11
import { LoggerService } from '../node/loggerService.js';
12
13
export const ILoggerMainService = refineServiceDecorator<ILoggerService, ILoggerMainService>(ILoggerService);
14
15
export interface ILoggerMainService extends ILoggerService {
16
17
getOnDidChangeLogLevelEvent(windowId: number): Event<LogLevel | [URI, LogLevel]>;
18
19
getOnDidChangeVisibilityEvent(windowId: number): Event<[URI, boolean]>;
20
21
getOnDidChangeLoggersEvent(windowId: number): Event<DidChangeLoggersEvent>;
22
23
createLogger(resource: URI, options?: ILoggerOptions, windowId?: number): ILogger;
24
25
createLogger(id: string, options?: Omit<ILoggerOptions, 'id'>, windowId?: number): ILogger;
26
27
registerLogger(resource: ILoggerResource, windowId?: number): void;
28
29
getGlobalLoggers(): ILoggerResource[];
30
31
deregisterLoggers(windowId: number): void;
32
33
}
34
35
export class LoggerMainService extends LoggerService implements ILoggerMainService {
36
37
private readonly loggerResourcesByWindow = new ResourceMap<number>();
38
39
override createLogger(idOrResource: URI | string, options?: ILoggerOptions, windowId?: number): ILogger {
40
if (windowId !== undefined) {
41
this.loggerResourcesByWindow.set(this.toResource(idOrResource), windowId);
42
}
43
try {
44
return super.createLogger(idOrResource, options);
45
} catch (error) {
46
this.loggerResourcesByWindow.delete(this.toResource(idOrResource));
47
throw error;
48
}
49
}
50
51
override registerLogger(resource: ILoggerResource, windowId?: number): void {
52
if (windowId !== undefined) {
53
this.loggerResourcesByWindow.set(resource.resource, windowId);
54
}
55
super.registerLogger(resource);
56
}
57
58
override deregisterLogger(resource: URI): void {
59
this.loggerResourcesByWindow.delete(resource);
60
super.deregisterLogger(resource);
61
}
62
63
getGlobalLoggers(): ILoggerResource[] {
64
const resources: ILoggerResource[] = [];
65
for (const resource of super.getRegisteredLoggers()) {
66
if (!this.loggerResourcesByWindow.has(resource.resource)) {
67
resources.push(resource);
68
}
69
}
70
return resources;
71
}
72
73
getOnDidChangeLogLevelEvent(windowId: number): Event<LogLevel | [URI, LogLevel]> {
74
return Event.filter(this.onDidChangeLogLevel, arg => isLogLevel(arg) || this.isInterestedLoggerResource(arg[0], windowId));
75
}
76
77
getOnDidChangeVisibilityEvent(windowId: number): Event<[URI, boolean]> {
78
return Event.filter(this.onDidChangeVisibility, ([resource]) => this.isInterestedLoggerResource(resource, windowId));
79
}
80
81
getOnDidChangeLoggersEvent(windowId: number): Event<DidChangeLoggersEvent> {
82
return Event.filter(
83
Event.map(this.onDidChangeLoggers, e => {
84
const r = {
85
added: [...e.added].filter(loggerResource => this.isInterestedLoggerResource(loggerResource.resource, windowId)),
86
removed: [...e.removed].filter(loggerResource => this.isInterestedLoggerResource(loggerResource.resource, windowId)),
87
};
88
return r;
89
}), e => e.added.length > 0 || e.removed.length > 0);
90
}
91
92
deregisterLoggers(windowId: number): void {
93
for (const [resource, resourceWindow] of this.loggerResourcesByWindow) {
94
if (resourceWindow === windowId) {
95
this.deregisterLogger(resource);
96
}
97
}
98
}
99
100
private isInterestedLoggerResource(resource: URI, windowId: number | undefined): boolean {
101
const loggerWindowId = this.loggerResourcesByWindow.get(resource);
102
return loggerWindowId === undefined || loggerWindowId === windowId;
103
}
104
105
override dispose(): void {
106
super.dispose();
107
this.loggerResourcesByWindow.clear();
108
}
109
}
110
111
112