{"version":3,"file":"event-message.mjs","names":[],"sources":["../../../../../../../@warlock.js/herald/src/message-managers/event-message.ts"],"sourcesContent":["/**\n * This class is used to be part of the Herald Event Message Manager.\n * It should be used to trigger events to Either RabbitMQ or Kafka through Herald\n *\n * It's highly recommended using it instead of declaring manual channel namd and publishing data\n */\nimport { GenericObject } from \"@mongez/reinforcements\";\nimport { type ObjectValidator } from \"@warlock.js/seal\";\nimport { randomUUID } from \"crypto\";\n\nexport abstract class EventMessage<TPayload = Record<string, any>> {\n  /**\n   * Event Name\n   */\n  public abstract eventName: string;\n\n  /**\n   * Event version\n   */\n  public version?: number;\n\n  /**\n   * Additional metadata (if any)\n   */\n  public metadata?: Record<string, any>;\n\n  /**\n   * Event Message id\n   */\n  public messageId?: string;\n\n  /**\n   * Schema of payload that will be used to determine whether this event should be published\n   */\n  public schema?: ObjectValidator;\n\n  /**\n   * Data that will be sent with the event (Payload)\n   */\n  public toJSON(): TPayload {\n    if (!this.data) {\n      throw new Error(`no Data is defined for Event: ${this.eventName}`);\n    }\n\n    return this.data as TPayload;\n  }\n\n  public constructor(protected data?: TPayload) {}\n\n  /**\n   * Serialize the event to be ready for publishing.\n   * Delegates payload resolution to toJSON() — override toJSON() to customize.\n   *\n   * @throws Error if toJSON() throws (e.g. no data provided)\n   */\n  public serialize() {\n    const payload = this.toJSON();\n\n    return {\n      payload,\n      metadata: this.metadata,\n      messageId: this.messageId ?? randomUUID(),\n      eventName: this.eventName,\n      version: this.version,\n      occurredAt: new Date(),\n      __through: \"EventMessage\",\n    };\n  }\n}\n\ntype EventOptions<T> = {\n  /**\n   * Shapen the data that will be used\n   */\n  toJSON?: (data: T) => GenericObject;\n  /**\n   * Validation schema\n   */\n  schema?: ObjectValidator;\n};\n\n/**\n * Represents an EventMessage class constructor.\n *\n * @template TIncoming - The type of data accepted by the constructor\n * @template TOutgoing - The type of data returned by toJSON() (defaults to TIncoming)\n */\ntype EventMessageClass<TIncoming = Record<string, any>, TOutgoing = TIncoming> = new (\n  data?: TIncoming,\n) => EventMessage<TOutgoing>;\n\n/**\n * A shorthand to define an event without declaring an entire class.\n *\n * This factory function creates an EventMessage subclass that transforms\n * input data (IncomingData) into a different output format (OutgoingData).\n *\n * @template IncomingData - The type of data passed to the constructor\n * @template OutgoingData - The type of data returned by toJSON()\n *\n * @example\n * ```typescript\n * const UserCreatedEvent = defineEvent<User, { id: number; name: string }>(\n *   \"user.created\",\n *   { toJSON: (user) => user.only([\"id\", \"name\"]) }\n * );\n *\n * publishEvent(new UserCreatedEvent(user));\n * ```\n */\nexport function defineEvent<IncomingData = unknown, OutgoingData = unknown>(\n  eventName: string,\n  options: EventOptions<IncomingData> = {},\n): EventMessageClass<IncomingData, OutgoingData> {\n  // We need to use `any` here to bridge the IncomingData -> OutgoingData transformation\n  // The class accepts IncomingData in constructor but outputs OutgoingData via toJSON()\n  return class AnnouncedEvent extends EventMessage<OutgoingData> {\n    public eventName = eventName;\n    public schema = options.schema;\n\n    public constructor(data?: IncomingData) {\n      super(data as any);\n    }\n\n    public toJSON(): OutgoingData {\n      if (!options.toJSON) return this.data as OutgoingData;\n\n      return options.toJSON(this.data as IncomingData) as OutgoingData;\n    }\n  };\n}\n"],"mappings":";;;AAUA,IAAsB,eAAtB,MAAmE;;;;CA6BjE,AAAO,SAAmB;EACxB,IAAI,CAAC,KAAK,MACR,MAAM,IAAI,MAAM,iCAAiC,KAAK,WAAW;EAGnE,OAAO,KAAK;CACd;CAEA,AAAO,YAAY,AAAU,MAAiB;EAAjB;CAAkB;;;;;;;CAQ/C,AAAO,YAAY;EAGjB,OAAO;GACL,SAHc,KAAK,OAGb;GACN,UAAU,KAAK;GACf,WAAW,KAAK,aAAa,WAAW;GACxC,WAAW,KAAK;GAChB,SAAS,KAAK;GACd,4BAAY,IAAI,KAAK;GACrB,WAAW;EACb;CACF;AACF;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,YACd,WACA,UAAsC,CAAC,GACQ;CAG/C,OAAO,MAAM,uBAAuB,aAA2B;EAI7D,AAAO,YAAY,MAAqB;GACtC,MAAM,IAAW;oBAJA;iBACH,QAAQ;EAIxB;EAEA,AAAO,SAAuB;GAC5B,IAAI,CAAC,QAAQ,QAAQ,OAAO,KAAK;GAEjC,OAAO,QAAQ,OAAO,KAAK,IAAoB;EACjD;CACF;AACF"}