]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/helpers/core-utils.ts
Cleanup helpers
[github/Chocobozzz/PeerTube.git] / server / helpers / core-utils.ts
CommitLineData
1840c2f7
C
1/*
2 Different from 'utils' because we don't not import other PeerTube modules.
3 Useful to avoid circular dependencies.
4*/
5
6fcd19ba
C
6import * as bcrypt from 'bcrypt'
7import * as createTorrent from 'create-torrent'
8d468a16
C
8import { pseudoRandomBytes } from 'crypto'
9import { readdir, readFile, rename, stat, Stats, unlink, writeFile } from 'fs'
10import * as mkdirp from 'mkdirp'
11import { join } from 'path'
e4f97bab 12import * as pem from 'pem'
8d468a16 13import * as rimraf from 'rimraf'
1840c2f7
C
14
15function isTestInstance () {
16 return process.env.NODE_ENV === 'test'
17}
18
19function root () {
fdbda9e3
C
20 // We are in /helpers/utils.js
21 const paths = [ __dirname, '..', '..' ]
22
23 // We are under /dist directory
24 if (process.mainModule.filename.endsWith('.ts') === false) {
25 paths.push('..')
26 }
27
28 return join.apply(null, paths)
1840c2f7
C
29}
30
49347a0a
C
31// Thanks: https://stackoverflow.com/a/12034334
32function escapeHTML (stringParam) {
33 const entityMap = {
34 '&': '&',
35 '<': '&lt;',
36 '>': '&gt;',
37 '"': '&quot;',
38 "'": '&#39;',
39 '/': '&#x2F;',
40 '`': '&#x60;',
41 '=': '&#x3D;'
42 }
43
44 return String(stringParam).replace(/[&<>"'`=\/]/g, s => entityMap[s])
45}
46
e4f97bab
C
47function pageToStartAndCount (page: number, itemsPerPage: number) {
48 const start = (page - 1) * itemsPerPage
49
50 return { start, count: itemsPerPage }
51}
52
6fcd19ba
C
53function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> {
54 return function promisified (): Promise<A> {
55 return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => {
56 func.apply(null, [ (err: any, res: A) => err ? reject(err) : resolve(res) ])
57 })
58 }
59}
60
61// Thanks to https://gist.github.com/kumasento/617daa7e46f13ecdd9b2
62function promisify1<T, A> (func: (arg: T, cb: (err: any, result: A) => void) => void): (arg: T) => Promise<A> {
63 return function promisified (arg: T): Promise<A> {
64 return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => {
65 func.apply(null, [ arg, (err: any, res: A) => err ? reject(err) : resolve(res) ])
66 })
67 }
68}
69
70function promisify1WithVoid<T> (func: (arg: T, cb: (err: any) => void) => void): (arg: T) => Promise<void> {
71 return function promisified (arg: T): Promise<void> {
72 return new Promise<void>((resolve: () => void, reject: (err: any) => void) => {
73 func.apply(null, [ arg, (err: any) => err ? reject(err) : resolve() ])
74 })
75 }
76}
77
78function promisify2<T, U, A> (func: (arg1: T, arg2: U, cb: (err: any, result: A) => void) => void): (arg1: T, arg2: U) => Promise<A> {
79 return function promisified (arg1: T, arg2: U): Promise<A> {
80 return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => {
81 func.apply(null, [ arg1, arg2, (err: any, res: A) => err ? reject(err) : resolve(res) ])
82 })
83 }
84}
85
86function promisify2WithVoid<T, U> (func: (arg1: T, arg2: U, cb: (err: any) => void) => void): (arg1: T, arg2: U) => Promise<void> {
87 return function promisified (arg1: T, arg2: U): Promise<void> {
88 return new Promise<void>((resolve: () => void, reject: (err: any) => void) => {
89 func.apply(null, [ arg1, arg2, (err: any) => err ? reject(err) : resolve() ])
90 })
91 }
92}
93
6fcd19ba
C
94const readFileBufferPromise = promisify1<string, Buffer>(readFile)
95const unlinkPromise = promisify1WithVoid<string>(unlink)
96const renamePromise = promisify2WithVoid<string, string>(rename)
556ddc31 97const writeFilePromise = promisify2WithVoid<string, any>(writeFile)
6fcd19ba
C
98const readdirPromise = promisify1<string, string[]>(readdir)
99const mkdirpPromise = promisify1<string, string>(mkdirp)
100const pseudoRandomBytesPromise = promisify1<number, Buffer>(pseudoRandomBytes)
e4f97bab
C
101const createPrivateKey = promisify1<number, { key: string }>(pem.createPrivateKey)
102const getPublicKey = promisify1<string, { publicKey: string }>(pem.getPublicKey)
6fcd19ba
C
103const bcryptComparePromise = promisify2<any, string, boolean>(bcrypt.compare)
104const bcryptGenSaltPromise = promisify1<number, string>(bcrypt.genSalt)
53abc4c2 105const bcryptHashPromise = promisify2<any, string | number, string>(bcrypt.hash)
6fcd19ba 106const createTorrentPromise = promisify2<string, any, any>(createTorrent)
f981dae8 107const rimrafPromise = promisify1WithVoid<string>(rimraf)
40298b02 108const statPromise = promisify1<string, Stats>(stat)
6fcd19ba 109
1840c2f7
C
110// ---------------------------------------------------------------------------
111
112export {
113 isTestInstance,
6fcd19ba 114 root,
49347a0a 115 escapeHTML,
e4f97bab 116 pageToStartAndCount,
6fcd19ba
C
117
118 promisify0,
119 promisify1,
e4f97bab 120
6fcd19ba 121 readdirPromise,
6fcd19ba
C
122 readFileBufferPromise,
123 unlinkPromise,
124 renamePromise,
125 writeFilePromise,
126 mkdirpPromise,
127 pseudoRandomBytesPromise,
e4f97bab
C
128 createPrivateKey,
129 getPublicKey,
6fcd19ba
C
130 bcryptComparePromise,
131 bcryptGenSaltPromise,
132 bcryptHashPromise,
f981dae8 133 createTorrentPromise,
40298b02 134 rimrafPromise,
efc32059 135 statPromise
1840c2f7 136}