Prevent multiple sha requests

This commit is contained in:
Chocobozzz 2023-07-13 10:06:28 +02:00
parent 9a26d00e5e
commit 9bc85bd2f8
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
2 changed files with 17 additions and 3 deletions

View File

@ -15,6 +15,8 @@ export class SegmentValidator {
private destroyed = false private destroyed = false
private segmentJSONPromise: Promise<SegmentsJSON>
constructor (private readonly options: { constructor (private readonly options: {
serverUrl: string serverUrl: string
segmentsSha256Url: string segmentsSha256Url: string
@ -23,15 +25,16 @@ export class SegmentValidator {
requiresPassword: boolean requiresPassword: boolean
videoPassword: () => string videoPassword: () => string
}) { }) {
} }
async validate (segment: Segment, _method: string, _peerId: string, retry = 1) { async validate (segment: Segment, _method: string, _peerId: string, retry = 1) {
if (this.destroyed) return if (this.destroyed) return
this.loadSha256SegmentsPromiseIfNeeded()
const filename = basename(removeQueryParams(segment.url)) const filename = basename(removeQueryParams(segment.url))
const segmentValue = (await this.fetchSha256Segments())[filename] const segmentValue = (await this.segmentJSONPromise)[filename]
if (!segmentValue && retry > maxRetries) { if (!segmentValue && retry > maxRetries) {
throw new Error(`Unknown segment name ${filename} in segment validator`) throw new Error(`Unknown segment name ${filename} in segment validator`)
@ -42,6 +45,8 @@ export class SegmentValidator {
await wait(500) await wait(500)
this.loadSha256SegmentsPromise()
await this.validate(segment, _method, _peerId, retry + 1) await this.validate(segment, _method, _peerId, retry + 1)
return return
@ -76,6 +81,16 @@ export class SegmentValidator {
this.destroyed = true this.destroyed = true
} }
private loadSha256SegmentsPromiseIfNeeded () {
if (this.segmentJSONPromise) return
this.loadSha256SegmentsPromise()
}
private loadSha256SegmentsPromise () {
this.segmentJSONPromise = this.fetchSha256Segments()
}
private fetchSha256Segments (): Promise<SegmentsJSON> { private fetchSha256Segments (): Promise<SegmentsJSON> {
let headers: { [ id: string ]: string } = {} let headers: { [ id: string ]: string } = {}

View File

@ -108,7 +108,6 @@ export class HLSOptionsBuilder {
if (!isSameOrigin(this.options.serverUrl, url)) return if (!isSameOrigin(this.options.serverUrl, url)) return
if (requiresPassword) xhr.setRequestHeader('x-peertube-video-password', this.options.videoPassword()) if (requiresPassword) xhr.setRequestHeader('x-peertube-video-password', this.options.videoPassword())
else xhr.setRequestHeader('Authorization', this.options.authorizationHeader()) else xhr.setRequestHeader('Authorization', this.options.authorizationHeader())
}, },