Skip to content

Commit c30aeed

Browse files
Merge pull request #438 from ruby/katei/update-bjorn-wasi
Allow to read/write on in-memory file system on Web browser
2 parents 1b70ebd + 59f9127 commit c30aeed

File tree

5 files changed

+58
-15
lines changed

5 files changed

+58
-15
lines changed

package-lock.json

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/npm-packages/ruby-wasm-wasi/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
"build": "npm run build:rollup && npm run build:tsc && npm run build:static && ./tools/post-build.sh ./dist"
5454
},
5555
"devDependencies": {
56-
"@bjorn3/browser_wasi_shim": "^0.2.19",
56+
"@bjorn3/browser_wasi_shim": "^0.3.0",
5757
"@bytecodealliance/jco": "../../../vendor/jco",
5858
"@rollup/plugin-node-resolve": "^15.2.3",
5959
"@rollup/plugin-typescript": "^11.1.6",

packages/npm-packages/ruby-wasm-wasi/src/browser.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Fd, WASI } from "@bjorn3/browser_wasi_shim";
1+
import { Fd, File, OpenFile, PreopenDirectory, WASI } from "@bjorn3/browser_wasi_shim";
22
import { consolePrinter } from "./console.js";
33
import { RubyVM } from "./vm.js";
44

@@ -18,7 +18,12 @@ export const DefaultRubyVM = async (
1818
([k, v]) => `${k}=${v}`,
1919
);
2020

21-
const fds: Fd[] = [];
21+
const fds: Fd[] = [
22+
new OpenFile(new File([])),
23+
new OpenFile(new File([])),
24+
new OpenFile(new File([])),
25+
new PreopenDirectory("/", new Map()),
26+
];
2227
const wasi = new WASI(args, env, fds, { debug: false });
2328
const vm = new RubyVM();
2429

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { test, expect, Page } from "@playwright/test";
2+
3+
import {
4+
setupDebugLog,
5+
setupProxy,
6+
setupUncaughtExceptionRejection,
7+
resolveBinding,
8+
} from "../support";
9+
10+
if (!process.env.RUBY_NPM_PACKAGE_ROOT) {
11+
test.skip("skip", () => {});
12+
} else {
13+
test.beforeEach(async ({ context, page }) => {
14+
setupDebugLog(context);
15+
setupProxy(context);
16+
setupUncaughtExceptionRejection(page);
17+
});
18+
19+
test.describe('WASI browser binding', () => {
20+
test("Read/write on in-memory file system", async ({ page }) => {
21+
const resolve = await resolveBinding(page, "checkResolved");
22+
await page.setContent(`
23+
<script src="https://cdn.jsdelivr.net/npm/@ruby/head-wasm-wasi@latest/dist/browser.script.iife.js"></script>
24+
<script type="text/ruby" data-eval="async">
25+
require "js"
26+
File.write("hello.txt", "Hello, world!")
27+
JS.global.checkResolved File.read("hello.txt")
28+
</script>
29+
`);
30+
expect(await resolve()).toBe("Hello, world!");
31+
});
32+
});
33+
}

packages/npm-packages/ruby-wasm-wasi/tools/run-test-unit.mjs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,22 @@ const instantiateWasmerWasi = async (rootTestFile) => {
6868
return files.flat();
6969
};
7070

71-
const __root__ = new browserWasi.Directory({});
71+
const __root__ = new browserWasi.Directory(new Map());
7272
const writeMemFs = (guestPath, contents) => {
7373
const dirname = path.dirname(guestPath);
7474
const parts = dirname.split('/');
7575
let current = __root__;
7676
for (let i = 1; i < parts.length; i++) {
77-
const dir = current.create_entry_for_path(parts[i], /* is_dir */ true);
78-
current = dir;
77+
const existing = current.contents.get(parts[i]);
78+
if (existing) {
79+
current = existing;
80+
} else {
81+
const { entry: created } = current.create_entry_for_path(parts[i], /* is_dir */ true);
82+
current = created;
83+
}
7984
}
8085
const basename = path.basename(guestPath);
81-
const file = current.create_entry_for_path(basename, /* is_dir */ false)
86+
const { entry: file } = current.create_entry_for_path(basename, /* is_dir */ false)
8287
file.data = contents;
8388
};
8489
const loadToMemFs = async (guestPath, hostPath) => {

0 commit comments

Comments
 (0)