@@ -109,6 +109,7 @@ const SERVER_CONFIG: ServerConfigType = {
109109 serverVersion : "0.0.0-test" ,
110110 capabilities : {
111111 repositoryIdentity : true ,
112+ connectionProbe : true ,
112113 } ,
113114 } ,
114115 auth : {
@@ -141,6 +142,16 @@ const decodeJson = Schema.decodeUnknownSync(Schema.UnknownFromJsonString);
141142const decodeRpcRequest = Schema . decodeUnknownSync ( RpcRequest ) ;
142143const encodeJson = Schema . encodeUnknownSync ( Schema . UnknownFromJsonString ) ;
143144const encodeServerConfig = Schema . encodeSync ( ServerConfig ) ;
145+ const ENCODED_SERVER_CONFIG = encodeServerConfig ( SERVER_CONFIG ) ;
146+ const LEGACY_SERVER_CONFIG = {
147+ ...ENCODED_SERVER_CONFIG ,
148+ environment : {
149+ ...ENCODED_SERVER_CONFIG . environment ,
150+ capabilities : {
151+ repositoryIdentity : true ,
152+ } ,
153+ } ,
154+ } ;
144155
145156const makeFactory = Effect . fn ( "TestRpcSessionFactory.make" ) ( function * ( ) {
146157 const sockets : TestWebSocket [ ] = [ ] ;
@@ -169,9 +180,10 @@ const awaitSocket = Effect.fn("TestRpcSessionFactory.awaitSocket")(function* (
169180
170181const awaitRequest = Effect . fn ( "TestRpcSessionFactory.awaitRequest" ) ( function * (
171182 socket : TestWebSocket ,
183+ index = 0 ,
172184) {
173185 for ( let attempt = 0 ; attempt < 100 ; attempt += 1 ) {
174- const request = socket . sent [ 0 ] ;
186+ const request = socket . sent [ index ] ;
175187 if ( request ) {
176188 return decodeRpcRequest ( decodeJson ( request ) ) ;
177189 }
@@ -182,6 +194,7 @@ const awaitRequest = Effect.fn("TestRpcSessionFactory.awaitRequest")(function* (
182194
183195const completeInitialConfig = Effect . fn ( "TestRpcSessionFactory.completeInitialConfig" ) ( function * (
184196 socket : TestWebSocket ,
197+ config : unknown = ENCODED_SERVER_CONFIG ,
185198) {
186199 const request = yield * awaitRequest ( socket ) ;
187200 expect ( request ) . toMatchObject ( {
@@ -195,7 +208,7 @@ const completeInitialConfig = Effect.fn("TestRpcSessionFactory.completeInitialCo
195208 requestId : request . id ,
196209 exit : {
197210 _tag : "Success" ,
198- value : encodeServerConfig ( SERVER_CONFIG ) ,
211+ value : config ,
199212 } ,
200213 } ) ,
201214 ) ;
@@ -218,6 +231,30 @@ describe("RpcSessionFactory", () => {
218231 expect ( config ) . toEqual ( SERVER_CONFIG ) ;
219232 expect ( socket . sent ) . toHaveLength ( 1 ) ;
220233
234+ const probeFiber = yield * Effect . forkChild ( session . probe ) ;
235+ const probeRequest = yield * awaitRequest ( socket , 1 ) ;
236+ expect ( probeRequest ) . toMatchObject ( {
237+ _tag : "Request" ,
238+ tag : WS_METHODS . serverProbe ,
239+ payload : { } ,
240+ } ) ;
241+ socket . serverMessage (
242+ encodeJson ( {
243+ _tag : "Exit" ,
244+ requestId : probeRequest . id ,
245+ exit : {
246+ _tag : "Success" ,
247+ value : { } ,
248+ } ,
249+ } ) ,
250+ ) ;
251+ yield * Fiber . join ( probeFiber ) ;
252+
253+ expect ( socket . sent . map ( ( request ) => decodeRpcRequest ( decodeJson ( request ) ) . tag ) ) . toEqual ( [
254+ WS_METHODS . serverGetConfig ,
255+ WS_METHODS . serverProbe ,
256+ ] ) ;
257+
221258 socket . close ( 1012 , "service restart" ) ;
222259 const error = yield * Effect . flip ( session . closed ) ;
223260
@@ -250,6 +287,45 @@ describe("RpcSessionFactory", () => {
250287 } ) ,
251288 ) ;
252289
290+ it . effect ( "uses the legacy config RPC for probes when the server lacks the capability" , ( ) =>
291+ Effect . scoped (
292+ Effect . gen ( function * ( ) {
293+ const { factory, sockets } = yield * makeFactory ( ) ;
294+ const session = yield * factory . connect ( PREPARED ) ;
295+ const readyFiber = yield * Effect . forkChild ( session . ready ) ;
296+ const socket = yield * awaitSocket ( sockets ) ;
297+
298+ socket . open ( ) ;
299+ yield * completeInitialConfig ( socket , LEGACY_SERVER_CONFIG ) ;
300+ yield * Fiber . join ( readyFiber ) ;
301+
302+ const probeFiber = yield * Effect . forkChild ( session . probe ) ;
303+ const probeRequest = yield * awaitRequest ( socket , 1 ) ;
304+ expect ( probeRequest ) . toMatchObject ( {
305+ _tag : "Request" ,
306+ tag : WS_METHODS . serverGetConfig ,
307+ payload : { } ,
308+ } ) ;
309+ socket . serverMessage (
310+ encodeJson ( {
311+ _tag : "Exit" ,
312+ requestId : probeRequest . id ,
313+ exit : {
314+ _tag : "Success" ,
315+ value : LEGACY_SERVER_CONFIG ,
316+ } ,
317+ } ) ,
318+ ) ;
319+ yield * Fiber . join ( probeFiber ) ;
320+
321+ expect ( socket . sent . map ( ( request ) => decodeRpcRequest ( decodeJson ( request ) ) . tag ) ) . toEqual ( [
322+ WS_METHODS . serverGetConfig ,
323+ WS_METHODS . serverGetConfig ,
324+ ] ) ;
325+ } ) ,
326+ ) ,
327+ ) ;
328+
253329 it . effect ( "fails readiness when the websocket never opens" , ( ) =>
254330 Effect . gen ( function * ( ) {
255331 const { factory, sockets } = yield * makeFactory ( ) ;
0 commit comments