@@ -30,7 +30,7 @@ const BASE64URL_ALPHABET =
3030type RandomValuesProvider = {
3131 getRandomValues : ( bytes : Uint8Array ) => Uint8Array
3232}
33- type FingerprintLogLevel = 'debug' | 'info' | 'warn' | 'error'
33+ type FingerprintLogLevel = 'debug' | 'info' | 'warn'
3434
3535function logFingerprint (
3636 level : FingerprintLogLevel ,
@@ -169,47 +169,63 @@ function calculateLegacyFingerprint(): string {
169169 return `codebuff-cli-${ randomSuffix } `
170170}
171171
172- export function generateLegacyFingerprintSuffix (
173- randomByteSource : ( byteCount : number ) => Uint8Array = randomBytes ,
174- randomValuesProvider : RandomValuesProvider | undefined = globalThis . crypto ,
175- ) : string {
172+ function encodeLegacyFingerprintSuffix ( bytes : Uint8Array ) : string {
173+ return Buffer . from ( bytes )
174+ . toString ( 'base64url' )
175+ . substring ( 0 , LEGACY_FINGERPRINT_SUFFIX_LENGTH )
176+ }
177+
178+ function tryGenerateLegacyFingerprintSuffix (
179+ readBytes : ( ) => Uint8Array ,
180+ warning : string ,
181+ ) : string | null {
176182 try {
177- return Buffer . from ( randomByteSource ( LEGACY_FINGERPRINT_RANDOM_BYTES ) )
178- . toString ( 'base64url' )
179- . substring ( 0 , LEGACY_FINGERPRINT_SUFFIX_LENGTH )
183+ return encodeLegacyFingerprintSuffix ( readBytes ( ) )
180184 } catch ( err ) {
181185 logFingerprint (
182186 'warn' ,
183187 {
184188 errorMessage : err instanceof Error ? err . message : String ( err ) ,
185189 } ,
186- 'Node crypto randomBytes failed for legacy fingerprint suffix' ,
190+ warning ,
187191 )
192+ return null
188193 }
194+ }
189195
190- try {
191- if ( randomValuesProvider ) {
192- const bytes = new Uint8Array ( LEGACY_FINGERPRINT_RANDOM_BYTES )
193- randomValuesProvider . getRandomValues ( bytes )
194- return Buffer . from ( bytes )
195- . toString ( 'base64url' )
196- . substring ( 0 , LEGACY_FINGERPRINT_SUFFIX_LENGTH )
197- }
198- } catch ( err ) {
199- logFingerprint (
200- 'warn' ,
201- {
202- errorMessage : err instanceof Error ? err . message : String ( err ) ,
196+ function generateMathRandomSuffix ( ) : string {
197+ return Array . from ( { length : LEGACY_FINGERPRINT_SUFFIX_LENGTH } , ( ) => {
198+ return BASE64URL_ALPHABET [ Math . floor ( Math . random ( ) * BASE64URL_ALPHABET . length ) ]
199+ } ) . join ( '' )
200+ }
201+
202+ export function generateLegacyFingerprintSuffix (
203+ randomByteSource : ( byteCount : number ) => Uint8Array = randomBytes ,
204+ randomValuesProvider : RandomValuesProvider | undefined = globalThis . crypto ,
205+ ) : string {
206+ const nodeSuffix = tryGenerateLegacyFingerprintSuffix (
207+ ( ) => randomByteSource ( LEGACY_FINGERPRINT_RANDOM_BYTES ) ,
208+ 'Node crypto randomBytes failed for legacy fingerprint suffix' ,
209+ )
210+ if ( nodeSuffix ) {
211+ return nodeSuffix
212+ }
213+
214+ if ( randomValuesProvider ) {
215+ const webCryptoSuffix = tryGenerateLegacyFingerprintSuffix (
216+ ( ) => {
217+ const bytes = new Uint8Array ( LEGACY_FINGERPRINT_RANDOM_BYTES )
218+ randomValuesProvider . getRandomValues ( bytes )
219+ return bytes
203220 } ,
204221 'Web Crypto getRandomValues failed for legacy fingerprint suffix' ,
205222 )
223+ if ( webCryptoSuffix ) {
224+ return webCryptoSuffix
225+ }
206226 }
207227
208- let suffix = ''
209- for ( let i = 0 ; i < LEGACY_FINGERPRINT_SUFFIX_LENGTH ; i ++ ) {
210- suffix += BASE64URL_ALPHABET [ Math . floor ( Math . random ( ) * BASE64URL_ALPHABET . length ) ]
211- }
212- return suffix
228+ return generateMathRandomSuffix ( )
213229}
214230
215231/**
@@ -266,35 +282,22 @@ export async function calculateFingerprint(): Promise<string> {
266282 'Enhanced CLI fingerprinting failed, using legacy fallback' ,
267283 )
268284
269- try {
270- const fingerprint = calculateLegacyFingerprint ( )
271- logFingerprint (
272- 'debug' ,
273- {
274- fingerprintType : 'legacy_fallback' ,
275- fingerprintId : fingerprint ,
276- } ,
277- 'Legacy fingerprint generated successfully as fallback' ,
278- )
279- trackFingerprintGenerated ( {
280- fingerprintType : 'legacy' ,
281- success : true ,
282- fallbackReason :
283- enhancedError instanceof Error ? enhancedError . message : 'unknown' ,
284- } )
285- return fingerprint
286- } catch ( legacyError ) {
287- logFingerprint (
288- 'error' ,
289- {
290- errorMessage :
291- legacyError instanceof Error ? legacyError . message : String ( legacyError ) ,
292- fingerprintType : 'failed' ,
293- } ,
294- 'Both enhanced and legacy fingerprint generation failed' ,
295- )
296- throw new Error ( 'Fingerprint generation failed' )
297- }
285+ const fingerprint = calculateLegacyFingerprint ( )
286+ logFingerprint (
287+ 'debug' ,
288+ {
289+ fingerprintType : 'legacy_fallback' ,
290+ fingerprintId : fingerprint ,
291+ } ,
292+ 'Legacy fingerprint generated successfully as fallback' ,
293+ )
294+ trackFingerprintGenerated ( {
295+ fingerprintType : 'legacy' ,
296+ success : true ,
297+ fallbackReason :
298+ enhancedError instanceof Error ? enhancedError . message : 'unknown' ,
299+ } )
300+ return fingerprint
298301 }
299302}
300303
0 commit comments