plugins 2.0 update
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
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() {}
|
||||
Reference in New Issue
Block a user