diff --git a/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h
--- a/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h
+++ b/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h
@@ -3,7 +3,6 @@
 #include "../CryptoTools/Persist.h"
 #include "entities/Draft.h"
 #include "entities/KeyserverInfo.h"
-#include "entities/Media.h"
 #include "entities/Message.h"
 #include "entities/MessageStoreThread.h"
 #include "entities/OlmPersistAccount.h"
@@ -78,6 +77,9 @@
   virtual void rollbackTransaction() const = 0;
   virtual std::vector<OlmPersistSession> getOlmPersistSessionsData() const = 0;
   virtual std::optional<std::string> getOlmPersistAccountData() const = 0;
+  virtual void
+  storeOlmPersistSession(const OlmPersistSession &session) const = 0;
+  virtual void storeOlmPersistAccount(const std::string &accountData) const = 0;
   virtual void storeOlmPersistData(crypto::Persist persist) const = 0;
   virtual void setNotifyToken(std::string token) const = 0;
   virtual void clearNotifyToken() const = 0;
@@ -93,6 +95,9 @@
 #ifdef EMSCRIPTEN
   virtual std::vector<WebThread> getAllThreadsWeb() const = 0;
   virtual void replaceThreadWeb(const WebThread &thread) const = 0;
+  virtual std::vector<MessageWithMedias> getAllMessagesWeb() const = 0;
+  virtual void replaceMessageWeb(const WebMessage &message) const = 0;
+  virtual NullableString getOlmPersistAccountDataWeb() const = 0;
 #else
   virtual void createMainCompaction(std::string backupID) const = 0;
 #endif
diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h
--- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h
+++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h
@@ -85,6 +85,8 @@
   void rollbackTransaction() const override;
   std::vector<OlmPersistSession> getOlmPersistSessionsData() const override;
   std::optional<std::string> getOlmPersistAccountData() const override;
+  void storeOlmPersistSession(const OlmPersistSession &session) const override;
+  void storeOlmPersistAccount(const std::string &accountData) const override;
   void storeOlmPersistData(crypto::Persist persist) const override;
   void setNotifyToken(std::string token) const override;
   void clearNotifyToken() const override;
@@ -100,6 +102,9 @@
 #ifdef EMSCRIPTEN
   std::vector<WebThread> getAllThreadsWeb() const override;
   void replaceThreadWeb(const WebThread &thread) const override;
+  std::vector<MessageWithMedias> getAllMessagesWeb() const override;
+  void replaceMessageWeb(const WebMessage &message) const override;
+  NullableString getOlmPersistAccountDataWeb() const override;
 #else
   static void clearSensitiveData();
   static void initialize(std::string &databasePath);
diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp
--- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp
+++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp
@@ -1535,28 +1535,40 @@
       : std::optional<std::string>(result[0].account_data);
 }
 
-void SQLiteQueryExecutor::storeOlmPersistData(crypto::Persist persist) const {
+void SQLiteQueryExecutor::storeOlmPersistAccount(
+    const std::string &accountData) const {
   static std::string replaceOlmPersistAccountSQL =
       "REPLACE INTO olm_persist_account (id, account_data) "
       "VALUES (?, ?);";
-  static std::string replaceOlmPersistSessionSQL =
-      "REPLACE INTO olm_persist_sessions (target_user_id, session_data) "
-      "VALUES (?, ?);";
 
-  OlmPersistAccount persistAccount = {
-      ACCOUNT_ID, std::string(persist.account.begin(), persist.account.end())};
+  OlmPersistAccount persistAccount = {ACCOUNT_ID, accountData};
+
   replaceEntity<OlmPersistAccount>(
       SQLiteQueryExecutor::getConnection(),
       replaceOlmPersistAccountSQL,
       persistAccount);
+}
+
+void SQLiteQueryExecutor::storeOlmPersistSession(
+    const OlmPersistSession &session) const {
+  static std::string replaceOlmPersistSessionSQL =
+      "REPLACE INTO olm_persist_sessions (target_user_id, session_data) "
+      "VALUES (?, ?);";
+
+  replaceEntity<OlmPersistSession>(
+      SQLiteQueryExecutor::getConnection(),
+      replaceOlmPersistSessionSQL,
+      session);
+}
+
+void SQLiteQueryExecutor::storeOlmPersistData(crypto::Persist persist) const {
+  std::string accountData =
+      std::string(persist.account.begin(), persist.account.end());
 
   for (auto it = persist.sessions.begin(); it != persist.sessions.end(); it++) {
     OlmPersistSession persistSession = {
         it->first, std::string(it->second.begin(), it->second.end())};
-    replaceEntity<OlmPersistSession>(
-        SQLiteQueryExecutor::getConnection(),
-        replaceOlmPersistSessionSQL,
-        persistSession);
+    this->storeOlmPersistSession(persistSession);
   }
 }
 
@@ -1624,6 +1636,30 @@
 void SQLiteQueryExecutor::replaceThreadWeb(const WebThread &thread) const {
   this->replaceThread(thread.toThread());
 };
+
+std::vector<MessageWithMedias> SQLiteQueryExecutor::getAllMessagesWeb() const {
+  auto allMessages = this->getAllMessages();
+
+  std::vector<MessageWithMedias> allMessageWithMedias;
+  for (auto &messageWitMedia : allMessages) {
+    allMessageWithMedias.push_back(
+        {std::move(messageWitMedia.first), messageWitMedia.second});
+  }
+
+  return allMessageWithMedias;
+}
+
+void SQLiteQueryExecutor::replaceMessageWeb(const WebMessage &message) const {
+  this->replaceMessage(message.toMessage());
+};
+
+NullableString SQLiteQueryExecutor::getOlmPersistAccountDataWeb() const {
+  std::optional<std::string> accountData = this->getOlmPersistAccountData();
+  if (!accountData.has_value()) {
+    return NullableString();
+  }
+  return std::make_unique<std::string>(accountData.value());
+}
 #else
 void SQLiteQueryExecutor::clearSensitiveData() {
   SQLiteQueryExecutor::closeConnection();
diff --git a/native/cpp/CommonCpp/DatabaseManagers/entities/Message.h b/native/cpp/CommonCpp/DatabaseManagers/entities/Message.h
--- a/native/cpp/CommonCpp/DatabaseManagers/entities/Message.h
+++ b/native/cpp/CommonCpp/DatabaseManagers/entities/Message.h
@@ -1,8 +1,11 @@
 #pragma once
 
+#include "Media.h"
+#include "Nullable.h"
 #include <sqlite3.h>
 #include <memory>
 #include <string>
+#include <vector>
 
 namespace comm {
 
@@ -40,4 +43,46 @@
   }
 };
 
+struct WebMessage {
+  std::string id;
+  NullableString local_id;
+  std::string thread;
+  std::string user;
+  int type;
+  NullableInt future_type;
+  NullableString content;
+  std::string time;
+
+  WebMessage() = default;
+
+  WebMessage(const Message &message) {
+    id = message.id;
+    local_id = NullableString(message.local_id);
+    thread = message.thread;
+    user = message.user;
+    type = message.type;
+    future_type = NullableInt(message.future_type);
+    content = NullableString(message.content);
+    time = std::to_string(message.time);
+  }
+
+  Message toMessage() const {
+    Message message;
+    message.id = id;
+    message.local_id = local_id.resetValue();
+    message.thread = thread;
+    message.user = user;
+    message.type = type;
+    message.future_type = future_type.resetValue();
+    message.content = content.resetValue();
+    message.time = std::stoll(time);
+    return message;
+  }
+};
+
+struct MessageWithMedias {
+  WebMessage message;
+  std::vector<Media> medias;
+};
+
 } // namespace comm
diff --git a/web/cpp/SQLiteQueryExecutorBindings.cpp b/web/cpp/SQLiteQueryExecutorBindings.cpp
--- a/web/cpp/SQLiteQueryExecutorBindings.cpp
+++ b/web/cpp/SQLiteQueryExecutorBindings.cpp
@@ -26,6 +26,9 @@
   value_object<NullableString>("NullableString")
       .field("value", &NullableString::value)
       .field("isNull", &NullableString::isNull);
+  value_object<NullableInt>("NullableInt")
+      .field("value", &NullableInt::value)
+      .field("isNull", &NullableInt::isNull);
 
   value_object<Draft>("Draft")
       .field("key", &Draft::key)
@@ -42,6 +45,9 @@
   value_object<KeyserverInfo>("KeyserverInfo")
       .field("id", &KeyserverInfo::id)
       .field("keyserverInfo", &KeyserverInfo::keyserver_info);
+  value_object<MessageStoreThread>("MessageStoreThreads")
+      .field("id", &MessageStoreThread::id)
+      .field("startReached", &MessageStoreThread::start_reached);
 
   value_object<WebThread>("WebThread")
       .field("id", &WebThread::id)
@@ -61,6 +67,32 @@
       .field("avatar", &WebThread::avatar)
       .field("pinnedCount", &WebThread::pinned_count);
 
+  value_object<WebMessage>("WebMessage")
+      .field("id", &WebMessage::id)
+      .field("localID", &WebMessage::local_id)
+      .field("thread", &WebMessage::thread)
+      .field("user", &WebMessage::user)
+      .field("type", &WebMessage::type)
+      .field("futureType", &WebMessage::future_type)
+      .field("content", &WebMessage::content)
+      .field("time", &WebMessage::time);
+
+  value_object<Media>("Media")
+      .field("id", &Media::id)
+      .field("container", &Media::container)
+      .field("thread", &Media::thread)
+      .field("uri", &Media::uri)
+      .field("type", &Media::type)
+      .field("extras", &Media::extras);
+
+  value_object<MessageWithMedias>("MessageWithMedias")
+      .field("message", &MessageWithMedias::message)
+      .field("medias", &MessageWithMedias::medias);
+
+  value_object<OlmPersistSession>("OlmPersistSession")
+      .field("targetUserID", &OlmPersistSession::target_user_id)
+      .field("sessionData", &OlmPersistSession::session_data);
+
   class_<SQLiteQueryExecutor>("SQLiteQueryExecutor")
       .constructor<std::string>()
       .function("updateDraft", &SQLiteQueryExecutor::updateDraft)
@@ -68,6 +100,37 @@
       .function("getAllDrafts", &SQLiteQueryExecutor::getAllDrafts)
       .function("removeAllDrafts", &SQLiteQueryExecutor::removeAllDrafts)
       .function("removeDrafts", &SQLiteQueryExecutor::removeDrafts)
+      .function("getAllMessagesWeb", &SQLiteQueryExecutor::getAllMessagesWeb)
+      .function("removeAllMessages", &SQLiteQueryExecutor::removeAllMessages)
+      .function("removeMessages", &SQLiteQueryExecutor::removeMessages)
+      .function(
+          "removeMessagesForThreads",
+          &SQLiteQueryExecutor::removeMessagesForThreads)
+      .function("replaceMessageWeb", &SQLiteQueryExecutor::replaceMessageWeb)
+      .function("rekeyMessage", &SQLiteQueryExecutor::rekeyMessage)
+      .function("removeAllMedia", &SQLiteQueryExecutor::removeAllMedia)
+      .function(
+          "removeMediaForThreads", &SQLiteQueryExecutor::removeMediaForThreads)
+      .function(
+          "removeMediaForMessage", &SQLiteQueryExecutor::removeMediaForMessage)
+      .function(
+          "removeMediaForMessages",
+          &SQLiteQueryExecutor::removeMediaForMessages)
+      .function("replaceMedia", &SQLiteQueryExecutor::replaceMedia)
+      .function(
+          "rekeyMediaContainers", &SQLiteQueryExecutor::rekeyMediaContainers)
+      .function(
+          "replaceMessageStoreThreads",
+          &SQLiteQueryExecutor::replaceMessageStoreThreads)
+      .function(
+          "removeMessageStoreThreads",
+          &SQLiteQueryExecutor::removeMessageStoreThreads)
+      .function(
+          "getAllMessageStoreThreads",
+          &SQLiteQueryExecutor::getAllMessageStoreThreads)
+      .function(
+          "removeAllMessageStoreThreads",
+          &SQLiteQueryExecutor::removeAllMessageStoreThreads)
       .function("setMetadata", &SQLiteQueryExecutor::setMetadata)
       .function("clearMetadata", &SQLiteQueryExecutor::clearMetadata)
       .function("getMetadata", &SQLiteQueryExecutor::getMetadata)
@@ -97,6 +160,18 @@
       .function("getAllKeyservers", &SQLiteQueryExecutor::getAllKeyservers)
       .function("beginTransaction", &SQLiteQueryExecutor::beginTransaction)
       .function("commitTransaction", &SQLiteQueryExecutor::commitTransaction)
+      .function(
+          "getOlmPersistSessionsData",
+          &SQLiteQueryExecutor::getOlmPersistSessionsData)
+      .function(
+          "getOlmPersistAccountDataWeb",
+          &SQLiteQueryExecutor::getOlmPersistAccountDataWeb)
+      .function(
+          "storeOlmPersistSession",
+          &SQLiteQueryExecutor::storeOlmPersistSession)
+      .function(
+          "storeOlmPersistAccount",
+          &SQLiteQueryExecutor::storeOlmPersistAccount)
       .function(
           "rollbackTransaction", &SQLiteQueryExecutor::rollbackTransaction)
       .function(
diff --git a/web/database/_generated/comm-query-executor.js b/web/database/_generated/comm-query-executor.js
--- a/web/database/_generated/comm-query-executor.js
+++ b/web/database/_generated/comm-query-executor.js
@@ -116,35 +116,35 @@
 V.prototype.xd=function(a){this.Tc&&(a=this.Tc(a));return a};V.prototype.Hc=function(a){this.pb&&this.pb(a)};V.prototype.argPackAdvance=8;V.prototype.readValueFromPointer=lb;V.prototype.deleteObject=function(a){if(null!==a)a["delete"]()};
 V.prototype.fromWireType=function(a){function b(){return this.Vb?Jb(this.Ta.Eb,{Xa:this.Md,Sa:c,fb:this,ab:a}):Jb(this.Ta.Eb,{Xa:this,Sa:a})}var c=this.xd(a);if(!c)return this.Hc(a),null;var d=Ib(this.Ta,c);if(void 0!==d){if(0===d.Na.count.value)return d.Na.Sa=c,d.Na.ab=a,d.clone();d=d.clone();this.Hc(a);return d}d=this.Ta.vd(c);d=Db[d];if(!d)return b.call(this);d=this.Tb?d.jd:d.pointerType;var f=Cb(c,this.Ta,d.Ta);return null===f?b.call(this):this.Vb?Jb(d.Ta.Eb,{Xa:d,Sa:f,fb:this,ab:a}):Jb(d.Ta.Eb,
 {Xa:d,Sa:f})};Wb=e.UnboundTypeError=rb("UnboundTypeError");e.count_emval_handles=function(){for(var a=0,b=5;b<Y.length;++b)void 0!==Y[b]&&++a;return a};e.get_first_emval=function(){for(var a=5;a<Y.length;++a)if(void 0!==Y[a])return Y[a];return null};
-var Lc={a:function(a){return wc(a+24)+24},b:function(a,b,c){(new Oa(a)).Db(b,c);Pa++;throw a;},Z:function(a,b){try{return a=y(a),N.chmod(a,b),0}catch(c){if("undefined"==typeof N||!(c instanceof N.Ma))throw c;return-c.Ra}},ca:function(a,b,c){try{b=y(b);b=P(a,b);if(c&-8)return-28;var d=N.Ua(b,{eb:!0}).node;if(!d)return-44;a="";c&4&&(a+="r");c&2&&(a+="w");c&1&&(a+="x");return a&&N.sb(d,a)?-2:0}catch(f){if("undefined"==typeof N||!(f instanceof N.Ma))throw f;return-f.Ra}},_:function(a,b){try{return N.fchmod(a,
-b),0}catch(c){if("undefined"==typeof N||!(c instanceof N.Ma))throw c;return-c.Ra}},Y:function(a,b,c){try{return N.fchown(a,b,c),0}catch(d){if("undefined"==typeof N||!(d instanceof N.Ma))throw d;return-d.Ra}},f:function(a,b,c){gb=c;try{var d=Q(a);switch(b){case 0:var f=hb();return 0>f?-28:N.Fc(d,f).fd;case 1:case 2:return 0;case 3:return d.flags;case 4:return f=hb(),d.flags|=f,0;case 5:return f=hb(),D[f+0>>1]=2,0;case 6:case 7:return 0;case 16:case 8:return-28;case 9:return E[Kc()>>2]=28,-1;default:return-28}}catch(g){if("undefined"==
-typeof N||!(g instanceof N.Ma))throw g;return-g.Ra}},W:function(a,b){try{var c=Q(a);return fb(N.stat,c.path,b)}catch(d){if("undefined"==typeof N||!(d instanceof N.Ma))throw d;return-d.Ra}},C:function(a,b,c){try{b=c+2097152>>>0<4194305-!!b?(b>>>0)+4294967296*c:NaN;if(isNaN(b))return-61;N.ud(a,b);return 0}catch(d){if("undefined"==typeof N||!(d instanceof N.Ma))throw d;return-d.Ra}},R:function(a,b){try{if(0===b)return-28;var c=N.cwd(),d=ta(c)+1;if(b<d)return-68;A(c,z,a,b);return d}catch(f){if("undefined"==
-typeof N||!(f instanceof N.Ma))throw f;return-f.Ra}},L:function(a,b,c){try{var d=Q(a);d.ub||(d.ub=N.readdir(d.path));a=0;for(var f=N.bb(d,0,1),g=Math.floor(f/280);g<d.ub.length&&a+280<=c;){var k=d.ub[g];if("."===k){var h=d.node.id;var n=4}else if(".."===k)h=N.Ua(d.path,{parent:!0}).node.id,n=4;else{var q=N.kb(d.node,k);h=q.id;n=N.Jb(q.mode)?2:N.Ya(q.mode)?4:N.vb(q.mode)?10:8}J=[h>>>0,(G=h,1<=+Math.abs(G)?0<G?(Math.min(+Math.floor(G/4294967296),4294967295)|0)>>>0:~~+Math.ceil((G-+(~~G>>>0))/4294967296)>>>
-0:0)];E[b+a>>2]=J[0];E[b+a+4>>2]=J[1];J=[280*(g+1)>>>0,(G=280*(g+1),1<=+Math.abs(G)?0<G?(Math.min(+Math.floor(G/4294967296),4294967295)|0)>>>0:~~+Math.ceil((G-+(~~G>>>0))/4294967296)>>>0:0)];E[b+a+8>>2]=J[0];E[b+a+12>>2]=J[1];D[b+a+16>>1]=280;B[b+a+18>>0]=n;A(k,z,b+a+19,256);a+=280;g+=1}N.bb(d,280*g,0);return a}catch(p){if("undefined"==typeof N||!(p instanceof N.Ma))throw p;return-p.Ra}},X:function(a,b,c){gb=c;try{var d=Q(a);switch(b){case 21509:case 21505:return d.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return d.tty?
-0:-59;case 21519:if(!d.tty)return-59;var f=hb();return E[f>>2]=0;case 21520:return d.tty?-28:-59;case 21531:return f=hb(),N.kc(d,b,f);case 21523:return d.tty?0:-59;case 21524:return d.tty?0:-59;default:v("bad ioctl syscall "+b)}}catch(g){if("undefined"==typeof N||!(g instanceof N.Ma))throw g;return-g.Ra}},U:function(a,b){try{return a=y(a),fb(N.lstat,a,b)}catch(c){if("undefined"==typeof N||!(c instanceof N.Ma))throw c;return-c.Ra}},O:function(a,b,c){try{return b=y(b),b=P(a,b),b=L(b),"/"===b[b.length-
-1]&&(b=b.substr(0,b.length-1)),N.mkdir(b,c,0),0}catch(d){if("undefined"==typeof N||!(d instanceof N.Ma))throw d;return-d.Ra}},T:function(a,b,c,d){try{b=y(b);var f=d&256;b=P(a,b,d&4096);return fb(f?N.lstat:N.stat,b,c)}catch(g){if("undefined"==typeof N||!(g instanceof N.Ma))throw g;return-g.Ra}},u:function(a,b,c,d){gb=d;try{b=y(b);b=P(a,b);var f=d?hb():0;return N.open(b,c,f).fd}catch(g){if("undefined"==typeof N||!(g instanceof N.Ma))throw g;return-g.Ra}},K:function(a,b,c,d){try{b=y(b);b=P(a,b);if(0>=
-d)return-28;var f=N.readlink(b),g=Math.min(d,ta(f)),k=B[c+g];A(f,z,c,d+1);B[c+g]=k;return g}catch(h){if("undefined"==typeof N||!(h instanceof N.Ma))throw h;return-h.Ra}},J:function(a,b,c,d){try{return b=y(b),d=y(d),b=P(a,b),d=P(c,d),N.rename(b,d),0}catch(f){if("undefined"==typeof N||!(f instanceof N.Ma))throw f;return-f.Ra}},q:function(a){try{return a=y(a),N.rmdir(a),0}catch(b){if("undefined"==typeof N||!(b instanceof N.Ma))throw b;return-b.Ra}},V:function(a,b){try{return a=y(a),fb(N.stat,a,b)}catch(c){if("undefined"==
-typeof N||!(c instanceof N.Ma))throw c;return-c.Ra}},r:function(a,b,c){try{return b=y(b),b=P(a,b),0===c?N.unlink(b):512===c?N.rmdir(b):v("Invalid flags passed to unlinkat"),0}catch(d){if("undefined"==typeof N||!(d instanceof N.Ma))throw d;return-d.Ra}},G:function(a,b,c){try{b=y(b);b=P(a,b,!0);if(c){var d=ib(c),f=E[c+8>>2];g=1E3*d+f/1E6;c+=16;d=ib(c);f=E[c+8>>2];k=1E3*d+f/1E6}else var g=Date.now(),k=g;N.ae(b,g,k);return 0}catch(h){if("undefined"==typeof N||!(h instanceof N.Ma))throw h;return-h.Ra}},
-h:function(a){var b=jb[a];delete jb[a];var c=b.rc,d=b.pb,f=b.Lc,g=f.map(k=>k.zd).concat(f.map(k=>k.Sd));ub([a],g,k=>{var h={};f.forEach((n,q)=>{var p=k[q],t=n.Sb,x=n.yd,l=k[q+f.length],u=n.Rd,w=n.Td;h[n.rd]={read:C=>p.fromWireType(t(x,C)),write:(C,K)=>{var H=[];u(w,C,l.toWireType(H,K));kb(H)}}});return[{name:b.name,fromWireType:function(n){var q={},p;for(p in h)q[p]=h[p].read(n);d(n);return q},toWireType:function(n,q){for(var p in h)if(!(p in q))throw new TypeError('Missing field:  "'+p+'"');var t=
-c();for(p in h)h[p].write(t,q[p]);null!==n&&n.push(d,t);return t},argPackAdvance:8,readValueFromPointer:lb,ib:d}]})},D:function(){},ea:function(a,b,c,d,f){var g=vb(c);b=S(b);R(a,{name:b,fromWireType:function(k){return!!k},toWireType:function(k,h){return h?d:f},argPackAdvance:8,readValueFromPointer:function(k){if(1===c)var h=B;else if(2===c)h=D;else if(4===c)h=E;else throw new TypeError("Unknown boolean type size: "+b);return this.fromWireType(h[k>>g])},ib:null})},I:function(a,b,c,d,f,g,k,h,n,q,p,
+var Lc={a:function(a){return wc(a+24)+24},c:function(a,b,c){(new Oa(a)).Db(b,c);Pa++;throw a;},_:function(a,b){try{return a=y(a),N.chmod(a,b),0}catch(c){if("undefined"==typeof N||!(c instanceof N.Ma))throw c;return-c.Ra}},da:function(a,b,c){try{b=y(b);b=P(a,b);if(c&-8)return-28;var d=N.Ua(b,{eb:!0}).node;if(!d)return-44;a="";c&4&&(a+="r");c&2&&(a+="w");c&1&&(a+="x");return a&&N.sb(d,a)?-2:0}catch(f){if("undefined"==typeof N||!(f instanceof N.Ma))throw f;return-f.Ra}},$:function(a,b){try{return N.fchmod(a,
+b),0}catch(c){if("undefined"==typeof N||!(c instanceof N.Ma))throw c;return-c.Ra}},Z:function(a,b,c){try{return N.fchown(a,b,c),0}catch(d){if("undefined"==typeof N||!(d instanceof N.Ma))throw d;return-d.Ra}},h:function(a,b,c){gb=c;try{var d=Q(a);switch(b){case 0:var f=hb();return 0>f?-28:N.Fc(d,f).fd;case 1:case 2:return 0;case 3:return d.flags;case 4:return f=hb(),d.flags|=f,0;case 5:return f=hb(),D[f+0>>1]=2,0;case 6:case 7:return 0;case 16:case 8:return-28;case 9:return E[Kc()>>2]=28,-1;default:return-28}}catch(g){if("undefined"==
+typeof N||!(g instanceof N.Ma))throw g;return-g.Ra}},X:function(a,b){try{var c=Q(a);return fb(N.stat,c.path,b)}catch(d){if("undefined"==typeof N||!(d instanceof N.Ma))throw d;return-d.Ra}},E:function(a,b,c){try{b=c+2097152>>>0<4194305-!!b?(b>>>0)+4294967296*c:NaN;if(isNaN(b))return-61;N.ud(a,b);return 0}catch(d){if("undefined"==typeof N||!(d instanceof N.Ma))throw d;return-d.Ra}},S:function(a,b){try{if(0===b)return-28;var c=N.cwd(),d=ta(c)+1;if(b<d)return-68;A(c,z,a,b);return d}catch(f){if("undefined"==
+typeof N||!(f instanceof N.Ma))throw f;return-f.Ra}},M:function(a,b,c){try{var d=Q(a);d.ub||(d.ub=N.readdir(d.path));a=0;for(var f=N.bb(d,0,1),g=Math.floor(f/280);g<d.ub.length&&a+280<=c;){var k=d.ub[g];if("."===k){var h=d.node.id;var n=4}else if(".."===k)h=N.Ua(d.path,{parent:!0}).node.id,n=4;else{var q=N.kb(d.node,k);h=q.id;n=N.Jb(q.mode)?2:N.Ya(q.mode)?4:N.vb(q.mode)?10:8}J=[h>>>0,(G=h,1<=+Math.abs(G)?0<G?(Math.min(+Math.floor(G/4294967296),4294967295)|0)>>>0:~~+Math.ceil((G-+(~~G>>>0))/4294967296)>>>
+0:0)];E[b+a>>2]=J[0];E[b+a+4>>2]=J[1];J=[280*(g+1)>>>0,(G=280*(g+1),1<=+Math.abs(G)?0<G?(Math.min(+Math.floor(G/4294967296),4294967295)|0)>>>0:~~+Math.ceil((G-+(~~G>>>0))/4294967296)>>>0:0)];E[b+a+8>>2]=J[0];E[b+a+12>>2]=J[1];D[b+a+16>>1]=280;B[b+a+18>>0]=n;A(k,z,b+a+19,256);a+=280;g+=1}N.bb(d,280*g,0);return a}catch(p){if("undefined"==typeof N||!(p instanceof N.Ma))throw p;return-p.Ra}},Y:function(a,b,c){gb=c;try{var d=Q(a);switch(b){case 21509:case 21505:return d.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return d.tty?
+0:-59;case 21519:if(!d.tty)return-59;var f=hb();return E[f>>2]=0;case 21520:return d.tty?-28:-59;case 21531:return f=hb(),N.kc(d,b,f);case 21523:return d.tty?0:-59;case 21524:return d.tty?0:-59;default:v("bad ioctl syscall "+b)}}catch(g){if("undefined"==typeof N||!(g instanceof N.Ma))throw g;return-g.Ra}},V:function(a,b){try{return a=y(a),fb(N.lstat,a,b)}catch(c){if("undefined"==typeof N||!(c instanceof N.Ma))throw c;return-c.Ra}},P:function(a,b,c){try{return b=y(b),b=P(a,b),b=L(b),"/"===b[b.length-
+1]&&(b=b.substr(0,b.length-1)),N.mkdir(b,c,0),0}catch(d){if("undefined"==typeof N||!(d instanceof N.Ma))throw d;return-d.Ra}},U:function(a,b,c,d){try{b=y(b);var f=d&256;b=P(a,b,d&4096);return fb(f?N.lstat:N.stat,b,c)}catch(g){if("undefined"==typeof N||!(g instanceof N.Ma))throw g;return-g.Ra}},v:function(a,b,c,d){gb=d;try{b=y(b);b=P(a,b);var f=d?hb():0;return N.open(b,c,f).fd}catch(g){if("undefined"==typeof N||!(g instanceof N.Ma))throw g;return-g.Ra}},L:function(a,b,c,d){try{b=y(b);b=P(a,b);if(0>=
+d)return-28;var f=N.readlink(b),g=Math.min(d,ta(f)),k=B[c+g];A(f,z,c,d+1);B[c+g]=k;return g}catch(h){if("undefined"==typeof N||!(h instanceof N.Ma))throw h;return-h.Ra}},K:function(a,b,c,d){try{return b=y(b),d=y(d),b=P(a,b),d=P(c,d),N.rename(b,d),0}catch(f){if("undefined"==typeof N||!(f instanceof N.Ma))throw f;return-f.Ra}},r:function(a){try{return a=y(a),N.rmdir(a),0}catch(b){if("undefined"==typeof N||!(b instanceof N.Ma))throw b;return-b.Ra}},W:function(a,b){try{return a=y(a),fb(N.stat,a,b)}catch(c){if("undefined"==
+typeof N||!(c instanceof N.Ma))throw c;return-c.Ra}},s:function(a,b,c){try{return b=y(b),b=P(a,b),0===c?N.unlink(b):512===c?N.rmdir(b):v("Invalid flags passed to unlinkat"),0}catch(d){if("undefined"==typeof N||!(d instanceof N.Ma))throw d;return-d.Ra}},I:function(a,b,c){try{b=y(b);b=P(a,b,!0);if(c){var d=ib(c),f=E[c+8>>2];g=1E3*d+f/1E6;c+=16;d=ib(c);f=E[c+8>>2];k=1E3*d+f/1E6}else var g=Date.now(),k=g;N.ae(b,g,k);return 0}catch(h){if("undefined"==typeof N||!(h instanceof N.Ma))throw h;return-h.Ra}},
+f:function(a){var b=jb[a];delete jb[a];var c=b.rc,d=b.pb,f=b.Lc,g=f.map(k=>k.zd).concat(f.map(k=>k.Sd));ub([a],g,k=>{var h={};f.forEach((n,q)=>{var p=k[q],t=n.Sb,x=n.yd,l=k[q+f.length],u=n.Rd,w=n.Td;h[n.rd]={read:C=>p.fromWireType(t(x,C)),write:(C,K)=>{var H=[];u(w,C,l.toWireType(H,K));kb(H)}}});return[{name:b.name,fromWireType:function(n){var q={},p;for(p in h)q[p]=h[p].read(n);d(n);return q},toWireType:function(n,q){for(var p in h)if(!(p in q))throw new TypeError('Missing field:  "'+p+'"');var t=
+c();for(p in h)h[p].write(t,q[p]);null!==n&&n.push(d,t);return t},argPackAdvance:8,readValueFromPointer:lb,ib:d}]})},F:function(){},fa:function(a,b,c,d,f){var g=vb(c);b=S(b);R(a,{name:b,fromWireType:function(k){return!!k},toWireType:function(k,h){return h?d:f},argPackAdvance:8,readValueFromPointer:function(k){if(1===c)var h=B;else if(2===c)h=D;else if(4===c)h=E;else throw new TypeError("Unknown boolean type size: "+b);return this.fromWireType(h[k>>g])},ib:null})},ka:function(a,b,c,d,f,g,k,h,n,q,p,
 t,x){p=S(p);g=W(f,g);h&&(h=W(k,h));q&&(q=W(n,q));x=W(t,x);var l=pb(p);Mb(l,function(){Zb("Cannot construct "+p+" due to unbound types",[d])});ub([a,b,c],d?[d]:[],function(u){u=u[0];if(d){var w=u.Ta;var C=w.Eb}else C=U.prototype;u=qb(l,function(){if(Object.getPrototypeOf(this)!==K)throw new xb("Use 'new' to construct "+p);if(void 0===H.tb)throw new xb(p+" has no accessible constructor");var I=H.tb[arguments.length];if(void 0===I)throw new xb("Tried to invoke ctor of "+p+" with invalid number of parameters ("+
-arguments.length+") - expected ("+Object.keys(H.tb).toString()+") parameters instead!");return I.apply(this,arguments)});var K=Object.create(C,{constructor:{value:u}});u.prototype=K;var H=new Nb(p,u,K,x,w,g,h,q);w=new V(p,H,!0,!1);C=new V(p+"*",H,!1,!1);var Ga=new V(p+" const*",H,!1,!0);Db[a]={pointerType:C,jd:Ga};Ub(l,u);return[w,C,Ga]})},A:function(a,b,c,d,f,g){0<b||v();var k=$b(b,c);f=W(d,f);ub([],[a],function(h){h=h[0];var n="constructor "+h.name;void 0===h.Ta.tb&&(h.Ta.tb=[]);if(void 0!==h.Ta.tb[b-
-1])throw new xb("Cannot register multiple constructors with identical number of parameters ("+(b-1)+") for class '"+h.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");h.Ta.tb[b-1]=()=>{Zb("Cannot construct "+h.name+" due to unbound types",k)};ub([],k,function(q){q.splice(1,0,null);h.Ta.tb[b-1]=bc(n,q,null,f,g);return[]});return[]})},d:function(a,b,c,d,f,g,k,h){var n=$b(c,d);b=S(b);g=W(f,g);ub([],[a],function(q){function p(){Zb("Cannot call "+
-t+" due to unbound types",n)}q=q[0];var t=q.name+"."+b;b.startsWith("@@")&&(b=Symbol[b.substring(2)]);h&&q.Ta.Nd.push(b);var x=q.Ta.Eb,l=x[b];void 0===l||void 0===l.$a&&l.className!==q.name&&l.Qb===c-2?(p.Qb=c-2,p.className=q.name,x[b]=p):(Lb(x,b,t),x[b].$a[c-2]=p);ub([],n,function(u){u=bc(t,u,q,g,k);void 0===x[b].$a?(u.Qb=c-2,x[b]=u):x[b].$a[c-2]=u;return[]});return[]})},da:function(a,b){b=S(b);R(a,{name:b,fromWireType:function(c){var d=ec(c);dc(c);return d},toWireType:function(c,d){return Sb(d)},
-argPackAdvance:8,readValueFromPointer:lb,ib:null})},w:function(a,b,c){c=vb(c);b=S(b);R(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,f){return f},argPackAdvance:8,readValueFromPointer:fc(b,c),ib:null})},ga:function(a,b,c,d,f,g){var k=$b(b,c);a=S(a);f=W(d,f);Mb(a,function(){Zb("Cannot call "+a+" due to unbound types",k)},b-1);ub([],k,function(h){h=[h[0],null].concat(h.slice(1));Ub(a,bc(a,h,null,f,g),b-1);return[]})},g:function(a,b,c,d,f){b=S(b);-1===f&&(f=4294967295);f=vb(c);var g=
-h=>h;if(0===d){var k=32-8*c;g=h=>h<<k>>>k}c=b.includes("unsigned")?function(h,n){return n>>>0}:function(h,n){return n};R(a,{name:b,fromWireType:g,toWireType:c,argPackAdvance:8,readValueFromPointer:gc(b,f,0!==d),ib:null})},c:function(a,b,c){function d(g){g>>=2;var k=F;return new f(ua,k[g+1],k[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=S(c);R(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{Ad:!0})},x:function(a,b){b=
+arguments.length+") - expected ("+Object.keys(H.tb).toString()+") parameters instead!");return I.apply(this,arguments)});var K=Object.create(C,{constructor:{value:u}});u.prototype=K;var H=new Nb(p,u,K,x,w,g,h,q);w=new V(p,H,!0,!1);C=new V(p+"*",H,!1,!1);var Ga=new V(p+" const*",H,!1,!0);Db[a]={pointerType:C,jd:Ga};Ub(l,u);return[w,C,Ga]})},ja:function(a,b,c,d,f,g){0<b||v();var k=$b(b,c);f=W(d,f);ub([],[a],function(h){h=h[0];var n="constructor "+h.name;void 0===h.Ta.tb&&(h.Ta.tb=[]);if(void 0!==h.Ta.tb[b-
+1])throw new xb("Cannot register multiple constructors with identical number of parameters ("+(b-1)+") for class '"+h.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");h.Ta.tb[b-1]=()=>{Zb("Cannot construct "+h.name+" due to unbound types",k)};ub([],k,function(q){q.splice(1,0,null);h.Ta.tb[b-1]=bc(n,q,null,f,g);return[]});return[]})},b:function(a,b,c,d,f,g,k,h){var n=$b(c,d);b=S(b);g=W(f,g);ub([],[a],function(q){function p(){Zb("Cannot call "+
+t+" due to unbound types",n)}q=q[0];var t=q.name+"."+b;b.startsWith("@@")&&(b=Symbol[b.substring(2)]);h&&q.Ta.Nd.push(b);var x=q.Ta.Eb,l=x[b];void 0===l||void 0===l.$a&&l.className!==q.name&&l.Qb===c-2?(p.Qb=c-2,p.className=q.name,x[b]=p):(Lb(x,b,t),x[b].$a[c-2]=p);ub([],n,function(u){u=bc(t,u,q,g,k);void 0===x[b].$a?(u.Qb=c-2,x[b]=u):x[b].$a[c-2]=u;return[]});return[]})},ea:function(a,b){b=S(b);R(a,{name:b,fromWireType:function(c){var d=ec(c);dc(c);return d},toWireType:function(c,d){return Sb(d)},
+argPackAdvance:8,readValueFromPointer:lb,ib:null})},x:function(a,b,c){c=vb(c);b=S(b);R(a,{name:b,fromWireType:function(d){return d},toWireType:function(d,f){return f},argPackAdvance:8,readValueFromPointer:fc(b,c),ib:null})},ha:function(a,b,c,d,f,g){var k=$b(b,c);a=S(a);f=W(d,f);Mb(a,function(){Zb("Cannot call "+a+" due to unbound types",k)},b-1);ub([],k,function(h){h=[h[0],null].concat(h.slice(1));Ub(a,bc(a,h,null,f,g),b-1);return[]})},i:function(a,b,c,d,f){b=S(b);-1===f&&(f=4294967295);f=vb(c);var g=
+h=>h;if(0===d){var k=32-8*c;g=h=>h<<k>>>k}c=b.includes("unsigned")?function(h,n){return n>>>0}:function(h,n){return n};R(a,{name:b,fromWireType:g,toWireType:c,argPackAdvance:8,readValueFromPointer:gc(b,f,0!==d),ib:null})},e:function(a,b,c){function d(g){g>>=2;var k=F;return new f(ua,k[g+1],k[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=S(c);R(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{Ad:!0})},y:function(a,b){b=
 S(b);var c="std::string"===b;R(a,{name:b,fromWireType:function(d){var f=F[d>>2],g=d+4;if(c)for(var k=g,h=0;h<=f;++h){var n=g+h;if(h==f||0==z[n]){k=y(k,n-k);if(void 0===q)var q=k;else q+=String.fromCharCode(0),q+=k;k=n+1}}else{q=Array(f);for(h=0;h<f;++h)q[h]=String.fromCharCode(z[g+h]);q=q.join("")}X(d);return q},toWireType:function(d,f){f instanceof ArrayBuffer&&(f=new Uint8Array(f));var g="string"==typeof f;g||f instanceof Uint8Array||f instanceof Uint8ClampedArray||f instanceof Int8Array||T("Cannot pass non-string to std::string");
-var k=c&&g?ta(f):f.length;var h=wc(4+k+1),n=h+4;F[h>>2]=k;if(c&&g)A(f,z,n,k+1);else if(g)for(g=0;g<k;++g){var q=f.charCodeAt(g);255<q&&(X(n),T("String has UTF-16 code units that do not fit in 8 bits"));z[n+g]=q}else for(g=0;g<k;++g)z[n+g]=f[g];null!==d&&d.push(X,h);return h},argPackAdvance:8,readValueFromPointer:lb,ib:function(d){X(d)}})},o:function(a,b,c){c=S(c);if(2===b){var d=ic;var f=jc;var g=kc;var k=()=>va;var h=1}else 4===b&&(d=lc,f=mc,g=nc,k=()=>F,h=2);R(a,{name:c,fromWireType:function(n){for(var q=
-F[n>>2],p=k(),t,x=n+4,l=0;l<=q;++l){var u=n+4+l*b;if(l==q||0==p[u>>h])x=d(x,u-x),void 0===t?t=x:(t+=String.fromCharCode(0),t+=x),x=u+b}X(n);return t},toWireType:function(n,q){"string"!=typeof q&&T("Cannot pass non-string to C++ string type "+c);var p=g(q),t=wc(4+p+b);F[t>>2]=p>>h;f(q,t+4,p+b);null!==n&&n.push(X,t);return t},argPackAdvance:8,readValueFromPointer:lb,ib:function(n){X(n)}})},i:function(a,b,c,d,f,g){jb[a]={name:S(b),rc:W(c,d),pb:W(f,g),Lc:[]}},e:function(a,b,c,d,f,g,k,h,n,q){jb[a].Lc.push({rd:S(b),
-zd:c,Sb:W(d,f),yd:g,Sd:k,Rd:W(h,n),Td:q})},fa:function(a,b){b=S(b);R(a,{Dd:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},n:function(){return Date.now()},$:function(){return!0},y:function(a,b,c){a=ec(a);b=oc(b,"emval::as");var d=[],f=Sb(d);F[c>>2]=f;return b.toWireType(d,a)},ma:function(a,b,c,d){a=rc[a];b=ec(b);c=qc(c);a(b,c,null,d)},ka:dc,la:function(a,b){var c=tc(a,b),d=c[0];b=d.name+"_$"+c.slice(1).map(function(p){return p.name}).join("_")+"$";var f=uc[b];if(void 0!==
+var k=c&&g?ta(f):f.length;var h=wc(4+k+1),n=h+4;F[h>>2]=k;if(c&&g)A(f,z,n,k+1);else if(g)for(g=0;g<k;++g){var q=f.charCodeAt(g);255<q&&(X(n),T("String has UTF-16 code units that do not fit in 8 bits"));z[n+g]=q}else for(g=0;g<k;++g)z[n+g]=f[g];null!==d&&d.push(X,h);return h},argPackAdvance:8,readValueFromPointer:lb,ib:function(d){X(d)}})},p:function(a,b,c){c=S(c);if(2===b){var d=ic;var f=jc;var g=kc;var k=()=>va;var h=1}else 4===b&&(d=lc,f=mc,g=nc,k=()=>F,h=2);R(a,{name:c,fromWireType:function(n){for(var q=
+F[n>>2],p=k(),t,x=n+4,l=0;l<=q;++l){var u=n+4+l*b;if(l==q||0==p[u>>h])x=d(x,u-x),void 0===t?t=x:(t+=String.fromCharCode(0),t+=x),x=u+b}X(n);return t},toWireType:function(n,q){"string"!=typeof q&&T("Cannot pass non-string to C++ string type "+c);var p=g(q),t=wc(4+p+b);F[t>>2]=p>>h;f(q,t+4,p+b);null!==n&&n.push(X,t);return t},argPackAdvance:8,readValueFromPointer:lb,ib:function(n){X(n)}})},g:function(a,b,c,d,f,g){jb[a]={name:S(b),rc:W(c,d),pb:W(f,g),Lc:[]}},d:function(a,b,c,d,f,g,k,h,n,q){jb[a].Lc.push({rd:S(b),
+zd:c,Sb:W(d,f),yd:g,Sd:k,Rd:W(h,n),Td:q})},ga:function(a,b){b=S(b);R(a,{Dd:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},o:function(){return Date.now()},aa:function(){return!0},m:function(a,b,c){a=ec(a);b=oc(b,"emval::as");var d=[],f=Sb(d);F[c>>2]=f;return b.toWireType(d,a)},A:function(a,b,c,d){a=rc[a];b=ec(b);c=qc(c);a(b,c,null,d)},na:dc,oa:function(a,b){var c=tc(a,b),d=c[0];b=d.name+"_$"+c.slice(1).map(function(p){return p.name}).join("_")+"$";var f=uc[b];if(void 0!==
 f)return f;f=["retType"];for(var g=[d],k="",h=0;h<a-1;++h)k+=(0!==h?", ":"")+"arg"+h,f.push("argType"+h),g.push(c[1+h]);var n="return function "+pb("methodCaller_"+b)+"(handle, name, destructors, args) {\n",q=0;for(h=0;h<a-1;++h)n+="    var arg"+h+" = argType"+h+".readValueFromPointer(args"+(q?"+"+q:"")+");\n",q+=c[h+1].argPackAdvance;n+="    var rv = handle[name]("+k+");\n";for(h=0;h<a-1;++h)c[h+1].deleteObject&&(n+="    argType"+h+".deleteObject(arg"+h+");\n");d.Dd||(n+="    return retType.toWireType(destructors, rv);\n");
-f.push(n+"};\n");a=ac(f).apply(null,g);f=sc(a);return uc[b]=f},z:function(a,b){a=ec(a);b=ec(b);return Sb(a[b])},oa:function(a){4<a&&(Y[a].uc+=1)},na:function(){return Sb([])},ja:function(a){return Sb(qc(a))},ia:function(a){var b=ec(a);kb(b);dc(a)},l:function(a,b){a=oc(a,"_emval_take_value");a=a.readValueFromPointer(b);return Sb(a)},aa:function(a,b){a=new Date(1E3*ib(a));E[b>>2]=a.getSeconds();E[b+4>>2]=a.getMinutes();E[b+8>>2]=a.getHours();E[b+12>>2]=a.getDate();E[b+16>>2]=a.getMonth();E[b+20>>2]=
-a.getFullYear()-1900;E[b+24>>2]=a.getDay();var c=new Date(a.getFullYear(),0,1);E[b+28>>2]=(a.getTime()-c.getTime())/864E5|0;E[b+36>>2]=-(60*a.getTimezoneOffset());var d=(new Date(a.getFullYear(),6,1)).getTimezoneOffset();c=c.getTimezoneOffset();E[b+32>>2]=(d!=c&&a.getTimezoneOffset()==Math.min(c,d))|0},M:function(a,b,c,d,f,g){try{var k=N.rb(d);if(!k)return-8;var h=N.yb(k,a,f,b,c),n=h.Sa;E[g>>2]=h.zc;return n}catch(q){if("undefined"==typeof N||!(q instanceof N.Ma))throw q;return-q.Ra}},N:function(a,
-b,c,d,f,g){try{var k=N.rb(f);if(k&&c&2){var h=z.slice(a,a+b);N.Fb(k,h,g,b,d)}}catch(n){if("undefined"==typeof N||!(n instanceof N.Ma))throw n;return-n.Ra}},ba:yc,k:function(){v("")},H:function(){return 2147483648},v:zc,m:function(a){var b=z.length;a>>>=0;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);var f=Math;d=Math.max(a,d);f=f.min.call(f,2147483648,d+(65536-d%65536)%65536);a:{try{pa.grow(f-ua.byteLength+65535>>>16);ya();var g=1;break a}catch(k){}g=void 0}if(g)return!0}return!1},
-P:function(a,b){var c=0;Bc().forEach(function(d,f){var g=b+c;f=F[a+4*f>>2]=g;for(g=0;g<d.length;++g)B[f++>>0]=d.charCodeAt(g);B[f>>0]=0;c+=d.length+1});return 0},Q:function(a,b){var c=Bc();F[a>>2]=c.length;var d=0;c.forEach(function(f){d+=f.length+1});F[b>>2]=d;return 0},j:function(a){try{var b=Q(a);N.close(b);return 0}catch(c){if("undefined"==typeof N||!(c instanceof N.Ma))throw c;return c.Ra}},F:function(a,b){try{var c=Q(a);B[b>>0]=c.tty?2:N.Ya(c.mode)?3:N.vb(c.mode)?7:4;return 0}catch(d){if("undefined"==
-typeof N||!(d instanceof N.Ma))throw d;return d.Ra}},t:function(a,b,c,d){try{a:{var f=Q(a);a=b;for(var g=b=0;g<c;g++){var k=F[a>>2],h=F[a+4>>2];a+=8;var n=N.read(f,B,k,h,void 0);if(0>n){var q=-1;break a}b+=n;if(n<h)break}q=b}E[d>>2]=q;return 0}catch(p){if("undefined"==typeof N||!(p instanceof N.Ma))throw p;return p.Ra}},B:function(a,b,c,d,f){try{b=c+2097152>>>0<4194305-!!b?(b>>>0)+4294967296*c:NaN;if(isNaN(b))return 61;var g=Q(a);N.bb(g,b,d);J=[g.position>>>0,(G=g.position,1<=+Math.abs(G)?0<G?(Math.min(+Math.floor(G/
-4294967296),4294967295)|0)>>>0:~~+Math.ceil((G-+(~~G>>>0))/4294967296)>>>0:0)];E[f>>2]=J[0];E[f+4>>2]=J[1];g.ub&&0===b&&0===d&&(g.ub=null);return 0}catch(k){if("undefined"==typeof N||!(k instanceof N.Ma))throw k;return k.Ra}},S:function(a){try{var b=Q(a);return b.Qa&&b.Qa.fsync?-b.Qa.fsync(b):0}catch(c){if("undefined"==typeof N||!(c instanceof N.Ma))throw c;return c.Ra}},s:function(a,b,c,d){try{a:{var f=Q(a);a=b;for(var g=b=0;g<c;g++){var k=F[a>>2],h=F[a+4>>2];a+=8;var n=N.write(f,B,k,h,void 0);if(0>
-n){var q=-1;break a}b+=n}q=b}F[d>>2]=q;return 0}catch(p){if("undefined"==typeof N||!(p instanceof N.Ma))throw p;return p.Ra}},p:function(){},ha:Gc,E:function(a,b,c,d){return Gc(a,b,c,d)}},Z=function(){function a(c){e.asm=c.exports;pa=e.asm.pa;ya();za=e.asm.ua;Ba.unshift(e.asm.qa);Ja("wasm-instantiate")}var b={a:Lc};Ia("wasm-instantiate");if(e.instantiateWasm)try{return e.instantiateWasm(b,a)}catch(c){return r("Module.instantiateWasm callback failed with error: "+c),!1}b=Ma(b);a(b[0]);return e.asm}();
+f.push(n+"};\n");a=ac(f).apply(null,g);f=sc(a);return uc[b]=f},z:function(a,b){a=ec(a);b=ec(b);return Sb(a[b])},C:function(a){4<a&&(Y[a].uc+=1)},B:function(){return Sb([])},ma:function(a){return Sb(qc(a))},la:function(a){var b=ec(a);kb(b);dc(a)},j:function(a,b){a=oc(a,"_emval_take_value");a=a.readValueFromPointer(b);return Sb(a)},ba:function(a,b){a=new Date(1E3*ib(a));E[b>>2]=a.getSeconds();E[b+4>>2]=a.getMinutes();E[b+8>>2]=a.getHours();E[b+12>>2]=a.getDate();E[b+16>>2]=a.getMonth();E[b+20>>2]=a.getFullYear()-
+1900;E[b+24>>2]=a.getDay();var c=new Date(a.getFullYear(),0,1);E[b+28>>2]=(a.getTime()-c.getTime())/864E5|0;E[b+36>>2]=-(60*a.getTimezoneOffset());var d=(new Date(a.getFullYear(),6,1)).getTimezoneOffset();c=c.getTimezoneOffset();E[b+32>>2]=(d!=c&&a.getTimezoneOffset()==Math.min(c,d))|0},N:function(a,b,c,d,f,g){try{var k=N.rb(d);if(!k)return-8;var h=N.yb(k,a,f,b,c),n=h.Sa;E[g>>2]=h.zc;return n}catch(q){if("undefined"==typeof N||!(q instanceof N.Ma))throw q;return-q.Ra}},O:function(a,b,c,d,f,g){try{var k=
+N.rb(f);if(k&&c&2){var h=z.slice(a,a+b);N.Fb(k,h,g,b,d)}}catch(n){if("undefined"==typeof N||!(n instanceof N.Ma))throw n;return-n.Ra}},ca:yc,l:function(){v("")},J:function(){return 2147483648},w:zc,n:function(a){var b=z.length;a>>>=0;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);var f=Math;d=Math.max(a,d);f=f.min.call(f,2147483648,d+(65536-d%65536)%65536);a:{try{pa.grow(f-ua.byteLength+65535>>>16);ya();var g=1;break a}catch(k){}g=void 0}if(g)return!0}return!1},
+Q:function(a,b){var c=0;Bc().forEach(function(d,f){var g=b+c;f=F[a+4*f>>2]=g;for(g=0;g<d.length;++g)B[f++>>0]=d.charCodeAt(g);B[f>>0]=0;c+=d.length+1});return 0},R:function(a,b){var c=Bc();F[a>>2]=c.length;var d=0;c.forEach(function(f){d+=f.length+1});F[b>>2]=d;return 0},k:function(a){try{var b=Q(a);N.close(b);return 0}catch(c){if("undefined"==typeof N||!(c instanceof N.Ma))throw c;return c.Ra}},H:function(a,b){try{var c=Q(a);B[b>>0]=c.tty?2:N.Ya(c.mode)?3:N.vb(c.mode)?7:4;return 0}catch(d){if("undefined"==
+typeof N||!(d instanceof N.Ma))throw d;return d.Ra}},u:function(a,b,c,d){try{a:{var f=Q(a);a=b;for(var g=b=0;g<c;g++){var k=F[a>>2],h=F[a+4>>2];a+=8;var n=N.read(f,B,k,h,void 0);if(0>n){var q=-1;break a}b+=n;if(n<h)break}q=b}E[d>>2]=q;return 0}catch(p){if("undefined"==typeof N||!(p instanceof N.Ma))throw p;return p.Ra}},D:function(a,b,c,d,f){try{b=c+2097152>>>0<4194305-!!b?(b>>>0)+4294967296*c:NaN;if(isNaN(b))return 61;var g=Q(a);N.bb(g,b,d);J=[g.position>>>0,(G=g.position,1<=+Math.abs(G)?0<G?(Math.min(+Math.floor(G/
+4294967296),4294967295)|0)>>>0:~~+Math.ceil((G-+(~~G>>>0))/4294967296)>>>0:0)];E[f>>2]=J[0];E[f+4>>2]=J[1];g.ub&&0===b&&0===d&&(g.ub=null);return 0}catch(k){if("undefined"==typeof N||!(k instanceof N.Ma))throw k;return k.Ra}},T:function(a){try{var b=Q(a);return b.Qa&&b.Qa.fsync?-b.Qa.fsync(b):0}catch(c){if("undefined"==typeof N||!(c instanceof N.Ma))throw c;return c.Ra}},t:function(a,b,c,d){try{a:{var f=Q(a);a=b;for(var g=b=0;g<c;g++){var k=F[a>>2],h=F[a+4>>2];a+=8;var n=N.write(f,B,k,h,void 0);if(0>
+n){var q=-1;break a}b+=n}q=b}F[d>>2]=q;return 0}catch(p){if("undefined"==typeof N||!(p instanceof N.Ma))throw p;return p.Ra}},q:function(){},ia:Gc,G:function(a,b,c,d){return Gc(a,b,c,d)}},Z=function(){function a(c){e.asm=c.exports;pa=e.asm.pa;ya();za=e.asm.ua;Ba.unshift(e.asm.qa);Ja("wasm-instantiate")}var b={a:Lc};Ia("wasm-instantiate");if(e.instantiateWasm)try{return e.instantiateWasm(b,a)}catch(c){return r("Module.instantiateWasm callback failed with error: "+c),!1}b=Ma(b);a(b[0]);return e.asm}();
 e.___wasm_call_ctors=Z.qa;var Kc=e.___errno_location=Z.ra,wc=e._malloc=Z.sa,X=e._free=Z.ta,Yb=e.___getTypeName=Z.va;e.___embind_register_native_and_builtin_types=Z.wa;var cb=e._emscripten_builtin_memalign=Z.xa;e.___cxa_is_pointer_type=Z.ya;e.dynCall_iiiij=Z.za;e.dynCall_iij=Z.Aa;e.dynCall_iijii=Z.Ba;e.dynCall_iiji=Z.Ca;e.dynCall_iiiiiij=Z.Da;e.dynCall_vjii=Z.Ea;e.dynCall_vji=Z.Fa;e.dynCall_ji=Z.Ga;e.dynCall_jiji=Z.Ha;e.dynCall_viijii=Z.Ia;e.dynCall_iiiiij=Z.Ja;e.dynCall_iiiiijj=Z.Ka;
 e.dynCall_iiiiiijj=Z.La;e.addRunDependency=Ia;e.removeRunDependency=Ja;e.FS_createPath=N.Dc;e.FS_createDataFile=N.Rb;e.FS_createPreloadedFile=N.Ec;e.FS_createLazyFile=N.Cc;e.FS_createDevice=N.hb;e.FS_unlink=N.unlink;e.FS=N;var Mc;Ha=function Nc(){Mc||Oc();Mc||(Ha=Nc)};
 function Oc(){function a(){if(!Mc&&(Mc=!0,e.calledRun=!0,!qa)){e.noFSInit||N.Db.jc||N.Db();N.Rc=!1;Na(Ba);aa(e);if(e.onRuntimeInitialized)e.onRuntimeInitialized();if(e.postRun)for("function"==typeof e.postRun&&(e.postRun=[e.postRun]);e.postRun.length;){var b=e.postRun.shift();Ca.unshift(b)}Na(Ca)}}if(!(0<Ea)){if(e.preRun)for("function"==typeof e.preRun&&(e.preRun=[e.preRun]);e.preRun.length;)Da();Na(Aa);0<Ea||(e.setStatus?(e.setStatus("Running..."),setTimeout(function(){setTimeout(function(){e.setStatus("")},
diff --git a/web/database/_generated/comm_query_executor.wasm b/web/database/_generated/comm_query_executor.wasm
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001

literal 0
Hc$@<O00001

diff --git a/web/database/queries/message-store-threads-queries.test.js b/web/database/queries/message-store-threads-queries.test.js
new file mode 100644
--- /dev/null
+++ b/web/database/queries/message-store-threads-queries.test.js
@@ -0,0 +1,46 @@
+// @flow
+
+import { getDatabaseModule } from '../db-module.js';
+import { clearSensitiveData } from '../utils/db-utils.js';
+
+const FILE_PATH = 'test.sqlite';
+
+describe('Message store threads queries', () => {
+  let queryExecutor;
+  let dbModule;
+
+  beforeAll(async () => {
+    dbModule = getDatabaseModule();
+  });
+
+  beforeEach(() => {
+    queryExecutor = new dbModule.SQLiteQueryExecutor(FILE_PATH);
+    queryExecutor.replaceMessageStoreThreads([
+      { id: '1', startReached: 0 },
+      { id: '2', startReached: 0 },
+      { id: '3', startReached: 0 },
+      { id: '4', startReached: 0 },
+    ]);
+  });
+
+  afterEach(() => {
+    clearSensitiveData(dbModule, FILE_PATH, queryExecutor);
+  });
+
+  it('should return all message store threads', () => {
+    const threads = queryExecutor.getAllMessageStoreThreads();
+    expect(threads.length).toBe(4);
+  });
+
+  it('should remove all message store threads', () => {
+    queryExecutor.removeAllMessageStoreThreads();
+    const threads = queryExecutor.getAllMessageStoreThreads();
+    expect(threads.length).toBe(0);
+  });
+
+  it('should remove a subset of message store threads', () => {
+    queryExecutor.removeMessageStoreThreads(['2', '3']);
+    const threads = queryExecutor.getAllMessageStoreThreads();
+    expect(threads.length).toBe(2);
+  });
+});
diff --git a/web/database/queries/messages-and-media-queries.test.js b/web/database/queries/messages-and-media-queries.test.js
new file mode 100644
--- /dev/null
+++ b/web/database/queries/messages-and-media-queries.test.js
@@ -0,0 +1,176 @@
+// @flow
+
+import { getDatabaseModule } from '../db-module.js';
+import { clearSensitiveData } from '../utils/db-utils.js';
+
+const FILE_PATH = 'test.sqlite';
+
+describe('Message and media store queries', () => {
+  let queryExecutor;
+  let dbModule;
+
+  beforeAll(async () => {
+    dbModule = getDatabaseModule();
+  });
+
+  beforeEach(() => {
+    queryExecutor = new dbModule.SQLiteQueryExecutor(FILE_PATH);
+    queryExecutor.replaceMessageWeb({
+      id: '1',
+      localID: { value: '', isNull: true },
+      thread: '1',
+      user: '1',
+      type: 0,
+      futureType: { value: 0, isNull: true },
+      content: { value: '', isNull: true },
+      time: '0',
+    });
+    queryExecutor.replaceMessageWeb({
+      id: '2',
+      localID: { value: '', isNull: true },
+      thread: '1',
+      user: '1',
+      type: 0,
+      futureType: { value: 0, isNull: true },
+      content: { value: '', isNull: true },
+      time: '0',
+    });
+    queryExecutor.replaceMessageWeb({
+      id: '3',
+      localID: { value: '', isNull: true },
+      thread: '2',
+      user: '1',
+      type: 0,
+      futureType: { value: 5, isNull: false },
+      content: { value: '', isNull: true },
+      time: '0',
+    });
+    queryExecutor.replaceMedia({
+      id: '1',
+      container: '1',
+      thread: '1',
+      uri: '1',
+      type: '1',
+      extras: '1',
+    });
+    queryExecutor.replaceMedia({
+      id: '2',
+      container: '1',
+      thread: '1',
+      uri: '1',
+      type: '1',
+      extras: '1',
+    });
+    queryExecutor.replaceMedia({
+      id: '3',
+      container: '3',
+      thread: '2',
+      uri: '1',
+      type: '1',
+      extras: '1',
+    });
+    queryExecutor.replaceMedia({
+      id: '4',
+      container: '3',
+      thread: '2',
+      uri: '1',
+      type: '1',
+      extras: '1',
+    });
+  });
+
+  afterEach(() => {
+    clearSensitiveData(dbModule, FILE_PATH, queryExecutor);
+  });
+
+  it('should return all messages with media', () => {
+    const allMessages = queryExecutor.getAllMessagesWeb();
+    expect(allMessages.length).toBe(3);
+    expect(allMessages[0].medias.length).toBe(2);
+    expect(allMessages[1].medias.length).toBe(0);
+    expect(allMessages[2].medias.length).toBe(2);
+  });
+
+  it('should remove all messages', () => {
+    queryExecutor.removeAllMessages();
+    const allMessages = queryExecutor.getAllMessagesWeb();
+    expect(allMessages.length).toBe(0);
+  });
+
+  it('should remove all media', () => {
+    queryExecutor.removeAllMedia();
+    const allMessages = queryExecutor.getAllMessagesWeb();
+    expect(allMessages[0].medias.length).toBe(0);
+    expect(allMessages[1].medias.length).toBe(0);
+    expect(allMessages[2].medias.length).toBe(0);
+  });
+
+  it('should remove all messages for threads', () => {
+    queryExecutor.removeMessagesForThreads(['1']);
+    const allMessages = queryExecutor.getAllMessagesWeb();
+    expect(allMessages.length).toBe(1);
+  });
+
+  it('should remove all messages with ids', () => {
+    queryExecutor.removeMessages(['1']);
+    const allMessages = queryExecutor.getAllMessagesWeb();
+    expect(allMessages.length).toBe(2);
+  });
+
+  it('should remove all media for message', () => {
+    queryExecutor.removeMediaForMessage('1');
+    const allMessages = queryExecutor.getAllMessagesWeb();
+    expect(allMessages[0].medias.length).toBe(0);
+    expect(allMessages[1].medias.length).toBe(0);
+    expect(allMessages[2].medias.length).toBe(2);
+  });
+
+  it('should remove all media for messages', () => {
+    queryExecutor.removeMediaForMessages(['3']);
+    const allMessages = queryExecutor.getAllMessagesWeb();
+    expect(allMessages[0].medias.length).toBe(2);
+    expect(allMessages[1].medias.length).toBe(0);
+    expect(allMessages[2].medias.length).toBe(0);
+  });
+
+  it('should remove all media for threads', () => {
+    queryExecutor.removeMediaForThreads(['2']);
+    const allMessages = queryExecutor.getAllMessagesWeb();
+    expect(allMessages[0].medias.length).toBe(2);
+    expect(allMessages[1].medias.length).toBe(0);
+    expect(allMessages[2].medias.length).toBe(0);
+  });
+
+  it('should rekey media containers', () => {
+    queryExecutor.rekeyMediaContainers('1', '3');
+    const allMessages = queryExecutor.getAllMessagesWeb();
+    expect(allMessages[0].medias.length).toBe(0);
+    expect(allMessages[1].medias.length).toBe(0);
+    expect(allMessages[2].medias.length).toBe(4);
+  });
+
+  it('should rekey message', () => {
+    queryExecutor.rekeyMessage('3', '2');
+    const allMessages = queryExecutor.getAllMessagesWeb();
+    expect(allMessages.length).toBe(2);
+    const rekeyedMessage = allMessages.find(
+      messageWithMedia => messageWithMedia.message.id === '2',
+    );
+    expect(rekeyedMessage?.message.thread).toBe('2');
+  });
+
+  it('should correctly handle nullable integer', () => {
+    const allMessages = queryExecutor.getAllMessagesWeb();
+    const messageWithNullFutureType = allMessages.find(
+      messageWithMedia => messageWithMedia.message.id === '1',
+    );
+    const messageWithNonNullIFutureType = allMessages.find(
+      messageWithMedia => messageWithMedia.message.id === '3',
+    );
+    expect(messageWithNullFutureType?.message.futureType.isNull).toBe(true);
+    expect(messageWithNonNullIFutureType?.message.futureType.isNull).toBe(
+      false,
+    );
+    expect(messageWithNonNullIFutureType?.message.futureType.value).toBe(5);
+  });
+});
diff --git a/web/database/queries/olm-persist-data-queries.test.js b/web/database/queries/olm-persist-data-queries.test.js
new file mode 100644
--- /dev/null
+++ b/web/database/queries/olm-persist-data-queries.test.js
@@ -0,0 +1,47 @@
+// @flow
+
+import { getDatabaseModule } from '../db-module.js';
+import { clearSensitiveData } from '../utils/db-utils.js';
+
+const FILE_PATH = 'test.sqlite';
+
+describe('Olm Tables queries', () => {
+  let queryExecutor;
+  let dbModule;
+
+  beforeAll(async () => {
+    dbModule = getDatabaseModule();
+  });
+
+  beforeEach(() => {
+    queryExecutor = new dbModule.SQLiteQueryExecutor(FILE_PATH);
+    queryExecutor.storeOlmPersistAccount('accountData');
+
+    queryExecutor.storeOlmPersistSession({
+      targetUserID: '1',
+      sessionData: '1',
+    });
+    queryExecutor.storeOlmPersistSession({
+      targetUserID: '2',
+      sessionData: '2',
+    });
+    queryExecutor.storeOlmPersistSession({
+      targetUserID: '3',
+      sessionData: '3',
+    });
+  });
+
+  afterEach(() => {
+    clearSensitiveData(dbModule, FILE_PATH, queryExecutor);
+  });
+
+  it('should return olm account data', () => {
+    const olmAccount = queryExecutor.getOlmPersistAccountDataWeb();
+    expect(olmAccount.value).toBe('accountData');
+  });
+
+  it('should return all olm sessions', () => {
+    const olmSessions = queryExecutor.getOlmPersistSessionsData();
+    expect(olmSessions.length).toBe(3);
+  });
+});
diff --git a/web/database/queries/threads-queries.test.js b/web/database/queries/threads-queries.test.js
new file mode 100644
--- /dev/null
+++ b/web/database/queries/threads-queries.test.js
@@ -0,0 +1,94 @@
+// @flow
+
+import { getDatabaseModule } from '../db-module.js';
+import { clearSensitiveData } from '../utils/db-utils.js';
+
+const FILE_PATH = 'test.sqlite';
+
+describe('Threads queries', () => {
+  let queryExecutor;
+  let dbModule;
+
+  beforeAll(async () => {
+    dbModule = getDatabaseModule();
+  });
+
+  beforeEach(() => {
+    queryExecutor = new dbModule.SQLiteQueryExecutor(FILE_PATH);
+    queryExecutor.replaceThreadWeb({
+      id: '1',
+      type: 1,
+      name: { value: '', isNull: true },
+      avatar: { value: '', isNull: true },
+      description: { value: '', isNull: true },
+      color: '1',
+      creationTime: '1',
+      parentThreadID: { value: '', isNull: true },
+      containingThreadID: { value: '', isNull: true },
+      community: { value: '', isNull: true },
+      members: '1',
+      roles: '1',
+      currentUser: '1',
+      sourceMessageID: { value: '', isNull: true },
+      repliesCount: 1,
+      pinnedCount: 1,
+    });
+    queryExecutor.replaceThreadWeb({
+      id: '2',
+      type: 1,
+      name: { value: '', isNull: true },
+      avatar: { value: '', isNull: true },
+      description: { value: '', isNull: true },
+      color: '1',
+      creationTime: '1',
+      parentThreadID: { value: '', isNull: true },
+      containingThreadID: { value: '', isNull: true },
+      community: { value: '', isNull: true },
+      members: '1',
+      roles: '1',
+      currentUser: '1',
+      sourceMessageID: { value: '', isNull: true },
+      repliesCount: 1,
+      pinnedCount: 1,
+    });
+    queryExecutor.replaceThreadWeb({
+      id: '3',
+      type: 1,
+      name: { value: '', isNull: true },
+      avatar: { value: '', isNull: true },
+      description: { value: '', isNull: true },
+      color: '1',
+      creationTime: '1',
+      parentThreadID: { value: '', isNull: true },
+      containingThreadID: { value: '', isNull: true },
+      community: { value: '', isNull: true },
+      members: '1',
+      roles: '1',
+      currentUser: '1',
+      sourceMessageID: { value: '', isNull: true },
+      repliesCount: 1,
+      pinnedCount: 1,
+    });
+  });
+
+  afterEach(() => {
+    clearSensitiveData(dbModule, FILE_PATH, queryExecutor);
+  });
+
+  it('should return all threads', () => {
+    const threads = queryExecutor.getAllThreadsWeb();
+    expect(threads.length).toBe(3);
+  });
+
+  it('should remove all threads', () => {
+    queryExecutor.removeAllThreads();
+    const threads = queryExecutor.getAllThreadsWeb();
+    expect(threads.length).toBe(0);
+  });
+
+  it('should remove subset of threads', () => {
+    queryExecutor.removeThreads(['2']);
+    const threads = queryExecutor.getAllThreadsWeb();
+    expect(threads.length).toBe(2);
+  });
+});
diff --git a/web/database/types/sqlite-query-executor.js b/web/database/types/sqlite-query-executor.js
--- a/web/database/types/sqlite-query-executor.js
+++ b/web/database/types/sqlite-query-executor.js
@@ -5,7 +5,36 @@
 import type { ClientDBUserInfo } from 'lib/ops/user-store-ops.js';
 import type { ClientDBDraftInfo } from 'lib/types/draft-types.js';
 
-import { type WebClientDBThreadInfo } from './entities.js';
+import {
+  type WebClientDBThreadInfo,
+  type NullableString,
+  type NullableInt,
+} from './entities.js';
+
+type WebMessage = {
+  +id: string,
+  +localID: NullableString,
+  +thread: string,
+  +user: string,
+  +type: number,
+  +futureType: NullableInt,
+  +content: NullableString,
+  +time: string,
+};
+
+type Media = {
+  +id: string,
+  +container: string,
+  +thread: string,
+  +uri: string,
+  +type: string,
+  +extras: string,
+};
+
+type OlmPersistSession = {
+  +targetUserID: string,
+  +sessionData: string,
+};
 
 declare export class SQLiteQueryExecutor {
   constructor(sqliteFilePath: string): void;
@@ -16,6 +45,32 @@
   removeAllDrafts(): void;
   removeDrafts(ids: $ReadOnlyArray<string>): void;
 
+  getAllMessagesWeb(): $ReadOnlyArray<{
+    +message: WebMessage,
+    +medias: $ReadOnlyArray<Media>,
+  }>;
+  removeAllMessages(): void;
+  removeMessages(ids: $ReadOnlyArray<string>): void;
+  removeMessagesForThreads(threadIDs: $ReadOnlyArray<string>): void;
+  replaceMessageWeb(message: WebMessage): void;
+  rekeyMessage(from: string, to: string): void;
+  removeAllMedia(): void;
+  removeMediaForThreads(threadIDs: $ReadOnlyArray<string>): void;
+  removeMediaForMessages(msgIDs: $ReadOnlyArray<string>): void;
+  removeMediaForMessage(msgID: string): void;
+  replaceMedia(media: Media): void;
+  rekeyMediaContainers(from: string, to: string): void;
+
+  replaceMessageStoreThreads(
+    threads: $ReadOnlyArray<{ +id: string, +startReached: number }>,
+  ): void;
+  removeMessageStoreThreads($ReadOnlyArray<string>): void;
+  getAllMessageStoreThreads(): $ReadOnlyArray<{
+    +id: string,
+    +startReached: number,
+  }>;
+  removeAllMessageStoreThreads(): void;
+
   setMetadata(entryName: string, data: string): void;
   clearMetadata(entryName: string): void;
   getMetadata(entryName: string): string;
@@ -29,7 +84,7 @@
   removePersistStorageItem(key: string): void;
   getPersistStorageItem(key: string): string;
 
-  replaceUser(user_info: ClientDBUserInfo): void;
+  replaceUser(userInfo: ClientDBUserInfo): void;
   removeUsers(ids: $ReadOnlyArray<string>): void;
   removeAllUsers(): void;
   getAllUsers(): ClientDBUserInfo[];
@@ -47,6 +102,12 @@
   beginTransaction(): void;
   commitTransaction(): void;
   rollbackTransaction(): void;
+
+  getOlmPersistAccountDataWeb(): NullableString;
+  getOlmPersistSessionsData(): $ReadOnlyArray<OlmPersistSession>;
+  storeOlmPersistAccount(accountData: string): void;
+  storeOlmPersistSession(session: OlmPersistSession): void;
+
   restoreFromMainCompaction(
     mainCompactionPath: string,
     mainCompactionEncryptionKey: string,