2 // // Static informations:
6 // players: array of sid+id+name,
7 // timeControl: string,
8 // increment: integer (seconds),
9 // mode: string ("live" or "corr")
10 // imported: boolean (optional, default false)
11 // // Game (dynamic) state:
13 // moves: array of Move objects,
14 // clocks: array of integers,
15 // initime: integer (when clock start running),
16 // score: string (several options; '*' == running),
19 function dbOperation(callback
)
22 let DBOpenRequest
= window
.indexedDB
.open("vchess", 4);
24 DBOpenRequest
.onerror = function(event
) {
25 alert("Database error: " + event
.target
.errorCode
);
28 DBOpenRequest
.onsuccess = function(event
) {
29 db
= DBOpenRequest
.result
;
34 DBOpenRequest
.onupgradeneeded = function(event
) {
35 let db
= event
.target
.result
;
36 db
.onerror = function(event
) {
37 alert("Error while loading database: " + event
.target
.errorCode
);
39 // Create objectStore for vchess->games
40 db
.createObjectStore("games", { keyPath: "gameId" });
44 export const GameStorage
=
46 // Optional callback to get error status
47 add: function(game
, callback
)
50 let transaction
= db
.transaction("games", "readwrite");
53 transaction
.oncomplete = function() {
54 callback({}); //everything's fine
56 transaction
.onerror = function() {
57 callback({errmsg: "addGame failed: " + transaction
.error
});
60 let objectStore
= transaction
.objectStore("games");
61 objectStore
.add(game
);
65 // TODO: also option to takeback a move ?
66 // NOTE: for live games only (all on server for corr)
67 update: function(gameId
, obj
) //colorIdx, move, fen, addTime, initime, score
70 let objectStore
= db
.transaction("games", "readwrite").objectStore("games");
71 objectStore
.get(gameId
).onsuccess = function(event
) {
72 const game
= event
.target
.result
;
75 game
.moves
.push(obj
.move);
77 if (!!obj
.addTime
) //NaN if first move in game
78 game
.clocks
[obj
.colorIdx
] += obj
.addTime
;
80 if (!!obj
.initime
) //just a flag (true)
81 game
.initime
= Date
.now();
83 game
.score
= obj
.score
;
84 objectStore
.put(game
); //save updated data
89 // Retrieve any live game from its identifiers (locally, running or not)
90 // NOTE: need callback because result is obtained asynchronously
91 get: function(gameId
, callback
)
94 let objectStore
= db
.transaction('games').objectStore('games');
95 if (!gameId
) //retrieve all
98 objectStore
.openCursor().onsuccess = function(event
) {
99 let cursor
= event
.target
.result
;
100 // if there is still another cursor to go, keep running this code
103 games
.push(cursor
.value
);
112 objectStore
.get(gameId
).onsuccess = function(event
) {
113 callback(event
.target
.result
);
119 // Delete a game in indexedDB
120 remove: function(gameId
, callback
)
122 dbOperation((db
) => {
123 let transaction
= db
.transaction(["games"], "readwrite");
126 transaction
.oncomplete = function() {
127 callback({}); //everything's fine
129 transaction
.onerror = function() {
130 callback({errmsg: "removeGame failed: " + transaction
.error
});
133 transaction
.objectStore("games").delete(gameId
);