Merge pull request #4092 from code-yeongyu/fix/status-timeout-hang

fix(shared): add timeout to isSessionActive to prevent infinite hang
This commit is contained in:
YeonGyu-Kim
2026-05-21 12:58:14 +09:00
committed by GitHub
5 changed files with 170 additions and 3 deletions
+24 -2
View File
@@ -1,9 +1,24 @@
export const DEFAULT_SESSION_IDLE_SETTLE_MS = 150
export const DEFAULT_SESSION_STATUS_TIMEOUT_MS = 5_000
export function settleAfterSessionIdle(ms = DEFAULT_SESSION_IDLE_SETTLE_MS): Promise<void> {
return ms > 0 ? new Promise((resolve) => setTimeout(resolve, ms)) : Promise.resolve()
}
function withStatusTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {
let timeoutID: ReturnType<typeof setTimeout> | undefined
const timeoutPromise = new Promise<T>((_resolve, reject) => {
timeoutID = setTimeout(() => {
reject(new Error(`session.status() timed out after ${timeoutMs}ms`))
}, timeoutMs)
})
return Promise.race([promise, timeoutPromise]).finally(() => {
if (timeoutID !== undefined) {
clearTimeout(timeoutID)
}
})
}
type SessionStatusClient = {
session?: {
status?: () => Promise<unknown>
@@ -32,13 +47,20 @@ export function isActiveSessionStatusType(statusType: string): boolean {
return ACTIVE_SESSION_STATUSES.has(statusType)
}
export async function isSessionActive(client: SessionStatusClient, sessionID: string): Promise<boolean> {
export async function isSessionActive(
client: SessionStatusClient,
sessionID: string,
statusTimeoutMs: number = DEFAULT_SESSION_STATUS_TIMEOUT_MS,
): Promise<boolean> {
if (typeof client.session?.status !== "function") {
return false
}
try {
const statusResult = await client.session.status()
const statusResult = await withStatusTimeout(
client.session.status(),
statusTimeoutMs,
)
const status = getSessionStatusPayload(statusResult)[sessionID]
if (!isRecord(status)) {
return false