Changes for tokio compat, upgrade to yerpc 0.3

This also changes the webserver binary to use axum in place of tide.
This commit is contained in:
Franz Heinzmann (Frando)
2022-06-29 17:18:51 +02:00
committed by Simon Laux
parent 659e48bd3f
commit 97e0e0137a
6 changed files with 415 additions and 58 deletions

373
Cargo.lock generated
View File

@@ -134,6 +134,15 @@ dependencies = [
"tokio", "tokio",
] ]
[[package]]
name = "async-mutex"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e"
dependencies = [
"event-listener",
]
[[package]] [[package]]
name = "async-native-tls" name = "async-native-tls"
version = "0.4.0" version = "0.4.0"
@@ -216,6 +225,54 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "axum"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2cc6e8e8c993cb61a005fab8c1e5093a29199b7253b05a6883999312935c1ff"
dependencies = [
"async-trait",
"axum-core",
"base64 0.13.0",
"bitflags",
"bytes",
"futures-util",
"http",
"http-body",
"hyper",
"itoa 1.0.2",
"matchit",
"memchr",
"mime",
"percent-encoding",
"pin-project-lite",
"serde",
"serde_json",
"serde_urlencoded",
"sha-1 0.10.0",
"sync_wrapper",
"tokio",
"tokio-tungstenite",
"tower",
"tower-http",
"tower-layer",
"tower-service",
]
[[package]]
name = "axum-core"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf4d047478b986f14a13edad31a009e2e05cb241f9805d0d75e4cba4e129ad4d"
dependencies = [
"async-trait",
"bytes",
"futures-util",
"http",
"http-body",
"mime",
]
[[package]] [[package]]
name = "backtrace" name = "backtrace"
version = "0.3.65" version = "0.3.65"
@@ -512,6 +569,12 @@ version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3"
[[package]]
name = "convert_case"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb4a24b1aaf0fd0ce8b45161144d6f42cd91677fd5940fd431183eb023b3a2b8"
[[package]] [[package]]
name = "core-foundation" name = "core-foundation"
version = "0.9.3" version = "0.9.3"
@@ -706,8 +769,28 @@ version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858"
dependencies = [ dependencies = [
"darling_core", "darling_core 0.10.2",
"darling_macro", "darling_macro 0.10.2",
]
[[package]]
name = "darling"
version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c"
dependencies = [
"darling_core 0.13.4",
"darling_macro 0.13.4",
]
[[package]]
name = "darling"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4529658bdda7fd6769b8614be250cdcfc3aeb0ee72fe66f9e41e5e5eb73eac02"
dependencies = [
"darling_core 0.14.1",
"darling_macro 0.14.1",
] ]
[[package]] [[package]]
@@ -720,7 +803,35 @@ dependencies = [
"ident_case", "ident_case",
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim", "strsim 0.9.3",
"syn",
]
[[package]]
name = "darling_core"
version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
"strsim 0.10.0",
"syn",
]
[[package]]
name = "darling_core"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "649c91bc01e8b1eac09fb91e8dbc7d517684ca6be8ebc75bb9cafc894f9fdb6f"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
"strsim 0.10.0",
"syn", "syn",
] ]
@@ -730,7 +841,29 @@ version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
dependencies = [ dependencies = [
"darling_core", "darling_core 0.10.2",
"quote",
"syn",
]
[[package]]
name = "darling_macro"
version = "0.13.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835"
dependencies = [
"darling_core 0.13.4",
"quote",
"syn",
]
[[package]]
name = "darling_macro"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddfc69c5bfcbd2fc09a0f38451d2daf0e372e367986a83906d1b0dbc88134fb5"
dependencies = [
"darling_core 0.14.1",
"quote", "quote",
"syn", "syn",
] ]
@@ -822,6 +955,26 @@ dependencies = [
"uuid 1.1.2", "uuid 1.1.2",
] ]
[[package]]
name = "deltachat-jsonrpc"
version = "1.86.0"
dependencies = [
"anyhow",
"async-channel",
"axum",
"deltachat",
"env_logger 0.9.0",
"futures",
"log",
"num-traits",
"serde",
"serde_json",
"tempfile",
"tokio",
"typescript-type-def",
"yerpc",
]
[[package]] [[package]]
name = "deltachat_derive" name = "deltachat_derive"
version = "2.0.0" version = "2.0.0"
@@ -836,6 +989,7 @@ version = "1.87.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"deltachat", "deltachat",
"deltachat-jsonrpc",
"human-panic", "human-panic",
"libc", "libc",
"num-traits", "num-traits",
@@ -863,7 +1017,7 @@ version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0"
dependencies = [ dependencies = [
"darling", "darling 0.10.2",
"derive_builder_core", "derive_builder_core",
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -876,7 +1030,7 @@ version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef"
dependencies = [ dependencies = [
"darling", "darling 0.10.2",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn",
@@ -1130,7 +1284,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
dependencies = [ dependencies = [
"atty", "atty",
"humantime", "humantime 1.3.0",
"log",
"regex",
"termcolor",
]
[[package]]
name = "env_logger"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3"
dependencies = [
"atty",
"humantime 2.1.0",
"log", "log",
"regex", "regex",
"termcolor", "termcolor",
@@ -1544,6 +1711,12 @@ dependencies = [
"pin-project-lite", "pin-project-lite",
] ]
[[package]]
name = "http-range-header"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29"
[[package]] [[package]]
name = "httparse" name = "httparse"
version = "1.7.1" version = "1.7.1"
@@ -1586,6 +1759,12 @@ dependencies = [
"quick-error 1.2.3", "quick-error 1.2.3",
] ]
[[package]]
name = "humantime"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]] [[package]]
name = "hyper" name = "hyper"
version = "0.14.19" version = "0.14.19"
@@ -1880,6 +2059,12 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
[[package]]
name = "matchit"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb"
[[package]] [[package]]
name = "md-5" name = "md-5"
version = "0.9.1" version = "0.9.1"
@@ -2406,7 +2591,7 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d"
dependencies = [ dependencies = [
"env_logger", "env_logger 0.7.1",
"log", "log",
] ]
@@ -3045,6 +3230,15 @@ dependencies = [
"opaque-debug", "opaque-debug",
] ]
[[package]]
name = "signal-hook-registry"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "signature" name = "signature"
version = "1.5.0" version = "1.5.0"
@@ -3125,6 +3319,12 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c"
[[package]]
name = "strsim"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]] [[package]]
name = "strum" name = "strum"
version = "0.24.1" version = "0.24.1"
@@ -3161,6 +3361,12 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "sync_wrapper"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8"
[[package]] [[package]]
name = "synstructure" name = "synstructure"
version = "0.12.6" version = "0.12.6"
@@ -3292,6 +3498,7 @@ dependencies = [
"once_cell", "once_cell",
"parking_lot", "parking_lot",
"pin-project-lite", "pin-project-lite",
"signal-hook-registry",
"socket2", "socket2",
"tokio-macros", "tokio-macros",
"winapi", "winapi",
@@ -3344,6 +3551,18 @@ dependencies = [
"xattr", "xattr",
] ]
[[package]]
name = "tokio-tungstenite"
version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06cda1232a49558c46f8a504d5b93101d42c0bf7f911f12a105ba48168f821ae"
dependencies = [
"futures-util",
"log",
"tokio",
"tungstenite",
]
[[package]] [[package]]
name = "tokio-util" name = "tokio-util"
version = "0.7.3" version = "0.7.3"
@@ -3367,6 +3586,47 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "tower"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
dependencies = [
"futures-core",
"futures-util",
"pin-project",
"pin-project-lite",
"tokio",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "tower-http"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba"
dependencies = [
"bitflags",
"bytes",
"futures-core",
"futures-util",
"http",
"http-body",
"http-range-header",
"pin-project-lite",
"tower",
"tower-layer",
"tower-service",
]
[[package]]
name = "tower-layer"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62"
[[package]] [[package]]
name = "tower-service" name = "tower-service"
version = "0.3.2" version = "0.3.2"
@@ -3380,10 +3640,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"log",
"pin-project-lite", "pin-project-lite",
"tracing-attributes",
"tracing-core", "tracing-core",
] ]
[[package]]
name = "tracing-attributes"
version = "0.1.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "tracing-core" name = "tracing-core"
version = "0.1.28" version = "0.1.28"
@@ -3444,6 +3717,25 @@ version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
[[package]]
name = "tungstenite"
version = "0.17.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d96a2dea40e7570482f28eb57afbe42d97551905da6a9400acc5c328d24004f5"
dependencies = [
"base64 0.13.0",
"byteorder",
"bytes",
"http",
"httparse",
"log",
"rand 0.8.5",
"sha-1 0.10.0",
"thiserror",
"url",
"utf-8",
]
[[package]] [[package]]
name = "twofish" name = "twofish"
version = "0.6.0" version = "0.6.0"
@@ -3461,6 +3753,30 @@ version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
[[package]]
name = "typescript-type-def"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b4d7f4a1cf8923b722bd56456e0dd560869a37fb849169f18b848f261f01b96"
dependencies = [
"serde_json",
"typescript-type-def-derive",
]
[[package]]
name = "typescript-type-def-derive"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8a8b246d662eb07a8627513dc78bad0b79da6d05e8224ecd559963efc597af0"
dependencies = [
"darling 0.13.4",
"ident_case",
"proc-macro-error",
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "unicode-bidi" name = "unicode-bidi"
version = "0.3.8" version = "0.3.8"
@@ -3521,6 +3837,12 @@ dependencies = [
"percent-encoding", "percent-encoding",
] ]
[[package]]
name = "utf-8"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
[[package]] [[package]]
name = "utf8parse" name = "utf8parse"
version = "0.2.0" version = "0.2.0"
@@ -3809,6 +4131,41 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "yerpc"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d1baa6fce4cf16d1cff91b557baceac3e363106f66e555fff906a7f82dce8153"
dependencies = [
"anyhow",
"async-channel",
"async-mutex",
"async-trait",
"axum",
"futures",
"futures-util",
"log",
"serde",
"serde_json",
"tokio",
"tracing",
"typescript-type-def",
"yerpc_derive",
]
[[package]]
name = "yerpc_derive"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e70f944ca6789bc55ddc86839478f6d49c9d2a66e130f69fd1f8d171b3108990"
dependencies = [
"convert_case",
"darling 0.14.1",
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "zeroize" name = "zeroize"
version = "1.5.6" version = "1.5.6"

View File

@@ -13,7 +13,6 @@ required-features = ["webserver"]
[dependencies] [dependencies]
anyhow = "1" anyhow = "1"
async-std = { version = "1", features = ["attributes"] }
deltachat = { path = ".." } deltachat = { path = ".." }
num-traits = "0.2" num-traits = "0.2"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
@@ -22,18 +21,21 @@ log = "0.4"
async-channel = { version = "1.6.1" } async-channel = { version = "1.6.1" }
futures = { version = "0.3.19" } futures = { version = "0.3.19" }
serde_json = "1.0.75" serde_json = "1.0.75"
yerpc = { git = "https://github.com/Frando/yerpc", features = ["anyhow"] } yerpc = { version = "0.3", features = ["anyhow"] }
typescript-type-def = { git = "https://github.com/Frando/rust-typescript-type-def", branch = "yerpc", features = ["json_value"] } typescript-type-def = { version = "0.5.3", features = ["json_value"] }
# optional, depended on features tokio = { version = "1.19.2" }
# optional dependencies
axum = { version = "0.5.9", optional = true, features = ["ws"] }
env_logger = { version = "0.9.0", optional = true } env_logger = { version = "0.9.0", optional = true }
tide = { version = "0.16.0", optional = true }
tide-websockets = { version = "0.4.0", optional = true } [dev-dependencies]
yerpc-tide = { git = "https://github.com/Frando/yerpc", optional = true } tokio = { version = "1.19.2", features = ["full", "rt-multi-thread"] }
[features] [features]
default = [] default = []
webserver = ["env_logger", "tide", "tide-websockets", "yerpc-tide"] webserver = ["env_logger", "axum", "tokio/full", "yerpc/support-axum"]
[profile.release] [profile.release]
lto = true lto = true

View File

@@ -1,5 +1,4 @@
use anyhow::{anyhow, bail, Context, Result}; use anyhow::{anyhow, bail, Context, Result};
use async_std::sync::{Arc, RwLock};
use deltachat::{ use deltachat::{
chat::{get_chat_msgs, ChatId}, chat::{get_chat_msgs, ChatId},
chatlist::Chatlist, chatlist::Chatlist,
@@ -10,7 +9,9 @@ use deltachat::{
provider::get_provider_info, provider::get_provider_info,
}; };
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::sync::Arc;
use std::{collections::HashMap, str::FromStr}; use std::{collections::HashMap, str::FromStr};
use tokio::sync::RwLock;
use yerpc::rpc; use yerpc::rpc;
pub use deltachat::accounts::Accounts; pub use deltachat::accounts::Accounts;

View File

@@ -1,18 +1,16 @@
pub mod api; pub mod api;
pub use api::events; pub use api::events;
pub use yerpc; pub use yerpc;
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::api::{Accounts, CommandApi}; use super::api::{Accounts, CommandApi};
use async_channel::unbounded; use async_channel::unbounded;
use async_std::task;
use futures::StreamExt; use futures::StreamExt;
use tempfile::TempDir; use tempfile::TempDir;
use yerpc::{MessageHandle, RpcHandle}; use yerpc::{RpcClient, RpcSession};
#[async_std::test] #[tokio::test(flavor = "multi_thread")]
async fn basic_json_rpc_functionality() -> anyhow::Result<()> { async fn basic_json_rpc_functionality() -> anyhow::Result<()> {
// println!("{}", ""); // println!("{}", "");
let tmp_dir = TempDir::new().unwrap().path().into(); let tmp_dir = TempDir::new().unwrap().path().into();
@@ -23,10 +21,10 @@ mod tests {
let (sender, mut receiver) = unbounded::<String>(); let (sender, mut receiver) = unbounded::<String>();
let (request_handle, mut rx) = RpcHandle::new(); let (client, mut rx) = RpcClient::new();
let session = cmd_api; let session = cmd_api;
let handle = MessageHandle::new(request_handle, session); let handle = RpcSession::new(client, session);
task::spawn({ tokio::spawn({
async move { async move {
while let Some(message) = rx.next().await { while let Some(message) = rx.next().await {
let message = serde_json::to_string(&message)?; let message = serde_json::to_string(&message)?;
@@ -41,7 +39,7 @@ mod tests {
{ {
let request = r#"{"jsonrpc":"2.0","method":"add_account","params":[],"id":1}"#; let request = r#"{"jsonrpc":"2.0","method":"add_account","params":[],"id":1}"#;
let response = r#"{"jsonrpc":"2.0","id":1,"result":1}"#; let response = r#"{"jsonrpc":"2.0","id":1,"result":1}"#;
handle.handle_message(request).await; handle.handle_incoming(request).await;
let result = receiver.next().await; let result = receiver.next().await;
println!("{:?}", result); println!("{:?}", result);
assert_eq!(result, Some(response.to_owned())); assert_eq!(result, Some(response.to_owned()));
@@ -49,7 +47,7 @@ mod tests {
{ {
let request = r#"{"jsonrpc":"2.0","method":"get_all_account_ids","params":[],"id":2}"#; let request = r#"{"jsonrpc":"2.0","method":"get_all_account_ids","params":[],"id":2}"#;
let response = r#"{"jsonrpc":"2.0","id":2,"result":[1]}"#; let response = r#"{"jsonrpc":"2.0","id":2,"result":[1]}"#;
handle.handle_message(request).await; handle.handle_incoming(request).await;
let result = receiver.next().await; let result = receiver.next().await;
println!("{:?}", result); println!("{:?}", result);
assert_eq!(result, Some(response.to_owned())); assert_eq!(result, Some(response.to_owned()));

View File

@@ -1,44 +1,43 @@
use async_std::path::PathBuf; use axum::{extract::ws::WebSocketUpgrade, response::Response, routing::get, Extension, Router};
use async_std::task; use std::net::SocketAddr;
use tide::Request; use std::path::PathBuf;
use yerpc::RpcHandle; use yerpc::axum::handle_ws_rpc;
use yerpc_tide::yerpc_handler; use yerpc::{RpcClient, RpcSession};
mod api; mod api;
use api::events::event_to_json_rpc_notification; use api::events::event_to_json_rpc_notification;
use api::{Accounts, CommandApi}; use api::{Accounts, CommandApi};
#[async_std::main] #[tokio::main]
async fn main() -> Result<(), std::io::Error> { async fn main() -> Result<(), std::io::Error> {
env_logger::init(); env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
log::info!("Starting"); let path = std::env::var("DC_ACCOUNTS_PATH").unwrap_or_else(|_| "./accounts".to_string());
log::info!("Starting with accounts directory `{path}`.");
let accounts = Accounts::new(PathBuf::from("./accounts")).await.unwrap(); let accounts = Accounts::new(PathBuf::from(&path)).await.unwrap();
let state = CommandApi::new(accounts); let state = CommandApi::new(accounts);
let app = Router::new()
let mut app = tide::with_state(state.clone()); .route("/ws", get(handler))
app.at("/ws").get(yerpc_handler(request_handler)); .layer(Extension(state.clone()));
let addr = SocketAddr::from(([127, 0, 0, 1], 20808));
state.accounts.read().await.start_io().await; state.accounts.read().await.start_io().await;
app.listen("127.0.0.1:20808").await?; log::info!("JSON-RPC WebSocket server listening on {}", addr);
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
Ok(()) Ok(())
} }
async fn request_handler(
request: Request<CommandApi>,
rpc: RpcHandle,
) -> anyhow::Result<CommandApi> {
let state = request.state().clone();
task::spawn(event_loop(state.clone(), rpc));
Ok(state)
}
async fn event_loop(state: CommandApi, rpc: RpcHandle) -> anyhow::Result<()> { async fn handler(ws: WebSocketUpgrade, Extension(api): Extension<CommandApi>) -> Response {
let events = state.accounts.read().await.get_event_emitter().await; let (client, out_receiver) = RpcClient::new();
while let Some(event) = events.recv().await { let session = RpcSession::new(client.clone(), api.clone());
// log::debug!("event {:?}", event); tokio::spawn(async move {
let event = event_to_json_rpc_notification(event); let events = api.accounts.read().await.get_event_emitter().await;
rpc.notify("event", Some(event)).await?; while let Some(event) = events.recv().await {
} let event = event_to_json_rpc_notification(event);
Ok(()) client.send_notification("event", Some(event)).await.ok();
}
});
handle_ws_rpc(ws, out_receiver, session).await
} }

View File

@@ -20,7 +20,7 @@
"dependencies": { "dependencies": {
"isomorphic-ws": "^4.0.1", "isomorphic-ws": "^4.0.1",
"tiny-emitter": "git+https://github.com/Simon-Laux/tiny-emitter.git", "tiny-emitter": "git+https://github.com/Simon-Laux/tiny-emitter.git",
"yerpc": "^0.2.3" "yerpc": "^0.3"
}, },
"devDependencies": { "devDependencies": {
"prettier": "^2.6.2", "prettier": "^2.6.2",