add REPL in server/tools/repl.ts (#1248)

pull/1276/head
BRAINS YUM 2018-10-14 12:48:08 -05:00 committed by Rigel Kent
parent 6f2ae7a1aa
commit 1e59ca3bac
2 changed files with 210 additions and 0 deletions

79
server/tools/repl.ts Normal file
View 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)
})

View File

@ -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
```
### 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)>
```