MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

improve __store handling

+58 -21
+3 -8
examples/server/server.js
··· 27 27 c.res.body(c.get('meow')); 28 28 }); 29 29 30 - router.get('/set/1', c => { 31 - c.set('meow', '1'); 32 - c.res.body('meow = 1'); 33 - }); 34 - 35 - router.get('/set/2', c => { 36 - c.set('meow', '2'); 37 - c.res.body('meow = 2'); 30 + router.get('/set/*val', c => { 31 + c.set('meow', c.params.val); 32 + c.res.body(`meow = ${c.params.val}`); 38 33 }); 39 34 40 35 router.get('/fs/meow', async c => {
+1 -1
meson.build
··· 74 74 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 75 75 76 76 version_conf = configuration_data() 77 - version_conf.set('ANT_VERSION', '0.1.0.13') 77 + version_conf.set('ANT_VERSION', '0.1.0.14') 78 78 version_conf.set('ANT_GIT_HASH', git_hash) 79 79 version_conf.set('ANT_BUILD_DATE', build_date) 80 80
+54 -12
src/modules/server.c
··· 20 20 #define MAX_HEADER_NAME_LEN 128 21 21 #define MAX_HEADER_VALUE_LEN 2048 22 22 23 + static char* strip_ansi(const char *str) { 24 + if (!str) return NULL; 25 + 26 + size_t len = strlen(str); 27 + char *result = (char *)malloc(len + 1); 28 + if (!result) return NULL; 29 + 30 + size_t j = 0; 31 + for (size_t i = 0; i < len; i++) { 32 + if (str[i] == '\033' && i + 1 < len && str[i + 1] == '[') { 33 + i += 2; 34 + while (i < len && !((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z'))) { 35 + i++; 36 + } 37 + continue; 38 + } 39 + result[j++] = str[i]; 40 + } 41 + result[j] = '\0'; 42 + return result; 43 + } 44 + 23 45 typedef struct { 24 46 char name[MAX_HEADER_NAME_LEN]; 25 47 char value[MAX_HEADER_VALUE_LEN]; ··· 40 62 char *content_type; 41 63 int sent; 42 64 int supports_gzip; 65 + int should_free_body; 43 66 UT_array *custom_headers; 44 67 char *redirect_location; 45 68 uv_tcp_t *client_handle; ··· 49 72 typedef struct http_server_s { 50 73 struct js *js; 51 74 jsval_t handler; 75 + jsval_t store_obj; 52 76 int port; 53 77 uv_tcp_t server; 54 78 uv_loop_t *loop; ··· 317 341 if (nargs < 2) return js_mkundef(); 318 342 319 343 jsval_t this_val = js_getthis(js); 320 - jsval_t var_obj = js_get(js, this_val, "var"); 344 + jsval_t store_obj = js_get(js, this_val, "__store"); 321 345 322 - if (js_type(var_obj) == JS_UNDEF) { 346 + if (js_type(store_obj) == JS_UNDEF) { 323 347 return js_mkundef(); 324 348 } 325 349 326 350 if (js_type(args[0]) == JS_STR) { 327 351 size_t key_len; 328 352 const char *key = js_getstr(js, args[0], &key_len); 329 - js_set(js, var_obj, key, args[1]); 353 + js_set(js, store_obj, key, args[1]); 330 354 } 331 355 332 356 return js_mkundef(); ··· 336 360 if (nargs < 1) return js_mkundef(); 337 361 338 362 jsval_t this_val = js_getthis(js); 339 - jsval_t var_obj = js_get(js, this_val, "var"); 363 + jsval_t store_obj = js_get(js, this_val, "__store"); 340 364 341 - if (js_type(var_obj) == JS_UNDEF) { 365 + if (js_type(store_obj) == JS_UNDEF) { 342 366 return js_mkundef(); 343 367 } 344 368 345 369 if (js_type(args[0]) == JS_STR) { 346 370 size_t key_len; 347 371 const char *key = js_getstr(js, args[0], &key_len); 348 - return js_get(js, var_obj, key); 372 + return js_get(js, store_obj, key); 349 373 } 350 374 351 375 return js_mkundef(); ··· 678 702 res_ctx->content_type = "text/plain"; 679 703 res_ctx->sent = 0; 680 704 res_ctx->supports_gzip = http_req->accepts_gzip; 705 + res_ctx->should_free_body = 0; 681 706 utarray_new(res_ctx->custom_headers, &custom_header_icd); 682 707 res_ctx->redirect_location = NULL; 683 708 res_ctx->client_handle = &client->handle; ··· 710 735 711 736 js_set(server->js, ctx, "req", req); 712 737 js_set(server->js, ctx, "res", res_obj); 713 - js_set(server->js, ctx, "var", js_mkobj(server->js)); 738 + 714 739 js_set(server->js, ctx, "set", js_mkfun(js_set_prop)); 715 740 js_set(server->js, ctx, "get", js_mkfun(js_get_prop)); 716 - 741 + js_set(server->js, ctx, "__store", server->store_obj); 742 + 717 743 jsval_t args[1] = {ctx}; 718 744 result = js_call(server->js, server->handler, args, 1); 719 745 if (js_type(result) == JS_PROMISE) { ··· 721 747 } 722 748 723 749 if (js_type(result) == JS_ERR) { 724 - fprintf(stderr, "Handler error: %s\n", js_str(server->js, result)); 750 + const char *error_msg = js_str(server->js, result); 751 + fprintf(stderr, "Handler error: %s\n", error_msg); 752 + 753 + char *clean_error = strip_ansi(error_msg); 754 + if (clean_error) { 755 + res_ctx->body = clean_error; 756 + res_ctx->body_len = strlen(clean_error); 757 + res_ctx->should_free_body = 1; 758 + } else { 759 + res_ctx->body = (char *)error_msg; 760 + res_ctx->body_len = strlen(error_msg); 761 + res_ctx->should_free_body = 0; 762 + } 725 763 res_ctx->status = 500; 726 - // pass error of throw in server into "internal server error" message 727 - res_ctx->body = "internal server error\nant http v" ANT_VERSION " (" ANT_GIT_HASH ")"; 728 - res_ctx->body_len = strlen(res_ctx->body); 729 764 res_ctx->content_type = "text/plain"; 730 765 res_ctx->sent = 1; 731 766 } else if (!res_ctx->sent) { ··· 772 807 utarray_free(ctx->custom_headers); 773 808 } 774 809 810 + if (ctx->should_free_body && ctx->body) { 811 + free(ctx->body); 812 + } 813 + 775 814 free(ctx); 776 815 } else { 777 816 current = &ctx->next; ··· 834 873 res_ctx->content_type = "text/plain"; 835 874 res_ctx->sent = 1; 836 875 res_ctx->supports_gzip = 0; 876 + res_ctx->should_free_body = 0; 837 877 utarray_new(res_ctx->custom_headers, &custom_header_icd); 838 878 res_ctx->redirect_location = NULL; 839 879 res_ctx->client_handle = &client->handle; ··· 901 941 902 942 server->js = js; 903 943 server->port = port; 944 + 904 945 server->handler = (nargs >= 2) ? args[1] : js_mkundef(); 946 + server->store_obj = js_mkobj(js); 905 947 906 948 if (!g_loop_initialized) { 907 949 g_loop = uv_default_loop();