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:
@@ -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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user