Skip to content
Snippets Groups Projects
Commit ff303dd9 authored by Jake Taylor's avatar Jake Taylor :lips:
Browse files

added webworker framework for state tble

parent 23d50606
No related branches found
No related tags found
1 merge request!115added states table for large client storage
This commit is part of merge request !115. Comments created here will be created in the context of that merge request.
////////////////////////////////////////////////////////////////////////////////
// Copyright © 2022 xx foundation //
// //
// Use of this source code is governed by a license that can be found in the //
// LICENSE file. //
////////////////////////////////////////////////////////////////////////////////
//go:build js && wasm
package main
import (
"encoding/json"
"github.com/pkg/errors"
"gitlab.com/elixxir/client/v4/storage/utility"
wDm "gitlab.com/elixxir/xxdk-wasm/indexedDb/worker/dm"
stateWorker "gitlab.com/elixxir/xxdk-wasm/indexedDb/worker/state"
"gitlab.com/elixxir/xxdk-wasm/worker"
)
// manager handles the message callbacks, which is used to
// send information between the model and the main thread.
type manager struct {
wtm *worker.ThreadManager
model utility.WebState
}
// registerCallbacks registers all the reception callbacks to manage messages
// from the main thread.
func (m *manager) registerCallbacks() {
m.wtm.RegisterCallback(stateWorker.NewStateTag, m.newStateCB)
m.wtm.RegisterCallback(stateWorker.SetTag, m.setCB)
m.wtm.RegisterCallback(stateWorker.GetTag, m.getCB)
}
// newStateCB is the callback for NewState. Returns an empty
// slice on success or an error message on failure.
func (m *manager) newStateCB(data []byte) ([]byte, error) {
var msg wDm.NewWASMEventModelMessage
err := json.Unmarshal(data, &msg)
if err != nil {
return []byte{}, errors.Errorf(
"failed to JSON unmarshal %T from main thread: %+v", msg, err)
}
m.model, err = NewState(msg.DatabaseName)
if err != nil {
return []byte(err.Error()), nil
}
return []byte{}, nil
}
// setCB is the callback for stateModel.Set.
// Returns nil on error or the resulting byte data on success.
func (m *manager) setCB(data []byte) ([]byte, error) {
var msg stateWorker.TransferMessage
err := json.Unmarshal(data, &msg)
if err != nil {
return nil, errors.Errorf(
"failed to JSON unmarshal %T from main thread: %+v", msg, err)
}
return nil, m.model.Set(msg.Key, msg.Value)
}
// getCB is the callback for stateModel.Get.
// Returns nil on error or the resulting byte data on success.
func (m *manager) getCB(data []byte) ([]byte, error) {
result, err := m.model.Get(string(data))
if err != nil {
return nil, err
}
return json.Marshal(result)
}
////////////////////////////////////////////////////////////////////////////////
// Copyright © 2022 xx foundation //
// //
// Use of this source code is governed by a license that can be found in the //
// LICENSE file. //
////////////////////////////////////////////////////////////////////////////////
//go:build js && wasm
package main
import (
"fmt"
"os"
"syscall/js"
"github.com/spf13/cobra"
jww "github.com/spf13/jwalterweatherman"
"gitlab.com/elixxir/xxdk-wasm/logging"
"gitlab.com/elixxir/xxdk-wasm/worker"
)
// SEMVER is the current semantic version of the xxDK web worker.
const SEMVER = "0.1.0"
func main() {
// Set to os.Args because the default is os.Args[1:] and in WASM, args start
// at 0, not 1.
channelsCmd.SetArgs(os.Args)
err := channelsCmd.Execute()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
var channelsCmd = &cobra.Command{
Use: "stateIndexedDbWorker",
Short: "IndexedDb database for state.",
Example: "const go = new Go();\ngo.argv = [\"--logLevel=1\"]",
Run: func(cmd *cobra.Command, args []string) {
// Start logger first to capture all logging events
err := logging.EnableLogging(logLevel, -1, 0, "", "")
if err != nil {
fmt.Printf("Failed to intialize logging: %+v", err)
os.Exit(1)
}
jww.INFO.Printf("xxDK state web worker version: v%s", SEMVER)
jww.INFO.Print("[WW] Starting xxDK WebAssembly State Database Worker.")
m := &manager{
wtm: worker.NewThreadManager("StateIndexedDbWorker", true),
}
m.registerCallbacks()
m.wtm.SignalReady()
// Indicate to the Javascript caller that the WASM is ready by resolving
// a promise created by the caller.
js.Global().Get("onWasmInitialized").Invoke()
<-make(chan bool)
fmt.Println("[WW] Closing xxDK WebAssembly State Database Worker.")
os.Exit(0)
},
}
var (
logLevel jww.Threshold
)
func init() {
// Initialize all startup flags
channelsCmd.Flags().IntVarP((*int)(&logLevel), "logLevel", "l", 2,
"Sets the log level output when outputting to the Javascript console. "+
"0 = TRACE, 1 = DEBUG, 2 = INFO, 3 = WARN, 4 = ERROR, "+
"5 = CRITICAL, 6 = FATAL, -1 = disabled.")
}
////////////////////////////////////////////////////////////////////////////////
// Copyright © 2022 xx foundation //
// //
// Use of this source code is governed by a license that can be found in the //
// LICENSE file. //
////////////////////////////////////////////////////////////////////////////////
//go:build js && wasm
package dm
import "gitlab.com/elixxir/xxdk-wasm/worker"
// List of tags that can be used when sending a message or registering a handler
// to receive a message.
const (
NewStateTag worker.Tag = "NewState"
SetTag worker.Tag = "Set"
GetTag worker.Tag = "Get"
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment