1+ import type { DirectStreamAckRouteHint } from "@peerbit/stream-interface" ;
2+
13export const MAX_ROUTE_DISTANCE = Number . MAX_SAFE_INTEGER - 1 ;
24
35const DEFAULT_MAX_FROM_ENTRIES = 2048 ;
@@ -7,6 +9,7 @@ const DEFAULT_MAX_RELAYS_PER_TARGET = 32;
79type RelayInfo = {
810 session : number ;
911 hash : string ;
12+ updatedAt : number ;
1013 expireAt ?: number ;
1114 distance : number ;
1215} ;
@@ -257,6 +260,7 @@ export class Routes {
257260 if ( route . distance > distance ) {
258261 route . distance = distance ;
259262 route . session = session ;
263+ route . updatedAt = + new Date ( ) ;
260264 route . expireAt = undefined ; // remove expiry since we updated
261265 sortRoutes ( prev . list ) ;
262266 if ( prev . list . length > this . maxRelaysPerTarget ) {
@@ -267,6 +271,7 @@ export class Routes {
267271 return isNewRemoteSession ? "restart" : "updated" ;
268272 } else if ( route . distance === distance ) {
269273 route . session = session ;
274+ route . updatedAt = + new Date ( ) ;
270275 route . expireAt = undefined ; // remove expiry since we updated
271276 if ( prev . list . length > this . maxRelaysPerTarget ) {
272277 prev . list . length = this . maxRelaysPerTarget ;
@@ -290,6 +295,7 @@ export class Routes {
290295 distance,
291296 session,
292297 hash : neighbour ,
298+ updatedAt : + new Date ( ) ,
293299 expireAt : isOldSession
294300 ? + new Date ( ) + this . routeMaxRetentionPeriod
295301 : undefined ,
@@ -364,6 +370,38 @@ export class Routes {
364370 return this . routes . get ( from ) ?. get ( target ) ;
365371 }
366372
373+ getRouteHints ( from : string , target : string ) : DirectStreamAckRouteHint [ ] {
374+ const route = this . routes . get ( from ) ?. get ( target ) ;
375+ if ( ! route ) {
376+ return [ ] ;
377+ }
378+ const now = Date . now ( ) ;
379+ const out : DirectStreamAckRouteHint [ ] = [ ] ;
380+ for ( const next of route . list ) {
381+ if ( next . expireAt != null && next . expireAt < now ) {
382+ continue ;
383+ }
384+ out . push ( {
385+ kind : "directstream-ack" ,
386+ from,
387+ target,
388+ nextHop : next . hash ,
389+ distance : next . distance ,
390+ session : next . session ,
391+ updatedAt : next . updatedAt ,
392+ expiresAt : next . expireAt ,
393+ } ) ;
394+ }
395+ return out ;
396+ }
397+
398+ getBestRouteHint (
399+ from : string ,
400+ target : string ,
401+ ) : DirectStreamAckRouteHint | undefined {
402+ return this . getRouteHints ( from , target ) [ 0 ] ;
403+ }
404+
367405 isReachable ( from : string , target : string , maxDistance = MAX_ROUTE_DISTANCE ) {
368406 const remoteInfo = this . remoteInfo . get ( target ) ;
369407 const routeInfo = this . routes . get ( from ) ?. get ( target ) ;
0 commit comments