Skip to content

Commit 9953b66

Browse files
mtyszczakvogel76
authored andcommitted
Fix directory creation in fs init in beekeeper
1 parent c8138cb commit 9953b66

3 files changed

Lines changed: 42 additions & 5 deletions

File tree

programs/beekeeper/beekeeper_wasm/__tests__/assets/globals.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ globalThis.createBeekeeperTestFor = async function createBeekeeperTestFor (env)
55

66
const beekeeper = await import(locBeekeeper);
77

8-
const bk = await beekeeper.default({ storageRoot: '.beekeeper', enableLogs: false });
8+
const bk = await beekeeper.default({ storageRoot: env === "web" ? "/storage_root" : '.beekeeper', enableLogs: false });
99

1010
return {
1111
provider: beekeeper,

programs/beekeeper/beekeeper_wasm/src/detailed/fs.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { BeekeeperModule } from "../beekeeper.js";
2+
import { BeekeeperError } from "../errors.js";
23
import { safeWasmCall } from "../util/wasm_error.js";
34

45
export class BeekeeperFileSystem {
@@ -16,9 +17,30 @@ export class BeekeeperFileSystem {
1617
});
1718
}
1819

20+
private ensureCreateDir(paths: string[]) {
21+
// We need an absolute path in web environment in order to create proper directories
22+
const dir = (process.env.ROLLUP_TARGET_ENV === "web" ? "/" : "") + paths.join("/");
23+
24+
let analysis = safeWasmCall(() => this.fs.analyzePath(dir));
25+
26+
if (!analysis.exists) {
27+
if (paths.length > 1)
28+
this.ensureCreateDir(paths.slice(0, -1));
29+
30+
safeWasmCall(() => this.fs.mkdir(dir));
31+
}
32+
}
33+
1934
public init(walletDir: string): Promise<void> {
20-
if(!safeWasmCall(() => this.fs.analyzePath(walletDir).exists))
21-
safeWasmCall(() => this.fs.mkdir(walletDir));
35+
if(process.env.ROLLUP_TARGET_ENV === "web" && !walletDir.startsWith("/"))
36+
throw new BeekeeperError("Storage root directory must be an absolute path in web environment");
37+
38+
const walletDirPathParts = walletDir.split("/").filter(node => !!node && node !== ".");
39+
40+
if (walletDirPathParts.length === 0)
41+
throw new BeekeeperError("Storage root directory must not be empty");
42+
43+
this.ensureCreateDir(walletDirPathParts);
2244

2345
if(process.env.ROLLUP_TARGET_ENV === "web")
2446
safeWasmCall(() => this.fs.mount(this.fs.filesystems.IDBFS, {}, walletDir));
Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,32 @@
11
import { BeekeeperError } from "../errors.js";
22

3+
// TODO: Check for errno on Windows
4+
const stringifyError = (error: unknown): string => {
5+
if (error instanceof Error)
6+
return error.message;
7+
8+
const name = error && typeof error === "object" && "name" in error ? error.name : undefined;
9+
10+
if (name === "ErrnoError" && "errno" in (error as object)) {
11+
const errno = (error as any).errno as number;
12+
return `ErrnoError: #${errno}`;
13+
}
14+
15+
return "Unknown error" + (name ? `: ${name}` : "");
16+
};
17+
318
export const safeWasmCall = <T extends () => any>(fn: T): ReturnType<T> => {
419
try {
520
return fn()
621
} catch (error) {
7-
throw new BeekeeperError(`Error during Wasm call: ${error instanceof Error ? error.message : error}`);
22+
throw new BeekeeperError(`Error during Wasm call: ${stringifyError(error)}`);
823
}
924
};
1025

1126
export const safeAsyncWasmCall = async <T extends () => any>(fn: T): Promise<ReturnType<T>> => {
1227
try {
1328
return await fn();
1429
} catch (error) {
15-
throw new BeekeeperError(`Error during Wasm call: ${error instanceof Error ? error.message : error}`);
30+
throw new BeekeeperError(`Error during Wasm call: ${stringifyError(error)}`);
1631
}
1732
};

0 commit comments

Comments
 (0)