X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Futils%2FgameStorage.js;h=031f62f563688eee48b57c6dc6d14109d4b53860;hb=fd7aea36b8da702df87be3ed055f9a1f59c9f4da;hp=94c1c30ce5c22bf827247c43d1f786fecbeb1d6c;hpb=967a2686ea801d4b33129d78087651451ef1904b;p=vchess.git diff --git a/client/src/utils/gameStorage.js b/client/src/utils/gameStorage.js index 94c1c30c..031f62f5 100644 --- a/client/src/utils/gameStorage.js +++ b/client/src/utils/gameStorage.js @@ -12,10 +12,12 @@ // fen: string, // moves: array of Move objects, // clocks: array of integers, -// initime: integer (when clock start running), +// initime: array of integers (when clock start running), // score: string (several options; '*' == running), // } +import { ajax } from "@/utils/ajax"; + function dbOperation(callback) { let db = null; @@ -37,7 +39,8 @@ function dbOperation(callback) alert("Error while loading database: " + event.target.errorCode); }; // Create objectStore for vchess->games - db.createObjectStore("games", { keyPath: "gameId" }); + let objectStore = db.createObjectStore("games", { keyPath: "gameId" }); + objectStore.createIndex("score", "score"); //to search by game result } } @@ -64,7 +67,7 @@ export const GameStorage = // TODO: also option to takeback a move ? // NOTE: for live games only (all on server for corr) - update: function(gameId, obj) //colorIdx, move, fen, addTime, initime, score + update: function(gameId, obj) //colorIdx, nextIdx, move, fen, addTime, score { dbOperation((db) => { let objectStore = db.transaction("games", "readwrite").objectStore("games"); @@ -74,11 +77,9 @@ export const GameStorage = { game.moves.push(obj.move); game.fen = obj.fen; - if (!!obj.addTime) //NaN if first move in game - game.clocks[obj.colorIdx] += obj.addTime; + game.clocks[obj.colorIdx] += obj.addTime; + game.initime[obj.nextIdx] = Date.now(); } - if (!!obj.initime) //just a flag (true) - game.initime = Date.now(); if (!!obj.score) game.score = obj.score; objectStore.put(game); //save updated data @@ -86,33 +87,55 @@ export const GameStorage = }); }, - // Retrieve any live game from its identifiers (locally, running or not) - // NOTE: need callback because result is obtained asynchronously - get: function(gameId, callback) + // Retrieve all local games (running, completed, imported...) + getAll: function(callback) { dbOperation((db) => { let objectStore = db.transaction('games').objectStore('games'); - if (!gameId) //retrieve all - { - 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); - cursor.continue(); - } - else - callback(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); + cursor.continue(); } + else + callback(games); } - else //just one game - { + }); + }, + + // 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 => { + callback(res.game); + }); + } + else //local game + { + dbOperation((db) => { + let objectStore = db.transaction('games').objectStore('games'); objectStore.get(gameId).onsuccess = function(event) { 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); + }; }); },