diff --git a/rapier-compat/src2d/init.ts b/rapier-compat/src2d/init.ts index 4a21ed03..6cb24f24 100644 --- a/rapier-compat/src2d/init.ts +++ b/rapier-compat/src2d/init.ts @@ -3,10 +3,37 @@ import wasmBase64 from "../pkg2d/rapier_wasm2d_bg.wasm"; import wasmInit from "../pkg2d/rapier_wasm2d"; import base64 from "base64-js"; +/** + * Flag to check if RAPIER has already been initialized + * or is currently being initialized. + */ +let initialized = false; + +/** + * If init has already been called before but initialization + * is not done yet, the unresolved promise is returned. + */ +let initPromise: ReturnType | undefined = undefined; + /** * Initializes RAPIER. * Has to be called and awaited before using any library methods. */ export async function init() { - await wasmInit(base64.toByteArray(wasmBase64 as unknown as string).buffer); + // return if RAPIER has been initialized + if (initialized) return; + + // return the unresolve promise if RAPIER is currently initializing + if (initPromise) return initPromise; + + // init and assign promise + initPromise = wasmInit( + base64.toByteArray(wasmBase64 as unknown as string).buffer, + ); + + // await initialization + await initPromise; + + // set initialized flag + initialized = true; } diff --git a/rapier-compat/src3d/init.ts b/rapier-compat/src3d/init.ts index 0ad05f63..8a438257 100644 --- a/rapier-compat/src3d/init.ts +++ b/rapier-compat/src3d/init.ts @@ -3,10 +3,37 @@ import wasmBase64 from "../pkg3d/rapier_wasm3d_bg.wasm"; import wasmInit from "../pkg3d/rapier_wasm3d"; import base64 from "base64-js"; +/** + * Flag to check if RAPIER has already been initialized + * or is currently being initialized. + */ +let initialized = false; + +/** + * If init has already been called before but initialization + * is not done yet, the unresolved promise is returned. + */ +let initPromise: ReturnType | undefined = undefined; + /** * Initializes RAPIER. * Has to be called and awaited before using any library methods. */ export async function init() { - await wasmInit(base64.toByteArray(wasmBase64 as unknown as string).buffer); + // return if RAPIER has been initialized + if (initialized) return; + + // return the unresolve promise if RAPIER is currently initializing + if (initPromise) return initPromise; + + // init and assign promise + initPromise = wasmInit( + base64.toByteArray(wasmBase64 as unknown as string).buffer, + ); + + // await initialization + await initPromise; + + // set initialized flag + initialized = true; }