mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 17:36:29 +03:00
api: add dc_jsonrpc_blocking_call()
This commit is contained in:
5
Cargo.lock
generated
5
Cargo.lock
generated
@@ -1295,6 +1295,7 @@ dependencies = [
|
|||||||
"serde_json",
|
"serde_json",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"yerpc",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -5754,9 +5755,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "yerpc"
|
name = "yerpc"
|
||||||
version = "0.4.3"
|
version = "0.4.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b6a0257f42e6bdc187f37074723b6094da3502cee21ae517b3c54d2c37d506e7"
|
checksum = "b2c26a804eaa30c1ff1a296dc6dd1a7d7c622750dafcd0d6b2ed5e3c5c3beb22"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-channel",
|
"async-channel",
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ anyhow = "1"
|
|||||||
thiserror = "1"
|
thiserror = "1"
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
once_cell = "1.17.0"
|
once_cell = "1.17.0"
|
||||||
|
yerpc = { version = "0.4.4", features = ["anyhow_expose"] }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["vendored"]
|
default = ["vendored"]
|
||||||
|
|||||||
@@ -5720,6 +5720,18 @@ void dc_jsonrpc_request(dc_jsonrpc_instance_t* jsonrpc_instance, const char* req
|
|||||||
*/
|
*/
|
||||||
char* dc_jsonrpc_next_response(dc_jsonrpc_instance_t* jsonrpc_instance);
|
char* dc_jsonrpc_next_response(dc_jsonrpc_instance_t* jsonrpc_instance);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make a JSON-RPC call and return a response.
|
||||||
|
*
|
||||||
|
* @memberof dc_jsonrpc_instance_t
|
||||||
|
* @param jsonrpc_instance jsonrpc instance as returned from dc_jsonrpc_init().
|
||||||
|
* @param method JSON-RPC method name, e.g. `check_email_validity`.
|
||||||
|
* @param params JSON-RPC method parameters, e.g. `["alice@example.org"]`.
|
||||||
|
* @return JSON-RPC response as string, must be freed using dc_str_unref() after usage.
|
||||||
|
* On error, NULL is returned.
|
||||||
|
*/
|
||||||
|
char* dc_jsonrpc_blocking_call(dc_jsonrpc_instance_t* jsonrpc_instance, const char *method, const char *params);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @class dc_event_emitter_t
|
* @class dc_event_emitter_t
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -4967,7 +4967,7 @@ pub unsafe extern "C" fn dc_accounts_get_event_emitter(
|
|||||||
#[cfg(feature = "jsonrpc")]
|
#[cfg(feature = "jsonrpc")]
|
||||||
mod jsonrpc {
|
mod jsonrpc {
|
||||||
use deltachat_jsonrpc::api::CommandApi;
|
use deltachat_jsonrpc::api::CommandApi;
|
||||||
use deltachat_jsonrpc::yerpc::{OutReceiver, RpcClient, RpcSession};
|
use deltachat_jsonrpc::yerpc::{OutReceiver, RpcClient, RpcServer, RpcSession};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
@@ -5039,4 +5039,29 @@ mod jsonrpc {
|
|||||||
.map(|result| serde_json::to_string(&result).unwrap_or_default().strdup())
|
.map(|result| serde_json::to_string(&result).unwrap_or_default().strdup())
|
||||||
.unwrap_or(ptr::null_mut())
|
.unwrap_or(ptr::null_mut())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn dc_jsonrpc_blocking_call(
|
||||||
|
jsonrpc_instance: *mut dc_jsonrpc_instance_t,
|
||||||
|
method: *const libc::c_char,
|
||||||
|
params: *const libc::c_char,
|
||||||
|
) -> *mut libc::c_char {
|
||||||
|
if jsonrpc_instance.is_null() {
|
||||||
|
eprintln!("ignoring careless call to dc_jsonrpc_blocking_call()");
|
||||||
|
return ptr::null_mut();
|
||||||
|
}
|
||||||
|
let api = &*jsonrpc_instance;
|
||||||
|
let method = to_string_lossy(method);
|
||||||
|
let params = to_string_lossy(params);
|
||||||
|
let params: Option<yerpc::Params> = match serde_json::from_str(¶ms) {
|
||||||
|
Ok(params) => Some(params),
|
||||||
|
Err(_) => None,
|
||||||
|
};
|
||||||
|
let params = params.map(yerpc::Params::into_value).unwrap_or_default();
|
||||||
|
let res = block_on(api.handle.server().handle_request(method, params));
|
||||||
|
match res {
|
||||||
|
Ok(res) => res.to_string().strdup(),
|
||||||
|
Err(_) => ptr::null_mut(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ log = "0.4"
|
|||||||
async-channel = { version = "1.8.0" }
|
async-channel = { version = "1.8.0" }
|
||||||
futures = { version = "0.3.28" }
|
futures = { version = "0.3.28" }
|
||||||
serde_json = "1.0.96"
|
serde_json = "1.0.96"
|
||||||
yerpc = { version = "0.4.3", features = ["anyhow_expose"] }
|
yerpc = { version = "0.4.4", features = ["anyhow_expose"] }
|
||||||
typescript-type-def = { version = "0.5.5", features = ["json_value"] }
|
typescript-type-def = { version = "0.5.5", features = ["json_value"] }
|
||||||
tokio = { version = "1.28.0" }
|
tokio = { version = "1.28.0" }
|
||||||
sanitize-filename = "0.4"
|
sanitize-filename = "0.4"
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ from deltachat.testplugin import (
|
|||||||
create_dict_from_files_in_path,
|
create_dict_from_files_in_path,
|
||||||
write_dict_to_dir,
|
write_dict_to_dir,
|
||||||
)
|
)
|
||||||
|
from deltachat.cutil import from_optional_dc_charpointer
|
||||||
|
|
||||||
# from deltachat.account import EventLogger
|
# from deltachat.account import EventLogger
|
||||||
|
|
||||||
@@ -215,3 +216,19 @@ def test_logged_ac_process_ffi_failure(acfactory):
|
|||||||
assert "ac_process_ffi_event" in res
|
assert "ac_process_ffi_event" in res
|
||||||
assert "ZeroDivisionError" in res
|
assert "ZeroDivisionError" in res
|
||||||
assert "Traceback" in res
|
assert "Traceback" in res
|
||||||
|
|
||||||
|
|
||||||
|
def test_jsonrpc_blocking_call(tmpdir):
|
||||||
|
accounts_fname = tmpdir.join("accounts")
|
||||||
|
accounts = ffi.gc(
|
||||||
|
lib.dc_accounts_new(ffi.NULL, accounts_fname.strpath.encode("ascii")),
|
||||||
|
lib.dc_accounts_unref,
|
||||||
|
)
|
||||||
|
jsonrpc = ffi.gc(lib.dc_jsonrpc_init(accounts), lib.dc_jsonrpc_unref)
|
||||||
|
res = from_optional_dc_charpointer(
|
||||||
|
lib.dc_jsonrpc_blocking_call(jsonrpc, b"check_email_validity", b'["alice@example.org"]'),
|
||||||
|
)
|
||||||
|
assert res == "true"
|
||||||
|
|
||||||
|
res = from_optional_dc_charpointer(lib.dc_jsonrpc_blocking_call(jsonrpc, b"check_email_validity", b'["alice"]'))
|
||||||
|
assert res == "false"
|
||||||
|
|||||||
Reference in New Issue
Block a user