Skip to content

Commit 9372b74

Browse files
remove localstorage workflow on signout in cloud
1 parent 09c888e commit 9372b74

File tree

3 files changed

+89
-0
lines changed

3 files changed

+89
-0
lines changed

src/platform/workflow/persistence/composables/useWorkflowPersistence.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,25 @@ import {
77
mergePreservedQueryIntoQuery
88
} from '@/platform/navigation/preservedQueryManager'
99
import { PRESERVED_QUERY_NAMESPACES } from '@/platform/navigation/preservedQueryNamespaces'
10+
import { clearWorkflowPersistenceStorage } from '@/platform/workflow/persistence/workflowStorage'
1011
import { useSettingStore } from '@/platform/settings/settingStore'
1112
import { useWorkflowService } from '@/platform/workflow/core/services/workflowService'
1213
import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore'
1314
import { useTemplateUrlLoader } from '@/platform/workflow/templates/composables/useTemplateUrlLoader'
15+
import { useCurrentUser } from '@/composables/auth/useCurrentUser'
1416
import { api } from '@/scripts/api'
1517
import { app as comfyApp } from '@/scripts/app'
1618
import { getStorageValue, setStorageValue } from '@/scripts/utils'
1719
import { useCommandStore } from '@/stores/commandStore'
20+
import { isCloud } from '@/platform/distribution/types'
1821

1922
export function useWorkflowPersistence() {
2023
const workflowStore = useWorkflowStore()
2124
const settingStore = useSettingStore()
2225
const route = useRoute()
2326
const router = useRouter()
2427
const templateUrlLoader = useTemplateUrlLoader()
28+
const { onUserLogout } = useCurrentUser()
2529
const TEMPLATE_NAMESPACE = PRESERVED_QUERY_NAMESPACES.TEMPLATE
2630

2731
const ensureTemplateQueryFromIntent = async () => {
@@ -183,6 +187,10 @@ export function useWorkflowPersistence() {
183187
}
184188
})
185189

190+
onUserLogout(() => {
191+
if (isCloud) clearWorkflowPersistenceStorage()
192+
})
193+
186194
const restoreWorkflowTabsState = () => {
187195
if (!workflowPersistenceEnabled.value) return
188196
const isRestorable = storedWorkflows?.length > 0 && storedActiveIndex >= 0
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
const LOCAL_STORAGE_KEYS = [
2+
'workflow',
3+
'Comfy.PreviousWorkflow',
4+
'Comfy.OpenWorkflowsPaths',
5+
'Comfy.ActiveWorkflowIndex'
6+
]
7+
8+
const SESSION_KEY_PREFIXES = [
9+
'workflow:',
10+
'Comfy.PreviousWorkflow',
11+
'Comfy.OpenWorkflowsPaths',
12+
'Comfy.ActiveWorkflowIndex'
13+
]
14+
15+
const shouldClearSessionKey = (key: string): boolean =>
16+
SESSION_KEY_PREFIXES.some((prefix) =>
17+
prefix.endsWith(':')
18+
? key.startsWith(prefix)
19+
: key === prefix || key.startsWith(`${prefix}:`)
20+
)
21+
22+
/**
23+
* Removes any workflow state persisted in storage so that the next login
24+
* starts with a clean slate.
25+
*/
26+
export const clearWorkflowPersistenceStorage = () => {
27+
LOCAL_STORAGE_KEYS.forEach((key) => {
28+
localStorage.removeItem(key)
29+
})
30+
31+
// Iterate backwards because removing items mutates sessionStorage.length.
32+
for (let i = sessionStorage.length - 1; i >= 0; i--) {
33+
const key = sessionStorage.key(i)
34+
if (!key) continue
35+
if (shouldClearSessionKey(key)) {
36+
sessionStorage.removeItem(key)
37+
}
38+
}
39+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { describe, expect, it, beforeEach } from 'vitest'
2+
3+
import { clearWorkflowPersistenceStorage } from '@/platform/workflow/persistence/workflowStorage'
4+
5+
describe('workflowStorage', () => {
6+
beforeEach(() => {
7+
localStorage.clear()
8+
sessionStorage.clear()
9+
})
10+
11+
it('clears all workflow persistence keys from storage', () => {
12+
localStorage.setItem('workflow', 'data')
13+
localStorage.setItem('Comfy.PreviousWorkflow', 'prev')
14+
localStorage.setItem('Comfy.OpenWorkflowsPaths', '[]')
15+
localStorage.setItem('Comfy.ActiveWorkflowIndex', '1')
16+
localStorage.setItem('unrelated', 'keep')
17+
18+
sessionStorage.setItem('workflow:client-1', 'session-data')
19+
sessionStorage.setItem('Comfy.PreviousWorkflow:client-1', 'prev')
20+
sessionStorage.setItem('Comfy.ActiveWorkflowIndex:client-1', '0')
21+
sessionStorage.setItem('Comfy.OpenWorkflowsPaths:client-1', '[]')
22+
sessionStorage.setItem('custom', 'keep')
23+
24+
clearWorkflowPersistenceStorage()
25+
26+
expect(localStorage.getItem('workflow')).toBeNull()
27+
expect(localStorage.getItem('Comfy.PreviousWorkflow')).toBeNull()
28+
expect(localStorage.getItem('Comfy.OpenWorkflowsPaths')).toBeNull()
29+
expect(localStorage.getItem('Comfy.ActiveWorkflowIndex')).toBeNull()
30+
expect(localStorage.getItem('unrelated')).toBe('keep')
31+
32+
expect(sessionStorage.getItem('workflow:client-1')).toBeNull()
33+
expect(sessionStorage.getItem('Comfy.PreviousWorkflow:client-1')).toBeNull()
34+
expect(
35+
sessionStorage.getItem('Comfy.ActiveWorkflowIndex:client-1')
36+
).toBeNull()
37+
expect(
38+
sessionStorage.getItem('Comfy.OpenWorkflowsPaths:client-1')
39+
).toBeNull()
40+
expect(sessionStorage.getItem('custom')).toBe('keep')
41+
})
42+
})

0 commit comments

Comments
 (0)