test(e2b): prove stale interrupt isolation
This commit is contained in:
@@ -252,14 +252,38 @@ try {
|
|||||||
}
|
}
|
||||||
const staleInterrupt = ctx.pty.startSend(owner, terminal.sessionId, { text: 'sleep 0.2', submit: true })
|
const staleInterrupt = ctx.pty.startSend(owner, terminal.sessionId, { text: 'sleep 0.2', submit: true })
|
||||||
if (!staleInterrupt.cancel()) throw new Error('E2B PTY refused the stale-interrupt probe cancellation')
|
if (!staleInterrupt.cancel()) throw new Error('E2B PTY refused the stale-interrupt probe cancellation')
|
||||||
await staleInterrupt.done
|
let canceledSendRetained = false
|
||||||
const sleeping = ctx.pty.startSend(owner, terminal.sessionId, { text: 'sleep 30', submit: true })
|
try {
|
||||||
|
ctx.pty.startSend(owner, terminal.sessionId, { text: 'sleep 30', submit: true })
|
||||||
|
} catch (error: unknown) {
|
||||||
|
canceledSendRetained = String(error).includes('active send')
|
||||||
|
}
|
||||||
foregroundLookup.resolve(undefined)
|
foregroundLookup.resolve(undefined)
|
||||||
|
await staleInterrupt.done
|
||||||
|
remoteCommands.run = runRemoteCommand
|
||||||
|
if (!canceledSendRetained) throw new Error('E2B PTY released a canceled send before foreground signalling settled')
|
||||||
|
const sleeping = ctx.pty.startSend(owner, terminal.sessionId, {
|
||||||
|
text: "printf 'DSH_SLEEP_%s\\n' READY; sleep 30",
|
||||||
|
submit: true,
|
||||||
|
})
|
||||||
|
let sleepReadyOutput = ''
|
||||||
|
const sleepReadyDeadline = Date.now() + 5_000
|
||||||
|
while (!sleepReadyOutput.includes('DSH_SLEEP_READY\n')) {
|
||||||
|
sleepReadyOutput += sleeping.readOutput().delta
|
||||||
|
if (sleepReadyOutput.includes('DSH_SLEEP_READY\n')) break
|
||||||
|
const settled = await Promise.race([
|
||||||
|
sleeping.done.then(result => ({ result })),
|
||||||
|
new Promise<undefined>(resolveDelay => setTimeout(() => { resolveDelay(undefined) }, 25)),
|
||||||
|
])
|
||||||
|
if (settled !== undefined) {
|
||||||
|
throw new Error(`E2B PTY successor settled before executing: ${JSON.stringify(settled.result)}`)
|
||||||
|
}
|
||||||
|
if (Date.now() >= sleepReadyDeadline) throw new Error(`E2B PTY successor did not execute: ${sleepReadyOutput}`)
|
||||||
|
}
|
||||||
const interruptIdentitySafe = await Promise.race([
|
const interruptIdentitySafe = await Promise.race([
|
||||||
sleeping.done.then(() => false),
|
sleeping.done.then(() => false),
|
||||||
new Promise<true>(resolveDelay => setTimeout(() => { resolveDelay(true) }, 300)),
|
new Promise<true>(resolveDelay => setTimeout(() => { resolveDelay(true) }, 300)),
|
||||||
])
|
])
|
||||||
remoteCommands.run = runRemoteCommand
|
|
||||||
if (!delayedForegroundLookup || !interruptIdentitySafe) {
|
if (!delayedForegroundLookup || !interruptIdentitySafe) {
|
||||||
throw new Error('E2B PTY stale interrupt affected its successor send')
|
throw new Error('E2B PTY stale interrupt affected its successor send')
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user