@@ -10,6 +10,8 @@ import { getJWT } from './utils/jwt.js'
10
10
import { parseUrl , addHttpPrefix } from './utils/url.js'
11
11
import { isBrowserContext } from './utils/runtime.js'
12
12
13
+ const MAX_NODE_WEIGHT = 100
14
+
13
15
export class Saturn {
14
16
static nodesListKey = 'saturn-nodes'
15
17
/**
@@ -369,6 +371,29 @@ export class Saturn {
369
371
}
370
372
}
371
373
374
+ _sortNodes ( nodes ) {
375
+ // Determine the maximum distance for normalization
376
+ const maxDistance = Math . max ( ...nodes . map ( node => node . distance ) )
377
+
378
+ // These weights determine how important each factor is in determining
379
+ const distanceImportanceFactor = 0.8
380
+ const weightImportanceFactor = 1 - distanceImportanceFactor
381
+
382
+ return nodes . slice ( ) . sort ( ( a , b ) => {
383
+ const normalizedDistanceA = a . distance / maxDistance
384
+ const normalizedDistanceB = b . distance / maxDistance
385
+ const normalizedWeightA = a . weight / MAX_NODE_WEIGHT
386
+ const normalizedWeightB = b . weight / MAX_NODE_WEIGHT
387
+
388
+ const metricA =
389
+ distanceImportanceFactor * normalizedDistanceA - weightImportanceFactor * normalizedWeightA
390
+ const metricB =
391
+ distanceImportanceFactor * normalizedDistanceB - weightImportanceFactor * normalizedWeightB
392
+
393
+ return metricA - metricB
394
+ } )
395
+ }
396
+
372
397
async _loadNodes ( opts ) {
373
398
let origin = opts . orchURL
374
399
@@ -407,6 +432,7 @@ export class Saturn {
407
432
}
408
433
// we always want to update from the orchestrator regardless.
409
434
nodes = await orchNodesListPromise
435
+ nodes = this . _sortNodes ( nodes )
410
436
this . nodes = nodes
411
437
this . storage ?. set ( Saturn . nodesListKey , nodes )
412
438
}
0 commit comments