add REPL in server/tools/repl.ts (#1248)
This commit is contained in:
parent
6f2ae7a1aa
commit
1e59ca3bac
2 changed files with 210 additions and 0 deletions
79
server/tools/repl.ts
Normal file
79
server/tools/repl.ts
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
import * as repl from 'repl'
|
||||||
|
import * as path from 'path'
|
||||||
|
import * as _ from 'lodash'
|
||||||
|
import * as uuidv1 from 'uuid/v1'
|
||||||
|
import * as uuidv3 from 'uuid/v3'
|
||||||
|
import * as uuidv4 from 'uuid/v4'
|
||||||
|
import * as uuidv5 from 'uuid/v5'
|
||||||
|
import * as Sequelize from 'sequelize'
|
||||||
|
import * as YoutubeDL from 'youtube-dl'
|
||||||
|
|
||||||
|
import { initDatabaseModels, sequelizeTypescript } from '../initializers'
|
||||||
|
import * as cli from '../tools/cli'
|
||||||
|
import { logger } from '../helpers/logger'
|
||||||
|
import * as constants from '../initializers/constants'
|
||||||
|
import * as modelsUtils from '../models/utils'
|
||||||
|
import * as coreUtils from '../helpers/core-utils'
|
||||||
|
import * as ffmpegUtils from '../helpers/ffmpeg-utils'
|
||||||
|
import * as peertubeCryptoUtils from '../helpers/peertube-crypto'
|
||||||
|
import * as signupUtils from '../helpers/signup'
|
||||||
|
import * as utils from '../helpers/utils'
|
||||||
|
import * as YoutubeDLUtils from '../helpers/youtube-dl'
|
||||||
|
|
||||||
|
let versionCommitHash
|
||||||
|
|
||||||
|
const start = async () => {
|
||||||
|
await initDatabaseModels(true)
|
||||||
|
|
||||||
|
await utils.getVersion().then((data) => {
|
||||||
|
versionCommitHash = data
|
||||||
|
})
|
||||||
|
|
||||||
|
const initContext = (replServer) => {
|
||||||
|
return (context) => {
|
||||||
|
const properties = {
|
||||||
|
context, repl: replServer, env: process.env,
|
||||||
|
lodash: _, path,
|
||||||
|
uuidv1, uuidv3, uuidv4, uuidv5,
|
||||||
|
cli, logger, constants,
|
||||||
|
Sequelize, sequelizeTypescript, modelsUtils,
|
||||||
|
models: sequelizeTypescript.models, transaction: sequelizeTypescript.transaction,
|
||||||
|
query: sequelizeTypescript.query, queryInterface: sequelizeTypescript.getQueryInterface(),
|
||||||
|
YoutubeDL,
|
||||||
|
coreUtils, ffmpegUtils, peertubeCryptoUtils, signupUtils, utils, YoutubeDLUtils
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let prop in properties) {
|
||||||
|
Object.defineProperty(context, prop, {
|
||||||
|
configurable: false,
|
||||||
|
enumerable: true,
|
||||||
|
value: properties[prop]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const replServer = repl.start({
|
||||||
|
prompt: `PeerTube [${cli.version}] (${versionCommitHash})> `
|
||||||
|
})
|
||||||
|
|
||||||
|
initContext(replServer)(replServer.context)
|
||||||
|
replServer.on('reset', initContext(replServer))
|
||||||
|
|
||||||
|
const resetCommand = {
|
||||||
|
help: 'Reset REPL',
|
||||||
|
action () {
|
||||||
|
this.write('.clear\n')
|
||||||
|
this.displayPrompt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
replServer.defineCommand('reset', resetCommand)
|
||||||
|
replServer.defineCommand('r', resetCommand)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
start().then((data) => {
|
||||||
|
// do nothing
|
||||||
|
}).catch((err) => {
|
||||||
|
console.error(err)
|
||||||
|
})
|
|
@ -206,3 +206,134 @@ To fix this, you have to run:
|
||||||
```
|
```
|
||||||
$ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run update-host
|
$ sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run update-host
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### REPL ([Read Eval Print Loop](https://nodejs.org/docs/latest-v8.x/api/repl.html))
|
||||||
|
|
||||||
|
If you want to interact with the application libraries and objects, there is a REPL for that.
|
||||||
|
|
||||||
|
usage: `node ./dist/server/tools/repl.js`
|
||||||
|
|
||||||
|
"The default evaluator will, by default, assign the result of the most recently evaluated expression to the special variable `_` (underscore). Explicitly setting `_` to a value will disable this behavior."
|
||||||
|
|
||||||
|
- type `.help` to list commands available in the repl, notice it starts with a dot
|
||||||
|
- type `.exit` to exit, note that you still have to press CTRL-C to actually exit, or press CTRL-C (3 times) without typing `.exit` to exit
|
||||||
|
- type `context` to list all available objects and libraries in the context, note: `Promise` is also available but it's not listed in the context, in case you need promises for something
|
||||||
|
- type `env` to see the loaded environment variables
|
||||||
|
- type `path` to access path library
|
||||||
|
- type `lodash` to access lodash library
|
||||||
|
- type `uuidv1` to access uuid/v1 library
|
||||||
|
- type `uuidv3` to access uuid/v3 library
|
||||||
|
- type `uuidv4` to access uuid/v4 library
|
||||||
|
- type `uuidv5` to access uuid/v5 library
|
||||||
|
- type `YoutubeDL` to access youtube-dl library
|
||||||
|
- type `cli` to access the cli helpers object
|
||||||
|
- type `logger` to access the logger; if you log to it, it will write to stdout and to the peertube.log file
|
||||||
|
- type `constants` to access the constants loaded by the server
|
||||||
|
- type `coreUtils` to access the core-utils helpers object
|
||||||
|
- type `ffmpegUtils` to access the ffmpeg-utils helpers object
|
||||||
|
- type `peertubeCryptoUtils` to access the peertube-crypto helpers object
|
||||||
|
- type `signupUtils` to access the signup helpers object
|
||||||
|
- type `utils` to access the utils helpers object
|
||||||
|
- type `YoutubeDLUtils` to access the youtube-dl helpers object
|
||||||
|
- type `sequelizeTypescript` to access sequelizeTypescript
|
||||||
|
- type `modelsUtils` to access the models/utils
|
||||||
|
- type `models` to access the shortcut to sequelizeTypescript.models
|
||||||
|
- type `transaction` to access the shortcut to sequelizeTypescript.transaction
|
||||||
|
- type `query` to access the shortcut to sequelizeTypescript.query
|
||||||
|
- type `queryInterface` to access the shortcut to sequelizeTypescript.queryInterface
|
||||||
|
|
||||||
|
#### .help
|
||||||
|
|
||||||
|
```
|
||||||
|
PeerTube [1.0.0] (b10eb595)> .help
|
||||||
|
.break Sometimes you get stuck, this gets you out
|
||||||
|
.clear Break, and also clear the local context
|
||||||
|
.editor Enter editor mode
|
||||||
|
.exit Exit the repl
|
||||||
|
.help Print this help message
|
||||||
|
.load Load JS from a file into the REPL session
|
||||||
|
.r Reset REPL
|
||||||
|
.reset Reset REPL
|
||||||
|
.save Save all evaluated commands in this REPL session to a file
|
||||||
|
PeerTube [1.0.0] (b10eb595)>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Lodash example
|
||||||
|
|
||||||
|
```
|
||||||
|
PeerTube [1.0.0] (b10eb595)> lodash.keys(context)
|
||||||
|
[ 'global',
|
||||||
|
'console',
|
||||||
|
'DTRACE_NET_SERVER_CONNECTION',
|
||||||
|
'DTRACE_NET_STREAM_END',
|
||||||
|
'DTRACE_HTTP_SERVER_REQUEST',
|
||||||
|
'DTRACE_HTTP_SERVER_RESPONSE',
|
||||||
|
'DTRACE_HTTP_CLIENT_REQUEST',
|
||||||
|
'DTRACE_HTTP_CLIENT_RESPONSE',
|
||||||
|
'process',
|
||||||
|
'Buffer',
|
||||||
|
'clearImmediate',
|
||||||
|
'clearInterval',
|
||||||
|
'clearTimeout',
|
||||||
|
'setImmediate',
|
||||||
|
'setInterval',
|
||||||
|
'setTimeout',
|
||||||
|
'XMLHttpRequest',
|
||||||
|
'compact2string',
|
||||||
|
'module',
|
||||||
|
'require',
|
||||||
|
'path',
|
||||||
|
'repl',
|
||||||
|
'context',
|
||||||
|
'env',
|
||||||
|
'lodash',
|
||||||
|
'uuidv1',
|
||||||
|
'uuidv3',
|
||||||
|
'uuidv4',
|
||||||
|
'uuidv5',
|
||||||
|
'cli',
|
||||||
|
'logger',
|
||||||
|
'constants',
|
||||||
|
'Sequelize',
|
||||||
|
'sequelizeTypescript',
|
||||||
|
'modelsUtils',
|
||||||
|
'models',
|
||||||
|
'transaction',
|
||||||
|
'query',
|
||||||
|
'queryInterface',
|
||||||
|
'YoutubeDL',
|
||||||
|
'coreUtils',
|
||||||
|
'ffmpegUtils',
|
||||||
|
'peertubeCryptoUtils',
|
||||||
|
'signupUtils',
|
||||||
|
'utils',
|
||||||
|
'YoutubeDLUtils' ]
|
||||||
|
PeerTube [1.0.0] (b10eb595)>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### YoutubeDL example
|
||||||
|
```
|
||||||
|
YoutubeDL.getInfo('https://www.youtube.com/watch?v=I5ZN289jjDo', function(err, data) {console.log(err, data)})
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Models examples
|
||||||
|
```
|
||||||
|
PeerTube [1.0.0] (b10eb595)> new models.ActorModel({id: 3}).getVideoChannel().then(function(data){console.log(data.dataValues.name)})
|
||||||
|
Promise {
|
||||||
|
_bitField: 0,
|
||||||
|
_fulfillmentHandler0: undefined,
|
||||||
|
_rejectionHandler0: undefined,
|
||||||
|
_promise0: undefined,
|
||||||
|
_receiver0: undefined }
|
||||||
|
PeerTube [1.0.0] (b10eb595)> Main root channel
|
||||||
|
PeerTube [1.0.0] (b10eb595)> let out; new models.UserModel({id: 1}).getAccount().then(function (data) {out = data.dataValues.id})
|
||||||
|
Promise {
|
||||||
|
_bitField: 0,
|
||||||
|
_fulfillmentHandler0: undefined,
|
||||||
|
_rejectionHandler0: undefined,
|
||||||
|
_promise0: undefined,
|
||||||
|
_receiver0: undefined }
|
||||||
|
PeerTube [1.0.0] (b10eb595)> out
|
||||||
|
2
|
||||||
|
PeerTube [1.0.0] (b10eb595)>
|
||||||
|
```
|
||||||
|
|
Loading…
Reference in a new issue