WebWorkers Support

Local plugins ::: local_webworkers
Maintained by Darren Cocco
Web Workers Support

WebWorkers Support 0.2.7

Moodle 4.1, 4.2, 4.3, 4.4, 4.5
Released: Tuesday, November 5, 2024, 10:51 AM

Moodle Web Worker support

Adds a way of using Web Workers inside of YUI and AMD code

Web workers give you the ability to run JavaScript code in a thread that will not interrupt the main thread that all the DOM interactions etc run on.

TODO

  • Add caching to worker.php (done)
  • Test and add support for Service Workers
  • Add Shared Workers tests (done)

Usage examples

For YUI use:

var exampleDedicatedWorker;
M.util.js_pending("YUI/yourScriptName/exampleDedicatedWorker");
require(["local_webworkers/web_worker"], function(webWorker) {
    exampleDedicatedWorker = new Worker(webWorker.toURI("{plugin}/{component}"));
    M.util.js_complete("YUI/yourScriptName/exampleDedicatedWorker");
});
exampleDedicatedWorker.onmessage = function(event) {
    console.log(event.data);
};

For AMD use:

define(['local_webworkers/web_worker'], function({webWorker}) {
    let dedicatedWorker = new Worker(webWorker.toURI('{plugin}/{component}'));
    dedicatedWorker.addEventListener('message', function(event) {
        console.log(event.data);
    });
    dedicatedWorker.postMessage('');

    let sharedWorker = new SharedWorker(webWorker.toURI('{plugin}/{component}'));
    sharedWorker.port.addEventListener('message', function(event) {
        console.log(event.data);
    });
    sharedWorker.port.start();
    sharedWorker.port.postMessage('');
});

Implement a Dedicated Worker:

define(['local_webworkers/web_worker'], function(webWorker) {
    return {
        init: function() {
            self.addEventListener('message', function(e) {
                self.postMessage({
                    type: 'TextMessage',
                    contentsString: e.data.contentsString,
                });
            });
            webWorker.workerSetupComplete();
        }
    };
});

Implement a Shared Worker:

define(['local_webworkers/web_worker'], function(webWorker) {
    return {
        init: function() {
            let portMap = [];

            /**
             * Generates a sequential set of numbers for the
             * lifetime of the worker.
             * @returns {Generator<number, void, *>}
             */
            function* generatePortNumber() {
                const start = 0;
                const end = Infinity;
                const step = 1;
                for (let i = start; i < end; i += step) {
                    yield i;
                }
            }
            let portNumber =  generatePortNumber();

            self.addEventListener("connect", (e) => {
                let clientId = portNumber.next().value;
                portMap[clientId] = e.ports[0];
                e.ports[0].addEventListener("message", handleClientMessage(clientId));
                e.ports[0].start();
            });

            let handleMessage = (clientId, e) => {
                portMap.forEach(function (port, portId) {
                    if (clientId != portId) {
                        port.postMessage({
                            type: 'TextMessage',
                            clientId: clientId,
                            contentsString: e.data.contentsString,
                        });
                    } else {
                        port.postMessage({
                            type: 'Pong',
                            clientId: clientId,
                            contentsString: e.data.contentsString,
                        });
                    }
                });
            };

            let handleClientMessage = (clientId) => {
                return (e) => {
                    return handleMessage(clientId, e);
                };
            };
            webWorker.workerSetupComplete();
        }
    };
});

Version information

Version build number
2024110500
Version release name
0.2.7
Maturity
Alpha
MD5 Sum
0384ea46f982ef994c0b7b9474a98269
Supported software
Moodle 4.1, Moodle 4.2, Moodle 4.3, Moodle 4.4, Moodle 4.5
  • Latest release for Moodle 4.1
  • Latest release for Moodle 4.2
  • Latest release for Moodle 4.3
  • Latest release for Moodle 4.4
  • Latest release for Moodle 4.5

Version control information

Version control system (VCS)
GIT
VCS repository URL
VCS tag
v0.2.7

Default installation instructions for plugins of the type Local plugins

  1. Make sure you have all the required versions.
  2. Download and unpack the module.
  3. Place the folder in the "local" subdirectory.
  4. Visit http://yoursite.com/admin to finish the installation.