Skip to content

Commit 3accde8

Browse files
committed
Simplify fingerprint fallback path
1 parent e0f93c6 commit 3accde8

1 file changed

Lines changed: 59 additions & 56 deletions

File tree

cli/src/utils/fingerprint.ts

Lines changed: 59 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const BASE64URL_ALPHABET =
3030
type RandomValuesProvider = {
3131
getRandomValues: (bytes: Uint8Array) => Uint8Array
3232
}
33-
type FingerprintLogLevel = 'debug' | 'info' | 'warn' | 'error'
33+
type FingerprintLogLevel = 'debug' | 'info' | 'warn'
3434

3535
function 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

Comments
 (0)