Prevent multiple sha requests
This commit is contained in:
parent
9a26d00e5e
commit
9bc85bd2f8
|
@ -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 } = {}
|
||||||
|
|
||||||
|
|
|
@ -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())
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue