kafka-console 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # Kafka CLI tool
2
+
3
+ Command line tool to sufficiently and easy work with Kafka
4
+
5
+ [![NPM version][npm-image]][npm-url]
6
+ [![Downloads][downloads-image]][npm-url]
7
+
8
+
9
+ ## Installation
10
+
11
+ ```sh
12
+ npm install -g kafka-console
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ### Consumer usage
18
+
19
+ General usage with authentication
20
+ ```sh
21
+ kcli consume $KAFKA_TOPIC -g $KAFKA_TOPIC_GROUP -b $KAFKA_BROKERS --ssl --mechanism plain --username $KAFKA_USERNAME --password $KAFKA_PASSWORD
22
+ ```
23
+
24
+ Stdout `jq` example
25
+ ```sh
26
+ kcli consume $KAFKA_TOPIC | jq .value
27
+ ```
28
+
29
+ Custom data formatter example
30
+ ```sh
31
+ kcli consume $KAFKA_TOPIC --format ./formatter/avro.js | jq
32
+ ```
33
+
34
+ ### Producer usage
35
+
36
+ General usage
37
+ ```sh
38
+ kcli produce $KAFKA_TOPIC -b $KAFKA_BROKERS --ssl --mechanism plain --username $KAFKA_USERNAME --password $KAFKA_PASSWORD
39
+ ```
40
+
41
+ Produce a json data from stdin with custom formatter
42
+ ```sh
43
+ cat payload.txt|kcli produce $KAFKA_TOPIC --format ./formatter/avro.js
44
+ ```
45
+
46
+ Produce a json data from stdin
47
+ ```sh
48
+ node payloadGenerator.js|kcli produce $KAFKA_TOPIC
49
+ ```
50
+
51
+ Produce a json array data from stdin
52
+ ```sh
53
+ cat payload.json|jq -r -c .[]|kcli produce $KAFKA_TOPIC
54
+ ```
55
+
56
+ Payload single message input interface
57
+ ```typescript
58
+ interface Payload {
59
+ key?: string; // kafka
60
+ value: any;
61
+ headers?: { [key: string]: value };
62
+ }
63
+ ```
64
+
65
+ ### Formatters
66
+
67
+ ```typescript
68
+ export interface Encoder<T> {
69
+ (value: T): Promise<string | Buffer> | string | Buffer;
70
+ }
71
+
72
+ export interface Decoder<T> {
73
+ (value: string | Buffer): Promise<T> | T;
74
+ }
75
+
76
+ export interface Formatter<T> {
77
+ encode: Encoder<T>;
78
+ decode: Decoder<T>;
79
+ }
80
+ ```
81
+
82
+ ## License
83
+ License [The MIT License](http://opensource.org/licenses/MIT)
84
+ Copyright (c) 2020 Ivan Zakharchanka
85
+
86
+ [npm-url]: https://www.npmjs.com/package/kafka-console
87
+ [downloads-image]: https://img.shields.io/npm/dw/kafka-console.svg?maxAge=43200
88
+ [npm-image]: https://img.shields.io/npm/v/kafka-console.svg?maxAge=43200
package/build/cli.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ require("./index");
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ const kafka_1 = require("../utils/kafka");
24
+ function config(opts, { parent }) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ const _a = Object.assign(Object.assign({}, parent.opts()), opts), { resource, resourceName: name, brokers, logLevel, ssl } = _a, rest = __rest(_a, ["resource", "resourceName", "brokers", "logLevel", "ssl"]);
27
+ const sasl = (0, kafka_1.getSASL)(rest);
28
+ const client = (0, kafka_1.createClient)(brokers, ssl, sasl, logLevel);
29
+ const admin = yield (0, kafka_1.createAdmin)(client);
30
+ const { resources } = yield admin.describeConfigs({
31
+ includeSynonyms: true,
32
+ resources: [
33
+ {
34
+ type: resource,
35
+ name,
36
+ },
37
+ ],
38
+ });
39
+ for (let resource of resources) {
40
+ console.log(resource);
41
+ }
42
+ yield admin.disconnect();
43
+ });
44
+ }
45
+ exports.default = config;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ var __rest = (this && this.__rest) || function (s, e) {
31
+ var t = {};
32
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
33
+ t[p] = s[p];
34
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
35
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
36
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
37
+ t[p[i]] = s[p[i]];
38
+ }
39
+ return t;
40
+ };
41
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
42
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
43
+ var m = o[Symbol.asyncIterator], i;
44
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
45
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
46
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
47
+ };
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ const Fs = __importStar(require("fs"));
50
+ const kafka_1 = require("../utils/kafka");
51
+ const formatters_1 = require("../utils/formatters");
52
+ function consume(topic, opts, { parent }) {
53
+ var e_1, _a;
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ const _b = Object.assign(Object.assign({}, parent.opts()), opts), { group, format, fromBeginning, filename, brokers, logLevel, ssl } = _b, rest = __rest(_b, ["group", "format", "fromBeginning", "filename", "brokers", "logLevel", "ssl"]);
56
+ const sasl = (0, kafka_1.getSASL)(rest);
57
+ const client = (0, kafka_1.createClient)(brokers, ssl, sasl, logLevel);
58
+ const output = filename ? Fs.createWriteStream(filename) : process.stdout;
59
+ const consumer = yield (0, kafka_1.createConsumer)(client, group, topic, fromBeginning);
60
+ const formatter = (0, formatters_1.getFormatter)(format);
61
+ try {
62
+ for (var consumer_1 = __asyncValues(consumer), consumer_1_1; consumer_1_1 = yield consumer_1.next(), !consumer_1_1.done;) {
63
+ let { message: { headers, key, value } } = consumer_1_1.value;
64
+ const parsedHeaders = Object.entries(headers).reduce((result, [key, value]) => {
65
+ return Object.assign(Object.assign({}, result), { [key]: value.toString() });
66
+ }, {});
67
+ const message = { headers: parsedHeaders, key: key === null || key === void 0 ? void 0 : key.toString(), value: yield formatter.decode(value) };
68
+ output.write(JSON.stringify(message, null, ' ') + '\n');
69
+ }
70
+ }
71
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
72
+ finally {
73
+ try {
74
+ if (consumer_1_1 && !consumer_1_1.done && (_a = consumer_1.return)) yield _a.call(consumer_1);
75
+ }
76
+ finally { if (e_1) throw e_1.error; }
77
+ }
78
+ });
79
+ }
80
+ exports.default = consume;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ const kafka_1 = require("../utils/kafka");
24
+ function createTopic(topic, opts, { parent }) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ const _a = Object.assign(Object.assign({}, parent.opts()), opts), { brokers, logLevel, ssl } = _a, rest = __rest(_a, ["brokers", "logLevel", "ssl"]);
27
+ const sasl = (0, kafka_1.getSASL)(rest);
28
+ const client = (0, kafka_1.createClient)(brokers, ssl, sasl, logLevel);
29
+ const admin = yield (0, kafka_1.createAdmin)(client);
30
+ const topics = yield admin.createTopics({
31
+ topics: [{ topic }],
32
+ });
33
+ console.log(topics);
34
+ yield admin.disconnect();
35
+ });
36
+ }
37
+ exports.default = createTopic;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ const kafka_1 = require("../utils/kafka");
24
+ function deleteTopic(topic, opts, { parent }) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ const _a = Object.assign(Object.assign({}, parent.opts()), opts), { brokers, logLevel, ssl } = _a, rest = __rest(_a, ["brokers", "logLevel", "ssl"]);
27
+ const sasl = (0, kafka_1.getSASL)(rest);
28
+ const client = (0, kafka_1.createClient)(brokers, ssl, sasl, logLevel);
29
+ const admin = yield (0, kafka_1.createAdmin)(client);
30
+ yield admin.deleteTopics({
31
+ topics: [topic],
32
+ });
33
+ yield admin.disconnect();
34
+ });
35
+ }
36
+ exports.default = deleteTopic;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ const kafka_1 = require("../utils/kafka");
24
+ function list(opts, { parent }) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ const _a = Object.assign(Object.assign({}, parent.opts()), opts), { all, brokers, logLevel, ssl } = _a, rest = __rest(_a, ["all", "brokers", "logLevel", "ssl"]);
27
+ const sasl = (0, kafka_1.getSASL)(rest);
28
+ const client = (0, kafka_1.createClient)(brokers, ssl, sasl, logLevel);
29
+ const cluster = yield (0, kafka_1.createCluster)(client);
30
+ const topics = (yield cluster.metadata()).topicMetadata
31
+ .filter(topic => all || !topic.isInternal)
32
+ .map(({ topic }) => topic);
33
+ for (const topic of topics) {
34
+ console.log(topic);
35
+ }
36
+ yield cluster.disconnect();
37
+ });
38
+ }
39
+ exports.default = list;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ const kafka_1 = require("../utils/kafka");
24
+ function metadata(opts, { parent }) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ const _a = Object.assign(Object.assign({}, parent.opts()), opts), { brokers, logLevel, ssl } = _a, rest = __rest(_a, ["brokers", "logLevel", "ssl"]);
27
+ const sasl = (0, kafka_1.getSASL)(rest);
28
+ const client = (0, kafka_1.createClient)(brokers, ssl, sasl, logLevel);
29
+ const cluster = yield (0, kafka_1.createCluster)(client);
30
+ const metadata = yield cluster.metadata();
31
+ console.log(JSON.stringify(metadata, null, ' '));
32
+ yield cluster.disconnect();
33
+ });
34
+ }
35
+ exports.default = metadata;
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ var __rest = (this && this.__rest) || function (s, e) {
31
+ var t = {};
32
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
33
+ t[p] = s[p];
34
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
35
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
36
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
37
+ t[p[i]] = s[p[i]];
38
+ }
39
+ return t;
40
+ };
41
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
42
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
43
+ var m = o[Symbol.asyncIterator], i;
44
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
45
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
46
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
47
+ };
48
+ var __importDefault = (this && this.__importDefault) || function (mod) {
49
+ return (mod && mod.__esModule) ? mod : { "default": mod };
50
+ };
51
+ Object.defineProperty(exports, "__esModule", { value: true });
52
+ const Fs = __importStar(require("fs"));
53
+ const stream_1 = require("stream");
54
+ const readline_1 = require("readline");
55
+ const util_1 = require("util");
56
+ const pool_1 = __importDefault(require("../utils/pool"));
57
+ const kafka_1 = require("../utils/kafka");
58
+ const formatters_1 = require("../utils/formatters");
59
+ const readFile = (0, util_1.promisify)(Fs.readFile);
60
+ function getInput(filename) {
61
+ return __awaiter(this, void 0, void 0, function* () {
62
+ if (filename) {
63
+ const content = yield readFile(filename, 'utf8');
64
+ const result = JSON.parse(content);
65
+ return new pool_1.default(result).done();
66
+ }
67
+ else {
68
+ const input = new stream_1.PassThrough();
69
+ const readLine = (0, readline_1.createInterface)({ input });
70
+ const dataPool = new pool_1.default();
71
+ readLine.on('line', (line) => __awaiter(this, void 0, void 0, function* () {
72
+ dataPool.push(yield JSON.parse(line));
73
+ }));
74
+ readLine.on('close', () => dataPool.done());
75
+ process.stdin.pipe(input);
76
+ return dataPool;
77
+ }
78
+ });
79
+ }
80
+ function produce(topic, opts, { parent }) {
81
+ var e_1, _a;
82
+ return __awaiter(this, void 0, void 0, function* () {
83
+ const _b = Object.assign(Object.assign({}, parent.opts()), opts), { format, header, input: filename, delay, brokers, logLevel, ssl } = _b, rest = __rest(_b, ["format", "header", "input", "delay", "brokers", "logLevel", "ssl"]);
84
+ const sasl = (0, kafka_1.getSASL)(rest);
85
+ const client = (0, kafka_1.createClient)(brokers, ssl, sasl, logLevel);
86
+ const producer = yield (0, kafka_1.createProducer)(client, topic);
87
+ const staticHeaders = header.reduce((result, header) => {
88
+ try {
89
+ const [, key, value] = header.match(/^([^:]+):(.*)$/);
90
+ return Object.assign(Object.assign({}, result), { [key.trim()]: value.trim() });
91
+ }
92
+ catch (e) {
93
+ console.error(e);
94
+ }
95
+ return result;
96
+ }, {});
97
+ const formatter = (0, formatters_1.getFormatter)(format);
98
+ const input = yield getInput(filename);
99
+ try {
100
+ for (var input_1 = __asyncValues(input), input_1_1; input_1_1 = yield input_1.next(), !input_1_1.done;) {
101
+ let { key, value, headers } = input_1_1.value;
102
+ const encodedValue = yield formatter.encode(value);
103
+ const message = { key, value: encodedValue, headers: Object.assign(Object.assign({}, staticHeaders), headers) };
104
+ producer.push(message);
105
+ yield new Promise(resolve => setTimeout(resolve, delay));
106
+ }
107
+ }
108
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
109
+ finally {
110
+ try {
111
+ if (input_1_1 && !input_1_1.done && (_a = input_1.return)) yield _a.call(input_1);
112
+ }
113
+ finally { if (e_1) throw e_1.error; }
114
+ }
115
+ producer.done();
116
+ });
117
+ }
118
+ exports.default = produce;
package/build/index.js ADDED
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const commander_1 = require("commander");
7
+ const kafka_1 = require("./utils/kafka");
8
+ const consume_1 = __importDefault(require("./commands/consume"));
9
+ const produce_1 = __importDefault(require("./commands/produce"));
10
+ const metadata_1 = __importDefault(require("./commands/metadata"));
11
+ const list_1 = __importDefault(require("./commands/list"));
12
+ const config_1 = __importDefault(require("./commands/config"));
13
+ const createTopic_1 = __importDefault(require("./commands/createTopic"));
14
+ const deleteTopic_1 = __importDefault(require("./commands/deleteTopic"));
15
+ const { version } = require('../package.json');
16
+ function collect(value, result) {
17
+ return result.concat([value]);
18
+ }
19
+ const commander = new commander_1.Command();
20
+ commander
21
+ .option('-b, --brokers <brokers>', 'bootstrap server host', process.env.KAFKA_BROKERS || 'localhost:9092')
22
+ .option('-l, --log-level <logLevel>', 'log level')
23
+ .option('--ssl', 'enable ssl', false)
24
+ .option('--mechanism <mechanism>', 'sasl mechanism', process.env.KAFKA_MECHANISM)
25
+ .option('--username <username>', 'sasl username', process.env.KAFKA_USERNAME)
26
+ .option('--password <password>', 'sasl password', process.env.KAFKA_PASSWORD)
27
+ .option('--auth-id <authId>', 'sasl aws authorization identity', process.env.KAFKA_AUTH_ID)
28
+ .option('--access-key-id <accessKeyId>', 'sasl aws access key id', process.env.KAFKA_ACCESS_KEY_ID)
29
+ .option('--secret-access-key <secretAccessKey>', 'sasl aws secret access key', process.env.KAFKA_SECRET_ACCESS_KEY)
30
+ .option('--session-token <seccionToken>', 'sasl aws session token', process.env.KAFKA_SESSION_TOKEN)
31
+ .option('--oauth-bearer <oauthBearer>', 'sasl oauth bearer token', process.env.KAFKA_OAUTH_BEARER)
32
+ .version(version);
33
+ commander
34
+ .command('consume <topic>')
35
+ .requiredOption('-g, --group <group>', 'consumer group name')
36
+ .option('-f, --format <format>', 'message type decoding', 'json')
37
+ .option('-o, --output <filename>', 'write output to specified filename')
38
+ .option('-a, --from-beginning', 'read messages from the beginning', false)
39
+ .description('Consume kafka topic events')
40
+ .action(consume_1.default);
41
+ commander
42
+ .command('produce <topic>')
43
+ .option('-f, --format <format>', 'message format encoding', 'json')
44
+ .option('-i, --input <filename>', 'input filename')
45
+ .option('-d, --delay <delay>', 'delay in ms after event emitting', parseInt, 0)
46
+ .option('-h, --header <header>', 'set a static header', collect, [])
47
+ .description('Produce kafka topic events')
48
+ .action(produce_1.default);
49
+ commander
50
+ .command('metadata')
51
+ .description('Displays kafka server metadata')
52
+ .action(metadata_1.default);
53
+ commander
54
+ .command('list')
55
+ .alias('ls')
56
+ .option('-a, --all', 'include internal topics')
57
+ .description('Lists kafka topics')
58
+ .action(list_1.default);
59
+ commander
60
+ .command('config')
61
+ .requiredOption('-r, --resource <resource>', 'resource', kafka_1.resourceParser)
62
+ .requiredOption('-n, --resourceName <resourceName>', 'resource name')
63
+ .description('Describes config for specific resource')
64
+ .action(config_1.default);
65
+ commander
66
+ .command('create <topic>')
67
+ .description('Creates kafka topic')
68
+ .action(createTopic_1.default);
69
+ commander
70
+ .command('delete <topic>')
71
+ .description('Deletes kafka topic')
72
+ .action(deleteTopic_1.default);
73
+ commander.on('--help', function () {
74
+ [
75
+ '',
76
+ 'Examples:',
77
+ '',
78
+ ' General consumer usage',
79
+ ' $ kcli consume $KAFKA_TOPIC -g $KAFKA_TOPIC_GROUP -b $KAFKA_BROKERS --ssl --mechanism plain --username $KAFKA_USERNAME --password $KAFKA_PASSWORD',
80
+ '',
81
+ ' Extracting consumer output with jq',
82
+ ' $ kcli consume $KAFKA_TOPIC -g $KAFKA_TOPIC_GROUP --f ./formatter/avro.js | jq .value',
83
+ '',
84
+ ' General producer usage',
85
+ ' $ kcli produce $KAFKA_TOPIC -b $KAFKA_BROKERS --ssl --mechanism plain --username $KAFKA_USERNAME --password $KAFKA_PASSWORD',
86
+ '',
87
+ ' Preparing producer payload json data with jq',
88
+ ' $ cat payload.json|jq -r -c .[]|kcli produce $KAFKA_TOPIC -f ./formatter/avro.js',
89
+ '',
90
+ ].forEach(msg => console.log(msg));
91
+ });
92
+ commander.parse(process.argv);
93
+ exports.default = commander;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getFormatter = exports.json = exports.js = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const vm_1 = require("vm");
9
+ exports.js = {
10
+ encode: (value) => JSON.stringify(value, null, ' '),
11
+ decode: (value) => (0, vm_1.runInNewContext)(value.toString(), { module: {} }),
12
+ };
13
+ exports.json = {
14
+ encode: (value) => JSON.stringify(value),
15
+ decode: (value) => JSON.parse(value.toString()),
16
+ };
17
+ function getFormatter(format) {
18
+ switch (format) {
19
+ case 'json':
20
+ return exports.json;
21
+ case 'js':
22
+ return exports.js;
23
+ default:
24
+ const modulePath = path_1.default.resolve(process.cwd(), format);
25
+ return require(modulePath);
26
+ }
27
+ }
28
+ exports.getFormatter = getFormatter;
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
12
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
13
+ var m = o[Symbol.asyncIterator], i;
14
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
15
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
16
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
17
+ };
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.createProducer = exports.createConsumer = exports.createAdmin = exports.createCluster = exports.createClient = exports.getSASL = exports.resourceParser = exports.logLevelParser = void 0;
23
+ const kafkajs_1 = require("kafkajs");
24
+ const pool_1 = __importDefault(require("./pool"));
25
+ function logLevelParser(level) {
26
+ if (/error/.test(level)) {
27
+ return kafkajs_1.logLevel.ERROR;
28
+ }
29
+ if (/warn/.test(level)) {
30
+ return kafkajs_1.logLevel.WARN;
31
+ }
32
+ if (/info/.test(level)) {
33
+ return kafkajs_1.logLevel.INFO;
34
+ }
35
+ if (/debug/.test(level)) {
36
+ return kafkajs_1.logLevel.DEBUG;
37
+ }
38
+ return kafkajs_1.logLevel.NOTHING;
39
+ }
40
+ exports.logLevelParser = logLevelParser;
41
+ function resourceParser(resource) {
42
+ if (/^any$/i.test(resource)) {
43
+ return kafkajs_1.ResourceTypes.ANY;
44
+ }
45
+ if (/^topic$/i.test(resource)) {
46
+ return kafkajs_1.ResourceTypes.TOPIC;
47
+ }
48
+ if (/^group$/i.test(resource)) {
49
+ return kafkajs_1.ResourceTypes.GROUP;
50
+ }
51
+ if (/^cluster$/i.test(resource)) {
52
+ return kafkajs_1.ResourceTypes.CLUSTER;
53
+ }
54
+ if (/^transactional.?id$/i.test(resource)) {
55
+ return kafkajs_1.ResourceTypes.TRANSACTIONAL_ID;
56
+ }
57
+ if (/^delegation.?token$/i.test(resource)) {
58
+ return kafkajs_1.ResourceTypes.DELEGATION_TOKEN;
59
+ }
60
+ return kafkajs_1.ResourceTypes.UNKNOWN;
61
+ }
62
+ exports.resourceParser = resourceParser;
63
+ const SASLMap = {
64
+ 'plain': (username, password) => ({ username, password }),
65
+ 'scram-sha-256': (username, password) => ({ username, password }),
66
+ 'scram-sha-512': (username, password) => ({ username, password }),
67
+ };
68
+ function getSASL({ mechanism, username, password, authorizationIdentity, accessKeyId, secretAccessKey, sessionToken, oauthBearer, }) {
69
+ switch (mechanism) {
70
+ case 'plain':
71
+ case 'scram-sha-256':
72
+ case 'scram-sha-512':
73
+ return { mechanism, username, password };
74
+ case 'aws':
75
+ return { mechanism, authorizationIdentity, accessKeyId, secretAccessKey, sessionToken };
76
+ case 'oauthbearer':
77
+ const oauthBearerProvider = () => __awaiter(this, void 0, void 0, function* () { return ({ value: oauthBearer }); });
78
+ return { mechanism, oauthBearerProvider };
79
+ }
80
+ }
81
+ exports.getSASL = getSASL;
82
+ function createClient(bootstrapServer, ssl, sasl, level) {
83
+ const options = {
84
+ clientId: 'Kafka CLI',
85
+ brokers: bootstrapServer.split(','),
86
+ ssl,
87
+ logLevel: logLevelParser(level),
88
+ sasl,
89
+ };
90
+ return new kafkajs_1.Kafka(options);
91
+ }
92
+ exports.createClient = createClient;
93
+ function createCluster(client) {
94
+ return __awaiter(this, void 0, void 0, function* () {
95
+ const createClusterKey = Reflect.ownKeys(client).find(key => /createCluster/.test(key.toString()));
96
+ const createCluster = Reflect.get(client, createClusterKey);
97
+ const cluster = createCluster({});
98
+ yield cluster.connect();
99
+ return cluster;
100
+ });
101
+ }
102
+ exports.createCluster = createCluster;
103
+ function createAdmin(client) {
104
+ return __awaiter(this, void 0, void 0, function* () {
105
+ const admin = client.admin();
106
+ yield admin.connect();
107
+ return admin;
108
+ });
109
+ }
110
+ exports.createAdmin = createAdmin;
111
+ function createConsumer(client, group, topic, fromBeginning = false) {
112
+ return __awaiter(this, void 0, void 0, function* () {
113
+ const consumerConfig = {
114
+ groupId: group,
115
+ };
116
+ const consumerOptions = {
117
+ topic,
118
+ fromBeginning,
119
+ };
120
+ const consumer = client.consumer(consumerConfig);
121
+ yield consumer.connect();
122
+ yield consumer.subscribe(consumerOptions);
123
+ const pool = new pool_1.default();
124
+ pool.onDone(() => {
125
+ consumer.disconnect();
126
+ });
127
+ consumer.run({
128
+ eachMessage: (payload) => __awaiter(this, void 0, void 0, function* () {
129
+ pool.push(payload);
130
+ }),
131
+ }).catch(e => console.error(e));
132
+ return pool;
133
+ });
134
+ }
135
+ exports.createConsumer = createConsumer;
136
+ function createProducer(client, topic) {
137
+ return __awaiter(this, void 0, void 0, function* () {
138
+ const producer = client.producer();
139
+ yield producer.connect();
140
+ const pool = new pool_1.default();
141
+ pool.onDone(() => {
142
+ producer.disconnect();
143
+ });
144
+ (() => __awaiter(this, void 0, void 0, function* () {
145
+ var e_1, _a;
146
+ try {
147
+ for (var pool_2 = __asyncValues(pool), pool_2_1; pool_2_1 = yield pool_2.next(), !pool_2_1.done;) {
148
+ let message = pool_2_1.value;
149
+ yield producer.send({
150
+ topic,
151
+ messages: [message],
152
+ });
153
+ }
154
+ }
155
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
156
+ finally {
157
+ try {
158
+ if (pool_2_1 && !pool_2_1.done && (_a = pool_2.return)) yield _a.call(pool_2);
159
+ }
160
+ finally { if (e_1) throw e_1.error; }
161
+ }
162
+ }))().catch(e => console.error(e));
163
+ return pool;
164
+ });
165
+ }
166
+ exports.createProducer = createProducer;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
12
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
13
+ var m = o[Symbol.asyncIterator], i;
14
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
15
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
16
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
17
+ };
18
+ var __importDefault = (this && this.__importDefault) || function (mod) {
19
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.CancelToken = exports.createItem = void 0;
23
+ const evnty_1 = __importDefault(require("evnty"));
24
+ function createItem() {
25
+ const result = {};
26
+ result.promise = new Promise((resolve, reject) => {
27
+ result.resolve = resolve;
28
+ result.reject = reject;
29
+ });
30
+ return result;
31
+ }
32
+ exports.createItem = createItem;
33
+ class CancelToken {
34
+ }
35
+ exports.CancelToken = CancelToken;
36
+ class Pool {
37
+ constructor(values = []) {
38
+ this.pool = [createItem()];
39
+ this.doneEvent = (0, evnty_1.default)();
40
+ values.forEach(value => this.push(value));
41
+ }
42
+ push(value) {
43
+ this.pool[this.pool.length - 1].resolve(value);
44
+ this.pool.push(createItem());
45
+ return this;
46
+ }
47
+ done() {
48
+ this.pool[this.pool.length - 1].resolve(new CancelToken());
49
+ return this;
50
+ }
51
+ onDone(callback) {
52
+ this.doneEvent.on(callback);
53
+ return this;
54
+ }
55
+ toArray() {
56
+ var e_1, _a;
57
+ return __awaiter(this, void 0, void 0, function* () {
58
+ const result = [];
59
+ try {
60
+ for (var _b = __asyncValues(this), _c; _c = yield _b.next(), !_c.done;) {
61
+ let item = _c.value;
62
+ result.push(item);
63
+ }
64
+ }
65
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
66
+ finally {
67
+ try {
68
+ if (_c && !_c.done && (_a = _b.return)) yield _a.call(_b);
69
+ }
70
+ finally { if (e_1) throw e_1.error; }
71
+ }
72
+ return result;
73
+ });
74
+ }
75
+ [Symbol.asyncIterator]() {
76
+ let i = 0;
77
+ return {
78
+ i,
79
+ next: () => __awaiter(this, void 0, void 0, function* () {
80
+ const value = yield this.pool[0].promise;
81
+ this.pool.shift();
82
+ if (value instanceof CancelToken) {
83
+ this.doneEvent();
84
+ return {
85
+ i: ++i,
86
+ done: true,
87
+ };
88
+ }
89
+ return {
90
+ i: ++i,
91
+ value,
92
+ done: false,
93
+ };
94
+ }),
95
+ };
96
+ }
97
+ ;
98
+ }
99
+ exports.default = Pool;
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "kafka-console",
3
+ "version": "1.1.0",
4
+ "description": "Kafka CLI tool",
5
+ "main": "index.js",
6
+ "bin": {
7
+ "kcli": "build/cli.js",
8
+ "kafka-console": "build/cli.js"
9
+ },
10
+ "scripts": {
11
+ "build": "rm -rf build && tsc",
12
+ "test": "NODE_ENV=test jest",
13
+ "test:cov": "COVERAGE=1 NODE_ENV=test jest",
14
+ "kcli": "ts-node src/index.ts"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/3axap4eHko/kafka-console.git"
19
+ },
20
+ "keywords": [],
21
+ "author": "Ivan Zakharchanka",
22
+ "license": "MIT",
23
+ "bugs": {
24
+ "url": "https://github.com/3axap4eHko/kafka-console/issues"
25
+ },
26
+ "homepage": "https://github.com/3axap4eHko/kafka-console#readme",
27
+ "devDependencies": {
28
+ "@types/commander": "^2.12.2",
29
+ "@types/jest": "^27.0.1",
30
+ "@types/js-yaml": "^4.0.3",
31
+ "@types/node": "^16.9.2",
32
+ "@types/winston": "^2.4.4",
33
+ "dotenv": "^10.0.0",
34
+ "jest": "^27.2.0",
35
+ "ts-jest": "^27.0.5",
36
+ "ts-node": "^10.2.1",
37
+ "typescript": "^4.4.3"
38
+ },
39
+ "dependencies": {
40
+ "commander": "^8.2.0",
41
+ "evnty": "^0.6.15",
42
+ "kafkajs": "^1.15.0"
43
+ }
44
+ }