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 * as nls from '../../../nls.js';
7
>
import * as path from '../../../base/common/path.js';
8
>
import * as performance from '../../../base/common/performance.js';
9
>
import { originalFSPath, joinPath, extUriBiasedIgnorePathCase } from '../../../base/common/resources.js';
10
>
import { asPromise, Barrier, IntervalTimer, timeout } from '../../../base/common/async.js';
11
>
import { dispose, toDisposable, Disposable, DisposableStore, IDisposable } from '../../../base/common/lifecycle.js';
12
>
import { TernarySearchTree } from '../../../base/common/ternarySearchTree.js';
13
>
import { URI, UriComponents } from '../../../base/common/uri.js';
14
>
import { ILogService } from '../../../platform/log/common/log.js';
15
>
import { ExtHostExtensionServiceShape, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape } from './extHost.protocol.js';
16
>
import { IExtensionDescriptionDelta, IExtensionHostInitData } from '../../services/extensions/common/extensionHostProtocol.js';
17
>
import { ExtHostConfiguration, IExtHostConfiguration } from './extHostConfiguration.js';
18
>
import { ActivatedExtension, EmptyExtension, ExtensionActivationTimes, ExtensionActivationTimesBuilder, ExtensionsActivator, IExtensionAPI, IExtensionModule, HostExtension, ExtensionActivationTimesFragment } from './extHostExtensionActivator.js';
19
>
import { ExtHostStorage, IExtHostStorage } from './extHostStorage.js';
20
>
import { ExtHostWorkspace, IExtHostWorkspace } from './extHostWorkspace.js';
21
>
import { MissingExtensionDependency, ActivationKind, checkProposedApiEnabled, isProposedApiEnabled, ExtensionActivationReason, IProposedApiUsage, setProposedApiUsageReporter, setEnabledApiProposalsFallbackExperiment } from '../../services/extensions/common/extensions.js';
22
>
import { ExtensionDescriptionRegistry, IActivationEventsReader } from '../../services/extensions/common/extensionDescriptionRegistry.js';
23
>
import * as errors from '../../../base/common/errors.js';
24
>
import type * as vscode from 'vscode';
25
>
import { ExtensionIdentifier, ExtensionIdentifierMap, ExtensionIdentifierSet, IExtensionDescription } from '../../../platform/extensions/common/extensions.js';
26
>
import { VSBuffer } from '../../../base/common/buffer.js';
27
>
import { ExtensionGlobalMemento, ExtensionMemento } from './extHostMemento.js';
28
>
import { RemoteAuthorityResolverError, ExtensionKind, ExtensionMode, ExtensionRuntime, ManagedResolvedAuthority as ExtHostManagedResolvedAuthority } from './extHostTypes.js';
29
>
import { ResolvedAuthority, ResolvedOptions, RemoteAuthorityResolverErrorCode, IRemoteConnectionData, getRemoteAuthorityPrefix, TunnelInformation, ManagedRemoteConnection, WebSocketRemoteConnection } from '../../../platform/remote/common/remoteAuthorityResolver.js';
30
>
import { IInstantiationService, createDecorator } from '../../../platform/instantiation/common/instantiation.js';
31
>
import { IExtHostInitDataService } from './extHostInitDataService.js';
32
>
import { IExtensionStoragePaths } from './extHostStoragePaths.js';
33
>
import { IExtHostRpcService } from './extHostRpcService.js';
34
>
import { ServiceCollection } from '../../../platform/instantiation/common/serviceCollection.js';
35
>
import { IExtHostTunnelService } from './extHostTunnelService.js';
36
>
import { IExtHostTerminalService } from './extHostTerminalService.js';
37
>
import { IExtHostLanguageModels } from './extHostLanguageModels.js';
38
>
import { Emitter, Event } from '../../../base/common/event.js';
39
>
import { IExtensionActivationHost, checkActivateWorkspaceContainsExtension } from '../../services/extensions/common/workspaceContains.js';
40
>
import { ExtHostSecretState, IExtHostSecretState } from './extHostSecretState.js';
41
>
import { ExtensionSecrets } from './extHostSecrets.js';
42
>
import { Schemas } from '../../../base/common/network.js';
43
>
import { IResolveAuthorityResult } from '../../services/extensions/common/extensionHostProxy.js';
44
>
import { IExtHostLocalizationService } from './extHostLocalizationService.js';
45
>
import { StopWatch } from '../../../base/common/stopwatch.js';
46
>
import { isCI, setTimeout0 } from '../../../base/common/platform.js';
47
>
import { IExtHostManagedSockets } from './extHostManagedSockets.js';
48
>
import { Dto } from '../../services/extensions/common/proxyIdentifier.js';
49
>
50
>
interface ITestRunner {
51
>
/** Old test runner API, as exported from `vscode/lib/testrunner` */
52
>
run(testsRoot: string, clb: (error: Error, failures?: number) => void): void;
53
>
}
54
>
55
>
interface INewTestRunner {
56
>
/** New test runner API, as explained in the extension test doc */
57
>
run(): Promise<void>;
58
>
}
59
>
60
>
export const IHostUtils = createDecorator<IHostUtils>('IHostUtils');
61
>
62
>
export interface IHostUtils {
63
>
readonly _serviceBrand: undefined;
64
>
readonly pid: number | undefined;
65
>
exit(code: number): void;
66
>
fsExists?(path: string): Promise<boolean>;
67
>
fsRealpath?(path: string): Promise<string>;
68
>
}
69
>
70
>
type TelemetryActivationEventFragment = {
71
>
id: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'The identifier of an extension' };
72
>
name: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'The name of the extension' };
73
>
extensionVersion: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'The version of the extension' };
74
>
publisherDisplayName: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The publisher of the extension' };
75
>
activationEvents: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'All activation events of the extension' };
76
>
isBuiltin: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'If the extension is builtin or git installed' };
77
>
reason: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The activation event' };
78
>
reasonId: { classification: 'PublicNonPersonalData'; purpose: 'FeatureInsight'; comment: 'The identifier of the activation event' };
79
>
};
80
>
81
>
export abstract class AbstractExtHostExtensionService extends Disposable implements ExtHostExtensionServiceShape {
82
>
83
>
readonly _serviceBrand: undefined;
84
>
85
>
abstract readonly extensionRuntime: ExtensionRuntime;
86
>
87
>
private readonly _onDidChangeRemoteConnectionData = this._register(new Emitter<void>());
88
>
public readonly onDidChangeRemoteConnectionData = this._onDidChangeRemoteConnectionData.event;
89
>
90
>
protected readonly _hostUtils: IHostUtils;
91
>
protected readonly _initData: IExtensionHostInitData;
92
>
protected readonly _extHostContext: IExtHostRpcService;
93
>
protected readonly _instaService: IInstantiationService;
94
>
protected readonly _extHostWorkspace: ExtHostWorkspace;
95
>
protected readonly _extHostConfiguration: ExtHostConfiguration;
96
>
protected readonly _logService: ILogService;
97
>
protected readonly _extHostTunnelService: IExtHostTunnelService;
98
>
protected readonly _extHostTerminalService: IExtHostTerminalService;
99
>
protected readonly _extHostLocalizationService: IExtHostLocalizationService;
100
>
101
>
protected readonly _mainThreadWorkspaceProxy: MainThreadWorkspaceShape;
102
>
protected readonly _mainThreadTelemetryProxy: MainThreadTelemetryShape;
103
>
protected readonly _mainThreadExtensionsProxy: MainThreadExtensionServiceShape;
104
>
105
>
private readonly _almostReadyToRunExtensions: Barrier;
106
>
private readonly _readyToStartExtensionHost: Barrier;
107
>
private readonly _readyToRunExtensions: Barrier;
108
>
private readonly _eagerExtensionsActivated: Barrier;
109
>
110
>
private readonly _activationEventsReader: SyncedActivationEventsReader;
111
>
protected readonly _myRegistry: ExtensionDescriptionRegistry;
112
>
protected readonly _globalRegistry: ExtensionDescriptionRegistry;
113
>
private readonly _storage: ExtHostStorage;
114
>
private readonly _secretState: ExtHostSecretState;
115
>
private readonly _storagePath: IExtensionStoragePaths;
116
>
private readonly _activator: ExtensionsActivator;
117
>
private _extensionPathIndex: Promise<ExtensionPaths> | null;
118
>
private _realPathCache = new Map<string, Promise<string>>();
119
>
120
>
private readonly _resolvers: { [authorityPrefix: string]: vscode.RemoteAuthorityResolver };
121
>
122
>
private _started: boolean;
123
>
private _isTerminating: boolean = false;
124
>
private _remoteConnectionData: IRemoteConnectionData | null;
125
>
126
>
constructor(
127
@IInstantiationService instaService: IInstantiationService,
128
@IHostUtils hostUtils: IHostUtils,