bare-buffer 2.7.1 → 3.0.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.
package/CMakeLists.txt CHANGED
@@ -5,9 +5,9 @@ find_package(cmake-fetch REQUIRED PATHS node_modules/cmake-fetch)
5
5
 
6
6
  project(bare_buffer C)
7
7
 
8
- fetch_package("github:holepunchto/libutf#65b6ba0")
9
- fetch_package("github:holepunchto/libbase64#4cd8d8b")
10
- fetch_package("github:holepunchto/libhex#939999b")
8
+ fetch_package("github:holepunchto/libutf#9509b28")
9
+ fetch_package("github:holepunchto/libbase64#cded073")
10
+ fetch_package("github:holepunchto/libhex#1dfad95")
11
11
 
12
12
  add_bare_module(bare_buffer)
13
13
 
package/binding.c CHANGED
@@ -3,20 +3,32 @@
3
3
  #include <base64.h>
4
4
  #include <hex.h>
5
5
  #include <js.h>
6
- #include <js/ffi.h>
7
6
  #include <stdlib.h>
8
7
  #include <string.h>
9
8
  #include <utf.h>
10
9
 
11
10
  static js_type_tag_t bare_buffer__tag = {0xfea3e944b70b0812, 0xe53bb5c343c040b6};
12
11
 
12
+ static inline int
13
+ bare_buffer__memcmp (void *a, size_t a_len, void *b, size_t b_len) {
14
+ int r = memcmp(a, b, a_len < b_len ? a_len : b_len);
15
+
16
+ if (r == 0) {
17
+ if (a_len < b_len) return -1;
18
+ if (a_len > b_len) return 1;
19
+ return 0;
20
+ }
21
+
22
+ return r < 0 ? -1 : 1;
23
+ }
24
+
13
25
  static void
14
- bare_buffer_set_zero_fill_enabled_fast (js_ffi_receiver_t *receiver, uint32_t enabled) {
15
- js_set_arraybuffer_zero_fill_enabled(enabled != 0);
26
+ bare_buffer__on_free_string (js_env_t *env, void *data, void *finalize_hint) {
27
+ free(data);
16
28
  }
17
29
 
18
30
  static js_value_t *
19
- bare_buffer_set_zero_fill_enabled (js_env_t *env, js_callback_info_t *info) {
31
+ bare_buffer_alloc (js_env_t *env, js_callback_info_t *info) {
20
32
  int err;
21
33
 
22
34
  size_t argc = 1;
@@ -27,18 +39,53 @@ bare_buffer_set_zero_fill_enabled (js_env_t *env, js_callback_info_t *info) {
27
39
 
28
40
  assert(argc == 1);
29
41
 
30
- uint32_t enabled;
31
- err = js_get_value_uint32(env, argv[0], &enabled);
42
+ uint32_t len;
43
+ err = js_get_value_uint32(env, argv[0], &len);
32
44
  assert(err == 0);
33
45
 
34
- js_set_arraybuffer_zero_fill_enabled(enabled != 0);
46
+ js_value_t *result;
47
+ err = js_create_arraybuffer(env, len, NULL, &result);
48
+ assert(err == 0);
35
49
 
36
- return NULL;
50
+ return result;
51
+ }
52
+
53
+ static js_value_t *
54
+ bare_buffer_alloc_unsafe (js_env_t *env, js_callback_info_t *info) {
55
+ int err;
56
+
57
+ size_t argc = 1;
58
+ js_value_t *argv[1];
59
+
60
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
61
+ assert(err == 0);
62
+
63
+ assert(argc == 1);
64
+
65
+ uint32_t len;
66
+ err = js_get_value_uint32(env, argv[0], &len);
67
+ assert(err == 0);
68
+
69
+ js_value_t *result;
70
+ err = js_create_unsafe_arraybuffer(env, len, NULL, &result);
71
+ assert(err == 0);
72
+
73
+ return result;
37
74
  }
38
75
 
39
76
  static uint32_t
40
- bare_buffer_byte_length_utf8_fast (js_ffi_receiver_t *receiver, js_ffi_string_t *str) {
41
- return utf8_length_from_latin1((const latin1_t *) str->data, str->len);
77
+ bare_buffer_typed_byte_length_utf8 (js_value_t *receiver, js_value_t *str, js_typed_callback_info_t *info) {
78
+ int err;
79
+
80
+ js_env_t *env;
81
+ err = js_get_typed_callback_info(info, &env, NULL);
82
+ assert(err == 0);
83
+
84
+ size_t str_len;
85
+ err = js_get_value_string_utf8(env, str, NULL, 0, &str_len);
86
+ assert(err == 0);
87
+
88
+ return (uint32_t) str_len;
42
89
  }
43
90
 
44
91
  static js_value_t *
@@ -76,18 +123,43 @@ bare_buffer_to_string_utf8 (js_env_t *env, js_callback_info_t *info) {
76
123
 
77
124
  assert(argc == 1);
78
125
 
79
- size_t str_len;
80
- utf8_t *str;
81
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &str, &str_len, NULL, NULL);
126
+ utf8_t *buf;
127
+ size_t buf_len;
128
+ err = js_get_typedarray_info(env, argv[0], NULL, (void **) &buf, &buf_len, NULL, NULL);
82
129
  assert(err == 0);
83
130
 
84
131
  js_value_t *result;
85
- err = js_create_string_utf8(env, str, str_len, &result);
132
+ err = js_create_string_utf8(env, buf, buf_len, &result);
86
133
  assert(err == 0);
87
134
 
88
135
  return result;
89
136
  }
90
137
 
138
+ static uint32_t
139
+ bare_buffer_typed_write_utf8 (js_value_t *receiver, js_value_t *typedarray, js_value_t *string, js_typed_callback_info_t *info) {
140
+ int err;
141
+
142
+ js_env_t *env;
143
+ err = js_get_typed_callback_info(info, &env, NULL);
144
+ assert(err == 0);
145
+
146
+ void *buf;
147
+ size_t buf_len;
148
+
149
+ js_typedarray_view_t *buf_view;
150
+ err = js_get_typedarray_view(env, typedarray, NULL, &buf, &buf_len, &buf_view);
151
+ assert(err == 0);
152
+
153
+ size_t str_len;
154
+ err = js_get_value_string_utf8(env, string, buf, buf_len, &str_len);
155
+ assert(err == 0);
156
+
157
+ err = js_release_typedarray_view(env, buf_view);
158
+ assert(err == 0);
159
+
160
+ return (uint32_t) str_len;
161
+ }
162
+
91
163
  static js_value_t *
92
164
  bare_buffer_write_utf8 (js_env_t *env, js_callback_info_t *info) {
93
165
  int err;
@@ -100,8 +172,8 @@ bare_buffer_write_utf8 (js_env_t *env, js_callback_info_t *info) {
100
172
 
101
173
  assert(argc == 2);
102
174
 
103
- size_t buf_len;
104
175
  void *buf;
176
+ size_t buf_len;
105
177
  err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
106
178
  assert(err == 0);
107
179
 
@@ -128,20 +200,49 @@ bare_buffer_to_string_utf16le (js_env_t *env, js_callback_info_t *info) {
128
200
 
129
201
  assert(argc == 1);
130
202
 
131
- size_t str_len;
132
- utf16_t *str;
133
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &str, &str_len, NULL, NULL);
203
+ utf16_t *buf;
204
+ size_t buf_len;
205
+ err = js_get_typedarray_info(env, argv[0], NULL, (void **) &buf, &buf_len, NULL, NULL);
134
206
  assert(err == 0);
135
207
 
136
- str_len /= sizeof(utf16_t);
208
+ buf_len /= sizeof(utf16_t);
137
209
 
138
210
  js_value_t *result;
139
- err = js_create_string_utf16le(env, str, str_len, &result);
211
+ err = js_create_string_utf16le(env, buf, buf_len, &result);
140
212
  assert(err == 0);
141
213
 
142
214
  return result;
143
215
  }
144
216
 
217
+ static uint32_t
218
+ bare_buffer_typed_write_utf16le (js_value_t *receiver, js_value_t *typedarray, js_value_t *string, js_typed_callback_info_t *info) {
219
+ int err;
220
+
221
+ js_env_t *env;
222
+ err = js_get_typed_callback_info(info, &env, NULL);
223
+ assert(err == 0);
224
+
225
+ void *buf;
226
+ size_t buf_len;
227
+
228
+ js_typedarray_view_t *buf_view;
229
+ err = js_get_typedarray_view(env, typedarray, NULL, &buf, &buf_len, &buf_view);
230
+ assert(err == 0);
231
+
232
+ buf_len /= sizeof(utf16_t);
233
+
234
+ size_t str_len;
235
+ err = js_get_value_string_utf16le(env, string, buf, buf_len, &str_len);
236
+ assert(err == 0);
237
+
238
+ str_len *= sizeof(utf16_t);
239
+
240
+ err = js_release_typedarray_view(env, buf_view);
241
+ assert(err == 0);
242
+
243
+ return (uint32_t) str_len;
244
+ }
245
+
145
246
  static js_value_t *
146
247
  bare_buffer_write_utf16le (js_env_t *env, js_callback_info_t *info) {
147
248
  int err;
@@ -154,8 +255,8 @@ bare_buffer_write_utf16le (js_env_t *env, js_callback_info_t *info) {
154
255
 
155
256
  assert(argc == 2);
156
257
 
157
- size_t buf_len;
158
258
  void *buf;
259
+ size_t buf_len;
159
260
  err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
160
261
  assert(err == 0);
161
262
 
@@ -186,28 +287,66 @@ bare_buffer_to_string_base64 (js_env_t *env, js_callback_info_t *info) {
186
287
 
187
288
  assert(argc == 1);
188
289
 
189
- size_t buf_len;
190
290
  void *buf;
291
+ size_t buf_len;
191
292
  err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
192
293
  assert(err == 0);
193
294
 
194
295
  size_t str_len;
195
- err = base64_encode(buf, buf_len, NULL, &str_len);
296
+ err = base64_encode_utf8(buf, buf_len, NULL, &str_len);
196
297
  assert(err == 0);
197
298
 
198
299
  utf8_t *str = malloc(str_len);
199
- err = base64_encode(buf, buf_len, str, &str_len);
300
+ err = base64_encode_utf8(buf, buf_len, str, &str_len);
200
301
  assert(err == 0);
201
302
 
202
303
  js_value_t *result;
203
- err = js_create_string_utf8(env, str, str_len, &result);
304
+ err = js_create_external_string_latin1(env, str, str_len, bare_buffer__on_free_string, NULL, &result, NULL);
204
305
  assert(err == 0);
205
306
 
206
- free(str);
207
-
208
307
  return result;
209
308
  }
210
309
 
310
+ static uint32_t
311
+ bare_buffer_typed_write_base64 (js_value_t *receiver, js_value_t *typedarray, js_value_t *string, js_typed_callback_info_t *info) {
312
+ int err;
313
+
314
+ js_env_t *env;
315
+ err = js_get_typed_callback_info(info, &env, NULL);
316
+ assert(err == 0);
317
+
318
+ void *buf;
319
+ size_t buf_len;
320
+
321
+ js_typedarray_view_t *buf_view;
322
+ err = js_get_typedarray_view(env, typedarray, NULL, &buf, &buf_len, &buf_view);
323
+ assert(err == 0);
324
+
325
+ js_string_encoding_t encoding;
326
+ const void *str;
327
+ size_t str_len;
328
+
329
+ js_string_view_t *str_view;
330
+ err = js_get_string_view(env, string, &encoding, &str, &str_len, &str_view);
331
+ assert(err == 0);
332
+
333
+ if (encoding == js_utf16le) {
334
+ err = base64_decode_utf16le(str, str_len, buf, &buf_len);
335
+ assert(err == 0);
336
+ } else {
337
+ err = base64_decode_utf8(str, str_len, buf, &buf_len);
338
+ assert(err == 0);
339
+ }
340
+
341
+ err = js_release_string_view(env, str_view);
342
+ assert(err == 0);
343
+
344
+ err = js_release_typedarray_view(env, buf_view);
345
+ assert(err == 0);
346
+
347
+ return buf_len;
348
+ }
349
+
211
350
  static js_value_t *
212
351
  bare_buffer_write_base64 (js_env_t *env, js_callback_info_t *info) {
213
352
  int err;
@@ -220,23 +359,29 @@ bare_buffer_write_base64 (js_env_t *env, js_callback_info_t *info) {
220
359
 
221
360
  assert(argc == 2);
222
361
 
223
- size_t buf_len;
224
362
  void *buf;
363
+ size_t buf_len;
225
364
  err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
226
365
  assert(err == 0);
227
366
 
367
+ js_string_encoding_t encoding;
368
+ const void *str;
228
369
  size_t str_len;
229
- err = js_get_value_string_utf8(env, argv[1], NULL, 0, &str_len);
230
- assert(err == 0);
231
370
 
232
- utf8_t *str = malloc(str_len);
233
- err = js_get_value_string_utf8(env, argv[1], str, str_len, NULL);
371
+ js_string_view_t *str_view;
372
+ err = js_get_string_view(env, argv[1], &encoding, &str, &str_len, &str_view);
234
373
  assert(err == 0);
235
374
 
236
- err = base64_decode(str, str_len, buf, &buf_len);
237
- assert(err == 0);
375
+ if (encoding == js_utf16le) {
376
+ err = base64_decode_utf16le(str, str_len, buf, &buf_len);
377
+ assert(err == 0);
378
+ } else {
379
+ err = base64_decode_utf8(str, str_len, buf, &buf_len);
380
+ assert(err == 0);
381
+ }
238
382
 
239
- free(str);
383
+ err = js_release_string_view(env, str_view);
384
+ assert(err == 0);
240
385
 
241
386
  js_value_t *result;
242
387
  err = js_create_uint32(env, (uint32_t) buf_len, &result);
@@ -257,28 +402,66 @@ bare_buffer_to_string_hex (js_env_t *env, js_callback_info_t *info) {
257
402
 
258
403
  assert(argc == 1);
259
404
 
260
- size_t buf_len;
261
405
  void *buf;
406
+ size_t buf_len;
262
407
  err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
263
408
  assert(err == 0);
264
409
 
265
410
  size_t str_len;
266
- err = hex_encode(buf, buf_len, NULL, &str_len);
411
+ err = hex_encode_utf8(buf, buf_len, NULL, &str_len);
267
412
  assert(err == 0);
268
413
 
269
414
  utf8_t *str = malloc(str_len);
270
- err = hex_encode(buf, buf_len, str, &str_len);
415
+ err = hex_encode_utf8(buf, buf_len, str, &str_len);
271
416
  assert(err == 0);
272
417
 
273
418
  js_value_t *result;
274
- err = js_create_string_utf8(env, str, str_len, &result);
419
+ err = js_create_external_string_latin1(env, str, str_len, bare_buffer__on_free_string, NULL, &result, NULL);
275
420
  assert(err == 0);
276
421
 
277
- free(str);
278
-
279
422
  return result;
280
423
  }
281
424
 
425
+ static uint32_t
426
+ bare_buffer_typed_write_hex (js_value_t *receiver, js_value_t *typedarray, js_value_t *string, js_typed_callback_info_t *info) {
427
+ int err;
428
+
429
+ js_env_t *env;
430
+ err = js_get_typed_callback_info(info, &env, NULL);
431
+ assert(err == 0);
432
+
433
+ void *buf;
434
+ size_t buf_len;
435
+
436
+ js_typedarray_view_t *buf_view;
437
+ err = js_get_typedarray_view(env, typedarray, NULL, &buf, &buf_len, &buf_view);
438
+ assert(err == 0);
439
+
440
+ js_string_encoding_t encoding;
441
+ const void *str;
442
+ size_t str_len;
443
+
444
+ js_string_view_t *str_view;
445
+ err = js_get_string_view(env, string, &encoding, &str, &str_len, &str_view);
446
+ assert(err == 0);
447
+
448
+ if (encoding == js_utf16le) {
449
+ err = hex_decode_utf16le(str, str_len, buf, &buf_len);
450
+ assert(err == 0);
451
+ } else {
452
+ err = hex_decode_utf8(str, str_len, buf, &buf_len);
453
+ assert(err == 0);
454
+ }
455
+
456
+ err = js_release_string_view(env, str_view);
457
+ assert(err == 0);
458
+
459
+ err = js_release_typedarray_view(env, buf_view);
460
+ assert(err == 0);
461
+
462
+ return buf_len;
463
+ }
464
+
282
465
  static js_value_t *
283
466
  bare_buffer_write_hex (js_env_t *env, js_callback_info_t *info) {
284
467
  int err;
@@ -291,23 +474,29 @@ bare_buffer_write_hex (js_env_t *env, js_callback_info_t *info) {
291
474
 
292
475
  assert(argc == 2);
293
476
 
294
- size_t buf_len;
295
477
  void *buf;
478
+ size_t buf_len;
296
479
  err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
297
480
  assert(err == 0);
298
481
 
482
+ js_string_encoding_t encoding;
483
+ const void *str;
299
484
  size_t str_len;
300
- err = js_get_value_string_utf8(env, argv[1], NULL, 0, &str_len);
301
- assert(err == 0);
302
485
 
303
- utf8_t *str = malloc(str_len);
304
- err = js_get_value_string_utf8(env, argv[1], str, str_len, NULL);
486
+ js_string_view_t *str_view;
487
+ err = js_get_string_view(env, argv[1], &encoding, &str, &str_len, &str_view);
305
488
  assert(err == 0);
306
489
 
307
- err = hex_decode(str, str_len, buf, &buf_len);
308
- assert(err == 0);
490
+ if (encoding == js_utf16le) {
491
+ err = hex_decode_utf16le(str, str_len, buf, &buf_len);
492
+ assert(err == 0);
493
+ } else {
494
+ err = hex_decode_utf8(str, str_len, buf, &buf_len);
495
+ assert(err == 0);
496
+ }
309
497
 
310
- free(str);
498
+ err = js_release_string_view(env, str_view);
499
+ assert(err == 0);
311
500
 
312
501
  js_value_t *result;
313
502
  err = js_create_uint32(env, (uint32_t) buf_len, &result);
@@ -316,22 +505,25 @@ bare_buffer_write_hex (js_env_t *env, js_callback_info_t *info) {
316
505
  return result;
317
506
  }
318
507
 
319
- static inline int
320
- bare_buffer__compare (void *a, size_t a_len, void *b, size_t b_len) {
321
- int r = memcmp(a, b, a_len < b_len ? a_len : b_len);
508
+ static int32_t
509
+ bare_buffer_typed_compare (js_value_t *receiver, js_value_t *source, js_value_t *target, js_typed_callback_info_t *info) {
510
+ int err;
322
511
 
323
- if (r == 0) {
324
- if (a_len < b_len) return -1;
325
- if (a_len > b_len) return 1;
326
- return 0;
327
- }
512
+ js_env_t *env;
513
+ err = js_get_typed_callback_info(info, &env, NULL);
514
+ assert(err == 0);
328
515
 
329
- return r < 0 ? -1 : 1;
330
- }
516
+ void *a;
517
+ size_t a_len;
518
+ err = js_get_typedarray_info(env, source, NULL, &a, &a_len, NULL, NULL);
519
+ assert(err == 0);
331
520
 
332
- static int32_t
333
- bare_buffer_compare_fast (js_ffi_receiver_t *recv, js_ffi_typedarray_t *a, js_ffi_typedarray_t *b) {
334
- return bare_buffer__compare(a->data.u8, a->len, b->data.u8, b->len);
521
+ void *b;
522
+ size_t b_len;
523
+ err = js_get_typedarray_info(env, target, NULL, &b, &b_len, NULL, NULL);
524
+ assert(err == 0);
525
+
526
+ return bare_buffer__memcmp(a, a_len, b, b_len);
335
527
  }
336
528
 
337
529
  static js_value_t *
@@ -346,18 +538,18 @@ bare_buffer_compare (js_env_t *env, js_callback_info_t *info) {
346
538
 
347
539
  assert(argc == 2);
348
540
 
349
- size_t a_len;
350
541
  void *a;
542
+ size_t a_len;
351
543
  err = js_get_typedarray_info(env, argv[0], NULL, &a, &a_len, NULL, NULL);
352
544
  assert(err == 0);
353
545
 
354
- size_t b_len;
355
546
  void *b;
547
+ size_t b_len;
356
548
  err = js_get_typedarray_info(env, argv[1], NULL, &b, &b_len, NULL, NULL);
357
549
  assert(err == 0);
358
550
 
359
551
  js_value_t *result;
360
- err = js_create_int32(env, bare_buffer__compare(a, a_len, b, b_len), &result);
552
+ err = js_create_int32(env, bare_buffer__memcmp(a, a_len, b, b_len), &result);
361
553
  assert(err == 0);
362
554
 
363
555
  return result;
@@ -393,12 +585,12 @@ bare_buffer_is_tagged (js_env_t *env, js_callback_info_t *info) {
393
585
 
394
586
  assert(argc == 1);
395
587
 
396
- bool is_buffer;
397
- err = js_check_type_tag(env, argv[0], &bare_buffer__tag, &is_buffer);
588
+ bool is_tagged;
589
+ err = js_check_type_tag(env, argv[0], &bare_buffer__tag, &is_tagged);
398
590
  assert(err == 0);
399
591
 
400
592
  js_value_t *result;
401
- err = js_get_boolean(env, is_buffer, &result);
593
+ err = js_get_boolean(env, is_tagged, &result);
402
594
  assert(err == 0);
403
595
 
404
596
  return result;
@@ -408,105 +600,130 @@ static js_value_t *
408
600
  bare_buffer_exports (js_env_t *env, js_value_t *exports) {
409
601
  int err;
410
602
 
411
- #define V(name, fn, ffi) \
603
+ #define V(name, untyped, signature, typed) \
412
604
  { \
413
605
  js_value_t *val; \
414
- if (ffi) { \
415
- err = js_create_function_with_ffi(env, name, -1, fn, NULL, ffi, &val); \
606
+ if (signature) { \
607
+ err = js_create_typed_function(env, name, -1, untyped, signature, typed, NULL, &val); \
608
+ assert(err == 0); \
416
609
  } else { \
417
- err = js_create_function(env, name, -1, fn, NULL, &val); \
610
+ err = js_create_function(env, name, -1, untyped, NULL, &val); \
611
+ assert(err == 0); \
418
612
  } \
419
- assert(err == 0); \
420
613
  err = js_set_named_property(env, exports, name, val); \
421
614
  assert(err == 0); \
422
615
  }
423
616
 
424
- {
425
- js_ffi_type_info_t *return_info;
426
- err = js_ffi_create_type_info(js_ffi_void, &return_info);
427
- assert(err == 0);
428
-
429
- js_ffi_type_info_t *arg_info[2];
430
-
431
- err = js_ffi_create_type_info(js_ffi_receiver, &arg_info[0]);
432
- assert(err == 0);
433
-
434
- err = js_ffi_create_type_info(js_ffi_uint32, &arg_info[1]);
435
- assert(err == 0);
436
-
437
- js_ffi_function_info_t *function_info;
438
- err = js_ffi_create_function_info(return_info, arg_info, 2, &function_info);
439
- assert(err == 0);
440
-
441
- js_ffi_function_t *ffi;
442
- err = js_ffi_create_function(bare_buffer_set_zero_fill_enabled_fast, function_info, &ffi);
443
- assert(err == 0);
444
-
445
- V("setZeroFillEnabled", bare_buffer_set_zero_fill_enabled, ffi);
446
- }
447
-
448
- {
449
- js_ffi_type_info_t *return_info;
450
- err = js_ffi_create_type_info(js_ffi_int32, &return_info);
451
- assert(err == 0);
452
-
453
- js_ffi_type_info_t *arg_info[2];
454
-
455
- err = js_ffi_create_type_info(js_ffi_receiver, &arg_info[0]);
456
- assert(err == 0);
457
-
458
- err = js_ffi_create_type_info(js_ffi_string, &arg_info[1]);
459
- assert(err == 0);
460
-
461
- js_ffi_function_info_t *function_info;
462
- err = js_ffi_create_function_info(return_info, arg_info, 2, &function_info);
463
- assert(err == 0);
464
-
465
- js_ffi_function_t *ffi;
466
- err = js_ffi_create_function(bare_buffer_byte_length_utf8_fast, function_info, &ffi);
467
- assert(err == 0);
468
-
469
- V("byteLengthUTF8", bare_buffer_byte_length_utf8, ffi);
470
- }
471
-
472
- V("toStringUTF8", bare_buffer_to_string_utf8, NULL);
473
- V("writeUTF8", bare_buffer_write_utf8, NULL);
474
- V("toStringUTF16LE", bare_buffer_to_string_utf16le, NULL);
475
- V("writeUTF16LE", bare_buffer_write_utf16le, NULL);
476
- V("toStringBase64", bare_buffer_to_string_base64, NULL);
477
- V("writeBase64", bare_buffer_write_base64, NULL);
478
- V("toStringHex", bare_buffer_to_string_hex, NULL);
479
- V("writeHex", bare_buffer_write_hex, NULL);
480
-
481
- {
482
- js_ffi_type_info_t *return_info;
483
- err = js_ffi_create_type_info(js_ffi_int32, &return_info);
484
- assert(err == 0);
485
-
486
- js_ffi_type_info_t *arg_info[3];
487
-
488
- err = js_ffi_create_type_info(js_ffi_receiver, &arg_info[0]);
489
- assert(err == 0);
490
-
491
- err = js_ffi_create_type_info(js_ffi_uint8array, &arg_info[1]);
492
- assert(err == 0);
493
-
494
- err = js_ffi_create_type_info(js_ffi_uint8array, &arg_info[2]);
495
- assert(err == 0);
496
-
497
- js_ffi_function_info_t *function_info;
498
- err = js_ffi_create_function_info(return_info, arg_info, 3, &function_info);
499
- assert(err == 0);
500
-
501
- js_ffi_function_t *ffi;
502
- err = js_ffi_create_function(bare_buffer_compare_fast, function_info, &ffi);
503
- assert(err == 0);
504
-
505
- V("compare", bare_buffer_compare, ffi);
506
- }
507
-
508
- V("tag", bare_buffer_tag, NULL)
509
- V("isTagged", bare_buffer_is_tagged, NULL)
617
+ V("alloc", bare_buffer_alloc, NULL, NULL);
618
+
619
+ V("allocUnsafe", bare_buffer_alloc_unsafe, NULL, NULL);
620
+
621
+ V(
622
+ "byteLengthUTF8",
623
+ bare_buffer_byte_length_utf8,
624
+ &((js_callback_signature_t) {
625
+ .version = 0,
626
+ .result = js_uint32,
627
+ .args_len = 2,
628
+ .args = (int[]) {
629
+ js_object,
630
+ js_string,
631
+ }
632
+ }),
633
+ bare_buffer_typed_byte_length_utf8
634
+ );
635
+
636
+ V("toStringUTF8", bare_buffer_to_string_utf8, NULL, NULL);
637
+
638
+ V(
639
+ "writeUTF8",
640
+ bare_buffer_write_utf8,
641
+ &((js_callback_signature_t) {
642
+ .version = 0,
643
+ .result = js_uint32,
644
+ .args_len = 3,
645
+ .args = (int[]) {
646
+ js_object,
647
+ js_object,
648
+ js_string,
649
+ }
650
+ }),
651
+ bare_buffer_typed_write_utf8
652
+ );
653
+
654
+ V("toStringUTF16LE", bare_buffer_to_string_utf16le, NULL, NULL);
655
+
656
+ V(
657
+ "writeUTF16LE",
658
+ bare_buffer_write_utf16le,
659
+ &((js_callback_signature_t) {
660
+ .version = 0,
661
+ .result = js_uint32,
662
+ .args_len = 3,
663
+ .args = (int[]) {
664
+ js_object,
665
+ js_object,
666
+ js_string,
667
+ }
668
+ }),
669
+ bare_buffer_typed_write_utf16le
670
+ );
671
+
672
+ V("toStringBase64", bare_buffer_to_string_base64, NULL, NULL);
673
+
674
+ V(
675
+ "writeBase64",
676
+ bare_buffer_write_base64,
677
+ &((js_callback_signature_t) {
678
+ .version = 0,
679
+ .result = js_uint32,
680
+ .args_len = 3,
681
+ .args = (int[]) {
682
+ js_object,
683
+ js_object,
684
+ js_string,
685
+ }
686
+ }),
687
+ bare_buffer_typed_write_base64
688
+ );
689
+
690
+ V("toStringHex", bare_buffer_to_string_hex, NULL, NULL);
691
+
692
+ V(
693
+ "writeHex",
694
+ bare_buffer_write_hex,
695
+ &((js_callback_signature_t) {
696
+ .version = 0,
697
+ .result = js_uint32,
698
+ .args_len = 3,
699
+ .args = (int[]) {
700
+ js_object,
701
+ js_object,
702
+ js_string,
703
+ }
704
+ }),
705
+ bare_buffer_typed_write_hex
706
+ );
707
+
708
+ V(
709
+ "compare",
710
+ bare_buffer_compare,
711
+ &((js_callback_signature_t) {
712
+ .version = 0,
713
+ .result = js_int32,
714
+ .args_len = 3,
715
+ .args = (int[]) {
716
+ js_object,
717
+ js_object,
718
+ js_object,
719
+ }
720
+ }),
721
+ bare_buffer_typed_compare
722
+ );
723
+
724
+ V("tag", bare_buffer_tag, NULL, NULL);
725
+
726
+ V("isTagged", bare_buffer_is_tagged, NULL, NULL);
510
727
  #undef V
511
728
 
512
729
  return exports;
package/index.d.ts CHANGED
@@ -10,10 +10,6 @@ type BufferEncoding =
10
10
  | 'utf8'
11
11
 
12
12
  declare class Buffer extends Uint8Array {
13
- static Buffer: Buffer
14
-
15
- static poolSize: number
16
-
17
13
  compare(
18
14
  target: Buffer,
19
15
  targetStart?: number,
@@ -140,6 +136,10 @@ declare class Buffer extends Uint8Array {
140
136
  }
141
137
 
142
138
  declare namespace Buffer {
139
+ export { Buffer, BufferEncoding }
140
+
141
+ export let poolSize: number
142
+
143
143
  export function isBuffer(value: unknown): value is Buffer
144
144
 
145
145
  export function isEncoding(encoding: string): encoding is BufferEncoding
package/index.js CHANGED
@@ -21,6 +21,44 @@ module.exports = exports = class Buffer extends Uint8Array {
21
21
  poolSize = Math.max(0, value)
22
22
  }
23
23
 
24
+ constructor(arrayBuffer, offset, length, opts = {}) {
25
+ if (typeof arrayBuffer === 'number') {
26
+ opts = offset || {}
27
+
28
+ const { uninitialized = false } = opts
29
+
30
+ offset = 0
31
+ length = arrayBuffer
32
+
33
+ if (length > constants.MAX_LENGTH) {
34
+ throw new RangeError(
35
+ `Buffer length must be at most ${constants.MAX_LENGTH}`
36
+ )
37
+ }
38
+
39
+ arrayBuffer = uninitialized
40
+ ? binding.allocUnsafe(length)
41
+ : binding.alloc(length)
42
+ } else {
43
+ if (length > constants.MAX_LENGTH) {
44
+ throw new RangeError(
45
+ `Buffer length must be at most ${constants.MAX_LENGTH}`
46
+ )
47
+ }
48
+
49
+ if (typeof offset === 'object' && offset !== null) {
50
+ opts = offset
51
+ offset = 0
52
+ length = arrayBuffer.byteLength
53
+ } else if (typeof length === 'length' && length !== null) {
54
+ opts = length
55
+ length = arrayBuffer.byteLength - offset
56
+ }
57
+ }
58
+
59
+ super(arrayBuffer, offset, length)
60
+ }
61
+
24
62
  [Symbol.species]() {
25
63
  return Buffer
26
64
  }
@@ -534,12 +572,7 @@ exports.alloc = function alloc(size, fill, encoding) {
534
572
  }
535
573
 
536
574
  exports.allocUnsafe = function allocUnsafe(size) {
537
- binding.setZeroFillEnabled(0)
538
- try {
539
- return new Buffer(size)
540
- } finally {
541
- binding.setZeroFillEnabled(1)
542
- }
575
+ return new Buffer(size, { uninitialized: true })
543
576
  }
544
577
 
545
578
  exports.allocUnsafeSlow = function allocUnsafeSlow(size) {
package/lib/constants.js CHANGED
@@ -1,4 +1,4 @@
1
1
  module.exports = {
2
- MAX_LENGTH: 2 ** 32, // 4 GiB
2
+ MAX_LENGTH: 2 ** 32 - 1, // 4 GiB
3
3
  MAX_STRING_LENGTH: 2 ** 28 - 16 // ~512 MiB, lowest common limit
4
4
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bare-buffer",
3
- "version": "2.7.1",
3
+ "version": "3.0.0",
4
4
  "description": "Native buffers for JavaScript",
5
5
  "exports": {
6
6
  ".": {
@@ -23,7 +23,7 @@
23
23
  ],
24
24
  "addon": true,
25
25
  "scripts": {
26
- "test": "prettier . --check && bare test/all.js"
26
+ "test": "prettier . --check && bare test.js"
27
27
  },
28
28
  "repository": {
29
29
  "type": "git",
@@ -35,6 +35,9 @@
35
35
  "url": "https://github.com/holepunchto/bare-buffer/issues"
36
36
  },
37
37
  "homepage": "https://github.com/holepunchto/bare-buffer#readme",
38
+ "engines": {
39
+ "bare": ">=1.13.0"
40
+ },
38
41
  "devDependencies": {
39
42
  "brittle": "^3.1.1",
40
43
  "cmake-bare": "^1.1.6",