getUserMedia problem in firefox
[henge/kiak.git] / opts.js
1 /**
2 * @file Establishes runtime options from args and config files
3 * @author Ken Grimes
4 * @version 0.0.1
5 * @license AGPL-3.0
6 * @copyright jk software 2017
7 */
8 const fs = require('fs')
9 const path = require('path')
10
11 /**
12 * @summary Parse arguments with minimist
13 */
14 exports = require('minimist')(process.argv.slice(2), {
15 string: [ 'config', 'client-js', 'host-js', 'ca-cert', 'ca-key',
16 'port', 'index', 'bind', 'electron', 'dedicated'
17 ],
18 boolean: [ 'no-tls', 'legacy-socket' ],
19 alias: { c: 'config',
20 j: 'client-js',
21 J: 'host-js',
22 T: 'no-tls',
23 C: 'ca-cert',
24 K: 'ca-key',
25 p: 'port',
26 i: 'index',
27 b: 'bind',
28 e: 'electron',
29 d: 'dedicated'
30 },
31 stopEarly: true,
32 unknown: (opt) => {
33 console.log('Unknown operator: ' + opt)
34 console.log(process.argv.join(' '))
35 console.log(fs.readFileSync('./usage', { encoding: 'utf8' }))
36 process.exit()
37 }
38 })
39
40 /**
41 * @summary Defaults
42 */
43 exports['defaults'] = {
44 config: '/etc/strapp.conf:~/.strapp/strapp.conf:./strapp.conf',
45 'client-js': './client.js',
46 'host-js': './host.js',
47 tls: true,
48 'ca-cert': '../certs/cert.pem',
49 'ca-key': '../certs/key.pem',
50 port: 2443,
51 index: './index.html',
52 bind: 'www:./www',
53 electron: undefined,
54 dedicated: undefined,
55 'legacy-socket': false
56 }
57
58 exports = Object.assign({}, exports['defaults'], exports)
59
60 /**
61 * @summary Parse config files
62 */
63 exports['conf'] = {}
64 exports['config'].split(':').forEach((fileName) => {
65 let filePath = path.resolve(fileName)
66 if (fs.existsSync(filePath)){
67 let lineNo = 0;
68 String(fs.readFileSync(path.resolve(fileName))).split('\n').forEach((line) => {
69 lineNo++
70 /* Skip comments */
71 if (!line.match(/[\s]*#/)) {
72 let kv = line.replace(/#.*/g,'').replace(/\s/g,'').split('=')
73 if (kv.length == 2 && kv[0] in exports['defaults']) {
74 /* Multiple "bind=..." lines in are additive */
75 if (kv[0] === 'bind' && 'bind' in exports['conf']) {
76 kv[1] = exports['conf']['bind'] + ',' + kv[1]
77 }
78 exports['conf'][kv[0]] = kv[1]
79 }
80 else
81 console.log(`WARN: Bad option ${line} in ${fileName}:${lineNo}`)
82 }
83 })
84 }
85 else if (exports['config'] !== exports['defaults']['config'])
86 console.log(`WARN: opt '-c${exports['config']}', ${fileName} inaccessible`)
87 })
88
89 exports = Object.assign({}, exports['defaults'], exports['conf'], exports)
90
91 /**
92 * @summary Parse bindings
93 */
94 exports['bindings'] = {}
95 exports['bind'].replace(/\s/g,'').split(',').forEach((kvp) => {
96 let kv = kvp.split(':')
97 kv[1] = path.resolve(kv[1])
98 if (fs.existsSync(kv[1])) {
99 if (kv.length == 2 && /^[-_.A-Za-z0-9]/g.test(kv[0]))
100 exports['bindings'][kv[0]] = path.normalize(kv[1])
101 else
102 console.log(`WARN: Invalid binding: ${kvp}`)
103 }
104 else
105 console.log(`WARN: Binding not made, directory ${kvp} inaccessible`)
106 })
107
108 module.exports = exports