11import { sleep } from '@deepkit/core' ;
22import { entity } from '@deepkit/type' ;
33import { expect , test } from '@jest/globals' ;
4- import { BehaviorSubject , Observable , Subject , Subscription } from 'rxjs' ;
4+ import { BehaviorSubject , Observable , Subject , Subscription , toArray } from 'rxjs' ;
55import { first , take } from 'rxjs/operators' ;
66import { DirectClient } from '../src/client/client-direct.js' ;
77import { rpc } from '../src/decorators.js' ;
88import { RpcKernel } from '../src/server/kernel.js' ;
9+ import { createSubject , instantObservable , instantSubject } from '../src/utils' ;
910
1011test ( 'observable basics' , async ( ) => {
1112 @entity . name ( 'model' )
@@ -214,7 +215,7 @@ test('subject redirect of global subject', async () => {
214215 const sub = globalSubject . subscribe ( subject ) ;
215216 subject . subscribe ( ) . add ( ( ) => {
216217 completes ++ ;
217- sub . unsubscribe ( )
218+ sub . unsubscribe ( ) ;
218219 } ) ;
219220 return subject ;
220221 }
@@ -279,7 +280,7 @@ test('observable unsubscribes automatically when connection closes', async () =>
279280 return {
280281 unsubscribe ( ) {
281282 unsubscribed = true ;
282- }
283+ } ,
283284 } ;
284285 } ) ;
285286 }
@@ -465,7 +466,7 @@ test('observable complete', async () => {
465466 unsubscribe ( ) {
466467 done = true ;
467468 active = false ;
468- }
469+ } ,
469470 } ;
470471 } ) ;
471472 }
@@ -487,7 +488,7 @@ test('observable complete', async () => {
487488 return {
488489 unsubscribe ( ) {
489490 unsubscribedCalled = true ;
490- }
491+ } ,
491492 } ;
492493 } ) ;
493494 {
@@ -537,3 +538,95 @@ test('observable complete', async () => {
537538 }
538539} ) ;
539540
541+ test ( 'createSubject' , async ( ) => {
542+ let teardowns = 0 ;
543+
544+ class Controller {
545+ @rpc . action ( )
546+ async subscribeChats ( ) {
547+ return createSubject < string > ( ( subject ) => {
548+ subject . next ( 'hello' ) ;
549+ subject . next ( 'world' ) ;
550+ } , ( ) => teardowns ++ ) ;
551+ }
552+ }
553+
554+ const kernel = new RpcKernel ( ) ;
555+ kernel . registerController ( Controller , 'myController' ) ;
556+
557+ const client = new DirectClient ( kernel ) ;
558+ const controller = client . controller < Controller > ( 'myController' ) ;
559+
560+ {
561+ const o = await controller . subscribeChats ( ) ;
562+ expect ( o ) . toBeInstanceOf ( Subject ) ;
563+ const values = await o . pipe ( take ( 2 ) , toArray ( ) ) . toPromise ( ) ;
564+ expect ( values ) . toEqual ( [ 'hello' , 'world' ] ) ;
565+ o . complete ( ) ;
566+ await sleep ( 0 ) ;
567+ expect ( teardowns ) . toBe ( 1 ) ;
568+ }
569+
570+ {
571+ const s = instantSubject ( controller . subscribeChats ( ) ) ;
572+ const values = await s . pipe ( take ( 2 ) , toArray ( ) ) . toPromise ( ) ;
573+ expect ( values ) . toEqual ( [ 'hello' , 'world' ] ) ;
574+ s . complete ( ) ;
575+ await sleep ( 0 ) ;
576+ expect ( teardowns ) . toBe ( 2 ) ;
577+ }
578+
579+ {
580+ const s = instantSubject ( ( ) => controller . subscribeChats ( ) ) ;
581+ const values = await s . pipe ( take ( 2 ) , toArray ( ) ) . toPromise ( ) ;
582+ expect ( values ) . toEqual ( [ 'hello' , 'world' ] ) ;
583+ s . complete ( ) ;
584+ await sleep ( 0 ) ;
585+ expect ( teardowns ) . toBe ( 3 ) ;
586+ }
587+ } ) ;
588+
589+ test ( 'instantObservable' , async ( ) => {
590+ let teardowns = 0 ;
591+
592+ class Controller {
593+ @rpc . action ( )
594+ subscribeChats ( channel : string ) {
595+ return new Observable < string > ( ( subject ) => {
596+ subject . next ( channel ) ;
597+ subject . next ( 'hello' ) ;
598+ subject . next ( 'world' ) ;
599+ return ( ) => teardowns ++ ;
600+ } ) ;
601+ }
602+ }
603+
604+ const kernel = new RpcKernel ( ) ;
605+ kernel . registerController ( Controller , 'myController' ) ;
606+
607+ const client = new DirectClient ( kernel ) ;
608+ const controller = client . controller < Controller > ( 'myController' ) ;
609+
610+ {
611+ const o = await controller . subscribeChats ( 'a' ) ;
612+ expect ( o ) . toBeInstanceOf ( Observable ) ;
613+ expect ( teardowns ) . toBe ( 0 ) ;
614+ const values = await o . pipe ( take ( 3 ) , toArray ( ) ) . toPromise ( ) ;
615+ expect ( teardowns ) . toBe ( 1 ) ;
616+ expect ( values ) . toEqual ( [ 'a' , 'hello' , 'world' ] ) ;
617+ }
618+
619+ {
620+ expect ( teardowns ) . toBe ( 1 ) ;
621+ const values = await instantObservable ( controller . subscribeChats ( 'b' ) ) . pipe ( take ( 3 ) , toArray ( ) ) . toPromise ( ) ;
622+ expect ( teardowns ) . toBe ( 2 ) ;
623+ expect ( values ) . toEqual ( [ 'b' , 'hello' , 'world' ] ) ;
624+ }
625+
626+ {
627+ expect ( teardowns ) . toBe ( 2 ) ;
628+ const values = await instantObservable ( ( ) => controller . subscribeChats ( 'b' ) ) . pipe ( take ( 3 ) , toArray ( ) ) . toPromise ( ) ;
629+ expect ( teardowns ) . toBe ( 3 ) ;
630+ expect ( values ) . toEqual ( [ 'b' , 'hello' , 'world' ] ) ;
631+ }
632+ } ) ;
0 commit comments