diff --git a/indexedDb/implementation.go b/indexedDb/implementation.go index 2763d924372e37745035f51116b8a869a1b1e2ae..3e42108e2de0dc9d8ba5c8dfff7e6b1143d2bb8e 100644 --- a/indexedDb/implementation.go +++ b/indexedDb/implementation.go @@ -12,6 +12,7 @@ package indexedDb import ( "context" + "encoding/base64" "encoding/json" "github.com/hack-pad/go-indexeddb/idb" "github.com/pkg/errors" @@ -193,12 +194,26 @@ func (w *wasmModel) ReceiveReaction(channelID *id.ID, messageID cryptoChannel.Me func (w *wasmModel) UpdateSentStatus(messageID cryptoChannel.MessageID, status channels.SentStatus) { parentErr := errors.New("failed to UpdateSentStatus") - newMessage := &Message{ - Id: messageID.Bytes(), - Status: uint8(status), + + // Convert messageID to the key generated by json.Marshal + key := js.ValueOf(base64.StdEncoding.EncodeToString(messageID[:])) + + // Use the key to get the existing Message + currentMsg, err := w.get(messageStoreName, key) + if err != nil { + return + } + + // Extract the existing Message and update the Status + newMessage := &Message{} + err = json.Unmarshal([]byte(currentMsg), newMessage) + if err != nil { + return } + newMessage.Status = uint8(status) - err := w.receiveHelper(newMessage) + // Store the updated Message + err = w.receiveHelper(newMessage) if err != nil { jww.ERROR.Printf("%+v", errors.Wrap(parentErr, err.Error())) } @@ -263,6 +278,44 @@ func (w *wasmModel) receiveHelper(newMessage *Message) error { return nil } +// get is a generic private helper for getting values from the given [idb.ObjectStore]. +func (w *wasmModel) get(objectStoreName string, key js.Value) (string, error) { + parentErr := errors.Errorf("failed to get %s/%s", objectStoreName, key) + + // Prepare the Transaction + txn, err := w.db.Transaction(idb.TransactionReadOnly, objectStoreName) + if err != nil { + return "", errors.WithMessagef(parentErr, + "Unable to create Transaction: %+v", err) + } + store, err := txn.ObjectStore(objectStoreName) + if err != nil { + return "", errors.WithMessagef(parentErr, + "Unable to get ObjectStore: %+v", err) + } + + // Perform the operation + getRequest, err := store.Get(key) + if err != nil { + return "", errors.WithMessagef(parentErr, + "Unable to Get from ObjectStore: %+v", err) + } + + // Wait for the operation to return + ctx, cancel := newContext() + resultObj, err := getRequest.Await(ctx) + cancel() + if err != nil { + return "", errors.WithMessagef(parentErr, + "Unable to get from ObjectStore: %+v", err) + } + + // Process result into string + resultStr := utils.JsToJson(resultObj) + jww.DEBUG.Printf("Got from %s/%s: %s", objectStoreName, key, resultStr) + return resultStr, nil +} + // dump given [idb.ObjectStore] contents to string slice for debugging purposes func (w *wasmModel) dump(objectStoreName string) ([]string, error) { parentErr := errors.Errorf("failed to dump %s", objectStoreName)