ffi-nats-core 0.3.0 → 0.3.1

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.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/ffi-nats-core.gemspec +8 -0
  3. data/lib/ffi/nats/core/version.rb +1 -1
  4. data/vendor/cnats/CMakeLists.txt +137 -0
  5. data/vendor/cnats/adapters/libevent.h +220 -0
  6. data/vendor/cnats/adapters/libuv.h +472 -0
  7. data/vendor/cnats/examples/CMakeLists.txt +56 -0
  8. data/vendor/cnats/examples/asynctimeout.c +83 -0
  9. data/vendor/cnats/examples/examples.h +322 -0
  10. data/vendor/cnats/examples/libevent-pub.c +136 -0
  11. data/vendor/cnats/examples/libevent-sub.c +104 -0
  12. data/vendor/cnats/examples/libuv-pub.c +120 -0
  13. data/vendor/cnats/examples/libuv-sub.c +114 -0
  14. data/vendor/cnats/examples/publisher.c +62 -0
  15. data/vendor/cnats/examples/queuegroup.c +132 -0
  16. data/vendor/cnats/examples/replier.c +149 -0
  17. data/vendor/cnats/examples/requestor.c +75 -0
  18. data/vendor/cnats/examples/subscriber.c +133 -0
  19. data/vendor/cnats/src/CMakeLists.txt +31 -0
  20. data/vendor/cnats/src/asynccb.c +66 -0
  21. data/vendor/cnats/src/asynccb.h +42 -0
  22. data/vendor/cnats/src/buf.c +246 -0
  23. data/vendor/cnats/src/buf.h +116 -0
  24. data/vendor/cnats/src/comsock.c +474 -0
  25. data/vendor/cnats/src/comsock.h +81 -0
  26. data/vendor/cnats/src/conn.c +2725 -0
  27. data/vendor/cnats/src/conn.h +75 -0
  28. data/vendor/cnats/src/err.h +31 -0
  29. data/vendor/cnats/src/gc.h +27 -0
  30. data/vendor/cnats/src/hash.c +725 -0
  31. data/vendor/cnats/src/hash.h +141 -0
  32. data/vendor/cnats/src/include/n-unix.h +56 -0
  33. data/vendor/cnats/src/include/n-win.h +59 -0
  34. data/vendor/cnats/src/mem.h +20 -0
  35. data/vendor/cnats/src/msg.c +155 -0
  36. data/vendor/cnats/src/msg.h +43 -0
  37. data/vendor/cnats/src/nats.c +1734 -0
  38. data/vendor/cnats/src/nats.h +2024 -0
  39. data/vendor/cnats/src/natsp.h +518 -0
  40. data/vendor/cnats/src/natstime.c +79 -0
  41. data/vendor/cnats/src/natstime.h +27 -0
  42. data/vendor/cnats/src/nuid.c +265 -0
  43. data/vendor/cnats/src/nuid.h +21 -0
  44. data/vendor/cnats/src/opts.c +1030 -0
  45. data/vendor/cnats/src/opts.h +19 -0
  46. data/vendor/cnats/src/parser.c +869 -0
  47. data/vendor/cnats/src/parser.h +87 -0
  48. data/vendor/cnats/src/pub.c +293 -0
  49. data/vendor/cnats/src/srvpool.c +380 -0
  50. data/vendor/cnats/src/srvpool.h +71 -0
  51. data/vendor/cnats/src/stats.c +54 -0
  52. data/vendor/cnats/src/stats.h +21 -0
  53. data/vendor/cnats/src/status.c +60 -0
  54. data/vendor/cnats/src/status.h +95 -0
  55. data/vendor/cnats/src/sub.c +956 -0
  56. data/vendor/cnats/src/sub.h +34 -0
  57. data/vendor/cnats/src/timer.c +86 -0
  58. data/vendor/cnats/src/timer.h +57 -0
  59. data/vendor/cnats/src/unix/cond.c +103 -0
  60. data/vendor/cnats/src/unix/mutex.c +107 -0
  61. data/vendor/cnats/src/unix/sock.c +105 -0
  62. data/vendor/cnats/src/unix/thread.c +162 -0
  63. data/vendor/cnats/src/url.c +134 -0
  64. data/vendor/cnats/src/url.h +24 -0
  65. data/vendor/cnats/src/util.c +823 -0
  66. data/vendor/cnats/src/util.h +75 -0
  67. data/vendor/cnats/src/version.h +29 -0
  68. data/vendor/cnats/src/version.h.in +29 -0
  69. data/vendor/cnats/src/win/cond.c +86 -0
  70. data/vendor/cnats/src/win/mutex.c +54 -0
  71. data/vendor/cnats/src/win/sock.c +158 -0
  72. data/vendor/cnats/src/win/strings.c +108 -0
  73. data/vendor/cnats/src/win/thread.c +180 -0
  74. data/vendor/cnats/test/CMakeLists.txt +35 -0
  75. data/vendor/cnats/test/certs/ca.pem +38 -0
  76. data/vendor/cnats/test/certs/client-cert.pem +30 -0
  77. data/vendor/cnats/test/certs/client-key.pem +51 -0
  78. data/vendor/cnats/test/certs/server-cert.pem +31 -0
  79. data/vendor/cnats/test/certs/server-key.pem +51 -0
  80. data/vendor/cnats/test/dylib/CMakeLists.txt +10 -0
  81. data/vendor/cnats/test/dylib/nonats.c +13 -0
  82. data/vendor/cnats/test/list.txt +125 -0
  83. data/vendor/cnats/test/test.c +11655 -0
  84. data/vendor/cnats/test/tls.conf +15 -0
  85. data/vendor/cnats/test/tlsverify.conf +19 -0
  86. metadata +83 -1
@@ -0,0 +1,62 @@
1
+ // Copyright 2015 Apcera Inc. All rights reserved.
2
+
3
+ #include "examples.h"
4
+
5
+ static const char *usage = ""\
6
+ "-txt text to send (default is 'hello')\n" \
7
+ "-count number of messages to send\n";
8
+
9
+ int main(int argc, char **argv)
10
+ {
11
+ natsConnection *conn = NULL;
12
+ natsStatistics *stats = NULL;
13
+ natsOptions *opts = NULL;
14
+ int64_t last = 0;
15
+ natsStatus s;
16
+
17
+ opts = parseArgs(argc, argv, usage);
18
+
19
+ printf("Sending %" PRId64 " messages to subject '%s'\n", total, subj);
20
+
21
+ s = natsConnection_Connect(&conn, opts);
22
+
23
+ if (s == NATS_OK)
24
+ s = natsStatistics_Create(&stats);
25
+
26
+ if (s == NATS_OK)
27
+ start = nats_Now();
28
+
29
+ for (count = 0; (s == NATS_OK) && (count < total); count++)
30
+ {
31
+ s = natsConnection_PublishString(conn, subj, txt);
32
+
33
+ if (nats_Now() - last >= 1000)
34
+ {
35
+ s = printStats(STATS_OUT, conn, NULL, stats);
36
+ last = nats_Now();
37
+ }
38
+ }
39
+
40
+ if (s == NATS_OK)
41
+ s = natsConnection_FlushTimeout(conn, 1000);
42
+
43
+ if (s == NATS_OK)
44
+ {
45
+ printPerf("Sent", total, start, elapsed);
46
+ }
47
+ else
48
+ {
49
+ printf("Error: %d - %s\n", s, natsStatus_GetText(s));
50
+ nats_PrintLastErrorStack(stderr);
51
+ }
52
+
53
+ // Destroy all our objects to avoid report of memory leak
54
+ natsStatistics_Destroy(stats);
55
+ natsConnection_Destroy(conn);
56
+ natsOptions_Destroy(opts);
57
+
58
+ // To silence reports of memory still in used with valgrind
59
+ nats_Close();
60
+
61
+ return 0;
62
+ }
@@ -0,0 +1,132 @@
1
+ // Copyright 2015-2016 Apcera Inc. All rights reserved.
2
+
3
+ #include "examples.h"
4
+
5
+ static const char *usage = "" \
6
+ "-gd use global message delivery thread pool\n" \
7
+ "-name queue name (default is 'worker')\n" \
8
+ "-count number of expected messages\n";
9
+
10
+ static void
11
+ onMsg(natsConnection *nc, natsSubscription *sub, natsMsg *msg, void *closure)
12
+ {
13
+ // If 'print' is on, the server is likely to break the connection
14
+ // since the client library will become a slow consumer.
15
+ if (print)
16
+ printf("Received msg: %s - %.*s\n",
17
+ natsMsg_GetSubject(msg),
18
+ natsMsg_GetDataLength(msg),
19
+ natsMsg_GetData(msg));
20
+
21
+ if (start == 0)
22
+ start = nats_Now();
23
+
24
+ // We should be using a mutex to protect those variables since
25
+ // they are used from the subscription's delivery and the main
26
+ // threads. For demo purposes, this is fine.
27
+ if (++count == total)
28
+ elapsed = nats_Now() - start;
29
+
30
+ natsMsg_Destroy(msg);
31
+ }
32
+
33
+ static void
34
+ asyncCb(natsConnection *nc, natsSubscription *sub, natsStatus err, void *closure)
35
+ {
36
+ printf("Async error: %d - %s\n", err, natsStatus_GetText(err));
37
+ }
38
+
39
+ int main(int argc, char **argv)
40
+ {
41
+ natsConnection *conn = NULL;
42
+ natsOptions *opts = NULL;
43
+ natsSubscription *sub = NULL;
44
+ natsStatistics *stats = NULL;
45
+ natsMsg *msg = NULL;
46
+ natsStatus s;
47
+
48
+ opts = parseArgs(argc, argv, usage);
49
+
50
+ printf("Listening %ssynchronously on '%s' with name '%s'.\n",
51
+ (async ? "a" : ""), subj, name);
52
+
53
+ s = natsOptions_SetErrorHandler(opts, asyncCb, NULL);
54
+
55
+ if (s == NATS_OK)
56
+ s = natsConnection_Connect(&conn, opts);
57
+
58
+ if (s == NATS_OK)
59
+ {
60
+ if (async)
61
+ s = natsConnection_QueueSubscribe(&sub, conn, subj, name, onMsg, NULL);
62
+ else
63
+ s = natsConnection_QueueSubscribeSync(&sub, conn, subj, name);
64
+ }
65
+
66
+ // For maximum performance, set no limit on the number of pending messages.
67
+ if (s == NATS_OK)
68
+ s = natsSubscription_SetPendingLimits(sub, -1, -1);
69
+
70
+ if (s == NATS_OK)
71
+ s = natsSubscription_AutoUnsubscribe(sub, (int) total);
72
+
73
+ if (s == NATS_OK)
74
+ s = natsStatistics_Create(&stats);
75
+
76
+ if ((s == NATS_OK) && async)
77
+ {
78
+ while (s == NATS_OK)
79
+ {
80
+ s = printStats(STATS_IN|STATS_COUNT,conn, sub, stats);
81
+
82
+ if (count == total)
83
+ break;
84
+
85
+ if (s == NATS_OK)
86
+ nats_Sleep(1000);
87
+ }
88
+ }
89
+ else if (s == NATS_OK)
90
+ {
91
+ int64_t last = 0;
92
+
93
+ for (count = 0; (s == NATS_OK) && (count < total); count++)
94
+ {
95
+ s = natsSubscription_NextMsg(&msg, sub, 10000);
96
+ if (s != NATS_OK)
97
+ break;
98
+
99
+ if (start == 0)
100
+ start = nats_Now();
101
+
102
+ if (nats_Now() - last >= 1000)
103
+ {
104
+ s = printStats(STATS_IN|STATS_COUNT,conn, sub, stats);
105
+ last = nats_Now();
106
+ }
107
+
108
+ natsMsg_Destroy(msg);
109
+ }
110
+ }
111
+
112
+ if (s == NATS_OK)
113
+ {
114
+ printPerf("Received", total, start, elapsed);
115
+ }
116
+ else
117
+ {
118
+ printf("Error: %d - %s\n", s, natsStatus_GetText(s));
119
+ nats_PrintLastErrorStack(stderr);
120
+ }
121
+
122
+ // Destroy all our objects to avoid report of memory leak
123
+ natsStatistics_Destroy(stats);
124
+ natsSubscription_Destroy(sub);
125
+ natsConnection_Destroy(conn);
126
+ natsOptions_Destroy(opts);
127
+
128
+ // To silence reports of memory still in used with valgrind
129
+ nats_Close();
130
+
131
+ return 0;
132
+ }
@@ -0,0 +1,149 @@
1
+ // Copyright 2015-2016 Apcera Inc. All rights reserved.
2
+
3
+ #include "examples.h"
4
+
5
+ static const char *usage = "" \
6
+ "-gd use global message delivery thread pool\n" \
7
+ "-sync receive synchronously (default is asynchronous)\n" \
8
+ "-count number of expected requests\n";
9
+
10
+ static void
11
+ onMsg(natsConnection *nc, natsSubscription *sub, natsMsg *msg, void *closure)
12
+ {
13
+ natsStatus s;
14
+
15
+ if (print)
16
+ printf("Received msg: %s - %.*s\n",
17
+ natsMsg_GetSubject(msg),
18
+ natsMsg_GetDataLength(msg),
19
+ natsMsg_GetData(msg));
20
+
21
+ if (start == 0)
22
+ start = nats_Now();
23
+
24
+ s = natsConnection_PublishString(nc, natsMsg_GetReply(msg),
25
+ "here's some help");
26
+ if (s == NATS_OK)
27
+ s = natsConnection_Flush(nc);
28
+
29
+ // We should be using a mutex to protect those variables since
30
+ // they are used from the subscription's delivery and the main
31
+ // threads. For demo purposes, this is fine.
32
+ if (++count == total)
33
+ elapsed = nats_Now() - start;
34
+
35
+ natsMsg_Destroy(msg);
36
+ }
37
+
38
+ static void
39
+ asyncCb(natsConnection *nc, natsSubscription *sub, natsStatus err, void *closure)
40
+ {
41
+ if (print)
42
+ printf("Async error: %d - %s\n", err, natsStatus_GetText(err));
43
+
44
+ natsSubscription_GetDropped(sub, (int64_t*) &dropped);
45
+ }
46
+
47
+ int main(int argc, char **argv)
48
+ {
49
+ natsConnection *conn = NULL;
50
+ natsOptions *opts = NULL;
51
+ natsSubscription *sub = NULL;
52
+ natsStatistics *stats = NULL;
53
+ natsMsg *msg = NULL;
54
+ natsStatus s;
55
+
56
+ opts = parseArgs(argc, argv, usage);
57
+
58
+ printf("Listening %ssynchronously for requests on '%s'\n",
59
+ (async ? "a" : ""), subj);
60
+
61
+ s = natsOptions_SetErrorHandler(opts, asyncCb, NULL);
62
+
63
+ if (s == NATS_OK)
64
+ s = natsConnection_Connect(&conn, opts);
65
+
66
+ if (s == NATS_OK)
67
+ {
68
+ if (async)
69
+ s = natsConnection_Subscribe(&sub, conn, subj, onMsg, NULL);
70
+ else
71
+ s = natsConnection_SubscribeSync(&sub, conn, subj);
72
+ }
73
+
74
+ // For maximum performance, set no limit on the number of pending messages.
75
+ if (s == NATS_OK)
76
+ s = natsSubscription_SetPendingLimits(sub, -1, -1);
77
+
78
+ if (s == NATS_OK)
79
+ s = natsSubscription_AutoUnsubscribe(sub, (int) total);
80
+
81
+ if (s == NATS_OK)
82
+ s = natsStatistics_Create(&stats);
83
+
84
+ if ((s == NATS_OK) && async)
85
+ {
86
+ while (s == NATS_OK)
87
+ {
88
+ s = printStats(STATS_IN|STATS_COUNT,conn, sub, stats);
89
+
90
+ if (count + dropped == total)
91
+ break;
92
+
93
+ if (s == NATS_OK)
94
+ nats_Sleep(1000);
95
+ }
96
+ }
97
+ else if (s == NATS_OK)
98
+ {
99
+ int64_t last = 0;
100
+
101
+ for (count = 0; (s == NATS_OK) && (count < total); count++)
102
+ {
103
+ s = natsSubscription_NextMsg(&msg, sub, 10000);
104
+ if (s == NATS_OK)
105
+ s = natsConnection_PublishString(conn,
106
+ natsMsg_GetReply(msg),
107
+ "here's some help");
108
+ if (s == NATS_OK)
109
+ s = natsConnection_Flush(conn);
110
+ if (s == NATS_OK)
111
+ {
112
+ if (start == 0)
113
+ start = nats_Now();
114
+
115
+ if (nats_Now() - last >= 1000)
116
+ {
117
+ s = printStats(STATS_IN|STATS_COUNT,conn, sub, stats);
118
+ last = nats_Now();
119
+ }
120
+ }
121
+
122
+ natsMsg_Destroy(msg);
123
+ }
124
+
125
+ if (s == NATS_OK)
126
+ s = natsConnection_FlushTimeout(conn, 1000);
127
+ }
128
+
129
+ if (s == NATS_OK)
130
+ {
131
+ printPerf("Received", count, start, elapsed);
132
+ }
133
+ else
134
+ {
135
+ printf("Error: %d - %s\n", s, natsStatus_GetText(s));
136
+ nats_PrintLastErrorStack(stderr);
137
+ }
138
+
139
+ // Destroy all our objects to avoid report of memory leak
140
+ natsStatistics_Destroy(stats);
141
+ natsSubscription_Destroy(sub);
142
+ natsConnection_Destroy(conn);
143
+ natsOptions_Destroy(opts);
144
+
145
+ // To silence reports of memory still in used with valgrind
146
+ nats_Close();
147
+
148
+ return 0;
149
+ }
@@ -0,0 +1,75 @@
1
+ // Copyright 2015 Apcera Inc. All rights reserved.
2
+
3
+ #include "examples.h"
4
+
5
+ static const char *usage = "" \
6
+ "-txt text to send (default is 'hello')\n" \
7
+ "-count number of requests to send\n";
8
+
9
+ int main(int argc, char **argv)
10
+ {
11
+ natsConnection *conn = NULL;
12
+ natsStatistics *stats = NULL;
13
+ natsOptions *opts = NULL;
14
+ natsMsg *reply = NULL;
15
+ int64_t last = 0;
16
+ natsStatus s;
17
+
18
+ opts = parseArgs(argc, argv, usage);
19
+
20
+ printf("Sending %" PRId64 " requests to subject '%s'\n", total, subj);
21
+
22
+ s = natsConnection_Connect(&conn, opts);
23
+
24
+ if (s == NATS_OK)
25
+ s = natsStatistics_Create(&stats);
26
+
27
+ if (s == NATS_OK)
28
+ start = nats_Now();
29
+
30
+ for (count = 0; (s == NATS_OK) && (count < total); count++)
31
+ {
32
+ s = natsConnection_RequestString(&reply, conn, subj, txt, 1000);
33
+ if (s != NATS_OK)
34
+ break;
35
+
36
+ if (print)
37
+ {
38
+ printf("Received reply: %s - %.*s\n",
39
+ natsMsg_GetSubject(reply),
40
+ natsMsg_GetDataLength(reply),
41
+ natsMsg_GetData(reply));
42
+ }
43
+
44
+ if (nats_Now() - last >= 1000)
45
+ {
46
+ s = printStats(STATS_OUT,conn, NULL, stats);
47
+ last = nats_Now();
48
+ }
49
+
50
+ natsMsg_Destroy(reply);
51
+ }
52
+
53
+ if (s == NATS_OK)
54
+ s = natsConnection_FlushTimeout(conn, 1000);
55
+
56
+ if (s == NATS_OK)
57
+ {
58
+ printPerf("Sent", total, start, elapsed);
59
+ }
60
+ else
61
+ {
62
+ printf("Error: %d - %s\n", s, natsStatus_GetText(s));
63
+ nats_PrintLastErrorStack(stderr);
64
+ }
65
+
66
+ // Destroy all our objects to avoid report of memory leak
67
+ natsStatistics_Destroy(stats);
68
+ natsConnection_Destroy(conn);
69
+ natsOptions_Destroy(opts);
70
+
71
+ // To silence reports of memory still in used with valgrind
72
+ nats_Close();
73
+
74
+ return 0;
75
+ }
@@ -0,0 +1,133 @@
1
+ // Copyright 2015-2016 Apcera Inc. All rights reserved.
2
+
3
+ #include "examples.h"
4
+
5
+ static const char *usage = ""\
6
+ "-gd use global message delivery thread pool\n" \
7
+ "-sync receive synchronously (default is asynchronous)\n" \
8
+ "-count number of expected messages\n";
9
+
10
+ static void
11
+ onMsg(natsConnection *nc, natsSubscription *sub, natsMsg *msg, void *closure)
12
+ {
13
+ if (print)
14
+ printf("Received msg: %s - %.*s\n",
15
+ natsMsg_GetSubject(msg),
16
+ natsMsg_GetDataLength(msg),
17
+ natsMsg_GetData(msg));
18
+
19
+ if (start == 0)
20
+ start = nats_Now();
21
+
22
+ // We should be using a mutex to protect those variables since
23
+ // they are used from the subscription's delivery and the main
24
+ // threads. For demo purposes, this is fine.
25
+ if (++count == total)
26
+ elapsed = nats_Now() - start;
27
+
28
+ natsMsg_Destroy(msg);
29
+ }
30
+
31
+ static void
32
+ asyncCb(natsConnection *nc, natsSubscription *sub, natsStatus err, void *closure)
33
+ {
34
+ if (print)
35
+ printf("Async error: %d - %s\n", err, natsStatus_GetText(err));
36
+
37
+ natsSubscription_GetDropped(sub, (int64_t*) &dropped);
38
+ }
39
+
40
+ int main(int argc, char **argv)
41
+ {
42
+ natsConnection *conn = NULL;
43
+ natsOptions *opts = NULL;
44
+ natsSubscription *sub = NULL;
45
+ natsStatistics *stats = NULL;
46
+ natsMsg *msg = NULL;
47
+ natsStatus s;
48
+
49
+ opts = parseArgs(argc, argv, usage);
50
+
51
+ printf("Listening %ssynchronously on '%s'.\n",
52
+ (async ? "a" : ""), subj);
53
+
54
+ s = natsOptions_SetErrorHandler(opts, asyncCb, NULL);
55
+
56
+ if (s == NATS_OK)
57
+ s = natsConnection_Connect(&conn, opts);
58
+
59
+ if (s == NATS_OK)
60
+ {
61
+ if (async)
62
+ s = natsConnection_Subscribe(&sub, conn, subj, onMsg, NULL);
63
+ else
64
+ s = natsConnection_SubscribeSync(&sub, conn, subj);
65
+ }
66
+
67
+ // For maximum performance, set no limit on the number of pending messages.
68
+ if (s == NATS_OK)
69
+ s = natsSubscription_SetPendingLimits(sub, -1, -1);
70
+
71
+ if (s == NATS_OK)
72
+ s = natsSubscription_AutoUnsubscribe(sub, (int) total);
73
+
74
+ if (s == NATS_OK)
75
+ s = natsStatistics_Create(&stats);
76
+
77
+ if ((s == NATS_OK) && async)
78
+ {
79
+ while (s == NATS_OK)
80
+ {
81
+ s = printStats(STATS_IN|STATS_COUNT, conn, sub, stats);
82
+
83
+ if (count + dropped == total)
84
+ break;
85
+
86
+ if (s == NATS_OK)
87
+ nats_Sleep(1000);
88
+ }
89
+ }
90
+ else if (s == NATS_OK)
91
+ {
92
+ int64_t last = 0;
93
+
94
+ for (count = 0; (s == NATS_OK) && (count < total); count++)
95
+ {
96
+ s = natsSubscription_NextMsg(&msg, sub, 10000);
97
+ if (s != NATS_OK)
98
+ break;
99
+
100
+ if (start == 0)
101
+ start = nats_Now();
102
+
103
+ if (nats_Now() - last >= 1000)
104
+ {
105
+ s = printStats(STATS_IN|STATS_COUNT, conn, sub, stats);
106
+ last = nats_Now();
107
+ }
108
+
109
+ natsMsg_Destroy(msg);
110
+ }
111
+ }
112
+
113
+ if (s == NATS_OK)
114
+ {
115
+ printPerf("Received", count, start, elapsed);
116
+ }
117
+ else
118
+ {
119
+ printf("Error: %d - %s\n", s, natsStatus_GetText(s));
120
+ nats_PrintLastErrorStack(stderr);
121
+ }
122
+
123
+ // Destroy all our objects to avoid report of memory leak
124
+ natsStatistics_Destroy(stats);
125
+ natsSubscription_Destroy(sub);
126
+ natsConnection_Destroy(conn);
127
+ natsOptions_Destroy(opts);
128
+
129
+ // To silence reports of memory still in used with valgrind
130
+ nats_Close();
131
+
132
+ return 0;
133
+ }