From 9447382cc9d8187f81c46a802cd8e6b19f2c2531 Mon Sep 17 00:00:00 2001 From: Rod Montrose Date: Fri, 10 Oct 2025 11:53:07 -0600 Subject: [PATCH] Worker subclass Example Showing how to create a class derived from the Worker class. You need a separate coreworker.js function for the task. --- examples/base/workerclass/coreworker.js | 9 ++++ examples/base/workerclass/main.js | 51 +++++++++++++++++++++++ examples/base/workerclass/manifest.json | 31 ++++++++++++++ examples/base/workerclass/simpleworker.js | 15 +++++++ 4 files changed, 106 insertions(+) create mode 100644 examples/base/workerclass/coreworker.js create mode 100644 examples/base/workerclass/main.js create mode 100644 examples/base/workerclass/manifest.json create mode 100644 examples/base/workerclass/simpleworker.js diff --git a/examples/base/workerclass/coreworker.js b/examples/base/workerclass/coreworker.js new file mode 100644 index 0000000000..91aa300038 --- /dev/null +++ b/examples/base/workerclass/coreworker.js @@ -0,0 +1,9 @@ +import { SimpleWorker } from "simpleworker"; + +/* + * coreworker.js + * Runs INSIDE the worker context. Uses global onmessage/postMessage. + * This is where you respond to main-thread messages. + */ + +self.onmessage = SimpleWorker.prototype.onmessage.bind(self); \ No newline at end of file diff --git a/examples/base/workerclass/main.js b/examples/base/workerclass/main.js new file mode 100644 index 0000000000..7c3dea1c67 --- /dev/null +++ b/examples/base/workerclass/main.js @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016-2023 Moddable Tech, Inc. + * + * This file is part of the Moddable SDK. + * + * This work is licensed under the + * Creative Commons Attribution 4.0 International License. + * To view a copy of this license, visit + * . + * or send a letter to Creative Commons, PO Box 1866, + * Mountain View, CA 94042, USA. + * + */ + +import { SimpleWorker } from "simpleworker"; + +trace("main.js: hello\n"); + +let index = 0 + +function start() { + // note: chunk, heap (slots), and stack are very small - most real-world workers will require different settings + trace("main.js: Starting, creating worker\n"); + const aWorker = new SimpleWorker("coreworker", { + static: 8 * 1024, // total bytes for slots and chunks, in bytes + chunk: { // size in bytes, for strings, array buffers + initial: 1536, + incremental: 256 + }, + heap: { // in 16 byte slots + initial: 128, // 2K bytes + incremental: 32 + }, + stack: 128 // number of 16 byte slots + }); + trace("main.js: Worker created\n"); + aWorker.postMessage({hello: "world", index: ++index}); + aWorker.postMessage("hello, again"); + aWorker.postMessage([1, 2, 3]); + trace("main.js: Messages sent\n"); + aWorker.onmessage = function(message) { + trace(`main.js: worker -> ${JSON.stringify(message)}\n`); + if (3 === message.counter) { + trace(`main.js: restarting worker ${index}\n`); + aWorker.terminate(); + start(); + } + } +} + +start(); \ No newline at end of file diff --git a/examples/base/workerclass/manifest.json b/examples/base/workerclass/manifest.json new file mode 100644 index 0000000000..e92956ec6e --- /dev/null +++ b/examples/base/workerclass/manifest.json @@ -0,0 +1,31 @@ +{ + "include": [ + "$(MODDABLE)/examples/manifest_base.json", + "$(MODULES)/base/worker/manifest.json" + ], + "creation": { + "static": 12288, + "chunk": { + "initial": 1536, + "incremental": 512 + }, + "heap": { + "initial": 64, + "incremental": 32 + }, + "stack": 128, + "keys": { + "available": 32, + "name": 53, + "symbol": 3 + }, + "main": "main" + }, + "modules": { + "*": [ + "./main", + "./simpleworker", + "./coreworker" + ] + } +} diff --git a/examples/base/workerclass/simpleworker.js b/examples/base/workerclass/simpleworker.js new file mode 100644 index 0000000000..78012c2ef3 --- /dev/null +++ b/examples/base/workerclass/simpleworker.js @@ -0,0 +1,15 @@ +/* + * SimpleWorker: main-thread wrapper that subclasses Worker. + * This class lives on the main side. The *worker-side* logic is in "coreworker.js". + */ + +import Worker from "worker"; + +export class SimpleWorker extends Worker { + static counter = 0; + + onmessage(msg) { + trace(`simpleworker.js: counter: ${SimpleWorker.counter} message: ${JSON.stringify(msg)}\n`); + this.postMessage({hello: "from simple worker", counter: ++SimpleWorker.counter}); + } +} \ No newline at end of file