Skip to content

Commit c2b768c

Browse files
committed
web: Fallback to instantiate with improper MIME type
Use --target web in wasm-bindgen and file-loader for WASM files, allowing wasm-bindgen's built-in fallback from WebAssembly.instantiateStreaming to instantiate. file-loader spits out the WASM file directly in the output folder, and imports will resolve to the URL, so that we can load the file directly, avoiding webpack's built-in wasm loaders. This allows Ruffle to function on web servers even if they serve WASM files with the incorrect MIME type, fixing one of our biggest support requests (#400, #1458). There is some performance impact on loading with the fallback, but this is preferable to not working at all.
1 parent 9df7fac commit c2b768c

File tree

8 files changed

+37
-17
lines changed

8 files changed

+37
-17
lines changed

web/packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"scripts": {
1212
"build": "npm run build:cargo && npm run build:wasm-bindgen && npm run build:wasm-opt && npm run build:ts",
1313
"build:cargo": "cargo build --release --target wasm32-unknown-unknown",
14-
"build:wasm-bindgen": "wasm-bindgen ../../../target/wasm32-unknown-unknown/release/ruffle_web.wasm --out-dir ./pkg --out-name ruffle_web",
14+
"build:wasm-bindgen": "wasm-bindgen ../../../target/wasm32-unknown-unknown/release/ruffle_web.wasm --target web --out-dir ./pkg --out-name ruffle_web",
1515
"build:wasm-opt": "wasm-opt ./pkg/ruffle_web_bg.wasm -O -g --output ./pkg/ruffle_web_bg.opt.wasm && move-file ./pkg/ruffle_web_bg.opt.wasm ./pkg/ruffle_web_bg.wasm || npm run build:wasm-opt-note",
1616
"build:wasm-opt-note": "echo 'NOTE: Since wasm-opt could not be found (or it failed), the resulting module might not perform that well, but it should still work.'",
1717
"build:ts": "tsc -d && node tools/set_version.js",

web/packages/core/src/load-ruffle.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
* Conditional ruffle loader
55
*/
66

7-
import { Ruffle } from "../pkg/ruffle_web";
8-
7+
import init, { Ruffle } from "../pkg/ruffle_web";
98
import { setPolyfillsOnLoad } from "./js-polyfills";
109

1110
/**
@@ -37,8 +36,15 @@ async function fetchRuffle(): Promise<{ new (...args: any[]): Ruffle }> {
3736

3837
// We currently assume that if we are not executing inside the extension,
3938
// then we can use webpack to get Ruffle.
40-
const module = await import("../pkg/ruffle_web");
41-
return module.Ruffle;
39+
40+
// wasm files are set to use file-loader,
41+
// so this package will resolve to the URL of the wasm file.
42+
const ruffleWasm = await import(
43+
/* webpackMode: "eager" */
44+
"../pkg/ruffle_web_bg.wasm"
45+
);
46+
await init(ruffleWasm.default);
47+
return Ruffle;
4248
}
4349

4450
let lastLoaded: Promise<{ new (...args: any[]): Ruffle }> | null = null;

web/packages/demo/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
},
1414
"devDependencies": {
1515
"css-loader": "^5.0.1",
16+
"file-loader": "^6.2.0",
1617
"style-loader": "^2.0.0",
1718
"webpack-cli": "^4.0.0"
1819
}

web/packages/demo/webpack.config.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,6 @@ module.exports = (env, argv) => {
2020
filename: "index.js",
2121
},
2222
mode: mode,
23-
experiments: {
24-
syncWebAssembly: true,
25-
},
2623
devtool: "source-map",
2724
plugins: [
2825
new CleanWebpackPlugin(),
@@ -47,6 +44,10 @@ module.exports = (env, argv) => {
4744
test: /\.css$/i,
4845
use: ["style-loader", "css-loader"],
4946
},
47+
{
48+
test: /\.wasm$/i,
49+
use: ["file-loader"],
50+
},
5051
],
5152
},
5253
};

web/packages/extension/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"ruffle-core": "^0.1.0"
1212
},
1313
"devDependencies": {
14+
"file-loader": "^6.2.0",
1415
"webpack": "^5.1.3"
1516
}
1617
}

web/packages/extension/webpack.config.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ module.exports = (env, argv) => {
1313
console.log(`Building ${mode}...`);
1414

1515
return {
16+
module: {
17+
rules: [
18+
{
19+
test: /\.wasm$/i,
20+
use: ["file-loader"],
21+
},
22+
],
23+
},
1624
entry: {
1725
ruffle: path.resolve(__dirname, "js/index.js"),
1826
main: path.resolve(__dirname, "js/main.js"),
@@ -26,9 +34,6 @@ module.exports = (env, argv) => {
2634
chunkFilename: "core.ruffle.js",
2735
},
2836
mode: mode,
29-
experiments: {
30-
syncWebAssembly: true,
31-
},
3237
plugins: [
3338
new CleanWebpackPlugin(),
3439
new CopyPlugin({

web/packages/selfhosted/package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@
1919
"ruffle-core": "^0.1.0"
2020
},
2121
"devDependencies": {
22-
"webpack-cli": "^4.0.0",
23-
"webpack-dev-server": "^3.11.0",
2422
"@wdio/cli": "^6.1.12",
25-
"webpack": "^5.1.3"
23+
"file-loader": "^6.2.0",
24+
"webpack": "^5.1.3",
25+
"webpack-cli": "^4.0.0",
26+
"webpack-dev-server": "^3.11.0"
2627
}
2728
}

web/packages/selfhosted/webpack.config.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,20 @@ module.exports = (env, argv) => {
2121
chunkFilename: "core.ruffle.[contenthash].js",
2222
},
2323
mode: mode,
24-
experiments: {
25-
syncWebAssembly: true,
26-
},
2724
devtool: "source-map",
2825
plugins: [
2926
new CleanWebpackPlugin(),
3027
new CopyPlugin({
3128
patterns: [{ from: "LICENSE*" }, { from: "README.md" }],
3229
}),
3330
],
31+
module: {
32+
rules: [
33+
{
34+
test: /\.wasm$/i,
35+
use: ["file-loader"],
36+
},
37+
],
38+
},
3439
};
3540
};

0 commit comments

Comments
 (0)