@kumori/aurora-backend-handler 1.1.84 → 1.1.85

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,6 +5,7 @@ interface HandleTokenEventParams {
5
5
  eventData: any;
6
6
  tokenMap: Map<string, Token>;
7
7
  userData: UserData;
8
+ deletedTokenIds: Set<string>;
8
9
  }
9
10
 
10
11
  interface HandleTokenEventResult {
@@ -24,10 +25,26 @@ export const handleTokenEvent = ({
24
25
  eventData,
25
26
  tokenMap,
26
27
  userData,
28
+ deletedTokenIds,
27
29
  }: HandleTokenEventParams): HandleTokenEventResult => {
28
30
  const tokenParentKind = eventData.id.parent?.kind;
29
31
  const tokenId = eventData.id.name;
30
32
 
33
+ if (tokenParentKind === "user" && deletedTokenIds.has(tokenId)) {
34
+ // A tombstoned token (already explicitly deleted by the user) must
35
+ // never be resurrected by a stale/out-of-order "token" event -
36
+ // e.g. one reflecting backend state that hasn't caught up with the
37
+ // deletion yet.
38
+ return {
39
+ isUserToken: false,
40
+ isClusterToken: false,
41
+ userToken: null,
42
+ clusterToken: null,
43
+ updatedUserTokens: userData.tokens,
44
+ tokenId,
45
+ };
46
+ }
47
+
31
48
  if (tokenParentKind === "user") {
32
49
  const tokenInMap = tokenMap.get(tokenId);
33
50
 
@@ -112,6 +129,7 @@ interface HandleTokenDeletionParams {
112
129
  tokenId: string;
113
130
  tokenMap: Map<string, Token>;
114
131
  userData: UserData;
132
+ deletedTokenIds: Set<string>;
115
133
  }
116
134
 
117
135
  interface HandleTokenDeletionResult {
@@ -124,7 +142,9 @@ export const handleTokenDeletion = ({
124
142
  tokenId,
125
143
  tokenMap,
126
144
  userData,
145
+ deletedTokenIds,
127
146
  }: HandleTokenDeletionParams): HandleTokenDeletionResult => {
147
+ deletedTokenIds.add(tokenId);
128
148
  const tokenIndex = userData.tokens.findIndex((t) => t.name === tokenId);
129
149
  if (tokenIndex === -1) {
130
150
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kumori/aurora-backend-handler",
3
- "version": "1.1.84",
3
+ "version": "1.1.85",
4
4
  "description": "backend handler",
5
5
  "main": "backend-handler.ts",
6
6
  "scripts": {
@@ -174,6 +174,7 @@ let accountsMap = new Map<string, Account>();
174
174
  let revisionsMap = new Map<string, Revision>();
175
175
  let roleMap = new Map<string, Role[]>();
176
176
  let tokenMap = new Map<string, Token>();
177
+ let deletedTokenIds = new Set<string>();
177
178
  let platformInfo: Platform | null = null;
178
179
  let isPlatformInfoLoading = false;
179
180
  let isPlatformInfoLoaded = false;
@@ -639,7 +640,11 @@ const rebuildHierarchy = () => {
639
640
  notificationsEnabled: preservedUserData.notificationsEnabled,
640
641
  organizations: Array.from(organizationsMap.values()),
641
642
  clusterTokens: Array.from(clusterTokensMap.values()),
642
- tokens: tokenMap.size > 0 ? (preservedUserData.tokens || []).filter(t => tokenMap.has(t.name)) : (preservedUserData.tokens || []),
643
+ tokens: (
644
+ tokenMap.size > 0
645
+ ? (preservedUserData.tokens || []).filter(t => tokenMap.has(t.name))
646
+ : (preservedUserData.tokens || [])
647
+ ).filter(t => !deletedTokenIds.has(t.name)),
643
648
  tenants: Array.from(tenantsMap.values()),
644
649
  axebowPlan: preservedUserData.axebowPlan,
645
650
  companyName: preservedUserData.companyName,
@@ -1129,6 +1134,7 @@ const handleEvent = async (message: WSMessage) => {
1129
1134
  eventData,
1130
1135
  tokenMap,
1131
1136
  userData,
1137
+ deletedTokenIds,
1132
1138
  });
1133
1139
 
1134
1140
  if (tokenResult.isUserToken) {
@@ -1518,6 +1524,7 @@ const handleOperationSuccess = (operation: PendingOperation, response: any) => {
1518
1524
  tokenId: deletedTokenId,
1519
1525
  tokenMap,
1520
1526
  userData,
1527
+ deletedTokenIds,
1521
1528
  });
1522
1529
  if (tokenDeletionResult.removed) {
1523
1530
  userData.tokens = tokenDeletionResult.updatedUserTokens;
@@ -1916,6 +1923,7 @@ const handleDeleteEvent = async (message: WSMessage) => {
1916
1923
  tokenId: keyParts.token,
1917
1924
  tokenMap,
1918
1925
  userData,
1926
+ deletedTokenIds,
1919
1927
  });
1920
1928
  if (tokenDeletionResult.removed) {
1921
1929
  userData.tokens = tokenDeletionResult.updatedUserTokens;
@@ -2056,7 +2064,8 @@ export const updateUserComplete = (updatedUserData: UserData): User => {
2056
2064
  );
2057
2065
  const mergedTokens = [...(updatedUserData.tokens || []), ...localOnlyTokens]
2058
2066
  .filter((t, index, arr) => arr.findIndex(x => x.name === t.name) === index)
2059
- .filter(t => tokenMap.size === 0 || tokenMap.has(t.name));
2067
+ .filter(t => tokenMap.size === 0 || tokenMap.has(t.name))
2068
+ .filter(t => !deletedTokenIds.has(t.name));
2060
2069
 
2061
2070
  userData = {
2062
2071
  id: updatedUserData.id || userData.id,