From: Chocobozzz Date: Mon, 12 Jun 2017 19:06:32 +0000 (+0200) Subject: Convert scripts to typescript X-Git-Tag: v0.0.1-alpha~413 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=75d612ce3ca9d6f69fe8e4e83dc3070d9ab56615;p=oweals%2Fpeertube.git Convert scripts to typescript --- diff --git a/package.json b/package.json index 83ea17638..095d380bf 100644 --- a/package.json +++ b/package.json @@ -28,14 +28,14 @@ "danger:clean:dev": "scripty", "danger:clean:prod": "scripty", "danger:clean:modules": "scripty", - "reset-password": "scripty", + "reset-password": "ts-node ./scripts/reset-password.ts", "play": "scripty", "dev:server": "scripty", "dev:client": "scripty", "start": "node dist/server", - "check": "scripty", + "check": "ts-node ./scripts/check.ts", "upgrade": "scripty", - "update-host": "scripty", + "update-host": "ts-node ./scripts/update-host.ts", "test": "scripty", "help": "scripty", "postinstall": "cd client && yarn install", @@ -85,6 +85,7 @@ "@types/async": "^2.0.40", "@types/bcrypt": "^1.0.0", "@types/body-parser": "^1.16.3", + "@types/commander": "^2.9.1", "@types/config": "^0.0.32", "@types/express": "^4.0.35", "@types/lodash": "^4.14.64", diff --git a/scripts/check.js b/scripts/check.js deleted file mode 100755 index 3ccfbb3b2..000000000 --- a/scripts/check.js +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/env node - -'use strict' - -const series = require('async/series') -const request = require('request') -const WebSocket = require('ws') - -const constants = require('../server/initializers/constants') -const requestHeaders = { - 'Range': '', - 'Keep-Alive': '', - 'User-Agent': 'Mozilla', - 'Cache-Control': 'no-cache', - 'Content-Type': '', - 'Host': 'example.com', - 'Access-Control-Request-Method': 'GET', - 'Access-Control-Request-Headers': 'range' -} - -series([ - pingServer, - checkCORSTorrent, - checkCORSWebSeed, - checkTracker -], function () { - process.exit(0) -}) - -// --------------------------------------------------------------------------- - -function pingServer (callback) { - const pingUrl = constants.CONFIG.WEBSERVER.URL + '/api/v1/ping' - console.log('Checking server is up (%s)...', pingUrl) - - request(pingUrl, function (err, res, body) { - if (!err && res.statusCode === 200 && body === 'pong') { - console.log('SUCCESS.') - } else { - console.log('FAIL.') - } - - callback() - }) -} - -function checkCORSTorrent (callback) { - const torrentUrl = constants.CONFIG.WEBSERVER.URL + '/static/torrents/test.torrent' - console.log('Checking CORS headers for the torrent (%s)...', torrentUrl) - - request({ - method: 'OPTIONS', - uri: torrentUrl, - headers: requestHeaders - }, function (err, res) { - if (err || isThereValidCORSHeaders(res) === false) { - console.error('FAIL.') - } else { - console.log('SUCCESS.') - } - - callback() - }) -} - -function checkCORSWebSeed (callback) { - const webseedUrl = constants.CONFIG.WEBSERVER.URL + '/static/webseed/test.mp4' - console.log('Checking CORS headers for the video (%s)...', webseedUrl) - - request({ - method: 'OPTIONS', - uri: webseedUrl, - headers: requestHeaders - }, function (err, res) { - if (err || isThereValidCORSHeaders(res) === false) { - console.error('FAIL.') - } else { - console.log('SUCCESS.') - } - - callback() - }) -} - -function checkTracker (callback) { - const trackerUrl = constants.CONFIG.WEBSERVER.WS + '://' + - constants.CONFIG.WEBSERVER.HOST + - '/tracker/socket' - console.log('Checking tracker websocket (%s)...', trackerUrl) - - let ws = null - ws = new WebSocket(trackerUrl) - - const timeout = setTimeout(failed, 1000) - ws.on('open', onOpen) - - function onOpen () { - clearTimeout(timeout) - ws.close() - - console.log('SUCCESS.') - callback() - } - - function failed () { - ws.removeListener('open', onOpen) - ws.close() - - console.log('FAILED.') - callback() - } -} - -function isThereValidCORSHeaders (res) { - let fail = false - - // Check Access-Control-Allow-Origin - const headerAllowOriginKey = 'access-control-allow-origin' - const headerAllowOrigin = res.headers[headerAllowOriginKey] - - if (!headerAllowOrigin) { - console.error(headerAllowOriginKey + ' is not present.') - fail = true - } else if (headerAllowOrigin !== '*') { - console.error(headerAllowOriginKey + ' does not equal "*".') - fail = true - } - - // Check Access-Control-Allow-Methods - const headerAllowMethodsKey = 'access-control-allow-methods' - const headerAllowMethods = res.headers[headerAllowMethodsKey] - if (!headerAllowMethods) { - console.error(headerAllowMethodsKey + ' is not present.') - fail = true - } else { - const allowMethodsMissed = findPatternNotInString(headerAllowMethods, [ 'get' ]) - if (allowMethodsMissed !== null) { - console.error(headerAllowMethodsKey + ' misses the ' + allowMethodsMissed + ' method.') - fail = true - } - } - - // Check Access-Control-Allow-Headers - const headerAllowHeadersKey = 'access-control-allow-headers' - const headerAllowHeaders = res.headers[headerAllowHeadersKey] - if (!headerAllowHeaders) { - console.error(headerAllowHeadersKey + ' is not present.') - fail = true - } else { - const headersThatShouldBePresent = [ - 'Range' - ] - const allowHeadersMissed = findPatternNotInString(headerAllowHeaders, headersThatShouldBePresent) - if (allowHeadersMissed !== null) { - console.error(headerAllowHeadersKey + ' misses the ' + allowHeadersMissed + ' header.') - fail = true - } - } - - return !fail -} - -function findPatternNotInString (stringChain, patterns) { - let res = null - const stringChainLowerCase = stringChain.toLowerCase() - - patterns.forEach(function (pattern) { - if (stringChainLowerCase.indexOf(pattern.toLowerCase()) === -1) { - res = pattern - } - }) - - return res -} diff --git a/scripts/check.ts b/scripts/check.ts new file mode 100755 index 000000000..28167482c --- /dev/null +++ b/scripts/check.ts @@ -0,0 +1,171 @@ +import * as series from 'async/series' +import * as request from 'request' +import * as WebSocket from 'ws' + +import { CONFIG } from '../server/initializers/constants' + +const requestHeaders = { + 'Range': '', + 'Keep-Alive': '', + 'User-Agent': 'Mozilla', + 'Cache-Control': 'no-cache', + 'Content-Type': '', + 'Host': 'example.com', + 'Access-Control-Request-Method': 'GET', + 'Access-Control-Request-Headers': 'range' +} + +series([ + pingServer, + checkCORSTorrent, + checkCORSWebSeed, + checkTracker +], function () { + process.exit(0) +}) + +// --------------------------------------------------------------------------- + +function pingServer (callback: () => void) { + const pingUrl = CONFIG.WEBSERVER.URL + '/api/v1/ping' + console.log('Checking server is up (%s)...', pingUrl) + + request(pingUrl, function (err, res, body) { + if (!err && res.statusCode === 200 && body === 'pong') { + console.log('SUCCESS.') + } else { + console.log('FAIL.') + } + + callback() + }) +} + +function checkCORSTorrent (callback: () => void) { + const torrentUrl = CONFIG.WEBSERVER.URL + '/static/torrents/test.torrent' + console.log('Checking CORS headers for the torrent (%s)...', torrentUrl) + + request({ + method: 'OPTIONS', + uri: torrentUrl, + headers: requestHeaders + }, function (err, res) { + if (err || isThereValidCORSHeaders(res) === false) { + console.error('FAIL.') + } else { + console.log('SUCCESS.') + } + + callback() + }) +} + +function checkCORSWebSeed (callback: () => void) { + const webseedUrl = CONFIG.WEBSERVER.URL + '/static/webseed/test.mp4' + console.log('Checking CORS headers for the video (%s)...', webseedUrl) + + request({ + method: 'OPTIONS', + uri: webseedUrl, + headers: requestHeaders + }, function (err, res) { + if (err || isThereValidCORSHeaders(res) === false) { + console.error('FAIL.') + } else { + console.log('SUCCESS.') + } + + callback() + }) +} + +function checkTracker (callback: () => void) { + const trackerUrl = CONFIG.WEBSERVER.WS + '://' + + CONFIG.WEBSERVER.HOST + + '/tracker/socket' + console.log('Checking tracker websocket (%s)...', trackerUrl) + + let ws = null + ws = new WebSocket(trackerUrl) + + const timeout = setTimeout(failed, 1000) + ws.on('open', onOpen) + + function onOpen () { + clearTimeout(timeout) + ws.close() + + console.log('SUCCESS.') + callback() + } + + function failed () { + ws.removeListener('open', onOpen) + ws.close() + + console.log('FAILED.') + callback() + } +} + +function isThereValidCORSHeaders (res: request.RequestResponse) { + let fail = false + + // Check Access-Control-Allow-Origin + const headerAllowOriginKey = 'access-control-allow-origin' + const headerAllowOrigin = res.headers[headerAllowOriginKey] + + if (!headerAllowOrigin) { + console.error(headerAllowOriginKey + ' is not present.') + fail = true + } else if (headerAllowOrigin !== '*') { + console.error(headerAllowOriginKey + ' does not equal "*".') + fail = true + } + + // Check Access-Control-Allow-Methods + const headerAllowMethodsKey = 'access-control-allow-methods' + const headerAllowMethods = res.headers[headerAllowMethodsKey] + if (!headerAllowMethods) { + console.error(headerAllowMethodsKey + ' is not present.') + fail = true + } else { + const allowMethodsMissed = findPatternNotInString(headerAllowMethods, [ 'get' ]) + if (allowMethodsMissed !== null) { + console.error(headerAllowMethodsKey + ' misses the ' + allowMethodsMissed + ' method.') + fail = true + } + } + + // Check Access-Control-Allow-Headers + const headerAllowHeadersKey = 'access-control-allow-headers' + const headerAllowHeaders = res.headers[headerAllowHeadersKey] + if (!headerAllowHeaders) { + console.error(headerAllowHeadersKey + ' is not present.') + fail = true + } else { + const headersThatShouldBePresent = [ + 'Range' + ] + const allowHeadersMissed = findPatternNotInString(headerAllowHeaders, headersThatShouldBePresent) + if (allowHeadersMissed !== null) { + console.error(headerAllowHeadersKey + ' misses the ' + allowHeadersMissed + ' header.') + fail = true + } + } + + return !fail +} + +function findPatternNotInString (stringChain: string, patterns: string[]) { + let res = null + const stringChainLowerCase = stringChain.toLowerCase() + + patterns.forEach(function (pattern) { + if (stringChainLowerCase.indexOf(pattern.toLowerCase()) === -1) { + res = pattern + } + }) + + return res +} diff --git a/scripts/reset-password.js b/scripts/reset-password.js deleted file mode 100755 index 49a481a18..000000000 --- a/scripts/reset-password.js +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env node - -'use strict' - -const program = require('commander') - -const db = require('../server/initializers/database') - -program - .option('-u, --user [user]', 'User') - .parse(process.argv) - -if (program.user === undefined) { - console.error('All parameters are mandatory.') - process.exit(-1) -} - -db.init(true, function () { - db.User.loadByUsername(program.user, function (err, user) { - if (err) { - console.error(err) - return - } - - if (!user) { - console.error('User unknown.') - return - } - - const readline = require('readline') - const Writable = require('stream').Writable - const mutableStdout = new Writable({ - write: function (chunk, encoding, callback) { - callback() - } - }) - const rl = readline.createInterface({ - input: process.stdin, - output: mutableStdout, - terminal: true - }) - - console.log('New password?') - rl.on('line', function (password) { - user.password = password - - user.save().asCallback(function (err) { - if (err) { - console.error(err) - } else { - console.log('User password updated.') - } - - process.exit(0) - }) - }) - }) -}) diff --git a/scripts/reset-password.ts b/scripts/reset-password.ts new file mode 100755 index 000000000..50e11c69c --- /dev/null +++ b/scripts/reset-password.ts @@ -0,0 +1,54 @@ +import * as program from 'commander' + +import { database as db } from '../server/initializers/database' + +program + .option('-u, --user [user]', 'User') + .parse(process.argv) + +if (program.user === undefined) { + console.error('All parameters are mandatory.') + process.exit(-1) +} + +db.init(true, function () { + db.User.loadByUsername(program.user, function (err, user) { + if (err) { + console.error(err) + return + } + + if (!user) { + console.error('User unknown.') + return + } + + const readline = require('readline') + const Writable = require('stream').Writable + const mutableStdout = new Writable({ + write: function (chunk, encoding, callback) { + callback() + } + }) + const rl = readline.createInterface({ + input: process.stdin, + output: mutableStdout, + terminal: true + }) + + console.log('New password?') + rl.on('line', function (password) { + user.password = password + + user.save().asCallback(function (err) { + if (err) { + console.error(err) + } else { + console.log('User password updated.') + } + + process.exit(0) + }) + }) + }) +}) diff --git a/scripts/update-host.js b/scripts/update-host.js deleted file mode 100755 index 8ae0f0d0e..000000000 --- a/scripts/update-host.js +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env node - -'use strict' - -const fs = require('fs') -const parseTorrent = require('parse-torrent') - -const constants = require('../server/initializers/constants') -const db = require('../server/initializers/database') - -const friends = require('../server/lib/friends') - -db.init(true, function () { - friends.hasFriends(function (err, hasFriends) { - if (err) throw err - - if (hasFriends === true) { - console.log('Cannot update host because you have friends!') - process.exit(-1) - } - - console.log('Updating torrent files.') - db.Video.list(function (err, videos) { - if (err) throw err - - videos.forEach(function (video) { - const torrentName = video.id + '.torrent' - const torrentPath = constants.CONFIG.STORAGE.TORRENTS_DIR + torrentName - const filename = video.id + video.extname - - const parsed = parseTorrent(fs.readFileSync(torrentPath)) - parsed.announce = [ constants.CONFIG.WEBSERVER.WS + '://' + constants.CONFIG.WEBSERVER.HOST + '/tracker/socket' ] - parsed.urlList = [ constants.CONFIG.WEBSERVER.URL + constants.STATIC_PATHS.WEBSEED + filename ] - - const buf = parseTorrent.toTorrentFile(parsed) - fs.writeFileSync(torrentPath, buf) - }) - - process.exit(0) - }) - }) -}) diff --git a/scripts/update-host.ts b/scripts/update-host.ts new file mode 100755 index 000000000..0f6af0942 --- /dev/null +++ b/scripts/update-host.ts @@ -0,0 +1,37 @@ +import { readFileSync, writeFileSync } from 'fs' +import * as parseTorrent from 'parse-torrent' + +import { CONFIG, STATIC_PATHS } from '../server/initializers/constants' +import { database as db } from '../server/initializers/database' +import { hasFriends } from '../server/lib/friends' + +db.init(true, function () { + hasFriends(function (err, itHasFriends) { + if (err) throw err + + if (itHasFriends === true) { + console.log('Cannot update host because you have friends!') + process.exit(-1) + } + + console.log('Updating torrent files.') + db.Video.list(function (err, videos) { + if (err) throw err + + videos.forEach(function (video) { + const torrentName = video.id + '.torrent' + const torrentPath = CONFIG.STORAGE.TORRENTS_DIR + torrentName + const filename = video.id + video.extname + + const parsed = parseTorrent(readFileSync(torrentPath)) + parsed.announce = [ CONFIG.WEBSERVER.WS + '://' + CONFIG.WEBSERVER.HOST + '/tracker/socket' ] + parsed.urlList = [ CONFIG.WEBSERVER.URL + STATIC_PATHS.WEBSEED + filename ] + + const buf = parseTorrent.toTorrentFile(parsed) + writeFileSync(torrentPath, buf) + }) + + process.exit(0) + }) + }) +}) diff --git a/server/models/video-interface.ts b/server/models/video-interface.ts index 7005f213c..7120f91cd 100644 --- a/server/models/video-interface.ts +++ b/server/models/video-interface.ts @@ -70,7 +70,7 @@ export namespace VideoMethods { export type GetDurationFromFileCallback = (err: Error, duration?: number) => void export type GetDurationFromFile = (videoPath, callback) => void - export type ListCallback = () => void + export type ListCallback = (err: Error, videoInstances: VideoInstance[]) => void export type List = (callback: ListCallback) => void export type ListForApiCallback = (err: Error, videoInstances?: VideoInstance[], total?: number) => void diff --git a/yarn.lock b/yarn.lock index a4f880cc2..9c0af9d32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21,6 +21,12 @@ "@types/express" "*" "@types/node" "*" +"@types/commander@^2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@types/commander/-/commander-2.9.1.tgz#d4e464425baf4685bd49dd233be11de9c00c0784" + dependencies: + "@types/node" "*" + "@types/config@^0.0.32": version "0.0.32" resolved "https://registry.yarnpkg.com/@types/config/-/config-0.0.32.tgz#c106055802d78e234e28374adc4dad460d098558"