X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Futils%2FgameStorage.js;h=129866798b63e865e11601bde3364e84abcb05a3;hb=f54f4c26b4c820b14aca298e94644efb20beeed6;hp=6e9fc81893734d11c20508819ae8cc7455b9c427;hpb=910d631b73cad5ffef1b4461157b704e7e7057d8;p=vchess.git diff --git a/client/src/utils/gameStorage.js b/client/src/utils/gameStorage.js index 6e9fc818..12986679 100644 --- a/client/src/utils/gameStorage.js +++ b/client/src/utils/gameStorage.js @@ -7,7 +7,6 @@ // cadence: string, // increment: integer (seconds), // type: string ("live" or "corr") -// imported: boolean (optional, default false) // // Game (dynamic) state: // fen: string, // moves: array of Move objects, @@ -16,7 +15,6 @@ // score: string (several options; '*' == running), // } -import { ajax } from "@/utils/ajax"; import { store } from "@/store"; function dbOperation(callback) { @@ -24,25 +22,18 @@ function dbOperation(callback) { let DBOpenRequest = window.indexedDB.open("vchess", 4); DBOpenRequest.onerror = function(event) { - alert(store.state.tr["Database error:"] + " " + event.target.errorCode); + alert(store.state.tr["Database error: stop private browsing, or update your browser"]); + callback("error",null); }; DBOpenRequest.onsuccess = function() { db = DBOpenRequest.result; - callback(db); + callback(null,db); db.close(); }; DBOpenRequest.onupgradeneeded = function(event) { let db = event.target.result; - db.onerror = function(event) { - alert( - store.state.tr["Error while loading database:"] + - " " + - event.target.errorCode - ); - }; - // Create objectStore for vchess->games let objectStore = db.createObjectStore("games", { keyPath: "id" }); objectStore.createIndex("score", "score"); //to search by game result }; @@ -51,69 +42,62 @@ function dbOperation(callback) { export const GameStorage = { // Optional callback to get error status add: function(game, callback) { - dbOperation(db => { - let transaction = db.transaction("games", "readwrite"); - if (callback) { - transaction.oncomplete = function() { - callback({}); //everything's fine - }; - transaction.onerror = function() { - callback({ - errmsg: - store.state.tr["Game retrieval failed:"] + " " + transaction.error - }); - }; + dbOperation((err,db) => { + if (!!err) { + callback("error"); + return; } + let transaction = db.transaction("games", "readwrite"); + transaction.oncomplete = function() { + callback(); //everything's fine + }; + transaction.onerror = function(err) { + callback(err); //duplicate key error (most likely) + }; let objectStore = transaction.objectStore("games"); objectStore.add(game); }); }, - // TODO: also option to takeback a move ? // obj: chat, move, fen, clocks, score[Msg], initime, ... update: function(gameId, obj) { - if (Number.isInteger(gameId) || !isNaN(parseInt(gameId))) { - // corr: only move, fen and score - ajax("/games", "PUT", { - gid: gameId, - newObj: { - // Some fields may be undefined: - chat: obj.chat, - move: obj.move, - fen: obj.fen, - score: obj.score, - scoreMsg: obj.scoreMsg, - drawOffer: obj.drawOffer - } - }); - } else { - // live - dbOperation(db => { - let objectStore = db - .transaction("games", "readwrite") - .objectStore("games"); - objectStore.get(gameId).onsuccess = function(event) { - const game = event.target.result; + // live + dbOperation((err,db) => { + let objectStore = db + .transaction("games", "readwrite") + .objectStore("games"); + objectStore.get(gameId).onsuccess = function(event) { + // Ignoring error silently: shouldn't happen now. TODO? + if (event.target.result) { + let game = event.target.result; + // Hidden tabs are delayed, to prevent multi-updates: + if (obj.moveIdx < game.moves.length) return; Object.keys(obj).forEach(k => { if (k == "move") game.moves.push(obj[k]); else game[k] = obj[k]; }); objectStore.put(game); //save updated data - }; - }); - } + } + }; + }); }, // Retrieve all local games (running, completed, imported...) getAll: function(callback) { - dbOperation(db => { + dbOperation((err,db) => { let objectStore = db.transaction("games").objectStore("games"); let games = []; objectStore.openCursor().onsuccess = function(event) { let cursor = event.target.result; // if there is still another cursor to go, keep running this code if (cursor) { - games.push(cursor.value); + let g = cursor.value; + // Do not retrieve moves or clocks (unused in list mode) + g.movesCount = g.moves.length; + delete g.moves; + delete g.clocks; + delete g.initime; + games.push(g); cursor.continue(); } else callback(games); }; @@ -123,30 +107,11 @@ export const GameStorage = { // Retrieve any game from its identifiers (locally or on server) // NOTE: need callback because result is obtained asynchronously get: function(gameId, callback) { - // corr games identifiers are integers - if (Number.isInteger(gameId) || !isNaN(parseInt(gameId))) { - ajax("/games", "GET", { gid: gameId }, res => { - let game = res.game; - game.moves.forEach(m => { - m.squares = JSON.parse(m.squares); - }); - callback(game); - }); - } //local game - else { - dbOperation(db => { - let objectStore = db.transaction("games").objectStore("games"); - objectStore.get(gameId).onsuccess = function(event) { - callback(event.target.result); - }; - }); - } - }, - - getCurrent: function(callback) { - dbOperation(db => { + // Local game + dbOperation((err,db) => { let objectStore = db.transaction("games").objectStore("games"); - objectStore.get("*").onsuccess = function(event) { + objectStore.get(gameId).onsuccess = function(event) { + // event.target.result is null if game not found callback(event.target.result); }; }); @@ -154,20 +119,14 @@ export const GameStorage = { // Delete a game in indexedDB remove: function(gameId, callback) { - dbOperation(db => { - let transaction = db.transaction(["games"], "readwrite"); - if (callback) { + dbOperation((err,db) => { + if (!err) { + let transaction = db.transaction(["games"], "readwrite"); transaction.oncomplete = function() { - callback({}); //everything's fine - }; - transaction.onerror = function() { - callback({ - errmsg: - store.state.tr["Game removal failed:"] + " " + transaction.error - }); + callback(); //everything's fine }; + transaction.objectStore("games").delete(gameId); } - transaction.objectStore("games").delete(gameId); }); } };