fix(web): fence request telemetry lifecycles
This commit is contained in:
@@ -118,7 +118,7 @@ describe('runtime client apply', () => {
|
||||
type: 'session/model-request',
|
||||
sessionId: 's-state',
|
||||
turn: 1,
|
||||
step: 0,
|
||||
step: 1,
|
||||
provider: 'test',
|
||||
model: 'alpha',
|
||||
contextTokens: 32_000,
|
||||
@@ -145,7 +145,7 @@ describe('runtime client apply', () => {
|
||||
type: 'session/model-request',
|
||||
sessionId: 's-state',
|
||||
turn: 2,
|
||||
step: 0,
|
||||
step: 1,
|
||||
provider: 'test',
|
||||
model: 'beta',
|
||||
contextTokens: 48_000,
|
||||
|
||||
@@ -156,6 +156,19 @@ describe('instances', () => {
|
||||
payload: { type: 'host/session-removed', sessionId: S1 },
|
||||
})
|
||||
expect(session.getSnapshot().modelRequest).toBeNull()
|
||||
manager.handleMuxEnvelope({
|
||||
rpcId: 'late-resident-request' as never,
|
||||
payload: {
|
||||
type: 'session/model-request',
|
||||
sessionId: S1,
|
||||
turn: 2,
|
||||
step: 1,
|
||||
provider: 'test',
|
||||
model: 'late',
|
||||
contextWindow: 512_000,
|
||||
},
|
||||
})
|
||||
expect(session.getSnapshot().modelRequest).toBeNull()
|
||||
|
||||
manager.handleMuxEnvelope({
|
||||
rpcId: 'request-before-lazy-removal' as never,
|
||||
@@ -173,6 +186,18 @@ describe('instances', () => {
|
||||
rpcId: 'lazy-removed' as never,
|
||||
payload: { type: 'host/session-removed', sessionId: S2 },
|
||||
})
|
||||
manager.handleMuxEnvelope({
|
||||
rpcId: 'late-lazy-request' as never,
|
||||
payload: {
|
||||
type: 'session/model-request',
|
||||
sessionId: S2,
|
||||
turn: 2,
|
||||
step: 1,
|
||||
provider: 'test',
|
||||
model: 'late-lazy',
|
||||
contextWindow: 512_000,
|
||||
},
|
||||
})
|
||||
expect(manager.get(S2).getSnapshot().modelRequest).toBeNull()
|
||||
})
|
||||
|
||||
|
||||
@@ -822,6 +822,33 @@ describe('remaining branches', () => {
|
||||
})
|
||||
|
||||
describe('resync', () => {
|
||||
it('settles an in-flight open when its connection generation dies', async () => {
|
||||
const { api, session } = makeSession()
|
||||
const stale = deferred<Awaited<ReturnType<FakeApiClient['onHistory']>>>()
|
||||
api.onHistory = () => stale.promise
|
||||
const opening = session.open()
|
||||
expect(session.getSnapshot().openState).toBe('loading')
|
||||
|
||||
session.handleReconnecting()
|
||||
expect(session.getSnapshot()).toMatchObject({
|
||||
openState: 'error',
|
||||
openError: {
|
||||
code: 'internal',
|
||||
message: 'connection lost while loading session history',
|
||||
},
|
||||
})
|
||||
|
||||
stale.reject(new Error('dead generation failed'))
|
||||
await opening
|
||||
expect(session.getSnapshot()).toMatchObject({
|
||||
openState: 'error',
|
||||
openError: {
|
||||
code: 'internal',
|
||||
message: 'connection lost while loading session history',
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
it('clears request telemetry on reconnect and drops a stale in-flight history response', async () => {
|
||||
const { api, session } = makeSession()
|
||||
const stale = deferred<Awaited<ReturnType<FakeApiClient['onHistory']>>>()
|
||||
|
||||
Reference in New Issue
Block a user