diff --git a/web/cpp/SQLiteQueryExecutorBindings.cpp b/web/cpp/SQLiteQueryExecutorBindings.cpp
new file mode 100644
--- /dev/null
+++ b/web/cpp/SQLiteQueryExecutorBindings.cpp
@@ -0,0 +1,36 @@
+#include <emscripten/bind.h>
+#include <vector>
+
+namespace emscripten {
+namespace internal {
+
+template <typename T, typename Allocator>
+struct BindingType<std::vector<T, Allocator>> {
+  using ValBinding = BindingType<val>;
+  using WireType = ValBinding::WireType;
+
+  static WireType toWireType(const std::vector<T, Allocator> &vec) {
+    std::vector<val> valVec(vec.begin(), vec.end());
+    return BindingType<val>::toWireType(val::array(valVec));
+  }
+
+  static std::vector<T, Allocator> fromWireType(WireType value) {
+    return vecFromJSArray<T>(ValBinding::fromWireType(value));
+  }
+};
+
+template <typename T>
+struct TypeID<
+    T,
+    typename std::enable_if_t<std::is_same<
+        typename Canonicalized<T>::type,
+        std::vector<
+            typename Canonicalized<T>::type::value_type,
+            typename Canonicalized<T>::type::allocator_type>>::value>> {
+  static constexpr TYPEID get() {
+    return TypeID<val>::get();
+  }
+};
+
+} // namespace internal
+} // namespace emscripten
diff --git a/web/scripts/run_emscripten.sh b/web/scripts/run_emscripten.sh
--- a/web/scripts/run_emscripten.sh
+++ b/web/scripts/run_emscripten.sh
@@ -87,6 +87,7 @@
 )
 
 INPUT_FILES=(
+  "${WEB_CPP_DIR}SQLiteQueryExecutorBindings.cpp"
   "${INPUT_DIR}CommQueryExecutor.cpp"
   "${INPUT_DIR}SQLiteQueryExecutor.cpp"
   "${WEB_CPP_DIR}Logger.cpp"