diff --git a/data/session_repo.js b/data/session_repo.js index 838c00f..31fb5f5 100644 --- a/data/session_repo.js +++ b/data/session_repo.js @@ -69,16 +69,29 @@ export default class SessionRepo { static put(session, transaction) { if (!(session instanceof Session)) throw new TypeError("session to put in must be an actual Session"); + transaction = toTransaction(transaction, [WbDb.OS_SESSIONS], "readwrite"); let sessions = transaction.objectStore(WbDb.OS_SESSIONS); let struct = session.toStruct(); let req = requestToPromise(sessions.put(struct)); - if (session.id === null) - req.then((id) => session.id = id); + // promise with which the session object can be altered + let alt = req; - return req; + // add id to original object if it is new + if (session.id === null) + alt = alt.then((id) => session.id = id); + + // add change listener t oobject. + alt.then(() => { if (session[SessionRepo.#marker] === undefined) { + session.addEventListener( + Session.EVENT_CHANGE, SessionRepo.#handleChange); + session[SessionRepo.#marker] = transaction.db; + }}); + + // make sure alt is handled first + return req.then(res => res); } /** Get all sessions in the repository. @@ -92,6 +105,23 @@ export default class SessionRepo { let sessions = transaction.objectStore(WbDb.OS_SESSIONS); sessions = await requestToPromise(sessions.getAll()); - return sessions.map((session) => new Session(session)); + return sessions.map(function(session) { + let res = new Session(session); + res.addEventListener(Session.EVENT_CHANGE, SessionRepo.#handleChange); + res[SessionRepo.#marker] = transaction.db; + return res; + }); + } + + /** The symbol used to attach needed data to sessions. */ + static #marker = Symbol("data/session_store"); + + /** Handle the Session.EVENT_CHANGE event, by storing the changed session in + * the DB. + */ + static async #handleChange() { + if (!(this instanceof Session)) + throw new TypeError("session to put in must be an actual Session"); + SessionRepo.put(this, this[SessionRepo.#marker]); } } diff --git a/data/session_repo.test.js b/data/session_repo.test.js index efed904..049eae6 100644 --- a/data/session_repo.test.js +++ b/data/session_repo.test.js @@ -128,5 +128,29 @@ export default function() { assert.deepEqual(session.toStruct(), expected, "sessions match"); } }); + + QUnit.test("new session reacts to changes", async function(assert) { + inst = WbDb.get(true); + await waitForChange(inst); + + let session = new Session(); + let id = await SessionRepo.put(session, inst); + assert.strictEqual(session.id, id, "session id has been updated"); + + session.ourTeam = "This is us!"; + session.theirTeam = "This is them!"; + session.goal = 2; + session.anotherGame(); + session.currentGame.currentRound.winner = Team.We; + console.log("too late"); + + // give the change events a chance to execute + await new Promise((resolve) => setTimeout(resolve, 10)); + + let sessions = await SessionRepo.getAll(inst); + assert.strictEqual(sessions.length, 1, "exactly one stored session"); + assert.deepEqual( + sessions[0].toStruct(), session.toStruct(), "sessions match"); + }); }); }