diff --git a/packages/xstate-persistence/agent.yml b/packages/xstate-persistence/agent.yml index 0e750e2ee..d4ad3d13f 100644 --- a/packages/xstate-persistence/agent.yml +++ b/packages/xstate-persistence/agent.yml @@ -6,7 +6,9 @@ constants: # please use your own X25519 key, this is only an example secretKey: 29739248cad1bd1a0fc4d9b75cd4d2990de535baf5caadfdf8d8f86664aa830c methods: + - emit - machineStateInit + - machineStateGet - machineStatePersist - machineStatesFindActive - machineStatesDeleteExpired diff --git a/packages/xstate-persistence/src/__tests__/localAgent.test.ts b/packages/xstate-persistence/src/__tests__/localAgent.test.ts index eb6e481bc..8a8e413d2 100644 --- a/packages/xstate-persistence/src/__tests__/localAgent.test.ts +++ b/packages/xstate-persistence/src/__tests__/localAgent.test.ts @@ -1,8 +1,6 @@ import { DataSource } from 'typeorm' import { createObjects, getConfig } from '@sphereon/ssi-sdk.agent-config' -jest.setTimeout(30000) - import machineStatePersistenceAgentLogic from './shared/MachineStatePersistenceAgentLogic' let dbConnection: Promise diff --git a/packages/xstate-persistence/src/__tests__/restAgent.test.ts b/packages/xstate-persistence/src/__tests__/restAgent.test.ts index 5902f3439..0017d9304 100644 --- a/packages/xstate-persistence/src/__tests__/restAgent.test.ts +++ b/packages/xstate-persistence/src/__tests__/restAgent.test.ts @@ -7,11 +7,9 @@ import express, { Router } from 'express' import { Server } from 'http' import { DataSource } from 'typeorm' import { createObjects, getConfig } from '@sphereon/ssi-sdk.agent-config' -import { IMachineStatePersistence } from '../index' +import { IMachineStatePersistence, MachineStatePersistence, MachineStatePersistEventType } from '../index' import xStatePersistenceAgentLogic from './shared/MachineStatePersistenceAgentLogic' -jest.setTimeout(60000) - const port = 3003 const basePath = '/agent' @@ -23,6 +21,10 @@ const getAgent = (options?: IAgentOptions) => createAgent({ ...options, plugins: [ + new MachineStatePersistence({ + eventTypes: [MachineStatePersistEventType.EVERY], + isRESTClient: true, + }), new AgentRestClient({ url: 'http://localhost:' + port + basePath, enabledMethods: serverAgent.availableMethods(), diff --git a/packages/xstate-persistence/src/agent/MachineStatePersistence.ts b/packages/xstate-persistence/src/agent/MachineStatePersistence.ts index e64be249c..a08a53726 100644 --- a/packages/xstate-persistence/src/agent/MachineStatePersistence.ts +++ b/packages/xstate-persistence/src/agent/MachineStatePersistence.ts @@ -1,5 +1,6 @@ import { IAbstractMachineStateStore, StoreMachineStateInfo } from '@sphereon/ssi-sdk.data-store' import { IAgentPlugin } from '@veramo/core' +import * as console from 'console' import Debug from 'debug' import { v4 as uuidv4 } from 'uuid' import { deserializeMachineState, machineStateToStoreInfo } from '../functions' @@ -7,6 +8,8 @@ import { deserializeMachineState, machineStateToStoreInfo } from '../functions' import { DeleteExpiredStatesArgs, DeleteStateResult, + FindActiveStatesArgs, + IMachineStatePersistence, InitMachineStateArgs, MachineStateDeleteArgs, MachineStateGetArgs, @@ -19,7 +22,6 @@ import { RequiredContext, schema, } from '../index' -import { FindActiveStatesArgs, IMachineStatePersistence } from '../types' const debug = Debug('sphereon:ssi-sdk:machine-state:xstate-persistence') @@ -32,19 +34,20 @@ const debug = Debug('sphereon:ssi-sdk:machine-state:xstate-persistence') */ export class MachineStatePersistence implements IAgentPlugin { readonly schema = schema.IMachineStatePersistence - readonly methods: IMachineStatePersistence + readonly methods: IMachineStatePersistence | {} readonly eventTypes: Array - readonly store: IAbstractMachineStateStore + private readonly _store?: IAbstractMachineStateStore - constructor(opts: MachineStatePersistOpts) { - const { store, eventTypes } = opts - - this.store = store - this.eventTypes = eventTypes - - if (!this.store) { + get store(): IAbstractMachineStateStore { + if (!this._store) { throw Error('No store available in options') } + return this._store + } + + constructor(opts: MachineStatePersistOpts) { + const { store, eventTypes, isRESTClient } = opts + this.eventTypes = eventTypes this.methods = { machineStatesFindActive: this.machineStatesFindActive.bind(this), machineStatesDeleteExpired: this.machineStatesDeleteExpired.bind(this), @@ -53,6 +56,14 @@ export class MachineStatePersistence implements IAgentPlugin { machineStateGet: this.machineStateGet.bind(this), machineStateDelete: this.machineStateDelete.bind(this), } + this._store = store + if (isRESTClient) { + // Methods are delegated to the REMOTE Agent. We need the above eventTypes however, to ensure the local eventBus works + // We do set the store, because we might have some local and some remote methods + return + } else if (!store) { + throw Error('No store available in options') + } } public async onEvent(event: MachineStatePersistEvent, context: RequiredContext): Promise { diff --git a/packages/xstate-persistence/src/types/types.ts b/packages/xstate-persistence/src/types/types.ts index 7ede2945e..609a73518 100644 --- a/packages/xstate-persistence/src/types/types.ts +++ b/packages/xstate-persistence/src/types/types.ts @@ -16,7 +16,7 @@ import { IMachineStatePersistence } from './IMachineStatePersistence' * @property {IAbstractMachineStateStore} store - The store used to persist the machine state. * @property {Array} eventTypes - The types of events to be persisted. */ -export type MachineStatePersistOpts = { store: IAbstractMachineStateStore; eventTypes: Array } +export type MachineStatePersistOpts = { store?: IAbstractMachineStateStore; eventTypes: Array; isRESTClient?: boolean } /** * Enum representing the types of machine state persist events.