// 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;
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
}
}
export const GameStorage =
{
// Optional callback to get error status
+ // TODO: this func called from Hall seems to not work now...
add: function(game, callback)
{
dbOperation((db) => {
// 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) //move, fen, clocks, score, initime, ...
{
dbOperation((db) => {
let objectStore = db.transaction("games", "readwrite").objectStore("games");
objectStore.get(gameId).onsuccess = function(event) {
const game = event.target.result;
- if (!!obj.move)
- {
- game.moves.push(obj.move);
- game.fen = obj.fen;
- if (!!obj.addTime) //NaN if first move in game
- game.clocks[obj.colorIdx] += obj.addTime;
- }
- if (!!obj.initime) //just a flag (true)
- game.initime = Date.now();
- if (!!obj.score)
- game.score = obj.score;
+ 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 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);
+ };
});
},