1 | const fs = require('fs');
|
2 | const fetch = require('node-fetch');
|
3 | const jwt = require('jsonwebtoken');
|
4 | const program = require('commander');
|
5 | const colors = require('colors');
|
6 | const crypto = require('crypto');
|
7 | const path = require('path');
|
8 | const { Spinner } = require('cli-spinner');
|
9 |
|
10 | const generateKey = (bits) => crypto.randomBytes(Math.ceil(bits / 8)).toString('base64');
|
11 | const keySize = 512;
|
12 |
|
13 | function environmentFile(environment) {
|
14 | return `./config/${environment}.json`;
|
15 | }
|
16 |
|
17 | program
|
18 | .command('call <api>')
|
19 | .alias('c')
|
20 | .option('--env [environment]', 'The environment to run, defaults to development', 'development')
|
21 | .option('-V --verbose', 'Run in verbose mode')
|
22 | .action(async (api, {env, verbose}) => {
|
23 | const {
|
24 | host,
|
25 | systemSecret
|
26 | } = JSON.parse(fs.readFileSync(environmentFile(env)).toString());
|
27 |
|
28 | console.log(`Triggering api ${colors.cyan(host)}${colors.cyan(api)} in environment ${colors.green(env)}`);
|
29 |
|
30 | const key = Buffer.from(systemSecret, 'base64');
|
31 |
|
32 | try {
|
33 | const spinner = new Spinner('processing.. %s');
|
34 | spinner.setSpinnerString(18);
|
35 | spinner.start();
|
36 |
|
37 | const result = await fetch(`${host}${api}`, {
|
38 | method: 'POST',
|
39 | headers: {
|
40 | authorization: `jwt ${jwt.sign({}, key, { algorithm: 'HS256', expiresIn: '5 min' })}`
|
41 | }
|
42 | });
|
43 |
|
44 | spinner.stop(true);
|
45 |
|
46 | if (!result.ok) {
|
47 | console.error(colors.red(`[${result.status}]`), await result.text());
|
48 | } else {
|
49 | console.log(colors.green(`[${result.status}]`), await result.text());
|
50 | }
|
51 | } catch (ex) {
|
52 | if (verbose) {
|
53 | console.error(colors.red(ex.message), ex);
|
54 | } else {
|
55 | console.error(colors.red(ex.message));
|
56 | }
|
57 | }
|
58 | });
|
59 |
|
60 | program
|
61 | .command('generate')
|
62 | .alias('g')
|
63 | .option('--env [environment]', 'The environment to run, defaults to development', 'development')
|
64 | .action(({ env }) => {
|
65 | console.log(`Generating new secret for environment ${colors.green(env)}`)
|
66 |
|
67 | const config = JSON.parse(fs.readFileSync(environmentFile(env)).toString());
|
68 |
|
69 | config.systemSecret = generateKey(keySize);
|
70 |
|
71 | fs.writeFileSync(environmentFile(env), JSON.stringify(config, null, 4));
|
72 | });
|
73 |
|
74 | program.parse(process.argv);
|