94 lines
2.1 KiB
Go
94 lines
2.1 KiB
Go
package main
|
|||
|
|
|
||
|
|
import "unsafe"
|
||
|
|
|
||
|
|
//go:wasmimport env overlord_emit
|
||
|
|
func overlordEmit(eventPtr, eventLen, payloadPtr, payloadLen uint32) int32
|
||
|
|
|
||
|
|
//go:wasmimport env overlord_host_info
|
||
|
|
func overlordHostInfo(outPtr, outLen uint32) int32
|
||
|
|
|
||
|
|
var heap = make([]byte, 64*1024)
|
||
|
|
var heapOffset uint32 = 8
|
||
|
|
|
||
|
|
var hostInfo [1024]byte
|
||
|
|
var hostInfoLen uint32
|
||
|
|
|
||
|
|
//go:export overlord_alloc
|
||
|
|
func overlordAlloc(size uint32) uint32 {
|
||
|
|
if size == 0 {
|
||
|
|
size = 1
|
||
|
|
}
|
||
|
|
ptr := (heapOffset + 7) &^ 7
|
||
|
|
next := ptr + size
|
||
|
|
if next >= uint32(len(heap)) {
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
heapOffset = next
|
||
|
|
return uint32(uintptr(unsafe.Pointer(&heap[ptr])))
|
||
|
|
}
|
||
|
|
|
||
|
|
//go:export overlord_free
|
||
|
|
func overlordFree(ptr, size uint32) {
|
||
|
|
_, _ = ptr, size
|
||
|
|
}
|
||
|
|
|
||
|
|
//go:export overlord_on_load
|
||
|
|
func overlordOnLoad(hostPtr, hostLen uint32) int32 {
|
||
|
|
n := hostLen
|
||
|
|
if n > uint32(len(hostInfo)) {
|
||
|
|
n = uint32(len(hostInfo))
|
||
|
|
}
|
||
|
|
copy(hostInfo[:n], bytesAt(hostPtr, n))
|
||
|
|
hostInfoLen = n
|
||
|
|
emit("ready", hostInfo[:hostInfoLen])
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
|
||
|
|
//go:export overlord_on_event
|
||
|
|
func overlordOnEvent(eventPtr, eventLen, payloadPtr, payloadLen uint32) int32 {
|
||
|
|
_, _ = payloadPtr, payloadLen
|
||
|
|
event := string(bytesAt(eventPtr, eventLen))
|
||
|
|
if event != "query_host" {
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
|
||
|
|
var buf [1024]byte
|
||
|
|
n := overlordHostInfo(uint32(uintptr(unsafe.Pointer(&buf[0]))), uint32(len(buf)))
|
||
|
|
if n < 0 {
|
||
|
|
emitString("host_info", `{"error":"host info buffer too small"}`)
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
emit("host_info", buf[:uint32(n)])
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
|
||
|
|
//go:export overlord_on_unload
|
||
|
|
func overlordOnUnload() {}
|
||
|
|
|
||
|
|
func emitString(event string, payload string) {
|
||
|
|
emit(event, []byte(payload))
|
||
|
|
}
|
||
|
|
|
||
|
|
func emit(event string, payload []byte) {
|
||
|
|
eventBytes := []byte(event)
|
||
|
|
var eventPtr uint32
|
||
|
|
var payloadPtr uint32
|
||
|
|
if len(eventBytes) > 0 {
|
||
|
|
eventPtr = uint32(uintptr(unsafe.Pointer(&eventBytes[0])))
|
||
|
|
}
|
||
|
|
if len(payload) > 0 {
|
||
|
|
payloadPtr = uint32(uintptr(unsafe.Pointer(&payload[0])))
|
||
|
|
}
|
||
|
|
overlordEmit(eventPtr, uint32(len(eventBytes)), payloadPtr, uint32(len(payload)))
|
||
|
|
}
|
||
|
|
|
||
|
|
func bytesAt(ptr, length uint32) []byte {
|
||
|
|
if length == 0 {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
return unsafe.Slice((*byte)(unsafe.Pointer(uintptr(ptr))), length)
|
||
|
|
}
|
||
|
|
|
||
|
|
func main() {}
|