1
0

update stored session when the model changes

This commit is contained in:
Adrian Wannenmacher 2026-02-17 00:30:52 +01:00
parent ffd3529055
commit ad9f9035a1
Signed by: tfld
GPG Key ID: 19D986ECB1E492D5
2 changed files with 58 additions and 4 deletions

View File

@ -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]);
}
}

View File

@ -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");
});
});
}