import {PushedToQueue} from './PushedToQueue' import {Queueable, SerialPayload, ShouldQueue} from '../../types' import {PushingToQueue} from './PushingToQueue' import {BaseSerializer} from '../../serial/BaseSerializer' import {JSONState} from '../../../../util' import {ObjectSerializer} from '../../serial/decorators' export type QueueEvent = PushedToQueue> | PushingToQueue> export interface QueueEventSerialPayload extends JSONState { eventName: '@extollo/lib.PushedToQueue' | '@extollo/lib.PushingToQueue' itemPayload: SerialPayload queueName: string } @ObjectSerializer() export class QueueEventSerializer extends BaseSerializer { protected async decodeSerial(serial: QueueEventSerialPayload): Promise { const item = await this.getSerialization().decode(serial.itemPayload) if ( serial.eventName === '@extollo/lib.PushedToQueue' ) { return new PushedToQueue(item as ShouldQueue, serial.queueName) } else { return new PushingToQueue(item as ShouldQueue, serial.queueName) } } protected async encodeActual(actual: QueueEvent): Promise { return { eventName: actual.eventName, queueName: actual.queueName, itemPayload: await this.getSerialization().encode(actual.item), } } protected getName(): string { return '@extollo/lib.QueueEventSerializer' } matchActual(some: QueueEvent): boolean { return some instanceof PushedToQueue || some instanceof PushingToQueue } }