MCP 3D Printer Server
by DMontgomery40
Verified
#!/usr/bin/env node
import path from 'path'
import fs from 'fs'
import minimist from 'minimist'
import help from 'help-me'
import { connect } from '../mqtt'
import { IClientOptions } from 'src/lib/client'
const helpMe = help({
dir: path.join(__dirname, '../../', 'help'),
})
export default function start(args: string[]) {
const parsedArgs = minimist(args, {
string: [
'hostname',
'username',
'password',
'key',
'cert',
'ca',
'clientId',
'i',
'id',
],
boolean: ['stdin', 'help', 'clean', 'insecure'],
alias: {
port: 'p',
hostname: ['h', 'host'],
topic: 't',
qos: 'q',
clean: 'c',
keepalive: 'k',
clientId: ['i', 'id'],
username: 'u',
password: 'P',
protocol: ['C', 'l'],
verbose: 'v',
help: '-H',
ca: 'cafile',
},
default: {
host: 'localhost',
qos: 0,
retain: false,
clean: true,
keepAlive: 30, // 30 sec
},
})
if (parsedArgs.help) {
return helpMe.toStdout('subscribe')
}
parsedArgs.topic = parsedArgs.topic || parsedArgs._.shift()
if (!parsedArgs.topic) {
console.error('missing topic\n')
return helpMe.toStdout('subscribe')
}
if (parsedArgs.key) {
parsedArgs.key = fs.readFileSync(parsedArgs.key)
}
if (parsedArgs.cert) {
parsedArgs.cert = fs.readFileSync(parsedArgs.cert)
}
if (parsedArgs.ca) {
parsedArgs.ca = fs.readFileSync(parsedArgs.ca)
}
if (parsedArgs.key && parsedArgs.cert && !parsedArgs.protocol) {
parsedArgs.protocol = 'mqtts'
}
if (parsedArgs.insecure) {
parsedArgs.rejectUnauthorized = false
}
if (parsedArgs.port) {
if (typeof parsedArgs.port !== 'number') {
console.warn(
"# Port: number expected, '%s' was given.",
typeof parsedArgs.port,
)
return
}
}
if (parsedArgs['will-topic']) {
parsedArgs.will = {}
parsedArgs.will.topic = parsedArgs['will-topic']
parsedArgs.will.payload = parsedArgs['will-message']
parsedArgs.will.qos = parsedArgs['will-qos']
parsedArgs.will.retain = parsedArgs['will-retain']
}
parsedArgs.keepAlive = parsedArgs['keep-alive']
const client = connect(parsedArgs as IClientOptions)
client.on('connect', () => {
client.subscribe(
parsedArgs.topic,
{ qos: parsedArgs.qos },
(err, result) => {
if (err) {
console.error(err)
process.exit(1)
}
result.forEach((sub) => {
if (sub.qos > 2) {
console.error(
'subscription negated to',
sub.topic,
'with code',
sub.qos,
)
process.exit(1)
}
})
},
)
})
client.on('message', (topic, payload) => {
if (parsedArgs.verbose) {
console.log(topic, payload.toString())
} else {
console.log(payload.toString())
}
})
client.on('error', (err) => {
console.warn(err)
client.end()
})
}
if (require.main === module) {
start(process.argv.slice(2))
}