From 712c84f06f838182b930b87daf8ba3089da2c436 Mon Sep 17 00:00:00 2001 From: Hypatia May Date: Thu, 23 Jul 2026 21:48:12 +0800 Subject: [PATCH] fix(session-query): validate before service registration --- packages/session-query/session-query-sqlite/src/index.ts | 9 +++++++-- .../session-query-sqlite/tests/sqlite.spec.ts | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/session-query/session-query-sqlite/src/index.ts b/packages/session-query/session-query-sqlite/src/index.ts index a5fa0761e4..5e795d4d2c 100644 --- a/packages/session-query/session-query-sqlite/src/index.ts +++ b/packages/session-query/session-query-sqlite/src/index.ts @@ -191,8 +191,10 @@ export class SessionQuerySqlite extends SessionQueryService { private readonly _optionalPersistenceFiber: Fiber constructor(ctx: Context, config: Config) { - super(ctx, config) - this.config = resolveConfig(config) + // The assignment expression resolves before the base constructor can + // register `ctx.sessionQuery`; keep that same validated value afterward. + super(ctx, config = resolveConfig(config)) + this.config = config as ResolvedConfig this._ready = this._open() this._optionalPersistenceFiber = ctx.inject(['sessionPersistence'], (childCtx: Context) => { const service = childCtx.sessionPersistence @@ -919,6 +921,9 @@ function resolveConfig(config: Config): ResolvedConfig { assertPageLimit('defaultLimit', resolved.defaultLimit) assertPageLimit('maxLimit', resolved.maxLimit) assertPositiveInteger('snippetChars', resolved.snippetChars) + if (!Number.isInteger(resolved.readWindowMax) || resolved.readWindowMax < 0) { + throw invalidConfig('readWindowMax must be a non-negative integer') + } if (resolved.defaultLimit > resolved.maxLimit) { throw invalidConfig('defaultLimit must be less than or equal to maxLimit') } diff --git a/packages/session-query/session-query-sqlite/tests/sqlite.spec.ts b/packages/session-query/session-query-sqlite/tests/sqlite.spec.ts index 8a1a3454f1..1923c6f3eb 100644 --- a/packages/session-query/session-query-sqlite/tests/sqlite.spec.ts +++ b/packages/session-query/session-query-sqlite/tests/sqlite.spec.ts @@ -482,6 +482,7 @@ describe('SQLite session search', () => { { path: ':memory:', defaultLimit: 1e100 }, { path: ':memory:', maxLimit: 1e100 }, { path: ':memory:', snippetChars: 0 }, + { path: ':memory:', readWindowMax: -1 }, { path: ':memory:', defaultLimit: 3, maxLimit: 2 }, { path: ':memory:', journalMode: 'memory' }, ]) { @@ -489,6 +490,7 @@ describe('SQLite session search', () => { await direct.plugin(SessionStore) expect(() => new SessionQuerySqlite(direct, config as never)) .toThrow(expectCode('SESSION_QUERY_INVALID_CONFIG')) + expect(direct.sessionQuery).toBeUndefined() } })