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