Skip to content

Commit e6bc843

Browse files
Merge pull request #7 from swiftwasm/katei/format
chore: Add Prettier for code formatting
2 parents 6392c62 + e0104cd commit e6bc843

20 files changed

+558
-477
lines changed

package-lock.json

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

package.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,14 @@
1010
"scripts": {
1111
"build": "tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json",
1212
"test": "jest",
13+
"format": "prettier --write ./src ./test",
1314
"prepare": "npm run build"
1415
},
15-
"keywords": ["webassembly", "wasm", "wasi"],
16+
"keywords": [
17+
"webassembly",
18+
"wasm",
19+
"wasi"
20+
],
1621
"bugs": {
1722
"url": "https://github.com/swiftwasm/uwasi/issues"
1823
},
@@ -30,6 +35,7 @@
3035
"@types/jest": "^28.1.4",
3136
"@types/node": "^17.0.31",
3237
"jest": "^28.1.2",
38+
"prettier": "^3.5.2",
3339
"ts-jest": "^28.0.5",
3440
"typescript": "^4.6.4"
3541
}

src/abi.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ export class WASIAbi {
140140
const buffer = new Uint8Array(memory.buffer, ptr, len);
141141
return this.decoder.decode(buffer);
142142
}
143-
143+
144144
byteLength(value: string): number {
145145
return this.encoder.encode(value).length;
146146
}
@@ -158,11 +158,11 @@ export class WASIAbi {
158158
for (let i = 0; i < iovsLen; i++) {
159159
const offset = memory.getUint32(
160160
iovsOffset + WASIAbi.iovec_t.bufferOffset,
161-
true
161+
true,
162162
);
163163
const len = memory.getUint32(
164164
iovsOffset + WASIAbi.iovec_t.lengthOffset,
165-
true
165+
true,
166166
);
167167

168168
iovsBuffers.push(new Uint8Array(memory.buffer, offset, len));
@@ -185,7 +185,7 @@ export class WASIAbi {
185185
memory: DataView,
186186
ptr: number,
187187
filetype: number,
188-
flags: number
188+
flags: number,
189189
): void {
190190
memory.setUint8(ptr, filetype);
191191
memory.setUint16(ptr + 2, flags, true);

src/features/all.ts

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,25 @@ import { useFS, useStdio } from "./fd";
77
import { useProc } from "./proc";
88
import { useRandom } from "./random";
99

10-
type Options = (Parameters<typeof useFS>[0] | Parameters<typeof useStdio>[0]) & Parameters<typeof useRandom>[0]
10+
type Options = (Parameters<typeof useFS>[0] | Parameters<typeof useStdio>[0]) &
11+
Parameters<typeof useRandom>[0];
1112

1213
export function useAll(useOptions: Options = {}): WASIFeatureProvider {
13-
return (options: WASIOptions, abi: WASIAbi, memoryView: () => DataView) => {
14-
const features = [
15-
useEnviron, useArgs, useClock, useProc,
16-
useRandom(useOptions)
17-
];
18-
if ("fs" in useOptions) {
19-
features.push(useFS({ fs: useOptions.fs }));
20-
} else {
21-
features.push(useStdio(useOptions));
22-
}
23-
return features.reduce((acc, fn) => {
24-
return { ...acc, ...fn(options, abi, memoryView) };
25-
}, {});
26-
};
14+
return (options: WASIOptions, abi: WASIAbi, memoryView: () => DataView) => {
15+
const features = [
16+
useEnviron,
17+
useArgs,
18+
useClock,
19+
useProc,
20+
useRandom(useOptions),
21+
];
22+
if ("fs" in useOptions) {
23+
features.push(useFS({ fs: useOptions.fs }));
24+
} else {
25+
features.push(useStdio(useOptions));
26+
}
27+
return features.reduce((acc, fn) => {
28+
return { ...acc, ...fn(options, abi, memoryView) };
29+
}, {});
30+
};
2731
}

src/features/args.ts

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,33 @@ import { WASIOptions } from "../options";
44
/**
55
* A feature provider that provides `args_get` and `args_sizes_get`
66
*/
7-
export function useArgs(options: WASIOptions, abi: WASIAbi, memoryView: () => DataView): WebAssembly.ModuleImports {
8-
const args = options.args || [];
9-
return {
10-
args_get: (argv: number, argvBuf: number) => {
11-
let offsetOffset = argv;
12-
let bufferOffset = argvBuf;
13-
const view = memoryView();
14-
for (const arg of args) {
15-
view.setUint32(offsetOffset, bufferOffset, true);
16-
offsetOffset += 4;
17-
bufferOffset += abi.writeString(view, `${arg}\0`, bufferOffset);
18-
}
19-
return WASIAbi.WASI_ESUCCESS;
20-
},
21-
args_sizes_get: (argc: number, argvBufSize: number) => {
22-
const view = memoryView();
23-
view.setUint32(argc, args.length, true);
24-
const bufferSize = args.reduce((acc, arg) => acc + abi.byteLength(arg) + 1, 0);
25-
view.setUint32(argvBufSize, bufferSize, true);
26-
return WASIAbi.WASI_ESUCCESS;
27-
},
28-
}
7+
export function useArgs(
8+
options: WASIOptions,
9+
abi: WASIAbi,
10+
memoryView: () => DataView,
11+
): WebAssembly.ModuleImports {
12+
const args = options.args || [];
13+
return {
14+
args_get: (argv: number, argvBuf: number) => {
15+
let offsetOffset = argv;
16+
let bufferOffset = argvBuf;
17+
const view = memoryView();
18+
for (const arg of args) {
19+
view.setUint32(offsetOffset, bufferOffset, true);
20+
offsetOffset += 4;
21+
bufferOffset += abi.writeString(view, `${arg}\0`, bufferOffset);
22+
}
23+
return WASIAbi.WASI_ESUCCESS;
24+
},
25+
args_sizes_get: (argc: number, argvBufSize: number) => {
26+
const view = memoryView();
27+
view.setUint32(argc, args.length, true);
28+
const bufferSize = args.reduce(
29+
(acc, arg) => acc + abi.byteLength(arg) + 1,
30+
0,
31+
);
32+
view.setUint32(argvBufSize, bufferSize, true);
33+
return WASIAbi.WASI_ESUCCESS;
34+
},
35+
};
2936
}

src/features/clock.ts

Lines changed: 59 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4,57 +4,63 @@ import { WASIOptions } from "../options";
44
/**
55
* A feature provider that provides `clock_res_get` and `clock_time_get` by JavaScript's Date.
66
*/
7-
export function useClock(options: WASIOptions, abi: WASIAbi, memoryView: () => DataView): WebAssembly.ModuleImports {
8-
return {
9-
clock_res_get: (clockId: number, resolution: number) => {
10-
let resolutionValue: number;
11-
switch (clockId) {
12-
case WASIAbi.WASI_CLOCK_MONOTONIC: {
13-
// https://developer.mozilla.org/en-US/docs/Web/API/Performance/now
14-
resolutionValue = 5000;
15-
break;
16-
}
17-
case WASIAbi.WASI_CLOCK_REALTIME: {
18-
resolutionValue = 1000;
19-
break;
20-
}
21-
default: return WASIAbi.WASI_ENOSYS;
22-
}
23-
const view = memoryView();
24-
// 64-bit integer, but only the lower 32 bits are used.
25-
view.setUint32(resolution, resolutionValue, true);
26-
return WASIAbi.WASI_ESUCCESS;
27-
},
28-
clock_time_get: (clockId: number, precision: number, time: number) => {
29-
let nowMs: number = 0;
30-
switch (clockId) {
31-
case WASIAbi.WASI_CLOCK_MONOTONIC: {
32-
nowMs = performance.now();
33-
break;
34-
}
35-
case WASIAbi.WASI_CLOCK_REALTIME: {
36-
nowMs = Date.now();
37-
break;
38-
}
39-
default: return WASIAbi.WASI_ENOSYS;
40-
}
41-
const view = memoryView();
42-
if (BigInt) {
43-
const msToNs = (ms: number) => {
44-
const msInt = Math.trunc(ms);
45-
const decimal = BigInt(Math.round((ms - msInt) * 1_000_000));
46-
const ns = BigInt(msInt) * BigInt(1_000_000);
47-
return ns + decimal;
48-
};
49-
const now = BigInt(msToNs(nowMs));
50-
view.setBigUint64(time, now, true);
51-
} else {
52-
// Fallback to two 32-bit numbers losing precision
53-
const now = Date.now() * 1_000_000;
54-
view.setUint32(time, now & 0x0000ffff, true);
55-
view.setUint32(time + 4, now & 0xffff0000, true);
56-
}
57-
return WASIAbi.WASI_ESUCCESS;
58-
},
59-
}
7+
export function useClock(
8+
options: WASIOptions,
9+
abi: WASIAbi,
10+
memoryView: () => DataView,
11+
): WebAssembly.ModuleImports {
12+
return {
13+
clock_res_get: (clockId: number, resolution: number) => {
14+
let resolutionValue: number;
15+
switch (clockId) {
16+
case WASIAbi.WASI_CLOCK_MONOTONIC: {
17+
// https://developer.mozilla.org/en-US/docs/Web/API/Performance/now
18+
resolutionValue = 5000;
19+
break;
20+
}
21+
case WASIAbi.WASI_CLOCK_REALTIME: {
22+
resolutionValue = 1000;
23+
break;
24+
}
25+
default:
26+
return WASIAbi.WASI_ENOSYS;
27+
}
28+
const view = memoryView();
29+
// 64-bit integer, but only the lower 32 bits are used.
30+
view.setUint32(resolution, resolutionValue, true);
31+
return WASIAbi.WASI_ESUCCESS;
32+
},
33+
clock_time_get: (clockId: number, precision: number, time: number) => {
34+
let nowMs: number = 0;
35+
switch (clockId) {
36+
case WASIAbi.WASI_CLOCK_MONOTONIC: {
37+
nowMs = performance.now();
38+
break;
39+
}
40+
case WASIAbi.WASI_CLOCK_REALTIME: {
41+
nowMs = Date.now();
42+
break;
43+
}
44+
default:
45+
return WASIAbi.WASI_ENOSYS;
46+
}
47+
const view = memoryView();
48+
if (BigInt) {
49+
const msToNs = (ms: number) => {
50+
const msInt = Math.trunc(ms);
51+
const decimal = BigInt(Math.round((ms - msInt) * 1_000_000));
52+
const ns = BigInt(msInt) * BigInt(1_000_000);
53+
return ns + decimal;
54+
};
55+
const now = BigInt(msToNs(nowMs));
56+
view.setBigUint64(time, now, true);
57+
} else {
58+
// Fallback to two 32-bit numbers losing precision
59+
const now = Date.now() * 1_000_000;
60+
view.setUint32(time, now & 0x0000ffff, true);
61+
view.setUint32(time + 4, now & 0xffff0000, true);
62+
}
63+
return WASIAbi.WASI_ESUCCESS;
64+
},
65+
};
6066
}

src/features/environ.ts

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,45 @@ import { WASIOptions } from "../options";
44
/**
55
* A feature provider that provides `environ_get` and `environ_sizes_get`
66
*/
7-
export function useEnviron(options: WASIOptions, abi: WASIAbi, memoryView: () => DataView): WebAssembly.ModuleImports {
8-
9-
return {
10-
environ_get: (environ: number, environBuf: number) => {
11-
let offsetOffset = environ;
12-
let bufferOffset = environBuf;
13-
const view = memoryView();
14-
for (const key in options.env) {
15-
const value = options.env[key];
16-
view.setUint32(offsetOffset, bufferOffset, true);
17-
offsetOffset += 4;
18-
bufferOffset += abi.writeString(view, `${key}=${value}\0`, bufferOffset);
19-
}
20-
return WASIAbi.WASI_ESUCCESS;
21-
},
22-
environ_sizes_get: (environ: number, environBufSize: number) => {
23-
const view = memoryView();
24-
view.setUint32(environ, Object.keys(options.env || {}).length, true);
25-
view.setUint32(
26-
environBufSize,
27-
Object.entries(options.env || {}).reduce(
28-
(acc, [key, value]) => {
29-
return acc + abi.byteLength(key) /* = */ + 1 + abi.byteLength(value) /* \0 */ + 1
30-
},
31-
0
32-
),
33-
true
34-
);
35-
return WASIAbi.WASI_ESUCCESS;
36-
}
37-
}
7+
export function useEnviron(
8+
options: WASIOptions,
9+
abi: WASIAbi,
10+
memoryView: () => DataView,
11+
): WebAssembly.ModuleImports {
12+
return {
13+
environ_get: (environ: number, environBuf: number) => {
14+
let offsetOffset = environ;
15+
let bufferOffset = environBuf;
16+
const view = memoryView();
17+
for (const key in options.env) {
18+
const value = options.env[key];
19+
view.setUint32(offsetOffset, bufferOffset, true);
20+
offsetOffset += 4;
21+
bufferOffset += abi.writeString(
22+
view,
23+
`${key}=${value}\0`,
24+
bufferOffset,
25+
);
26+
}
27+
return WASIAbi.WASI_ESUCCESS;
28+
},
29+
environ_sizes_get: (environ: number, environBufSize: number) => {
30+
const view = memoryView();
31+
view.setUint32(environ, Object.keys(options.env || {}).length, true);
32+
view.setUint32(
33+
environBufSize,
34+
Object.entries(options.env || {}).reduce((acc, [key, value]) => {
35+
return (
36+
acc +
37+
abi.byteLength(key) /* = */ +
38+
1 +
39+
abi.byteLength(value) /* \0 */ +
40+
1
41+
);
42+
}, 0),
43+
true,
44+
);
45+
return WASIAbi.WASI_ESUCCESS;
46+
},
47+
};
3848
}

0 commit comments

Comments
 (0)