Skip to content

Commit 72e42ce

Browse files
committed
refactor!: hoist ws types to cardano-services-client package
1 parent 74bfac0 commit 72e42ce

File tree

5 files changed

+48
-60
lines changed

5 files changed

+48
-60
lines changed

packages/cardano-services-client/src/WebSocket.ts

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
/* eslint-disable unicorn/prefer-add-event-listener */
22

33
import {
4-
AsyncReturnType,
54
Cardano,
65
EpochInfo,
76
EraSummary,
8-
NetworkInfoMethods,
7+
HealthCheckResponse,
98
NetworkInfoProvider,
9+
Provider,
1010
ProviderError,
1111
ProviderFailure,
1212
StakeSummary,
1313
SupplySummary,
14-
WSMessage,
15-
WsProvider,
1614
createSlotEpochInfoCalc
1715
} from '@cardano-sdk/core';
1816
import { Logger } from 'ts-log';
@@ -22,6 +20,19 @@ import WebSocket from 'isomorphic-ws';
2220

2321
const NOT_CONNECTED_ID = 'not-connected';
2422

23+
export type AsyncReturnType<F extends () => unknown> = F extends () => Promise<infer R> ? R : never;
24+
25+
export type NetworkInfoMethods = Exclude<keyof NetworkInfoProvider, 'healthCheck'>;
26+
export type NetworkInfoResponses = { [m in NetworkInfoMethods]: AsyncReturnType<NetworkInfoProvider[m]> };
27+
28+
export interface WSMessage {
29+
/** The client id assigned by the server. */
30+
clientId?: string;
31+
32+
/** Latest value(s) for the `NetworkInfoProvider` methods.*/
33+
networkInfo?: Partial<NetworkInfoResponses>;
34+
}
35+
2536
type WSStatus = 'connecting' | 'connected' | 'idle' | 'stop';
2637

2738
export type WSHandler = (message: WSMessage) => void;
@@ -54,6 +65,35 @@ const isEventError = (error: unknown): error is { error: Error } =>
5465
// eslint-disable-next-line @typescript-eslint/no-explicit-any
5566
typeof error === 'object' && !!error && (error as any).error instanceof Error;
5667

68+
export class WsProvider implements Provider {
69+
/** Emits the health state. */
70+
public health$: Observable<HealthCheckResponse>;
71+
72+
private healthSubject$: ReplaySubject<HealthCheckResponse>;
73+
private reason?: string;
74+
75+
constructor() {
76+
this.health$ = this.healthSubject$ = new ReplaySubject<HealthCheckResponse>(1);
77+
this.healthSubject$.next({ ok: false, reason: 'starting' });
78+
}
79+
80+
protected emitHealth(reason?: string, overwrite?: boolean) {
81+
if (!reason) {
82+
this.reason = undefined;
83+
84+
return this.healthSubject$.next({ ok: true });
85+
}
86+
87+
if (overwrite || !this.reason) this.reason = reason;
88+
89+
this.healthSubject$.next({ ok: false, reason: this.reason });
90+
}
91+
92+
public healthCheck() {
93+
return firstValueFrom(this.health$);
94+
}
95+
}
96+
5797
export class CardanoWsClient extends WsProvider {
5898
/** The client id, assigned by the server. */
5999
clientId = NOT_CONNECTED_ID;

packages/cardano-services/src/WsServer/server.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
1-
import {
2-
Cardano,
3-
CardanoNode,
4-
NetworkInfoResponses,
5-
Seconds,
6-
WSMessage,
7-
WsProvider,
8-
createSlotEpochInfoCalc
9-
} from '@cardano-sdk/core';
1+
import { Cardano, CardanoNode, Seconds, createSlotEpochInfoCalc } from '@cardano-sdk/core';
102
import { GenesisData } from '..';
113
import { Logger } from 'ts-log';
4+
import { NetworkInfoResponses, WSMessage, WsProvider } from '@cardano-sdk/cardano-services-client';
125
import { Notification, Pool } from 'pg';
136
import { Server, createServer } from 'http';
147
import { WebSocket, WebSocketServer } from 'ws';

packages/core/src/WebSocket.ts

Lines changed: 0 additions & 44 deletions
This file was deleted.

packages/core/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,3 @@ export * from './Provider';
55
export * from './util';
66
export * from './errors';
77
export * from './CardanoNode';
8-
export * from './WebSocket';

packages/e2e/test/ws-server/webSocket.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { CardanoWsClient } from '@cardano-sdk/cardano-services-client';
1+
import { CardanoWsClient, WsProvider } from '@cardano-sdk/cardano-services-client';
22
import {
33
CardanoWsServer,
44
GenesisData,
55
createDnsResolver,
66
getOgmiosCardanoNode,
77
util
88
} from '@cardano-sdk/cardano-services';
9-
import { HealthCheckResponse, WsProvider } from '@cardano-sdk/core';
9+
import { HealthCheckResponse } from '@cardano-sdk/core';
1010
import { OgmiosCardanoNode } from '@cardano-sdk/ogmios';
1111
import { Pool } from 'pg';
1212
import { filter, firstValueFrom } from 'rxjs';

0 commit comments

Comments
 (0)