p2p-media-loader-core
Version:
P2P Media Loader core functionality
40 lines (31 loc) • 1.45 kB
text/typescript
import { sha1 } from "./hash.js";
import { PACKAGE_VERSION } from "./version.js";
export const TRACKER_CLIENT_VERSION_PREFIX = `-PM${formatVersion(PACKAGE_VERSION)}-`;
const HASH_SYMBOLS =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
const PEER_ID_LENGTH = 20;
export function getStreamHash(streamId: string): string {
// A BitTorrent tracker `infoHash` MUST be exactly 20 bytes.
// We take 15 bytes of the binary SHA-1 and encode it to Base64.
// This produces exactly a 20-character ASCII string (no padding).
// In this codebase, the tracker client uses utf8ToUintArray() on this string,
// so it correctly receives exactly 20 bytes. Note: this is a 20-byte ASCII
// representation, not a standard 20-byte binary SHA-1 infoHash.
return btoa(sha1(streamId).slice(0, 15));
}
export function generatePeerId(trackerClientVersionPrefix: string): string {
const trackerClientId = [trackerClientVersionPrefix];
const randomCharsCount = PEER_ID_LENGTH - trackerClientVersionPrefix.length;
for (let i = 0; i < randomCharsCount; i++) {
trackerClientId.push(
HASH_SYMBOLS[Math.floor(Math.random() * HASH_SYMBOLS.length)],
);
}
return trackerClientId.join("");
}
function formatVersion(versionString: string) {
const splittedVersion = versionString.split(".");
const v0 = `00${splittedVersion[0]}`.slice(-2);
const v1 = `00${splittedVersion[1]}`.slice(-2);
return `${v0}${v1}`;
}