bare-http1 2.0.4 → 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/binding.c DELETED
@@ -1,636 +0,0 @@
1
- #include <assert.h>
2
- #include <bare.h>
3
- #include <js.h>
4
- #include <stdlib.h>
5
- #include <utf.h>
6
- #include <uv.h>
7
-
8
- typedef struct {
9
- uv_tcp_t tcp;
10
- js_env_t *env;
11
- js_ref_t *ctx;
12
- js_ref_t *on_connection;
13
- js_ref_t *on_read;
14
- js_ref_t *on_write;
15
- js_ref_t *on_close;
16
- js_ref_t *on_server_close;
17
- char *read_buf;
18
- size_t read_buf_len;
19
- } bare_http_server_t;
20
-
21
- typedef struct {
22
- uv_tcp_t tcp;
23
- bare_http_server_t *server;
24
- uint32_t id;
25
- } bare_http_connection_t;
26
-
27
- static void
28
- on_alloc_buffer (uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) {
29
- bare_http_connection_t *conn = (bare_http_connection_t *) handle;
30
- bare_http_server_t *self = conn->server;
31
-
32
- buf->base = self->read_buf;
33
- buf->len = self->read_buf_len;
34
- }
35
-
36
- static void
37
- on_connection_close (uv_handle_t *handle) {
38
- bare_http_connection_t *conn = (bare_http_connection_t *) handle;
39
- bare_http_server_t *self = conn->server;
40
-
41
- int err;
42
-
43
- js_env_t *env = self->env;
44
-
45
- js_handle_scope_t *scope;
46
- err = js_open_handle_scope(env, &scope);
47
- assert(err == 0);
48
-
49
- js_value_t *ctx;
50
- err = js_get_reference_value(env, self->ctx, &ctx);
51
- assert(err == 0);
52
-
53
- js_value_t *on_close;
54
- err = js_get_reference_value(env, self->on_close, &on_close);
55
- assert(err == 0);
56
-
57
- js_value_t *argv[1];
58
-
59
- err = js_create_uint32(env, conn->id, &argv[0]);
60
- assert(err == 0);
61
-
62
- js_call_function(env, ctx, on_close, 1, argv, NULL);
63
-
64
- err = js_close_handle_scope(env, scope);
65
- assert(err == 0);
66
- }
67
-
68
- static void
69
- on_server_close (uv_handle_t *handle) {
70
- bare_http_server_t *self = (bare_http_server_t *) handle;
71
-
72
- int err;
73
-
74
- js_env_t *env = self->env;
75
-
76
- js_handle_scope_t *scope;
77
- err = js_open_handle_scope(env, &scope);
78
- assert(err == 0);
79
-
80
- js_value_t *ctx;
81
- err = js_get_reference_value(env, self->ctx, &ctx);
82
- assert(err == 0);
83
-
84
- js_value_t *on_server_close;
85
- err = js_get_reference_value(env, self->on_server_close, &on_server_close);
86
- assert(err == 0);
87
-
88
- js_call_function(env, ctx, on_server_close, 0, NULL, NULL);
89
-
90
- err = js_delete_reference(env, self->on_connection);
91
- assert(err == 0);
92
-
93
- err = js_delete_reference(env, self->on_read);
94
- assert(err == 0);
95
-
96
- err = js_delete_reference(env, self->on_write);
97
- assert(err == 0);
98
-
99
- err = js_delete_reference(env, self->on_close);
100
- assert(err == 0);
101
-
102
- err = js_delete_reference(env, self->on_server_close);
103
- assert(err == 0);
104
-
105
- err = js_delete_reference(env, self->ctx);
106
- assert(err == 0);
107
-
108
- err = js_close_handle_scope(env, scope);
109
- assert(err == 0);
110
- }
111
-
112
- static void
113
- on_write (uv_write_t *req, int status) {
114
- bare_http_connection_t *conn = (bare_http_connection_t *) req->data;
115
- bare_http_server_t *self = conn->server;
116
-
117
- int err;
118
-
119
- js_env_t *env = self->env;
120
-
121
- js_handle_scope_t *scope;
122
- err = js_open_handle_scope(env, &scope);
123
- assert(err == 0);
124
-
125
- js_value_t *ctx;
126
- err = js_get_reference_value(env, self->ctx, &ctx);
127
- assert(err == 0);
128
-
129
- js_value_t *on_write;
130
- err = js_get_reference_value(env, self->on_write, &on_write);
131
- assert(err == 0);
132
-
133
- js_value_t *argv[2];
134
-
135
- err = js_create_uint32(env, conn->id, &argv[0]);
136
- assert(err == 0);
137
-
138
- err = js_create_int32(env, status, &argv[1]);
139
- assert(err == 0);
140
-
141
- js_call_function(env, ctx, on_write, 2, argv, NULL);
142
-
143
- err = js_close_handle_scope(env, scope);
144
- assert(err == 0);
145
- }
146
-
147
- static void
148
- on_shutdown (uv_shutdown_t *req, int status) {
149
- bare_http_connection_t *conn = (bare_http_connection_t *) req->data;
150
- bare_http_server_t *self = conn->server;
151
-
152
- int err;
153
-
154
- js_env_t *env = self->env;
155
-
156
- js_handle_scope_t *scope;
157
- err = js_open_handle_scope(env, &scope);
158
- assert(err == 0);
159
-
160
- js_value_t *ctx;
161
- err = js_get_reference_value(env, self->ctx, &ctx);
162
- assert(err == 0);
163
-
164
- js_value_t *on_write;
165
- err = js_get_reference_value(env, self->on_write, &on_write);
166
- assert(err == 0);
167
-
168
- js_value_t *argv[2];
169
-
170
- err = js_create_uint32(env, conn->id, &argv[0]);
171
- assert(err == 0);
172
-
173
- err = js_create_int32(env, status, &argv[1]);
174
- assert(err == 0);
175
-
176
- js_call_function(env, ctx, on_write, 2, argv, NULL);
177
-
178
- err = js_close_handle_scope(env, scope);
179
- assert(err == 0);
180
- }
181
-
182
- static void
183
- on_read (uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
184
- bare_http_connection_t *conn = (bare_http_connection_t *) client;
185
- bare_http_server_t *self = (bare_http_server_t *) conn->server;
186
-
187
- if (nread == 0) return;
188
-
189
- int err;
190
-
191
- js_env_t *env = self->env;
192
-
193
- js_handle_scope_t *scope;
194
- err = js_open_handle_scope(env, &scope);
195
- assert(err == 0);
196
-
197
- js_value_t *ctx;
198
- err = js_get_reference_value(env, self->ctx, &ctx);
199
- assert(err == 0);
200
-
201
- js_value_t *on_read;
202
- err = js_get_reference_value(env, self->on_read, &on_read);
203
- assert(err == 0);
204
-
205
- js_value_t *argv[2];
206
-
207
- err = js_create_uint32(env, conn->id, &argv[0]);
208
- assert(err == 0);
209
-
210
- err = js_create_int32(env, nread == UV_EOF ? 0 : (int32_t) nread, &argv[1]);
211
- assert(err == 0);
212
-
213
- js_call_function(env, ctx, on_read, 2, argv, NULL);
214
-
215
- err = js_close_handle_scope(env, scope);
216
- assert(err == 0);
217
- }
218
-
219
- static void
220
- on_new_connection (uv_stream_t *server, int status) {
221
- if (status < 0) return; // TODO: mb bubble up?
222
-
223
- bare_http_server_t *self = (bare_http_server_t *) server;
224
-
225
- uv_loop_t *loop;
226
- js_get_env_loop(self->env, &loop);
227
-
228
- int err;
229
-
230
- js_env_t *env = self->env;
231
-
232
- js_handle_scope_t *scope;
233
- err = js_open_handle_scope(env, &scope);
234
- assert(err == 0);
235
-
236
- js_value_t *ctx;
237
- err = js_get_reference_value(env, self->ctx, &ctx);
238
- assert(err == 0);
239
-
240
- js_value_t *on_connection;
241
- err = js_get_reference_value(env, self->on_connection, &on_connection);
242
- assert(err == 0);
243
-
244
- js_call_function(env, ctx, on_connection, 0, NULL, NULL);
245
-
246
- err = js_close_handle_scope(env, scope);
247
- assert(err == 0);
248
- }
249
-
250
- static js_value_t *
251
- bare_http_init (js_env_t *env, js_callback_info_t *info) {
252
- int err;
253
-
254
- size_t argc = 8;
255
- js_value_t *argv[8];
256
-
257
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
258
- assert(err == 0);
259
-
260
- assert(argc == 8);
261
-
262
- bare_http_server_t *self;
263
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &self, NULL, NULL, NULL);
264
- assert(err == 0);
265
-
266
- size_t read_buf_len;
267
- void *read_buf;
268
- err = js_get_typedarray_info(env, argv[1], NULL, &read_buf, &read_buf_len, NULL, NULL);
269
- assert(err == 0);
270
-
271
- self->env = env;
272
- self->read_buf = read_buf;
273
- self->read_buf_len = read_buf_len;
274
-
275
- uv_loop_t *loop;
276
- js_get_env_loop(env, &loop);
277
-
278
- err = uv_tcp_init(loop, &self->tcp);
279
- assert(err == 0);
280
-
281
- err = js_create_reference(env, argv[2], 1, &self->ctx);
282
- assert(err == 0);
283
-
284
- err = js_create_reference(env, argv[3], 1, &self->on_connection);
285
- assert(err == 0);
286
-
287
- err = js_create_reference(env, argv[4], 1, &self->on_read);
288
- assert(err == 0);
289
-
290
- err = js_create_reference(env, argv[5], 1, &self->on_write);
291
- assert(err == 0);
292
-
293
- err = js_create_reference(env, argv[6], 1, &self->on_close);
294
- assert(err == 0);
295
-
296
- err = js_create_reference(env, argv[7], 1, &self->on_server_close);
297
- assert(err == 0);
298
-
299
- return NULL;
300
- }
301
-
302
- static js_value_t *
303
- bare_http_bind (js_env_t *env, js_callback_info_t *info) {
304
- int err;
305
-
306
- size_t argc = 3;
307
- js_value_t *argv[3];
308
-
309
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
310
- assert(err == 0);
311
-
312
- assert(argc == 3);
313
-
314
- bare_http_server_t *self;
315
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &self, NULL, NULL, NULL);
316
- assert(err == 0);
317
-
318
- uint32_t port;
319
- err = js_get_value_uint32(env, argv[1], &port);
320
- assert(err == 0);
321
-
322
- utf8_t ip[17];
323
- err = js_get_value_string_utf8(env, argv[2], ip, 17, NULL);
324
- assert(err == 0);
325
-
326
- int addr_len = sizeof(struct sockaddr_in);
327
-
328
- struct sockaddr_storage addr;
329
-
330
- err = uv_ip4_addr((char *) ip, port, (struct sockaddr_in *) &addr);
331
- if (err < 0) {
332
- js_throw_error(env, uv_err_name(err), uv_strerror(err));
333
- return NULL;
334
- }
335
-
336
- err = uv_tcp_bind(&(self->tcp), (struct sockaddr *) &addr, 0);
337
- if (err < 0) {
338
- js_throw_error(env, uv_err_name(err), uv_strerror(err));
339
- return NULL;
340
- }
341
-
342
- struct sockaddr_storage name;
343
-
344
- err = uv_tcp_getsockname(&(self->tcp), (struct sockaddr *) &name, &addr_len);
345
- if (err < 0) {
346
- js_throw_error(env, uv_err_name(err), uv_strerror(err));
347
- return NULL;
348
- }
349
-
350
- int local_port = ntohs(((struct sockaddr_in *) &name)->sin_port);
351
-
352
- err = uv_listen((uv_stream_t *) &(self->tcp), 128, on_new_connection);
353
- if (err < 0) {
354
- js_throw_error(env, uv_err_name(err), uv_strerror(err));
355
- return NULL;
356
- }
357
-
358
- js_value_t *res;
359
- err = js_create_uint32(env, local_port, &res);
360
- assert(err == 0);
361
-
362
- return res;
363
- }
364
-
365
- static js_value_t *
366
- bare_http_close (js_env_t *env, js_callback_info_t *info) {
367
- int err;
368
-
369
- size_t argc = 1;
370
- js_value_t *argv[1];
371
-
372
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
373
- assert(err == 0);
374
-
375
- assert(argc == 1);
376
-
377
- bare_http_server_t *self;
378
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &self, NULL, NULL, NULL);
379
- assert(err == 0);
380
-
381
- uv_close((uv_handle_t *) self, on_server_close);
382
-
383
- return NULL;
384
- }
385
-
386
- static js_value_t *
387
- bare_http_ref (js_env_t *env, js_callback_info_t *info) {
388
- int err;
389
-
390
- size_t argc = 1;
391
- js_value_t *argv[1];
392
-
393
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
394
- assert(err == 0);
395
-
396
- assert(argc == 1);
397
-
398
- bare_http_server_t *self;
399
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &self, NULL, NULL, NULL);
400
- assert(err == 0);
401
-
402
- uv_ref((uv_handle_t *) self);
403
-
404
- return NULL;
405
- }
406
-
407
- static js_value_t *
408
- bare_http_unref (js_env_t *env, js_callback_info_t *info) {
409
- int err;
410
-
411
- size_t argc = 1;
412
- js_value_t *argv[1];
413
-
414
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
415
- assert(err == 0);
416
-
417
- assert(argc == 1);
418
-
419
- bare_http_server_t *self;
420
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &self, NULL, NULL, NULL);
421
- assert(err == 0);
422
-
423
- uv_unref((uv_handle_t *) self);
424
-
425
- return NULL;
426
- }
427
-
428
- static js_value_t *
429
- bare_http_accept (js_env_t *env, js_callback_info_t *info) {
430
- int err;
431
-
432
- size_t argc = 2;
433
- js_value_t *argv[2];
434
-
435
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
436
- assert(err == 0);
437
-
438
- bare_http_server_t *server;
439
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &server, NULL, NULL, NULL);
440
- assert(err == 0);
441
-
442
- bare_http_connection_t *client;
443
- err = js_get_typedarray_info(env, argv[1], NULL, (void **) &client, NULL, NULL, NULL);
444
- assert(err == 0);
445
-
446
- uv_loop_t *loop;
447
- js_get_env_loop(env, &loop);
448
-
449
- err = uv_tcp_init(loop, (uv_tcp_t *) client);
450
- assert(err == 0);
451
-
452
- client->server = server;
453
-
454
- if (uv_accept((uv_stream_t *) server, (uv_stream_t *) client) == 0) {
455
- uv_read_start((uv_stream_t *) client, on_alloc_buffer, on_read);
456
- } else {
457
- uv_close((uv_handle_t *) client, on_connection_close);
458
- }
459
-
460
- return NULL;
461
- }
462
-
463
- static js_value_t *
464
- bare_http_connection_write (js_env_t *env, js_callback_info_t *info) {
465
- int err;
466
-
467
- size_t argc = 3;
468
- js_value_t *argv[3];
469
-
470
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
471
- assert(err == 0);
472
-
473
- assert(argc == 3);
474
-
475
- bare_http_connection_t *conn;
476
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &conn, NULL, NULL, NULL);
477
- assert(err == 0);
478
-
479
- uv_write_t *req;
480
- err = js_get_typedarray_info(env, argv[1], NULL, (void **) &req, NULL, NULL, NULL);
481
- assert(err == 0);
482
-
483
- js_value_t *arr = argv[2];
484
-
485
- uint32_t bufs_len;
486
- err = js_get_array_length(env, arr, &bufs_len);
487
- assert(err == 0);
488
-
489
- uv_buf_t *bufs = malloc(sizeof(uv_buf_t) * bufs_len);
490
-
491
- for (uint32_t i = 0; i < bufs_len; i++) {
492
- js_value_t *item;
493
- err = js_get_element(env, arr, i, &item);
494
- assert(err == 0);
495
-
496
- uv_buf_t *buf = &bufs[i];
497
- err = js_get_typedarray_info(env, item, NULL, (void **) &buf->base, (size_t *) &buf->len, NULL, NULL);
498
- assert(err == 0);
499
- }
500
-
501
- req->data = conn;
502
-
503
- err = uv_write(req, (uv_stream_t *) conn, bufs, bufs_len, on_write);
504
- assert(err == 0);
505
-
506
- free(bufs);
507
-
508
- return NULL;
509
- }
510
-
511
- static js_value_t *
512
- bare_http_connection_shutdown (js_env_t *env, js_callback_info_t *info) {
513
- int err;
514
-
515
- size_t argc = 2;
516
- js_value_t *argv[2];
517
-
518
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
519
- assert(err == 0);
520
-
521
- assert(argc == 2);
522
-
523
- bare_http_connection_t *conn;
524
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &conn, NULL, NULL, NULL);
525
- assert(err == 0);
526
-
527
- uv_shutdown_t *req;
528
- err = js_get_typedarray_info(env, argv[1], NULL, (void **) &req, NULL, NULL, NULL);
529
- assert(err == 0);
530
-
531
- req->data = conn;
532
-
533
- err = uv_shutdown(req, (uv_stream_t *) conn, on_shutdown);
534
- assert(err == 0);
535
-
536
- return NULL;
537
- }
538
-
539
- static js_value_t *
540
- bare_http_connection_close (js_env_t *env, js_callback_info_t *info) {
541
- int err;
542
-
543
- size_t argc = 1;
544
- js_value_t *argv[1];
545
-
546
- err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
547
- assert(err == 0);
548
-
549
- assert(argc == 1);
550
-
551
- bare_http_connection_t *conn;
552
- err = js_get_typedarray_info(env, argv[0], NULL, (void **) &conn, NULL, NULL, NULL);
553
- assert(err == 0);
554
-
555
- uv_close((uv_handle_t *) conn, on_connection_close);
556
-
557
- return NULL;
558
- }
559
-
560
- static js_value_t *
561
- init (js_env_t *env, js_value_t *exports) {
562
- {
563
- js_value_t *val;
564
- js_create_uint32(env, sizeof(bare_http_server_t), &val);
565
- js_set_named_property(env, exports, "sizeofServer", val);
566
- }
567
- {
568
- js_value_t *val;
569
- js_create_uint32(env, sizeof(bare_http_connection_t), &val);
570
- js_set_named_property(env, exports, "sizeofConnection", val);
571
- }
572
- {
573
- js_value_t *val;
574
- js_create_uint32(env, sizeof(uv_write_t), &val);
575
- js_set_named_property(env, exports, "sizeofWrite", val);
576
- }
577
- {
578
- js_value_t *val;
579
- js_create_uint32(env, sizeof(uv_shutdown_t), &val);
580
- js_set_named_property(env, exports, "sizeofShutdown", val);
581
- }
582
- {
583
- js_value_t *val;
584
- js_create_uint32(env, offsetof(bare_http_connection_t, id), &val);
585
- js_set_named_property(env, exports, "offsetofConnectionID", val);
586
- }
587
- {
588
- js_value_t *fn;
589
- js_create_function(env, "init", -1, bare_http_init, NULL, &fn);
590
- js_set_named_property(env, exports, "init", fn);
591
- }
592
- {
593
- js_value_t *fn;
594
- js_create_function(env, "bind", -1, bare_http_bind, NULL, &fn);
595
- js_set_named_property(env, exports, "bind", fn);
596
- }
597
- {
598
- js_value_t *fn;
599
- js_create_function(env, "accept", -1, bare_http_accept, NULL, &fn);
600
- js_set_named_property(env, exports, "accept", fn);
601
- }
602
- {
603
- js_value_t *fn;
604
- js_create_function(env, "close", -1, bare_http_close, NULL, &fn);
605
- js_set_named_property(env, exports, "close", fn);
606
- }
607
- {
608
- js_value_t *fn;
609
- js_create_function(env, "ref", -1, bare_http_ref, NULL, &fn);
610
- js_set_named_property(env, exports, "ref", fn);
611
- }
612
- {
613
- js_value_t *fn;
614
- js_create_function(env, "unref", -1, bare_http_unref, NULL, &fn);
615
- js_set_named_property(env, exports, "unref", fn);
616
- }
617
- {
618
- js_value_t *fn;
619
- js_create_function(env, "connectionWrite", -1, bare_http_connection_write, NULL, &fn);
620
- js_set_named_property(env, exports, "connectionWrite", fn);
621
- }
622
- {
623
- js_value_t *fn;
624
- js_create_function(env, "connectionShutdown", -1, bare_http_connection_shutdown, NULL, &fn);
625
- js_set_named_property(env, exports, "connectionShutdown", fn);
626
- }
627
- {
628
- js_value_t *fn;
629
- js_create_function(env, "connectionClose", -1, bare_http_connection_close, NULL, &fn);
630
- js_set_named_property(env, exports, "connectionClose", fn);
631
- }
632
-
633
- return exports;
634
- }
635
-
636
- BARE_MODULE(bare_http, init)
package/binding.js DELETED
@@ -1 +0,0 @@
1
- module.exports = require.addon()
Binary file
Binary file