Skip to content

Commit

Permalink
Test for async import from nested worker (#5504)
Browse files Browse the repository at this point in the history
  • Loading branch information
devongovett committed Jul 11, 2021
1 parent 89eebc0 commit f21a0df
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import('./async');

let worker = new Worker(new URL('worker.js', import.meta.url), {type: 'module'});
worker.addEventListener('message', output);
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
let worker = new Worker(new URL('worker-nested.js', import.meta.url), {type: 'module'});
worker.addEventListener('message', output);
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import('./async');

let worker = new Worker(new URL('worker.js', import.meta.url), {type: 'module'});
worker.addEventListener('message', postMessage);
77 changes: 77 additions & 0 deletions packages/core/integration-tests/test/javascript.js
Original file line number Diff line number Diff line change
Expand Up @@ -861,6 +861,83 @@ describe('javascript', function() {
assert.deepEqual(res, {default: 42});
});

it('should support bundling workers with dynamic import in both page and worker', async function() {
let b = await bundle(
path.join(__dirname, '/integration/worker-dynamic/index-async.js'),
);

assertBundles(b, [
{
name: 'index-async.js',
assets: [
'index-async.js',
'bundle-url.js',
'get-worker-url.js',
'cacheLoader.js',
'js-loader.js',
],
},
{
assets: [
'worker.js',
'bundle-url.js',
'cacheLoader.js',
'js-loader.js',
],
},
{
assets: ['async.js', 'esmodule-helpers.js'],
},
]);

let res = await new Promise(resolve => {
run(b, {
output: resolve,
});
});
assert.deepEqual(res, {default: 42});
});

it('should support bundling workers with dynamic import in nested worker', async function() {
let b = await bundle(
path.join(__dirname, '/integration/worker-dynamic/index-nested.js'),
);

assertBundles(b, [
{
name: 'index-nested.js',
assets: ['index-nested.js', 'bundle-url.js', 'get-worker-url.js'],
},
{
assets: [
'worker-nested.js',
'bundle-url.js',
'get-worker-url.js',
'cacheLoader.js',
'js-loader.js',
],
},
{
assets: [
'worker.js',
'bundle-url.js',
'cacheLoader.js',
'js-loader.js',
],
},
{
assets: ['async.js', 'esmodule-helpers.js'],
},
]);

let res = await new Promise(resolve => {
run(b, {
output: resolve,
});
});
assert.deepEqual(res, {default: 42});
});

it('should support bundling workers of type module', async function() {
let b = await bundle(
path.join(__dirname, '/integration/workers-module/index.js'),
Expand Down
74 changes: 40 additions & 34 deletions packages/core/test-utils/src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -527,6 +527,7 @@ export function assertBundles(
a.assets.join(',').localeCompare(b.assets.join(','));
expectedBundles.sort(byName).sort(byAssets);
actualBundles.sort(byName).sort(byAssets);
console.log(actualBundles)
assert.equal(
actualBundles.length,
expectedBundles.length,
Expand Down Expand Up @@ -682,40 +683,7 @@ function prepareBrowserContext(
return Buffer.from(str, 'binary').toString('base64');
},
URL,
Worker: class Worker extends EventEmitter {
constructor(url) {
super();
this._run(url);
}

async _run(url) {
let u = new URL(url);
let filename = path.join(path.dirname(filePath), u.pathname);
let {ctx, promises} = prepareWorkerContext(filename, {
postMessage: msg => {
this.emit('message', msg);
},
});

let code = await overlayFS.readFile(filename, 'utf8');
vm.createContext(ctx);
new vm.Script(code, {
filename,
}).runInContext(ctx);

if (promises) {
await Promise.all(promises);
}
}

addEventListener(evt, callback) {
super.on(evt, callback);
}

removeEventListener(evt, callback) {
super.removeListener(evt, callback);
}
},
Worker: createWorkerClass(filePath),
},
globals,
);
Expand All @@ -724,6 +692,43 @@ function prepareBrowserContext(
return {ctx, promises};
}

function createWorkerClass(filePath: FilePath) {
return class Worker extends EventEmitter {
constructor(url) {
super();
this._run(url);
}

async _run(url) {
let u = new URL(url);
let filename = path.join(path.dirname(filePath), u.pathname);
let {ctx, promises} = prepareWorkerContext(filename, {
postMessage: msg => {
this.emit('message', msg);
},
});

let code = await overlayFS.readFile(filename, 'utf8');
vm.createContext(ctx);
new vm.Script(code, {
filename: 'http://localhost/' + path.basename(filename),
}).runInContext(ctx);

if (promises) {
await Promise.all(promises);
}
}

addEventListener(evt, callback) {
super.on(evt, callback);
}

removeEventListener(evt, callback) {
super.removeListener(evt, callback);
}
};
}

function prepareWorkerContext(
filePath: FilePath,
globals: mixed,
Expand Down Expand Up @@ -780,6 +785,7 @@ function prepareWorkerContext(
return Buffer.from(str, 'binary').toString('base64');
},
URL,
Worker: createWorkerClass(filePath),
},
globals,
);
Expand Down

0 comments on commit f21a0df

Please sign in to comment.