diff --git a/src/sdp.ts b/src/sdp.ts index 8c3b6c6..56d8756 100644 --- a/src/sdp.ts +++ b/src/sdp.ts @@ -7,6 +7,10 @@ import type { HashCode, HashName } from 'multihashes' import { inappropriateMultiaddr, invalidArgument, invalidFingerprint, unsupportedHashAlgorithm } from './error.js' import { CERTHASH_CODE } from './transport.js' +// import { detect } from 'detect-browser' + +// const browser = detect() + const log = logger('libp2p:webrtc:sdp') /** @@ -15,6 +19,23 @@ const log = logger('libp2p:webrtc:sdp') // @ts-expect-error - Not easy to combine these types. export const mbdecoder: any = Object.values(bases).map(b => b.decoder).reduce((d, b) => d.or(b)) +export function getLocalFingerprint (pc: RTCPeerConnection): string | undefined { + const localDescription = pc.localDescription + if (localDescription == null) { + return undefined + } + return getFingerprintFromSdp(localDescription.sdp) +} + +const fingerprintRegex = /^a=fingerprint:(?:\w+-[0-9]+)\s(?(:?[0-9a-fA-F]{2})+)$/gm +function getFingerprintFromSdp (sdp: string): string | undefined { + const searchResult = fingerprintRegex.exec(sdp) + if (searchResult == null) { + return '' + } + + return searchResult.groups?.fingerprint +} /** * Get base2 | identity decoders */ diff --git a/src/transport.ts b/src/transport.ts index 6c6a452..a951ec9 100644 --- a/src/transport.ts +++ b/src/transport.ts @@ -211,19 +211,12 @@ export class WebRTCDirectTransport implements Transport { throw invalidArgument('no local certificate') } - const localCert = pc.getConfiguration().certificates?.at(0) - - if (localCert === undefined || localCert.getFingerprints().length === 0) { - throw invalidArgument('no fingerprint on local certificate') - } - - const localFingerprint = localCert.getFingerprints()[0] - - if (localFingerprint.value === undefined) { - throw invalidArgument('no fingerprint on local certificate') + const localFingerprint = sdp.getLocalFingerprint(pc) + if (localFingerprint == null) { + throw invalidArgument('no local fingerprint found') } - const localFpString = localFingerprint.value.replace(/:/g, '') + const localFpString = localFingerprint.toLowerCase().replaceAll(':', '') const localFpArray = uint8arrayFromString(localFpString, 'hex') const local = multihashes.encode(localFpArray, hashCode) const remote: Uint8Array = sdp.mbdecoder.decode(sdp.certhash(ma))