Added worker implementation of database put
This commit is contained in:
parent
c0d2dae881
commit
b1e90c74f7
@ -6,7 +6,7 @@ import React, {
|
|||||||
useRef,
|
useRef,
|
||||||
} from "react";
|
} from "react";
|
||||||
import * as Comlink from "comlink";
|
import * as Comlink from "comlink";
|
||||||
import { decode } from "@msgpack/msgpack";
|
import { decode, encode } from "@msgpack/msgpack";
|
||||||
|
|
||||||
import { useAuth } from "./AuthContext";
|
import { useAuth } from "./AuthContext";
|
||||||
import { useDatabase } from "./DatabaseContext";
|
import { useDatabase } from "./DatabaseContext";
|
||||||
@ -218,7 +218,16 @@ export function MapDataProvider({ children }) {
|
|||||||
*/
|
*/
|
||||||
const putMap = useCallback(
|
const putMap = useCallback(
|
||||||
async (map) => {
|
async (map) => {
|
||||||
|
// Attempt to use worker to put map to avoid UI lockup
|
||||||
|
const packedMap = encode(map);
|
||||||
|
const success = await worker.putData(
|
||||||
|
Comlink.transfer(packedMap, [packedMap.buffer]),
|
||||||
|
"maps",
|
||||||
|
false
|
||||||
|
);
|
||||||
|
if (!success) {
|
||||||
await database.table("maps").put(map);
|
await database.table("maps").put(map);
|
||||||
|
}
|
||||||
if (map.owner !== userId) {
|
if (map.owner !== userId) {
|
||||||
await updateCache();
|
await updateCache();
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import {
|
|||||||
exportDB,
|
exportDB,
|
||||||
peakImportFile,
|
peakImportFile,
|
||||||
} from "@mitchemmc/dexie-export-import";
|
} from "@mitchemmc/dexie-export-import";
|
||||||
import { encode } from "@msgpack/msgpack";
|
import { encode, decode } from "@msgpack/msgpack";
|
||||||
|
|
||||||
import { getDatabase } from "../database";
|
import { getDatabase } from "../database";
|
||||||
|
|
||||||
@ -46,6 +46,27 @@ let service = {
|
|||||||
} catch {}
|
} catch {}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Put data into table encoded by msgpack
|
||||||
|
* @param {Uint8Array} data
|
||||||
|
* @param {string} table
|
||||||
|
* @param {boolean} wait Whether to wait for the put to finish
|
||||||
|
*/
|
||||||
|
async putData(data, table, wait = true) {
|
||||||
|
try {
|
||||||
|
let db = getDatabase({});
|
||||||
|
const decoded = decode(data);
|
||||||
|
if (wait) {
|
||||||
|
await db.table(table).put(decoded);
|
||||||
|
} else {
|
||||||
|
db.table(table).put(decoded);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Export current database
|
* Export current database
|
||||||
* @param {function} progressCallback
|
* @param {function} progressCallback
|
||||||
|
Loading…
Reference in New Issue
Block a user