@@ -31,6 +31,7 @@ describe("createSessionMessageSubscriberRegistry", () => {
3131 subscribers . subscribe ( "conn-other" , "agent:main:child" , { includeApprovals : true } ) ;
3232
3333 subscribers . unsubscribeAll ( "conn-reviewer" ) ;
34+ expect ( [ ...subscribers . getForConnection ( "conn-reviewer" ) ] ) . toEqual ( [ ] ) ;
3435 expect ( [ ...subscribers . get ( "agent:main:main" ) ] ) . toEqual ( [ ] ) ;
3536 expect ( [ ...subscribers . getApprovals ( "agent:main:main" ) ] ) . toEqual ( [ ] ) ;
3637 expect ( [ ...subscribers . get ( "agent:main:child" ) ] ) . toEqual ( [ "conn-other" ] ) ;
@@ -41,27 +42,73 @@ describe("createSessionMessageSubscriberRegistry", () => {
4142 expect ( [ ...subscribers . getApprovals ( "agent:main:child" ) ] ) . toEqual ( [ ] ) ;
4243 } ) ;
4344
44- it ( "rolls a provisional subscription back to its exact prior state" , ( ) => {
45+ it . each ( [ "first" , "second" ] ) (
46+ "removes a first-time subscription when both concurrent replays fail (%s rollback first)" ,
47+ ( firstRollback ) => {
48+ const subscribers = createSessionMessageSubscriberRegistry ( ) ;
49+ const first = subscribers . subscribe ( "conn" , "agent:main:main" , { provisional : true } ) ! ;
50+ const second = subscribers . subscribe ( "conn" , "agent:main:main" , { provisional : true } ) ! ;
51+
52+ if ( firstRollback === "first" ) {
53+ first ( ) ;
54+ second ( ) ;
55+ } else {
56+ second ( ) ;
57+ first ( ) ;
58+ }
59+
60+ expect ( [ ...subscribers . get ( "agent:main:main" ) ] ) . toEqual ( [ ] ) ;
61+ expect ( [ ...subscribers . getForConnection ( "conn" ) ] ) . toEqual ( [ ] ) ;
62+ } ,
63+ ) ;
64+
65+ it . each ( [ "first" , "second" ] ) (
66+ "keeps the successful concurrent replay recency (%s resolution first)" ,
67+ ( firstResolution ) => {
68+ const subscribers = createSessionMessageSubscriberRegistry ( ) ;
69+ subscribers . subscribe ( "conn" , "agent:main:other" ) ;
70+ const first = subscribers . subscribe ( "conn" , "agent:main:main" , { provisional : true } ) ! ;
71+ const second = subscribers . subscribe ( "conn" , "agent:main:main" , { provisional : true } ) ! ;
72+
73+ if ( firstResolution === "first" ) {
74+ first ( ) ;
75+ second . commit ( ) ;
76+ } else {
77+ second . commit ( ) ;
78+ first ( ) ;
79+ }
80+
81+ expect ( [ ...subscribers . getForConnection ( "conn" ) ] ) . toEqual ( [
82+ "agent:main:other" ,
83+ "agent:main:main" ,
84+ ] ) ;
85+ } ,
86+ ) ;
87+
88+ it ( "retains the committed recency when a re-subscribe replay fails" , ( ) => {
4589 const subscribers = createSessionMessageSubscriberRegistry ( ) ;
90+ subscribers . subscribe ( "conn" , "agent:main:main" ) ;
91+ subscribers . subscribe ( "conn" , "agent:main:child" ) ;
92+ const rollback = subscribers . subscribe ( "conn" , "agent:main:main" , { provisional : true } ) ! ;
4693
47- const removeNew = subscribers . subscribe ( "conn-new" , "agent:main:main" , {
48- includeApprovals : true ,
49- } ) ;
50- removeNew ?.( ) ;
51- expect ( [ ...subscribers . get ( "agent:main:main" ) ] ) . toEqual ( [ ] ) ;
52- expect ( [ ...subscribers . getApprovals ( "agent:main:main" ) ] ) . toEqual ( [ ] ) ;
94+ rollback ( ) ;
5395
54- subscribers . subscribe ( "conn-plain" , "agent:main:main" ) ;
55- const restorePlain = subscribers . subscribe ( "conn-plain" , "agent:main:main" , {
56- includeApprovals : true ,
57- } ) ;
58- restorePlain ?.( ) ;
59- expect ( [ ...subscribers . get ( "agent:main:main" ) ] ) . toEqual ( [ "conn-plain" ] ) ;
60- expect ( [ ...subscribers . getApprovals ( "agent:main:main" ) ] ) . toEqual ( [ ] ) ;
96+ expect ( [ ...subscribers . getForConnection ( "conn" ) ] ) . toEqual ( [
97+ "agent:main:main" ,
98+ "agent:main:child" ,
99+ ] ) ;
100+ } ) ;
61101
62- subscribers . subscribe ( "conn-reviewer" , "agent:main:main" , { includeApprovals : true } ) ;
63- const restoreReviewer = subscribers . subscribe ( "conn-reviewer" , "agent:main:main" ) ;
64- restoreReviewer ?.( ) ;
65- expect ( [ ...subscribers . getApprovals ( "agent:main:main" ) ] ) . toEqual ( [ "conn-reviewer" ] ) ;
102+ it ( "does not restore a replay invalidated by unsubscribe" , ( ) => {
103+ const subscribers = createSessionMessageSubscriberRegistry ( ) ;
104+ const subscription = subscribers . subscribe ( "conn" , "agent:main:main" , {
105+ provisional : true ,
106+ } ) ! ;
107+
108+ subscribers . unsubscribe ( "conn" , "agent:main:main" ) ;
109+ subscription . commit ( ) ;
110+
111+ expect ( [ ...subscribers . getForConnection ( "conn" ) ] ) . toEqual ( [ ] ) ;
112+ expect ( [ ...subscribers . get ( "agent:main:main" ) ] ) . toEqual ( [ ] ) ;
66113 } ) ;
67114} ) ;
0 commit comments