src/worker/worker.js
import { HermiteData } from "../volume/HermiteData";
import { VoxelCell } from "../octree/voxel/VoxelCell";
import { Message } from "./messages/Message";
import { SurfaceExtractor } from "./SurfaceExtractor";
import { VolumeModifier } from "./VolumeModifier";
import { Action } from "./Action";
/**
 * A volume modifier.
 *
 * @type {VolumeModifier}
 * @private
 */
const volumeModifier = new VolumeModifier();
/**
 * A surface extractor.
 *
 * @type {SurfaceExtractor}
 * @private
 */
const surfaceExtractor = new SurfaceExtractor();
/**
 * The current action.
 *
 * @type {Action}
 * @private
 */
let action = null;
/**
 * Receives and handles messages from the main thread.
 *
 * @private
 * @param {Event} event - A message event containing data from the main thread.
 */
self.addEventListener("message", (event) => {
	// Unpack the request.
	const request = event.data;
	action = request.action;
	switch(action) {
		case Action.MODIFY:
			postMessage(
				volumeModifier.process(request).respond(),
				volumeModifier.createTransferList()
			);
			break;
		case Action.EXTRACT:
			postMessage(
				surfaceExtractor.process(request).respond(),
				surfaceExtractor.createTransferList()
			);
			break;
		case Action.CONFIGURE:
			HermiteData.resolution = request.resolution;
			VoxelCell.errorThreshold = request.errorThreshold;
			break;
		case Action.CLOSE:
		default:
			close();
	}
});
/**
 * Returns all data to the main thread and closes the worker.
 *
 * @private
 * @param {ErrorEvent} event - An error event.
 */
self.addEventListener("error", (event) => {
	const processor = (action === Action.MODIFY) ?
		volumeModifier : (action === Action.EXTRACT) ?
			surfaceExtractor : null;
	if(processor !== null) {
		// Evacuate the data.
		const response = processor.respond();
		// Adjust the action and attach the error event.
		response.action = Action.CLOSE;
		response.error = event;
		postMessage(response, processor.createTransferList());
	} else {
		// An unexpected error occured during configuration or closure.
		const response = new Message(Action.CLOSE);
		response.error = event;
		postMessage(response);
	}
	close();
});