Description
A wasm2js-transpiled JS module is throwing an error after an async call, but the WASM binary is working just fine. The wasm binary is compiled from a rust crate using wasm-bindgen
and then built with wasm-pack
. For some context, this async call is to a Rust function that then makes a async call back into JS before returning.
The error in particular is
# Unhandled error between tests
-------------------------------
152 | try {
153 | return f(a, state.b, ...args);
154 | } finally {
155 | if (--state.cnt === 0) {
156 | console.debug("In makeMutClosure", {export3: wasm$1.__wbindgen_export_3, wasm1: wasm$1});
157 | wasm$1.__wbindgen_export_3.get(state.dtor)(a, state.b);
^
TypeError: undefined is not an object (evaluating 'wasm$1.__wbindgen_export_3.get')
at real (/Users/joe/git/algorandfoundation/algokit-core/packages/typescript/algokit_utils/dist/algokit_utils.wasm2js.mjs:157:24)
To be clear, the code after the async function still runs, so this seems to be happening async somewhere. Adding a debug statement to this finally
block I can see, export 3, which is the function table, is indeed undefined.
In makeMutClosure {
export3: undefined,
wasm1: [Object: null prototype] {
__wbg_composer_free: [Function: $174],
__wbindgen_add_to_stack_pointer: [Function: $413],
__wbindgen_export_0: [Function: $330],
__wbindgen_export_1: [Function: $341],
__wbindgen_export_2: [Function: $390],
__wbindgen_export_4: [Function: $375],
__wbindgen_export_5: [Function: $358],
__wbindgen_export_6: [Function: $354],
addressFromPubKey: [Function: $248],
addressFromString: [Function: $249],
assignFee: [Function: $99],
attachSignature: [Function: $192],
composer_addTransaction: [Function: $138],
composer_encode: [Function: $131],
composer_getSuggestedParams: [Function: $336],
composer_new: [Function: $261],
composer_toJSON: [Function: $215],
composer_toString: [Function: $216],
composer_transactions: [Function: $77],
composer_valueOf: [Function: $214],
decodeTransaction: [Function: $86],
encodeTransaction: [Function: $164],
encodeTransactionRaw: [Function: $165],
estimateTransactionSize: [Function: $199],
getAlgorandConstant: [Function: legalstub$260],
getEncodedTransactionType: [Function: $61],
getTransactionId: [Function: $163],
getTransactionIdRaw: [Function: $162],
memory: {
grow: [Function: __wasm_memory_grow],
buffer: [Getter],
},
},
}
The same debug statement when using the WASM binary:
In makeMutClosure {
export3: Table {
length: 225,
grow: [Function: grow],
get: [Function: get],
set: [Function: set],
type: [Function: type],
},
wasm: [Object: null prototype] {
memory: Memory {
grow: [Function: grow],
buffer: ArrayBuffer(1179648) [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... 1179135 more ],
type: [Function: type],
},
composer_addTransaction: [Function: 198],
composer_encode: [Function: 191],
composer_getSuggestedParams: [Function: 396],
composer_transactions: [Function: 137],
__wbg_composer_free: [Function: 234],
composer_new: [Function: 321],
composer_valueOf: [Function: 274],
composer_toJSON: [Function: 275],
composer_toString: [Function: 276],
getEncodedTransactionType: [Function: 121],
encodeTransaction: [Function: 224],
encodeTransactionRaw: [Function: 225],
decodeTransaction: [Function: 146],
attachSignature: [Function: 252],
estimateTransactionSize: [Function: 259],
addressFromPubKey: [Function: 308],
addressFromString: [Function: 309],
getTransactionIdRaw: [Function: 222],
getTransactionId: [Function: 223],
getAlgorandConstant: [Function: 320],
assignFee: [Function: 159],
__wbindgen_export_0: [Function: 390],
__wbindgen_export_1: [Function: 401],
__wbindgen_export_2: [Function: 450],
__wbindgen_export_3: Table {
length: 225,
grow: [Function: grow],
get: [Function: get],
set: [Function: set],
type: [Function: type],
},
__wbindgen_add_to_stack_pointer: [Function: 473],
__wbindgen_export_4: [Function: 435],
__wbindgen_export_5: [Function: 418],
__wbindgen_export_6: [Function: 414],
},
}
The JS files: https://gist.github.com/joe-p/0b12f34e45f5152043f3948d34572e40
The repo: https://github.com/algorandfoundation/algokit-core/tree/2b2eba2c60b0a6d008a4a15bbfa3a76374b04441/packages/typescript/algokit_utils