mirror of
https://github.com/chatmail/core.git
synced 2026-04-05 23:22:11 +03:00
* integrate json-rpc repo https://github.com/deltachat/deltachat-jsonrpc * get target dir from cargo * fix clippy * use node 16 in ci use `npm i` instead of `npm ci` try fix ci script and fix a doc comment * fix get_provider_info docs * refactor function name * fix formatting make test pass fix clippy * update .gitignore * change now returns event names as id directly, no conversion method or number ids anymore also longer timeout for requesting test accounts from mailadm * fix compile after rebase * add json api to cffi and expose it in dc node * add some files to npm ignore that don't need to be in the npm package * add jsonrpc crate to set_core_version * add jsonrpc feature flag * call a jsonrpc function in segfault example * break loop on empty response * fix closing segfault thanks again to link2xt for figguring this out * activate other tests again * remove selectAccount from highlevel client * put jsonrpc stuff in own module * disable jsonrpc by default * add @deltachat/jsonrpc-client to make sure its dependencies are installed, too whwn installing dc-node * commit types.ts that dc-node has everything it needs to provide @deltachat/jsonrpc-client without an extra ts compile step * improve naming * Changes for tokio compat, upgrade to yerpc 0.3 This also changes the webserver binary to use axum in place of tide. * Improvements to typescript package * Improve docs. * improve docs, fix example * Fix CFFI for JSON-RPC changes * use stable toolchain not 1.56.0 * fix ci * try to fix ci * remove emtpy file allow unused code for new_from_arc * expose anyhow errors feature name was wrong * use multi-threaded runtime in JSON-RPC webserver * improve test setup and code style * don't wait for IO on webserver start * Bump yerpc to 0.3.1 with fix for axum server * update todo document remove specific api stuff for now, we now have the an incremental aproach on moving not the all at-once effort I though it would be * remove debug logs * changelog entry about the jsonrpc * Fix method name casings and cleanups * Improve JSON-RPC CI, no need to build things multiple times * Naming consistency: Use DeltaChat not Deltachat * Improve documentation * fix docs * adress dig's comments - description in cargo.toml - impl From<EventType> for EventTypeName - rename `CommandApi::new_from_arc` -> `CommandApi::from_arc` - pre-allocate if we know the entry count already - remove unused enumerate - remove unused serde attribute comment - rename `FullChat::from_dc_chat_id` -> `FullChat::try_from_dc_chat_id` * make it more idiomatic: rename `ContactObject::from_dc_contact -> `ContactObject::try_from_dc_contact` * apply link2xt's suggestions: - unref jsonrpc_instance in same thread it was created in - increase `max_queue_size` from 1 to 1000 * reintroduce segfault test script * remove unneeded context thanks to link2xt for pointing that out * Update deltachat-ffi/deltachat.h Co-authored-by: bjoern <r10s@b44t.com> * Update deltachat-ffi/deltachat.h Co-authored-by: bjoern <r10s@b44t.com> * make sure to use dc_str_unref instead of free on cstrings returned/owned by rust * Increase online test timeouts for CI * fix the typos thanks to ralphtheninja for finding them * restore same configure behaviour as desktop: make configure restart io with the old configuration if it had one on error * found another segfault: this time in batch_set_config * remove print from test * make dcn_json_rpc_request return undefined instead of not returning this might have been the cause for the second segfault * add set_config_from_qr to jsonrpc * add `add_device_message` to jsonrpc * jsonrpc: add `get_fresh_msgs` and `get_fresh_msg_cnt` * jsonrpc: add dm_chat_contact to ChatListItemFetchResult * add webxdc methods to jsonrpc: - `webxdc_send_status_update` - `webxdc_get_status_updates` - `message_get_webxdc_info` * add `chat_get_media` to jsonrpc also add viewtype wrapper enum and use it in `MessageObject`, additionally to using it in `chat_get_media` * use camelCase in all js object properties * Add check_qr function to jsonrpc * Fixed clippy errors and formatting * Fixed formatting * fix changelog ordering after rebase * fix compile after merging in master branch Co-authored-by: Simon Laux <mobile.info@simonlaux.de> Co-authored-by: Simon Laux <Simon-Laux@users.noreply.github.com> Co-authored-by: bjoern <r10s@b44t.com> Co-authored-by: flipsimon <28535045+flipsimon@users.noreply.github.com>
145 lines
5.0 KiB
C
145 lines
5.0 KiB
C
#include <napi-macros.h>
|
|
|
|
#undef NAPI_STATUS_THROWS
|
|
|
|
#define NAPI_STATUS_THROWS(call) \
|
|
if ((call) != napi_ok) { \
|
|
napi_throw_error(env, NULL, #call " failed!"); \
|
|
}
|
|
|
|
#define NAPI_DCN_CONTEXT() \
|
|
dcn_context_t* dcn_context; \
|
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&dcn_context)); \
|
|
if (!dcn_context) { \
|
|
const char* msg = "Provided dnc_context is null"; \
|
|
NAPI_STATUS_THROWS(napi_throw_type_error(env, NULL, msg)); \
|
|
} \
|
|
if (!dcn_context->dc_context) { \
|
|
const char* msg = "Provided dc_context is null, did you close the context or not open it?"; \
|
|
NAPI_STATUS_THROWS(napi_throw_type_error(env, NULL, msg)); \
|
|
}
|
|
|
|
#define NAPI_DCN_ACCOUNTS() \
|
|
dcn_accounts_t* dcn_accounts; \
|
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&dcn_accounts)); \
|
|
if (!dcn_accounts) { \
|
|
const char* msg = "Provided dcn_acounts is null"; \
|
|
NAPI_STATUS_THROWS(napi_throw_type_error(env, NULL, msg)); \
|
|
} \
|
|
if (!dcn_accounts->dc_accounts) { \
|
|
const char* msg = "Provided dc_accounts is null, did you unref the accounts object?"; \
|
|
NAPI_STATUS_THROWS(napi_throw_type_error(env, NULL, msg)); \
|
|
}
|
|
|
|
|
|
#define NAPI_DC_CHAT() \
|
|
dc_chat_t* dc_chat; \
|
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&dc_chat));
|
|
|
|
#define NAPI_DC_CHATLIST() \
|
|
dc_chatlist_t* dc_chatlist; \
|
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&dc_chatlist));
|
|
|
|
#define NAPI_DC_CONTACT() \
|
|
dc_contact_t* dc_contact; \
|
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&dc_contact));
|
|
|
|
#define NAPI_DC_LOT() \
|
|
dc_lot_t* dc_lot; \
|
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&dc_lot));
|
|
|
|
#define NAPI_DC_MSG() \
|
|
dc_msg_t* dc_msg; \
|
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&dc_msg));
|
|
|
|
#define NAPI_ARGV_DC_MSG(name, position) \
|
|
dc_msg_t* name; \
|
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[position], (void**)&name));
|
|
|
|
#define NAPI_DC_PROVIDER() \
|
|
dc_provider_t* dc_provider; \
|
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&dc_provider));
|
|
|
|
#define NAPI_DC_ARRAY() \
|
|
dc_array_t* dc_array; \
|
|
NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&dc_array));
|
|
|
|
#define NAPI_RETURN_UNDEFINED() \
|
|
return 0;
|
|
|
|
#define NAPI_RETURN_UINT64(name) \
|
|
napi_value return_int64; \
|
|
NAPI_STATUS_THROWS(napi_create_bigint_int64(env, name, &return_int64)); \
|
|
return return_int64;
|
|
|
|
#define NAPI_RETURN_INT64(name) \
|
|
napi_value return_int64; \
|
|
NAPI_STATUS_THROWS(napi_create_int64(env, name, &return_int64)); \
|
|
return return_int64;
|
|
|
|
|
|
#define NAPI_RETURN_AND_UNREF_STRING(name) \
|
|
napi_value return_value; \
|
|
if (name == NULL) { \
|
|
NAPI_STATUS_THROWS(napi_get_null(env, &return_value)); \
|
|
return return_value; \
|
|
} \
|
|
NAPI_STATUS_THROWS(napi_create_string_utf8(env, name, NAPI_AUTO_LENGTH, &return_value)); \
|
|
dc_str_unref(name); \
|
|
return return_value;
|
|
|
|
#define NAPI_ASYNC_CARRIER_BEGIN(name) \
|
|
typedef struct name##_carrier_t { \
|
|
napi_ref callback_ref; \
|
|
napi_async_work async_work; \
|
|
dcn_context_t* dcn_context;
|
|
|
|
#define NAPI_ASYNC_CARRIER_END(name) \
|
|
} name##_carrier_t;
|
|
|
|
#define NAPI_ASYNC_EXECUTE(name) \
|
|
static void name##_execute(napi_env env, void* data)
|
|
|
|
#define NAPI_ASYNC_GET_CARRIER(name) \
|
|
name##_carrier_t* carrier = (name##_carrier_t*)data;
|
|
|
|
#define NAPI_ASYNC_COMPLETE(name) \
|
|
static void name##_complete(napi_env env, napi_status status, void* data)
|
|
|
|
#define NAPI_ASYNC_CALL_AND_DELETE_CB() \
|
|
napi_value global; \
|
|
NAPI_STATUS_THROWS(napi_get_global(env, &global)); \
|
|
napi_value callback; \
|
|
NAPI_STATUS_THROWS(napi_get_reference_value(env, carrier->callback_ref, &callback)); \
|
|
NAPI_STATUS_THROWS(napi_call_function(env, global, callback, argc, argv, NULL)); \
|
|
NAPI_STATUS_THROWS(napi_delete_reference(env, carrier->callback_ref)); \
|
|
NAPI_STATUS_THROWS(napi_delete_async_work(env, carrier->async_work));
|
|
|
|
#define NAPI_ASYNC_NEW_CARRIER(name) \
|
|
name##_carrier_t* carrier = calloc(1, sizeof(name##_carrier_t)); \
|
|
carrier->dcn_context = dcn_context;
|
|
|
|
#define NAPI_ASYNC_QUEUE_WORK(name, cb) \
|
|
napi_value callback = cb; \
|
|
napi_value async_resource_name; \
|
|
NAPI_STATUS_THROWS(napi_create_reference(env, callback, 1, &carrier->callback_ref)); \
|
|
NAPI_STATUS_THROWS(napi_create_string_utf8(env, #name "_callback", \
|
|
NAPI_AUTO_LENGTH, \
|
|
&async_resource_name)); \
|
|
NAPI_STATUS_THROWS(napi_create_async_work(env, callback, async_resource_name, \
|
|
name##_execute, name##_complete, \
|
|
carrier, &carrier->async_work)); \
|
|
NAPI_STATUS_THROWS(napi_queue_async_work(env, carrier->async_work));
|
|
|
|
/*** this could/should be moved to napi-macros ***/
|
|
|
|
#define NAPI_DOUBLE(name, val) \
|
|
double name; \
|
|
if (napi_get_value_double(env, val, &name) != napi_ok) { \
|
|
napi_throw_error(env, "EINVAL", "Expected double"); \
|
|
return NULL; \
|
|
}
|
|
|
|
#define NAPI_ARGV_DOUBLE(name, i) \
|
|
NAPI_DOUBLE(name, argv[i])
|