Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading