Path: blob/main/src/vs/workbench/services/extensions/common/extensionHostKind.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 { ExtensionKind } from '../../../../platform/environment/common/environment.js';6import { ExtensionIdentifier, IExtensionDescription } from '../../../../platform/extensions/common/extensions.js';78export const enum ExtensionHostKind {9LocalProcess = 1,10LocalWebWorker = 2,11Remote = 312}1314export function extensionHostKindToString(kind: ExtensionHostKind | null): string {15if (kind === null) {16return 'None';17}18switch (kind) {19case ExtensionHostKind.LocalProcess: return 'LocalProcess';20case ExtensionHostKind.LocalWebWorker: return 'LocalWebWorker';21case ExtensionHostKind.Remote: return 'Remote';22}23}2425export const enum ExtensionRunningPreference {26None,27Local,28Remote29}3031export function extensionRunningPreferenceToString(preference: ExtensionRunningPreference) {32switch (preference) {33case ExtensionRunningPreference.None:34return 'None';35case ExtensionRunningPreference.Local:36return 'Local';37case ExtensionRunningPreference.Remote:38return 'Remote';39}40}4142export interface IExtensionHostKindPicker {43pickExtensionHostKind(extensionId: ExtensionIdentifier, extensionKinds: ExtensionKind[], isInstalledLocally: boolean, isInstalledRemotely: boolean, preference: ExtensionRunningPreference): ExtensionHostKind | null;44}4546export function determineExtensionHostKinds(47_localExtensions: IExtensionDescription[],48_remoteExtensions: IExtensionDescription[],49getExtensionKind: (extensionDescription: IExtensionDescription) => ExtensionKind[],50pickExtensionHostKind: (extensionId: ExtensionIdentifier, extensionKinds: ExtensionKind[], isInstalledLocally: boolean, isInstalledRemotely: boolean, preference: ExtensionRunningPreference) => ExtensionHostKind | null51): Map<string, ExtensionHostKind | null> {52const localExtensions = toExtensionWithKind(_localExtensions, getExtensionKind);53const remoteExtensions = toExtensionWithKind(_remoteExtensions, getExtensionKind);5455const allExtensions = new Map<string, ExtensionInfo>();56const collectExtension = (ext: ExtensionWithKind) => {57if (allExtensions.has(ext.key)) {58return;59}60const local = localExtensions.get(ext.key) || null;61const remote = remoteExtensions.get(ext.key) || null;62const info = new ExtensionInfo(local, remote);63allExtensions.set(info.key, info);64};65localExtensions.forEach((ext) => collectExtension(ext));66remoteExtensions.forEach((ext) => collectExtension(ext));6768const extensionHostKinds = new Map<string, ExtensionHostKind | null>();69allExtensions.forEach((ext) => {70const isInstalledLocally = Boolean(ext.local);71const isInstalledRemotely = Boolean(ext.remote);7273const isLocallyUnderDevelopment = Boolean(ext.local && ext.local.isUnderDevelopment);74const isRemotelyUnderDevelopment = Boolean(ext.remote && ext.remote.isUnderDevelopment);7576let preference = ExtensionRunningPreference.None;77if (isLocallyUnderDevelopment && !isRemotelyUnderDevelopment) {78preference = ExtensionRunningPreference.Local;79} else if (isRemotelyUnderDevelopment && !isLocallyUnderDevelopment) {80preference = ExtensionRunningPreference.Remote;81}8283extensionHostKinds.set(ext.key, pickExtensionHostKind(ext.identifier, ext.kind, isInstalledLocally, isInstalledRemotely, preference));84});8586return extensionHostKinds;87}8889function toExtensionWithKind(90extensions: IExtensionDescription[],91getExtensionKind: (extensionDescription: IExtensionDescription) => ExtensionKind[]92): Map<string, ExtensionWithKind> {93const result = new Map<string, ExtensionWithKind>();94extensions.forEach((desc) => {95const ext = new ExtensionWithKind(desc, getExtensionKind(desc));96result.set(ext.key, ext);97});98return result;99}100101class ExtensionWithKind {102103constructor(104public readonly desc: IExtensionDescription,105public readonly kind: ExtensionKind[]106) { }107108public get key(): string {109return ExtensionIdentifier.toKey(this.desc.identifier);110}111112public get isUnderDevelopment(): boolean {113return this.desc.isUnderDevelopment;114}115}116117class ExtensionInfo {118119constructor(120public readonly local: ExtensionWithKind | null,121public readonly remote: ExtensionWithKind | null,122) { }123124public get key(): string {125if (this.local) {126return this.local.key;127}128return this.remote!.key;129}130131public get identifier(): ExtensionIdentifier {132if (this.local) {133return this.local.desc.identifier;134}135return this.remote!.desc.identifier;136}137138public get kind(): ExtensionKind[] {139// in case of disagreements between extension kinds, it is always140// better to pick the local extension because it has a much higher141// chance of being up-to-date142if (this.local) {143return this.local.kind;144}145return this.remote!.kind;146}147}148149150