From 8774bd8d34e5a32d7d98f22e7f57b4c64559d12e Mon Sep 17 00:00:00 2001 From: garrettmills Date: Sat, 6 Aug 2022 14:19:09 -0500 Subject: [PATCH] Fix serial format of StateEvent --- package.json | 2 +- src/support/bus/StateEvent.ts | 33 ++++++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 23e22a7..05bad85 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@extollo/lib", - "version": "0.13.0", + "version": "0.13.1", "description": "The framework library that lifts up your code.", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/support/bus/StateEvent.ts b/src/support/bus/StateEvent.ts index 842f691..830df38 100644 --- a/src/support/bus/StateEvent.ts +++ b/src/support/bus/StateEvent.ts @@ -1,5 +1,5 @@ import {Container, Inject, Injectable, Instantiable} from '../../di' -import {Awaitable, ErrorWithContext, JSONState, uuid4} from '../../util' +import {Awaitable, ErrorWithContext, hasOwnProperty, JSONState, uuid4} from '../../util' import {BaseSerializer} from './serial/BaseSerializer' import {Event} from './types' @@ -59,6 +59,21 @@ export abstract class StateEvent implements Event { } } +/** A serialized `StateEvent` instance. */ +export type SerializedStateEvent = { + state: T, + eventUuid: string, +} + +export function isSerializedStateEvent(what: unknown): what is SerializedStateEvent { + return ( + typeof what === 'object' && what !== null + && hasOwnProperty(what, 'state') + && hasOwnProperty(what, 'eventUuid') + && typeof what.eventUuid === 'string' + ) +} + /** * Generic serializer implementation for StateEvents. * Note that this is NOT registered with @ObjectSerializer() because we need to @@ -80,7 +95,7 @@ export abstract class StateEvent implements Event { * ``` */ @Injectable() -export class StateEventSerializer extends BaseSerializer, JSONState> { +export class StateEventSerializer extends BaseSerializer, SerializedStateEvent> { @Inject() protected readonly injector!: Container @@ -98,20 +113,24 @@ export class StateEventSerializer extends BaseSerializer, return some instanceof this.eventClass } - protected encodeActual(actual: StateEvent): Awaitable { - return actual.getState() + protected encodeActual(actual: StateEvent): Awaitable { + return { + state: actual.getState(), + eventUuid: actual.eventUuid, + } } - protected decodeSerial(serial: JSONState): Awaitable> { + protected decodeSerial(serial: SerializedStateEvent): Awaitable> { const inst = this.injector.makeNew>(this.eventClass) - if ( !inst.validate(serial) ) { + if ( !isSerializedStateEvent(serial) || !inst.validate(serial.state) ) { throw new ErrorWithContext('Invalid serial state', { serial, eventClass: inst.getName(), }) } - inst.setState(serial) + inst.setState(serial.state) + inst.eventUuid = serial.eventUuid return inst }