@@ -232,6 +232,7 @@ type EventBacklogItem = {
232232
233233export class CoreEventEmitter extends EventEmitter < CoreEvents > {
234234 private _eventBacklog : EventBacklogItem [ ] = [ ] ;
235+ private _backlogHead = 0 ;
235236 private static readonly MAX_BACKLOG_SIZE = 10000 ;
236237
237238 constructor ( ) {
@@ -243,8 +244,17 @@ export class CoreEventEmitter extends EventEmitter<CoreEvents> {
243244 ...args : CoreEvents [ K ]
244245 ) : void {
245246 if ( this . listenerCount ( event ) === 0 ) {
246- if ( this . _eventBacklog . length >= CoreEventEmitter . MAX_BACKLOG_SIZE ) {
247- this . _eventBacklog . shift ( ) ;
247+ const backlogSize = this . _eventBacklog . length - this . _backlogHead ;
248+ if ( backlogSize >= CoreEventEmitter . MAX_BACKLOG_SIZE ) {
249+ // Evict oldest entry. Use a head pointer instead of shift() to avoid
250+ // O(n) array reindexing on every eviction at capacity.
251+ ( this . _eventBacklog as unknown [ ] ) [ this . _backlogHead ] = undefined ;
252+ this . _backlogHead ++ ;
253+ // Compact once dead entries exceed half capacity to bound memory
254+ if ( this . _backlogHead >= CoreEventEmitter . MAX_BACKLOG_SIZE / 2 ) {
255+ this . _eventBacklog = this . _eventBacklog . slice ( this . _backlogHead ) ;
256+ this . _backlogHead = 0 ;
257+ }
248258 }
249259 // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
250260 this . _eventBacklog . push ( { event, args } as EventBacklogItem ) ;
@@ -391,9 +401,13 @@ export class CoreEventEmitter extends EventEmitter<CoreEvents> {
391401 * subscribes.
392402 */
393403 drainBacklogs ( ) : void {
394- const backlog = [ ...this . _eventBacklog ] ;
395- this . _eventBacklog . length = 0 ; // Clear in-place
396- for ( const item of backlog ) {
404+ const backlog = this . _eventBacklog ;
405+ const head = this . _backlogHead ;
406+ this . _eventBacklog = [ ] ;
407+ this . _backlogHead = 0 ;
408+ for ( let i = head ; i < backlog . length ; i ++ ) {
409+ const item = backlog [ i ] ;
410+ if ( item === undefined ) continue ;
397411 // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
398412 ( this . emit as ( event : keyof CoreEvents , ...args : unknown [ ] ) => boolean ) (
399413 item . event ,
0 commit comments