forked from cory/tildefriends
cleanup: Remove server-side JS socket and HTTP request support. Not used/useful enough to justify keeping all this code around.
This commit is contained in:
1165
src/socket.js.c
1165
src/socket.js.c
File diff suppressed because it is too large
Load Diff
@@ -1,30 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
/**
|
||||
** \defgroup socket_js Socket Interface
|
||||
** Exposes network sockets to script.
|
||||
** @{
|
||||
*/
|
||||
|
||||
#include "quickjs.h"
|
||||
|
||||
/**
|
||||
** Register the socket script interface.
|
||||
** @param context The JS context.
|
||||
** @return The Socket constructor.
|
||||
*/
|
||||
JSValue tf_socket_register(JSContext* context);
|
||||
|
||||
/**
|
||||
** Get the number of active socket objects.
|
||||
** @return The count.
|
||||
*/
|
||||
int tf_socket_get_count();
|
||||
|
||||
/**
|
||||
** Get the number of connected socket objects.
|
||||
** @return the count.
|
||||
*/
|
||||
int tf_socket_get_open_count();
|
||||
|
||||
/** @} */
|
@@ -8,7 +8,6 @@
|
||||
#include "mem.h"
|
||||
#include "packetstream.h"
|
||||
#include "serialize.h"
|
||||
#include "socket.js.h"
|
||||
#include "ssb.db.h"
|
||||
#include "ssb.h"
|
||||
#include "ssb.js.h"
|
||||
@@ -826,9 +825,6 @@ static JSValue _tf_task_getStats(JSContext* context, JSValueConst this_val, int
|
||||
JS_SetPropertyStr(context, result, "tls_malloc_percent", JS_NewFloat64(context, 100.0 * tf_mem_get_tls_malloc_size() / total_memory));
|
||||
JS_SetPropertyStr(context, result, "tf_malloc_percent", JS_NewFloat64(context, 100.0 * tf_mem_get_tf_malloc_size() / total_memory));
|
||||
|
||||
JS_SetPropertyStr(context, result, "socket_count", JS_NewInt32(context, tf_socket_get_count()));
|
||||
JS_SetPropertyStr(context, result, "socket_open_count", JS_NewInt32(context, tf_socket_get_open_count()));
|
||||
|
||||
if (task->_ssb)
|
||||
{
|
||||
tf_ssb_stats_t ssb_stats = { 0 };
|
||||
@@ -1665,8 +1661,6 @@ void tf_task_activate(tf_task_t* task)
|
||||
sqlite3_open(task->_db_path, &task->_db);
|
||||
|
||||
JS_SetPropertyStr(context, global, "Task", tf_taskstub_register(context));
|
||||
JS_SetPropertyStr(context, global, "Socket", tf_socket_register(context));
|
||||
JS_SetPropertyStr(context, global, "TlsContext", tf_tls_context_register(context));
|
||||
tf_file_register(context);
|
||||
tf_database_register(context);
|
||||
|
||||
|
88
src/tests.c
88
src/tests.c
@@ -549,93 +549,6 @@ static void _test_float(const tf_test_options_t* options)
|
||||
unlink("out/child.js");
|
||||
}
|
||||
|
||||
static void _test_socket(const tf_test_options_t* options)
|
||||
{
|
||||
_write_file("out/test.js",
|
||||
"'use strict';\n"
|
||||
"\n"
|
||||
"var s = new Socket();\n"
|
||||
"print('connecting');\n"
|
||||
"print('before connect', s.isConnected);\n"
|
||||
"s.onError(function(e) {\n"
|
||||
" print(e);\n"
|
||||
"});\n"
|
||||
"print('noDelay', s.noDelay);\n"
|
||||
"s.noDelay = true;\n"
|
||||
"s.connect('www.unprompted.com', 80).then(function() {\n"
|
||||
" print('connected', 'www.unprompted.com', 80, s.isConnected);\n"
|
||||
" print(s.peerName);\n"
|
||||
" s.read(function(data) {\n"
|
||||
" print('read', data ? data.length : null);\n"
|
||||
" });\n"
|
||||
" s.write('GET / HTTP/1.0\\r\\n\\r\\n');\n"
|
||||
"}).then(function(e) {\n"
|
||||
" print('closed 1');\n"
|
||||
"});\n"
|
||||
"\n"
|
||||
"var s2 = new Socket();\n"
|
||||
"print('connecting');\n"
|
||||
"print('before connect', s2.isConnected);\n"
|
||||
"s2.onError(function(e) {\n"
|
||||
" print('error');\n"
|
||||
" print(e);\n"
|
||||
"});\n"
|
||||
"print('noDelay', s2.noDelay);\n"
|
||||
"s2.noDelay = true;\n"
|
||||
"s2.connect('www.unprompted.com', 443).then(function() {\n"
|
||||
" print('connected', 'www.unprompted.com', 443);\n"
|
||||
" s2.read(function(data) {\n"
|
||||
" print('read', data ? data.length : null);\n"
|
||||
" });\n"
|
||||
" return s2.startTls();\n"
|
||||
"}).then(function() {\n"
|
||||
" print('ready');\n"
|
||||
" print(s2.peerName);\n"
|
||||
" s2.write('GET / HTTP/1.0\\r\\nConnection: close\\r\\n\\r\\n').then(function() {\n"
|
||||
" s2.shutdown();\n"
|
||||
" });\n"
|
||||
"}).catch(function(e) {\n"
|
||||
" print('caught');\n"
|
||||
" print(e);\n"
|
||||
"});\n"
|
||||
"var s3 = new Socket();\n"
|
||||
"print('connecting s3');\n"
|
||||
"print('before connect', s3.isConnected);\n"
|
||||
"s3.onError(function(e) {\n"
|
||||
" print('error');\n"
|
||||
" print(e);\n"
|
||||
"});\n"
|
||||
"print('noDelay', s3.noDelay);\n"
|
||||
"s3.noDelay = true;\n"
|
||||
"s3.connect('0.0.0.0', 443).then(function() {\n"
|
||||
" print('connected', '0.0.0.0', 443);\n"
|
||||
" s3.read(function(data) {\n"
|
||||
" print('read', data ? data.length : null);\n"
|
||||
" });\n"
|
||||
" return s3.startTls();\n"
|
||||
"}).then(function() {\n"
|
||||
" print('ready');\n"
|
||||
" print(s3.peerName);\n"
|
||||
" s3.write('GET / HTTP/1.0\\r\\nConnection: close\\r\\n\\r\\n').then(function() {\n"
|
||||
" s3.shutdown();\n"
|
||||
" });\n"
|
||||
"}).catch(function(e) {\n"
|
||||
" print('caught');\n"
|
||||
" print(e);\n"
|
||||
"});\n");
|
||||
|
||||
char command[256];
|
||||
unlink("out/test_db0.sqlite");
|
||||
snprintf(command, sizeof(command), "%s run --db-path=out/test_db0.sqlite -s out/test.js" TEST_ARGS, options->exe_path);
|
||||
tf_printf("%s\n", command);
|
||||
int result = system(command);
|
||||
tf_printf("returned %d\n", WEXITSTATUS(result));
|
||||
assert(WIFEXITED(result));
|
||||
assert(WEXITSTATUS(result) == 0);
|
||||
|
||||
unlink("out/test.js");
|
||||
}
|
||||
|
||||
static void _test_file(const tf_test_options_t* options)
|
||||
{
|
||||
_write_file("out/test.js",
|
||||
@@ -1065,7 +978,6 @@ void tf_tests(const tf_test_options_t* options)
|
||||
_tf_test_run(options, "icu", _test_icu, false);
|
||||
_tf_test_run(options, "uint8array", _test_uint8array, false);
|
||||
_tf_test_run(options, "float", _test_float, false);
|
||||
_tf_test_run(options, "socket", _test_socket, false);
|
||||
_tf_test_run(options, "file", _test_file, false);
|
||||
_tf_test_run(options, "b64", _test_b64, false);
|
||||
_tf_test_run(options, "rooms", tf_ssb_test_rooms, false);
|
||||
|
@@ -1,105 +0,0 @@
|
||||
#include "tlscontext.js.h"
|
||||
|
||||
#include "log.h"
|
||||
#include "mem.h"
|
||||
#include "task.h"
|
||||
#include "tls.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static JSClassID _classId;
|
||||
static int _count;
|
||||
|
||||
typedef struct _tf_tls_context_t
|
||||
{
|
||||
tf_tls_context_t* context;
|
||||
tf_task_t* task;
|
||||
JSValue object;
|
||||
} tf_tls_context_t;
|
||||
|
||||
static JSValue _tls_context_create(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv);
|
||||
static void _tls_context_finalizer(JSRuntime* runtime, JSValue value);
|
||||
|
||||
static JSValue _tls_context_set_certificate(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||
{
|
||||
tf_tls_context_t* tls = JS_GetOpaque(this_val, _classId);
|
||||
const char* value = JS_ToCString(context, argv[0]);
|
||||
tf_tls_context_set_certificate(tls->context, value);
|
||||
JS_FreeCString(context, value);
|
||||
return JS_UNDEFINED;
|
||||
}
|
||||
|
||||
static JSValue _tls_context_set_private_key(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||
{
|
||||
tf_tls_context_t* tls = JS_GetOpaque(this_val, _classId);
|
||||
const char* value = JS_ToCString(context, argv[0]);
|
||||
tf_tls_context_set_private_key(tls->context, value);
|
||||
JS_FreeCString(context, value);
|
||||
return JS_UNDEFINED;
|
||||
}
|
||||
|
||||
static JSValue _tls_context_add_trusted_certificate(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||
{
|
||||
tf_tls_context_t* tls = JS_GetOpaque(this_val, _classId);
|
||||
const char* value = JS_ToCString(context, argv[0]);
|
||||
tf_tls_context_add_trusted_certificate(tls->context, value);
|
||||
JS_FreeCString(context, value);
|
||||
return JS_UNDEFINED;
|
||||
}
|
||||
|
||||
JSValue tf_tls_context_register(JSContext* context)
|
||||
{
|
||||
JS_NewClassID(&_classId);
|
||||
JSClassDef def = {
|
||||
.class_name = "TlsContext",
|
||||
.finalizer = _tls_context_finalizer,
|
||||
};
|
||||
if (JS_NewClass(JS_GetRuntime(context), _classId, &def) != 0)
|
||||
{
|
||||
fprintf(stderr, "Failed to register TlsContext.\n");
|
||||
}
|
||||
return JS_NewCFunction2(context, _tls_context_create, "TlsContext", 0, JS_CFUNC_constructor, 0);
|
||||
}
|
||||
|
||||
tf_tls_context_t* tf_tls_context_get(JSValue value)
|
||||
{
|
||||
tf_tls_context_t* tls = JS_GetOpaque(value, _classId);
|
||||
return tls ? tls->context : NULL;
|
||||
}
|
||||
|
||||
int tf_tls_context_get_count()
|
||||
{
|
||||
return _count;
|
||||
}
|
||||
|
||||
static JSValue _tls_context_create(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||
{
|
||||
tf_tls_context_t* tls = tf_malloc(sizeof(tf_tls_context_t));
|
||||
memset(tls, 0, sizeof(*tls));
|
||||
|
||||
++_count;
|
||||
tls->object = JS_NewObjectClass(context, _classId);
|
||||
JS_SetOpaque(tls->object, tls);
|
||||
|
||||
JS_SetPropertyStr(context, tls->object, "setCertificate", JS_NewCFunction(context, _tls_context_set_certificate, "setCertificate", 1));
|
||||
JS_SetPropertyStr(context, tls->object, "setPrivateKey", JS_NewCFunction(context, _tls_context_set_private_key, "setPrivateKey", 1));
|
||||
JS_SetPropertyStr(context, tls->object, "addTrustedCertificate", JS_NewCFunction(context, _tls_context_add_trusted_certificate, "addTrustedCertificate", 1));
|
||||
|
||||
tls->context = tf_tls_context_create();
|
||||
tls->task = tf_task_get(context);
|
||||
|
||||
return tls->object;
|
||||
}
|
||||
|
||||
static void _tls_context_finalizer(JSRuntime* runtime, JSValue value)
|
||||
{
|
||||
tf_tls_context_t* tls = JS_GetOpaque(value, _classId);
|
||||
if (tls->context)
|
||||
{
|
||||
tf_tls_context_destroy(tls->context);
|
||||
tls->context = NULL;
|
||||
}
|
||||
--_count;
|
||||
tf_free(tls);
|
||||
}
|
@@ -1,37 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
/**
|
||||
** \defgroup tls_js TLS Interface
|
||||
** Exposes \ref tls to JS.
|
||||
** @{
|
||||
*/
|
||||
|
||||
#include "quickjs.h"
|
||||
|
||||
/**
|
||||
** A TLS context instance.
|
||||
*/
|
||||
typedef struct _tf_tls_context_t tf_tls_context_t;
|
||||
|
||||
/**
|
||||
** Register TLS script interface.
|
||||
** @param context The TLS context.
|
||||
** @return the TlsContext constructor.
|
||||
*/
|
||||
JSValue tf_tls_context_register(JSContext* context);
|
||||
|
||||
/**
|
||||
** Get a TLS context instance from its JS object.
|
||||
** @param value A TlsContext JS object.
|
||||
** @return The corresponding instance.
|
||||
*/
|
||||
tf_tls_context_t* tf_tls_context_get(JSValue value);
|
||||
|
||||
/**
|
||||
** Get the number of active TLS context instances.
|
||||
** @return The number of TlsContext objects created that have not been
|
||||
** finalized.
|
||||
*/
|
||||
int tf_tls_context_get_count();
|
||||
|
||||
/** @} */
|
@@ -253,66 +253,6 @@ bool tf_util_report_error(JSContext* context, JSValue value)
|
||||
return is_error;
|
||||
}
|
||||
|
||||
static JSValue _util_parseHttpResponse(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||
{
|
||||
JSValue result = JS_UNDEFINED;
|
||||
int status = 0;
|
||||
int minor_version = 0;
|
||||
const char* message = NULL;
|
||||
size_t message_length = 0;
|
||||
struct phr_header headers[100];
|
||||
size_t header_count = sizeof(headers) / sizeof(*headers);
|
||||
int previous_length = 0;
|
||||
JS_ToInt32(context, &previous_length, argv[1]);
|
||||
|
||||
JSValue buffer = JS_UNDEFINED;
|
||||
size_t length;
|
||||
uint8_t* array = tf_util_try_get_array_buffer(context, &length, argv[0]);
|
||||
if (!array)
|
||||
{
|
||||
size_t offset;
|
||||
size_t element_size;
|
||||
buffer = tf_util_try_get_typed_array_buffer(context, argv[0], &offset, &length, &element_size);
|
||||
if (!JS_IsException(buffer))
|
||||
{
|
||||
array = tf_util_try_get_array_buffer(context, &length, buffer);
|
||||
}
|
||||
}
|
||||
|
||||
if (array)
|
||||
{
|
||||
int parse_result = phr_parse_response((const char*)array, length, &minor_version, &status, &message, &message_length, headers, &header_count, previous_length);
|
||||
if (parse_result > 0)
|
||||
{
|
||||
result = JS_NewObject(context);
|
||||
JS_SetPropertyStr(context, result, "bytes_parsed", JS_NewInt32(context, parse_result));
|
||||
JS_SetPropertyStr(context, result, "minor_version", JS_NewInt32(context, minor_version));
|
||||
JS_SetPropertyStr(context, result, "status", JS_NewInt32(context, status));
|
||||
JS_SetPropertyStr(context, result, "message", JS_NewStringLen(context, message, message_length));
|
||||
JSValue header_object = JS_NewObject(context);
|
||||
for (int i = 0; i < (int)header_count; i++)
|
||||
{
|
||||
char name[256];
|
||||
snprintf(name, sizeof(name), "%.*s", (int)headers[i].name_len, headers[i].name);
|
||||
JS_SetPropertyStr(context, header_object, name, JS_NewStringLen(context, headers[i].value, headers[i].value_len));
|
||||
}
|
||||
JS_SetPropertyStr(context, result, "headers", header_object);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = JS_NewInt32(context, parse_result);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result = JS_ThrowTypeError(context, "Could not convert argument to array.");
|
||||
}
|
||||
|
||||
JS_FreeValue(context, buffer);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static const char* k_kind_name[] = {
|
||||
[k_kind_bool] = "bool",
|
||||
[k_kind_int] = "int",
|
||||
@@ -359,10 +299,6 @@ static const setting_t k_settings[] = {
|
||||
.type = "integer",
|
||||
.description = "Blobs older than this will be automatically deleted.",
|
||||
.default_value = { .kind = k_kind_int, .int_value = TF_IS_MOBILE ? (int)(1.0f * 365 * 24 * 60 * 60) : -1 } },
|
||||
{ .name = "fetch_hosts",
|
||||
.type = "string",
|
||||
.description = "Comma-separated list of host names to which HTTP fetch requests are allowed. None if empty.",
|
||||
.default_value = { .kind = k_kind_string, .string_value = NULL } },
|
||||
{ .name = "http_redirect",
|
||||
.type = "string",
|
||||
.description = "If connecting by HTTP and HTTPS is configured, Location header prefix (ie, \"http://example.com\")",
|
||||
@@ -523,7 +459,6 @@ void tf_util_register(JSContext* context)
|
||||
JS_SetPropertyStr(context, global, "bip39Words", JS_NewCFunction(context, _util_bip39_words, "bip39Words", 1));
|
||||
JS_SetPropertyStr(context, global, "bip39Bytes", JS_NewCFunction(context, _util_bip39_bytes, "bip39Bytes", 1));
|
||||
JS_SetPropertyStr(context, global, "print", JS_NewCFunction(context, _util_print, "print", 1));
|
||||
JS_SetPropertyStr(context, global, "parseHttpResponse", JS_NewCFunction(context, _util_parseHttpResponse, "parseHttpResponse", 2));
|
||||
JS_SetPropertyStr(context, global, "defaultGlobalSettings", JS_NewCFunction(context, _util_defaultGlobalSettings, "defaultGlobalSettings", 2));
|
||||
JS_FreeValue(context, global);
|
||||
}
|
||||
|
Reference in New Issue
Block a user