X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Futils%2FgameStorage.js;h=dfbd639483fe67ab9a4fc7005eb341ee60d885c9;hb=23ecf00824691b5622b468e0409fc543c87d75dc;hp=05aaef7404fc4bb90e6ba72c0552804efb01802a;hpb=4f298adbee00942323fc7ec517117552aeb5a08a;p=vchess.git diff --git a/client/src/utils/gameStorage.js b/client/src/utils/gameStorage.js index 05aaef74..dfbd6394 100644 --- a/client/src/utils/gameStorage.js +++ b/client/src/utils/gameStorage.js @@ -4,10 +4,9 @@ // vname: string, // fenStart: string, // players: array of sid+id+name, -// timeControl: string, +// cadence: string, // increment: integer (seconds), -// mode: string ("live" or "corr") -// imported: boolean (optional, default false) +// type: string ("live" or "corr") // // Game (dynamic) state: // fen: string, // moves: array of Move objects, @@ -19,48 +18,40 @@ import { ajax } from "@/utils/ajax"; import { store } from "@/store"; -function dbOperation(callback) -{ +function dbOperation(callback) { let db = null; 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(event) { + 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 - } + }; } -export const GameStorage = -{ +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}); - }; + add: function(game, callback) { + dbOperation((err,db) => { + if (err) { + callback("error"); + return; } + let transaction = db.transaction("games", "readwrite"); + transaction.oncomplete = function() { + callback(); //everything's fine + }; let objectStore = transaction.objectStore("games"); objectStore.add(game); }); @@ -68,76 +59,72 @@ export const GameStorage = // 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))) - { + 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, - } + 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 - { + }); + } else { // live - dbOperation((db) => { - let objectStore = db.transaction("games", "readwrite").objectStore("games"); + dbOperation((err,db) => { + let objectStore = db + .transaction("games", "readwrite") + .objectStore("games"); objectStore.get(gameId).onsuccess = function(event) { - const game = event.target.result; - Object.keys(obj).forEach(k => { - if (k == "move") - game.moves.push(obj[k]); - else - game[k] = obj[k]; - }); - objectStore.put(game); //save updated data - } + // Ignoring error silently: shouldn't happen now. TODO? + if (event.target.result) { + const game = event.target.result; + 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) => { - let objectStore = db.transaction('games').objectStore('games'); + // light: do not retrieve moves or clocks (TODO: this is the only usage) + getAll: function(light, callback) { + 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); + if (cursor) { + let g = cursor.value; + if (light) { + g.movesCount = g.moves.length; + delete g.moves; + delete g.clocks; + delete g.initime; + } + games.push(g); cursor.continue(); - } - else - callback(games); - } + } else callback(games); + }; }); }, // Retrieve any game from its identifiers (locally or on server) // NOTE: need callback because result is obtained asynchronously - get: function(gameId, callback) - { + get: function(gameId, callback) { // corr games identifiers are integers - if (Number.isInteger(gameId) || !isNaN(parseInt(gameId))) - { - ajax("/games", "GET", {gid:gameId}, res => { + 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); @@ -145,42 +132,28 @@ export const GameStorage = callback(game); }); } - else //local game - { - dbOperation((db) => { - let objectStore = db.transaction('games').objectStore('games'); + else { + // Local game + dbOperation((err,db) => { + let objectStore = db.transaction("games").objectStore("games"); objectStore.get(gameId).onsuccess = function(event) { - callback(event.target.result); - } + if (event.target.result) + callback(event.target.result); + }; }); } }, - getCurrent: function(callback) - { - dbOperation((db) => { - let objectStore = db.transaction('games').objectStore('games'); - objectStore.get("*").onsuccess = function(event) { - callback(event.target.result); - }; - }); - }, - // Delete a game in indexedDB - remove: function(gameId, callback) - { - dbOperation((db) => { - let transaction = db.transaction(["games"], "readwrite"); - if (callback) - { + remove: function(gameId, 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}); }; + transaction.objectStore("games").delete(gameId); } - transaction.objectStore("games").delete(gameId); }); - }, + } };