From 7f018fc74a4119a23b500980fa1a5ba76b397f91 Mon Sep 17 00:00:00 2001 From: Grischa Erbe <46897060+grischaerbe@users.noreply.github.com> Date: Fri, 22 Jul 2022 23:25:25 +0200 Subject: [PATCH] Added checks to init() in compatibility module to catch multiple calls to init() --- rapier-compat/src2d/init.ts | 29 ++++++++++++++++++++++++++++- rapier-compat/src3d/init.ts | 29 ++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) 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; }