1
0

add repo method to load specific session

This commit is contained in:
Adrian Wannenmacher 2026-02-17 20:41:08 +01:00
parent ff04d19185
commit 353c441722
Signed by: tfld
GPG Key ID: 19D986ECB1E492D5
2 changed files with 38 additions and 15 deletions

View File

@ -56,6 +56,18 @@ export default class SessionRepo {
throw new TypeError("SessionRepo cannot be constructed"); throw new TypeError("SessionRepo cannot be constructed");
} }
/** 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]);
}
/** Put a session into the repository. /** Put a session into the repository.
* *
* If the passed session has no `id` set, the newly stored ID will be * If the passed session has no `id` set, the newly stored ID will be
@ -94,6 +106,28 @@ export default class SessionRepo {
return req.then(res => res); return req.then(res => res);
} }
/** Get a specific session from the repository.
*
* @param {number} key The ID of the session to retrieve.
* @param {Transactable} transaction A transaction to use.
*
* @returns {Promise<Session | undefined>}
* The requested session, or undefined if it does not exist.
*/
static async get(key, transaction) {
transaction = toTransaction(transaction, [WbDb.OS_SESSIONS], "readonly");
let sessions = transaction.objectStore(WbDb.OS_SESSIONS);
let session = await requestToPromise(sessions.get(key));
if (session !== undefined) {
session = new Session(session);
session.addEventListener(
Session.EVENT_CHANGE, SessionRepo.#handleChange);
session[SessionRepo.#marker] = transaction.db;
}
return session;
}
/** Get all sessions in the repository. /** Get all sessions in the repository.
* *
* @param {Transactable} transaction A transaction to use. * @param {Transactable} transaction A transaction to use.
@ -112,16 +146,4 @@ export default class SessionRepo {
return res; 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

@ -81,10 +81,9 @@ export default function() {
let id = await SessionRepo.put(session, inst); let id = await SessionRepo.put(session, inst);
assert.strictEqual(session.id, id, "session id has been updated"); assert.strictEqual(session.id, id, "session id has been updated");
let sessions = await SessionRepo.getAll(inst); let stored = await SessionRepo.get(id, inst);
assert.strictEqual(sessions.length, 1, "one stored session");
assert.deepEqual( assert.deepEqual(
sessions[0].toStruct(), session.toStruct(), "sessions match"); stored.toStruct(), session.toStruct(), "sessions match");
}); });
QUnit.test("store two sessions", async function(assert) { QUnit.test("store two sessions", async function(assert) {
@ -152,5 +151,7 @@ export default function() {
assert.deepEqual( assert.deepEqual(
sessions[0].toStruct(), session.toStruct(), "sessions match"); sessions[0].toStruct(), session.toStruct(), "sessions match");
}); });
}); });
} }