ruffle/web/js-src/load-ruffle.js

61 lines
2.1 KiB
JavaScript

/**
* Conditional ruffle loader
*/
/**
* Load ruffle from an automatically-detected location.
*
* This function returns a new instance of Ruffle and downloads it every time.
* You should not use it directly; this module will memoize the resource
* download.
*/
async function fetch_ruffle() {
if (!window.runtime_path) {
//Executing on the demo site (which is fully webpack) so we can just use
//webpack to get the Ruffle chunk.
let ruffle_module = await import("../pkg/ruffle");
return ruffle_module.Ruffle;
}
//Download Ruffle from the URL the browser gives us.
let ruffle_bindings_url = window.runtime_path + "dist/ruffle_web.js";
let ruffle_wasm_url = window.runtime_path + "dist/ruffle_web_bg.wasm";
//We load the wasm package early so that both requests are parallelized.
//This won't be awaited by us at all.
let ruffle_wasm_request = fetch(ruffle_wasm_url);
//One point of admin: `wasm-pack`, in no-modules mode, stores it's bindings
//straight in `window`, which we don't want. We grab whatever was in Window
//before loading in the module so we can replace what was there.
let ruffle_bindings_request = await fetch(ruffle_bindings_url);
let ruffle_bindings_src = await ruffle_bindings_request.text();
let noconflict_wasm_bindgen = window.wasm_bindgen;
(new Function(ruffle_bindings_src))();
let ruffle_wasm_bindgen = window.wasm_bindgen;
window.wasm_bindgen = noconflict_wasm_bindgen;
//Next step: Actually initialize our bindings.
let ruffle_wasm_response = await ruffle_wasm_request;
let ruffle_wasm_data = await ruffle_wasm_response.arrayBuffer();
let ruffle_bindings = await ruffle_wasm_bindgen(ruffle_wasm_data).catch(function (e) {
console.error(e);
});
return ruffle_wasm_bindgen.Ruffle;
}
let last_loaded_ruffle = null;
/**
* Obtain an instance of `Ruffle`.
*
* This function returns a promise which yields `Ruffle` asynchronously.
*/
export default function load_ruffle() {
if (last_loaded_ruffle == null) {
last_loaded_ruffle = fetch_ruffle();
}
return last_loaded_ruffle;
}