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: array of integers (when clock start running),
16 // score: string (several options; '*' == running),
19 import { ajax
} from "@/utils/ajax";
21 function dbOperation(callback
)
24 let DBOpenRequest
= window
.indexedDB
.open("vchess", 4);
26 DBOpenRequest
.onerror = function(event
) {
27 alert("Database error: " + event
.target
.errorCode
);
30 DBOpenRequest
.onsuccess = function(event
) {
31 db
= DBOpenRequest
.result
;
36 DBOpenRequest
.onupgradeneeded = function(event
) {
37 let db
= event
.target
.result
;
38 db
.onerror = function(event
) {
39 alert("Error while loading database: " + event
.target
.errorCode
);
41 // Create objectStore for vchess->games
42 let objectStore
= db
.createObjectStore("games", { keyPath: "gameId" });
43 objectStore
.createIndex("score", "score"); //to search by game result
47 export const GameStorage
=
49 // Optional callback to get error status
50 // TODO: this func called from Hall seems to not work now...
51 add: function(game
, callback
)
54 let transaction
= db
.transaction("games", "readwrite");
57 transaction
.oncomplete = function() {
58 callback({}); //everything's fine
60 transaction
.onerror = function() {
61 callback({errmsg: "addGame failed: " + transaction
.error
});
64 let objectStore
= transaction
.objectStore("games");
65 objectStore
.add(game
);
69 // TODO: also option to takeback a move ?
70 update: function(gameId
, obj
) //move, fen, clocks, score, initime, ...
72 if (Number
.isInteger(gameId
) || !isNaN(parseInt(gameId
)))
74 // corr: only move, fen and score
82 // TODO: I think stringify isn't requuired here (see ajax() )
83 move: JSON
.stringify(obj
.move), //may be undefined...
94 let objectStore
= db
.transaction("games", "readwrite").objectStore("games");
95 objectStore
.get(gameId
).onsuccess = function(event
) {
96 const game
= event
.target
.result
;
97 Object
.keys(obj
).forEach(k
=> {
99 game
.moves
.push(obj
[k
]);
103 objectStore
.put(game
); //save updated data
109 // Retrieve all local games (running, completed, imported...)
110 getAll: function(callback
)
112 dbOperation((db
) => {
113 let objectStore
= db
.transaction('games').objectStore('games');
115 objectStore
.openCursor().onsuccess = function(event
) {
116 let cursor
= event
.target
.result
;
117 // if there is still another cursor to go, keep running this code
120 games
.push(cursor
.value
);
129 // Retrieve any game from its identifiers (locally or on server)
130 // NOTE: need callback because result is obtained asynchronously
131 get: function(gameId
, callback
)
133 // corr games identifiers are integers
134 if (Number
.isInteger(gameId
) || !isNaN(parseInt(gameId
)))
136 ajax("/games", "GET", {gid:gameId
}, res
=> {
142 dbOperation((db
) => {
143 let objectStore
= db
.transaction('games').objectStore('games');
144 objectStore
.get(gameId
).onsuccess = function(event
) {
145 callback(event
.target
.result
);
151 getCurrent: function(callback
)
153 dbOperation((db
) => {
154 let objectStore
= db
.transaction('games').objectStore('games');
155 objectStore
.get("*").onsuccess = function(event
) {
156 callback(event
.target
.result
);
161 // Delete a game in indexedDB
162 remove: function(gameId
, callback
)
164 dbOperation((db
) => {
165 let transaction
= db
.transaction(["games"], "readwrite");
168 transaction
.oncomplete = function() {
169 callback({}); //everything's fine
171 transaction
.onerror = function() {
172 callback({errmsg: "removeGame failed: " + transaction
.error
});
175 transaction
.objectStore("games").delete(gameId
);