Skip to content

Commit

Permalink
Merge pull request #155 from syumai/update-wasm-exec-js
Browse files Browse the repository at this point in the history
update wasm_exec.js contents
  • Loading branch information
syumai authored Feb 22, 2025
2 parents 316e536 + ebd280b commit 276ef2e
Show file tree
Hide file tree
Showing 8 changed files with 60 additions and 35 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ First, please install the following tools:
* Node.js (and npm)
* [wrangler](https://developers.cloudflare.com/workers/wrangler/)
- You can install it by running `npm install -g wrangler`.
* Go 1.21.3 or later
* Go 1.24.0 or later
* [gonew](https://pkg.go.dev/golang.org/x/tools/cmd/gonew)
- You can install it by running `go install golang.org/x/tools/cmd/gonew@latest`

Expand Down
2 changes: 1 addition & 1 deletion _templates/cloudflare/cron-go/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ dev:

.PHONY: build
build:
go run github.com/syumai/workers/cmd/workers-assets-gen@v0.23.1 -mode=go
go run github.com/syumai/workers/cmd/workers-assets-gen@v0.28.1 -mode=go
GOOS=js GOARCH=wasm go build -o ./build/app.wasm .

.PHONY: deploy
Expand Down
2 changes: 1 addition & 1 deletion _templates/cloudflare/cron-tinygo/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ dev:

.PHONY: build
build:
go run github.com/syumai/workers/cmd/workers-assets-gen@v0.23.1
go run github.com/syumai/workers/cmd/workers-assets-gen@v0.28.1
tinygo build -o ./build/app.wasm -target wasm -no-debug ./...

.PHONY: deploy
Expand Down
2 changes: 1 addition & 1 deletion _templates/cloudflare/pages-tinygo/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ dev:

.PHONY: build
build:
go run github.com/syumai/workers/cmd/workers-assets-gen@v0.23.1
go run github.com/syumai/workers/cmd/workers-assets-gen@v0.28.1
tinygo build -o ./build/app.wasm -target wasm -no-debug ./...

.PHONY: deploy
Expand Down
2 changes: 1 addition & 1 deletion _templates/cloudflare/worker-go/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ dev:

.PHONY: build
build:
go run github.com/syumai/workers/cmd/workers-assets-gen@v0.23.1 -mode=go
go run github.com/syumai/workers/cmd/workers-assets-gen@v0.28.1 -mode=go
GOOS=js GOARCH=wasm go build -o ./build/app.wasm .

.PHONY: deploy
Expand Down
2 changes: 1 addition & 1 deletion _templates/cloudflare/worker-tinygo/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ dev:

.PHONY: build
build:
go run github.com/syumai/workers/cmd/workers-assets-gen@v0.23.1
go run github.com/syumai/workers/cmd/workers-assets-gen@v0.28.1
tinygo build -o ./build/app.wasm -target wasm -no-debug ./...

.PHONY: deploy
Expand Down
16 changes: 15 additions & 1 deletion cmd/workers-assets-gen/assets/wasm_exec_go.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
if (!globalThis.fs) {
let outputBuf = "";
globalThis.fs = {
constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused
constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1, O_DIRECTORY: -1 }, // unused
writeSync(fd, buf) {
outputBuf += decoder.decode(buf);
const nl = outputBuf.lastIndexOf("\n");
Expand Down Expand Up @@ -73,6 +73,14 @@
}
}

if (!globalThis.path) {
globalThis.path = {
resolve(...pathSegments) {
return pathSegments.join("/");
}
}
}

if (!globalThis.crypto) {
throw new Error("globalThis.crypto is not available, polyfill required (crypto.getRandomValues only)");
}
Expand Down Expand Up @@ -208,10 +216,16 @@
return decoder.decode(new DataView(this._inst.exports.mem.buffer, saddr, len));
}

const testCallExport = (a, b) => {
this._inst.exports.testExport0();
return this._inst.exports.testExport(a, b);
}

const timeOrigin = Date.now() - performance.now();
this.importObject = {
_gotest: {
add: (a, b) => a + b,
callExport: testCallExport,
},
gojs: {
// Go's SP does not change as long as no Go code is running. Some operations (e.g. calls, getters and setters)
Expand Down
67 changes: 39 additions & 28 deletions cmd/workers-assets-gen/assets/wasm_exec_tinygo.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

/*
if (!global.fs && global.require) {
global.fs = require("fs");
global.fs = require("node:fs");
}
*/

Expand Down Expand Up @@ -106,7 +106,7 @@

/*
if (!global.crypto) {
const nodeCrypto = require("crypto");
const nodeCrypto = require("node:crypto");
global.crypto = {
getRandomValues(b) {
nodeCrypto.randomFillSync(b);
Expand All @@ -126,11 +126,11 @@

/*
if (!global.TextEncoder) {
global.TextEncoder = require("util").TextEncoder;
global.TextEncoder = require("node:util").TextEncoder;
}
if (!global.TextDecoder) {
global.TextDecoder = require("util").TextDecoder;
global.TextDecoder = require("node:util").TextDecoder;
}
*/

Expand All @@ -140,6 +140,7 @@
const decoder = new TextDecoder("utf-8");
let reinterpretBuf = new DataView(new ArrayBuffer(8));
var logLine = [];
const wasmExit = {}; // thrown to exit via proc_exit (not an error)

global.Go = class {
constructor() {
Expand Down Expand Up @@ -278,14 +279,11 @@
fd_close: () => 0, // dummy
fd_fdstat_get: () => 0, // dummy
fd_seek: () => 0, // dummy
"proc_exit": (code) => {
if (global.process) {
// Node.js
process.exit(code);
} else {
// Can't exit in a browser.
throw 'trying to exit with code ' + code;
}
proc_exit: (code) => {
this.exited = true;
this.exitCode = code;
this._resolveExitPromise();
throw wasmExit;
},
random_get: (bufPtr, bufLen) => {
crypto.getRandomValues(loadSlice(bufPtr, bufLen));
Expand All @@ -301,7 +299,14 @@
// func sleepTicks(timeout float64)
"runtime.sleepTicks": (timeout) => {
// Do not sleep, only reactivate scheduler after the given timeout.
setTimeout(this._inst.exports.go_scheduler, timeout);
setTimeout(() => {
if (this.exited) return;
try {
this._inst.exports.go_scheduler();
} catch (e) {
if (e !== wasmExit) throw e;
}
}, timeout);
},

// func finalizeRef(v ref)
Expand Down Expand Up @@ -481,31 +486,37 @@
this._ids = new Map(); // mapping from JS values to reference ids
this._idPool = []; // unused ids that have been garbage collected
this.exited = false; // whether the Go program has exited
this.exitCode = 0;

const mem = new DataView(this._inst.exports.memory.buffer)

while (true) {
const callbackPromise = new Promise((resolve) => {
this._resolveCallbackPromise = () => {
if (this.exited) {
throw new Error("bad callback: Go program has already exited");
}
setTimeout(resolve, 0); // make sure it is asynchronous
};
if (this._inst.exports._start) {
let exitPromise = new Promise((resolve, reject) => {
this._resolveExitPromise = resolve;
});
this._inst.exports._start();
if (this.exited) {
break;

// Run program, but catch the wasmExit exception that's thrown
// to return back here.
try {
this._inst.exports._start();
} catch (e) {
if (e !== wasmExit) throw e;
}
await callbackPromise;

await exitPromise;
return this.exitCode;
} else {
this._inst.exports._initialize();
}
}

_resume() {
if (this.exited) {
throw new Error("Go program has already exited");
}
this._inst.exports.resume();
try {
this._inst.exports.resume();
} catch (e) {
if (e !== wasmExit) throw e;
}
if (this.exited) {
this._resolveExitPromise();
}
Expand Down

0 comments on commit 276ef2e

Please sign in to comment.