From a3ecc8c79e74c689524e5b0e2f7e9666f3a97fe5 Mon Sep 17 00:00:00 2001 From: Jono Wenger <jono@elixxir.io> Date: Thu, 20 Oct 2022 14:43:18 -0700 Subject: [PATCH] Add list to local storage that tracks indexedDb database names --- indexedDb/init.go | 8 ++++++ utils/indexedDbList.go | 53 +++++++++++++++++++++++++++++++++++++ utils/indexedDbList_test.go | 38 ++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 utils/indexedDbList.go create mode 100644 utils/indexedDbList_test.go diff --git a/indexedDb/init.go b/indexedDb/init.go index 3b8357ec..bed5ea75 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 00000000..a83321ef --- /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 00000000..b9d4ce9d --- /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) + } +} -- GitLab