Skip to content
Snippets Groups Projects
Select Git revision
  • ccb2cba19cb540a435f3a013faa066fb285d4ca8
  • master default protected
  • 1.31
  • 4.38.2
  • 4.38.1
  • 4.38.0
  • 4.37.2
  • 4.37.1
  • 4.37.0
  • 4.36.0
  • 4.35.0
  • 4.34.1
  • 4.34.0
  • 4.33.1
  • 4.33.0
  • 4.32.2
  • 4.32.1
  • 4.32.0
  • 4.31.0
  • 4.30.1
  • 4.30.0
  • 4.29.1
  • 4.29.0
23 results

factory.js

Blame
  • Volker Schukai's avatar
    ccb2cba1
    History
    factory.js 3.34 KiB
    'use strict';
    
    
    /**
     * @author schukai GmbH
     */
    
    
    import {internalSymbol} from "../../constants.js";
    import {assignToNamespace, Monster} from "../../namespace.js";
    import {Base} from "../../types/base.js";
    import {getGlobal, getGlobalFunction} from "../../types/global.js";
    import {isFunction} from "../../types/is.js";
    import {validateInstance, validateString} from "../../types/validate.js";
    
    
    
    /**
     * You can call the function via the monster namespace `new Monster.DOM.Worker.getLocaleOfDocument()`.
     *
     * ```
     * <script type="module">
     * import {Monster} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.31.0/dist/monster.js';
     * console.log(new Monster.DOM.Worker.Factory())
     * </script>
     * ```
     *
     * Alternatively, you can also integrate this function individually.
     *
     * ```
     * <script type="module">
     * import {Factory} from 'https://cdn.jsdelivr.net/npm/@schukai/monster@1.31.0/dist/modules/dom/worker/factory.js';
     * console.log(new Factory())
     * </script>
     * ```
     *
     * @since 1.25.0
     * @copyright schukai GmbH
     * @memberOf Monster.DOM.Worker
     * @summary A small factory to create worker
     */
    class Factory extends Base {
    
    
        /**
         *
         */
        constructor() {
            super();
            this[internalSymbol] = {
                worker: new WeakMap
            }
        }
    
        /**
         * Creates a worker from a URL
         *
         * @param {string|URL} url
         * @param {function} messageHandler
         * @param {function} errorHandler
         * @return {Worker}
         */
        createFromURL = function (url, messageHandler, errorHandler) {
    
            if (url instanceof URL) {
                url = url.toString();
            }
    
            const workerClass = getGlobalFunction('Worker');
            var worker = new workerClass(validateString(url));
    
            if (isFunction(messageHandler)) {
                worker.onmessage = (event) => {
                    messageHandler.call(worker, event);
                }
            }
    
            if (isFunction(errorHandler)) {
                worker.onerror = (event) => {
                    errorHandler.call(worker, event);
                }
            }
    
            return worker;
        };
    
        /**
         * Creates a worker from a script
         *
         * @param {string} content
         * @param {function} messageHandler
         * @param {function} errorHandler
         * @return {Worker}
         * @see https://developer.mozilla.org/de/docs/Web/API/URL/createObjectURL
         */
        createFromScript = function (content, messageHandler, errorHandler) {
            const blobFunction = new getGlobalFunction('Blob')
            const blob = new blobFunction([validateString(content)], {type: 'script/javascript'});
    
            const url = getGlobalFunction('URL').createObjectURL(blob);
            const worker = this.createFromURL(url, messageHandler, errorHandler);
    
            this[internalSymbol]['worker'].set(worker, url);
    
            return worker;
    
        };
    
        /**
         * Terminate the worker and call revokeObjectURL if necessary.
         *
         * @param worker
         * @return {Monster.DOM.Worker.Factory}
         */
        terminate(worker) {
    
            const workerClass = getGlobalFunction('Worker');
            validateInstance(worker, workerClass);
    
            worker.terminate();
    
            if (this[internalSymbol]['worker'].has(worker)) {
                const url = this[internalSymbol]['worker'].get(worker);
                URL.revokeObjectURL(url);
            }
    
            return this;
        }
    
    
    }
    
    assignToNamespace('Monster.DOM.Worker', Factory);
    export {Monster, Factory}