Skip to content
Snippets Groups Projects

XX-4272 / Purge

Merged Jono Wenger requested to merge XX-4272/purge into release
2 files
+ 68
0
Compare changes
  • Side-by-side
  • Inline
Files
2
+ 65
0
@@ -7,9 +7,74 @@
package wasm
import (
"github.com/hack-pad/go-indexeddb/idb"
"github.com/pkg/errors"
"gitlab.com/elixxir/xxdk-wasm/creds"
"gitlab.com/elixxir/xxdk-wasm/utils"
"sync/atomic"
"syscall/js"
)
// NumClientsRunning is an atomic that tracks the current number of Cmix
// followers that have been started. Every time one is started, this counter
// must be incremented and every time one is stopped, it must be decremented.
//
// This variable is an atomic. Only access it with atomic functions
var NumClientsRunning uint64
// Purge clears all local storage and indexedDb databases saved by this WASM
// binary. All Cmix followers must be closed and the user's password is
// required.
//
// Warning: This deletes all storage local to the webpage running this WASM.
// Only use if you want to destroy everything.
//
// Parameters:
// - args[0] - Storage directory path (string).
// - args[1] - Password used for storage (Uint8Array).
//
// Returns:
// - Throws a TypeError if the password is incorrect or if not all Cmix
// followers have been stopped.
func Purge(_ js.Value, args []js.Value) interface{} {
// Check the password
if !creds.VerifyPassword(js.Value{}, []js.Value{args[1]}).(bool) {
utils.Throw(utils.TypeError, errors.New("invalid password"))
return nil
}
// Verify all Cmix followers are stopped
if n := atomic.LoadUint64(&NumClientsRunning); n != 0 {
utils.Throw(
utils.TypeError, errors.Errorf("%d Cmix followers running", n))
return nil
}
// Get all indexedDb database names
databaseList, err := utils.GetIndexedDbList()
if err != nil {
utils.Throw(
utils.TypeError, errors.Errorf(
"failed to get list of indexedDb database names: %+v", err))
return nil
}
// Delete each database
for _, dbName := range databaseList {
_, err = idb.Global().DeleteDatabase(dbName)
if err != nil {
utils.Throw(
utils.TypeError, errors.Errorf(
"failed to delete indexedDb database %q: %+v", dbName, err))
return nil
}
}
// Clear WASM local storage and EKV
ls := utils.GetLocalStorage()
ls.ClearWASM()
ls.ClearPrefix(args[0].String())
return nil
}
Loading