# API `@deepkit/event`

```shell
npm install @deepkit/event
```

Read [App Events](https://deepkit.io/en/documentation/app/events.md) for more information about how to use events in your application.

## API reference of @deepkit/event

### isSyncEventToken (function)

```typescript
(eventToken: any): eventToken is EventTokenSync<any>
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L124

### isEventListenerContainerEntryCallback (function)

```typescript
(obj: any): obj is EventListenerContainerEntryCallback
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L225

### isEventListenerContainerEntryService (function)

```typescript
(obj: any): obj is EventListenerContainerEntryService
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L229

### eventWatcher (function)

```typescript
(eventDispatcher: EventDispatcher, tokens: readonly EventToken<any>[]): { dispatches: [eventTokenId: string, event: any][]; messages: string[]; clear(): void; get<T extends EventToken>(token: T, filter?: (event: T extends EventToken<...> | EventTokenSync<...> ? E extends SimpleDataEvent<...> ? D : E : never) => boolean): T extends EventToken<...> | EventTokenSync<...> ? E extends SimpleDataEvent<...> ? D : E : never; }
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L481

### EventListenerCallbackAsync (type)

```typescript
type EventListenerCallbackAsync<E> = (event: E, ...args: any[]) => Promise<void> | void;
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L15

### EventListenerCallbackSync (type)

```typescript
type EventListenerCallbackSync<E> = (event: E, ...args: any[]) => undefined | void;
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L16

### EventListenerCallback (type)

```typescript
type EventListenerCallback<T extends EventToken<any> | EventTokenSync<any>> = T extends EventTokenSync<any> ? EventListenerCallbackSync<T['event']> : EventListenerCallbackAsync<T['event']>;
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L17

### EventError (error)

```typescript
export class EventError extends CustomError {
}
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L19

### EventListener (type)

Result of `EventToken.listen(callback)`.

```typescript
interface EventListener {
    eventToken: EventToken<any>;
    callback: (event: any) => any;
    module?: InjectorModule,
    /**
     * The lower the order, the sooner the listener is called. Default is 0.
     */
    order: number;
}
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L25

### EventOfEventToken (type)

Extract the event type of EventToken.

```typescript
type EventOfEventToken<T> = T extends EventToken<infer E> | EventTokenSync<infer E> ? EventOfEvent<E> : void;
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L45

### Dispatcher (type)

```typescript
type Dispatcher<T extends EventToken<any>> = (...args: DispatchArguments<T>) => EventDispatcherDispatchType<T>;
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L47

### DispatchArguments (type)

```typescript
type DispatchArguments<T extends EventToken<any>> =
    T extends EventToken<infer E> | EventTokenSync<infer E>
        ? SimpleDataEvent<any> extends E
            ? E extends SimpleDataEvent<infer D>
                ? [event: ValueOrFactory<D | E>, injector?: InjectorContext]
                : BaseEvent extends E
                    ? [event?: ValueOrFactory<E>, injector?: InjectorContext]
                    : [event: ValueOrFactory<E>, injector?: InjectorContext]
            : BaseEvent extends E
                ? [event?: ValueOrFactory<E>, injector?: InjectorContext]
                : [event: ValueOrFactory<E>, injector?: InjectorContext]
        : [event: 'invalid-token', injector?: InjectorContext];
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L54

### EventToken (class)

Defines a new event token that is dispatched in an asynchronous way.
This token can be used to listen to events.
Per default this has no event data, so use DataEventToken for that.

```typescript
export class EventToken<T extends BaseEvent = BaseEvent> {
    /**
     * This is only to get easy the event-type. In reality this property is undefined.
     * e.g. `onHttpRequest(event: typeof onHttpRequest.event) {`
     */
    readonly event: T;
    constructor(public readonly id: string, event?: ClassType<T>);
    listen(callback: EventListenerCallback<EventToken<T>>, order: number = , module?: InjectorModule): EventListener;
}
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L88

### EventTokenSync (class)

Defines a new event token that is dispatched in a synchronous way.
It's not possible to subscribe to this event token with async listeners.

```typescript
const onChange = new EventTokenSync<DataEvent<{change: string}>>('change');

eventDispatcher.listen(onChange, (event) => {
  console.log(event.data.change); // 'hello'
});

eventDispatcher.dispatch(onChange, {change: 'hello'});
```

```typescript
export class EventTokenSync<T extends BaseEvent = BaseEvent> extends EventToken<T> {
    readonly sync: boolean;
}
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L120

### DataEventToken (class)

```typescript
export class DataEventToken<T> extends EventToken<SimpleDataEvent<T>> {
}
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L140

### BaseEvent (class)

```typescript
export class BaseEvent {
    immediatePropagationStopped: boolean;
    defaultPrevented: boolean;
    preventDefault();
    stopImmediatePropagation();
}
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L144

### DataEvent (class)

```typescript
export class DataEvent<T> extends BaseEvent implements SimpleDataEvent<T> {
    constructor(public data: T);
}
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L157

### eventClass (function)

```typescript
ClassDecoratorResult<typeof EventClassApi>
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L180

### eventDispatcher (function)

```typescript
PropertyDecoratorResult<typeof EventDispatcherApi>
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L204

### EventListenerContainerEntryCallback (type)

```typescript
type EventListenerContainerEntryCallback = {
    order: number,
    fn: EventListenerCallback<any>,
    module?: InjectorModule,
    builtFn?: BuiltFn,
};
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L208

### EventListenerContainerEntryService (type)

```typescript
type EventListenerContainerEntryService = {
    module: InjectorModule,
    order: number,
    classType: ClassType,
    methodName: string;
    builtFn?: BuiltFn,
};
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L215

### EventListenerContainerEntry (type)

```typescript
type EventListenerContainerEntry = EventListenerContainerEntryCallback | EventListenerContainerEntryService;
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L223

### EventDispatcherUnsubscribe (type)

```typescript
type EventDispatcherUnsubscribe = () => void;
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L248

### EventDispatcherDispatchType (type)

```typescript
type EventDispatcherDispatchType<T extends EventToken<any>> = T extends EventTokenSync<any> ? void : Promise<void>;
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L250

### EventListenerRegistered (type)

```typescript
interface EventListenerRegistered {
    listener: EventListenerContainerEntry;
    eventToken: EventToken<any>;
}
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L259

### EventDispatcher (class)

```typescript
export class EventDispatcher {
    constructor(public injector: InjectorContext = InjectorContext.forProviders([]));
    registerListener(classType: ClassType, module: InjectorModule): EventListenerRegistered[];
    /**
     * Register a new event listener for given token.
     *
     * order: The lower the order, the sooner the listener is called. Default is 0.
     */
    listen<T extends EventToken<any>>(eventToken: T, callback: EventListenerCallback<T>, order: number = ): EventDispatcherUnsubscribe;
    add(eventToken: EventToken<any>, listener: EventListenerContainerEntry): EventDispatcherUnsubscribe;
    /**
     * Waits for the next event of given token.
     */
    next<T extends EventToken<any>>(eventToken: T): Promise<T[]>;
    getTokens(): EventToken<any>[];
    hasListeners(eventToken?: EventToken<any>): boolean;
    getListeners(eventToken: EventToken<any>): EventListenerContainerEntry[];
    mergeContextsFrom(sourceDispatcher: EventDispatcher): void;
    /**
     * Dispatches the given event to all listeners for the given event token.
     */
    dispatch<T extends EventToken<any>>(eventToken: T, ...args: DispatchArguments<T>): EventDispatcherDispatchType<T>;
    /**
     * Returns a dispatcher function for the given event token.
     * This is the most performant way to dispatch events, as it's pre-compiled
     * and if there are no listeners attached it's a noop.
     */
    getDispatcher<T extends EventToken<any>>(eventToken: T): Dispatcher<T>;
}
```

Source: https://github.com/deepkit/deepkit-framework/blob/master/packages/event/src/event.ts#L274
