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