babel-plugin-parallel-es
TypeScript icon, indicating that this package has built-in type declarations

0.1.8 • Public • Published

babel-plugin-parallel-es

Build Status Coverage Status

A Babel Plugin that rewrites your Parallel.ES code to add support for debugging your worker code, accessing variables and calling functions from the outer scope from parallel functions. This plugin can be used on a standalone basis, however, it is advised that it is used from a bundler, e.g. with webpack.

Architecture

The Plugin actually consists out of two babel plugins:

Function Extractor Plugin

The function extractor plugin extracts all functions passed to a parallel method. E.g. for the following code:

import parallel from "parallel-es";
 
const factor = 2;
function mapper(value) {
    return value * factor;
}
 
export function transformData(data) {
    return parallel.from(data).map(mapper);
}

The plugin detects that the mapper function is passed to a parallel method. Therefore it stores a reference to the function declaration of the mapper in the ModulesUsingParallelRegistry. It then replaces the mapper with a function id that uniquely identifies the function:

import parallel from "parallel-es";
 
const factor = 2;
 
function _environmentExtractor() {
    return {
        factor: factor
    };
}
 
function mapper(value) {
    return value * factor;
}
 
export function transformData(data) {
    return parallel.from(data).inEnvironment(_environmentExtractor()).map({
        identifier: "static:function-declaration-with-environment-case.js/mapper",
        _______isFunctionId: true
    });
}

However, not only the mapper function is replaced with a function id, also an additional call to inEnvironment is added that extracts the variables used inside the mapper (factor).

Worker Rewriter

This plugin takes the Code of the parallel-es worker as input and inserts all of the functions extracted by the function-extractor-plugin into the worker code and registers them. For the example above, the following functions and registrations are inserted into the worker code:

(function () {
    let factor;
    function mapper(value) {
        return value * factor;
    }
    
    function entrymapper() {
        try {
            const _environment = arguments[arguments.length - 1];
            factor = _environment.factor;
            return mapper.apply(this, arguments);
        } finally {
            factor = undefined
        }
    }
 
    slaveFunctionLookupTable.registerStaticFunction({
        identifier: 'static:function-declaration-with-environment-case.js/entrymapper',
        _______isFunctionId: true
    }, entrymapper);
})();

Besides inserting and registrating all the used functions, the worker rewriter also inserts references to all the used imports. However, it only adds import statements and does not include the imported resources into the bundles itself. To do so, a bundler like webpack should be used.

Test Cases

Test cases showing the expected output can be found in the test-cases directory.

Readme

Keywords

none

Package Sidebar

Install

npm i babel-plugin-parallel-es

Weekly Downloads

2

Version

0.1.8

License

MIT

Last publish

Collaborators

  • datenmetzgerx