2024-12-18 00:28:59 +02:00
|
|
|
package main
|
|
|
|
|
2025-02-03 22:21:54 +02:00
|
|
|
/*
|
|
|
|
#include <stdlib.h>
|
|
|
|
*/
|
2024-12-18 00:28:59 +02:00
|
|
|
import "C"
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
2025-02-09 11:45:10 +02:00
|
|
|
"strings"
|
2025-02-03 22:21:54 +02:00
|
|
|
"unsafe"
|
2024-12-18 00:28:59 +02:00
|
|
|
|
|
|
|
"github.com/pikami/cosmium/api"
|
|
|
|
"github.com/pikami/cosmium/api/config"
|
2025-03-12 21:06:10 +02:00
|
|
|
"github.com/pikami/cosmium/internal/datastore"
|
|
|
|
badgerdatastore "github.com/pikami/cosmium/internal/datastore/badger_datastore"
|
2025-03-09 18:34:07 +02:00
|
|
|
mapdatastore "github.com/pikami/cosmium/internal/datastore/map_datastore"
|
2024-12-18 00:28:59 +02:00
|
|
|
)
|
|
|
|
|
2024-12-18 19:39:57 +02:00
|
|
|
//export CreateServerInstance
|
|
|
|
func CreateServerInstance(serverName *C.char, configurationJSON *C.char) int {
|
2024-12-18 23:28:04 +02:00
|
|
|
serverNameStr := C.GoString(serverName)
|
2025-02-09 11:45:10 +02:00
|
|
|
configStr := C.GoString(configurationJSON)
|
2024-12-18 23:28:04 +02:00
|
|
|
|
2024-12-20 20:25:32 +02:00
|
|
|
if _, ok := getInstance(serverNameStr); ok {
|
2024-12-18 19:39:57 +02:00
|
|
|
return ResponseServerInstanceAlreadyExists
|
|
|
|
}
|
2024-12-18 00:28:59 +02:00
|
|
|
|
|
|
|
var configuration config.ServerConfig
|
2025-02-09 11:45:10 +02:00
|
|
|
err := json.NewDecoder(strings.NewReader(configStr)).Decode(&configuration)
|
2024-12-18 00:28:59 +02:00
|
|
|
if err != nil {
|
2024-12-18 19:39:57 +02:00
|
|
|
return ResponseFailedToParseConfiguration
|
2024-12-18 00:28:59 +02:00
|
|
|
}
|
|
|
|
|
2024-12-19 23:21:45 +02:00
|
|
|
configuration.ApplyDefaultsToEmptyFields()
|
2025-02-09 11:45:10 +02:00
|
|
|
configuration.PopulateCalculatedFields()
|
2024-12-18 19:39:57 +02:00
|
|
|
|
2025-03-12 21:06:10 +02:00
|
|
|
var dataStore datastore.DataStore
|
|
|
|
switch configuration.DataStore {
|
|
|
|
case config.DataStoreBadger:
|
|
|
|
dataStore = badgerdatastore.NewBadgerDataStore()
|
|
|
|
default:
|
|
|
|
dataStore = mapdatastore.NewMapDataStore(mapdatastore.MapDataStoreOptions{
|
|
|
|
InitialDataFilePath: configuration.InitialDataFilePath,
|
|
|
|
PersistDataFilePath: configuration.PersistDataFilePath,
|
|
|
|
})
|
|
|
|
}
|
2024-12-18 19:39:57 +02:00
|
|
|
|
2025-03-09 18:34:07 +02:00
|
|
|
server := api.NewApiServer(dataStore, &configuration)
|
2025-02-03 22:58:45 +02:00
|
|
|
err = server.Start()
|
|
|
|
if err != nil {
|
|
|
|
return ResponseFailedToStartServer
|
|
|
|
}
|
2024-12-18 19:39:57 +02:00
|
|
|
|
2024-12-20 20:25:32 +02:00
|
|
|
addInstance(serverNameStr, &ServerInstance{
|
2025-03-09 18:34:07 +02:00
|
|
|
server: server,
|
|
|
|
dataStore: dataStore,
|
2024-12-20 20:25:32 +02:00
|
|
|
})
|
2024-12-18 00:28:59 +02:00
|
|
|
|
2024-12-18 19:39:57 +02:00
|
|
|
return ResponseSuccess
|
2024-12-18 00:28:59 +02:00
|
|
|
}
|
|
|
|
|
2024-12-18 19:39:57 +02:00
|
|
|
//export StopServerInstance
|
|
|
|
func StopServerInstance(serverName *C.char) int {
|
2024-12-20 20:25:32 +02:00
|
|
|
serverNameStr := C.GoString(serverName)
|
|
|
|
|
|
|
|
if serverInstance, ok := getInstance(serverNameStr); ok {
|
2024-12-18 19:39:57 +02:00
|
|
|
serverInstance.server.Stop()
|
2025-03-12 22:00:30 +02:00
|
|
|
serverInstance.dataStore.Close()
|
2024-12-20 20:25:32 +02:00
|
|
|
removeInstance(serverNameStr)
|
2024-12-18 19:39:57 +02:00
|
|
|
return ResponseSuccess
|
2024-12-18 00:28:59 +02:00
|
|
|
}
|
2024-12-18 19:39:57 +02:00
|
|
|
|
|
|
|
return ResponseServerInstanceNotFound
|
2024-12-18 00:28:59 +02:00
|
|
|
}
|
|
|
|
|
2024-12-18 19:39:57 +02:00
|
|
|
//export GetServerInstanceState
|
|
|
|
func GetServerInstanceState(serverName *C.char) *C.char {
|
2024-12-20 20:25:32 +02:00
|
|
|
serverNameStr := C.GoString(serverName)
|
|
|
|
|
|
|
|
if serverInstance, ok := getInstance(serverNameStr); ok {
|
2025-03-09 18:34:07 +02:00
|
|
|
stateJSON, err := serverInstance.dataStore.DumpToJson()
|
2024-12-18 19:39:57 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return C.CString(stateJSON)
|
2024-12-18 00:28:59 +02:00
|
|
|
}
|
2024-12-18 19:39:57 +02:00
|
|
|
|
|
|
|
return nil
|
2024-12-18 00:28:59 +02:00
|
|
|
}
|
|
|
|
|
2024-12-19 23:21:45 +02:00
|
|
|
//export LoadServerInstanceState
|
|
|
|
func LoadServerInstanceState(serverName *C.char, stateJSON *C.char) int {
|
|
|
|
serverNameStr := C.GoString(serverName)
|
|
|
|
stateJSONStr := C.GoString(stateJSON)
|
|
|
|
|
2024-12-20 20:25:32 +02:00
|
|
|
if serverInstance, ok := getInstance(serverNameStr); ok {
|
2025-03-09 18:34:07 +02:00
|
|
|
if mapDS, ok := serverInstance.dataStore.(*mapdatastore.MapDataStore); ok {
|
|
|
|
err := mapDS.LoadStateJSON(stateJSONStr)
|
|
|
|
if err != nil {
|
|
|
|
return ResponseFailedToLoadState
|
|
|
|
}
|
|
|
|
return ResponseSuccess
|
2024-12-19 23:21:45 +02:00
|
|
|
}
|
2025-03-12 22:00:30 +02:00
|
|
|
return ResponseCurrentDataStoreDoesNotSupportStateLoading
|
2024-12-19 23:21:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return ResponseServerInstanceNotFound
|
|
|
|
}
|
|
|
|
|
2025-02-03 22:21:54 +02:00
|
|
|
//export FreeMemory
|
|
|
|
func FreeMemory(ptr *C.char) {
|
|
|
|
C.free(unsafe.Pointer(ptr))
|
|
|
|
}
|
|
|
|
|
2024-12-18 00:28:59 +02:00
|
|
|
func main() {}
|