diff --git a/packages/wasm-crypto/package.json b/packages/wasm-crypto/package.json index 6b7d5e93..213ae03e 100644 --- a/packages/wasm-crypto/package.json +++ b/packages/wasm-crypto/package.json @@ -18,6 +18,8 @@ "sideEffects": [ "./detectPackage.js", "./detectPackage.cjs", + "./initNone.js", + "./initNone.cjs", "./initOnlyAsm.js", "./initOnlyAsm.cjs", "./initOnlyWasm.js", diff --git a/packages/wasm-crypto/src/bridge.ts b/packages/wasm-crypto/src/bridge.ts index 22af7622..63ebbd25 100644 --- a/packages/wasm-crypto/src/bridge.ts +++ b/packages/wasm-crypto/src/bridge.ts @@ -15,6 +15,7 @@ type PopFirst = interface Bridge { cachegetInt32: Int32Array | null; cachegetUint8: Uint8Array | null; + initFn: null | (() => Promise); type: 'wasm' | 'asm'; wasm: WasmCryptoInstance | null; wasmPromise: Promise | null; @@ -23,6 +24,7 @@ interface Bridge { export const __bridge: Bridge = { cachegetInt32: null, cachegetUint8: null, + initFn: null, type: 'wasm', wasm: null, wasmPromise: null diff --git a/packages/wasm-crypto/src/bundle.ts b/packages/wasm-crypto/src/bundle.ts index eb74836d..7f307a26 100644 --- a/packages/wasm-crypto/src/bundle.ts +++ b/packages/wasm-crypto/src/bundle.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { __bridge, allocString, allocU8a, getWasm, resultString, resultU8a, withWasm } from './bridge'; -import { setWasmOnlyPromise } from './initOnlyWasmBase'; +import { initWasm } from './init'; export { packageInfo } from './packageInfo'; @@ -202,10 +202,17 @@ export function isReady (): boolean { return !!getWasm(); } -export function waitReady (): Promise { - return ( - __bridge.wasmPromise || setWasmOnlyPromise() - ) +export async function waitReady (): Promise { + if (!__bridge.wasmPromise) { + if (!__bridge.initFn) { + __bridge.initFn = initWasm; + } + + __bridge.wasmPromise = __bridge.initFn().catch(() => undefined); + } + + return __bridge + .wasmPromise .then(() => isReady()) .catch(() => false); } diff --git a/packages/wasm-crypto/src/init.ts b/packages/wasm-crypto/src/init.ts index 2ae66cf7..7349f6b8 100644 --- a/packages/wasm-crypto/src/init.ts +++ b/packages/wasm-crypto/src/init.ts @@ -4,6 +4,7 @@ import type { AsmCreator, WasmCryptoInstance } from './types'; import { assert } from '@polkadot/util'; +import { wasmBytes } from '@polkadot/wasm-crypto-wasm'; import { __bridge } from './bridge'; import * as wbg from './imports'; @@ -28,10 +29,12 @@ async function createPromise (wasmBytes: Uint8Array | null, asmFn: AsmCreator | } } -export function setPromise (wasmBytes: Uint8Array | null, asmFn: AsmCreator | null, force = false): Promise { - if (!__bridge.wasmPromise || force) { - __bridge.wasmPromise = createPromise(wasmBytes, asmFn); - } +export function setPromise (wasmBytes: Uint8Array | null, asmFn: AsmCreator | null): Promise { + __bridge.wasmPromise = createPromise(wasmBytes, asmFn); return __bridge.wasmPromise; } + +export function initWasm (): Promise { + return setPromise(wasmBytes, null); +} diff --git a/packages/wasm-crypto/src/initNone.ts b/packages/wasm-crypto/src/initNone.ts index bcb88e45..b65011be 100644 --- a/packages/wasm-crypto/src/initNone.ts +++ b/packages/wasm-crypto/src/initNone.ts @@ -20,4 +20,4 @@ export function initWasm (): Promise { return setWasmOnlyPromise(); } -initWasm().catch(() => undefined); +__bridge.initFn = initWasm; diff --git a/packages/wasm-crypto/src/initOnlyAsm.ts b/packages/wasm-crypto/src/initOnlyAsm.ts index 18955613..07bbc254 100644 --- a/packages/wasm-crypto/src/initOnlyAsm.ts +++ b/packages/wasm-crypto/src/initOnlyAsm.ts @@ -3,10 +3,11 @@ import { asmJsInit } from '@polkadot/wasm-crypto-asmjs'; +import { __bridge } from './bridge'; import { setPromise } from './init'; export function initWasm (): Promise { - return setPromise(null, asmJsInit, true); + return setPromise(null, asmJsInit); } -initWasm().catch(() => undefined); +__bridge.initFn = initWasm; diff --git a/packages/wasm-crypto/src/initOnlyWasm.ts b/packages/wasm-crypto/src/initOnlyWasm.ts index bacaa098..cf9947d1 100644 --- a/packages/wasm-crypto/src/initOnlyWasm.ts +++ b/packages/wasm-crypto/src/initOnlyWasm.ts @@ -1,10 +1,7 @@ // Copyright 2019-2022 @polkadot/wasm-crypto authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { setWasmOnlyPromise } from './initOnlyWasmBase'; +import { __bridge } from './bridge'; +import { initWasm } from './init'; -export function initWasm (): Promise { - return setWasmOnlyPromise(); -} - -initWasm().catch(() => undefined); +__bridge.initFn = initWasm; diff --git a/packages/wasm-crypto/src/initOnlyWasmBase.ts b/packages/wasm-crypto/src/initOnlyWasmBase.ts deleted file mode 100644 index 4c1eba7b..00000000 --- a/packages/wasm-crypto/src/initOnlyWasmBase.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2019-2022 @polkadot/wasm-crypto authors & contributors -// SPDX-License-Identifier: Apache-2.0 - -import { wasmBytes } from '@polkadot/wasm-crypto-wasm'; - -import { setPromise } from './init'; - -export function setWasmOnlyPromise (force = false): Promise { - return setPromise(wasmBytes, null, force); -} diff --git a/packages/wasm-crypto/src/initWasmAsm.ts b/packages/wasm-crypto/src/initWasmAsm.ts index a76846fd..a8c0ec0e 100644 --- a/packages/wasm-crypto/src/initWasmAsm.ts +++ b/packages/wasm-crypto/src/initWasmAsm.ts @@ -4,10 +4,11 @@ import { asmJsInit } from '@polkadot/wasm-crypto-asmjs'; import { wasmBytes } from '@polkadot/wasm-crypto-wasm'; +import { __bridge } from './bridge'; import { setPromise } from './init'; export function initWasm (): Promise { - return setPromise(wasmBytes, asmJsInit, true); + return setPromise(wasmBytes, asmJsInit); } -initWasm().catch(() => undefined); +__bridge.initFn = initWasm;