# Initializing CSG2 in Node.JS

**URL:** <https://forum.babylonjs.com/t/initializing-csg2-in-node-js/56431>\
**Category:** Questions\
**Tags:** nullengine, csg2\
**Created:** [February 6, 2025, 6:57pm UTC](https://forum.babylonjs.com/t/initializing-csg2-in-node-js/56431 "2025-02-06T18:57:56Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![Benoittr](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/benoittr/32/44974_2.png) [@Benoittr](https://forum.babylonjs.com/u/Benoittr)\
**Post date:** [February 6, 2025, 6:57pm UTC](https://forum.babylonjs.com/t/initializing-csg2-in-node-js/56431/1 "2025-02-06T18:57:56Z")

</div>

Im using Babylon in headless mode using NullEngine in Node.Js  
BABYLON.InitializeCSG2Async() does not enjoy being outside of the browser.  
Is there a workaround?

I’ve tried to load jsdom manually to no extend (initialize seems to enter an infinite loop now).

import { JSDOM } from ‘jsdom’;  
const dom = new JSDOM(‘’);  
globalThis.window = dom.window;  
globalThis.document = dom.window.document;

It seems to me doing boolean operation should not depend on the browser/window/dom.

---

<div class="post-metadata">

**Author:** ![Deltakosh](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/deltakosh/32/26635_2.png) [@Deltakosh](https://forum.babylonjs.com/u/Deltakosh)\
**Post date:** [February 6, 2025, 7:01pm UTC](https://forum.babylonjs.com/t/initializing-csg2-in-node-js/56431/2 "2025-02-06T19:01:29Z")

</div>

> [@Benoittr](#):
>
> InitializeCSG2Async

Well first what is the error? Init does not require access to webgl but csg2 will create and manipulate mesh so that will require a gl context for sure (unless you stick with VertexData then it should work)

Also does Node.js support wasm?

---

<div class="post-metadata">

**Author:** ![Benoittr](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/benoittr/32/44974_2.png) [@Benoittr](https://forum.babylonjs.com/u/Benoittr)\
**Post date:** [February 6, 2025, 7:11pm UTC](https://forum.babylonjs.com/t/initializing-csg2-in-node-js/56431/3 "2025-02-06T19:11:14Z")

</div>

That’s the error I got prior to doing the little hack mentionned in the original question.

Error: Cannot load script module outside of a window or a worker  
at […]node\_modules@babylonjs\core\Misc\tools.internals.js:31:20  
at new Promise ()  
at \_LoadScriptModuleAsync ([…]node\_modules@babylonjs\core\Misc\tools.internals.js:18:12)  
at Module.InitializeCSG2Async ([…]node\_modules@babylonjs\core\Meshes\csg2.js:344:30)

I’m relatively new to node.js but it seems to support wasm (but it might be accessed / behave differently). I’ve never toyed with webassembly yet.

---

<div class="post-metadata">

**Author:** ![Deltakosh](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/deltakosh/32/26635_2.png) [@Deltakosh](https://forum.babylonjs.com/u/Deltakosh)\
**Post date:** [February 6, 2025, 8:35pm UTC](https://forum.babylonjs.com/t/initializing-csg2-in-node-js/56431/4 "2025-02-06T20:35:47Z")

</div>

yeah that may not be the issue. Let me ping the boss @RaananW

---

<div class="post-metadata">

**Author:** ![RaananW](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/raananw/32/28955_2.png) [@RaananW](https://forum.babylonjs.com/u/RaananW)\
**Post date:** [February 6, 2025, 8:40pm UTC](https://forum.babylonjs.com/t/initializing-csg2-in-node-js/56431/5 "2025-02-06T20:40:24Z")

</div>

Node.js does support WASM. The exception comes from our code and not from node directly. The code is this:

```auto
        if (IsWindowObjectExist()) {
            windowAsAny = window;
            windowString = "window";
        } else if (typeof self !== "undefined") {
            windowAsAny = self;
            windowString = "self";
        } else {
            reject(new Error("Cannot load script module outside of a window or a worker"));
            return;
        }

```

And yes, this will fail in node, as node doesn’t have `windows` nor `self`. It does support `globalThis`, so it should be working correctly with slight adjustments. I can run a few tests tomorrow and see if that solves the issue for js runners (node/deno/bun?)

---

<div class="post-metadata">

**Author:** ![RaananW](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/raananw/32/28955_2.png) [@RaananW](https://forum.babylonjs.com/u/RaananW)\
**Post date:** [February 6, 2025, 8:40pm UTC](https://forum.babylonjs.com/t/initializing-csg2-in-node-js/56431/6 "2025-02-06T20:40:35Z")

</div>



---

<div class="post-metadata">

**Author:** ![Deltakosh](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/deltakosh/32/26635_2.png) [@Deltakosh](https://forum.babylonjs.com/u/Deltakosh)\
**Post date:** [February 6, 2025, 8:41pm UTC](https://forum.babylonjs.com/t/initializing-csg2-in-node-js/56431/7 "2025-02-06T20:41:02Z")

</div>

thanks mate!

---

<div class="post-metadata">

**Author:** ![RaananW](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/raananw/32/28955_2.png) [@RaananW](https://forum.babylonjs.com/u/RaananW)\
**Post date:** [February 7, 2025, 11:52am UTC](https://forum.babylonjs.com/t/initializing-csg2-in-node-js/56431/8 "2025-02-07T11:52:41Z")

</div>

The quickest solution is this:

```javascript
import { InitializeCSG2Async } from "@babylonjs/core";
import Module from "manifold-3d";
const wasm = await Module();
wasm.setup();
const { Manifold, Mesh } = wasm;
InitializeCSG2Async({
  manifoldInstance: Manifold,
  manifoldMeshInstance: Mesh,
}).then(() => {
  console.log("CSG2 initialized");
});

```

Install `manifold-3d` and provide the instance yourself after initializing it. No changes needed in Babylon core 🙂

---

<div class="post-metadata">

**Author:** ![RaananW](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/raananw/32/28955_2.png) [@RaananW](https://forum.babylonjs.com/u/RaananW)\
**Post date:** [February 7, 2025, 11:55am UTC](https://forum.babylonjs.com/t/initializing-csg2-in-node-js/56431/9 "2025-02-07T11:55:05Z")

</div>



---

<div class="post-metadata">

**Author:** ![Benoittr](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/benoittr/32/44974_2.png) [@Benoittr](https://forum.babylonjs.com/u/Benoittr)\
**Post date:** [February 7, 2025, 4:24pm UTC](https://forum.babylonjs.com/t/initializing-csg2-in-node-js/56431/10 "2025-02-07T16:24:12Z")

</div>

Impressed by how fast you came up with a workaround, good job and thank you very much!
