]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/helpers/core-utils.ts
Send follow/accept
[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 pem from 'pem'
23 import * as jsonld from 'jsonld'
24 import * as jsig from 'jsonld-signatures'
25 jsig.use('jsonld', jsonld)
26
27 function isTestInstance () {
28 return process.env.NODE_ENV === 'test'
29 }
30
31 function root () {
32 // We are in /helpers/utils.js
33 const paths = [ __dirname, '..', '..' ]
34
35 // We are under /dist directory
36 if (process.mainModule.filename.endsWith('.ts') === false) {
37 paths.push('..')
38 }
39
40 return join.apply(null, paths)
41 }
42
43 // Thanks: https://stackoverflow.com/a/12034334
44 function escapeHTML (stringParam) {
45 const entityMap = {
46 '&': '&',
47 '<': '&lt;',
48 '>': '&gt;',
49 '"': '&quot;',
50 "'": '&#39;',
51 '/': '&#x2F;',
52 '`': '&#x60;',
53 '=': '&#x3D;'
54 }
55
56 return String(stringParam).replace(/[&<>"'`=\/]/g, s => entityMap[s])
57 }
58
59 function pageToStartAndCount (page: number, itemsPerPage: number) {
60 const start = (page - 1) * itemsPerPage
61
62 return { start, count: itemsPerPage }
63 }
64
65 function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> {
66 return function promisified (): Promise<A> {
67 return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => {
68 func.apply(null, [ (err: any, res: A) => err ? reject(err) : resolve(res) ])
69 })
70 }
71 }
72
73 // Thanks to https://gist.github.com/kumasento/617daa7e46f13ecdd9b2
74 function promisify1<T, A> (func: (arg: T, cb: (err: any, result: A) => void) => void): (arg: T) => Promise<A> {
75 return function promisified (arg: T): Promise<A> {
76 return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => {
77 func.apply(null, [ arg, (err: any, res: A) => err ? reject(err) : resolve(res) ])
78 })
79 }
80 }
81
82 function promisify1WithVoid<T> (func: (arg: T, cb: (err: any) => void) => void): (arg: T) => Promise<void> {
83 return function promisified (arg: T): Promise<void> {
84 return new Promise<void>((resolve: () => void, reject: (err: any) => void) => {
85 func.apply(null, [ arg, (err: any) => err ? reject(err) : resolve() ])
86 })
87 }
88 }
89
90 function promisify2<T, U, A> (func: (arg1: T, arg2: U, cb: (err: any, result: A) => void) => void): (arg1: T, arg2: U) => Promise<A> {
91 return function promisified (arg1: T, arg2: U): Promise<A> {
92 return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => {
93 func.apply(null, [ arg1, arg2, (err: any, res: A) => err ? reject(err) : resolve(res) ])
94 })
95 }
96 }
97
98 function promisify2WithVoid<T, U> (func: (arg1: T, arg2: U, cb: (err: any) => void) => void): (arg1: T, arg2: U) => Promise<void> {
99 return function promisified (arg1: T, arg2: U): Promise<void> {
100 return new Promise<void>((resolve: () => void, reject: (err: any) => void) => {
101 func.apply(null, [ arg1, arg2, (err: any) => err ? reject(err) : resolve() ])
102 })
103 }
104 }
105
106 const readFilePromise = promisify2<string, string, string>(readFile)
107 const readFileBufferPromise = promisify1<string, Buffer>(readFile)
108 const unlinkPromise = promisify1WithVoid<string>(unlink)
109 const renamePromise = promisify2WithVoid<string, string>(rename)
110 const writeFilePromise = promisify2WithVoid<string, any>(writeFile)
111 const readdirPromise = promisify1<string, string[]>(readdir)
112 const mkdirpPromise = promisify1<string, string>(mkdirp)
113 const pseudoRandomBytesPromise = promisify1<number, Buffer>(pseudoRandomBytes)
114 const accessPromise = promisify1WithVoid<string | Buffer>(access)
115 const createPrivateKey = promisify1<number, { key: string }>(pem.createPrivateKey)
116 const getPublicKey = promisify1<string, { publicKey: string }>(pem.getPublicKey)
117 const bcryptComparePromise = promisify2<any, string, boolean>(bcrypt.compare)
118 const bcryptGenSaltPromise = promisify1<number, string>(bcrypt.genSalt)
119 const bcryptHashPromise = promisify2<any, string | number, string>(bcrypt.hash)
120 const createTorrentPromise = promisify2<string, any, any>(createTorrent)
121 const rimrafPromise = promisify1WithVoid<string>(rimraf)
122 const statPromise = promisify1<string, Stats>(stat)
123 const jsonldSignPromise = promisify2<object, { privateKeyPem: string, creator: string }, object>(jsig.sign)
124 const jsonldVerifyPromise = promisify2<object, object, object>(jsig.verify)
125
126 // ---------------------------------------------------------------------------
127
128 export {
129 isTestInstance,
130 root,
131 escapeHTML,
132 pageToStartAndCount,
133
134 promisify0,
135 promisify1,
136
137 readdirPromise,
138 readFilePromise,
139 readFileBufferPromise,
140 unlinkPromise,
141 renamePromise,
142 writeFilePromise,
143 mkdirpPromise,
144 pseudoRandomBytesPromise,
145 accessPromise,
146 createPrivateKey,
147 getPublicKey,
148 bcryptComparePromise,
149 bcryptGenSaltPromise,
150 bcryptHashPromise,
151 createTorrentPromise,
152 rimrafPromise,
153 statPromise,
154 jsonldSignPromise,
155 jsonldVerifyPromise
156 }