From adc2c4c2b321a77437f95e58da0924bd8d22a5f1 Mon Sep 17 00:00:00 2001 From: Red-Asuka Date: Mon, 6 Feb 2023 15:21:17 +0800 Subject: [PATCH] feat(cli): support output mode for the sub command --- cli/src/index.ts | 7 +++++++ cli/src/lib/sub.ts | 28 ++++++++++++++++------------ cli/src/types/global.d.ts | 5 ++++- cli/src/utils/parse.ts | 9 +++++++++ 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/cli/src/index.ts b/cli/src/index.ts index b6a95b0be..75512569f 100755 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -11,6 +11,7 @@ import { parseVariadicOfBooleanType, parsePubTopic, parseFormat, + parseOutputMode, } from './utils/parse' import { conn, benchConn } from './lib/conn' import { pub, benchPub } from './lib/pub' @@ -211,6 +212,12 @@ export class Commander { ) .option('-f, --format ', 'format the message body, support base64, json, hex', parseFormat) .option('-v, --verbose', 'print the topic before the message') + .option( + '--output-mode ', + 'choose between the default format and the clean mode, the clean mode outputs the complete packet data, allowing users to pipe the output freely', + parseOutputMode, + 'default', + ) // connect options .option('-V, --mqtt-version <5/3.1.1/3.1>', 'the MQTT version', parseMQTTVersion, 5) .option('-h, --hostname ', 'the broker host', 'localhost') diff --git a/cli/src/lib/sub.ts b/cli/src/lib/sub.ts index c1a27b1ba..ec6e9c1f5 100644 --- a/cli/src/lib/sub.ts +++ b/cli/src/lib/sub.ts @@ -18,14 +18,16 @@ const sub = (options: SubscribeOptions) => { const client = mqtt.connect(connOpts) - const { maximunReconnectTimes } = options + const { outputMode, maximunReconnectTimes } = options + + const outputModeClean = outputMode === 'clean' let retryTimes = 0 - basicLog.connecting(config, connOpts.hostname!, connOpts.port, options.topic.join(', ')) + !outputModeClean && basicLog.connecting(config, connOpts.hostname!, connOpts.port, options.topic.join(', ')) client.on('connect', () => { - basicLog.connected() + !outputModeClean && basicLog.connected() retryTimes = 0 @@ -36,19 +38,19 @@ const sub = (options: SubscribeOptions) => { topic.forEach((t: string, index: number) => { const subOpts = subOptsArray[index] - basicLog.subscribing(t) + !outputModeClean && basicLog.subscribing(t) client.subscribe(t, subOpts, (err, result) => { if (err) { - basicLog.error(err) + !outputModeClean && basicLog.error(err) process.exit(1) } else { - basicLog.subscribed(t) + !outputModeClean && basicLog.subscribed(t) } result.forEach((sub) => { if (sub.qos > 2) { - basicLog.subscriptionNegated(sub) + !outputModeClean && basicLog.subscriptionNegated(sub) process.exit(1) } }) @@ -81,11 +83,13 @@ const sub = (options: SubscribeOptions) => { msgData.push({ label: 'userProperties', value: up }) } - msgLog(msgData) + !outputModeClean + ? msgLog(msgData) + : console.log(JSON.stringify({ topic, payload: convertPayload(payload, format), packet }, null, 2)) }) client.on('error', (err) => { - basicLog.error(err) + !outputModeClean && basicLog.error(err) client.end() }) @@ -93,15 +97,15 @@ const sub = (options: SubscribeOptions) => { retryTimes += 1 if (retryTimes > maximunReconnectTimes) { client.end(false, {}, () => { - basicLog.reconnectTimesLimit() + !outputModeClean && basicLog.reconnectTimesLimit() }) } else { - basicLog.reconnecting() + !outputModeClean && basicLog.reconnecting() } }) client.on('close', () => { - basicLog.close() + !outputModeClean && basicLog.close() }) } diff --git a/cli/src/types/global.d.ts b/cli/src/types/global.d.ts index ae00d0463..7fb9110b6 100644 --- a/cli/src/types/global.d.ts +++ b/cli/src/types/global.d.ts @@ -9,6 +9,8 @@ declare global { type FormatType = 'base64' | 'json' | 'hex' + type OutputMode = 'clean' | 'default' + interface ConnectOptions { mqttVersion: MQTTVersion hostname: string @@ -78,6 +80,7 @@ declare global { retainHandling?: QoS[] subscriptionIdentifier?: number[] format?: FormatType + outputMode?: OutputMode verbose: boolean connUserProperties?: Record } @@ -96,7 +99,7 @@ declare global { verbose: boolean } - type OmitSubscribeOptions = Omit + type OmitSubscribeOptions = Omit interface BenchSubscribeOptions extends OmitSubscribeOptions { count: number diff --git a/cli/src/utils/parse.ts b/cli/src/utils/parse.ts index 210f4bd8e..2f8f900b0 100644 --- a/cli/src/utils/parse.ts +++ b/cli/src/utils/parse.ts @@ -104,6 +104,14 @@ const parseFormat = (value: string) => { return value } +const parseOutputMode = (value: string) => { + if (!['clean', 'default'].includes(value)) { + signale.error('Not a valid output mode.') + process.exit(1) + } + return value +} + const parseConnectOptions = ( options: ConnectOptions | PublishOptions | SubscribeOptions, commandType?: CommandType, @@ -326,6 +334,7 @@ export { checkTopicExists, parsePubTopic, parseFormat, + parseOutputMode, parseConnectOptions, parsePublishOptions, parseSubscribeOptions,