X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=shared%2Fextra-utils%2Fserver%2Fserver.ts;h=9da2938772fdb904f7a6d37fe4c6778ae55d2c37;hb=f307255e694d290c346749bff68545d5dfc581cf;hp=cc6df2efe4dc1957c8b94dbd0563ba314eddd0c4;hpb=08642a765ea514a00f159db898edf14c376fbe6c;p=github%2FChocobozzz%2FPeerTube.git diff --git a/shared/extra-utils/server/server.ts b/shared/extra-utils/server/server.ts index cc6df2efe..9da293877 100644 --- a/shared/extra-utils/server/server.ts +++ b/shared/extra-utils/server/server.ts @@ -2,8 +2,8 @@ import { ChildProcess, fork } from 'child_process' import { copy } from 'fs-extra' import { join } from 'path' import { root } from '@server/helpers/core-utils' -import { randomInt } from '../../core-utils/miscs/miscs' -import { VideoChannel } from '../../models/videos' +import { randomInt } from '@shared/core-utils' +import { Video, VideoChannel, VideoCreateResult, VideoDetails } from '../../models/videos' import { BulkCommand } from '../bulk' import { CLICommand } from '../cli' import { CustomPagesCommand } from '../custom-pages' @@ -38,10 +38,13 @@ import { PluginsCommand } from './plugins-command' import { RedundancyCommand } from './redundancy-command' import { ServersCommand } from './servers-command' import { StatsCommand } from './stats-command' +import { ObjectStorageCommand } from './object-storage-command' export type RunServerOptions = { hideLogs?: boolean - execArgv?: string[] + nodeArgs?: string[] + peertubeArgs?: string[] + env?: { [ id: string ]: string } } export class PeerTubeServer { @@ -53,6 +56,7 @@ export class PeerTubeServer { port?: number rtmpPort?: number + rtmpsPort?: number parallel?: boolean internalServerNumber: number @@ -74,19 +78,9 @@ export class PeerTubeServer { channel?: VideoChannel - video?: { - id: number - uuid: string - shortUUID: string - name?: string - url?: string - - account?: { - name: string - } - - embedPath?: string - } + video?: Video + videoCreated?: VideoCreateResult + videoDetails?: VideoDetails videos?: { id: number, uuid: string }[] } @@ -130,6 +124,7 @@ export class PeerTubeServer { servers?: ServersCommand login?: LoginCommand users?: UsersCommand + objectStorage?: ObjectStorageCommand videos?: VideosCommand constructor (options: { serverNumber: number } | { url: string }) { @@ -160,6 +155,7 @@ export class PeerTubeServer { this.internalServerNumber = this.parallel ? this.randomServer() : this.serverNumber this.rtmpPort = this.parallel ? this.randomRTMP() : 1936 + this.rtmpsPort = this.parallel ? this.randomRTMP() : 1937 this.port = 9000 + this.internalServerNumber this.url = `http://localhost:${this.port}` @@ -176,13 +172,13 @@ export class PeerTubeServer { this.port = parseInt(parsed.port) } - async flushAndRun (configOverride?: Object, args = [], options: RunServerOptions = {}) { + async flushAndRun (configOverride?: Object, options: RunServerOptions = {}) { await ServersCommand.flushTests(this.internalServerNumber) - return this.run(configOverride, args, options) + return this.run(configOverride, options) } - async run (configOverrideArg?: any, args = [], options: RunServerOptions = {}) { + async run (configOverrideArg?: any, options: RunServerOptions = {}) { // These actions are async so we need to be sure that they have both been done const serverRunString = { 'HTTP server listening': false @@ -211,24 +207,45 @@ export class PeerTubeServer { env['NODE_APP_INSTANCE'] = this.internalServerNumber.toString() env['NODE_CONFIG'] = JSON.stringify(configOverride) + if (options.env) { + Object.assign(env, options.env) + } + const forkOptions = { silent: true, env, detached: true, - execArgv: options.execArgv || [] + execArgv: options.nodeArgs || [] } - return new Promise(res => { + return new Promise((res, rej) => { const self = this + let aggregatedLogs = '' + + this.app = fork(join(root(), 'dist', 'server.js'), options.peertubeArgs || [], forkOptions) + + const onPeerTubeExit = () => rej(new Error('Process exited:\n' + aggregatedLogs)) + const onParentExit = () => { + if (!this.app || !this.app.pid) return + + try { + process.kill(self.app.pid) + } catch { /* empty */ } + } + + this.app.on('exit', onPeerTubeExit) + process.on('exit', onParentExit) - this.app = fork(join(root(), 'dist', 'server.js'), args, forkOptions) this.app.stdout.on('data', function onStdout (data) { let dontContinue = false + const log: string = data.toString() + aggregatedLogs += log + // Capture things if we want to for (const key of Object.keys(regexps)) { const regexp = regexps[key] - const matches = data.toString().match(regexp) + const matches = log.match(regexp) if (matches !== null) { if (key === 'client_id') self.store.client.id = matches[1] else if (key === 'client_secret') self.store.client.secret = matches[1] @@ -239,7 +256,7 @@ export class PeerTubeServer { // Check if all required sentences are here for (const key of Object.keys(serverRunString)) { - if (data.toString().indexOf(key) !== -1) serverRunString[key] = true + if (log.includes(key)) serverRunString[key] = true if (serverRunString[key] === false) dontContinue = true } @@ -247,17 +264,13 @@ export class PeerTubeServer { if (dontContinue === true) return if (options.hideLogs === false) { - console.log(data.toString()) + console.log(log) } else { + process.removeListener('exit', onParentExit) self.app.stdout.removeListener('data', onStdout) + self.app.removeListener('exit', onPeerTubeExit) } - process.on('exit', () => { - try { - process.kill(self.server.app.pid) - } catch { /* empty */ } - }) - res() }) }) @@ -313,6 +326,7 @@ export class PeerTubeServer { }, storage: { tmp: `test${this.internalServerNumber}/tmp/`, + bin: `test${this.internalServerNumber}/bin/`, avatars: `test${this.internalServerNumber}/avatars/`, videos: `test${this.internalServerNumber}/videos/`, streaming_playlists: `test${this.internalServerNumber}/streaming-playlists/`, @@ -374,5 +388,6 @@ export class PeerTubeServer { this.login = new LoginCommand(this) this.users = new UsersCommand(this) this.videos = new VideosCommand(this) + this.objectStorage = new ObjectStorageCommand(this) } }