Skip to content
ialex32x edited this page Feb 18, 2025 · 3 revisions

Worker is currently supported as an experimental feature with limitations:

  • Can not use script classes (GodotJSScript) in workers
  • transferable objects are not supported
  • onerror and onready events are not implemented yet

Warning

The class name Worker may be changed in future versions for compatibility in different JS engines.
And, Worker scripts may need to have a specific file name suffix or reside in a designated directory.

A Simple Example

// tests/master.ts
// ...
import { Object, Node } from "godot";
import { JSWorker } from "godot.worker";

let worker = new JSWorker("tests/worker");
worker.onmessage = function (m: any) {
    console.log("master: get message", m);
}
worker.ontransfer = function (obj: Object) {
    console.assert(obj instanceof Node);
    this.add_child(obj);
    worker.terminate();
}
worker.postMessage("hello");
// tests/worker.ts
import { PackedScene, ResourceLoader } from "godot";
import { JSWorkerParent } from "godot.worker";

if (typeof JSWorkerParent !== "undefined") {
    JSWorkerParent.onmessage = function (m: any) {
        console.log("worker: get message", m);
        JSWorkerParent.postMessage("worker result");

        // [EXPERIMENTAL] instantiate a PackedScene in worker thread and transfer it back to master thread
        let asset = <PackedScene>ResourceLoader.load("res://background.tscn");
        let obj = asset.instantiate();
        console.log("[worker] transfering object:", obj);
        JSWorkerParent.transfer(obj);

        // worker can terminate itself by calling `close()`
        // close();
    }
}