Skip to content

Commit c71c8f9

Browse files
authoredSep 21, 2022
chore(nodejs): failproof flush (#8)
* chore(nodejs): failproof flush * chore(nodejs): failproof flush
1 parent 456e253 commit c71c8f9

11 files changed

+174
-63
lines changed
 

‎docs/Sender.html

+18-15
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ <h5>Parameters:</h5>
121121
<ul>
122122
<li>bufferSize: <i>number</i> - Size of the buffer used by the sender to collect rows, provided in bytes. <br>
123123
Optional, defaults to 8192 bytes </li>
124+
<li>copyBuffer: <i>boolean</i> - If true a new buffer will be created for every flush() call and the data to be sent to the server will be copied into this new buffer. <br>
125+
Setting the flag could result in performance degradation, use this flag only if calls to the client cannot be serialised. <br>
126+
Optional, defaults to false </li>
124127
<li>jwk: <i>{x: string, y: string, kid: string, kty: string, d: string, crv: string}</i> - JsonWebKey for authentication. <br>
125128
If not provided, client is not authenticated and server might reject the connection depending on configuration.</li>
126129
</ul>
@@ -322,7 +325,7 @@ <h5>Parameters:</h5>
322325

323326
<dt class="tag-source">Source:</dt>
324327
<dd class="tag-source"><ul class="dummy"><li>
325-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line328">line 328</a>
328+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line351">line 351</a>
326329
</li></ul></dd>
327330

328331

@@ -411,7 +414,7 @@ <h4 class="name" id="atNow"><span class="type-signature"></span>atNow<span class
411414

412415
<dt class="tag-source">Source:</dt>
413416
<dd class="tag-source"><ul class="dummy"><li>
414-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line348">line 348</a>
417+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line370">line 370</a>
415418
</li></ul></dd>
416419

417420

@@ -571,7 +574,7 @@ <h5>Parameters:</h5>
571574

572575
<dt class="tag-source">Source:</dt>
573576
<dd class="tag-source"><ul class="dummy"><li>
574-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line259">line 259</a>
577+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line282">line 282</a>
575578
</li></ul></dd>
576579

577580

@@ -682,7 +685,7 @@ <h4 class="name" id="close"><span class="type-signature">(async) </span>close<sp
682685

683686
<dt class="tag-source">Source:</dt>
684687
<dd class="tag-source"><ul class="dummy"><li>
685-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line147">line 147</a>
688+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line159">line 159</a>
686689
</li></ul></dd>
687690

688691

@@ -877,7 +880,7 @@ <h5>Parameters:</h5>
877880

878881
<dt class="tag-source">Source:</dt>
879882
<dd class="tag-source"><ul class="dummy"><li>
880-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line92">line 92</a>
883+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line104">line 104</a>
881884
</li></ul></dd>
882885

883886

@@ -1037,7 +1040,7 @@ <h5>Parameters:</h5>
10371040

10381041
<dt class="tag-source">Source:</dt>
10391042
<dd class="tag-source"><ul class="dummy"><li>
1040-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line274">line 274</a>
1043+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line297">line 297</a>
10411044
</li></ul></dd>
10421045

10431046

@@ -1148,7 +1151,7 @@ <h4 class="name" id="flush"><span class="type-signature">(async) </span>flush<sp
11481151

11491152
<dt class="tag-source">Source:</dt>
11501153
<dd class="tag-source"><ul class="dummy"><li>
1151-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line163">line 163</a>
1154+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line175">line 175</a>
11521155
</li></ul></dd>
11531156

11541157

@@ -1330,7 +1333,7 @@ <h5>Parameters:</h5>
13301333

13311334
<dt class="tag-source">Source:</dt>
13321335
<dd class="tag-source"><ul class="dummy"><li>
1333-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line290">line 290</a>
1336+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line313">line 313</a>
13341337
</li></ul></dd>
13351338

13361339

@@ -1441,7 +1444,7 @@ <h4 class="name" id="reset"><span class="type-signature"></span>reset<span class
14411444

14421445
<dt class="tag-source">Source:</dt>
14431446
<dd class="tag-source"><ul class="dummy"><li>
1444-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line80">line 80</a>
1447+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line92">line 92</a>
14451448
</li></ul></dd>
14461449

14471450

@@ -1602,7 +1605,7 @@ <h5>Parameters:</h5>
16021605

16031606
<dt class="tag-source">Source:</dt>
16041607
<dd class="tag-source"><ul class="dummy"><li>
1605-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line65">line 65</a>
1608+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line77">line 77</a>
16061609
</li></ul></dd>
16071610

16081611

@@ -1762,7 +1765,7 @@ <h5>Parameters:</h5>
17621765

17631766
<dt class="tag-source">Source:</dt>
17641767
<dd class="tag-source"><ul class="dummy"><li>
1765-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line242">line 242</a>
1768+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line265">line 265</a>
17661769
</li></ul></dd>
17671770

17681771

@@ -1944,7 +1947,7 @@ <h5>Parameters:</h5>
19441947

19451948
<dt class="tag-source">Source:</dt>
19461949
<dd class="tag-source"><ul class="dummy"><li>
1947-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line217">line 217</a>
1950+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line240">line 240</a>
19481951
</li></ul></dd>
19491952

19501953

@@ -2103,7 +2106,7 @@ <h5>Parameters:</h5>
21032106

21042107
<dt class="tag-source">Source:</dt>
21052108
<dd class="tag-source"><ul class="dummy"><li>
2106-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line196">line 196</a>
2109+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line219">line 219</a>
21072110
</li></ul></dd>
21082111

21092112

@@ -2285,7 +2288,7 @@ <h5>Parameters:</h5>
22852288

22862289
<dt class="tag-source">Source:</dt>
22872290
<dd class="tag-source"><ul class="dummy"><li>
2288-
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line310">line 310</a>
2291+
<a href="src_sender.js.html">src/sender.js</a>, <a href="src_sender.js.html#line333">line 333</a>
22892292
</li></ul></dd>
22902293

22912294

@@ -2359,7 +2362,7 @@ <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-@q
23592362
<br class="clear">
23602363

23612364
<footer>
2362-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.11</a> on Tue Aug 16 2022 14:23:38 GMT+0100 (British Summer Time)
2365+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.11</a> on Wed Sep 21 2022 10:00:52 GMT+0100 (British Summer Time)
23632366
</footer>
23642367

23652368
<script> prettyPrint(); </script>

‎docs/index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-@q
176176
<br class="clear">
177177

178178
<footer>
179-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.11</a> on Tue Aug 16 2022 14:23:38 GMT+0100 (British Summer Time)
179+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.11</a> on Wed Sep 21 2022 10:00:52 GMT+0100 (British Summer Time)
180180
</footer>
181181

182182
<script> prettyPrint(); </script>

‎docs/index.js.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-@q
5353
<br class="clear">
5454

5555
<footer>
56-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.11</a> on Tue Aug 16 2022 14:23:38 GMT+0100 (British Summer Time)
56+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.11</a> on Wed Sep 21 2022 10:00:52 GMT+0100 (British Summer Time)
5757
</footer>
5858

5959
<script> prettyPrint(); </script>

‎docs/module-@questdb_nodejs-client.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-@q
156156
<br class="clear">
157157

158158
<footer>
159-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.11</a> on Tue Aug 16 2022 14:23:38 GMT+0100 (British Summer Time)
159+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.11</a> on Wed Sep 21 2022 10:00:52 GMT+0100 (British Summer Time)
160160
</footer>
161161

162162
<script> prettyPrint(); </script>

‎docs/src_sender.js.html

+33-11
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ <h1 class="page-title">Source: src/sender.js</h1>
5555
/** @private */ socket;
5656
/** @private */ bufferSize;
5757
/** @private */ buffer;
58+
/** @private */ toBuffer;
59+
/** @private */ doResolve;
5860
/** @private */ position;
5961
/** @private */ endOfLastRow;
6062
/** @private */ hasTable;
@@ -70,6 +72,9 @@ <h1 class="page-title">Source: src/sender.js</h1>
7072
* &lt;ul>
7173
* &lt;li>bufferSize: &lt;i>number&lt;/i> - Size of the buffer used by the sender to collect rows, provided in bytes. &lt;br>
7274
* Optional, defaults to 8192 bytes &lt;/li>
75+
* &lt;li>copyBuffer: &lt;i>boolean&lt;/i> - If true a new buffer will be created for every flush() call and the data to be sent to the server will be copied into this new buffer. &lt;br>
76+
* Setting the flag could result in performance degradation, use this flag only if calls to the client cannot be serialised. &lt;br>
77+
* Optional, defaults to false &lt;/li>
7378
* &lt;li>jwk: &lt;i>{x: string, y: string, kid: string, kty: string, d: string, crv: string}&lt;/i> - JsonWebKey for authentication. &lt;br>
7479
* If not provided, client is not authenticated and server might reject the connection depending on configuration.&lt;/li>
7580
* &lt;/ul>
@@ -79,6 +84,13 @@ <h1 class="page-title">Source: src/sender.js</h1>
7984
if (options) {
8085
this.jwk = options.jwk;
8186
}
87+
this.toBuffer = options &amp;&amp; options.copyBuffer ? this.toBufferNew : this.toBufferView;
88+
this.doResolve = options &amp;&amp; options.copyBuffer
89+
? resolve => resolve(true)
90+
: resolve => {
91+
compact(this);
92+
resolve(true);
93+
}
8294
this.resize(options &amp;&amp; options.bufferSize ? options.bufferSize : DEFAULT_BUFFER_SIZE);
8395
this.reset();
8496
}
@@ -195,26 +207,37 @@ <h1 class="page-title">Source: src/sender.js</h1>
195207
}
196208
return new Promise((resolve, reject) => {
197209
this.socket.write(data, err => {
198-
if (err) {
199-
reject(err);
200-
} else {
201-
compact(this);
202-
resolve(true);
203-
}
210+
err ? reject(err) : this.doResolve(resolve);
204211
});
205212
});
206213
}
207214

208215
/**
209216
* @ignore
210217
* @return {Buffer} Returns a cropped buffer ready to send to the server or null if there is nothing to send.
218+
* The returned buffer is backed by the sender's buffer.
211219
*/
212-
toBuffer(pos = this.position) {
220+
toBufferView(pos = this.position) {
213221
return pos > 0
214222
? this.buffer.subarray(0, pos)
215223
: null;
216224
}
217225

226+
/**
227+
* @ignore
228+
* @return {Buffer} Returns a cropped buffer ready to send to the server or null if there is nothing to send.
229+
* The returned buffer is a copy of the sender's buffer.
230+
*/
231+
toBufferNew(pos = this.position) {
232+
if (pos > 0) {
233+
const data = Buffer.allocUnsafe(pos);
234+
this.buffer.copy(data, 0, 0, pos);
235+
compact(this);
236+
return data;
237+
}
238+
return null;
239+
}
240+
218241
/**
219242
* Write the table name into the buffer of the sender.
220243
*
@@ -361,10 +384,9 @@ <h1 class="page-title">Source: src/sender.js</h1>
361384
throw new Error(`The designated timestamp must be of type string, received ${typeof timestamp}`);
362385
}
363386
validateDesignatedTimestamp(timestamp);
364-
const timestampStr = timestamp.toString();
365-
checkCapacity(this, [], 2 + timestampStr.length);
387+
checkCapacity(this, [], 2 + timestamp.length);
366388
write(this, ' ');
367-
write(this, timestampStr);
389+
write(this, timestamp);
368390
write(this, '\n');
369391
startNewRow(this);
370392
}
@@ -513,7 +535,7 @@ <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-@q
513535
<br class="clear">
514536

515537
<footer>
516-
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.11</a> on Tue Aug 16 2022 14:23:38 GMT+0100 (British Summer Time)
538+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.11</a> on Wed Sep 21 2022 10:00:52 GMT+0100 (British Summer Time)
517539
</footer>
518540

519541
<script> prettyPrint(); </script>

‎package-lock.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@questdb/nodejs-client",
3-
"version": "1.0.0",
3+
"version": "1.0.1",
44
"description": "QuestDB Node.js Client",
55
"main": "index.js",
66
"types": "types/index.d.ts",

‎src/sender.js

+30-7
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ class Sender {
2727
/** @private */ socket;
2828
/** @private */ bufferSize;
2929
/** @private */ buffer;
30+
/** @private */ toBuffer;
31+
/** @private */ doResolve;
3032
/** @private */ position;
3133
/** @private */ endOfLastRow;
3234
/** @private */ hasTable;
@@ -42,6 +44,9 @@ class Sender {
4244
* <ul>
4345
* <li>bufferSize: <i>number</i> - Size of the buffer used by the sender to collect rows, provided in bytes. <br>
4446
* Optional, defaults to 8192 bytes </li>
47+
* <li>copyBuffer: <i>boolean</i> - If true a new buffer will be created for every flush() call and the data to be sent to the server will be copied into this new buffer. <br>
48+
* Setting the flag could result in performance degradation, use this flag only if calls to the client cannot be serialised. <br>
49+
* Optional, defaults to false </li>
4550
* <li>jwk: <i>{x: string, y: string, kid: string, kty: string, d: string, crv: string}</i> - JsonWebKey for authentication. <br>
4651
* If not provided, client is not authenticated and server might reject the connection depending on configuration.</li>
4752
* </ul>
@@ -51,6 +56,13 @@ class Sender {
5156
if (options) {
5257
this.jwk = options.jwk;
5358
}
59+
this.toBuffer = options && options.copyBuffer ? this.toBufferNew : this.toBufferView;
60+
this.doResolve = options && options.copyBuffer
61+
? resolve => resolve(true)
62+
: resolve => {
63+
compact(this);
64+
resolve(true);
65+
}
5466
this.resize(options && options.bufferSize ? options.bufferSize : DEFAULT_BUFFER_SIZE);
5567
this.reset();
5668
}
@@ -167,26 +179,37 @@ class Sender {
167179
}
168180
return new Promise((resolve, reject) => {
169181
this.socket.write(data, err => {
170-
if (err) {
171-
reject(err);
172-
} else {
173-
compact(this);
174-
resolve(true);
175-
}
182+
err ? reject(err) : this.doResolve(resolve);
176183
});
177184
});
178185
}
179186

180187
/**
181188
* @ignore
182189
* @return {Buffer} Returns a cropped buffer ready to send to the server or null if there is nothing to send.
190+
* The returned buffer is backed by the sender's buffer.
183191
*/
184-
toBuffer(pos = this.position) {
192+
toBufferView(pos = this.position) {
185193
return pos > 0
186194
? this.buffer.subarray(0, pos)
187195
: null;
188196
}
189197

198+
/**
199+
* @ignore
200+
* @return {Buffer} Returns a cropped buffer ready to send to the server or null if there is nothing to send.
201+
* The returned buffer is a copy of the sender's buffer.
202+
*/
203+
toBufferNew(pos = this.position) {
204+
if (pos > 0) {
205+
const data = Buffer.allocUnsafe(pos);
206+
this.buffer.copy(data, 0, 0, pos);
207+
compact(this);
208+
return data;
209+
}
210+
return null;
211+
}
212+
190213
/**
191214
* Write the table name into the buffer of the sender.
192215
*

0 commit comments

Comments
 (0)
Failed to load comments.