mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
const path = require("path");
 | 
						|
 | 
						|
module.exports = ({ outputDirectory }) =>
 | 
						|
	class Worker {
 | 
						|
		constructor(url, options = {}) {
 | 
						|
			expect(url).toBeInstanceOf(URL);
 | 
						|
			expect(url.origin).toBe("https://test.cases");
 | 
						|
			expect(url.pathname.startsWith("/path/")).toBe(true);
 | 
						|
			this.url = url;
 | 
						|
			const file = url.pathname.slice(6);
 | 
						|
			const workerBootstrap = `
 | 
						|
const { parentPort } = require("worker_threads");
 | 
						|
const { URL } = require("url");
 | 
						|
const path = require("path");
 | 
						|
const fs = require("fs");
 | 
						|
global.self = global;
 | 
						|
self.URL = URL;
 | 
						|
self.location = new URL(${JSON.stringify(url.toString())});
 | 
						|
const urlToPath = url => {
 | 
						|
	if(url.startsWith("https://test.cases/path/")) url = url.slice(24);
 | 
						|
	return path.resolve(${JSON.stringify(outputDirectory)}, \`./\${url}\`);
 | 
						|
};
 | 
						|
self.importScripts = url => {
 | 
						|
	${
 | 
						|
		options.type === "module"
 | 
						|
			? `throw new Error("importScripts is not supported in module workers")`
 | 
						|
			: `require(urlToPath(url))`
 | 
						|
	};
 | 
						|
};
 | 
						|
self.fetch = async url => {
 | 
						|
	try {
 | 
						|
		const buffer = await new Promise((resolve, reject) =>
 | 
						|
			fs.readFile(urlToPath(url), (err, b) =>
 | 
						|
				err ? reject(err) : resolve(b)
 | 
						|
			)
 | 
						|
		);
 | 
						|
		return {
 | 
						|
			status: 200,
 | 
						|
			ok: true,
 | 
						|
			json: async () => JSON.parse(buffer.toString("utf-8"))
 | 
						|
		};
 | 
						|
	} catch(err) {
 | 
						|
		if(err.code === "ENOENT") {
 | 
						|
			return {
 | 
						|
				status: 404,
 | 
						|
				ok: false
 | 
						|
			};
 | 
						|
		}
 | 
						|
		throw err;
 | 
						|
	}
 | 
						|
};
 | 
						|
parentPort.on("message", data => {
 | 
						|
	if(self.onmessage) self.onmessage({
 | 
						|
		data
 | 
						|
	});
 | 
						|
});
 | 
						|
self.postMessage = data => {
 | 
						|
	parentPort.postMessage(data);
 | 
						|
};
 | 
						|
require(${JSON.stringify(path.resolve(outputDirectory, file))});
 | 
						|
`;
 | 
						|
			// eslint-disable-next-line node/no-unsupported-features/node-builtins
 | 
						|
			this.worker = new (require("worker_threads").Worker)(workerBootstrap, {
 | 
						|
				eval: true
 | 
						|
			});
 | 
						|
 | 
						|
			this._onmessage = undefined;
 | 
						|
		}
 | 
						|
 | 
						|
		set onmessage(value) {
 | 
						|
			if (this._onmessage) this.worker.off("message", this._onmessage);
 | 
						|
			this.worker.on(
 | 
						|
				"message",
 | 
						|
				(this._onmessage = data => {
 | 
						|
					value({
 | 
						|
						data
 | 
						|
					});
 | 
						|
				})
 | 
						|
			);
 | 
						|
		}
 | 
						|
 | 
						|
		postMessage(data) {
 | 
						|
			this.worker.postMessage(data);
 | 
						|
		}
 | 
						|
 | 
						|
		terminate() {
 | 
						|
			return this.worker.terminate();
 | 
						|
		}
 | 
						|
	};
 |