bare-tty 1.0.4 → 1.0.5

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 (3) hide show
  1. package/binding.c +143 -98
  2. package/index.js +17 -28
  3. package/package.json +2 -4
package/binding.c CHANGED
@@ -5,9 +5,15 @@
5
5
  #include <uv.h>
6
6
 
7
7
  typedef struct {
8
- uv_tty_t tty;
9
- uv_buf_t read_buf;
10
- uv_shutdown_t end;
8
+ uv_tty_t handle;
9
+
10
+ struct {
11
+ uv_write_t write;
12
+ uv_shutdown_t shutdown;
13
+ } requests;
14
+
15
+ uv_buf_t read;
16
+
11
17
  js_env_t *env;
12
18
  js_ref_t *ctx;
13
19
  js_ref_t *on_write;
@@ -20,27 +26,41 @@ static void
20
26
  on_write (uv_write_t *req, int status) {
21
27
  int err;
22
28
 
23
- bare_tty_t *self = (bare_tty_t *) req->data;
29
+ bare_tty_t *tty = (bare_tty_t *) req->data;
24
30
 
25
- js_env_t *env = self->env;
31
+ js_env_t *env = tty->env;
26
32
 
27
33
  js_handle_scope_t *scope;
28
34
  err = js_open_handle_scope(env, &scope);
29
35
  assert(err == 0);
30
36
 
31
37
  js_value_t *ctx;
32
- err = js_get_reference_value(env, self->ctx, &ctx);
38
+ err = js_get_reference_value(env, tty->ctx, &ctx);
33
39
  assert(err == 0);
34
40
 
35
- js_value_t *callback;
36
- err = js_get_reference_value(env, self->on_write, &callback);
41
+ js_value_t *on_write;
42
+ err = js_get_reference_value(env, tty->on_write, &on_write);
37
43
  assert(err == 0);
38
44
 
39
45
  js_value_t *argv[1];
40
- err = js_create_int32(env, status, &argv[0]);
41
- assert(err == 0);
42
46
 
43
- js_call_function(env, ctx, callback, 1, argv, NULL);
47
+ if (status < 0) {
48
+ js_value_t *code;
49
+ err = js_create_string_utf8(env, (utf8_t *) uv_err_name(status), -1, &code);
50
+ assert(err == 0);
51
+
52
+ js_value_t *message;
53
+ err = js_create_string_utf8(env, (utf8_t *) uv_strerror(status), -1, &message);
54
+ assert(err == 0);
55
+
56
+ err = js_create_error(env, code, message, &argv[0]);
57
+ assert(err == 0);
58
+ } else {
59
+ err = js_get_null(env, &argv[0]);
60
+ assert(err == 0);
61
+ }
62
+
63
+ js_call_function(env, ctx, on_write, 1, argv, NULL);
44
64
 
45
65
  err = js_close_handle_scope(env, scope);
46
66
  assert(err == 0);
@@ -50,27 +70,41 @@ static void
50
70
  on_shutdown (uv_shutdown_t *req, int status) {
51
71
  int err;
52
72
 
53
- bare_tty_t *self = (bare_tty_t *) req->data;
73
+ bare_tty_t *tty = (bare_tty_t *) req->data;
54
74
 
55
- js_env_t *env = self->env;
75
+ js_env_t *env = tty->env;
56
76
 
57
77
  js_handle_scope_t *scope;
58
78
  err = js_open_handle_scope(env, &scope);
59
79
  assert(err == 0);
60
80
 
61
81
  js_value_t *ctx;
62
- err = js_get_reference_value(env, self->ctx, &ctx);
82
+ err = js_get_reference_value(env, tty->ctx, &ctx);
63
83
  assert(err == 0);
64
84
 
65
- js_value_t *callback;
66
- err = js_get_reference_value(env, self->on_end, &callback);
85
+ js_value_t *on_end;
86
+ err = js_get_reference_value(env, tty->on_end, &on_end);
67
87
  assert(err == 0);
68
88
 
69
89
  js_value_t *argv[1];
70
- err = js_create_int32(env, status, &argv[0]);
71
- assert(err == 0);
72
90
 
73
- js_call_function(env, ctx, callback, 1, argv, NULL);
91
+ if (status < 0) {
92
+ js_value_t *code;
93
+ err = js_create_string_utf8(env, (utf8_t *) uv_err_name(status), -1, &code);
94
+ assert(err == 0);
95
+
96
+ js_value_t *message;
97
+ err = js_create_string_utf8(env, (utf8_t *) uv_strerror(status), -1, &message);
98
+ assert(err == 0);
99
+
100
+ err = js_create_error(env, code, message, &argv[0]);
101
+ assert(err == 0);
102
+ } else {
103
+ err = js_get_null(env, &argv[0]);
104
+ assert(err == 0);
105
+ }
106
+
107
+ js_call_function(env, ctx, on_end, 1, argv, NULL);
74
108
 
75
109
  err = js_close_handle_scope(env, scope);
76
110
  assert(err == 0);
@@ -83,27 +117,47 @@ on_read (uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) {
83
117
 
84
118
  int err;
85
119
 
86
- bare_tty_t *self = (bare_tty_t *) stream;
120
+ bare_tty_t *tty = (bare_tty_t *) stream;
87
121
 
88
- js_env_t *env = self->env;
122
+ js_env_t *env = tty->env;
89
123
 
90
124
  js_handle_scope_t *scope;
91
125
  err = js_open_handle_scope(env, &scope);
92
126
  assert(err == 0);
93
127
 
94
128
  js_value_t *ctx;
95
- err = js_get_reference_value(env, self->ctx, &ctx);
129
+ err = js_get_reference_value(env, tty->ctx, &ctx);
96
130
  assert(err == 0);
97
131
 
98
- js_value_t *callback;
99
- err = js_get_reference_value(env, self->on_read, &callback);
132
+ js_value_t *on_read;
133
+ err = js_get_reference_value(env, tty->on_read, &on_read);
100
134
  assert(err == 0);
101
135
 
102
- js_value_t *argv[1];
103
- err = js_create_int32(env, nread, &argv[0]);
104
- assert(err == 0);
136
+ js_value_t *argv[2];
105
137
 
106
- js_call_function(env, ctx, callback, 1, argv, NULL);
138
+ if (nread < 0) {
139
+ js_value_t *code;
140
+ err = js_create_string_utf8(env, (utf8_t *) uv_err_name(nread), -1, &code);
141
+ assert(err == 0);
142
+
143
+ js_value_t *message;
144
+ err = js_create_string_utf8(env, (utf8_t *) uv_strerror(nread), -1, &message);
145
+ assert(err == 0);
146
+
147
+ err = js_create_error(env, code, message, &argv[0]);
148
+ assert(err == 0);
149
+
150
+ err = js_create_int32(env, 0, &argv[1]);
151
+ assert(err == 0);
152
+ } else {
153
+ err = js_get_null(env, &argv[0]);
154
+ assert(err == 0);
155
+
156
+ err = js_create_int32(env, nread, &argv[1]);
157
+ assert(err == 0);
158
+ }
159
+
160
+ js_call_function(env, ctx, on_read, 1, argv, NULL);
107
161
 
108
162
  err = js_close_handle_scope(env, scope);
109
163
  assert(err == 0);
@@ -113,37 +167,37 @@ static void
113
167
  on_close (uv_handle_t *handle) {
114
168
  int err;
115
169
 
116
- bare_tty_t *self = (bare_tty_t *) handle;
170
+ bare_tty_t *tty = (bare_tty_t *) handle;
117
171
 
118
- js_env_t *env = self->env;
172
+ js_env_t *env = tty->env;
119
173
 
120
174
  js_handle_scope_t *scope;
121
175
  err = js_open_handle_scope(env, &scope);
122
176
  assert(err == 0);
123
177
 
124
178
  js_value_t *ctx;
125
- err = js_get_reference_value(env, self->ctx, &ctx);
179
+ err = js_get_reference_value(env, tty->ctx, &ctx);
126
180
  assert(err == 0);
127
181
 
128
182
  js_value_t *callback;
129
- err = js_get_reference_value(env, self->on_close, &callback);
183
+ err = js_get_reference_value(env, tty->on_close, &callback);
130
184
  assert(err == 0);
131
185
 
132
186
  js_call_function(env, ctx, callback, 0, NULL, NULL);
133
187
 
134
- err = js_delete_reference(env, self->on_write);
188
+ err = js_delete_reference(env, tty->on_write);
135
189
  assert(err == 0);
136
190
 
137
- err = js_delete_reference(env, self->on_end);
191
+ err = js_delete_reference(env, tty->on_end);
138
192
  assert(err == 0);
139
193
 
140
- err = js_delete_reference(env, self->on_read);
194
+ err = js_delete_reference(env, tty->on_read);
141
195
  assert(err == 0);
142
196
 
143
- err = js_delete_reference(env, self->on_close);
197
+ err = js_delete_reference(env, tty->on_close);
144
198
  assert(err == 0);
145
199
 
146
- err = js_delete_reference(env, self->ctx);
200
+ err = js_delete_reference(env, tty->ctx);
147
201
  assert(err == 0);
148
202
 
149
203
  err = js_close_handle_scope(env, scope);
@@ -152,89 +206,83 @@ on_close (uv_handle_t *handle) {
152
206
 
153
207
  static void
154
208
  on_alloc (uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) {
155
- bare_tty_t *self = (bare_tty_t *) handle;
156
- *buf = self->read_buf;
209
+ bare_tty_t *tty = (bare_tty_t *) handle;
210
+
211
+ *buf = tty->read;
157
212
  }
158
213
 
159
214
  static js_value_t *
160
215
  bare_tty_init (js_env_t *env, js_callback_info_t *info) {
161
216
  int err;
162
217
 
163
- size_t argc = 8;
164
- js_value_t *argv[8];
218
+ size_t argc = 7;
219
+ js_value_t *argv[7];
165
220
 
166
221
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
167
222
  assert(err == 0);
168
223
 
169
- assert(argc == 8);
224
+ assert(argc == 7);
170
225
 
171
226
  uv_loop_t *loop;
172
227
  js_get_env_loop(env, &loop);
173
228
 
174
- bare_tty_t *self;
175
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &self, NULL, NULL, NULL);
176
- assert(err == 0);
229
+ js_value_t *handle;
177
230
 
178
- size_t read_buf_len;
179
- char *read_buf;
180
- err = js_get_typedarray_info(env, argv[1], NULL, (void **) &read_buf, &read_buf_len, NULL, NULL);
231
+ bare_tty_t *tty;
232
+ err = js_create_arraybuffer(env, sizeof(bare_tty_t), (void **) &tty, &handle);
181
233
  assert(err == 0);
182
234
 
183
235
  uint32_t fd;
184
- err = js_get_value_uint32(env, argv[2], &fd);
236
+ err = js_get_value_uint32(env, argv[0], &fd);
185
237
  assert(err == 0);
186
238
 
187
- err = uv_tty_init(loop, &self->tty, fd, 1);
239
+ err = uv_tty_init(loop, &tty->handle, fd, 1);
188
240
 
189
241
  if (err < 0) {
190
242
  js_throw_error(env, uv_err_name(err), uv_strerror(err));
191
243
  return NULL;
192
244
  }
193
245
 
194
- self->env = env;
246
+ tty->env = env;
195
247
 
196
- self->read_buf = uv_buf_init(read_buf, read_buf_len);
248
+ err = js_get_typedarray_info(env, argv[1], NULL, (void **) &tty->read.base, &tty->read.len, NULL, NULL);
249
+ assert(err == 0);
197
250
 
198
- err = js_create_reference(env, argv[3], 1, &self->ctx);
251
+ err = js_create_reference(env, argv[2], 1, &tty->ctx);
199
252
  assert(err == 0);
200
253
 
201
- err = js_create_reference(env, argv[4], 1, &self->on_write);
254
+ err = js_create_reference(env, argv[3], 1, &tty->on_write);
202
255
  assert(err == 0);
203
256
 
204
- err = js_create_reference(env, argv[5], 1, &self->on_end);
257
+ err = js_create_reference(env, argv[4], 1, &tty->on_end);
205
258
  assert(err == 0);
206
259
 
207
- err = js_create_reference(env, argv[6], 1, &self->on_read);
260
+ err = js_create_reference(env, argv[5], 1, &tty->on_read);
208
261
  assert(err == 0);
209
262
 
210
- err = js_create_reference(env, argv[7], 1, &self->on_close);
263
+ err = js_create_reference(env, argv[6], 1, &tty->on_close);
211
264
  assert(err == 0);
212
265
 
213
- return NULL;
266
+ return handle;
214
267
  }
215
268
 
216
269
  static js_value_t *
217
270
  bare_tty_writev (js_env_t *env, js_callback_info_t *info) {
218
271
  int err;
219
272
 
220
- size_t argc = 3;
221
- js_value_t *argv[3];
273
+ size_t argc = 2;
274
+ js_value_t *argv[2];
222
275
 
223
276
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
224
277
  assert(err == 0);
225
278
 
226
- assert(argc == 3);
227
-
228
- uv_write_t *req;
229
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &req, NULL, NULL, NULL);
230
- assert(err == 0);
279
+ assert(argc == 2);
231
280
 
232
- bare_tty_t *self;
233
- err = js_get_typedarray_info(env, argv[1], NULL, (void **) &self, NULL, NULL, NULL);
281
+ bare_tty_t *tty;
282
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &tty, NULL);
234
283
  assert(err == 0);
235
284
 
236
- js_value_t *arr = argv[2];
237
- js_value_t *item;
285
+ js_value_t *arr = argv[1];
238
286
 
239
287
  uint32_t bufs_len;
240
288
  err = js_get_array_length(env, arr, &bufs_len);
@@ -243,6 +291,7 @@ bare_tty_writev (js_env_t *env, js_callback_info_t *info) {
243
291
  uv_buf_t *bufs = malloc(sizeof(uv_buf_t) * bufs_len);
244
292
 
245
293
  for (uint32_t i = 0; i < bufs_len; i++) {
294
+ js_value_t *item;
246
295
  err = js_get_element(env, arr, i, &item);
247
296
  assert(err == 0);
248
297
 
@@ -251,9 +300,11 @@ bare_tty_writev (js_env_t *env, js_callback_info_t *info) {
251
300
  assert(err == 0);
252
301
  }
253
302
 
254
- req->data = self;
303
+ uv_write_t *req = &tty->requests.write;
304
+
305
+ req->data = tty;
255
306
 
256
- err = uv_write(req, (uv_stream_t *) &self->tty, bufs, bufs_len, on_write);
307
+ err = uv_write(req, (uv_stream_t *) &tty->handle, bufs, bufs_len, on_write);
257
308
 
258
309
  free(bufs);
259
310
 
@@ -277,15 +328,15 @@ bare_tty_end (js_env_t *env, js_callback_info_t *info) {
277
328
 
278
329
  assert(argc == 1);
279
330
 
280
- bare_tty_t *self;
281
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &self, NULL, NULL, NULL);
331
+ bare_tty_t *tty;
332
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &tty, NULL);
282
333
  assert(err == 0);
283
334
 
284
- uv_shutdown_t *req = &self->end;
335
+ uv_shutdown_t *req = &tty->requests.shutdown;
285
336
 
286
- req->data = self;
337
+ req->data = tty;
287
338
 
288
- err = uv_shutdown(req, (uv_stream_t *) self, on_shutdown);
339
+ err = uv_shutdown(req, (uv_stream_t *) &tty->handle, on_shutdown);
289
340
 
290
341
  if (err < 0) {
291
342
  js_throw_error(env, uv_err_name(err), uv_strerror(err));
@@ -307,11 +358,13 @@ bare_tty_resume (js_env_t *env, js_callback_info_t *info) {
307
358
 
308
359
  assert(argc == 1);
309
360
 
310
- bare_tty_t *self;
311
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &self, NULL, NULL, NULL);
361
+ bare_tty_t *tty;
362
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &tty, NULL);
312
363
  assert(err == 0);
313
364
 
314
- err = uv_read_start((uv_stream_t *) &self->tty, on_alloc, on_read);
365
+ if (!uv_is_readable((uv_stream_t *) &tty->handle)) return NULL;
366
+
367
+ err = uv_read_start((uv_stream_t *) &tty->handle, on_alloc, on_read);
315
368
 
316
369
  if (err < 0) {
317
370
  js_throw_error(env, uv_err_name(err), uv_strerror(err));
@@ -333,11 +386,13 @@ bare_tty_pause (js_env_t *env, js_callback_info_t *info) {
333
386
 
334
387
  assert(argc == 1);
335
388
 
336
- bare_tty_t *self;
337
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &self, NULL, NULL, NULL);
389
+ bare_tty_t *tty;
390
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &tty, NULL);
338
391
  assert(err == 0);
339
392
 
340
- err = uv_read_stop((uv_stream_t *) &self->tty);
393
+ if (!uv_is_readable((uv_stream_t *) &tty->handle)) return NULL;
394
+
395
+ err = uv_read_stop((uv_stream_t *) &tty->handle);
341
396
 
342
397
  if (err < 0) {
343
398
  js_throw_error(env, uv_err_name(err), uv_strerror(err));
@@ -359,11 +414,11 @@ bare_tty_close (js_env_t *env, js_callback_info_t *info) {
359
414
 
360
415
  assert(argc == 1);
361
416
 
362
- bare_tty_t *self;
363
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &self, NULL, NULL, NULL);
417
+ bare_tty_t *tty;
418
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &tty, NULL);
364
419
  assert(err == 0);
365
420
 
366
- uv_close((uv_handle_t *) &self->tty, on_close);
421
+ uv_close((uv_handle_t *) &tty->handle, on_close);
367
422
 
368
423
  return NULL;
369
424
  }
@@ -390,15 +445,15 @@ bare_tty_set_mode (js_env_t *env, js_callback_info_t *info) {
390
445
 
391
446
  assert(argc == 2);
392
447
 
393
- bare_tty_t *self;
394
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &self, NULL, NULL, NULL);
448
+ bare_tty_t *tty;
449
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &tty, NULL);
395
450
  assert(err == 0);
396
451
 
397
452
  uint32_t mode;
398
453
  err = js_get_value_uint32(env, argv[1], &mode);
399
454
  assert(err == 0);
400
455
 
401
- err = uv_tty_set_mode(&self->tty, mode);
456
+ err = uv_tty_set_mode(&tty->handle, mode);
402
457
 
403
458
  if (err < 0) {
404
459
  js_throw_error(env, uv_err_name(err), uv_strerror(err));
@@ -410,16 +465,6 @@ bare_tty_set_mode (js_env_t *env, js_callback_info_t *info) {
410
465
 
411
466
  static js_value_t *
412
467
  init (js_env_t *env, js_value_t *exports) {
413
- {
414
- js_value_t *val;
415
- js_create_uint32(env, sizeof(bare_tty_t), &val);
416
- js_set_named_property(env, exports, "sizeofTTY", val);
417
- }
418
- {
419
- js_value_t *val;
420
- js_create_uint32(env, sizeof(uv_write_t), &val);
421
- js_set_named_property(env, exports, "sizeofWrite", val);
422
- }
423
468
  {
424
469
  js_value_t *fn;
425
470
  js_create_function(env, "init", -1, bare_tty_init, NULL, &fn);
package/index.js CHANGED
@@ -6,14 +6,13 @@ const DEFAULT_READ_BUFFER = 65536
6
6
  process.on('exit', () => binding.reset())
7
7
 
8
8
  module.exports = exports = class TTY extends Duplex {
9
- constructor (fd, { readBufferSize = DEFAULT_READ_BUFFER, allowHalfOpen = true } = {}) {
9
+ constructor (fd, opts = {}) {
10
10
  super({ mapWritable })
11
11
 
12
- const slab = Buffer.alloc(binding.sizeofTTY + binding.sizeofWrite + readBufferSize)
13
-
14
- this._handle = slab.subarray(0, binding.sizeofTTY)
15
- this._req = slab.subarray(binding.sizeofTTY, binding.sizeofTTY + binding.sizeofWrite)
16
- this._buffer = slab.subarray(binding.sizeofTTY + binding.sizeofWrite)
12
+ const {
13
+ readBufferSize = DEFAULT_READ_BUFFER,
14
+ allowHalfOpen = true
15
+ } = opts
17
16
 
18
17
  this._writeCallback = null
19
18
  this._finalCallback = null
@@ -21,7 +20,9 @@ module.exports = exports = class TTY extends Duplex {
21
20
 
22
21
  this._allowHalfOpen = allowHalfOpen
23
22
 
24
- binding.init(this._handle, this._buffer, fd, this,
23
+ this._buffer = Buffer.alloc(readBufferSize)
24
+
25
+ this._handle = binding.init(fd, this._buffer, this,
25
26
  this._onwrite,
26
27
  this._onfinal,
27
28
  this._onread,
@@ -36,7 +37,7 @@ module.exports = exports = class TTY extends Duplex {
36
37
 
37
38
  _writev (datas, cb) {
38
39
  this._writeCallback = cb
39
- binding.writev(this._req, this._handle, datas)
40
+ binding.writev(this._handle, datas)
40
41
  }
41
42
 
42
43
  _final (cb) {
@@ -70,20 +71,19 @@ module.exports = exports = class TTY extends Duplex {
70
71
  cb(null)
71
72
  }
72
73
 
73
- _onwrite (status) {
74
- const err = status < 0 ? makeError(status) : null
74
+ _onwrite (err) {
75
75
  this._continueWrite(err)
76
76
  }
77
77
 
78
- _onread (read) {
79
- if (read === 0) {
80
- this.push(null)
81
- if (this._allowHalfOpen === false) this.end()
78
+ _onread (err, read) {
79
+ if (err) {
80
+ this.destroy(err)
82
81
  return
83
82
  }
84
83
 
85
- if (read < 0) {
86
- this.destroy(makeError(read))
84
+ if (read === 0) {
85
+ this.push(null)
86
+ if (this._allowHalfOpen === false) this.end()
87
87
  return
88
88
  }
89
89
 
@@ -93,8 +93,7 @@ module.exports = exports = class TTY extends Duplex {
93
93
  this.push(copy)
94
94
  }
95
95
 
96
- _onfinal (status) {
97
- const err = status < 0 ? makeError(status) : null
96
+ _onfinal (err) {
98
97
  this._continueFinal(err)
99
98
  }
100
99
 
@@ -117,13 +116,3 @@ exports.constants = {
117
116
  function mapWritable (buf) {
118
117
  return typeof buf === 'string' ? Buffer.from(buf) : buf
119
118
  }
120
-
121
- function makeError (errno) {
122
- const [code, msg] = process.errnos.get(errno)
123
- const err = new Error(code + ': ' + msg)
124
-
125
- err.code = code
126
- err.errno = errno
127
-
128
- return err
129
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bare-tty",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Native TTY streams for JavaScript",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -11,9 +11,7 @@
11
11
  "prebuilds"
12
12
  ],
13
13
  "scripts": {
14
- "test": "standard && bare test.js",
15
- "install": "bare-dev rebuild",
16
- "prebuild": "bare-dev prebuild"
14
+ "test": "standard && bare test.js"
17
15
  },
18
16
  "repository": {
19
17
  "type": "git",