1- import { createHash } from 'node:crypto' ;
2-
31import type {
42 RandomPartnerListConfig ,
53 Partners ,
64} from '#site/types/partners.js' ;
75
86// Fisher-Yates shuffle algorithm with a seed for deterministic results
9- function shuffle ( array : Array < Partners > , seed : number ) : Array < Partners > {
7+ async function shuffle (
8+ array : Array < Partners > ,
9+ seed : number
10+ ) : Promise < Array < Partners > > {
1011 const shuffled = [ ...array ] ;
11- const hash = createHash ( 'sha256' ) . update ( String ( seed ) ) . digest ( ) ;
12+ const encoder = new TextEncoder ( ) ;
13+ const buffer = encoder . encode ( String ( seed ) ) ;
14+ const hashBuffer = await crypto . subtle . digest ( 'SHA-256' , buffer ) ;
15+ const hash = new Uint8Array ( hashBuffer ) ;
1216
1317 for ( let i = shuffled . length - 1 ; i > 0 ; i -- ) {
1418 // Use hash bytes to generate deterministic "random" index
@@ -23,10 +27,10 @@ function shuffle(array: Array<Partners>, seed: number): Array<Partners> {
2327 return shuffled ;
2428}
2529
26- function randomPartnerList (
30+ async function randomPartnerList (
2731 partners : Array < Partners > ,
2832 config : RandomPartnerListConfig
29- ) {
33+ ) : Promise < Array < Partners > > {
3034 const { pick = 4 , dateSeed = 5 , category } = config ;
3135
3236 // Generate a deterministic seed based on current time that changes every X minutes
@@ -37,7 +41,9 @@ function randomPartnerList(
3741 ? partners . filter ( p => p . categories . includes ( category ) )
3842 : partners ;
3943
40- return shuffle ( filtered , seed ) . slice ( 0 , pick ?? filtered . length ) ;
44+ const shuffled = await shuffle ( filtered , seed ) ;
45+
46+ return shuffled . slice ( 0 , pick ?? filtered . length ) ;
4147}
4248
4349export { randomPartnerList } ;
0 commit comments