2019-08-24 23:56:46 +00:00
|
|
|
/**
|
|
|
|
* 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() {
|
2019-09-12 00:28:58 +00:00
|
|
|
let is_extension_running = false;
|
|
|
|
|
|
|
|
try {
|
|
|
|
//If runtime_path is defined then we are executing inside the extension
|
|
|
|
//closure and we can manually fetch the inner chunks of Ruffle here.
|
|
|
|
is_extension_running = runtime_path !== undefined;
|
|
|
|
} catch (e) {
|
|
|
|
//Checking an undefined closure variable usually throws ReferencError,
|
|
|
|
//so we need to catch it here and continue onward.
|
|
|
|
if (e instanceof ReferenceError) {
|
|
|
|
is_extension_running = false;
|
|
|
|
} else {
|
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (is_extension_running) {
|
|
|
|
//Download Ruffle from the URL the browser gives us.
|
|
|
|
let ruffle_bindings_url = runtime_path + "dist/ruffle_web.js";
|
|
|
|
let ruffle_wasm_url = 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;
|
|
|
|
} else {
|
|
|
|
//We currently assume that if we are not executing inside the extension,
|
|
|
|
//then we can use webpack to get Ruffle.
|
2019-09-03 22:38:05 +00:00
|
|
|
let ruffle_module = await import("../pkg/ruffle");
|
|
|
|
return ruffle_module.Ruffle;
|
2019-08-24 23:56:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|