@@ -25,6 +25,7 @@ export class ResourcePersistenceQueue {
2525
2626 private readonly desiredUpdates = new Map < string , MothershipResourceUpdate > ( )
2727 private readonly failedKeys = new Set < string > ( )
28+ private readonly pendingRemovals = new Map < string , ( ) => Promise < unknown > > ( )
2829 private readonly persistedKeys = new Set < string > ( )
2930 private readonly removalTokens = new Map < string , symbol > ( )
3031 private readonly writeTokens = new Map < string , symbol > ( )
@@ -45,6 +46,7 @@ export class ResourcePersistenceQueue {
4546 const trackedLocally =
4647 this . desiredUpdates . has ( key ) || this . pendingKeys . has ( key ) || this . inFlight . has ( key )
4748 if ( base && ! trackedLocally ) this . persistedKeys . add ( key )
49+ this . pendingRemovals . delete ( key )
4850 this . removalTokens . delete ( key )
4951 const previous = this . desiredUpdates . get ( key ) ?? base
5052 this . desiredUpdates . set ( key , mergePendingChatResourceUpdate ( previous , update ) )
@@ -73,12 +75,14 @@ export class ResourcePersistenceQueue {
7375 const inFlight = this . inFlight . get ( key )
7476 const wasPersisted = this . persistedKeys . delete ( key )
7577 const removalToken = Symbol ( key )
78+ this . pendingRemovals . delete ( key )
7679 this . removalTokens . set ( key , removalToken )
7780 this . desiredUpdates . delete ( key )
7881 this . failedKeys . delete ( key )
7982 return {
8083 inFlight,
8184 scheduleDelete : ( chatId , remove ) => {
85+ this . pendingRemovals . set ( key , remove )
8286 const startRemoval = ( ) => this . startRemoval ( key , chatId , removalToken , remove )
8387 if ( inFlight ) {
8488 void inFlight . then ( startRemoval , startRemoval )
@@ -103,14 +107,22 @@ export class ResourcePersistenceQueue {
103107 this . inFlight . clear ( )
104108 this . desiredUpdates . clear ( )
105109 this . failedKeys . clear ( )
110+ this . pendingRemovals . clear ( )
106111 this . persistedKeys . clear ( )
107112 this . removalTokens . clear ( )
108113 this . writeTokens . clear ( )
109114 }
110115
111116 private startPending ( chatId : string ) : void {
112117 for ( const key of this . pendingKeys ) {
113- if ( ! this . failedKeys . has ( key ) && ! this . inFlight . has ( key ) ) this . start ( key , chatId )
118+ if ( this . failedKeys . has ( key ) || this . inFlight . has ( key ) ) continue
119+ const pendingRemoval = this . pendingRemovals . get ( key )
120+ const removalToken = this . removalTokens . get ( key )
121+ if ( pendingRemoval && removalToken ) {
122+ this . startRemoval ( key , chatId , removalToken , pendingRemoval )
123+ continue
124+ }
125+ this . start ( key , chatId )
114126 }
115127 }
116128
@@ -122,22 +134,33 @@ export class ResourcePersistenceQueue {
122134 ) : void {
123135 if ( this . removalTokens . get ( key ) !== removalToken ) return
124136
137+ this . pendingKeys . delete ( key )
138+ let succeeded = false
125139 const writeToken = Symbol ( key )
126140 const tracked = Promise . resolve ( )
127- . then ( ( ) => {
141+ . then ( async ( ) => {
128142 if ( this . removalTokens . get ( key ) !== removalToken ) return
129- return remove ( )
143+ await remove ( )
144+ succeeded = true
145+ } )
146+ . catch ( ( error ) => {
147+ if ( this . removalTokens . get ( key ) !== removalToken ) return
148+ this . pendingKeys . add ( key )
149+ this . failedKeys . add ( key )
150+ this . onError ( error )
130151 } )
131- . catch ( this . onError )
132152 . finally ( ( ) => {
133153 if ( this . writeTokens . get ( key ) !== writeToken ) return
134154 this . writeTokens . delete ( key )
135155 this . inFlight . delete ( key )
136- if ( this . removalTokens . get ( key ) === removalToken ) {
156+ if ( succeeded && this . removalTokens . get ( key ) === removalToken ) {
157+ this . pendingRemovals . delete ( key )
137158 this . removalTokens . delete ( key )
138159 this . persistedKeys . delete ( key )
139160 }
140- if ( this . pendingKeys . has ( key ) ) this . start ( key , chatId )
161+ if ( this . removalTokens . get ( key ) !== removalToken && this . pendingKeys . has ( key ) ) {
162+ this . start ( key , chatId )
163+ }
141164 } )
142165 this . writeTokens . set ( key , writeToken )
143166 this . inFlight . set ( key , tracked )
0 commit comments