aboutsummaryrefslogblamecommitdiffhomepage
path: root/server/tests/api/live/live-rtmps.ts
blob: 378e6df3cce82ca364e9fed14ec7dff51bedd2b8 (plain) (tree)

















































































































































                                                                                               
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */

import 'mocha'
import * as chai from 'chai'
import { VideoPrivacy } from '@shared/models'
import {
  buildAbsoluteFixturePath,
  cleanupTests,
  createSingleServer,
  PeerTubeServer,
  sendRTMPStream,
  setAccessTokensToServers,
  setDefaultVideoChannel,
  stopFfmpeg,
  testFfmpegStreamError,
  waitUntilLivePublishedOnAllServers
} from '../../../../shared/extra-utils'

const expect = chai.expect

describe('Test live RTMPS', function () {
  let server: PeerTubeServer
  let rtmpUrl: string
  let rtmpsUrl: string

  async function createLiveWrapper () {
    const liveAttributes = {
      name: 'live',
      channelId: server.store.channel.id,
      privacy: VideoPrivacy.PUBLIC,
      saveReplay: false
    }

    const { uuid } = await server.live.create({ fields: liveAttributes })

    const live = await server.live.get({ videoId: uuid })
    const video = await server.videos.get({ id: uuid })

    return Object.assign(video, live)
  }

  before(async function () {
    this.timeout(120000)

    server = await createSingleServer(1)

    // Get the access tokens
    await setAccessTokensToServers([ server ])
    await setDefaultVideoChannel([ server ])

    await server.config.updateCustomSubConfig({
      newConfig: {
        live: {
          enabled: true,
          allowReplay: true,
          transcoding: {
            enabled: false
          }
        }
      }
    })

    rtmpUrl = 'rtmp://' + server.hostname + ':' + server.rtmpPort + '/live'
    rtmpsUrl = 'rtmps://' + server.hostname + ':' + server.rtmpsPort + '/live'
  })

  it('Should enable RTMPS endpoint only', async function () {
    this.timeout(240000)

    await server.kill()
    await server.run({
      live: {
        rtmp: {
          enabled: false
        },
        rtmps: {
          enabled: true,
          port: server.rtmpsPort,
          key_file: buildAbsoluteFixturePath('rtmps.key'),
          cert_file: buildAbsoluteFixturePath('rtmps.cert')
        }
      }
    })

    {
      const liveVideo = await createLiveWrapper()

      expect(liveVideo.rtmpUrl).to.not.exist
      expect(liveVideo.rtmpsUrl).to.equal(rtmpsUrl)

      const command = sendRTMPStream({ rtmpBaseUrl: rtmpUrl, streamKey: liveVideo.streamKey })
      await testFfmpegStreamError(command, true)
    }

    {
      const liveVideo = await createLiveWrapper()

      const command = sendRTMPStream({ rtmpBaseUrl: rtmpsUrl, streamKey: liveVideo.streamKey })
      await waitUntilLivePublishedOnAllServers([ server ], liveVideo.uuid)
      await stopFfmpeg(command)
    }
  })

  it('Should enable both RTMP and RTMPS', async function () {
    this.timeout(240000)

    await server.kill()
    await server.run({
      live: {
        rtmp: {
          enabled: true,
          port: server.rtmpPort
        },
        rtmps: {
          enabled: true,
          port: server.rtmpsPort,
          key_file: buildAbsoluteFixturePath('rtmps.key'),
          cert_file: buildAbsoluteFixturePath('rtmps.cert')
        }
      }
    })

    {
      const liveVideo = await createLiveWrapper()

      expect(liveVideo.rtmpUrl).to.equal(rtmpUrl)
      expect(liveVideo.rtmpsUrl).to.equal(rtmpsUrl)

      const command = sendRTMPStream({ rtmpBaseUrl: rtmpUrl, streamKey: liveVideo.streamKey })
      await waitUntilLivePublishedOnAllServers([ server ], liveVideo.uuid)
      await stopFfmpeg(command)
    }

    {
      const liveVideo = await createLiveWrapper()

      const command = sendRTMPStream({ rtmpBaseUrl: rtmpsUrl, streamKey: liveVideo.streamKey })
      await waitUntilLivePublishedOnAllServers([ server ], liveVideo.uuid)
      await stopFfmpeg(command)
    }
  })

  after(async function () {
    await cleanupTests([ server ])
  })
})