A store for managing disposable resources (event subscriptions, listeners, callbacks) that should be cleaned up together.

DisposableStore collects disposables and disposes them all at once when dispose is called. After disposal, the store can be reused — new items can be added and a subsequent dispose call will clean those up.

This is the same pattern used internally by VSCode for lifecycle-bound resource management.

import { DisposableStore, on } from "@needle-tools/engine";

const store = new DisposableStore();

// Register a DOM event listener (typed!)
store.add(on(window, "resize", (ev) => console.log(ev)));

// Register the return value of EventList.on()
store.add(myEventList.on(data => console.log(data)));

// Register a raw cleanup function
store.add(() => someSDK.off("event", handler));

// Later: dispose everything at once
store.dispose();
import { Behaviour, serializable, EventList, on } from "@needle-tools/engine";

export class MyComponent extends Behaviour {
@serializable(EventList)
onClick?: EventList;

onEnable() {
// DOM events — fully typed
this.autoCleanup(on(window, "resize", (ev) => this.onResize(ev)));

// EventList — .on() returns a function, autoCleanup accepts it
this.autoCleanup(this.onClick?.on(() => console.log("clicked!")));
}
// No onDisable needed — cleaned up automatically!
}

Implements

Constructors

Accessors

Methods

Constructors

Accessors

  • get size(): number

    The number of registered disposables

    Returns number

Methods

  • Register a disposable resource. Accepts:

    • An IDisposable object (has a dispose() method) — e.g. from on
    • A cleanup function (e.g. return value of EventList.on())
    • null or undefined (safe no-op for conditional subscriptions)

    When dispose is called, all registered resources are cleaned up.

    Parameters

    Returns void

    const store = new DisposableStore();

    // IDisposable object from on()
    store.add(on(window, "resize", handler));

    // Function returned by EventList.on()
    store.add(myEvent.on(handler));

    // Raw cleanup function
    store.add(() => connection.close());

    // Conditional — safe with undefined
    store.add(this.maybeEvent?.on(handler));
  • Dispose all registered resources. Each registered disposable is cleaned up, then the internal list is cleared. The store can be reused after disposal.

    Called automatically by the engine when a component's onDisable lifecycle fires.

    Returns void