{"id":25043509,"url":"https://github.com/darrencocco/moodle-local_webworkers","last_synced_at":"2025-04-14T01:33:20.214Z","repository":{"id":45414551,"uuid":"194597160","full_name":"darrencocco/moodle-local_webworkers","owner":"darrencocco","description":"Web Worker support for Moodle","archived":false,"fork":false,"pushed_at":"2024-11-05T02:51:02.000Z","size":4196,"stargazers_count":0,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-03-27T15:48:32.334Z","etag":null,"topics":["moodle","requirejs","webworkers"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/darrencocco.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-07-01T04:01:57.000Z","updated_at":"2024-11-05T02:50:11.000Z","dependencies_parsed_at":"2024-11-08T09:01:31.859Z","dependency_job_id":null,"html_url":"https://github.com/darrencocco/moodle-local_webworkers","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darrencocco%2Fmoodle-local_webworkers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darrencocco%2Fmoodle-local_webworkers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darrencocco%2Fmoodle-local_webworkers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darrencocco%2Fmoodle-local_webworkers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/darrencocco","download_url":"https://codeload.github.com/darrencocco/moodle-local_webworkers/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248808170,"owners_count":21164802,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["moodle","requirejs","webworkers"],"created_at":"2025-02-06T04:56:51.394Z","updated_at":"2025-04-14T01:33:20.182Z","avatar_url":"https://github.com/darrencocco.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"### Moodle Web Worker support\nAdds a way of using [Web Workers][1] inside of YUI and AMD code\n\nWeb workers give you the ability to run JavaScript code in a thread\nthat will not interrupt the main thread that all the DOM interactions\netc run on.\n\n#### TODO\n* Add caching to worker.php (done)\n* Test and add support for Service Workers\n* Add Shared Workers tests (done)\n\n#### Usage examples\n\nFor YUI use:\n```JavaScript\nvar exampleDedicatedWorker;\nM.util.js_pending(\"YUI/yourScriptName/exampleDedicatedWorker\");\nrequire([\"local_webworkers/web_worker\"], function(webWorker) {\n    exampleDedicatedWorker = new Worker(webWorker.toURI(\"{plugin}/{component}\"));\n    M.util.js_complete(\"YUI/yourScriptName/exampleDedicatedWorker\");\n});\nexampleDedicatedWorker.onmessage = function(event) {\n    console.log(event.data);\n};\n```\n\nFor AMD use:\n```JavaScript\ndefine(['local_webworkers/web_worker'], function({webWorker}) {\n    let dedicatedWorker = new Worker(webWorker.toURI('{plugin}/{component}'));\n    dedicatedWorker.addEventListener('message', function(event) {\n        console.log(event.data);\n    });\n    dedicatedWorker.postMessage('');\n    \n    let sharedWorker = new SharedWorker(webWorker.toURI('{plugin}/{component}'));\n    sharedWorker.port.addEventListener('message', function(event) {\n        console.log(event.data);\n    });\n    sharedWorker.port.start();\n    sharedWorker.port.postMessage('');\n});\n```\n\nImplement a Dedicated Worker:\n```JavaScript\ndefine(['local_webworkers/web_worker'], function(webWorker) {\n    return {\n        init: function() {\n            self.addEventListener('message', function(e) {\n                self.postMessage({\n                    type: 'TextMessage',\n                    contentsString: e.data.contentsString,\n                });\n            });\n            webWorker.workerSetupComplete();\n        }\n    };\n});\n```\n\nImplement a Shared Worker:\n```JavaScript\ndefine(['local_webworkers/web_worker'], function(webWorker) {\n    return {\n        init: function() {\n            let portMap = [];\n\n            /**\n             * Generates a sequential set of numbers for the\n             * lifetime of the worker.\n             * @returns {Generator\u003cnumber, void, *\u003e}\n             */\n            function* generatePortNumber() {\n                const start = 0;\n                const end = Infinity;\n                const step = 1;\n                for (let i = start; i \u003c end; i += step) {\n                    yield i;\n                }\n            }\n            let portNumber =  generatePortNumber();\n\n            self.addEventListener(\"connect\", (e) =\u003e {\n                let clientId = portNumber.next().value;\n                portMap[clientId] = e.ports[0];\n                e.ports[0].addEventListener(\"message\", handleClientMessage(clientId));\n                e.ports[0].start();\n            });\n\n            let handleMessage = (clientId, e) =\u003e {\n                portMap.forEach(function (port, portId) {\n                    if (clientId != portId) {\n                        port.postMessage({\n                            type: 'TextMessage',\n                            clientId: clientId,\n                            contentsString: e.data.contentsString,\n                        });\n                    } else {\n                        port.postMessage({\n                            type: 'Pong',\n                            clientId: clientId,\n                            contentsString: e.data.contentsString,\n                        });\n                    }\n                });\n            };\n\n            let handleClientMessage = (clientId) =\u003e {\n                return (e) =\u003e {\n                    return handleMessage(clientId, e);\n                };\n            };\n            webWorker.workerSetupComplete();\n        }\n    };\n});\n```\n\n[1]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarrencocco%2Fmoodle-local_webworkers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdarrencocco%2Fmoodle-local_webworkers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarrencocco%2Fmoodle-local_webworkers/lists"}