Source: GeneratorWorker.js

import { WorkerInterface } from './WorkerInterface.js';
import Resource from '@/services/resource';
import KnapGen from './generators/KnapsackGenerator';
import SalesmanGen from './generators/TravellingSalesmanGenerator';
import SATGen from './generators/SATGenerator';
import CoverGen from './generators/VertexCoverGenerator';
import ETSPGen from './generators/ETSPGenerator';

/**
 * Definition of methods, that can be called from main thread
 */
var methods = {
    work: function(data, problemKey) {
        var job = new Job(data, problemKey);
        var result = job.run();
        if (result) {
            workerInterface.reply('result', result);
        }
        else {
            workerInterface.reply('result', null, "Selected problem wasn't recognised");
        }
    }
}

var workerInterface = new WorkerInterface(this, methods);

/**
 * Worker class used to generate problems
 */
class Job {
    constructor(params, problemKey) {
        this.params = params;
        this.problemKey = problemKey;
    }

    /**
     * Generate instance based on selected problem and input parameters
     * @return {string} returns the generated instance coded as string
     */
    run() {
        let Generator = null;
        let generatorParams = this.params[this.problemKey];

        if (this.problemKey === 0) {
            Generator = SATGen;
        }
        else if (this.problemKey === 1) {
            Generator = SalesmanGen;
        }
        else if (this.problemKey === 2) {
            Generator = KnapGen;
        }
        else if (this.problemKey === 3) {
            Generator = CoverGen;
        }
        else if (this.problemKey === 4) {
            Generator = ETSPGen;
        }

        if (Generator && generatorParams) {
            return new Generator(generatorParams).generate();
        }
        else {
            return null;
        }
    }
}

this.postMessage = self.postMessage;

// msg received event
self.addEventListener('message', (event) => {
    workerInterface.onMessage(event);
});