Files

162 lines
2.9 KiB
Go

//go:build wasip1
// Package state provides WASM plugin state management via PDK variables.
// State is synchronized with the keybase (DID CPU) after database operations.
package state
import (
"encoding/json"
"github.com/extism/go-pdk"
)
const (
keyInitialized = "enclave:initialized"
keyDID = "enclave:did"
keyDIDID = "enclave:did_id"
keyDatabaseReady = "enclave:db_ready"
keyLastSync = "enclave:last_sync"
)
func Default() {
if pdk.GetVarInt(keyInitialized) == 0 {
pdk.SetVarInt(keyInitialized, 0)
pdk.SetVar(keyDID, nil)
pdk.SetVarInt(keyDIDID, 0)
pdk.SetVarInt(keyDatabaseReady, 0)
pdk.SetVar(keyLastSync, nil)
}
pdk.Log(pdk.LogDebug, "state: initialized default state")
}
func IsInitialized() bool {
return pdk.GetVarInt(keyInitialized) == 1
}
func SetInitialized(v bool) {
if v {
pdk.SetVarInt(keyInitialized, 1)
} else {
pdk.SetVarInt(keyInitialized, 0)
}
}
func GetDID() string {
data := pdk.GetVar(keyDID)
if data == nil {
return ""
}
return string(data)
}
func SetDID(did string) {
pdk.SetVar(keyDID, []byte(did))
}
func GetDIDID() int64 {
return int64(pdk.GetVarInt(keyDIDID))
}
func SetDIDID(id int64) {
pdk.SetVarInt(keyDIDID, int(id))
}
func IsDatabaseReady() bool {
return pdk.GetVarInt(keyDatabaseReady) == 1
}
func SetDatabaseReady(v bool) {
if v {
pdk.SetVarInt(keyDatabaseReady, 1)
} else {
pdk.SetVarInt(keyDatabaseReady, 0)
}
}
func GetLastSync() string {
data := pdk.GetVar(keyLastSync)
if data == nil {
return ""
}
return string(data)
}
func SetLastSync(timestamp string) {
pdk.SetVar(keyLastSync, []byte(timestamp))
}
func SyncFromKeybase(did string, didID int64) {
SetDID(did)
SetDIDID(didID)
SetDatabaseReady(true)
SetInitialized(true)
pdk.Log(pdk.LogDebug, "state: synced from keybase")
}
func Clear() {
pdk.SetVarInt(keyInitialized, 0)
pdk.SetVar(keyDID, nil)
pdk.SetVarInt(keyDIDID, 0)
pdk.SetVarInt(keyDatabaseReady, 0)
pdk.SetVar(keyLastSync, nil)
pdk.Log(pdk.LogDebug, "state: cleared")
}
func GetString(key string) string {
data := pdk.GetVar(key)
if data == nil {
return ""
}
return string(data)
}
func SetString(key, value string) {
pdk.SetVar(key, []byte(value))
}
func GetBytes(key string) []byte {
return pdk.GetVar(key)
}
func SetBytes(key string, value []byte) {
pdk.SetVar(key, value)
}
func GetInt(key string) int {
return pdk.GetVarInt(key)
}
func SetInt(key string, value int) {
pdk.SetVarInt(key, value)
}
func GetJSON(key string, v any) error {
data := pdk.GetVar(key)
if data == nil {
return nil
}
return json.Unmarshal(data, v)
}
func SetJSON(key string, v any) error {
data, err := json.Marshal(v)
if err != nil {
return err
}
pdk.SetVar(key, data)
return nil
}
func GetConfig(key string) (string, bool) {
return pdk.GetConfig(key)
}
func MustGetConfig(key string) string {
val, ok := pdk.GetConfig(key)
if !ok {
pdk.SetErrorString("config key required: " + key)
return ""
}
return val
}