Skip to content
Snippets Groups Projects
Commit 5ddc38cb authored by Jono Wenger's avatar Jono Wenger
Browse files

Add Purge function to clear all storage used by wasm

parent a3ecc8c7
No related branches found
No related tags found
1 merge request!18XX-4272 / Purge
......@@ -141,6 +141,9 @@ func main() {
js.Global().Set("GetDefaultE2eFileTransferParams",
js.FuncOf(wasm.GetDefaultE2eFileTransferParams))
// wasm/purge.go
js.Global().Set("Purge", js.FuncOf(wasm.Purge))
// wasm/restlike.go
js.Global().Set("RestlikeRequest", js.FuncOf(wasm.RestlikeRequest))
js.Global().Set("RestlikeRequestAuth", js.FuncOf(wasm.RestlikeRequestAuth))
......
......@@ -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
}
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