fix(auth): update tombstones after storage writes to prevent state drift

Reorder logout/set/remove traps so in-memory loggedOutProviders is only
updated after the underlying storage write succeeds. If target.logout()
or target.set() throws, the tombstone set now stays consistent with the
actual storage state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Timothy Laurent
2026-05-05 21:42:13 -07:00
parent 517061adbb
commit 0a588b701f
2 changed files with 5 additions and 5 deletions

View File

@@ -185,22 +185,22 @@ export function mergeAuthStorageReads(
get(target, prop, receiver) { get(target, prop, receiver) {
if (prop === "logout") { if (prop === "logout") {
return (provider: string) => { return (provider: string) => {
loggedOutProviders.add(provider);
target.logout(provider); target.logout(provider);
loggedOutProviders.add(provider);
}; };
} }
if (prop === "remove") { if (prop === "remove") {
return (provider: string) => { return (provider: string) => {
loggedOutProviders.add(provider);
target.remove(provider); target.remove(provider);
loggedOutProviders.add(provider);
}; };
} }
if (prop === "set") { if (prop === "set") {
return (provider: string, credential: AuthCredential) => { return (provider: string, credential: AuthCredential) => {
loggedOutProviders.delete(provider);
target.set(provider, credential); target.set(provider, credential);
loggedOutProviders.delete(provider);
}; };
} }

View File

@@ -178,15 +178,15 @@ export function createFusionAuthStorage(): AuthStorage {
get(target, prop, receiver) { get(target, prop, receiver) {
if (prop === "logout") { if (prop === "logout") {
return (provider: string) => { return (provider: string) => {
loggedOutProviders.add(provider);
target.logout(provider); target.logout(provider);
loggedOutProviders.add(provider);
}; };
} }
if (prop === "set") { if (prop === "set") {
return (provider: string, credential: AuthCredential) => { return (provider: string, credential: AuthCredential) => {
loggedOutProviders.delete(provider);
target.set(provider, credential); target.set(provider, credential);
loggedOutProviders.delete(provider);
}; };
} }