qrusty-client 0.1.0 → 0.2.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.
Files changed (34) hide show
  1. package/README.md +8 -5
  2. package/index.js +164 -68
  3. package/package.json +18 -18
  4. package/docs/fonts/OpenSans-Bold-webfont.eot +0 -0
  5. package/docs/fonts/OpenSans-Bold-webfont.svg +0 -1830
  6. package/docs/fonts/OpenSans-Bold-webfont.woff +0 -0
  7. package/docs/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  8. package/docs/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
  9. package/docs/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  10. package/docs/fonts/OpenSans-Italic-webfont.eot +0 -0
  11. package/docs/fonts/OpenSans-Italic-webfont.svg +0 -1830
  12. package/docs/fonts/OpenSans-Italic-webfont.woff +0 -0
  13. package/docs/fonts/OpenSans-Light-webfont.eot +0 -0
  14. package/docs/fonts/OpenSans-Light-webfont.svg +0 -1831
  15. package/docs/fonts/OpenSans-Light-webfont.woff +0 -0
  16. package/docs/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  17. package/docs/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
  18. package/docs/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  19. package/docs/fonts/OpenSans-Regular-webfont.eot +0 -0
  20. package/docs/fonts/OpenSans-Regular-webfont.svg +0 -1831
  21. package/docs/fonts/OpenSans-Regular-webfont.woff +0 -0
  22. package/docs/index.html +0 -65
  23. package/docs/index.js.html +0 -136
  24. package/docs/module-QrustyClient-QrustyClient.html +0 -1317
  25. package/docs/module-QrustyClient.html +0 -172
  26. package/docs/scripts/linenumber.js +0 -25
  27. package/docs/scripts/prettify/Apache-License-2.0.txt +0 -202
  28. package/docs/scripts/prettify/lang-css.js +0 -2
  29. package/docs/scripts/prettify/prettify.js +0 -28
  30. package/docs/styles/jsdoc-default.css +0 -358
  31. package/docs/styles/prettify-jsdoc.css +0 -111
  32. package/docs/styles/prettify-tomorrow.css +0 -132
  33. package/jsdoc.json +0 -13
  34. package/test.js +0 -20
package/README.md CHANGED
@@ -18,13 +18,16 @@ npm install qrusty-client
18
18
  ## Usage
19
19
 
20
20
  ```js
21
- const QrustyClient = require('qrusty-client');
22
- const client = new QrustyClient('http://localhost:3000');
21
+ const QrustyClient = require("qrusty-client");
22
+ const client = new QrustyClient("http://localhost:6784");
23
23
 
24
24
  (async () => {
25
- await client.publish('orders', 100, { order_id: 123 });
26
- const msg = await client.consume('orders', 'worker-1');
27
- await client.ack('orders', msg.id, 'worker-1');
25
+ await client.createQueue("orders", "MaxFirst", true);
26
+ await client.publish("orders", 100, { order_id: 123 });
27
+ const msg = await client.consume("orders", "worker-1");
28
+ if (msg) {
29
+ await client.ack("orders", msg.id, "worker-1");
30
+ }
28
31
  })();
29
32
  ```
30
33
 
package/index.js CHANGED
@@ -2,84 +2,180 @@
2
2
  * QrustyClient - Node.js client for the qrusty priority queue API
3
3
  * @module QrustyClient
4
4
  */
5
- const axios = require('axios');
5
+ const axios = require("axios");
6
6
 
7
7
  class QrustyClient {
8
- /**
9
- * Create a new QrustyClient
10
- * @param {string} baseUrl - Base URL of the qrusty server
11
- */
12
- constructor(baseUrl) {
13
- this.baseUrl = baseUrl.replace(/\/$/, '');
14
- }
8
+ /**
9
+ * Create a new QrustyClient
10
+ * @param {string} baseUrl - Base URL of the qrusty server
11
+ */
12
+ constructor(baseUrl) {
13
+ this.baseUrl = baseUrl.replace(/\/$/, "");
14
+ }
15
15
 
16
- /**
17
- * Publish a message to a queue
18
- * @param {string} queue
19
- * @param {number} priority
20
- * @param {object} payload
21
- * @param {number} [maxRetries=3]
22
- * @returns {Promise<object>}
23
- */
24
- async publish(queue, priority, payload, maxRetries = 3) {
25
- const data = { queue, priority, payload, max_retries: maxRetries };
26
- const resp = await axios.post(`${this.baseUrl}/publish`, data);
27
- return resp.data;
28
- }
16
+ /**
17
+ * Check server health
18
+ * @returns {Promise<string>}
19
+ */
20
+ async health() {
21
+ const resp = await axios.get(`${this.baseUrl}/health`);
22
+ return resp.data;
23
+ }
29
24
 
30
- /**
31
- * Consume a message from a queue
32
- * @param {string} queue
33
- * @param {string} consumerId
34
- * @param {number} [timeoutSeconds=30]
35
- * @returns {Promise<object>}
36
- */
37
- async consume(queue, consumerId, timeoutSeconds = 30) {
38
- const data = { consumer_id: consumerId, timeout_seconds: timeoutSeconds };
39
- const resp = await axios.post(`${this.baseUrl}/consume/${queue}`, data);
40
- return resp.data;
41
- }
25
+ /**
26
+ * Create or configure a queue
27
+ * @param {string} name
28
+ * @param {string} [ordering="MaxFirst"] - One of: Fifo | MinFirst | MaxFirst
29
+ * @param {boolean} [allowDuplicates=true]
30
+ * @returns {Promise<void>}
31
+ */
32
+ async createQueue(name, ordering = "MaxFirst", allowDuplicates = true) {
33
+ const data = {
34
+ name,
35
+ config: { ordering, allow_duplicates: allowDuplicates },
36
+ };
37
+ await axios.post(`${this.baseUrl}/create-queue`, data);
38
+ }
42
39
 
43
- /**
44
- * Acknowledge a message
45
- * @param {string} queue
46
- * @param {string} messageId
47
- * @param {string} consumerId
48
- * @returns {Promise<object>}
49
- */
50
- async ack(queue, messageId, consumerId) {
51
- const data = { message_id: messageId, consumer_id: consumerId };
52
- const resp = await axios.post(`${this.baseUrl}/ack/${queue}`, data);
53
- return resp.data;
54
- }
40
+ /**
41
+ * Rename a queue and optionally update its configuration
42
+ * @param {string} from
43
+ * @param {string} to
44
+ * @param {string} [ordering="MaxFirst"]
45
+ * @param {boolean} [allowDuplicates=true]
46
+ * @returns {Promise<void>}
47
+ */
48
+ async renameQueue(from, to, ordering = "MaxFirst", allowDuplicates = true) {
49
+ const data = {
50
+ from,
51
+ to,
52
+ config: { ordering, allow_duplicates: allowDuplicates },
53
+ };
54
+ await axios.post(`${this.baseUrl}/rename-queue`, data);
55
+ }
55
56
 
56
- /**
57
- * Purge a queue
58
- * @param {string} queue
59
- * @returns {Promise<object>}
60
- */
61
- async purge(queue) {
62
- const resp = await axios.post(`${this.baseUrl}/purge-queue/${queue}`);
63
- return resp.data;
64
- }
57
+ /**
58
+ * Delete a queue and its messages
59
+ * @param {string} queue
60
+ * @returns {Promise<object>}
61
+ */
62
+ async deleteQueue(queue) {
63
+ const resp = await axios.delete(`${this.baseUrl}/delete-queue/${queue}`);
64
+ return resp.data;
65
+ }
66
+
67
+ /**
68
+ * Publish a message to a queue
69
+ * @param {string} queue
70
+ * @param {number} priority
71
+ * @param {object} payload
72
+ * @param {number} [maxRetries=3]
73
+ * @returns {Promise<object>}
74
+ */
75
+ async publish(queue, priority, payload, maxRetries = 3) {
76
+ const payloadStr =
77
+ typeof payload === "string" ? payload : JSON.stringify(payload);
78
+ const data = { queue, priority, payload: payloadStr, max_retries: maxRetries };
79
+ const resp = await axios.post(`${this.baseUrl}/publish`, data);
80
+ return resp.data;
81
+ }
65
82
 
66
- /**
67
- * Get stats for all queues
68
- * @returns {Promise<object>}
69
- */
70
- async stats() {
71
- const resp = await axios.get(`${this.baseUrl}/stats`);
72
- return resp.data;
83
+ /**
84
+ * Consume a message from a queue
85
+ * @param {string} queue
86
+ * @param {string} consumerId
87
+ * @param {number} [timeoutSeconds=30]
88
+ * @returns {Promise<object>}
89
+ */
90
+ async consume(queue, consumerId, timeoutSeconds = 30) {
91
+ const data = { consumer_id: consumerId, timeout_seconds: timeoutSeconds };
92
+ const resp = await axios.post(`${this.baseUrl}/consume/${queue}`, data);
93
+ return resp.data;
94
+ }
95
+
96
+ /**
97
+ * Acknowledge a message
98
+ * @param {string} queue
99
+ * @param {string} messageId
100
+ * @param {string} consumerId
101
+ * @returns {Promise<object>}
102
+ */
103
+ async ack(queue, messageId, consumerId) {
104
+ const data = { consumer_id: consumerId };
105
+ try {
106
+ await axios.post(`${this.baseUrl}/ack/${queue}/${messageId}`, data);
107
+ return true;
108
+ } catch (e) {
109
+ if (e?.response?.status === 404) return false;
110
+ throw e;
73
111
  }
112
+ }
74
113
 
75
- /**
76
- * List all queues
77
- * @returns {Promise<object>}
78
- */
79
- async listQueues() {
80
- const resp = await axios.get(`${this.baseUrl}/queues`);
81
- return resp.data;
114
+ /**
115
+ * Negative-acknowledge a message
116
+ * @param {string} queue
117
+ * @param {string} messageId
118
+ * @param {string} consumerId
119
+ * @returns {Promise<boolean>} True if nack'd, false if not found
120
+ */
121
+ async nack(queue, messageId, consumerId) {
122
+ const data = { consumer_id: consumerId };
123
+ try {
124
+ await axios.post(`${this.baseUrl}/nack/${queue}/${messageId}`, data);
125
+ return true;
126
+ } catch (e) {
127
+ if (e?.response?.status === 404) return false;
128
+ throw e;
82
129
  }
130
+ }
131
+
132
+ /**
133
+ * Purge a queue
134
+ * @param {string} queue
135
+ * @returns {Promise<object>}
136
+ */
137
+ async purge(queue) {
138
+ const resp = await axios.post(`${this.baseUrl}/purge-queue/${queue}`);
139
+ return resp.data;
140
+ }
141
+
142
+ /**
143
+ * Get stats for all queues
144
+ * @returns {Promise<object>}
145
+ */
146
+ async stats() {
147
+ const resp = await axios.get(`${this.baseUrl}/stats`);
148
+ return resp.data;
149
+ }
150
+
151
+ /**
152
+ * Get statistics for a specific queue
153
+ * @param {string} queue
154
+ * @returns {Promise<object>}
155
+ */
156
+ async queueStats(queue) {
157
+ const resp = await axios.get(`${this.baseUrl}/queue-stats/${queue}`);
158
+ return resp.data;
159
+ }
160
+
161
+ /**
162
+ * Get time-series metrics for a queue
163
+ * @param {string} queue
164
+ * @returns {Promise<object>}
165
+ */
166
+ async queueMetrics(queue) {
167
+ const resp = await axios.get(`${this.baseUrl}/queues/${queue}/metrics`);
168
+ return resp.data;
169
+ }
170
+
171
+ /**
172
+ * List all queues
173
+ * @returns {Promise<object>}
174
+ */
175
+ async listQueues() {
176
+ const resp = await axios.get(`${this.baseUrl}/queues`);
177
+ return resp.data;
178
+ }
83
179
  }
84
180
 
85
181
  module.exports = QrustyClient;
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
- "name": "qrusty-client",
3
- "version": "0.1.0",
4
- "description": "Node.js client for the qrusty priority queue server API.",
5
- "main": "index.js",
6
- "author": "Gordon Greene <greeng3@obscure-reference.com>",
7
- "license": "MIT",
8
- "scripts": {
9
- "test": "jest",
10
- "docs": "jsdoc -c jsdoc.json"
11
- },
12
- "dependencies": {
13
- "axios": "^1.6.7"
14
- },
15
- "devDependencies": {
16
- "jest": "30.0.5",
17
- "jsdoc": "^4.0.2"
18
- }
19
- }
2
+ "name": "qrusty-client",
3
+ "version": "0.2.0",
4
+ "description": "Node.js client for the qrusty priority queue server API.",
5
+ "main": "index.js",
6
+ "author": "Gordon Greene <greeng3@obscure-reference.com>",
7
+ "license": "MIT",
8
+ "scripts": {
9
+ "test": "jest",
10
+ "docs": "jsdoc -c jsdoc.json"
11
+ },
12
+ "dependencies": {
13
+ "axios": "^1.13.2"
14
+ },
15
+ "devDependencies": {
16
+ "jest": "30.2.0",
17
+ "jsdoc": "^4.0.5"
18
+ }
19
+ }