fix(auto-update-checker): trigger deferred startup on session.created with parentID guard
This commit is contained in:
@@ -6,7 +6,7 @@ type HookOptions = Parameters<CreateAutoUpdateCheckerHook>[1]
|
|||||||
type HookDeps = NonNullable<Parameters<CreateAutoUpdateCheckerHook>[2]>
|
type HookDeps = NonNullable<Parameters<CreateAutoUpdateCheckerHook>[2]>
|
||||||
|
|
||||||
let latestVersionCallCount = 0
|
let latestVersionCallCount = 0
|
||||||
let scheduleDeferredIdleCheckCallCount = 0
|
let scheduleDeferredStartupCheckCallCount = 0
|
||||||
|
|
||||||
const flushMicrotasks = async (count: number): Promise<void> => {
|
const flushMicrotasks = async (count: number): Promise<void> => {
|
||||||
for (let index = 0; index < count; index += 1) {
|
for (let index = 0; index < count; index += 1) {
|
||||||
@@ -19,8 +19,8 @@ const latestVersionMock = async () => {
|
|||||||
return "3.0.1"
|
return "3.0.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
const scheduleDeferredIdleCheckMock = (runCheck: () => void) => {
|
const scheduleDeferredStartupCheckMock = (runCheck: () => void) => {
|
||||||
scheduleDeferredIdleCheckCallCount += 1
|
scheduleDeferredStartupCheckCallCount += 1
|
||||||
scheduledCheck = runCheck
|
scheduledCheck = runCheck
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,8 +30,8 @@ mock.module("./checker/latest-version", () => ({
|
|||||||
getLatestVersion: latestVersionMock,
|
getLatestVersion: latestVersionMock,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
mock.module("./hook/deferred-idle-check", () => ({
|
mock.module("./hook/deferred-startup-check", () => ({
|
||||||
scheduleDeferredIdleCheck: scheduleDeferredIdleCheckMock,
|
scheduleDeferredStartupCheck: scheduleDeferredStartupCheckMock,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
const createPluginInput = (): PluginInput => ({
|
const createPluginInput = (): PluginInput => ({
|
||||||
@@ -105,7 +105,7 @@ const createHook = async (
|
|||||||
|
|
||||||
const resetDeferredState = (): void => {
|
const resetDeferredState = (): void => {
|
||||||
latestVersionCallCount = 0
|
latestVersionCallCount = 0
|
||||||
scheduleDeferredIdleCheckCallCount = 0
|
scheduleDeferredStartupCheckCallCount = 0
|
||||||
scheduledCheck = null
|
scheduledCheck = null
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,7 +135,7 @@ describe("auto-update-checker hook", () => {
|
|||||||
triggerSessionCreated(hook)
|
triggerSessionCreated(hook)
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
|
expect(scheduleDeferredStartupCheckCallCount).toBe(1)
|
||||||
expect(mocks.showVersionToast).not.toHaveBeenCalled()
|
expect(mocks.showVersionToast).not.toHaveBeenCalled()
|
||||||
expect(mocks.runBackgroundUpdateCheck).not.toHaveBeenCalled()
|
expect(mocks.runBackgroundUpdateCheck).not.toHaveBeenCalled()
|
||||||
expect(latestVersionCallCount).toBe(0)
|
expect(latestVersionCallCount).toBe(0)
|
||||||
@@ -158,7 +158,7 @@ describe("auto-update-checker hook", () => {
|
|||||||
triggerSessionCreated(hook, { info: { parentID: "parent-123" } })
|
triggerSessionCreated(hook, { info: { parentID: "parent-123" } })
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(scheduleDeferredIdleCheckCallCount).toBe(0)
|
expect(scheduleDeferredStartupCheckCallCount).toBe(0)
|
||||||
expect(mocks.showVersionToast).not.toHaveBeenCalled()
|
expect(mocks.showVersionToast).not.toHaveBeenCalled()
|
||||||
expect(mocks.runBackgroundUpdateCheck).not.toHaveBeenCalled()
|
expect(mocks.runBackgroundUpdateCheck).not.toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
@@ -172,7 +172,7 @@ describe("auto-update-checker hook", () => {
|
|||||||
triggerSessionIdle(hook)
|
triggerSessionIdle(hook)
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(scheduleDeferredIdleCheckCallCount).toBe(0)
|
expect(scheduleDeferredStartupCheckCallCount).toBe(0)
|
||||||
expect(mocks.showVersionToast).not.toHaveBeenCalled()
|
expect(mocks.showVersionToast).not.toHaveBeenCalled()
|
||||||
expect(mocks.runBackgroundUpdateCheck).not.toHaveBeenCalled()
|
expect(mocks.runBackgroundUpdateCheck).not.toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
@@ -205,14 +205,14 @@ describe("auto-update-checker hook", () => {
|
|||||||
triggerSessionCreated(hook)
|
triggerSessionCreated(hook)
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
|
expect(scheduleDeferredStartupCheckCallCount).toBe(1)
|
||||||
|
|
||||||
// when
|
// when
|
||||||
await runScheduledCheck()
|
await runScheduledCheck()
|
||||||
triggerSessionCreated(hook)
|
triggerSessionCreated(hook)
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
|
expect(scheduleDeferredStartupCheckCallCount).toBe(1)
|
||||||
expect(mocks.showConfigErrorsIfAny).toHaveBeenCalledTimes(1)
|
expect(mocks.showConfigErrorsIfAny).toHaveBeenCalledTimes(1)
|
||||||
expect(mocks.updateAndShowConnectedProvidersCacheStatus).toHaveBeenCalledTimes(1)
|
expect(mocks.updateAndShowConnectedProvidersCacheStatus).toHaveBeenCalledTimes(1)
|
||||||
expect(mocks.showModelCacheWarningIfNeeded).toHaveBeenCalledTimes(1)
|
expect(mocks.showModelCacheWarningIfNeeded).toHaveBeenCalledTimes(1)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { log } from "../../shared/logger"
|
|||||||
import type { AutoUpdateCheckerOptions } from "./types"
|
import type { AutoUpdateCheckerOptions } from "./types"
|
||||||
import { getCachedVersion, getLocalDevVersion } from "./checker"
|
import { getCachedVersion, getLocalDevVersion } from "./checker"
|
||||||
import { runBackgroundUpdateCheck } from "./hook/background-update-check"
|
import { runBackgroundUpdateCheck } from "./hook/background-update-check"
|
||||||
import { scheduleDeferredIdleCheck } from "./hook/deferred-idle-check"
|
import { scheduleDeferredStartupCheck } from "./hook/deferred-startup-check"
|
||||||
import { showConfigErrorsIfAny } from "./hook/config-errors-toast"
|
import { showConfigErrorsIfAny } from "./hook/config-errors-toast"
|
||||||
import { updateAndShowConnectedProvidersCacheStatus } from "./hook/connected-providers-status"
|
import { updateAndShowConnectedProvidersCacheStatus } from "./hook/connected-providers-status"
|
||||||
import { refreshModelCapabilitiesOnStartup } from "./hook/model-capabilities-status"
|
import { refreshModelCapabilitiesOnStartup } from "./hook/model-capabilities-status"
|
||||||
@@ -36,6 +36,20 @@ const defaultDeps: AutoUpdateCheckerDeps = {
|
|||||||
log,
|
log,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isRecord = (value: unknown): value is Record<string, unknown> => {
|
||||||
|
return typeof value === "object" && value !== null
|
||||||
|
}
|
||||||
|
|
||||||
|
const getParentID = (properties: unknown): string | undefined => {
|
||||||
|
if (!isRecord(properties)) return undefined
|
||||||
|
|
||||||
|
const { info } = properties
|
||||||
|
if (!isRecord(info)) return undefined
|
||||||
|
|
||||||
|
const { parentID } = info
|
||||||
|
return typeof parentID === "string" && parentID.length > 0 ? parentID : undefined
|
||||||
|
}
|
||||||
|
|
||||||
export function createAutoUpdateCheckerHook(
|
export function createAutoUpdateCheckerHook(
|
||||||
ctx: PluginInput,
|
ctx: PluginInput,
|
||||||
options: AutoUpdateCheckerOptions = {},
|
options: AutoUpdateCheckerOptions = {},
|
||||||
@@ -65,13 +79,14 @@ export function createAutoUpdateCheckerHook(
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
event: ({ event }: { event: { type: string; properties?: unknown } }) => {
|
event: ({ event }: { event: { type: string; properties?: unknown } }) => {
|
||||||
if (event.type !== "session.idle") return
|
if (event.type !== "session.created") return
|
||||||
if (isCliRunMode) return
|
if (isCliRunMode) return
|
||||||
if (hasChecked || hasScheduled) return
|
if (hasChecked || hasScheduled) return
|
||||||
|
if (getParentID(event.properties)) return
|
||||||
|
|
||||||
hasScheduled = true
|
hasScheduled = true
|
||||||
|
|
||||||
scheduleDeferredIdleCheck(() => {
|
scheduleDeferredStartupCheck(() => {
|
||||||
hasChecked = true
|
hasChecked = true
|
||||||
void (async () => {
|
void (async () => {
|
||||||
const cachedVersion = deps.getCachedVersion()
|
const cachedVersion = deps.getCachedVersion()
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
export function scheduleDeferredIdleCheck(runCheck: () => void): void {
|
|
||||||
const timeout = setTimeout(runCheck, 5000)
|
|
||||||
timeout.unref?.()
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export function scheduleDeferredStartupCheck(runCheck: () => void): void {
|
||||||
|
const timeout = setTimeout(runCheck, 5000)
|
||||||
|
timeout.unref?.()
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test"
|
import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test"
|
||||||
|
|
||||||
let scheduledDeferredCheck: (() => void) | null = null
|
let scheduledDeferredCheck: (() => void) | null = null
|
||||||
mock.module("../auto-update-checker/hook/deferred-idle-check", () => ({
|
mock.module("../auto-update-checker/hook/deferred-startup-check", () => ({
|
||||||
scheduleDeferredIdleCheck: (runCheck: () => void) => {
|
scheduleDeferredStartupCheck: (runCheck: () => void) => {
|
||||||
scheduledDeferredCheck = runCheck
|
scheduledDeferredCheck = runCheck
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
|
|||||||
Reference in New Issue
Block a user