extensionManagementIpc.ts 6.9 KB
Newer Older
J
Joao Moreno 已提交
1 2 3 4 5
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

6
import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc';
7
import { IExtensionManagementService, ILocalExtension, InstallExtensionEvent, DidInstallExtensionEvent, IGalleryExtension, DidUninstallExtensionEvent, IExtensionIdentifier, IGalleryMetadata, IReportedExtension } from 'vs/platform/extensionManagement/common/extensionManagement';
J
Joao Moreno 已提交
8
import { Event } from 'vs/base/common/event';
9 10 11
import { URI, UriComponents } from 'vs/base/common/uri';
import { IURITransformer, DefaultURITransformer, transformAndReviveIncomingURIs } from 'vs/base/common/uriIpc';
import { cloneAndChange } from 'vs/base/common/objects';
12
import { ExtensionType } from 'vs/platform/extensions/common/extensions';
13 14 15 16 17 18

function transformIncomingURI(uri: UriComponents, transformer: IURITransformer | null): URI {
	return URI.revive(transformer ? transformer.transformIncoming(uri) : uri);
}

function transformOutgoingURI(uri: URI, transformer: IURITransformer | null): URI {
A
Alex Dima 已提交
19
	return transformer ? transformer.transformOutgoingURI(uri) : uri;
20 21 22 23
}

function transformIncomingExtension(extension: ILocalExtension, transformer: IURITransformer | null): ILocalExtension {
	transformer = transformer ? transformer : DefaultURITransformer;
24 25 26
	const manifest = extension.manifest;
	const transformed = transformAndReviveIncomingURIs({ ...extension, ...{ manifest: undefined } }, transformer);
	return { ...transformed, ...{ manifest } };
27 28 29
}

function transformOutgoingExtension(extension: ILocalExtension, transformer: IURITransformer | null): ILocalExtension {
A
Alex Dima 已提交
30
	return transformer ? cloneAndChange(extension, value => value instanceof URI ? transformer.transformOutgoingURI(value) : undefined) : extension;
31
}
J
Joao Moreno 已提交
32

J
Joao Moreno 已提交
33
export class ExtensionManagementChannel implements IServerChannel {
J
Joao Moreno 已提交
34

35 36
	onInstallExtension: Event<InstallExtensionEvent>;
	onDidInstallExtension: Event<DidInstallExtensionEvent>;
S
Sandeep Somavarapu 已提交
37
	onUninstallExtension: Event<IExtensionIdentifier>;
S
Sandeep Somavarapu 已提交
38
	onDidUninstallExtension: Event<DidUninstallExtensionEvent>;
39

40
	constructor(private service: IExtensionManagementService, private getUriTransformer: (requestContext: any) => IURITransformer | null) {
J
Joao Moreno 已提交
41 42 43 44
		this.onInstallExtension = Event.buffer(service.onInstallExtension, true);
		this.onDidInstallExtension = Event.buffer(service.onDidInstallExtension, true);
		this.onUninstallExtension = Event.buffer(service.onUninstallExtension, true);
		this.onDidUninstallExtension = Event.buffer(service.onDidUninstallExtension, true);
45
	}
J
Joao Moreno 已提交
46

M
Matt Bierner 已提交
47
	listen(context: any, event: string): Event<any> {
48
		const uriTransformer = this.getUriTransformer(context);
J
Joao Moreno 已提交
49 50
		switch (event) {
			case 'onInstallExtension': return this.onInstallExtension;
S
Sandeep Somavarapu 已提交
51
			case 'onDidInstallExtension': return Event.map(this.onDidInstallExtension, i => ({ ...i, local: i.local ? transformOutgoingExtension(i.local, uriTransformer) : i.local }));
J
Joao Moreno 已提交
52 53 54 55 56 57 58
			case 'onUninstallExtension': return this.onUninstallExtension;
			case 'onDidUninstallExtension': return this.onDidUninstallExtension;
		}

		throw new Error('Invalid listen');
	}

M
Matt Bierner 已提交
59
	call(context: any, command: string, args?: any): Promise<any> {
60
		const uriTransformer: IURITransformer | null = this.getUriTransformer(context);
J
Joao Moreno 已提交
61
		switch (command) {
62 63 64
			case 'zip': return this.service.zip(transformIncomingExtension(args[0], uriTransformer)).then(uri => transformOutgoingURI(uri, uriTransformer));
			case 'unzip': return this.service.unzip(transformIncomingURI(args[0], uriTransformer), args[1]);
			case 'install': return this.service.install(transformIncomingURI(args[0], uriTransformer));
65
			case 'installFromGallery': return this.service.installFromGallery(args[0]);
66 67 68 69
			case 'uninstall': return this.service.uninstall(transformIncomingExtension(args[0], uriTransformer), args[1]);
			case 'reinstallFromGallery': return this.service.reinstallFromGallery(transformIncomingExtension(args[0], uriTransformer));
			case 'getInstalled': return this.service.getInstalled(args[0]).then(extensions => extensions.map(e => transformOutgoingExtension(e, uriTransformer)));
			case 'updateMetadata': return this.service.updateMetadata(transformIncomingExtension(args[0], uriTransformer), args[1]).then(e => transformOutgoingExtension(e, uriTransformer));
J
Joao Moreno 已提交
70
			case 'getExtensionsReport': return this.service.getExtensionsReport();
J
Joao Moreno 已提交
71
		}
J
Joao Moreno 已提交
72 73

		throw new Error('Invalid call');
J
Joao Moreno 已提交
74 75 76
	}
}

J
Joao Moreno 已提交
77
export class ExtensionManagementChannelClient implements IExtensionManagementService {
J
Joao Moreno 已提交
78

79
	_serviceBrand: any;
J
Joao Moreno 已提交
80

81 82 83
	constructor(
		private readonly channel: IChannel,
	) { }
J
Joao Moreno 已提交
84

J
Joao Moreno 已提交
85
	get onInstallExtension(): Event<InstallExtensionEvent> { return this.channel.listen('onInstallExtension'); }
S
Sandeep Somavarapu 已提交
86
	get onDidInstallExtension(): Event<DidInstallExtensionEvent> { return Event.map(this.channel.listen<DidInstallExtensionEvent>('onDidInstallExtension'), i => ({ ...i, local: i.local ? transformIncomingExtension(i.local, null) : i.local })); }
J
Joao Moreno 已提交
87 88
	get onUninstallExtension(): Event<IExtensionIdentifier> { return this.channel.listen('onUninstallExtension'); }
	get onDidUninstallExtension(): Event<DidUninstallExtensionEvent> { return this.channel.listen('onDidUninstallExtension'); }
J
Joao Moreno 已提交
89

S
Sandeep Somavarapu 已提交
90
	zip(extension: ILocalExtension): Promise<URI> {
J
Johannes Rieken 已提交
91
		return Promise.resolve(this.channel.call('zip', [extension]).then(result => URI.revive(<UriComponents>result)));
92 93
	}

94
	unzip(zipLocation: URI, type: ExtensionType): Promise<IExtensionIdentifier> {
95
		return Promise.resolve(this.channel.call('unzip', [zipLocation, type]));
96 97
	}

98 99
	install(vsix: URI): Promise<ILocalExtension> {
		return Promise.resolve(this.channel.call<ILocalExtension>('install', [vsix])).then(local => transformIncomingExtension(local, null));
100 101
	}

102 103
	installFromGallery(extension: IGalleryExtension): Promise<ILocalExtension> {
		return Promise.resolve(this.channel.call<ILocalExtension>('installFromGallery', [extension])).then(local => transformIncomingExtension(local, null));
J
Joao Moreno 已提交
104 105
	}

S
Sandeep Somavarapu 已提交
106
	uninstall(extension: ILocalExtension, force = false): Promise<void> {
107
		return Promise.resolve(this.channel.call('uninstall', [extension!, force]));
J
Joao Moreno 已提交
108 109
	}

S
Sandeep Somavarapu 已提交
110
	reinstallFromGallery(extension: ILocalExtension): Promise<void> {
111
		return Promise.resolve(this.channel.call('reinstallFromGallery', [extension]));
S
Sandeep Somavarapu 已提交
112 113
	}

114
	getInstalled(type: ExtensionType | null = null): Promise<ILocalExtension[]> {
J
Joao Moreno 已提交
115
		return Promise.resolve(this.channel.call<ILocalExtension[]>('getInstalled', [type]))
116
			.then(extensions => extensions.map(extension => transformIncomingExtension(extension, null)));
J
Joao Moreno 已提交
117
	}
118

S
Sandeep Somavarapu 已提交
119
	updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): Promise<ILocalExtension> {
120
		return Promise.resolve(this.channel.call<ILocalExtension>('updateMetadata', [local, metadata]))
121
			.then(extension => transformIncomingExtension(extension, null));
122
	}
J
Joao Moreno 已提交
123

S
Sandeep Somavarapu 已提交
124 125
	getExtensionsReport(): Promise<IReportedExtension[]> {
		return Promise.resolve(this.channel.call('getExtensionsReport'));
J
Joao Moreno 已提交
126
	}
J
Johannes Rieken 已提交
127
}