From 72e42cebb0a3f3741b3c8e4c40b9ebda5193700c Mon Sep 17 00:00:00 2001 From: Daniele Ricci Date: Fri, 27 Sep 2024 10:45:30 +0200 Subject: [PATCH] refactor!: hoist ws types to cardano-services-client package --- .../cardano-services-client/src/WebSocket.ts | 48 +++++++++++++++++-- .../cardano-services/src/WsServer/server.ts | 11 +---- packages/core/src/WebSocket.ts | 44 ----------------- packages/core/src/index.ts | 1 - packages/e2e/test/ws-server/webSocket.test.ts | 4 +- 5 files changed, 48 insertions(+), 60 deletions(-) delete mode 100644 packages/core/src/WebSocket.ts diff --git a/packages/cardano-services-client/src/WebSocket.ts b/packages/cardano-services-client/src/WebSocket.ts index 1632077a878..78b8d504c01 100644 --- a/packages/cardano-services-client/src/WebSocket.ts +++ b/packages/cardano-services-client/src/WebSocket.ts @@ -1,18 +1,16 @@ /* eslint-disable unicorn/prefer-add-event-listener */ import { - AsyncReturnType, Cardano, EpochInfo, EraSummary, - NetworkInfoMethods, + HealthCheckResponse, NetworkInfoProvider, + Provider, ProviderError, ProviderFailure, StakeSummary, SupplySummary, - WSMessage, - WsProvider, createSlotEpochInfoCalc } from '@cardano-sdk/core'; import { Logger } from 'ts-log'; @@ -22,6 +20,19 @@ import WebSocket from 'isomorphic-ws'; const NOT_CONNECTED_ID = 'not-connected'; +export type AsyncReturnType unknown> = F extends () => Promise ? R : never; + +export type NetworkInfoMethods = Exclude; +export type NetworkInfoResponses = { [m in NetworkInfoMethods]: AsyncReturnType }; + +export interface WSMessage { + /** The client id assigned by the server. */ + clientId?: string; + + /** Latest value(s) for the `NetworkInfoProvider` methods.*/ + networkInfo?: Partial; +} + type WSStatus = 'connecting' | 'connected' | 'idle' | 'stop'; export type WSHandler = (message: WSMessage) => void; @@ -54,6 +65,35 @@ const isEventError = (error: unknown): error is { error: Error } => // eslint-disable-next-line @typescript-eslint/no-explicit-any typeof error === 'object' && !!error && (error as any).error instanceof Error; +export class WsProvider implements Provider { + /** Emits the health state. */ + public health$: Observable; + + private healthSubject$: ReplaySubject; + private reason?: string; + + constructor() { + this.health$ = this.healthSubject$ = new ReplaySubject(1); + this.healthSubject$.next({ ok: false, reason: 'starting' }); + } + + protected emitHealth(reason?: string, overwrite?: boolean) { + if (!reason) { + this.reason = undefined; + + return this.healthSubject$.next({ ok: true }); + } + + if (overwrite || !this.reason) this.reason = reason; + + this.healthSubject$.next({ ok: false, reason: this.reason }); + } + + public healthCheck() { + return firstValueFrom(this.health$); + } +} + export class CardanoWsClient extends WsProvider { /** The client id, assigned by the server. */ clientId = NOT_CONNECTED_ID; diff --git a/packages/cardano-services/src/WsServer/server.ts b/packages/cardano-services/src/WsServer/server.ts index 7415c238013..589512e3221 100644 --- a/packages/cardano-services/src/WsServer/server.ts +++ b/packages/cardano-services/src/WsServer/server.ts @@ -1,14 +1,7 @@ -import { - Cardano, - CardanoNode, - NetworkInfoResponses, - Seconds, - WSMessage, - WsProvider, - createSlotEpochInfoCalc -} from '@cardano-sdk/core'; +import { Cardano, CardanoNode, Seconds, createSlotEpochInfoCalc } from '@cardano-sdk/core'; import { GenesisData } from '..'; import { Logger } from 'ts-log'; +import { NetworkInfoResponses, WSMessage, WsProvider } from '@cardano-sdk/cardano-services-client'; import { Notification, Pool } from 'pg'; import { Server, createServer } from 'http'; import { WebSocket, WebSocketServer } from 'ws'; diff --git a/packages/core/src/WebSocket.ts b/packages/core/src/WebSocket.ts deleted file mode 100644 index 8b4be83e6f8..00000000000 --- a/packages/core/src/WebSocket.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { HealthCheckResponse, NetworkInfoProvider, Provider } from './Provider'; -import { Observable, ReplaySubject, firstValueFrom } from 'rxjs'; - -export type AsyncReturnType unknown> = F extends () => Promise ? R : never; - -export type NetworkInfoMethods = Exclude; -export type NetworkInfoResponses = { [m in NetworkInfoMethods]: AsyncReturnType }; - -export interface WSMessage { - /** The client id assigned by the server. */ - clientId?: string; - - /** Latest value(s) for the `NetworkInfoProvider` methods.*/ - networkInfo?: Partial; -} - -export class WsProvider implements Provider { - /** Emits the health state. */ - public health$: Observable; - - private healthSubject$: ReplaySubject; - private reason?: string; - - constructor() { - this.health$ = this.healthSubject$ = new ReplaySubject(1); - this.healthSubject$.next({ ok: false, reason: 'starting' }); - } - - protected emitHealth(reason?: string, overwrite?: boolean) { - if (!reason) { - this.reason = undefined; - - return this.healthSubject$.next({ ok: true }); - } - - if (overwrite || !this.reason) this.reason = reason; - - this.healthSubject$.next({ ok: false, reason: this.reason }); - } - - public healthCheck() { - return firstValueFrom(this.health$); - } -} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 9634e719a55..9a5b7a0dffe 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -5,4 +5,3 @@ export * from './Provider'; export * from './util'; export * from './errors'; export * from './CardanoNode'; -export * from './WebSocket'; diff --git a/packages/e2e/test/ws-server/webSocket.test.ts b/packages/e2e/test/ws-server/webSocket.test.ts index 52c8ee2fda4..2e76af8be0e 100644 --- a/packages/e2e/test/ws-server/webSocket.test.ts +++ b/packages/e2e/test/ws-server/webSocket.test.ts @@ -1,4 +1,4 @@ -import { CardanoWsClient } from '@cardano-sdk/cardano-services-client'; +import { CardanoWsClient, WsProvider } from '@cardano-sdk/cardano-services-client'; import { CardanoWsServer, GenesisData, @@ -6,7 +6,7 @@ import { getOgmiosCardanoNode, util } from '@cardano-sdk/cardano-services'; -import { HealthCheckResponse, WsProvider } from '@cardano-sdk/core'; +import { HealthCheckResponse } from '@cardano-sdk/core'; import { OgmiosCardanoNode } from '@cardano-sdk/ogmios'; import { Pool } from 'pg'; import { filter, firstValueFrom } from 'rxjs';