diff --git a/indexedDb/init.go b/indexedDb/init.go index 3b8357ec8f0807c22285abe95aa31a839d573ecf..bed5ea752ab887ad0bfdcbfb648e9803f3ffe136 100644 --- a/indexedDb/init.go +++ b/indexedDb/init.go @@ -10,6 +10,7 @@ package indexedDb import ( + "gitlab.com/elixxir/xxdk-wasm/utils" "syscall/js" "github.com/hack-pad/go-indexeddb/idb" @@ -143,5 +144,12 @@ func v1Upgrade(db *idb.Database) error { return err } + // Get the database name and save it to storage + if databaseName, err := db.Name(); err != nil { + return err + } else if err = utils.StoreIndexedDb(databaseName); err != nil { + return err + } + return nil } diff --git a/utils/indexedDbList.go b/utils/indexedDbList.go new file mode 100644 index 0000000000000000000000000000000000000000..a83321eff905469e80f4761b90a96542636277cc --- /dev/null +++ b/utils/indexedDbList.go @@ -0,0 +1,53 @@ +//////////////////////////////////////////////////////////////////////////////// +// 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 utils + +import ( + "encoding/json" + "github.com/pkg/errors" + "os" +) + +const indexedDbListKey = "xxDkWasmIndexedDbList" + +// GetIndexedDbList returns the list of stored indexedDb databases. +func GetIndexedDbList() ([]string, error) { + var list []string + listBytes, err := GetLocalStorage().GetItem(indexedDbListKey) + if err != nil && !errors.Is(err, os.ErrNotExist) { + return nil, err + } else if err == nil { + err = json.Unmarshal(listBytes, &list) + if err != nil { + return nil, err + } + } + + return list, nil +} + +// StoreIndexedDb saved the indexedDb database name to storage. +func StoreIndexedDb(databaseName string) error { + list, err := GetIndexedDbList() + if err != nil { + return err + } + + list = append(list, databaseName) + + listBytes, err := json.Marshal(list) + if err != nil { + return err + } + + GetLocalStorage().SetItem(indexedDbListKey, listBytes) + + return nil +} diff --git a/utils/indexedDbList_test.go b/utils/indexedDbList_test.go new file mode 100644 index 0000000000000000000000000000000000000000..b9d4ce9d105cadae54213c28f6a5993a7fdbf7a8 --- /dev/null +++ b/utils/indexedDbList_test.go @@ -0,0 +1,38 @@ +//////////////////////////////////////////////////////////////////////////////// +// 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 utils + +import ( + "reflect" + "testing" +) + +// Tests that three indexedDb database names stored with StoreIndexedDb are +// retrieved with GetIndexedDbList. +func TestStoreIndexedDb_GetIndexedDbList(t *testing.T) { + expected := []string{"db1", "db2", "db3"} + + for _, name := range expected { + err := StoreIndexedDb(name) + if err != nil { + t.Errorf("Failed to store database name %q: %+v", name, err) + } + } + + list, err := GetIndexedDbList() + if err != nil { + t.Errorf("Failed to get database list: %+v", err) + } + + if !reflect.DeepEqual(expected, list) { + t.Errorf("Did not get expected list.\nexpected: %s\nreceived: %s", + expected, list) + } +}