Skip to content

Commit ece59d5

Browse files
committed
build: sequentialize extension packaging
1 parent bd0e3aa commit ece59d5

2 files changed

Lines changed: 56 additions & 10 deletions

File tree

build/lib/extensions.js

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,28 @@ var excludedExtensions = [
189189
'ms-vscode.node-debug2',
190190
];
191191
var builtInExtensions = require('../builtInExtensions.json');
192+
/**
193+
* We're doing way too much stuff at once, with webpack et al. So much stuff
194+
* that while downloading extensions from the marketplace, node js doesn't get enough
195+
* stack frames to complete the download in under 2 minutes, at which point the
196+
* marketplace server cuts off the http request. So, we sequentialize the extensino tasks.
197+
*/
198+
function sequence(streamProviders) {
199+
var result = es.through();
200+
function pop() {
201+
if (streamProviders.length === 0) {
202+
result.emit('end');
203+
}
204+
else {
205+
var fn = streamProviders.shift();
206+
fn()
207+
.on('end', function () { setTimeout(pop, 0); })
208+
.pipe(result, { end: false });
209+
}
210+
}
211+
pop();
212+
return result;
213+
}
192214
function packageExtensionsStream(opts) {
193215
opts = opts || {};
194216
var localExtensionDescriptions = glob.sync('extensions/*/package.json')
@@ -209,21 +231,21 @@ function packageExtensionsStream(opts) {
209231
var name = _a.name;
210232
return builtInExtensions.every(function (b) { return b.name !== name; });
211233
});
212-
var localExtensions = es.merge.apply(es, localExtensionDescriptions.map(function (extension) {
234+
var localExtensions = function () { return es.merge.apply(es, localExtensionDescriptions.map(function (extension) {
213235
return fromLocal(extension.path, opts.sourceMappingURLBase)
214236
.pipe(rename(function (p) { return p.dirname = "extensions/" + extension.name + "/" + p.dirname; }));
215-
}));
216-
var localExtensionDependencies = gulp.src('extensions/node_modules/**', { base: '.' });
217-
var marketplaceExtensions = es.merge.apply(es, builtInExtensions
237+
})); };
238+
var localExtensionDependencies = function () { return gulp.src('extensions/node_modules/**', { base: '.' }); };
239+
var marketplaceExtensions = function () { return es.merge.apply(es, builtInExtensions
218240
.filter(function (_a) {
219241
var name = _a.name;
220242
return opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true;
221243
})
222244
.map(function (extension) {
223245
return fromMarketplace(extension.name, extension.version, extension.metadata)
224246
.pipe(rename(function (p) { return p.dirname = "extensions/" + extension.name + "/" + p.dirname; }));
225-
}));
226-
return es.merge(localExtensions, localExtensionDependencies, marketplaceExtensions)
247+
})); };
248+
return sequence([localExtensions, localExtensionDependencies, marketplaceExtensions])
227249
.pipe(util2.setExecutableBit(['**/*.sh']))
228250
.pipe(filter(['**', '!**/*.js.map']));
229251
}

build/lib/extensions.ts

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,30 @@ interface IBuiltInExtension {
236236

237237
const builtInExtensions: IBuiltInExtension[] = require('../builtInExtensions.json');
238238

239+
/**
240+
* We're doing way too much stuff at once, with webpack et al. So much stuff
241+
* that while downloading extensions from the marketplace, node js doesn't get enough
242+
* stack frames to complete the download in under 2 minutes, at which point the
243+
* marketplace server cuts off the http request. So, we sequentialize the extensino tasks.
244+
*/
245+
function sequence(streamProviders: { (): Stream }[]): Stream {
246+
const result = es.through();
247+
248+
function pop() {
249+
if (streamProviders.length === 0) {
250+
result.emit('end');
251+
} else {
252+
const fn = streamProviders.shift();
253+
fn()
254+
.on('end', function () { setTimeout(pop, 0); })
255+
.pipe(result, { end: false });
256+
}
257+
}
258+
259+
pop();
260+
return result;
261+
}
262+
239263
export function packageExtensionsStream(opts?: IPackageExtensionsOptions): NodeJS.ReadWriteStream {
240264
opts = opts || {};
241265

@@ -249,14 +273,14 @@ export function packageExtensionsStream(opts?: IPackageExtensionsOptions): NodeJ
249273
.filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true)
250274
.filter(({ name }) => builtInExtensions.every(b => b.name !== name));
251275

252-
const localExtensions = es.merge(...localExtensionDescriptions.map(extension => {
276+
const localExtensions = () => es.merge(...localExtensionDescriptions.map(extension => {
253277
return fromLocal(extension.path, opts.sourceMappingURLBase)
254278
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
255279
}));
256280

257-
const localExtensionDependencies = gulp.src('extensions/node_modules/**', { base: '.' });
281+
const localExtensionDependencies = () => gulp.src('extensions/node_modules/**', { base: '.' });
258282

259-
const marketplaceExtensions = es.merge(
283+
const marketplaceExtensions = () => es.merge(
260284
...builtInExtensions
261285
.filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true)
262286
.map(extension => {
@@ -265,7 +289,7 @@ export function packageExtensionsStream(opts?: IPackageExtensionsOptions): NodeJ
265289
})
266290
);
267291

268-
return es.merge(localExtensions, localExtensionDependencies, marketplaceExtensions)
292+
return sequence([localExtensions, localExtensionDependencies, marketplaceExtensions])
269293
.pipe(util2.setExecutableBit(['**/*.sh']))
270294
.pipe(filter(['**', '!**/*.js.map']));
271295
}

0 commit comments

Comments
 (0)