bare-buffer 3.1.4 → 3.3.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
@@ -6,7 +6,7 @@ find_package(cmake-fetch REQUIRED PATHS node_modules/cmake-fetch)
6
6
  project(bare_buffer C)
7
7
 
8
8
  fetch_package("github:holepunchto/libutf#9509b28")
9
- fetch_package("github:holepunchto/libbase64#cded073")
9
+ fetch_package("github:holepunchto/libbase64#86afd29")
10
10
  fetch_package("github:holepunchto/libhex#1dfad95")
11
11
 
12
12
  add_bare_module(bare_buffer)
package/binding.c CHANGED
@@ -21,7 +21,7 @@ bare_buffer__memcmp(void *a, size_t a_len, void *b, size_t b_len) {
21
21
  }
22
22
 
23
23
  static void
24
- bare_buffer__on_free_string(js_env_t *env, void *data, void *finalize_hint) {
24
+ bare_buffer__on_finalize_string(js_env_t *env, void *data, void *finalize_hint) {
25
25
  free(data);
26
26
  }
27
27
 
@@ -37,8 +37,8 @@ bare_buffer_alloc(js_env_t *env, js_callback_info_t *info) {
37
37
 
38
38
  assert(argc == 1);
39
39
 
40
- uint32_t len;
41
- err = js_get_value_uint32(env, argv[0], &len);
40
+ int64_t len;
41
+ err = js_get_value_int64(env, argv[0], &len);
42
42
  assert(err == 0);
43
43
 
44
44
  js_value_t *result;
@@ -60,8 +60,8 @@ bare_buffer_alloc_unsafe(js_env_t *env, js_callback_info_t *info) {
60
60
 
61
61
  assert(argc == 1);
62
62
 
63
- uint32_t len;
64
- err = js_get_value_uint32(env, argv[0], &len);
63
+ int64_t len;
64
+ err = js_get_value_int64(env, argv[0], &len);
65
65
  assert(err == 0);
66
66
 
67
67
  js_value_t *result;
@@ -71,7 +71,7 @@ bare_buffer_alloc_unsafe(js_env_t *env, js_callback_info_t *info) {
71
71
  return result;
72
72
  }
73
73
 
74
- static uint32_t
74
+ static int64_t
75
75
  bare_buffer_typed_byte_length_utf8(js_value_t *receiver, js_value_t *str, js_typed_callback_info_t *info) {
76
76
  int err;
77
77
 
@@ -83,7 +83,7 @@ bare_buffer_typed_byte_length_utf8(js_value_t *receiver, js_value_t *str, js_typ
83
83
  err = js_get_value_string_utf8(env, str, NULL, 0, &str_len);
84
84
  assert(err == 0);
85
85
 
86
- return (uint32_t) str_len;
86
+ return str_len;
87
87
  }
88
88
 
89
89
  static js_value_t *
@@ -103,7 +103,7 @@ bare_buffer_byte_length_utf8(js_env_t *env, js_callback_info_t *info) {
103
103
  assert(err == 0);
104
104
 
105
105
  js_value_t *result;
106
- err = js_create_uint32(env, (uint32_t) str_len, &result);
106
+ err = js_create_int64(env, str_len, &result);
107
107
  assert(err == 0);
108
108
 
109
109
  return result;
@@ -113,76 +113,89 @@ static js_value_t *
113
113
  bare_buffer_to_string_utf8(js_env_t *env, js_callback_info_t *info) {
114
114
  int err;
115
115
 
116
- size_t argc = 1;
117
- js_value_t *argv[1];
116
+ size_t argc = 3;
117
+ js_value_t *argv[3];
118
118
 
119
119
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
120
120
  assert(err == 0);
121
121
 
122
- assert(argc == 1);
122
+ assert(argc == 3);
123
123
 
124
124
  utf8_t *buf;
125
- size_t buf_len;
126
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &buf, &buf_len, NULL, NULL);
125
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &buf, NULL);
126
+ assert(err == 0);
127
+
128
+ int64_t offset;
129
+ err = js_get_value_int64(env, argv[1], &offset);
130
+ assert(err == 0);
131
+
132
+ int64_t len;
133
+ err = js_get_value_int64(env, argv[2], &len);
127
134
  assert(err == 0);
128
135
 
129
136
  js_value_t *result;
130
- err = js_create_string_utf8(env, buf, buf_len, &result);
137
+ err = js_create_string_utf8(env, &buf[offset], len, &result);
131
138
  assert(err == 0);
132
139
 
133
140
  return result;
134
141
  }
135
142
 
136
- static uint32_t
137
- bare_buffer_typed_write_utf8(js_value_t *receiver, js_value_t *typedarray, js_value_t *string, js_typed_callback_info_t *info) {
143
+ static int64_t
144
+ bare_buffer_typed_write_utf8(
145
+ js_value_t *receiver,
146
+ js_value_t *handle,
147
+ int64_t offset,
148
+ int64_t len,
149
+ js_value_t *string,
150
+ js_typed_callback_info_t *info
151
+ ) {
138
152
  int err;
139
153
 
140
154
  js_env_t *env;
141
155
  err = js_get_typed_callback_info(info, &env, NULL);
142
156
  assert(err == 0);
143
157
 
144
- js_handle_scope_t *scope;
145
- err = js_open_handle_scope(env, &scope);
146
- assert(err == 0);
147
-
148
- void *buf;
149
- size_t buf_len;
150
- err = js_get_typedarray_info(env, typedarray, NULL, &buf, &buf_len, NULL, NULL);
158
+ utf8_t *buf;
159
+ err = js_get_arraybuffer_info(env, handle, (void **) &buf, NULL);
151
160
  assert(err == 0);
152
161
 
153
162
  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_close_handle_scope(env, scope);
163
+ err = js_get_value_string_utf8(env, string, &buf[offset], len, &str_len);
158
164
  assert(err == 0);
159
165
 
160
- return (uint32_t) str_len;
166
+ return str_len;
161
167
  }
162
168
 
163
169
  static js_value_t *
164
170
  bare_buffer_write_utf8(js_env_t *env, js_callback_info_t *info) {
165
171
  int err;
166
172
 
167
- size_t argc = 2;
168
- js_value_t *argv[2];
173
+ size_t argc = 4;
174
+ js_value_t *argv[4];
169
175
 
170
176
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
171
177
  assert(err == 0);
172
178
 
173
- assert(argc == 2);
179
+ assert(argc == 4);
174
180
 
175
- void *buf;
176
- size_t buf_len;
177
- err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
181
+ utf8_t *buf;
182
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &buf, NULL);
183
+ assert(err == 0);
184
+
185
+ int64_t offset;
186
+ err = js_get_value_int64(env, argv[1], &offset);
187
+ assert(err == 0);
188
+
189
+ int64_t len;
190
+ err = js_get_value_int64(env, argv[2], &len);
178
191
  assert(err == 0);
179
192
 
180
193
  size_t str_len;
181
- err = js_get_value_string_utf8(env, argv[1], buf, buf_len, &str_len);
194
+ err = js_get_value_string_utf8(env, argv[3], &buf[offset], len, &str_len);
182
195
  assert(err == 0);
183
196
 
184
197
  js_value_t *result;
185
- err = js_create_uint32(env, (uint32_t) str_len, &result);
198
+ err = js_create_int64(env, str_len, &result);
186
199
  assert(err == 0);
187
200
 
188
201
  return result;
@@ -192,86 +205,102 @@ static js_value_t *
192
205
  bare_buffer_to_string_utf16le(js_env_t *env, js_callback_info_t *info) {
193
206
  int err;
194
207
 
195
- size_t argc = 1;
196
- js_value_t *argv[1];
208
+ size_t argc = 3;
209
+ js_value_t *argv[3];
197
210
 
198
211
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
199
212
  assert(err == 0);
200
213
 
201
- assert(argc == 1);
214
+ assert(argc == 3);
202
215
 
203
216
  utf16_t *buf;
204
- size_t buf_len;
205
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &buf, &buf_len, NULL, NULL);
217
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &buf, NULL);
218
+ assert(err == 0);
219
+
220
+ int64_t offset;
221
+ err = js_get_value_int64(env, argv[1], &offset);
206
222
  assert(err == 0);
207
223
 
208
- buf_len /= sizeof(utf16_t);
224
+ int64_t len;
225
+ err = js_get_value_int64(env, argv[2], &len);
226
+ assert(err == 0);
227
+
228
+ offset /= sizeof(utf16_t);
229
+ len /= sizeof(utf16_t);
209
230
 
210
231
  js_value_t *result;
211
- err = js_create_string_utf16le(env, buf, buf_len, &result);
232
+ err = js_create_string_utf16le(env, &buf[offset], len, &result);
212
233
  assert(err == 0);
213
234
 
214
235
  return result;
215
236
  }
216
237
 
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) {
238
+ static int64_t
239
+ bare_buffer_typed_write_utf16le(
240
+ js_value_t *receiver,
241
+ js_value_t *handle,
242
+ int64_t offset,
243
+ int64_t len,
244
+ js_value_t *string,
245
+ js_typed_callback_info_t *info
246
+ ) {
219
247
  int err;
220
248
 
221
249
  js_env_t *env;
222
250
  err = js_get_typed_callback_info(info, &env, NULL);
223
251
  assert(err == 0);
224
252
 
225
- js_handle_scope_t *scope;
226
- err = js_open_handle_scope(env, &scope);
227
- assert(err == 0);
228
-
229
- void *buf;
230
- size_t buf_len;
231
- err = js_get_typedarray_info(env, typedarray, NULL, &buf, &buf_len, NULL, NULL);
253
+ utf16_t *buf;
254
+ err = js_get_arraybuffer_info(env, handle, (void **) &buf, NULL);
232
255
  assert(err == 0);
233
256
 
234
- buf_len /= sizeof(utf16_t);
257
+ offset /= sizeof(utf16_t);
258
+ len /= sizeof(utf16_t);
235
259
 
236
260
  size_t str_len;
237
- err = js_get_value_string_utf16le(env, string, buf, buf_len, &str_len);
261
+ err = js_get_value_string_utf16le(env, string, &buf[offset], len, &str_len);
238
262
  assert(err == 0);
239
263
 
240
264
  str_len *= sizeof(utf16_t);
241
265
 
242
- err = js_close_handle_scope(env, scope);
243
- assert(err == 0);
244
-
245
- return (uint32_t) str_len;
266
+ return str_len;
246
267
  }
247
268
 
248
269
  static js_value_t *
249
270
  bare_buffer_write_utf16le(js_env_t *env, js_callback_info_t *info) {
250
271
  int err;
251
272
 
252
- size_t argc = 2;
253
- js_value_t *argv[2];
273
+ size_t argc = 4;
274
+ js_value_t *argv[4];
254
275
 
255
276
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
256
277
  assert(err == 0);
257
278
 
258
- assert(argc == 2);
279
+ assert(argc == 4);
280
+
281
+ utf16_t *buf;
282
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &buf, NULL);
283
+ assert(err == 0);
259
284
 
260
- void *buf;
261
- size_t buf_len;
262
- err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
285
+ int64_t offset;
286
+ err = js_get_value_int64(env, argv[1], &offset);
263
287
  assert(err == 0);
264
288
 
265
- buf_len /= sizeof(utf16_t);
289
+ int64_t len;
290
+ err = js_get_value_int64(env, argv[2], &len);
291
+ assert(err == 0);
292
+
293
+ offset /= sizeof(utf16_t);
294
+ len /= sizeof(utf16_t);
266
295
 
267
296
  size_t str_len;
268
- err = js_get_value_string_utf16le(env, argv[1], buf, buf_len, &str_len);
297
+ err = js_get_value_string_utf16le(env, argv[3], &buf[offset], len, &str_len);
269
298
  assert(err == 0);
270
299
 
271
300
  str_len *= sizeof(utf16_t);
272
301
 
273
302
  js_value_t *result;
274
- err = js_create_uint32(env, (uint32_t) str_len, &result);
303
+ err = js_create_int64(env, str_len, &result);
275
304
  assert(err == 0);
276
305
 
277
306
  return result;
@@ -281,128 +310,189 @@ static js_value_t *
281
310
  bare_buffer_to_string_latin1(js_env_t *env, js_callback_info_t *info) {
282
311
  int err;
283
312
 
284
- size_t argc = 1;
285
- js_value_t *argv[1];
313
+ size_t argc = 3;
314
+ js_value_t *argv[3];
286
315
 
287
316
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
288
317
  assert(err == 0);
289
318
 
290
- assert(argc == 1);
319
+ assert(argc == 3);
291
320
 
292
321
  latin1_t *buf;
293
- size_t buf_len;
294
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &buf, &buf_len, NULL, NULL);
322
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &buf, NULL);
323
+ assert(err == 0);
324
+
325
+ int64_t offset;
326
+ err = js_get_value_int64(env, argv[1], &offset);
327
+ assert(err == 0);
328
+
329
+ int64_t len;
330
+ err = js_get_value_int64(env, argv[2], &len);
295
331
  assert(err == 0);
296
332
 
297
333
  js_value_t *result;
298
- err = js_create_string_latin1(env, buf, buf_len, &result);
334
+ err = js_create_string_latin1(env, &buf[offset], len, &result);
299
335
  assert(err == 0);
300
336
 
301
337
  return result;
302
338
  }
303
339
 
304
- static uint32_t
305
- bare_buffer_typed_write_latin1(js_value_t *receiver, js_value_t *typedarray, js_value_t *string, js_typed_callback_info_t *info) {
340
+ static int64_t
341
+ bare_buffer_typed_write_latin1(
342
+ js_value_t *receiver,
343
+ js_value_t *handle,
344
+ int64_t offset,
345
+ int64_t len,
346
+ js_value_t *string,
347
+ js_typed_callback_info_t *info
348
+ ) {
306
349
  int err;
307
350
 
308
351
  js_env_t *env;
309
352
  err = js_get_typed_callback_info(info, &env, NULL);
310
353
  assert(err == 0);
311
354
 
312
- js_handle_scope_t *scope;
313
- err = js_open_handle_scope(env, &scope);
355
+ latin1_t *buf;
356
+ err = js_get_arraybuffer_info(env, handle, (void **) &buf, NULL);
357
+ assert(err == 0);
358
+
359
+ size_t str_len;
360
+ err = js_get_value_string_latin1(env, string, &buf[offset], len, &str_len);
361
+ assert(err == 0);
362
+
363
+ return str_len;
364
+ }
365
+
366
+ static js_value_t *
367
+ bare_buffer_write_latin1(js_env_t *env, js_callback_info_t *info) {
368
+ int err;
369
+
370
+ size_t argc = 4;
371
+ js_value_t *argv[4];
372
+
373
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
374
+ assert(err == 0);
375
+
376
+ assert(argc == 4);
377
+
378
+ latin1_t *buf;
379
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &buf, NULL);
380
+ assert(err == 0);
381
+
382
+ int64_t offset;
383
+ err = js_get_value_int64(env, argv[1], &offset);
314
384
  assert(err == 0);
315
385
 
316
- void *buf;
317
- size_t buf_len;
318
- err = js_get_typedarray_info(env, typedarray, NULL, &buf, &buf_len, NULL, NULL);
386
+ int64_t len;
387
+ err = js_get_value_int64(env, argv[2], &len);
319
388
  assert(err == 0);
320
389
 
321
390
  size_t str_len;
322
- err = js_get_value_string_latin1(env, string, buf, buf_len, &str_len);
391
+ err = js_get_value_string_latin1(env, argv[3], &buf[offset], len, &str_len);
323
392
  assert(err == 0);
324
393
 
325
- err = js_close_handle_scope(env, scope);
394
+ js_value_t *result;
395
+ err = js_create_int64(env, str_len, &result);
326
396
  assert(err == 0);
327
397
 
328
- return (uint32_t) str_len;
398
+ return result;
329
399
  }
330
400
 
331
401
  static js_value_t *
332
- bare_buffer_write_latin1(js_env_t *env, js_callback_info_t *info) {
402
+ bare_buffer_to_string_base64(js_env_t *env, js_callback_info_t *info) {
333
403
  int err;
334
404
 
335
- size_t argc = 2;
336
- js_value_t *argv[2];
405
+ size_t argc = 3;
406
+ js_value_t *argv[3];
337
407
 
338
408
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
339
409
  assert(err == 0);
340
410
 
341
- assert(argc == 2);
411
+ assert(argc == 3);
412
+
413
+ utf8_t *buf;
414
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &buf, NULL);
415
+ assert(err == 0);
416
+
417
+ int64_t offset;
418
+ err = js_get_value_int64(env, argv[1], &offset);
419
+ assert(err == 0);
342
420
 
343
- void *buf;
344
- size_t buf_len;
345
- err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
421
+ int64_t len;
422
+ err = js_get_value_int64(env, argv[2], &len);
346
423
  assert(err == 0);
347
424
 
348
425
  size_t str_len;
349
- err = js_get_value_string_latin1(env, argv[1], buf, buf_len, &str_len);
426
+ err = base64_encode_utf8(&buf[offset], len, NULL, &str_len);
427
+ assert(err == 0);
428
+
429
+ utf8_t *str = malloc(str_len);
430
+ err = base64_encode_utf8(&buf[offset], len, str, &str_len);
350
431
  assert(err == 0);
351
432
 
352
433
  js_value_t *result;
353
- err = js_create_uint32(env, (uint32_t) str_len, &result);
434
+ err = js_create_external_string_latin1(env, str, str_len, bare_buffer__on_finalize_string, NULL, &result, NULL);
354
435
  assert(err == 0);
355
436
 
356
437
  return result;
357
438
  }
358
439
 
359
440
  static js_value_t *
360
- bare_buffer_to_string_base64(js_env_t *env, js_callback_info_t *info) {
441
+ bare_buffer_to_string_base64url(js_env_t *env, js_callback_info_t *info) {
361
442
  int err;
362
443
 
363
- size_t argc = 1;
364
- js_value_t *argv[1];
444
+ size_t argc = 3;
445
+ js_value_t *argv[3];
365
446
 
366
447
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
367
448
  assert(err == 0);
368
449
 
369
- assert(argc == 1);
450
+ assert(argc == 3);
451
+
452
+ utf8_t *buf;
453
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &buf, NULL);
454
+ assert(err == 0);
455
+
456
+ int64_t offset;
457
+ err = js_get_value_int64(env, argv[1], &offset);
458
+ assert(err == 0);
370
459
 
371
- void *buf;
372
- size_t buf_len;
373
- err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
460
+ int64_t len;
461
+ err = js_get_value_int64(env, argv[2], &len);
374
462
  assert(err == 0);
375
463
 
376
464
  size_t str_len;
377
- err = base64_encode_utf8(buf, buf_len, NULL, &str_len);
465
+ err = base64url_encode_utf8(&buf[offset], len, NULL, &str_len);
378
466
  assert(err == 0);
379
467
 
380
468
  utf8_t *str = malloc(str_len);
381
- err = base64_encode_utf8(buf, buf_len, str, &str_len);
469
+ err = base64url_encode_utf8(&buf[offset], len, str, &str_len);
382
470
  assert(err == 0);
383
471
 
384
472
  js_value_t *result;
385
- err = js_create_external_string_latin1(env, str, str_len, bare_buffer__on_free_string, NULL, &result, NULL);
473
+ err = js_create_external_string_latin1(env, str, str_len, bare_buffer__on_finalize_string, NULL, &result, NULL);
386
474
  assert(err == 0);
387
475
 
388
476
  return result;
389
477
  }
390
478
 
391
- static uint32_t
392
- bare_buffer_typed_write_base64(js_value_t *receiver, js_value_t *typedarray, js_value_t *string, js_typed_callback_info_t *info) {
479
+ static int64_t
480
+ bare_buffer_typed_write_base64(
481
+ js_value_t *receiver,
482
+ js_value_t *handle,
483
+ int64_t offset,
484
+ int64_t len,
485
+ js_value_t *string,
486
+ js_typed_callback_info_t *info
487
+ ) {
393
488
  int err;
394
489
 
395
490
  js_env_t *env;
396
491
  err = js_get_typed_callback_info(info, &env, NULL);
397
492
  assert(err == 0);
398
493
 
399
- js_handle_scope_t *scope;
400
- err = js_open_handle_scope(env, &scope);
401
- assert(err == 0);
402
-
403
- void *buf;
404
- size_t buf_len;
405
- err = js_get_typedarray_info(env, typedarray, NULL, &buf, &buf_len, NULL, NULL);
494
+ utf8_t *buf;
495
+ err = js_get_arraybuffer_info(env, handle, (void **) &buf, NULL);
406
496
  assert(err == 0);
407
497
 
408
498
  js_string_encoding_t encoding;
@@ -413,38 +503,52 @@ bare_buffer_typed_write_base64(js_value_t *receiver, js_value_t *typedarray, js_
413
503
  err = js_get_string_view(env, string, &encoding, &str, &str_len, &str_view);
414
504
  assert(err == 0);
415
505
 
506
+ size_t written = len;
507
+
416
508
  if (encoding == js_utf16le) {
417
- err = base64_decode_utf16le(str, str_len, buf, &buf_len);
418
- assert(err == 0);
509
+ err = base64_decode_utf16le(str, str_len, &buf[offset], &written);
419
510
  } else {
420
- err = base64_decode_utf8(str, str_len, buf, &buf_len);
511
+ err = base64_decode_utf8(str, str_len, &buf[offset], &written);
512
+ }
513
+
514
+ if (err != 0) {
515
+ err = js_throw_error(env, NULL, "Invalid input");
516
+ assert(err == 0);
517
+
518
+ err = js_release_string_view(env, str_view);
421
519
  assert(err == 0);
520
+
521
+ return 0;
422
522
  }
423
523
 
424
524
  err = js_release_string_view(env, str_view);
425
525
  assert(err == 0);
426
526
 
427
- err = js_close_handle_scope(env, scope);
428
- assert(err == 0);
429
-
430
- return buf_len;
527
+ return written;
431
528
  }
432
529
 
433
530
  static js_value_t *
434
531
  bare_buffer_write_base64(js_env_t *env, js_callback_info_t *info) {
435
532
  int err;
436
533
 
437
- size_t argc = 2;
438
- js_value_t *argv[2];
534
+ size_t argc = 4;
535
+ js_value_t *argv[4];
439
536
 
440
537
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
441
538
  assert(err == 0);
442
539
 
443
- assert(argc == 2);
540
+ assert(argc == 4);
541
+
542
+ utf8_t *buf;
543
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &buf, NULL);
544
+ assert(err == 0);
545
+
546
+ int64_t offset;
547
+ err = js_get_value_int64(env, argv[1], &offset);
548
+ assert(err == 0);
444
549
 
445
- void *buf;
446
- size_t buf_len;
447
- err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
550
+ int64_t len;
551
+ err = js_get_value_int64(env, argv[2], &len);
448
552
  assert(err == 0);
449
553
 
450
554
  js_string_encoding_t encoding;
@@ -452,22 +556,32 @@ bare_buffer_write_base64(js_env_t *env, js_callback_info_t *info) {
452
556
  size_t str_len;
453
557
 
454
558
  js_string_view_t *str_view;
455
- err = js_get_string_view(env, argv[1], &encoding, &str, &str_len, &str_view);
559
+ err = js_get_string_view(env, argv[3], &encoding, &str, &str_len, &str_view);
456
560
  assert(err == 0);
457
561
 
562
+ size_t written = len;
563
+
458
564
  if (encoding == js_utf16le) {
459
- err = base64_decode_utf16le(str, str_len, buf, &buf_len);
460
- assert(err == 0);
565
+ err = base64_decode_utf16le(str, str_len, &buf[offset], &written);
461
566
  } else {
462
- err = base64_decode_utf8(str, str_len, buf, &buf_len);
567
+ err = base64_decode_utf8(str, str_len, &buf[offset], &written);
568
+ }
569
+
570
+ if (err != 0) {
571
+ err = js_throw_error(env, NULL, "Invalid input");
463
572
  assert(err == 0);
573
+
574
+ err = js_release_string_view(env, str_view);
575
+ assert(err == 0);
576
+
577
+ return NULL;
464
578
  }
465
579
 
466
580
  err = js_release_string_view(env, str_view);
467
581
  assert(err == 0);
468
582
 
469
583
  js_value_t *result;
470
- err = js_create_uint32(env, (uint32_t) buf_len, &result);
584
+ err = js_create_int64(env, written, &result);
471
585
  assert(err == 0);
472
586
 
473
587
  return result;
@@ -477,49 +591,58 @@ static js_value_t *
477
591
  bare_buffer_to_string_hex(js_env_t *env, js_callback_info_t *info) {
478
592
  int err;
479
593
 
480
- size_t argc = 1;
481
- js_value_t *argv[1];
594
+ size_t argc = 3;
595
+ js_value_t *argv[3];
482
596
 
483
597
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
484
598
  assert(err == 0);
485
599
 
486
- assert(argc == 1);
600
+ assert(argc == 3);
601
+
602
+ utf8_t *buf;
603
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &buf, NULL);
604
+ assert(err == 0);
605
+
606
+ int64_t offset;
607
+ err = js_get_value_int64(env, argv[1], &offset);
608
+ assert(err == 0);
487
609
 
488
- void *buf;
489
- size_t buf_len;
490
- err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
610
+ int64_t len;
611
+ err = js_get_value_int64(env, argv[2], &len);
491
612
  assert(err == 0);
492
613
 
493
614
  size_t str_len;
494
- err = hex_encode_utf8(buf, buf_len, NULL, &str_len);
615
+ err = hex_encode_utf8(&buf[offset], len, NULL, &str_len);
495
616
  assert(err == 0);
496
617
 
497
618
  utf8_t *str = malloc(str_len);
498
- err = hex_encode_utf8(buf, buf_len, str, &str_len);
619
+ err = hex_encode_utf8(&buf[offset], len, str, &str_len);
499
620
  assert(err == 0);
500
621
 
501
622
  js_value_t *result;
502
- err = js_create_external_string_latin1(env, str, str_len, bare_buffer__on_free_string, NULL, &result, NULL);
623
+ err = js_create_external_string_latin1(env, str, str_len, bare_buffer__on_finalize_string, NULL, &result, NULL);
503
624
  assert(err == 0);
504
625
 
505
626
  return result;
506
627
  }
507
628
 
508
- static uint32_t
509
- bare_buffer_typed_write_hex(js_value_t *receiver, js_value_t *typedarray, js_value_t *string, js_typed_callback_info_t *info) {
629
+ static int64_t
630
+ bare_buffer_typed_write_hex(
631
+ js_value_t *receiver,
632
+ js_value_t *handle,
633
+ int64_t offset,
634
+ int64_t len,
635
+ js_value_t *string,
636
+ js_typed_callback_info_t *info
637
+ ) {
510
638
  int err;
511
639
 
512
640
  js_env_t *env;
513
641
  err = js_get_typed_callback_info(info, &env, NULL);
514
642
  assert(err == 0);
515
643
 
516
- js_handle_scope_t *scope;
517
- err = js_open_handle_scope(env, &scope);
518
- assert(err == 0);
519
-
520
- void *buf;
521
- size_t buf_len;
522
- err = js_get_typedarray_info(env, typedarray, NULL, &buf, &buf_len, NULL, NULL);
644
+ utf8_t *buf;
645
+ err = js_get_arraybuffer_info(env, handle, (void **) &buf, NULL);
523
646
  assert(err == 0);
524
647
 
525
648
  js_string_encoding_t encoding;
@@ -530,38 +653,52 @@ bare_buffer_typed_write_hex(js_value_t *receiver, js_value_t *typedarray, js_val
530
653
  err = js_get_string_view(env, string, &encoding, &str, &str_len, &str_view);
531
654
  assert(err == 0);
532
655
 
656
+ size_t written = len;
657
+
533
658
  if (encoding == js_utf16le) {
534
- err = hex_decode_utf16le(str, str_len, buf, &buf_len);
535
- assert(err == 0);
659
+ err = hex_decode_utf16le(str, str_len, &buf[offset], &written);
536
660
  } else {
537
- err = hex_decode_utf8(str, str_len, buf, &buf_len);
661
+ err = hex_decode_utf8(str, str_len, &buf[offset], &written);
662
+ }
663
+
664
+ if (err != 0) {
665
+ err = js_throw_error(env, NULL, "Invalid input");
538
666
  assert(err == 0);
667
+
668
+ err = js_release_string_view(env, str_view);
669
+ assert(err == 0);
670
+
671
+ return 0;
539
672
  }
540
673
 
541
674
  err = js_release_string_view(env, str_view);
542
675
  assert(err == 0);
543
676
 
544
- err = js_close_handle_scope(env, scope);
545
- assert(err == 0);
546
-
547
- return buf_len;
677
+ return written;
548
678
  }
549
679
 
550
680
  static js_value_t *
551
681
  bare_buffer_write_hex(js_env_t *env, js_callback_info_t *info) {
552
682
  int err;
553
683
 
554
- size_t argc = 2;
555
- js_value_t *argv[2];
684
+ size_t argc = 4;
685
+ js_value_t *argv[4];
556
686
 
557
687
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
558
688
  assert(err == 0);
559
689
 
560
- assert(argc == 2);
690
+ assert(argc == 4);
561
691
 
562
- void *buf;
563
- size_t buf_len;
564
- err = js_get_typedarray_info(env, argv[0], NULL, &buf, &buf_len, NULL, NULL);
692
+ utf8_t *buf;
693
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &buf, NULL);
694
+ assert(err == 0);
695
+
696
+ int64_t offset;
697
+ err = js_get_value_int64(env, argv[1], &offset);
698
+ assert(err == 0);
699
+
700
+ int64_t len;
701
+ err = js_get_value_int64(env, argv[2], &len);
565
702
  assert(err == 0);
566
703
 
567
704
  js_string_encoding_t encoding;
@@ -569,22 +706,32 @@ bare_buffer_write_hex(js_env_t *env, js_callback_info_t *info) {
569
706
  size_t str_len;
570
707
 
571
708
  js_string_view_t *str_view;
572
- err = js_get_string_view(env, argv[1], &encoding, &str, &str_len, &str_view);
709
+ err = js_get_string_view(env, argv[3], &encoding, &str, &str_len, &str_view);
573
710
  assert(err == 0);
574
711
 
712
+ size_t written = len;
713
+
575
714
  if (encoding == js_utf16le) {
576
- err = hex_decode_utf16le(str, str_len, buf, &buf_len);
577
- assert(err == 0);
715
+ err = hex_decode_utf16le(str, str_len, &buf[offset], &written);
578
716
  } else {
579
- err = hex_decode_utf8(str, str_len, buf, &buf_len);
717
+ err = hex_decode_utf8(str, str_len, &buf[offset], &written);
718
+ }
719
+
720
+ if (err != 0) {
721
+ err = js_throw_error(env, NULL, "Invalid input");
722
+ assert(err == 0);
723
+
724
+ err = js_release_string_view(env, str_view);
580
725
  assert(err == 0);
726
+
727
+ return NULL;
581
728
  }
582
729
 
583
730
  err = js_release_string_view(env, str_view);
584
731
  assert(err == 0);
585
732
 
586
733
  js_value_t *result;
587
- err = js_create_uint32(env, (uint32_t) buf_len, &result);
734
+ err = js_create_int64(env, written, &result);
588
735
  assert(err == 0);
589
736
 
590
737
  return result;
@@ -594,11 +741,11 @@ static int32_t
594
741
  bare_buffer_typed_compare(
595
742
  js_value_t *receiver,
596
743
  js_value_t *a_handle,
597
- uint32_t a_offset,
598
- uint32_t a_len,
744
+ int64_t a_offset,
745
+ int64_t a_len,
599
746
  js_value_t *b_handle,
600
- uint32_t b_offset,
601
- uint32_t b_len,
747
+ int64_t b_offset,
748
+ int64_t b_len,
602
749
  js_typed_callback_info_t *info
603
750
  ) {
604
751
  int err;
@@ -607,12 +754,12 @@ bare_buffer_typed_compare(
607
754
  err = js_get_typed_callback_info(info, &env, NULL);
608
755
  assert(err == 0);
609
756
 
610
- void *a;
611
- err = js_get_arraybuffer_info(env, a_handle, &a, NULL);
757
+ uint8_t *a;
758
+ err = js_get_arraybuffer_info(env, a_handle, (void **) &a, NULL);
612
759
  assert(err == 0);
613
760
 
614
- void *b;
615
- err = js_get_arraybuffer_info(env, b_handle, &b, NULL);
761
+ uint8_t *b;
762
+ err = js_get_arraybuffer_info(env, b_handle, (void **) &b, NULL);
616
763
  assert(err == 0);
617
764
 
618
765
  return bare_buffer__memcmp(&a[a_offset], a_len, &b[b_offset], b_len);
@@ -630,28 +777,28 @@ bare_buffer_compare(js_env_t *env, js_callback_info_t *info) {
630
777
 
631
778
  assert(argc == 6);
632
779
 
633
- void *a;
634
- err = js_get_arraybuffer_info(env, argv[0], &a, NULL);
780
+ uint8_t *a;
781
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &a, NULL);
635
782
  assert(err == 0);
636
783
 
637
- uint32_t a_offset;
638
- err = js_get_value_uint32(env, argv[1], &a_offset);
784
+ int64_t a_offset;
785
+ err = js_get_value_int64(env, argv[1], &a_offset);
639
786
  assert(err == 0);
640
787
 
641
- uint32_t a_len;
642
- err = js_get_value_uint32(env, argv[2], &a_len);
788
+ int64_t a_len;
789
+ err = js_get_value_int64(env, argv[2], &a_len);
643
790
  assert(err == 0);
644
791
 
645
- void *b;
646
- err = js_get_arraybuffer_info(env, argv[3], &b, NULL);
792
+ uint8_t *b;
793
+ err = js_get_arraybuffer_info(env, argv[3], (void **) &b, NULL);
647
794
  assert(err == 0);
648
795
 
649
- uint32_t b_offset;
650
- err = js_get_value_uint32(env, argv[4], &b_offset);
796
+ int64_t b_offset;
797
+ err = js_get_value_int64(env, argv[4], &b_offset);
651
798
  assert(err == 0);
652
799
 
653
- uint32_t b_len;
654
- err = js_get_value_uint32(env, argv[5], &b_len);
800
+ int64_t b_len;
801
+ err = js_get_value_int64(env, argv[5], &b_len);
655
802
  assert(err == 0);
656
803
 
657
804
  js_value_t *result;
@@ -665,6 +812,37 @@ static js_value_t *
665
812
  bare_buffer_exports(js_env_t *env, js_value_t *exports) {
666
813
  int err;
667
814
 
815
+ js_value_t *constants;
816
+ err = js_create_object(env, &constants);
817
+ assert(err == 0);
818
+
819
+ err = js_set_named_property(env, exports, "constants", constants);
820
+ assert(err == 0);
821
+
822
+ js_platform_t *platform;
823
+ err = js_get_env_platform(env, &platform);
824
+ assert(err == 0);
825
+
826
+ js_platform_limits_t limits = {
827
+ .version = 0,
828
+ };
829
+
830
+ err = js_get_platform_limits(platform, &limits);
831
+ assert(err == 0);
832
+
833
+ #define V(name, value) \
834
+ { \
835
+ js_value_t *val; \
836
+ err = js_create_int64(env, value, &val); \
837
+ assert(err == 0); \
838
+ err = js_set_named_property(env, constants, name, val); \
839
+ assert(err == 0); \
840
+ }
841
+
842
+ V("MAX_LENGTH", limits.arraybuffer_length);
843
+ V("MAX_STRING_LENGTH", limits.string_length);
844
+ #undef V
845
+
668
846
  #define V(name, untyped, signature, typed) \
669
847
  { \
670
848
  js_value_t *val; \
@@ -688,7 +866,7 @@ bare_buffer_exports(js_env_t *env, js_value_t *exports) {
688
866
  bare_buffer_byte_length_utf8,
689
867
  &((js_callback_signature_t) {
690
868
  .version = 0,
691
- .result = js_uint32,
869
+ .result = js_int64,
692
870
  .args_len = 2,
693
871
  .args = (int[]) {
694
872
  js_object,
@@ -705,11 +883,13 @@ bare_buffer_exports(js_env_t *env, js_value_t *exports) {
705
883
  bare_buffer_write_utf8,
706
884
  &((js_callback_signature_t) {
707
885
  .version = 0,
708
- .result = js_uint32,
709
- .args_len = 3,
886
+ .result = js_int64,
887
+ .args_len = 5,
710
888
  .args = (int[]) {
711
889
  js_object,
712
890
  js_object,
891
+ js_int64,
892
+ js_int64,
713
893
  js_string,
714
894
  }
715
895
  }),
@@ -723,7 +903,7 @@ bare_buffer_exports(js_env_t *env, js_value_t *exports) {
723
903
  bare_buffer_write_utf16le,
724
904
  &((js_callback_signature_t) {
725
905
  .version = 0,
726
- .result = js_uint32,
906
+ .result = js_int64,
727
907
  .args_len = 3,
728
908
  .args = (int[]) {
729
909
  js_object,
@@ -741,11 +921,13 @@ bare_buffer_exports(js_env_t *env, js_value_t *exports) {
741
921
  bare_buffer_write_latin1,
742
922
  &((js_callback_signature_t) {
743
923
  .version = 0,
744
- .result = js_uint32,
745
- .args_len = 3,
924
+ .result = js_int64,
925
+ .args_len = 5,
746
926
  .args = (int[]) {
747
927
  js_object,
748
928
  js_object,
929
+ js_int64,
930
+ js_int64,
749
931
  js_string,
750
932
  }
751
933
  }),
@@ -753,17 +935,20 @@ bare_buffer_exports(js_env_t *env, js_value_t *exports) {
753
935
  );
754
936
 
755
937
  V("toStringBase64", bare_buffer_to_string_base64, NULL, NULL);
938
+ V("toStringBase64URL", bare_buffer_to_string_base64url, NULL, NULL);
756
939
 
757
940
  V(
758
941
  "writeBase64",
759
942
  bare_buffer_write_base64,
760
943
  &((js_callback_signature_t) {
761
944
  .version = 0,
762
- .result = js_uint32,
763
- .args_len = 3,
945
+ .result = js_int64,
946
+ .args_len = 5,
764
947
  .args = (int[]) {
765
948
  js_object,
766
949
  js_object,
950
+ js_int64,
951
+ js_int64,
767
952
  js_string,
768
953
  }
769
954
  }),
@@ -777,11 +962,13 @@ bare_buffer_exports(js_env_t *env, js_value_t *exports) {
777
962
  bare_buffer_write_hex,
778
963
  &((js_callback_signature_t) {
779
964
  .version = 0,
780
- .result = js_uint32,
781
- .args_len = 3,
965
+ .result = js_int64,
966
+ .args_len = 5,
782
967
  .args = (int[]) {
783
968
  js_object,
784
969
  js_object,
970
+ js_int64,
971
+ js_int64,
785
972
  js_string,
786
973
  }
787
974
  }),
@@ -798,11 +985,11 @@ bare_buffer_exports(js_env_t *env, js_value_t *exports) {
798
985
  .args = (int[]) {
799
986
  js_object,
800
987
  js_object,
801
- js_uint32,
802
- js_uint32,
988
+ js_int64,
989
+ js_int64,
803
990
  js_object,
804
- js_uint32,
805
- js_uint32,
991
+ js_int64,
992
+ js_int64,
806
993
  }
807
994
  }),
808
995
  bare_buffer_typed_compare
package/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  const constants = require('./lib/constants')
2
2
  const ascii = require('./lib/ascii')
3
3
  const base64 = require('./lib/base64')
4
+ const base64url = require('./lib/base64url')
4
5
  const hex = require('./lib/hex')
5
6
  const utf8 = require('./lib/utf8')
6
7
  const utf16le = require('./lib/utf16le')
@@ -536,6 +537,7 @@ const codecs = Object.create(null)
536
537
 
537
538
  codecs.ascii = ascii
538
539
  codecs.base64 = base64
540
+ codecs.base64url = base64url
539
541
  codecs.hex = hex
540
542
  codecs.utf8 = codecs['utf-8'] = utf8
541
543
  codecs.utf16le = codecs.ucs2 = codecs['utf-16le'] = codecs['ucs-2'] = utf16le
@@ -548,7 +550,7 @@ function codecFor(encoding = 'utf8') {
548
550
 
549
551
  if (encoding in codecs) return codecs[encoding]
550
552
 
551
- throw new Error(`Unknown encoding: ${encoding}`)
553
+ throw new Error(`Unknown encoding '${encoding}'`)
552
554
  }
553
555
 
554
556
  const views = new WeakMap()
package/lib/base64.js CHANGED
@@ -9,6 +9,19 @@ exports.byteLength = function byteLength(string) {
9
9
  return (len * 3) >>> 2
10
10
  }
11
11
 
12
- exports.toString = binding.toStringBase64
12
+ exports.toString = function toString(buffer) {
13
+ return binding.toStringBase64(
14
+ buffer.buffer,
15
+ buffer.byteOffset,
16
+ buffer.byteLength
17
+ )
18
+ }
13
19
 
14
- exports.write = binding.writeBase64
20
+ exports.write = function write(buffer, string) {
21
+ return binding.writeBase64(
22
+ buffer.buffer,
23
+ buffer.byteOffset,
24
+ buffer.byteLength,
25
+ string
26
+ )
27
+ }
@@ -0,0 +1,27 @@
1
+ const binding = require('../binding')
2
+
3
+ exports.byteLength = function byteLength(string) {
4
+ let len = string.length
5
+
6
+ if (string.charCodeAt(len - 1) === 0x3d) len--
7
+ if (len > 1 && string.charCodeAt(len - 1) === 0x3d) len--
8
+
9
+ return (len * 3) >>> 2
10
+ }
11
+
12
+ exports.toString = function toString(buffer) {
13
+ return binding.toStringBase64URL(
14
+ buffer.buffer,
15
+ buffer.byteOffset,
16
+ buffer.byteLength
17
+ )
18
+ }
19
+
20
+ exports.write = function write(buffer, string) {
21
+ return binding.writeBase64(
22
+ buffer.buffer,
23
+ buffer.byteOffset,
24
+ buffer.byteLength,
25
+ string
26
+ )
27
+ }
package/lib/constants.js CHANGED
@@ -1,4 +1,3 @@
1
- module.exports = {
2
- MAX_LENGTH: 2 ** 32 - 1, // 4 GiB
3
- MAX_STRING_LENGTH: 2 ** 28 - 16 // ~512 MiB, lowest common limit
4
- }
1
+ const binding = require('../binding')
2
+
3
+ module.exports = binding.constants
package/lib/hex.js CHANGED
@@ -4,6 +4,19 @@ exports.byteLength = function byteLength(string) {
4
4
  return string.length >>> 1
5
5
  }
6
6
 
7
- exports.toString = binding.toStringHex
7
+ exports.toString = function toString(buffer) {
8
+ return binding.toStringHex(
9
+ buffer.buffer,
10
+ buffer.byteOffset,
11
+ buffer.byteLength
12
+ )
13
+ }
8
14
 
9
- exports.write = binding.writeHex
15
+ exports.write = function write(buffer, string) {
16
+ return binding.writeHex(
17
+ buffer.buffer,
18
+ buffer.byteOffset,
19
+ buffer.byteLength,
20
+ string
21
+ )
22
+ }
package/lib/latin1.js CHANGED
@@ -4,6 +4,19 @@ exports.byteLength = function byteLength(string) {
4
4
  return string.length
5
5
  }
6
6
 
7
- exports.toString = binding.toStringLatin1
7
+ exports.toString = function toString(buffer) {
8
+ return binding.toStringLatin1(
9
+ buffer.buffer,
10
+ buffer.byteOffset,
11
+ buffer.byteLength
12
+ )
13
+ }
8
14
 
9
- exports.write = binding.writeLatin1
15
+ exports.write = function write(buffer, string) {
16
+ return binding.writeLatin1(
17
+ buffer.buffer,
18
+ buffer.byteOffset,
19
+ buffer.byteLength,
20
+ string
21
+ )
22
+ }
package/lib/utf16le.js CHANGED
@@ -4,6 +4,19 @@ exports.byteLength = function byteLength(string) {
4
4
  return string.length * 2
5
5
  }
6
6
 
7
- exports.toString = binding.toStringUTF16LE
7
+ exports.toString = function toString(buffer) {
8
+ return binding.toStringUTF16LE(
9
+ buffer.buffer,
10
+ buffer.byteOffset,
11
+ buffer.byteLength
12
+ )
13
+ }
8
14
 
9
- exports.write = binding.writeUTF16LE
15
+ exports.write = function write(buffer, string) {
16
+ return binding.writeUTF16LE(
17
+ buffer.buffer,
18
+ buffer.byteOffset,
19
+ buffer.byteLength,
20
+ string
21
+ )
22
+ }
package/lib/utf8.js CHANGED
@@ -1,7 +1,22 @@
1
1
  const binding = require('../binding')
2
2
 
3
- exports.byteLength = binding.byteLengthUTF8
3
+ exports.byteLength = function byteLength(string) {
4
+ return binding.byteLengthUTF8(string)
5
+ }
4
6
 
5
- exports.toString = binding.toStringUTF8
7
+ exports.toString = function toString(buffer) {
8
+ return binding.toStringUTF8(
9
+ buffer.buffer,
10
+ buffer.byteOffset,
11
+ buffer.byteLength
12
+ )
13
+ }
6
14
 
7
- exports.write = binding.writeUTF8
15
+ exports.write = function write(buffer, string) {
16
+ return binding.writeUTF8(
17
+ buffer.buffer,
18
+ buffer.byteOffset,
19
+ buffer.byteLength,
20
+ string
21
+ )
22
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bare-buffer",
3
- "version": "3.1.4",
3
+ "version": "3.3.0",
4
4
  "description": "Native buffers for JavaScript",
5
5
  "exports": {
6
6
  "./package": "./package.json",
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "homepage": "https://github.com/holepunchto/bare-buffer#readme",
45
45
  "engines": {
46
- "bare": ">=1.13.0"
46
+ "bare": ">=1.20.0"
47
47
  },
48
48
  "devDependencies": {
49
49
  "brittle": "^3.1.1",