MCPcopy Create free account
hub / github.com/MoonshotAI/kimi-code / DisposableMap

Class DisposableMap

packages/agent-core/src/di/lifecycle.ts:468–553  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

466}
467
468export class DisposableMap<K, V extends IDisposable = IDisposable>
469 implements IDisposable
470{
471 private readonly _store: Map<K, V>;
472 private _isDisposed = false;
473
474 constructor(store: Map<K, V> = new Map<K, V>()) {
475 this._store = store;
476 trackDisposable(this);
477 }
478
479 dispose(): void {
480 if (this._isDisposed) return;
481 this._isDisposed = true;
482 markAsDisposed(this);
483 this.clearAndDisposeAll();
484 }
485
486 clearAndDisposeAll(): void {
487 if (this._store.size === 0) return;
488 try {
489 dispose(this._store.values());
490 } finally {
491 this._store.clear();
492 }
493 }
494
495 has(key: K): boolean {
496 return this._store.has(key);
497 }
498
499 get size(): number {
500 return this._store.size;
501 }
502
503 get(key: K): V | undefined {
504 return this._store.get(key);
505 }
506
507 set(key: K, value: V, skipDisposeOnOverwrite = false): void {
508 if (this._isDisposed) {
509 // eslint-disable-next-line no-console
510 console.warn(
511 new Error(
512 'Trying to add a disposable to a DisposableMap that has already been disposed of. The added object will be leaked!',
513 ).stack,
514 );
515 return;
516 }
517 if (!skipDisposeOnOverwrite) {
518 const prev = this._store.get(key);
519 if (prev !== undefined && prev !== value) {
520 prev.dispose();
521 }
522 }
523 this._store.set(key, value);
524 setParentOfDisposable(value, this);
525 }

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected