Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/services/extensions/common/extensionHostKind.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 { ExtensionKind } from '../../../../platform/environment/common/environment.js';
7
import { ExtensionIdentifier, IExtensionDescription } from '../../../../platform/extensions/common/extensions.js';
8
9
export const enum ExtensionHostKind {
10
LocalProcess = 1,
11
LocalWebWorker = 2,
12
Remote = 3
13
}
14
15
export function extensionHostKindToString(kind: ExtensionHostKind | null): string {
16
if (kind === null) {
17
return 'None';
18
}
19
switch (kind) {
20
case ExtensionHostKind.LocalProcess: return 'LocalProcess';
21
case ExtensionHostKind.LocalWebWorker: return 'LocalWebWorker';
22
case ExtensionHostKind.Remote: return 'Remote';
23
}
24
}
25
26
export const enum ExtensionRunningPreference {
27
None,
28
Local,
29
Remote
30
}
31
32
export function extensionRunningPreferenceToString(preference: ExtensionRunningPreference) {
33
switch (preference) {
34
case ExtensionRunningPreference.None:
35
return 'None';
36
case ExtensionRunningPreference.Local:
37
return 'Local';
38
case ExtensionRunningPreference.Remote:
39
return 'Remote';
40
}
41
}
42
43
export interface IExtensionHostKindPicker {
44
pickExtensionHostKind(extensionId: ExtensionIdentifier, extensionKinds: ExtensionKind[], isInstalledLocally: boolean, isInstalledRemotely: boolean, preference: ExtensionRunningPreference): ExtensionHostKind | null;
45
}
46
47
export function determineExtensionHostKinds(
48
_localExtensions: IExtensionDescription[],
49
_remoteExtensions: IExtensionDescription[],
50
getExtensionKind: (extensionDescription: IExtensionDescription) => ExtensionKind[],
51
pickExtensionHostKind: (extensionId: ExtensionIdentifier, extensionKinds: ExtensionKind[], isInstalledLocally: boolean, isInstalledRemotely: boolean, preference: ExtensionRunningPreference) => ExtensionHostKind | null
52
): Map<string, ExtensionHostKind | null> {
53
const localExtensions = toExtensionWithKind(_localExtensions, getExtensionKind);
54
const remoteExtensions = toExtensionWithKind(_remoteExtensions, getExtensionKind);
55
56
const allExtensions = new Map<string, ExtensionInfo>();
57
const collectExtension = (ext: ExtensionWithKind) => {
58
if (allExtensions.has(ext.key)) {
59
return;
60
}
61
const local = localExtensions.get(ext.key) || null;
62
const remote = remoteExtensions.get(ext.key) || null;
63
const info = new ExtensionInfo(local, remote);
64
allExtensions.set(info.key, info);
65
};
66
localExtensions.forEach((ext) => collectExtension(ext));
67
remoteExtensions.forEach((ext) => collectExtension(ext));
68
69
const extensionHostKinds = new Map<string, ExtensionHostKind | null>();
70
allExtensions.forEach((ext) => {
71
const isInstalledLocally = Boolean(ext.local);
72
const isInstalledRemotely = Boolean(ext.remote);
73
74
const isLocallyUnderDevelopment = Boolean(ext.local && ext.local.isUnderDevelopment);
75
const isRemotelyUnderDevelopment = Boolean(ext.remote && ext.remote.isUnderDevelopment);
76
77
let preference = ExtensionRunningPreference.None;
78
if (isLocallyUnderDevelopment && !isRemotelyUnderDevelopment) {
79
preference = ExtensionRunningPreference.Local;
80
} else if (isRemotelyUnderDevelopment && !isLocallyUnderDevelopment) {
81
preference = ExtensionRunningPreference.Remote;
82
}
83
84
extensionHostKinds.set(ext.key, pickExtensionHostKind(ext.identifier, ext.kind, isInstalledLocally, isInstalledRemotely, preference));
85
});
86
87
return extensionHostKinds;
88
}
89
90
function toExtensionWithKind(
91
extensions: IExtensionDescription[],
92
getExtensionKind: (extensionDescription: IExtensionDescription) => ExtensionKind[]
93
): Map<string, ExtensionWithKind> {
94
const result = new Map<string, ExtensionWithKind>();
95
extensions.forEach((desc) => {
96
const ext = new ExtensionWithKind(desc, getExtensionKind(desc));
97
result.set(ext.key, ext);
98
});
99
return result;
100
}
101
102
class ExtensionWithKind {
103
104
constructor(
105
public readonly desc: IExtensionDescription,
106
public readonly kind: ExtensionKind[]
107
) { }
108
109
public get key(): string {
110
return ExtensionIdentifier.toKey(this.desc.identifier);
111
}
112
113
public get isUnderDevelopment(): boolean {
114
return this.desc.isUnderDevelopment;
115
}
116
}
117
118
class ExtensionInfo {
119
120
constructor(
121
public readonly local: ExtensionWithKind | null,
122
public readonly remote: ExtensionWithKind | null,
123
) { }
124
125
public get key(): string {
126
if (this.local) {
127
return this.local.key;
128
}
129
return this.remote!.key;
130
}
131
132
public get identifier(): ExtensionIdentifier {
133
if (this.local) {
134
return this.local.desc.identifier;
135
}
136
return this.remote!.desc.identifier;
137
}
138
139
public get kind(): ExtensionKind[] {
140
// in case of disagreements between extension kinds, it is always
141
// better to pick the local extension because it has a much higher
142
// chance of being up-to-date
143
if (this.local) {
144
return this.local.kind;
145
}
146
return this.remote!.kind;
147
}
148
}
149
150