{"version":3,"file":"event-consumer.mjs","names":[],"sources":["../../../../../../../@warlock.js/herald/src/message-managers/event-consumer.ts"],"sourcesContent":["/**\n * This class is used to be part of the Herald Event Consumer Manager.\n * It should be used to consume events from Either RabbitMQ or Kafka through Herald\n *\n * It's highly recommended using it instead of declaring manual channel namd and subscribing to event\n */\nimport { v, ValidationResult, type ObjectValidator } from \"@warlock.js/seal\";\nimport { randomUUID } from \"crypto\";\nimport { Consumable } from \"../decorators\";\nimport { ConsumedEventMessage, EventConsumerClass } from \"./types\";\n\nexport abstract class EventConsumer<Payload = Record<string, any>> {\n  /**\n   * Event name\n   */\n  public static eventName: string;\n\n  private static _consumerId?: string;\n\n  public static get consumerId(): string {\n    if (!this._consumerId) {\n      this._consumerId = randomUUID();\n    }\n    return this._consumerId;\n  }\n\n  public get eventName() {\n    return (this.constructor as typeof EventConsumer).eventName;\n  }\n\n  /**\n   * Min version accepted to be consumed by this class\n   */\n  public static minVersion?: number;\n\n  /**\n   * Max version accepted to be consumed by this class\n   */\n  public static maxVersion?: number;\n\n  /**\n   * Payload validation to auto reject the received event before accessing it in the handle method\n   */\n  public schema?: ObjectValidator;\n\n  /**\n   * The method that will be called when the event is received\n   */\n  public abstract handle(payload: Payload, event: ConsumedEventMessage): Promise<void>;\n\n  /**\n   * Determine whether this is accepted version to be used by this consumer\n   */\n  public static isAcceptedVersion(version: number): boolean {\n    if (this.minVersion && version < this.minVersion) return false;\n    if (this.maxVersion && version > this.maxVersion) return false;\n\n    return true;\n  }\n\n  /**\n   * Validate the given data\n   */\n  public async validate(data: Payload): Promise<ValidationResult | void> {\n    if (!this.schema) return;\n\n    return await v.validate(this.schema, data);\n  }\n}\n\n/**\n * Define Consumer options\n */\ntype ConsumerOptions<Payload> = {\n  /**\n   * Payload validation to auto reject the received event before accessing it in the handle method\n   */\n  schema?: ObjectValidator;\n  /**\n   * Handle data\n   */\n  handle: (payload: Payload, event: ConsumedEventMessage) => Promise<void>;\n  /**\n   * Validate the payload before executing `handle`\n   */\n  validate?: (payload: Payload) => Promise<ValidationResult | boolean>;\n};\n\n/**\n * A shorthand to define an event consumer without declaring an entire class\n */\nexport function defineConsumer<Payload = Record<string, any>>(\n  eventName: string,\n  options: ConsumerOptions<Payload>,\n): EventConsumerClass {\n  const Class = class AnnouncedConsumer extends EventConsumer<Payload> {\n    public static eventName = eventName;\n    public schema = options.schema;\n\n    public async handle(payload: Payload, event: ConsumedEventMessage) {\n      if (options.validate) {\n        const result = await options.validate(payload);\n        if (!result || !(result as ValidationResult).isValid) return;\n      }\n\n      return options.handle(payload, event);\n    }\n  };\n\n  Consumable()(Class as EventConsumerClass);\n\n  return Class as EventConsumerClass;\n}\n"],"mappings":";;;;;;;;;;;;AAWA,IAAsB,gBAAtB,MAAmE;CAQjE,WAAkB,aAAqB;EACrC,IAAI,CAAC,KAAK,aACR,KAAK,cAAc,WAAW;EAEhC,OAAO,KAAK;CACd;CAEA,IAAW,YAAY;EACrB,OAAQ,KAAK,YAAqC;CACpD;;;;CAyBA,OAAc,kBAAkB,SAA0B;EACxD,IAAI,KAAK,cAAc,UAAU,KAAK,YAAY,OAAO;EACzD,IAAI,KAAK,cAAc,UAAU,KAAK,YAAY,OAAO;EAEzD,OAAO;CACT;;;;CAKA,MAAa,SAAS,MAAiD;EACrE,IAAI,CAAC,KAAK,QAAQ;EAElB,OAAO,MAAM,EAAE,SAAS,KAAK,QAAQ,IAAI;CAC3C;AACF;;;;AAuBA,SAAgB,eACd,WACA,SACoB;CACpB,MAAM,QAAQ,MAAM,0BAA0B,cAAuB;;;iBAEnD,QAAQ;;;oBADE;;EAG1B,MAAa,OAAO,SAAkB,OAA6B;GACjE,IAAI,QAAQ,UAAU;IACpB,MAAM,SAAS,MAAM,QAAQ,SAAS,OAAO;IAC7C,IAAI,CAAC,UAAU,CAAE,OAA4B,SAAS;GACxD;GAEA,OAAO,QAAQ,OAAO,SAAS,KAAK;EACtC;CACF;CAEA,WAAW,CAAC,CAAC,KAA2B;CAExC,OAAO;AACT"}