1 | #!/usr/bin/env node
|
2 |
|
3 | const parse = require("minimist");
|
4 | const { connect, StringCodec, headers, credsAuthenticator } = require("../");
|
5 | const { delay } = require("./util");
|
6 | const fs = require("fs");
|
7 |
|
8 | const argv = parse(
|
9 | process.argv.slice(2),
|
10 | {
|
11 | alias: {
|
12 | "s": ["server"],
|
13 | "c": ["count"],
|
14 | "i": ["interval"],
|
15 | "t": ["timeout"],
|
16 | "f": ["creds"],
|
17 | },
|
18 | default: {
|
19 | s: "127.0.0.1:4222",
|
20 | c: 1,
|
21 | i: 0,
|
22 | t: 1000,
|
23 | },
|
24 | boolean: true,
|
25 | string: ["server", "count", "interval", "headers", "creds"],
|
26 | },
|
27 | );
|
28 |
|
29 | const opts = { servers: argv.s };
|
30 | const subject = String(argv._[0]);
|
31 | const payload = String(argv._[1]) || "";
|
32 | const count = (argv.c == -1 ? Number.MAX_SAFE_INTEGER : argv.c) || 1;
|
33 | const interval = argv.i;
|
34 |
|
35 | if (argv.debug) {
|
36 | opts.debug = true;
|
37 | }
|
38 |
|
39 | if (argv.creds) {
|
40 | const data = fs.readFileSync(argv.creds);
|
41 | opts.authenticator = credsAuthenticator(data);
|
42 | }
|
43 |
|
44 | if (argv.h || argv.help || !subject) {
|
45 | console.log(
|
46 | "Usage: nats-pub [-s server] [--creds=/path/file.creds] [-c <count>=1] [-t <timeout>=1000] [-i <interval>=0] [--headers='k=v;k2=v2' subject [msg]",
|
47 | );
|
48 | console.log("to request forever, specify -c=-1 or --count=-1");
|
49 | process.exit(1);
|
50 | }
|
51 |
|
52 | const sc = StringCodec();
|
53 |
|
54 | (async () => {
|
55 | let nc;
|
56 | try {
|
57 | nc = await connect(opts);
|
58 | } catch (err) {
|
59 | console.log(`error connecting to nats: ${err.message}`);
|
60 | return;
|
61 | }
|
62 | console.info(`connected ${nc.getServer()}`);
|
63 | nc.closed()
|
64 | .then((err) => {
|
65 | if (err) {
|
66 | console.error(`closed with an error: ${err.message}`);
|
67 | }
|
68 | });
|
69 |
|
70 | const hdrs = argv.headers ? headers() : undefined;
|
71 | if (hdrs) {
|
72 | argv.headers.split(";").map((l) => {
|
73 | const [k, v] = l.split("=");
|
74 | hdrs.append(k, v);
|
75 | });
|
76 | }
|
77 |
|
78 | for (let i = 1; i <= count; i++) {
|
79 | await nc.request(
|
80 | subject,
|
81 | sc.encode(payload),
|
82 | { timeout: argv.t, headers: hdrs },
|
83 | )
|
84 | .then((m) => {
|
85 | console.log(`[${i}]: ${sc.decode(m.data)}`);
|
86 | if (argv.headers && m.headers) {
|
87 | const h = [];
|
88 | for (const [key, value] of m.headers) {
|
89 | h.push(`${key}=${value}`);
|
90 | }
|
91 | console.log(`\t${h.join(";")}`);
|
92 | }
|
93 | })
|
94 | .catch((err) => {
|
95 | console.log(`[${i}]: request failed: ${err.message}`);
|
96 | });
|
97 | if (interval) {
|
98 | await delay(interval);
|
99 | }
|
100 | }
|
101 | await nc.flush();
|
102 | await nc.close();
|
103 | })();
|