@@ -607,14 +607,20 @@ export const counterCollectionOrderByN = counterCollection.index(
607
607
const entityEvent = event < { id : string } > ( "entityEvent" ) ;
608
608
const entitySignal = signal ( "entitySignal" ) ;
609
609
const entitySignal2 = signal < { n : number } > ( "entitySignal2" ) ;
610
+ const entityOrderSignal = signal < { n : number } > ( "entityOrderSignal" ) ;
610
611
611
612
export const counterWatcher = counter . stream (
612
613
"counterWatcher" ,
613
- { operations : [ "remove" ] , includeOld : true } ,
614
+ { operations : [ "modify" , " remove"] , includeOld : true } ,
614
615
async ( item ) => {
615
616
console . log ( item ) ;
616
- const { n } = item . oldValue ! ;
617
- await entitySignal2 . sendSignal ( item . key . id , { n : n + 1 } ) ;
617
+ if ( item . operation === "remove" ) {
618
+ const { n } = item . oldValue ! ;
619
+ await entitySignal2 . sendSignal ( item . key . id , { n : n + 1 } ) ;
620
+ } else if ( item . newValue . namespace === "default" ) {
621
+ const { n } = item . newValue ;
622
+ await entityOrderSignal . sendSignal ( item . key . id , { n } ) ;
623
+ }
618
624
}
619
625
) ;
620
626
@@ -658,12 +664,31 @@ export const entityTask = task(
658
664
"entityTask" ,
659
665
async ( _ , { execution : { id } } ) => {
660
666
const value = await counter . get ( [ "default" , id ] ) ;
667
+ // send 4 updates to force multiple update events at the same time and test stream ordering
661
668
await counter . put ( {
662
669
namespace : "default" ,
663
670
id,
664
671
n : ( value ?. n ?? 0 ) + 1 ,
665
672
optional : undefined ,
666
673
} ) ;
674
+ await counter . put ( {
675
+ namespace : "default" ,
676
+ id,
677
+ n : ( value ?. n ?? 0 ) + 2 ,
678
+ optional : undefined ,
679
+ } ) ;
680
+ await counter . put ( {
681
+ namespace : "default" ,
682
+ id,
683
+ n : ( value ?. n ?? 0 ) + 3 ,
684
+ optional : undefined ,
685
+ } ) ;
686
+ await counter . put ( {
687
+ namespace : "default" ,
688
+ id,
689
+ n : ( value ?. n ?? 0 ) + 4 ,
690
+ optional : undefined ,
691
+ } ) ;
667
692
}
668
693
) ;
669
694
@@ -748,15 +773,34 @@ export const entityIndexTask = task(
748
773
export const entityWorkflow = workflow (
749
774
"entityWorkflow" ,
750
775
async ( _ , { execution : { id } } ) => {
776
+ let orderValue = 0 ;
777
+ let orderError : string | undefined ;
778
+ // this signal handler is intended to test that the counter stream is executed in order.
779
+ // it sends a signal each time the "default" name space counter is updated
780
+ // and we want to check if the order is always increasing
781
+ // and then validate the order value against the final value at the end.
782
+ entityOrderSignal . onSignal ( ( { n } ) => {
783
+ if ( n > orderValue ) {
784
+ console . log ( `Ordered Value: ${ orderValue } ${ n } ` ) ;
785
+ orderValue = n ;
786
+ } else {
787
+ orderError = `order value ${ n } is less than or equal to previous value ${ orderValue } , the stream handler executed out of order!` ;
788
+ }
789
+ } ) ;
790
+
791
+ // default: 1
751
792
await counter . put ( { namespace : "default" , id, n : 1 , optional : undefined } ) ;
752
793
await counter . put ( {
753
794
namespace : "different" ,
754
795
id,
755
796
n : 1 ,
756
797
optional : undefined ,
757
798
} ) ;
799
+ // default: 2 after insert "different"
758
800
await entitySignal . expectSignal ( ) ;
801
+ // default: 6 after entity task (adds 4)
759
802
await entityTask ( ) ;
803
+ // default: 7 after event subscription
760
804
await Promise . all ( [ entityEvent . emit ( { id } ) , entitySignal . expectSignal ( ) ] ) ;
761
805
try {
762
806
// will fail
@@ -769,6 +813,7 @@ export const entityWorkflow = workflow(
769
813
}
770
814
const { value : entityValue , version } =
771
815
( await counter . getWithMetadata ( [ "default" , id ] ) ) ?? { } ;
816
+ // default: 8 after get with metadata and successful assertion
772
817
await counter . put (
773
818
{ namespace : "default" , id, n : entityValue ! . n + 1 , optional : undefined } ,
774
819
{ expectedVersion : version }
@@ -782,6 +827,9 @@ export const entityWorkflow = workflow(
782
827
} ,
783
828
] ) ;
784
829
830
+ // default: 9 after transact write
831
+ const finalValue = await counter . get ( [ "default" , id ] ) ;
832
+
785
833
const result0 = await entityIndexTask ( ) ;
786
834
787
835
// send deletion, to be picked up by the stream
@@ -793,6 +841,22 @@ export const entityWorkflow = workflow(
793
841
entitySignal2 . expectSignal ( ) ,
794
842
] ) ;
795
843
844
+ if (
845
+ orderError ||
846
+ // wait 30 seconds for the order value to match the final value.
847
+ ! ( await condition (
848
+ { timeout : duration ( 300 , "seconds" ) } ,
849
+ ( ) => finalValue ?. n === orderValue
850
+ ) )
851
+ ) {
852
+ if ( orderError ) {
853
+ throw new Error ( orderError ) ;
854
+ }
855
+ throw new Error (
856
+ `Order handler never received the final value! have: ${ orderValue } expected: ${ finalValue ?. n } `
857
+ ) ;
858
+ }
859
+
796
860
/**
797
861
* Testing sort keys and query
798
862
*/
0 commit comments