From aefaf956f15d45c830d33758fa803bac0a306c04 Mon Sep 17 00:00:00 2001 From: Alex H Date: Thu, 4 Apr 2024 16:50:21 +0200 Subject: [PATCH] feat(nestjs-json-rpc-sdk): add takeUntil for disconnect socket --- README.md | 2 + apps/json-api-front/src/app/app.config.ts | 68 ++++++++++++-- .../json-api/json-rpc/run-ws-json-rpc.spec.ts | 9 +- .../src/json-api/utils/run-application.ts | 6 +- .../src/lib/angular/factory.ts | 94 +++++++++++++++++++ .../lib/angular/json-rpc-angular.module.ts | 24 +++++ .../src/lib/angular/tokens.ts | 31 ++++++ .../src/lib/factory/io-transport.factory.ts | 59 ++++++++++-- .../src/lib/factory/transport.factory.ts | 32 ++++++- .../src/lib/factory/ws-transport.factory.ts | 20 +++- .../src/lib/json-rpc-angular.ts | 82 +--------------- .../src/lib/types/angular-type.ts | 28 ++++++ .../src/lib/types/config.ts | 43 ++++++++- .../src/lib/types/index.ts | 1 + 14 files changed, 389 insertions(+), 110 deletions(-) create mode 100644 libs/json-rpc/nestjs-json-rpc-sdk/src/lib/angular/factory.ts create mode 100644 libs/json-rpc/nestjs-json-rpc-sdk/src/lib/angular/json-rpc-angular.module.ts create mode 100644 libs/json-rpc/nestjs-json-rpc-sdk/src/lib/angular/tokens.ts create mode 100644 libs/json-rpc/nestjs-json-rpc-sdk/src/lib/types/angular-type.ts diff --git a/README.md b/README.md index aeb5370..9bdbaba 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ - *[json-api-nestjs](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs)* - plugin for create CRUD overs JSON API - *[json-api-nestjs-sdk](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-api/json-api-nestjs-sdk)* - tool for client, call api over *json-api-nestjs* +- *[nestjs-json-rpc](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-rpc/nestjs-json-rpc)* - plugin for create RPC server using [JSON-RPC](https://www.jsonrpc.org/) +- *[nestjs-json-rpc-sdk](https://github.com/klerick/nestjs-json-api/tree/master/libs/json-rpc/nestjs-json-rpc-sdk)* - tool for client, call RPC server *nestjs-json-rpc* - *json-api-nestjs-acl* - tool for acl over *json-api-nestjs*(coming soon...) ## Installation diff --git a/apps/json-api-front/src/app/app.config.ts b/apps/json-api-front/src/app/app.config.ts index d916faf..e6d0f35 100644 --- a/apps/json-api-front/src/app/app.config.ts +++ b/apps/json-api-front/src/app/app.config.ts @@ -1,10 +1,60 @@ -import { ApplicationConfig, importProvidersFrom } from '@angular/core'; +import { + ApplicationConfig, + importProvidersFrom, + InjectionToken, +} from '@angular/core'; import { JsonApiAngular } from 'json-api-nestjs-sdk/json-api-nestjs-sdk.module'; import { JsonRpcAngular, + JsonRpcAngularConfig, TransportType, } from '@klerick/nestjs-json-rpc-sdk/json-rpc-sdk.module'; -import io from 'socket.io-client'; +import { Subject } from 'rxjs'; +import { webSocket } from 'rxjs/webSocket'; +import { io } from 'socket.io-client'; + +const destroySubject = new Subject(); +setTimeout(() => { + console.log('Disconnect'); + destroySubject.next(true); + destroySubject.complete(); +}, 5000); +const destroySubjectToken = new InjectionToken('destroySubjectToken', { + factory: () => destroySubject, +}); +destroySubject.subscribe((r) => console.log(r)); +const tokenSocketInst = new InjectionToken('tokenSocketInst', { + factory: () => webSocket('ws://localhost:4200/rpc'), +}); + +const tokenIoSocketInst = new InjectionToken('tokenIoSocketInst', { + factory: () => io('http://localhost:3000', { path: '/rpc' }), +}); + +const httpConfig: JsonRpcAngularConfig = { + transport: TransportType.HTTP, + rpcPath: '/api/rpc', + rpcHost: 'http://localhost:4200', +}; +const wsConfig: JsonRpcAngularConfig = { + transport: TransportType.WS, + useWsNativeSocket: true, + rpcPath: 'rpc', + rpcHost: 'ws://localhost:4200', + destroySubjectToken, +}; +const wsConfigWithToken: JsonRpcAngularConfig = { + transport: TransportType.WS, + useWsNativeSocket: true, + tokenSocketInst, + destroySubjectToken, +}; +const ioConfig: JsonRpcAngularConfig = { + transport: TransportType.WS, + useWsNativeSocket: false, + destroySubjectToken, + tokenSocketInst: tokenIoSocketInst, +}; export const appConfig: ApplicationConfig = { providers: [ @@ -17,14 +67,12 @@ export const appConfig: ApplicationConfig = { }) ), importProvidersFrom( - JsonRpcAngular.forRoot({ - transport: TransportType.WS, - rpcPath: 'rpc', - rpcHost: 'ws://localhost:4200', - useWsNativeSocket: true, - // useWsNativeSocket: false, - // webSocketCtor: io('http://localhost:3000', { path: '/rpc' }), - }) + JsonRpcAngular.forRoot( + // httpConfig + // wsConfig + // wsConfigWithToken, + ioConfig + ) ), ], }; diff --git a/apps/json-api-server-e2e/src/json-api/json-rpc/run-ws-json-rpc.spec.ts b/apps/json-api-server-e2e/src/json-api/json-rpc/run-ws-json-rpc.spec.ts index 7f0752a..09803e1 100644 --- a/apps/json-api-server-e2e/src/json-api/json-rpc/run-ws-json-rpc.spec.ts +++ b/apps/json-api-server-e2e/src/json-api/json-rpc/run-ws-json-rpc.spec.ts @@ -5,7 +5,12 @@ import { RpcError, } from '@klerick/nestjs-json-rpc-sdk'; -import { creatWsRpcSdk, MapperRpc, run } from '../utils/run-application'; +import { + creatWsRpcSdk, + MapperRpc, + run, + destroySubject, +} from '../utils/run-application'; let app: INestApplication; @@ -14,6 +19,8 @@ beforeAll(async () => { }); afterAll(async () => { + destroySubject.next(true); + destroySubject.complete(); await app.close(); }); diff --git a/apps/json-api-server-e2e/src/json-api/utils/run-application.ts b/apps/json-api-server-e2e/src/json-api/utils/run-application.ts index 4493a22..0dbe371 100644 --- a/apps/json-api-server-e2e/src/json-api/utils/run-application.ts +++ b/apps/json-api-server-e2e/src/json-api/utils/run-application.ts @@ -16,6 +16,7 @@ import { AppModule } from '../../../../json-api-server/src/app/app.module'; import { JsonConfig } from '../../../../../libs/json-api/json-api-nestjs-sdk/src/lib/types'; import { WsAdapter } from '@nestjs/platform-ws'; +import { Subject } from 'rxjs'; export const axiosAdapter = adapterForAxios(axios); let saveApp: INestApplication; @@ -70,15 +71,16 @@ export const creatRpcSdk = (config: Partial = {}) => }, true ); - +export const destroySubject = new Subject(); export const creatWsRpcSdk = (config: Partial = {}) => RpcFactory( { transport: TransportType.WS, useWsNativeSocket: true, - webSocketCtor: WebSocket, + nativeSocketImplementation: WebSocket, rpcHost: `http://localhost:${port}`, rpcPath: `/rpc`, + destroySubject, }, true ); diff --git a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/angular/factory.ts b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/angular/factory.ts new file mode 100644 index 0000000..7becf8d --- /dev/null +++ b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/angular/factory.ts @@ -0,0 +1,94 @@ +import { inject, InjectionToken } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Subject } from 'rxjs'; +import { WebSocketSubject } from 'rxjs/internal/observable/dom/WebSocketSubject'; +import { Socket } from 'socket.io-client'; + +import { + LoopFunc, + PayloadRpc, + RpcResult, + RpcReturnList, + RpcConfig, + TransportType, +} from '../types'; +import { transportFactory } from '../factory'; +import { webSocketFactory, WsResponse } from '../factory/ws-transport.factory'; + +import { JSON_RPC_SDK_CONFIG, JSON_RPC_SDK_TRANSPORT } from './tokens'; +import { RpcBatchFactory, rpcProxy } from '../utils'; + +export function rpcBatchFactory() { + return RpcBatchFactory(inject(JSON_RPC_SDK_TRANSPORT)); +} + +export function rpcFactory() { + return rpcProxy>( + inject(JSON_RPC_SDK_TRANSPORT), + false + ); +} + +export function angularTransportFactory() { + const angularConfig = inject(JSON_RPC_SDK_CONFIG); + const httpClient = inject(HttpClient); + + if (angularConfig.transport === TransportType.HTTP) { + const rpcConfig: RpcConfig = { + transport: angularConfig.transport, + httpAgentFactory: (url: string) => (body: PayloadRpc) => + httpClient.post>(url, body), + rpcPath: angularConfig.rpcPath, + rpcHost: angularConfig.rpcHost, + }; + return transportFactory(rpcConfig); + } + + const destroySubject = + (angularConfig.destroySubjectToken && + inject>(angularConfig.destroySubjectToken, { + optional: true, + })) || + new Subject(); + + if (angularConfig.useWsNativeSocket) { + let socketInst: + | WebSocketSubject | RpcResult>> + | undefined = undefined; + if ('tokenSocketInst' in angularConfig) { + socketInst = + inject< + WebSocketSubject< + WsResponse | RpcResult> + > + >(angularConfig['tokenSocketInst'], { optional: true }) || undefined; + } else { + const url = new URL( + angularConfig.rpcPath, + angularConfig.rpcHost + ).toString(); + socketInst = webSocketFactory( + url, + angularConfig.nativeSocketImplementation + ); + } + + if (socketInst === undefined) throw new Error('Cant create socket inst'); + const rpcConfig: RpcConfig = { + transport: angularConfig.transport, + useWsNativeSocket: angularConfig.useWsNativeSocket, + nativeSocketInstance: socketInst, + destroySubject, + }; + + return transportFactory(rpcConfig); + } + const ioSocketInstance = inject(angularConfig['tokenSocketInst']); + const rpcConfig: RpcConfig = { + transport: angularConfig.transport, + useWsNativeSocket: angularConfig.useWsNativeSocket, + ioSocketInstance: ioSocketInstance, + destroySubject, + }; + return transportFactory(rpcConfig); +} diff --git a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/angular/json-rpc-angular.module.ts b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/angular/json-rpc-angular.module.ts new file mode 100644 index 0000000..3fe46b9 --- /dev/null +++ b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/angular/json-rpc-angular.module.ts @@ -0,0 +1,24 @@ +import { ModuleWithProviders, NgModule } from '@angular/core'; +import { HttpClientModule } from '@angular/common/http'; + +import { JSON_RPC_SDK_CONFIG } from './tokens'; +import { JsonRpcAngularConfig } from '../types'; + +@NgModule({ + imports: [HttpClientModule], +}) +export class JsonRpcAngular { + static forRoot( + config: JsonRpcAngularConfig + ): ModuleWithProviders { + return { + ngModule: JsonRpcAngular, + providers: [ + { + useValue: config, + provide: JSON_RPC_SDK_CONFIG, + }, + ], + }; + } +} diff --git a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/angular/tokens.ts b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/angular/tokens.ts new file mode 100644 index 0000000..a979eae --- /dev/null +++ b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/angular/tokens.ts @@ -0,0 +1,31 @@ +import { InjectionToken } from '@angular/core'; +import { LoopFunc, RpcBatch, RpcReturnList, Transport } from '../types'; + +import { JsonRpcAngularConfig } from '@klerick/nestjs-json-rpc-sdk/json-rpc-sdk.module'; +import { + angularTransportFactory, + rpcBatchFactory, + rpcFactory, +} from './factory'; + +export const JSON_RPC_SDK_CONFIG = new InjectionToken( + 'Main config object for sdk' +); + +export const JSON_RPC_SDK_TRANSPORT = new InjectionToken>( + 'Transport for RPC', + { + factory: angularTransportFactory, + } +); + +export const JSON_RPC = new InjectionToken>( + 'Rpc client', + { + factory: rpcFactory, + } +); + +export const RPC_BATCH = new InjectionToken('Rpc client for batch', { + factory: rpcBatchFactory, +}); diff --git a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/factory/io-transport.factory.ts b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/factory/io-transport.factory.ts index d64aeb3..c6d772c 100644 --- a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/factory/io-transport.factory.ts +++ b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/factory/io-transport.factory.ts @@ -1,5 +1,19 @@ -import { filter, of, Subject, switchMap, take, tap } from 'rxjs'; import type { Socket } from 'socket.io-client'; +import { + filter, + Observable, + Observer, + of, + Subject, + Subscription, + switchMap, + take, + takeUntil, + tap, +} from 'rxjs'; +import { Subscriber } from 'rxjs/internal/Subscriber'; +import { TeardownLogic } from 'rxjs/internal/types'; + import { LoopFunc, PayloadRpc, RpcResult, Transport } from '../types'; import { WS_EVENT_NAME } from '../constans'; @@ -11,18 +25,51 @@ interface ClientToServerEvents { rpc: (payload: PayloadRpc) => void; } +class SocketIo extends Observable> { + private messageQueue: PayloadRpc[] = []; + constructor( + private io: Socket, ClientToServerEvents> + ) { + super((subscriber) => this.subscribeForObservable(subscriber)); + this.io.on('connect', () => { + while (this.messageQueue.length > 0) { + const msg = this.messageQueue.shift(); + if (!msg) break; + this.io.emit(WS_EVENT_NAME, msg); + } + }); + } + + private subscribeForObservable( + subscriber: Subscriber> + ): TeardownLogic { + this.io.on(WS_EVENT_NAME, (value) => subscriber.next(value)); + this.io.on('connect_error', (error: Error) => subscriber.error(error)); + this.io.on('disconnect', () => subscriber.complete()); + return { unsubscribe: () => this.io.close() }; + } + + public next(message: PayloadRpc): void { + if (!this.io.connected) { + this.messageQueue.push(message); + return; + } + + this.io.emit(WS_EVENT_NAME, message); + } +} + export function ioTransportFactory( - io: Socket, ClientToServerEvents> + io: Socket, ClientToServerEvents>, + destroyFactory: Subject ): Transport { - const subjectData = new Subject>(); - io.on(WS_EVENT_NAME, (event) => subjectData.next(event)); - + const socketSubject = new SocketIo(io).pipe(takeUntil(destroyFactory)); return (body: PayloadRpc) => { const { id } = body; return of(true).pipe( tap(() => io.emit(WS_EVENT_NAME, body)), switchMap(() => - subjectData.pipe(filter((response) => response.id === id)) + socketSubject.pipe(filter((response) => response.id === id)) ), take(1) ); diff --git a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/factory/transport.factory.ts b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/factory/transport.factory.ts index 025a9e3..a30e443 100644 --- a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/factory/transport.factory.ts +++ b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/factory/transport.factory.ts @@ -5,10 +5,18 @@ import { RpcHttpConfig, RpcWsConfig, LoopFunc, + PayloadRpc, + RpcResult, } from '../types'; import { fetchTransportFactory } from './fetch-transport.factory'; -import { wsTransportFactory } from './ws-transport.factory'; +import { + webSocketFactory, + WsResponse, + wsTransportFactory, +} from './ws-transport.factory'; import { ioTransportFactory } from './io-transport.factory'; +import { Subject } from 'rxjs'; +import { WebSocketSubject } from 'rxjs/internal/observable/dom/WebSocketSubject'; function httpTransport( config: RpcHttpConfig @@ -22,12 +30,28 @@ function httpTransport( } function wsTransport(config: RpcWsConfig): Transport { + const destroyFactory = config.destroySubject || new Subject(); if (config.useWsNativeSocket) { - const url = new URL(config.rpcPath, config.rpcHost).toString(); - return wsTransportFactory(url, config.webSocketCtor); + let nativeSocketInstance: WebSocketSubject< + WsResponse | RpcResult> + >; + if ('nativeSocketInstance' in config) { + nativeSocketInstance = config.nativeSocketInstance; + } else { + const url = new URL(config.rpcPath, config.rpcHost).toString(); + nativeSocketInstance = webSocketFactory( + url, + config.nativeSocketImplementation + ); + } + + return wsTransportFactory( + nativeSocketInstance, + config.destroySubject || new Subject() + ); } - return ioTransportFactory(config.webSocketCtor); + return ioTransportFactory(config.ioSocketInstance, destroyFactory); } export function transportFactory( diff --git a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/factory/ws-transport.factory.ts b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/factory/ws-transport.factory.ts index 15a1304..0655404 100644 --- a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/factory/ws-transport.factory.ts +++ b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/factory/ws-transport.factory.ts @@ -1,22 +1,31 @@ -import { filter, of, Subject, switchMap, take, tap } from 'rxjs'; +import { filter, of, Subject, switchMap, take, takeUntil, tap } from 'rxjs'; import { webSocket } from 'rxjs/webSocket'; import { map } from 'rxjs/operators'; import { WS_EVENT_NAME } from '../constans'; import { LoopFunc, PayloadRpc, RpcResult, Transport, WsEvent } from '../types'; +import { WebSocketSubject } from 'rxjs/internal/observable/dom/WebSocketSubject'; export interface WsResponse { event: WsEvent; data: T; } -export function wsTransportFactory( +export function webSocketFactory( url: string, webSocketCtor?: any -): Transport { - const subject = webSocket | RpcResult>>({ +): WebSocketSubject | RpcResult>> { + return webSocket | RpcResult>>({ url, ...(webSocketCtor ? { WebSocketCtor: webSocketCtor } : {}), }); +} + +export function wsTransportFactory( + subject: WebSocketSubject< + WsResponse | RpcResult> + >, + destroyFactory: Subject +): Transport { const subjectData = new Subject>(); subject .pipe( @@ -24,7 +33,8 @@ export function wsTransportFactory( if (typeof response !== 'object' || response === null) return false; return 'event' in response && response['event'] === 'rpc'; }), - map((response) => response.data) + map((response) => response.data), + takeUntil(destroyFactory) ) .subscribe((r) => subjectData.next(r)); diff --git a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/json-rpc-angular.ts b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/json-rpc-angular.ts index 993adcc..9d185b8 100644 --- a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/json-rpc-angular.ts +++ b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/json-rpc-angular.ts @@ -1,79 +1,3 @@ -import { - inject, - InjectionToken, - ModuleWithProviders, - NgModule, -} from '@angular/core'; -import { HttpClientModule, HttpClient } from '@angular/common/http'; -import { - LoopFunc, - RpcMainHttpConfig, - RpcHttpConfig, - RpcWsConfig, - Transport, - TransportType, - PayloadRpc, - RpcResult, - RpcReturnList, - RpcBatch, -} from './types'; -import { transportFactory } from './factory'; -import { RpcBatchFactory, rpcProxy } from './utils'; - -type Rpc = RpcReturnList; - -export { TransportType, Rpc }; - -export const JSON_RPC_SDK_CONFIG = new InjectionToken( - 'Main config object for sdk' -); - -export const JSON_RPC_SDK_TRANSPORT = new InjectionToken>( - 'Transport for RPC', - { - factory: () => { - const config = inject(JSON_RPC_SDK_CONFIG); - const httpClient = inject(HttpClient); - if (config.transport === TransportType.HTTP) { - (config as unknown as RpcHttpConfig)['httpAgentFactory'] = - (url: string) => (body: PayloadRpc) => { - return httpClient.post>(url, body); - }; - } - return transportFactory(config); - }, - } -); - -export const JSON_RPC = new InjectionToken>( - 'Rpc client', - { - factory: () => - rpcProxy>(inject(JSON_RPC_SDK_TRANSPORT), false), - } -); - -export const RPC_BATCH = new InjectionToken('Rpc client for batch', { - factory: () => RpcBatchFactory(inject(JSON_RPC_SDK_TRANSPORT)), -}); - -export type JsonRpcAngularConfig = RpcMainHttpConfig | RpcWsConfig; - -@NgModule({ - imports: [HttpClientModule], -}) -export class JsonRpcAngular { - static forRoot( - config: JsonRpcAngularConfig - ): ModuleWithProviders { - return { - ngModule: JsonRpcAngular, - providers: [ - { - useValue: config, - provide: JSON_RPC_SDK_CONFIG, - }, - ], - }; - } -} +export { JsonRpcAngular } from './angular/json-rpc-angular.module'; +export { JsonRpcAngularConfig, TransportType, Rpc } from './types'; +export { JSON_RPC, RPC_BATCH } from './angular/tokens'; diff --git a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/types/angular-type.ts b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/types/angular-type.ts new file mode 100644 index 0000000..e7ed7f5 --- /dev/null +++ b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/types/angular-type.ts @@ -0,0 +1,28 @@ +import { + RpcMainHttpConfig, + RpcNativeSocketFactory, + RpcNativeSocketFalse, + RpcNativeSocketTrue, + TransportType, +} from './config'; +import { RpcReturnList } from './rpc'; + +type RpcWsMainConfig = { + transport: TransportType.WS; + destroySubjectToken?: any; +}; + +type RpcTokenForWs = { + tokenSocketInst: any; +}; + +type RpcNativeConfig = RpcNativeSocketTrue & + (RpcNativeSocketFactory | RpcTokenForWs); + +type RpcIoConfig = RpcNativeSocketFalse & RpcTokenForWs; + +type RpcAngularWsConfig = RpcWsMainConfig & (RpcNativeConfig | RpcIoConfig); + +export type JsonRpcAngularConfig = RpcMainHttpConfig | RpcAngularWsConfig; + +export type Rpc = RpcReturnList; diff --git a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/types/config.ts b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/types/config.ts index 6d264df..ff33f90 100644 --- a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/types/config.ts +++ b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/types/config.ts @@ -1,7 +1,10 @@ -import { Transport } from './rpc'; +import { PayloadRpc, RpcResult, Transport } from './rpc'; import { HttpAgentFactory, LoopFunc } from './utils'; import type { Socket } from 'socket.io-client'; +import { Subject } from 'rxjs'; +import { WebSocketSubject } from 'rxjs/internal/observable/dom/WebSocketSubject'; +import { WsResponse } from '../factory/ws-transport.factory'; export enum TransportType { HTTP, @@ -34,8 +37,42 @@ type UseNativeSocket = webSocketCtor: Socket; }; -export type RpcWsConfig = { +export type RpcNativeSocketFactory = { + rpcPath: string; + rpcHost: string; + nativeSocketImplementation?: { + new (url: string, protocols?: string | string[]): any; + }; +}; + +export type RpcNativeSocketInstance = { + nativeSocketInstance: WebSocketSubject< + WsResponse | RpcResult> + >; +}; + +export type RpcNativeSocketTrue = { + useWsNativeSocket: true; +}; + +export type RpcNativeSocketFalse = { + useWsNativeSocket: false; +}; + +export type RpcNativeSocket = RpcNativeSocketTrue & + (RpcNativeSocketFactory | RpcNativeSocketInstance); + +export type RpcWsMainConfig = { transport: TransportType.WS; -} & UseNativeSocket; + destroySubject?: Subject; +}; + +export type RpcIoSocketInstance = { + ioSocketInstance: Socket; +}; + +export type RpcIoSocket = RpcNativeSocketFalse & RpcIoSocketInstance; + +export type RpcWsConfig = RpcWsMainConfig & (RpcNativeSocket | RpcIoSocket); export type RpcConfig = RpcHttpConfig | RpcWsConfig; diff --git a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/types/index.ts b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/types/index.ts index 4f0e436..5abc258 100644 --- a/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/types/index.ts +++ b/libs/json-rpc/nestjs-json-rpc-sdk/src/lib/types/index.ts @@ -2,3 +2,4 @@ export * from './config'; export * from './rpc'; export * from './rpc-error-object'; export * from './utils'; +export * from './angular-type';