162 lines
2.9 KiB
Go
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
|
|
}
|