All files / actual/message message-channel-listener-injection-token.ts

100% Statements 51/51
100% Branches 2/2
100% Functions 2/2
100% Lines 51/51

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 521x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x  
import type { DiContainerForInjection } from "@ogre-tools/injectable";
import { getInjectable, getInjectionToken } from "@ogre-tools/injectable";
 
export interface MessageChannel<Message> {
  id: string;
  _messageSignature?: Message;
}
 
export type ExtraData = { processId: number; frameId: number };
 
export type MessageChannelHandler<Channel> = Channel extends MessageChannel<infer Message>
  ? (message: Message, data?: ExtraData) => void
  : never;
 
export interface MessageChannelListener<Channel> {
  id: string;
  channel: Channel;
  handler: MessageChannelHandler<Channel>;
}
 
export const messageChannelListenerInjectionToken = getInjectionToken<
  MessageChannelListener<MessageChannel<unknown>>
>({
  id: "message-channel-listener",
});
 
export interface GetMessageChannelListenerInfo<Channel extends MessageChannel<Message>, Message> {
  id: string;
  channel: Channel;
  getHandler: (di: DiContainerForInjection) => MessageChannelHandler<Channel>;
  causesSideEffects?: boolean;
}
 
export const getMessageChannelListenerInjectable = <
  Channel extends MessageChannel<Message>,
  Message,
>(
  info: GetMessageChannelListenerInfo<Channel, Message>,
) =>
  getInjectable({
    id: `${info.channel.id}-message-listener-${info.id}`,
 
    instantiate: (di): MessageChannelListener<Channel> => ({
      id: `${info.channel.id}-message-listener-${info.id}`,
      channel: info.channel,
      handler: info.getHandler(di),
    }),
 
    injectionToken: messageChannelListenerInjectionToken,
    causesSideEffects: info.causesSideEffects,
  });