Skip to content

Commit 05bf6fa

Browse files
committed
use cancelation token instead of winjs promise cancel callback
1 parent bc374f6 commit 05bf6fa

15 files changed

Lines changed: 62 additions & 43 deletions

File tree

src/vs/base/node/request.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import { parse as parseUrl } from 'url';
1414
import { createWriteStream } from 'fs';
1515
import { assign } from 'vs/base/common/objects';
1616
import { createGunzip } from 'zlib';
17+
import { CancellationToken } from 'vs/base/common/cancellation';
18+
import { canceled } from 'vs/base/common/errors';
1719

1820
export type Agent = any;
1921

@@ -46,7 +48,7 @@ export interface IRequestContext {
4648
}
4749

4850
export interface IRequestFunction {
49-
(options: IRequestOptions): TPromise<IRequestContext>;
51+
(options: IRequestOptions, token: CancellationToken): TPromise<IRequestContext>;
5052
}
5153

5254
async function getNodeRequest(options: IRequestOptions): Promise<IRawRequestFunction> {
@@ -55,7 +57,7 @@ async function getNodeRequest(options: IRequestOptions): Promise<IRawRequestFunc
5557
return module.request;
5658
}
5759

58-
export function request(options: IRequestOptions): TPromise<IRequestContext> {
60+
export function request(options: IRequestOptions, token: CancellationToken): TPromise<IRequestContext> {
5961
let req: http.ClientRequest;
6062

6163
const rawRequestPromise = options.getRawRequest
@@ -88,7 +90,7 @@ export function request(options: IRequestOptions): TPromise<IRequestContext> {
8890
request(assign({}, options, {
8991
url: res.headers['location'],
9092
followRedirects: followRedirects - 1
91-
})).then(c, e);
93+
}), token).then(c, e);
9294
} else {
9395
let stream: Stream = res;
9496

@@ -116,7 +118,12 @@ export function request(options: IRequestOptions): TPromise<IRequestContext> {
116118
}
117119

118120
req.end();
119-
}, () => req && req.abort());
121+
122+
token.onCancellationRequested(() => {
123+
req.abort();
124+
e(canceled());
125+
});
126+
});
120127
});
121128
}
122129

src/vs/code/electron-main/logUploader.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import product from 'vs/platform/node/product';
1717
import { IRequestService } from 'vs/platform/request/node/request';
1818
import { IRequestContext } from 'vs/base/node/request';
1919
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
20+
import { CancellationToken } from 'vs/base/common/cancellation';
2021

2122
interface PostResult {
2223
readonly blob_id: string;
@@ -86,7 +87,7 @@ async function postLogs(
8687
headers: {
8788
'Content-Type': 'application/zip'
8889
}
89-
});
90+
}, CancellationToken.None);
9091
} catch (e) {
9192
clearInterval(dotter);
9293
console.log(localize('postError', 'Error posting logs: {0}', e));

src/vs/platform/extensionManagement/node/extensionGalleryService.ts

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import { writeFileAndFlushSync } from 'vs/base/node/extfs';
2424
import { generateUuid, isUUID } from 'vs/base/common/uuid';
2525
import { values } from 'vs/base/common/map';
2626
import { CancellationToken } from 'vs/base/common/cancellation';
27-
import { wireCancellationToken } from 'vs/base/common/async';
2827

2928
interface IRawGalleryExtensionFile {
3029
assetType: string;
@@ -375,7 +374,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
375374
query = query.withFilter(FilterType.ExtensionName, id);
376375
}
377376

378-
return this.queryGallery(query).then(({ galleryExtensions }) => {
377+
return this.queryGallery(query, CancellationToken.None).then(({ galleryExtensions }) => {
379378
if (galleryExtensions.length) {
380379
const galleryExtension = galleryExtensions[0];
381380
const versionAsset = version ? galleryExtension.versions.filter(v => v.version === version)[0] : galleryExtension.versions[0];
@@ -447,7 +446,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
447446
query = query.withSortOrder(options.sortOrder);
448447
}
449448

450-
return this.queryGallery(query).then(({ galleryExtensions, total }) => {
449+
return this.queryGallery(query, CancellationToken.None).then(({ galleryExtensions, total }) => {
451450
const extensions = galleryExtensions.map((e, index) => toExtension(e, e.versions[0], index, query, options.source));
452451
const pageSize = query.pageSize;
453452
const getPage = (pageIndex: number, ct: CancellationToken) => {
@@ -456,17 +455,15 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
456455
}
457456

458457
const nextPageQuery = query.withPage(pageIndex + 1);
459-
const promise = this.queryGallery(nextPageQuery)
458+
return this.queryGallery(nextPageQuery, ct)
460459
.then(({ galleryExtensions }) => galleryExtensions.map((e, index) => toExtension(e, e.versions[0], index, nextPageQuery, options.source)));
461-
462-
return wireCancellationToken(ct, promise);
463460
};
464461

465462
return { firstPage: extensions, total, pageSize, getPage } as IPager<IGalleryExtension>;
466463
});
467464
}
468465

469-
private queryGallery(query: Query): TPromise<{ galleryExtensions: IRawGalleryExtension[], total: number; }> {
466+
private queryGallery(query: Query, token: CancellationToken): TPromise<{ galleryExtensions: IRawGalleryExtension[], total: number; }> {
470467
return this.commonHeadersPromise.then(commonHeaders => {
471468
const data = JSON.stringify(query.raw);
472469
const headers = assign({}, commonHeaders, {
@@ -481,7 +478,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
481478
url: this.api('/extensionquery'),
482479
data,
483480
headers
484-
}).then(context => {
481+
}, token).then(context => {
485482

486483
if (context.res.statusCode >= 400 && context.res.statusCode < 500) {
487484
return { galleryExtensions: [], total: 0 };
@@ -511,7 +508,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
511508
type: 'POST',
512509
url: this.api(`/publishers/${publisher}/extensions/${name}/${version}/stats?statType=${type}`),
513510
headers
514-
}).then(null, () => null);
511+
}, CancellationToken.None).then(null, () => null);
515512
});
516513
}
517514

@@ -584,7 +581,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
584581
.withAssetTypes(AssetType.Manifest, AssetType.VSIX)
585582
.withFilter(FilterType.ExtensionId, extension.identifier.uuid);
586583

587-
return this.queryGallery(query)
584+
return this.queryGallery(query, CancellationToken.None)
588585
.then(({ galleryExtensions }) => {
589586
const [rawExtension] = galleryExtensions;
590587

@@ -619,7 +616,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
619616
.withAssetTypes(AssetType.Icon, AssetType.License, AssetType.Details, AssetType.Manifest, AssetType.VSIX)
620617
.withFilter(FilterType.ExtensionName, ...extensionNames);
621618

622-
return this.queryGallery(query).then(result => {
619+
return this.queryGallery(query, CancellationToken.None).then(result => {
623620
const dependencies = [];
624621
const ids = [];
625622

@@ -658,7 +655,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
658655
});
659656
}
660657

661-
private getAsset(asset: IGalleryExtensionAsset, options: IRequestOptions = {}): TPromise<IRequestContext> {
658+
private getAsset(asset: IGalleryExtensionAsset, options: IRequestOptions = {}, token: CancellationToken = CancellationToken.None): TPromise<IRequestContext> {
662659
return this.commonHeadersPromise.then(commonHeaders => {
663660
const baseOptions = { type: 'GET' };
664661
const headers = assign({}, commonHeaders, options.headers || {});
@@ -668,7 +665,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
668665
const fallbackUrl = asset.fallbackUri;
669666
const firstOptions = assign({}, options, { url });
670667

671-
return this.requestService.request(firstOptions)
668+
return this.requestService.request(firstOptions, token)
672669
.then(context => {
673670
if (context.res.statusCode === 200) {
674671
return TPromise.as(context);
@@ -700,7 +697,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
700697
this.telemetryService.publicLog('galleryService:cdnFallback', { url, message });
701698

702699
const fallbackOptions = assign({}, options, { url: fallbackUrl });
703-
return this.requestService.request(fallbackOptions).then(null, err => {
700+
return this.requestService.request(fallbackOptions, token).then(null, err => {
704701
if (isPromiseCanceledError(err)) {
705702
return TPromise.wrapError<IRequestContext>(err);
706703
}
@@ -783,7 +780,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
783780
return TPromise.as([]);
784781
}
785782

786-
return this.requestService.request({ type: 'GET', url: this.extensionsControlUrl }).then(context => {
783+
return this.requestService.request({ type: 'GET', url: this.extensionsControlUrl }, CancellationToken.None).then(context => {
787784
if (context.res.statusCode !== 200) {
788785
return TPromise.wrapError(new Error('Could not get extensions report.'));
789786
}
@@ -831,4 +828,4 @@ export function resolveMarketplaceHeaders(environmentService: IEnvironmentServic
831828
'X-Market-User-Id': uuid
832829
};
833830
});
834-
}
831+
}

src/vs/platform/request/electron-browser/requestService.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,20 @@ import { TPromise } from 'vs/base/common/winjs.base';
88
import { IRequestOptions, IRequestContext, IRequestFunction } from 'vs/base/node/request';
99
import { Readable } from 'stream';
1010
import { RequestService as NodeRequestService } from 'vs/platform/request/node/requestService';
11+
import { CancellationToken } from 'vscode';
12+
import { canceled } from 'vs/base/common/errors';
1113

1214
/**
1315
* This service exposes the `request` API, while using the global
1416
* or configured proxy settings.
1517
*/
1618
export class RequestService extends NodeRequestService {
17-
request(options: IRequestOptions): TPromise<IRequestContext> {
18-
return super.request(options, xhrRequest);
19+
request(options: IRequestOptions, token: CancellationToken): TPromise<IRequestContext> {
20+
return super.request(options, token, xhrRequest);
1921
}
2022
}
2123

22-
export const xhrRequest: IRequestFunction = (options: IRequestOptions): TPromise<IRequestContext> => {
24+
export const xhrRequest: IRequestFunction = (options: IRequestOptions, token: CancellationToken): TPromise<IRequestContext> => {
2325

2426
const xhr = new XMLHttpRequest();
2527
return new TPromise<IRequestContext>((resolve, reject) => {
@@ -70,9 +72,11 @@ export const xhrRequest: IRequestFunction = (options: IRequestOptions): TPromise
7072
xhr.send(options.data as any);
7173
return null;
7274

73-
}, () => {
7475
// cancel
75-
xhr.abort();
76+
token.onCancellationRequested(() => {
77+
xhr.abort();
78+
reject(canceled());
79+
});
7680
});
7781
};
7882

src/vs/platform/request/electron-main/requestService.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ import { IRequestOptions, IRequestContext, request, IRawRequestFunction } from '
99
import { RequestService as NodeRequestService } from 'vs/platform/request/node/requestService';
1010
import { assign } from 'vs/base/common/objects';
1111
import { net } from 'electron';
12+
import { CancellationToken } from 'vs/base/common/cancellation';
1213

1314
function getRawRequest(options: IRequestOptions): IRawRequestFunction {
1415
return net.request as any as IRawRequestFunction;
1516
}
1617

1718
export class RequestService extends NodeRequestService {
1819

19-
request(options: IRequestOptions): TPromise<IRequestContext> {
20-
return super.request(options, options => request(assign({}, options || {}, { getRawRequest })));
20+
request(options: IRequestOptions, token: CancellationToken): TPromise<IRequestContext> {
21+
return super.request(options, token, options => request(assign({}, options || {}, { getRawRequest }), token));
2122
}
22-
}
23+
}

src/vs/platform/request/node/request.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'
1010
import { IRequestOptions, IRequestContext } from 'vs/base/node/request';
1111
import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry';
1212
import { Registry } from 'vs/platform/registry/common/platform';
13+
import { CancellationToken } from 'vs/base/common/cancellation';
1314

1415
export const IRequestService = createDecorator<IRequestService>('requestService2');
1516

1617
export interface IRequestService {
1718
_serviceBrand: any;
1819

19-
request(options: IRequestOptions): TPromise<IRequestContext>;
20+
request(options: IRequestOptions, token: CancellationToken): TPromise<IRequestContext>;
2021
}
2122

2223
export interface IHTTPConfiguration {
@@ -50,4 +51,4 @@ Registry.as<IConfigurationRegistry>(Extensions.Configuration)
5051
description: localize('proxyAuthorization', "The value to send as the 'Proxy-Authorization' header for every network request.")
5152
}
5253
}
53-
});
54+
});

src/vs/platform/request/node/requestService.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { getProxyAgent } from 'vs/base/node/proxy';
1212
import { IRequestService, IHTTPConfiguration } from 'vs/platform/request/node/request';
1313
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1414
import { ILogService } from 'vs/platform/log/common/log';
15+
import { CancellationToken } from 'vs/base/common/cancellation';
1516

1617
/**
1718
* This service exposes the `request` API, while using the global
@@ -40,7 +41,7 @@ export class RequestService implements IRequestService {
4041
this.authorization = config.http && config.http.proxyAuthorization;
4142
}
4243

43-
request(options: IRequestOptions, requestFn: IRequestFunction = request): TPromise<IRequestContext> {
44+
request(options: IRequestOptions, token: CancellationToken, requestFn: IRequestFunction = request): TPromise<IRequestContext> {
4445
this.logService.trace('RequestService#request', options.url);
4546

4647
const { proxyUrl, strictSSL } = this;
@@ -54,7 +55,7 @@ export class RequestService implements IRequestService {
5455
options.headers = assign(options.headers || {}, { 'Proxy-Authorization': this.authorization });
5556
}
5657

57-
return requestFn(options);
58+
return requestFn(options, token);
5859
});
5960
}
6061
}

src/vs/platform/theme/test/electron-browser/colorRegistry.releaseTest.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import * as pfs from 'vs/base/node/pfs';
1919
import * as path from 'path';
2020
import * as assert from 'assert';
2121
import { getPathFromAmdModule } from 'vs/base/common/amd';
22+
import { CancellationToken } from 'vs/base/common/cancellation';
2223

2324

2425
interface ColorInfo {
@@ -41,7 +42,7 @@ export const experimental = []; // 'settings.modifiedItemForeground', 'editorUnn
4142
suite('Color Registry', function () {
4243

4344
test('all colors documented', async function () {
44-
const reqContext = await request({ url: 'https://raw.githubusercontent.com/Microsoft/vscode-docs/vnext/docs/getstarted/theme-color-reference.md' });
45+
const reqContext = await request({ url: 'https://raw.githubusercontent.com/Microsoft/vscode-docs/vnext/docs/getstarted/theme-color-reference.md' }, CancellationToken.None);
4546
const content = await asText(reqContext);
4647

4748
const expression = /\-\s*\`([\w\.]+)\`: (.*)/g;

src/vs/platform/update/electron-main/abstractUpdateService.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { IUpdateService, State, StateType, AvailableForDownload, UpdateType } fr
1515
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
1616
import { ILogService } from 'vs/platform/log/common/log';
1717
import { IRequestService } from 'vs/platform/request/node/request';
18+
import { CancellationToken } from 'vs/base/common/cancellation';
1819

1920
export function createUpdateURL(platform: string, quality: string): string {
2021
return `${product.updateUrl}/api/update/${platform}/${quality}/${product.commit}`;
@@ -161,7 +162,7 @@ export abstract class AbstractUpdateService implements IUpdateService {
161162
if (!this.url) {
162163
return TPromise.as(undefined);
163164
}
164-
return this.requestService.request({ url: this.url }).then(context => {
165+
return this.requestService.request({ url: this.url }, CancellationToken.None).then(context => {
165166
// The update server replies with 204 (No Content) when no
166167
// update is available - that's all we want to know.
167168
if (context.res.statusCode === 204) {

src/vs/platform/update/electron-main/updateService.linux.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { createUpdateURL, AbstractUpdateService } from 'vs/platform/update/elect
1717
import { asJson } from 'vs/base/node/request';
1818
import { TPromise } from 'vs/base/common/winjs.base';
1919
import { shell } from 'electron';
20+
import { CancellationToken } from 'vs/base/common/cancellation';
2021

2122
export class LinuxUpdateService extends AbstractUpdateService {
2223

@@ -44,7 +45,7 @@ export class LinuxUpdateService extends AbstractUpdateService {
4445

4546
this.setState(State.CheckingForUpdates(context));
4647

47-
this.requestService.request({ url: this.url })
48+
this.requestService.request({ url: this.url }, CancellationToken.None)
4849
.then<IUpdate>(asJson)
4950
.then(update => {
5051
if (!update || !update.url || !update.version || !update.productVersion) {

0 commit comments

Comments
 (0)