Skip to content

Make stream controllers wait for playlist updates before requesting segments from expired playlists #23383

Make stream controllers wait for playlist updates before requesting segments from expired playlists

Make stream controllers wait for playlist updates before requesting segments from expired playlists #23383

Workflow file for this run

name: Build
on:
push:
branches: [master]
tags: ['v*']
pull_request:
permissions: {}
defaults:
run:
shell: bash
jobs:
config:
runs-on: ubuntu-latest
concurrency:
group: 'build:config:${{ github.ref }}'
cancel-in-progress: true
outputs:
canUseSauce: ${{ steps.check_sauce_access.outputs.result == 'true' }}
tag: ${{ steps.extract_tag.outputs.result }}
isMainBranch: ${{ github.ref == 'refs/heads/master' }}
steps:
- name: check sauce access
id: check_sauce_access
run: |
if ! [[ -z "$SAUCE_USERNAME" ]] && ! [[ -z "$SAUCE_ACCESS_KEY" ]]; then
echo "result=true" >> $GITHUB_OUTPUT
fi
env:
CI: true
SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }}
SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }}
- name: extract tag
id: extract_tag
uses: actions/github-script@v7
with:
script: |
const prefix = 'refs/tags/';
const ref = context.ref;
return ref.startsWith(prefix) ? ref.substring(prefix.length) : '';
result-encoding: string
build:
needs: config
runs-on: ubuntu-latest
concurrency:
group: 'build:build:${{ github.ref }}'
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: check package-lock.json version
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
if (
JSON.parse(fs.readFileSync('./package-lock.json', { encoding: 'utf8' }))
.lockfileVersion !== 2
) {
throw new Error(
'Expecting package-lock.json version to be 2. Please make sure you are using npm 7.'
);
}
- name: cache node_modules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: use Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.node-version'
- name: install
run: |
npm ci
env:
CI: true
- name: lint
run: |
npm run lint
npm run prettier:verify
- name: set version
run: |
./scripts/set-package-version.sh
env:
CI: true
TAG: ${{ needs.config.outputs.tag }}
- name: build
run: |
npm run build:ci
npm run docs
./scripts/check-docs-built.sh
# check that hls.js doesn't error if requiring in node
# see https://github.com/video-dev/hls.js/pull/1642
node -e 'require("./" + require("./package.json").main)'
env:
CI: true
- name: upload build
uses: actions/upload-artifact@v4
with:
name: build
# version number is set in package.json so need to include that
path: |
package.json
package-lock.json
api-docs/**
dist/**
test_unit:
needs: build
runs-on: ubuntu-latest
concurrency:
group: 'build:test_unit:${{ github.ref }}'
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
- name: cache node_modules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: use Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.node-version'
- name: download build
uses: actions/download-artifact@v4
with:
name: build
- name: install
run: |
npm ci
env:
CI: true
- name: run unit tests
run: |
npm run test:unit
env:
CI: true
cloudflare_pages:
needs: [config, test_unit]
if: needs.config.outputs.tag || needs.config.outputs.isMainBranch == 'true'
runs-on: ubuntu-latest
concurrency:
group: 'build:cloudflare_pages:${{ github.ref }}'
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
- name: cache node_modules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: use Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.node-version'
- name: download build
uses: actions/download-artifact@v4
with:
name: build
- name: install
run: |
npm ci
env:
CI: true
- name: build for CloudFlare
run: |
./scripts/build-cloudflare.sh
env:
CI: true
- name: deploy to CloudFlare
run: |
./scripts/deploy-cloudflare.sh
env:
CI: true
GITHUB_TOKEN: ${{ secrets.CI_GITHUB_TOKEN }}
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
update_draft_release:
needs: [config, test_unit]
if: needs.config.outputs.tag
runs-on: ubuntu-latest
concurrency:
group: 'build:update_draft_release:${{ github.ref }}'
cancel-in-progress: true
outputs:
upload_url: ${{ steps.draft_release.outputs.upload_url }}
permissions:
contents: write
steps:
- name: draft release notes
id: draft_release
uses: tjenkinson/release-drafter@48835fbc42b1c062a828995f9cb8301e6bdae677
with:
tag: ${{ needs.config.outputs.tag }}
name: ${{ needs.config.outputs.tag }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
release_github:
needs: [config, test_unit, update_draft_release]
if: needs.config.outputs.tag
runs-on: ubuntu-latest
concurrency:
group: 'build:release_github:${{ github.ref }}'
cancel-in-progress: true
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: use Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.node-version'
- name: download build
uses: actions/download-artifact@v4
with:
name: build
- name: build release zip
run: |
zip -r dist.zip dist
- name: upload assets to github release
uses: actions/upload-release-asset@v1
with:
upload_url: ${{ needs.update_draft_release.outputs.upload_url }}
asset_path: dist.zip
asset_name: release.zip
asset_content_type: application/zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
release_npm:
needs: [config, test_unit]
if: needs.config.outputs.tag || needs.config.outputs.isMainBranch == 'true'
runs-on: ubuntu-latest
concurrency:
group: 'build:release_npm:${{ github.ref }}'
cancel-in-progress: true
permissions:
id-token: write
steps:
- uses: actions/checkout@v4
- name: cache node_modules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: use Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.node-version'
- name: download build
uses: actions/download-artifact@v4
with:
name: build
- name: install
run: |
npm ci
env:
CI: true
- name: publish to npm
run: |
./scripts/publish-npm.sh
env:
CI: true
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
TAG: ${{ needs.config.outputs.tag }}
test_functional_required:
needs: [config, test_unit]
if: needs.config.outputs.canUseSauce == 'true'
runs-on: ubuntu-latest
concurrency:
group: 'build:test_functional_required:${{ matrix.config }}:${{ github.ref }}'
cancel-in-progress: true
name: test_functional_required (${{ matrix.config }})
strategy:
fail-fast: true
max-parallel: 8
matrix:
include:
- config: chrome-win_10
ua: chrome
os: Windows 10
- config: chrome-osx_10.11-79.0
ua: chrome
os: OS X 10.11
uaVersion: '79.0'
- config: chrome-win_7-75.0
ua: chrome
os: Windows 7
uaVersion: '75.0'
steps:
- uses: actions/checkout@v4
- name: cache node_modules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: use Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.node-version'
- name: download build
uses: actions/download-artifact@v4
with:
name: build
- name: start SauceConnect tunnel
uses: saucelabs/sauce-connect-action@270345f214aca56f55c678ca59e626dfd43da153 #v2
with:
username: ${{ secrets.SAUCE_USERNAME }}
accessKey: ${{ secrets.SAUCE_ACCESS_KEY }}
tunnelIdentifier: ${{ github.run_id }}-${{ matrix.config }}
retryTimeout: 300
- name: install
run: |
npm ci
env:
CI: true
- name: run functional tests
run: |
npm run test:func
npm run test:func:light
env:
CI: true
SAUCE_TUNNEL_ID: ${{ github.run_id }}-${{ matrix.config }}
SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }}
SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }}
UA: ${{ matrix.ua }}
UA_VERSION: ${{ matrix.uaVersion }}
OS: ${{ matrix.os }}
test_functional_optional:
needs: test_functional_required
runs-on: ubuntu-latest
concurrency:
group: 'build:test_functional_optional:${{ matrix.config }}:${{ github.ref }}'
cancel-in-progress: true
continue-on-error: true
name: test_functional_optional (${{ matrix.config }})
strategy:
fail-fast: false
max-parallel: 8
matrix:
include:
- config: safari-macOS_13
ua: safari
os: macOS 13
- config: firefox-win_10
ua: firefox
os: Windows 10
steps:
- uses: actions/checkout@v4
- name: cache node_modules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: use Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.node-version'
- name: download build
uses: actions/download-artifact@v4
with:
name: build
- name: start SauceConnect tunnel
uses: saucelabs/sauce-connect-action@270345f214aca56f55c678ca59e626dfd43da153 #v2
with:
username: ${{ secrets.SAUCE_USERNAME }}
accessKey: ${{ secrets.SAUCE_ACCESS_KEY }}
tunnelIdentifier: ${{ github.run_id }}-${{ matrix.config }}
retryTimeout: 300
- name: install
run: |
npm ci
env:
CI: true
- name: run functional tests
run: |
npm run test:func
env:
CI: true
SAUCE_TUNNEL_ID: ${{ github.run_id }}-${{ matrix.config }}
SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }}
SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }}
UA: ${{ matrix.ua }}
UA_VERSION: ${{ matrix.uaVersion }}
OS: ${{ matrix.os }}