]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/core-utils.ts
3118dc5007eca001c7722117e6620059db776747
[github/Chocobozzz/PeerTube.git] / server / helpers / core-utils.ts
1 /*
2 Different from 'utils' because we don't not import other PeerTube modules.
3 Useful to avoid circular dependencies.
4 */
5
6 import { join } from 'path'
7 import { pseudoRandomBytes } from 'crypto'
8 import {
9 readdir,
10 readFile,
11 rename,
12 unlink,
13 writeFile,
14 access,
15 stat,
16 Stats
17 } from 'fs'
18 import * as mkdirp from 'mkdirp'
19 import * as bcrypt from 'bcrypt'
20 import * as createTorrent from 'create-torrent'
21 import * as rimraf from 'rimraf'
22 import * as openssl from 'openssl-wrapper'
23 import * as Promise from 'bluebird'
24
25 function isTestInstance () {
26 return process.env.NODE_ENV === 'test'
27 }
28
29 function root () {
30 // We are in /helpers/utils.js
31 const paths = [ __dirname, '..', '..' ]
32
33 // We are under /dist directory
34 if (process.mainModule.filename.endsWith('.ts') === false) {
35 paths.push('..')
36 }
37
38 return join.apply(null, paths)
39 }
40
41 function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> {
42 return function promisified (): Promise<A> {
43 return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => {
44 func.apply(null, [ (err: any, res: A) => err ? reject(err) : resolve(res) ])
45 })
46 }
47 }
48
49 // Thanks to https://gist.github.com/kumasento/617daa7e46f13ecdd9b2
50 function promisify1<T, A> (func: (arg: T, cb: (err: any, result: A) => void) => void): (arg: T) => Promise<A> {
51 return function promisified (arg: T): Promise<A> {
52 return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => {
53 func.apply(null, [ arg, (err: any, res: A) => err ? reject(err) : resolve(res) ])
54 })
55 }
56 }
57
58 function promisify1WithVoid<T> (func: (arg: T, cb: (err: any) => void) => void): (arg: T) => Promise<void> {
59 return function promisified (arg: T): Promise<void> {
60 return new Promise<void>((resolve: () => void, reject: (err: any) => void) => {
61 func.apply(null, [ arg, (err: any) => err ? reject(err) : resolve() ])
62 })
63 }
64 }
65
66 function promisify2<T, U, A> (func: (arg1: T, arg2: U, cb: (err: any, result: A) => void) => void): (arg1: T, arg2: U) => Promise<A> {
67 return function promisified (arg1: T, arg2: U): Promise<A> {
68 return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => {
69 func.apply(null, [ arg1, arg2, (err: any, res: A) => err ? reject(err) : resolve(res) ])
70 })
71 }
72 }
73
74 function promisify2WithVoid<T, U> (func: (arg1: T, arg2: U, cb: (err: any) => void) => void): (arg1: T, arg2: U) => Promise<void> {
75 return function promisified (arg1: T, arg2: U): Promise<void> {
76 return new Promise<void>((resolve: () => void, reject: (err: any) => void) => {
77 func.apply(null, [ arg1, arg2, (err: any) => err ? reject(err) : resolve() ])
78 })
79 }
80 }
81
82 const readFilePromise = promisify2<string, string, string>(readFile)
83 const readFileBufferPromise = promisify1<string, Buffer>(readFile)
84 const unlinkPromise = promisify1WithVoid<string>(unlink)
85 const renamePromise = promisify2WithVoid<string, string>(rename)
86 const writeFilePromise = promisify2WithVoid<string, any>(writeFile)
87 const readdirPromise = promisify1<string, string[]>(readdir)
88 const mkdirpPromise = promisify1<string, string>(mkdirp)
89 const pseudoRandomBytesPromise = promisify1<number, Buffer>(pseudoRandomBytes)
90 const accessPromise = promisify1WithVoid<string|Buffer>(access)
91 const opensslExecPromise = promisify2WithVoid<string, any>(openssl.exec)
92 const bcryptComparePromise = promisify2<any, string, boolean>(bcrypt.compare)
93 const bcryptGenSaltPromise = promisify1<number, string>(bcrypt.genSalt)
94 const bcryptHashPromise = promisify2<any, string|number, string>(bcrypt.hash)
95 const createTorrentPromise = promisify2<string, any, any>(createTorrent)
96 const rimrafPromise = promisify1WithVoid<string>(rimraf)
97 const statPromise = promisify1<string, Stats>(stat)
98
99 // ---------------------------------------------------------------------------
100
101 export {
102 isTestInstance,
103 root,
104
105 promisify0,
106 promisify1,
107 readdirPromise,
108 readFilePromise,
109 readFileBufferPromise,
110 unlinkPromise,
111 renamePromise,
112 writeFilePromise,
113 mkdirpPromise,
114 pseudoRandomBytesPromise,
115 accessPromise,
116 opensslExecPromise,
117 bcryptComparePromise,
118 bcryptGenSaltPromise,
119 bcryptHashPromise,
120 createTorrentPromise,
121 rimrafPromise,
122 statPromise
123 }