提交 9fc1cfd5 编写于 作者: J Joao Moreno

use cached gallery results

related to #2621
上级 ada872b4
......@@ -8,6 +8,7 @@
import { assign } from 'vs/base/common/objects';
import { TPromise } from 'vs/base/common/winjs.base';
import { IGalleryService, IExtension } from 'vs/workbench/parts/extensions/common/extensions';
import { IXHRResponse } from 'vs/base/common/http';
import { IRequestService } from 'vs/platform/request/common/request';
import { IWorkspaceContextService } from 'vs/workbench/services/workspace/common/contextService';
......@@ -50,55 +51,58 @@ function getInstallCount(statistics: IGalleryExtensionStatistics[]): number {
return result ? result.value : 0;
}
const FIVE_MINUTES = 1000 * 60 * 5;
export class GalleryService implements IGalleryService {
public serviceId = IGalleryService;
serviceId = IGalleryService;
private extensionsGalleryUrl: string;
private extensionsCacheUrl: string;
constructor(
@IRequestService private requestService: IRequestService,
@IWorkspaceContextService contextService: IWorkspaceContextService
) {
const extensionsGalleryConfig = contextService.getConfiguration().env.extensionsGallery;
this.extensionsGalleryUrl = extensionsGalleryConfig && extensionsGalleryConfig.serviceUrl;
const config = contextService.getConfiguration().env.extensionsGallery;
this.extensionsGalleryUrl = config && config.serviceUrl;
this.extensionsCacheUrl = config && config.cacheUrl;
}
private api(path = ''): string {
return `${ this.extensionsGalleryUrl }${ path }`;
}
public isEnabled(): boolean {
isEnabled(): boolean {
return !!this.extensionsGalleryUrl;
}
public query(): TPromise<IExtension[]> {
if (!this.extensionsGalleryUrl) {
query(): TPromise<IExtension[]> {
if (!this.isEnabled()) {
return TPromise.wrapError(new Error('No extension gallery service configured.'));
}
const data = JSON.stringify({
filters: [{
criteria:[{
filterType: 1,
value: 'vscode'
}]
}],
flags: 0x1 | 0x4 | 0x80 | 0x100
});
const gallery = this.queryGallery();
const cache = this.queryCache().then(r => {
const rawLastModified = r.getResponseHeader('last-modified');
const request = {
type: 'POST',
url: this.api('/extensionquery'),
data: data,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json;api-version=3.0-preview.1',
'Content-Length': data.length
if (!rawLastModified) {
return gallery;
}
};
return this.requestService.makeRequest(request)
const lastModified = new Date(rawLastModified).getTime();
const now = new Date().getTime();
const diff = now - lastModified;
if (diff > FIVE_MINUTES) {
return gallery;
}
gallery.cancel();
return TPromise.as(r);
}, err => gallery);
return cache
.then<IGalleryExtension[]>(r => JSON.parse(r.responseText).results[0].extensions || [])
.then<IExtension[]>(extensions => {
return extensions.map(extension => ({
......@@ -119,4 +123,34 @@ export class GalleryService implements IGalleryService {
}));
});
}
private queryCache(): TPromise<IXHRResponse> {
const url = this.extensionsCacheUrl;
return this.requestService.makeRequest({ url });
}
private queryGallery(): TPromise<IXHRResponse> {
const data = JSON.stringify({
filters: [{
criteria:[{
filterType: 1,
value: 'vscode'
}]
}],
flags: 0x1 | 0x4 | 0x80 | 0x100
});
const request = {
type: 'POST',
url: this.api('/extensionquery'),
data: data,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json;api-version=3.0-preview.1',
'Content-Length': data.length
}
};
return this.requestService.makeRequest(request);
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册