Fix serial format of StateEvent
This commit is contained in:
parent
3712fae979
commit
8774bd8d34
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@extollo/lib",
|
"name": "@extollo/lib",
|
||||||
"version": "0.13.0",
|
"version": "0.13.1",
|
||||||
"description": "The framework library that lifts up your code.",
|
"description": "The framework library that lifts up your code.",
|
||||||
"main": "lib/index.js",
|
"main": "lib/index.js",
|
||||||
"types": "lib/index.d.ts",
|
"types": "lib/index.d.ts",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import {Container, Inject, Injectable, Instantiable} from '../../di'
|
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 {BaseSerializer} from './serial/BaseSerializer'
|
||||||
import {Event} from './types'
|
import {Event} from './types'
|
||||||
|
|
||||||
@ -59,6 +59,21 @@ export abstract class StateEvent<T extends JSONState> implements Event {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** A serialized `StateEvent` instance. */
|
||||||
|
export type SerializedStateEvent<T extends JSONState = JSONState> = {
|
||||||
|
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.
|
* Generic serializer implementation for StateEvents.
|
||||||
* Note that this is NOT registered with @ObjectSerializer() because we need to
|
* Note that this is NOT registered with @ObjectSerializer() because we need to
|
||||||
@ -80,7 +95,7 @@ export abstract class StateEvent<T extends JSONState> implements Event {
|
|||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class StateEventSerializer extends BaseSerializer<StateEvent<JSONState>, JSONState> {
|
export class StateEventSerializer extends BaseSerializer<StateEvent<JSONState>, SerializedStateEvent> {
|
||||||
@Inject()
|
@Inject()
|
||||||
protected readonly injector!: Container
|
protected readonly injector!: Container
|
||||||
|
|
||||||
@ -98,20 +113,24 @@ export class StateEventSerializer extends BaseSerializer<StateEvent<JSONState>,
|
|||||||
return some instanceof this.eventClass
|
return some instanceof this.eventClass
|
||||||
}
|
}
|
||||||
|
|
||||||
protected encodeActual(actual: StateEvent<JSONState>): Awaitable<JSONState> {
|
protected encodeActual(actual: StateEvent<JSONState>): Awaitable<SerializedStateEvent> {
|
||||||
return actual.getState()
|
return {
|
||||||
|
state: actual.getState(),
|
||||||
|
eventUuid: actual.eventUuid,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected decodeSerial(serial: JSONState): Awaitable<StateEvent<JSONState>> {
|
protected decodeSerial(serial: SerializedStateEvent): Awaitable<StateEvent<JSONState>> {
|
||||||
const inst = this.injector.makeNew<StateEvent<JSONState>>(this.eventClass)
|
const inst = this.injector.makeNew<StateEvent<JSONState>>(this.eventClass)
|
||||||
if ( !inst.validate(serial) ) {
|
if ( !isSerializedStateEvent(serial) || !inst.validate(serial.state) ) {
|
||||||
throw new ErrorWithContext('Invalid serial state', {
|
throw new ErrorWithContext('Invalid serial state', {
|
||||||
serial,
|
serial,
|
||||||
eventClass: inst.getName(),
|
eventClass: inst.getName(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
inst.setState(serial)
|
inst.setState(serial.state)
|
||||||
|
inst.eventUuid = serial.eventUuid
|
||||||
return inst
|
return inst
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user