diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..5812140 Binary files /dev/null and b/.DS_Store differ diff --git a/Cargo.toml b/Cargo.toml index 267fb53..ca7e6ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,21 +1,21 @@ [package] name = "voxa-server" -version = "0.1.0" +version = "0.1.0-beta2" edition = "2024" [dependencies] anyhow = "1.0.99" base64 = "0.22.1" chrono = "0.4.42" -libloading = { version = "0.8.8", optional = true } once_cell = "1.21.3" rand = "0.9.2" rusqlite = "0.37.0" +rustyline = "17.0.2" serde = { version = "1.0.219", features = ["serde_derive"] } serde_json = "1.0.143" sha1 = "0.10.6" ureq = "3.1.2" +zip = "7.0.0" [features] default = [] -loader = ["libloading"] diff --git a/cli/Cargo.lock b/cli/Cargo.lock deleted file mode 100644 index dcf1d71..0000000 --- a/cli/Cargo.lock +++ /dev/null @@ -1,993 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bitflags" -version = "2.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "cc" -version = "1.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" -dependencies = [ - "find-msvc-tools", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" - -[[package]] -name = "chrono" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-link 0.2.0", -] - -[[package]] -name = "cli" -version = "0.1.0" -dependencies = [ - "voxa-server", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - -[[package]] -name = "fallible-streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" - -[[package]] -name = "find-msvc-tools" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" - -[[package]] -name = "flate2" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.7+wasi-0.2.4", -] - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash", -] - -[[package]] -name = "hashlink" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" -dependencies = [ - "hashbrown", -] - -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "iana-time-zone" -version = "0.1.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "js-sys" -version = "0.3.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "libc" -version = "0.2.175" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" - -[[package]] -name = "libloading" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" -dependencies = [ - "cfg-if", - "windows-targets 0.53.3", -] - -[[package]] -name = "libsqlite3-sys" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" -dependencies = [ - "pkg-config", - "vcpkg", -] - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "memchr" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.3", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys", -] - -[[package]] -name = "rusqlite" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" -dependencies = [ - "bitflags", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink", - "libsqlite3-sys", - "smallvec", -] - -[[package]] -name = "rustls" -version = "0.23.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.143" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "2.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "ureq" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ba1025f18a4a3fc3e9b48c868e9beb4f24f4b4b1a325bada26bd4119f46537" -dependencies = [ - "base64", - "flate2", - "log", - "percent-encoding", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "ureq-proto", - "utf-8", - "webpki-roots", -] - -[[package]] -name = "ureq-proto" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b4531c118335662134346048ddb0e54cc86bd7e81866757873055f0e38f5d2" -dependencies = [ - "base64", - "http", - "httparse", - "log", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "voxa-server" -version = "0.1.0" -dependencies = [ - "anyhow", - "base64", - "chrono", - "libloading", - "once_cell", - "rand", - "rusqlite", - "serde", - "serde_json", - "sha1", - "ureq", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - -[[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "webpki-roots" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "windows-core" -version = "0.62.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.2.0", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" - -[[package]] -name = "windows-result" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" -dependencies = [ - "windows-link 0.2.0", -] - -[[package]] -name = "windows-strings" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" -dependencies = [ - "windows-link 0.2.0", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" -dependencies = [ - "windows-link 0.1.3", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "wit-bindgen" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - -[[package]] -name = "zerocopy" -version = "0.8.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/cli/Cargo.toml b/cli/Cargo.toml deleted file mode 100644 index 6f32728..0000000 --- a/cli/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "cli" -version = "0.1.0" -edition = "2024" - -[dependencies] -voxa-server = { path = "../", features = ["loader"]} diff --git a/client.js b/client.js deleted file mode 100644 index 9afc910..0000000 --- a/client.js +++ /dev/null @@ -1,58 +0,0 @@ -import readline from 'readline'; - -async function createServerToken() { - return (await (await fetch('http://localhost:3000/api/auth', { - method: 'POST', - body: JSON.stringify({ - intents: 'server', - server_ip: '127.0.0.1' - }) - })).json()).token; -} - -const token = await createServerToken(); - -const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout -}); - -const ws = new WebSocket('ws://localhost:7080'); - -ws.onopen = () => { - console.log('WebSocket connection established'); - console.log('Initializing handshake'); - ws.send(JSON.stringify({ version: '0.0.1', auth_token: token })) -}; - -ws.onmessage = (event) => { - const message = JSON.parse(event.data); - if (message.type === 'authenticated') { - console.log('Logged in with uuid: ' + message.params.messages); - console.log(message.params.messages); - } - console.log('Received:', message); - // ws.close(); -}; - -function sendMessage(message) { - ws.send(JSON.stringify({ type: 'send_message', params: { - channel_id: 'general', - contents: message - }})); -} - -function ask(question) { - return new Promise((resolve) => { - rl.question(question, resolve); - }); -} - -while (true) { - const message = await ask(''); - if (message === 'q') { - ws.close(); - process.exit(); - } - sendMessage(message); -} \ No newline at end of file diff --git a/plugin-schema.json b/plugin-schema.json new file mode 100644 index 0000000..73a839f --- /dev/null +++ b/plugin-schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "required": [ + "id", + "version", + "supported_versions", + "file", + "args" + ], + "properties": { + "$schema": { + "type": "string", + "description": "Path or URL to the plugin schema" + }, + "id": { + "type": "string", + "description": "Unique plugin identifier", + "minLength": 1 + }, + "version": { + "type": "string", + "description": "Plugin version", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "supported_versions": { + "type": "array", + "description": "List of supported host versions", + "items": { + "type": "string" + } + }, + "file": { + "type": "string", + "description": "Executable or runtime used to launch the plugin" + }, + "args": { + "type": "array", + "description": "Arguments passed to the executable", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false +} diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..794d3dd --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,210 @@ +use std::{ + fs::{self, File}, + path::PathBuf, + str::FromStr, + sync::Arc, +}; + +use rustyline::{DefaultEditor, error::ReadlineError}; +use zip::ZipArchive; + +use crate::{logger, plugin::loader::PluginLoader, server::Server}; + +logger!(LOGGER "CLI"); + +macro_rules! commands { + (($cmdi:expr) $($cmd:literal $desc:literal => $body:block)*) => { + match $cmdi { + "help" => { + LOGGER.info("List of commands:"); + $( + println!("\x1b[34m{}\x1b[0m: {}", $cmd, format!($desc)); + )* + }, + $($cmd => $body)* + _ => LOGGER.error(format!("Command not found: {}", $cmdi)), + } + }; +} + +pub fn parse_args(input: &str) -> Vec { + let mut args = Vec::new(); + let mut current = String::new(); + + let mut in_dq = false; + let mut in_q = false; + let mut escape = false; + + for c in input.chars() { + if escape { + current.push(c); + escape = false; + continue; + } + + match c { + '\\' => { + escape = true; + } + '"' if !in_q && !escape => { + in_dq = !in_dq; + } + '\'' if !in_dq && !escape => { + in_q = !in_q; + } + ' ' if !in_dq && !in_q => { + if !current.is_empty() { + args.push(current.clone()); + current.clear(); + } + } + _ => { + current.push(c); + } + } + } + + if escape { + current.push('\\'); + } + + if !current.is_empty() { + args.push(current); + } + + args +} + +pub fn require_args(args: &[String], required: &[&str]) -> bool { + if required.len() + 1 > args.len() { + LOGGER.error(format!("Required arguments: {}", required.join(" "))); + return false; + } + + true +} + +pub fn start_cli(server: Arc, plugin_loader: PluginLoader) { + std::thread::spawn(move || { + let mut rl = DefaultEditor::new().unwrap(); + + loop { + let line = match rl.readline("\n> ") { + Ok(line) => { + rl.add_history_entry(line.as_str()).ok(); + line + } + Err(ReadlineError::Interrupted) => continue, + Err(ReadlineError::Eof) => break, + Err(err) => { + LOGGER.error(format!("CLI error: {:?}", err)); + break; + } + }; + + let args = parse_args(line.trim()); + if args.is_empty() { + continue; + } + + commands! { + (args[0].as_str()) + "install" "Installs the specified plugin .vxp package" => { + if require_args(&args, &[""]) { + let path = PathBuf::from_str(&args[1]).unwrap(); + if path.extension().and_then(|s| s.to_str()) == Some("vxp") { + LOGGER.info(format!("Installing {:?}", path)); + let d = path.with_extension(""); + if !d.exists() { + let file = File::open(&path).unwrap(); + let mut archive = ZipArchive::new(file).unwrap(); + archive.extract(&d).unwrap(); + } + LOGGER.info("Installed"); + } else { + LOGGER.error("File must be .vxp"); + } + } + } + "load" "loads a plugin that has been installed" => { + if require_args(&args, &[""]) { + let mut p = plugin_loader.load(&server.root.join("plugins").join(&args[1])); + let s = server.clone(); + server.plugins.lock().unwrap().push(p.clone()); + std::thread::spawn(move || p.run(&s)); + } + } + "stop" "stops a plugin that has been installed" => { + if require_args(&args, &[""]) { + let target = args[1].as_str(); + let mut stopped_plugins = Vec::new(); + + plugin_loader.remove(target); + for (i, plugin) in server.plugins.lock().unwrap().iter_mut().enumerate() { + if plugin.get_id() == target { + LOGGER.info("Stopping plugin"); + if let Err(e) = plugin.stop() { + LOGGER.warn(e.context("Couldn't stop plugin")); + } + stopped_plugins.push(i); + } + } + + for i in stopped_plugins { + server.plugins.lock().unwrap().remove(i); + } + LOGGER.info("Plugin stopped!"); + } + } + "reload" "restarts a plugin that has been installed" => { + if require_args(&args, &[""]) { + let target = args[1].as_str(); + let mut stopped_plugins = Vec::new(); + + plugin_loader.remove(target); + for (i, plugin) in server.plugins.lock().unwrap().iter_mut().enumerate() { + if plugin.get_id() == target { + LOGGER.info("Stopping plugin"); + if let Err(e) = plugin.stop() { + LOGGER.warn(e.context("Couldn't stop plugin")); + } + stopped_plugins.push(i); + } + } + + for i in stopped_plugins { + server.plugins.lock().unwrap().remove(i); + } + + let mut p = plugin_loader.load(&server.root.join("plugins").join(&args[1])); + let s = server.clone(); + server.plugins.lock().unwrap().push(p.clone()); + std::thread::spawn(move || p.run(&s)); + } + } + "reload-all" "reloads all of the plugins" => { + LOGGER.info("Stopping all plugins"); + for plugin in server.plugins.lock().unwrap().iter_mut() { + LOGGER.info(format!("Stopping plugin '{}'", plugin.get_id())); + if let Err(e) = plugin.stop() { + LOGGER.warn(e.context(format!("Couldn't stop plugin '{}'", plugin.get_id()))); + } + } + + server.plugins.lock().unwrap().clear(); + plugin_loader.clear(); + + plugin_loader.load_all(&server); + } + "shutdown" "Softly shuts the server down, may not fully shut everything down" => { + server.shutdown(); + break; + } + + "ping" "replies with pong" => { + LOGGER.info("pong"); + } + }; + } + }); +} diff --git a/src/macros.rs b/src/macros.rs index fd1d31e..438d315 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -1,21 +1,13 @@ -#[macro_export] -macro_rules! export_plugin { - ($p:expr) => { - #[unsafe(no_mangle)] - pub extern "C" fn load_plugin() -> $crate::utils::plugin::DynPlugin { - $p - } - }; -} - #[macro_export] macro_rules! logger { (const $i:ident $name:expr) => { + #[allow(unused)] pub const $i: $crate::once_cell::sync::Lazy<$crate::utils::logger::Logger> = $crate::once_cell::sync::Lazy::new(|| $crate::utils::logger::Logger::new($name)); }; ($i:ident $name:expr) => { + #[allow(unused)] pub const $i: $crate::once_cell::sync::Lazy<$crate::utils::logger::Logger> = $crate::once_cell::sync::Lazy::new(|| $crate::utils::logger::Logger::new($name)); }; diff --git a/cli/src/main.rs b/src/main.rs similarity index 56% rename from cli/src/main.rs rename to src/main.rs index 1e5c9a7..c5d1570 100644 --- a/cli/src/main.rs +++ b/src/main.rs @@ -1,8 +1,21 @@ +mod cli; +mod macros; +mod plugin; +mod requests; +mod server; +mod types; +mod utils; + use std::path::PathBuf; -use voxa_server::{ServerConfig, utils::vfs}; +use server::ServerConfig; +use utils::vfs; -fn main() -> voxa_server::Result<()> { +pub use anyhow::Context as ErrorContext; +pub use anyhow::Result; +pub use once_cell; + +fn main() -> Result<()> { let root = PathBuf::from(""); let config: ServerConfig = if let Ok(env_config) = std::env::var("VX_CONFIG") { ServerConfig::from_str(&env_config)? diff --git a/src/plugin/loader.rs b/src/plugin/loader.rs new file mode 100644 index 0000000..8c9754f --- /dev/null +++ b/src/plugin/loader.rs @@ -0,0 +1,123 @@ +use crate::{ + logger, + plugin::{ + Plugin, + types::{PluginHandshake, PluginJson}, + }, + server::Server, +}; +use std::{ + collections::HashMap, + fs, + io::{BufRead, BufReader}, + net::{TcpListener, TcpStream}, + path::Path, + process::Command, + sync::{Arc, Mutex}, +}; + +logger!(LOGGER "Plugin Loader"); + +pub struct PluginLoader { + plugin_clients: Arc>>, +} + +impl PluginLoader { + pub fn new() -> Self { + Self { + plugin_clients: Arc::new(Mutex::new(HashMap::new())), + } + } + + pub fn load(&self, path: &Path) -> Plugin { + let json_string = fs::read_to_string(path.join("plugin.json")).unwrap(); + let plugin_json: PluginJson = serde_json::from_str(&json_string).unwrap(); + LOGGER.info(format!("Loading {}", plugin_json.id)); + + let child = Arc::new(Mutex::new( + Command::new(plugin_json.file) + .args(plugin_json.args) + .current_dir(path) + .spawn() + .unwrap(), + )); + + while self + .plugin_clients + .lock() + .unwrap() + .get(&plugin_json.id) + .is_none() + {} + LOGGER.info(format!("Loaded {}", plugin_json.id)); + let a = self + .plugin_clients + .lock() + .unwrap() + .get(&plugin_json.id) + .unwrap() + .try_clone() + .unwrap(); + Plugin { + stream: a.try_clone().unwrap(), + reader: BufReader::new(a), + id: plugin_json.id, + child, + } + } + + pub fn start_server(&self) { + let plugin_clients = self.plugin_clients.clone(); + let listener = TcpListener::bind("0.0.0.0:7243").unwrap(); + + std::thread::spawn(move || { + for stream in listener.incoming() { + let stream = stream.unwrap(); + let mut reader = BufReader::new(&stream); + let mut s = String::new(); + reader.read_line(&mut s).unwrap(); + let plugin_handshake: PluginHandshake = serde_json::from_str(&s).unwrap(); + plugin_clients + .lock() + .unwrap() + .insert(plugin_handshake.id, stream); + } + }); + } + + pub fn remove(&self, plugin_id: &str) { + self.plugin_clients.lock().unwrap().remove(plugin_id); + } + + pub fn clear(&self) { + self.plugin_clients.lock().unwrap().clear(); + } + + pub fn load_all(&self, server: &Arc) { + // Load plugins + LOGGER.info("Loading plugins"); + for entry in fs::read_dir(server.root.join("plugins")).unwrap() { + let entry = entry.unwrap(); + let path = entry.path(); + + if path.is_dir() { + let mut p = self.load(&path); + let s = server.clone(); + server.plugins.lock().unwrap().push(p.clone()); + std::thread::spawn(move || p.run(&s)); + } + } + LOGGER.info("Plugins loaded"); + } +} + +impl Clone for Plugin { + fn clone(&self) -> Self { + Plugin { + stream: self.stream.try_clone().unwrap(), + reader: BufReader::new(self.stream.try_clone().unwrap()), + id: self.id.clone(), + child: self.child.clone(), + } + } +} diff --git a/src/plugin/mod.rs b/src/plugin/mod.rs new file mode 100644 index 0000000..2561eb6 --- /dev/null +++ b/src/plugin/mod.rs @@ -0,0 +1,76 @@ +pub mod loader; +pub mod types; + +use std::{ + io::{BufRead, BufReader, Write}, + net::TcpStream, + process::Child, + sync::{Arc, Mutex}, +}; + +use crate::{ + plugin::types::{LoaderMessage, PluginMessage}, + server::Server, + types::message::ServerMessage, +}; + +pub struct Plugin { + stream: TcpStream, + reader: BufReader, + id: String, + child: Arc>, +} + +impl Plugin { + pub fn send(&mut self, m: &LoaderMessage) -> crate::Result<()> { + self.stream + .write(serde_json::to_string(&m).unwrap().as_bytes())?; + Ok(()) + } + + pub fn read(&mut self) -> crate::Result { + let mut buf = String::new(); + self.reader.read_line(&mut buf)?; + Ok(serde_json::from_str(&buf)?) + } + + pub fn run(&mut self, server: &Arc) -> crate::Result<()> { + loop { + match self.read()? { + PluginMessage::SendMessage { + channel_id, + contents, + } => { + let msg = server.db.insert_message( + &channel_id, + &self.id, + &contents, + chrono::Utc::now().timestamp(), + )?; + + for c in server.clients.lock().unwrap().iter() { + let c = c.clone(); + let server = server.clone(); + let msg = msg.clone(); + std::thread::spawn(move || { + server + .wrap_err(&c, c.send(ServerMessage::MessageCreate(msg))) + .expect("Failed to broadcast"); + }); + } + } + } + } + } + + pub fn stop(&mut self) -> crate::Result<()> { + self.send(&LoaderMessage::Shutdown)?; + self.stream.shutdown(std::net::Shutdown::Both)?; + self.child.lock().unwrap().kill()?; + Ok(()) + } + + pub fn get_id(&self) -> String { + self.id.clone() + } +} diff --git a/src/plugin/types.rs b/src/plugin/types.rs new file mode 100644 index 0000000..7c7d076 --- /dev/null +++ b/src/plugin/types.rs @@ -0,0 +1,45 @@ +use serde::{Deserialize, Serialize}; + +use crate::types::{ + data::Message, + message::{ClientMessage, WsMessage}, +}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct PluginJson { + pub id: String, + pub version: String, + pub supported_versions: Vec, + pub file: String, + pub args: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct PluginHandshake { + pub id: String, +} + +#[derive(Debug, Clone, Serialize)] +#[serde(tag = "type", content = "params", rename_all = "snake_case")] +pub enum LoaderMessage { + Request { + user_id: String, + msg: WsMessage, + }, + + MessageSent { + user_id: String, + msg: Message, + }, + + Shutdown, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type", content = "params", rename_all = "snake_case")] +pub enum PluginMessage { + SendMessage { + channel_id: String, + contents: String, + }, +} diff --git a/src/requests/message.rs b/src/requests/message.rs index 14e52d8..29c32dd 100644 --- a/src/requests/message.rs +++ b/src/requests/message.rs @@ -1,6 +1,8 @@ use std::sync::Arc; -use crate::{Server, types, utils::client::Client}; +use anyhow::anyhow; + +use crate::{plugin::types::LoaderMessage, server::Server, types, utils::client::Client}; crate::logger!(LOGGER "Message Manager"); @@ -43,20 +45,43 @@ pub fn send( }); } + server.send_plugin_message(&LoaderMessage::MessageSent { + user_id: client.get_uuid().unwrap_or_default(), + msg: msg, + })?; + Ok(()) } pub fn edit( - _server: &Arc, - _client: &Client, - message_id: usize, + server: &Arc, + client: &Client, + message_id: i64, new_contents: &str, ) -> crate::Result<()> { LOGGER.info(format!("EditMessage {message_id}: {new_contents}")); + let Some(msg) = server.db.get_message_by_id(message_id)? else { + return Err(anyhow!("Message does not exist")); + }; + + if msg.from != client.get_uuid()? { + return Err(anyhow!("You are not the author of this message")); + } + + server.db.edit_message(message_id, new_contents)?; Ok(()) } -pub fn delete(_server: &Arc, _client: &Client, message_id: usize) -> crate::Result<()> { +pub fn delete(server: &Arc, client: &Client, message_id: i64) -> crate::Result<()> { LOGGER.info(format!("DeleteMessage {message_id}")); + let Some(msg) = server.db.get_message_by_id(message_id)? else { + return Err(anyhow!("Message does not exist")); + }; + + if msg.from != client.get_uuid()? { + return Err(anyhow!("You are not the author of this message")); + } + + server.db.delete_message(message_id)?; Ok(()) } diff --git a/src/requests/mod.rs b/src/requests/mod.rs index a73b0a1..9faa764 100644 --- a/src/requests/mod.rs +++ b/src/requests/mod.rs @@ -3,7 +3,7 @@ pub mod message; use std::sync::Arc; use crate::{ - Server, + server::Server, types::message::{ClientMessage, WsMessage}, utils::client::Client, }; diff --git a/src/lib.rs b/src/server.rs similarity index 61% rename from src/lib.rs rename to src/server.rs index ea0cb2b..1eeb28a 100644 --- a/src/lib.rs +++ b/src/server.rs @@ -1,21 +1,33 @@ use std::{ collections::HashSet, + fs::{self}, net::{TcpListener, TcpStream}, path::{Path, PathBuf}, - sync::{Arc, Mutex}, + sync::{ + Arc, Mutex, + atomic::{AtomicBool, Ordering}, + }, }; -pub mod auth; -pub mod macros; -pub mod requests; -pub mod types; -pub mod utils; +const WELCOME: &str = " -pub use anyhow::Context as ErrorContext; -pub use anyhow::Result; +$$\\ $$\\ $$$$$$\\ $$\\ $$\\ $$$$$$\\ +$$ | $$ |$$ __$$\\ $$ | $$ |$$ __$$\\ +$$ | $$ |$$ / $$ |\\$$\\ $$ |$$ / $$ | +\\$$\\ $$ |$$ | $$ | \\$$$$ / $$$$$$$$ | + \\$$\\$$ / $$ | $$ | $$ $$< $$ __$$ | + \\$$$ / $$ | $$ |$$ /\\$$\\ $$ | $$ | + \\$ / $$$$$$ |$$ / $$ |$$ | $$ | + \\_/ \\______/ \\__| \\__|\\__| \\__| -use crate::{utils::client::Client, utils::plugin::DynPlugin}; -pub use once_cell; +"; + +use crate::{ + cli, logger, + plugin::{Plugin, loader::PluginLoader, types::LoaderMessage}, + types, + utils::{self, auth, client::Client}, +}; #[derive(serde::Serialize, serde::Deserialize)] pub struct ServerConfig { @@ -26,13 +38,13 @@ pub struct ServerConfig { pub channels: Vec, } -#[allow(dead_code)] pub struct Server { - root: PathBuf, - config: ServerConfig, - plugins: Mutex>, - clients: Mutex>, + pub root: PathBuf, + pub config: ServerConfig, + pub clients: Mutex>, + pub plugins: Mutex>, pub db: utils::database::Database, + pub shutting_down: AtomicBool, } impl Default for ServerConfig { @@ -40,8 +52,8 @@ impl Default for ServerConfig { Self { port: 7080, server_name: format!("Server Name"), - server_id: format!("offline-server"), - server_key: format!(""), + server_id: format!("important"), + server_key: format!("important"), channels: Vec::new(), } } @@ -60,37 +72,45 @@ impl ServerConfig { impl Server { logger!(LOGGER "Server"); - pub fn new(root: &Path) -> Arc { - Self::new_config(root, ServerConfig::default()) - } - pub fn new_config(root: &Path, config: ServerConfig) -> Arc { Arc::new(Self { db: utils::database::Database::new(&config).unwrap(), - plugins: Mutex::new(Vec::new()), root: root.to_path_buf(), config, clients: Mutex::new(HashSet::new()), + plugins: Mutex::new(Vec::new()), + shutting_down: AtomicBool::new(false), }) } - pub fn run(self: &Arc) -> Result<()> { + pub fn run(self: &Arc) -> crate::Result<()> { + // Start plugin loader + let plugin_loader = PluginLoader::new(); + Self::LOGGER.info("Starting loader"); + plugin_loader.start_server(); + // Load plugins - #[cfg(feature = "loader")] - utils::loader::load_plugins( - &mut *self.plugins.lock().unwrap(), - &self.root.join("./plugins"), - )?; + plugin_loader.load_all(self); // Initialize plugins - for plugin in self.plugins.lock().unwrap().iter_mut() { - plugin.init(self); - } + Self::LOGGER.info("Initializing plugins"); + + Self::LOGGER.info("Authenticating"); + auth::test(self)?; + + // Initialize CLI + Self::LOGGER.info("Initializing CLI"); + cli::start_cli(self.clone(), plugin_loader); // Start server let listener = TcpListener::bind(format!("0.0.0.0:{}", self.config.port))?; Self::LOGGER.info(format!("Server listening at 0.0.0.0:{}", self.config.port)); + println!( + "{WELCOME}\nversion {}\nType 'help' to see available commands.", + env!("CARGO_PKG_VERSION") + ); + for stream in listener.incoming() { match stream { Ok(stream) => { @@ -120,11 +140,7 @@ impl Server { Ok(()) } - pub fn add_plugin(self: &Arc, plugin: DynPlugin) { - self.plugins.lock().unwrap().push(plugin); - } - - fn init_client(self: &Arc, stream: TcpStream) -> anyhow::Result { + fn init_client(self: &Arc, stream: TcpStream) -> crate::Result { Self::LOGGER.info(format!("New connection: {}", stream.peer_addr()?)); // Initialize client let mut client = Client::new(stream)?; @@ -146,7 +162,7 @@ impl Server { last_message, .. })) => { - let auth_res = auth::auth(self, &mut client, &auth_token); + let auth_res = utils::auth::auth(self, &mut client, &auth_token); let uuid = self.wrap_err(&client, auth_res)?; self.wrap_err( &client, @@ -177,20 +193,19 @@ impl Server { Ok(client) } - fn handle_client(self: &Arc, client: &Client) -> anyhow::Result<()> { + fn handle_client(self: &Arc, client: &Client) -> crate::Result<()> { // The main req/res loop - 'outer: loop { + while !self.shutting_down.load(Ordering::SeqCst) { let req = client.read()?; if let Some(r) = &req { - for p in self.plugins.lock().unwrap().iter_mut() { - if p.on_request(r, client, self) { - continue 'outer; - } - } - + self.send_plugin_message(&LoaderMessage::Request { + user_id: client.get_uuid().unwrap_or_default(), + msg: r.clone(), + })?; self.wrap_err(&client, self.call_request(r, &client))?; } } + Ok(()) } /// When there is a error it removes the client @@ -209,4 +224,38 @@ impl Server { res } + + pub fn send_plugin_message(self: &Arc, msg: &LoaderMessage) -> crate::Result<()> { + for p in self.plugins.lock().unwrap().iter_mut() { + p.send(msg)?; + } + Ok(()) + } + + pub fn shutdown(self: &Arc) { + Self::LOGGER.info("Server shutting down..."); + + // Signal shutdown + self.shutting_down.store(true, Ordering::SeqCst); + + // Disconnect clients + let clients = self.clients.lock().unwrap(); + for client in clients.iter() { + let _ = client.send(types::message::ServerMessage::Shutdown { + message: format!("Server shutting down... we'll be back shortly"), + }); + let _ = client.close(); + } + + // Stop plugins + for plugin in self.plugins.lock().unwrap().iter_mut() { + if let Err(e) = plugin.stop() { + Self::LOGGER.warn(e.context("Couldn't stop plugin")); + } + } + + Self::LOGGER.info("Shutdown complete"); + Self::LOGGER.info("Exiting process.."); + std::process::exit(0); + } } diff --git a/src/types.rs b/src/types.rs index fa3b899..8122dff 100644 --- a/src/types.rs +++ b/src/types.rs @@ -49,7 +49,7 @@ pub mod handshake { pub struct ClientDetails { pub version: String, pub auth_token: String, - pub last_message: Option, + pub last_message: Option, } } @@ -70,12 +70,12 @@ pub mod message { /// Edit a message (if allowed) EditMessage { - message_id: usize, + message_id: i64, new_contents: String, }, /// Delete a message (if allowed) - DeleteMessage { message_id: usize }, + DeleteMessage { message_id: i64 }, } /// Messages sent *from the server* to the client @@ -101,7 +101,7 @@ pub mod message { /// A message was deleted MessageDelete { channel_id: String, - message_id: usize, + message_id: i64, }, /// Presence updates @@ -115,6 +115,10 @@ pub mod message { user_id: Author, channel_id: String, }, + + Shutdown { + message: String, + }, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -128,7 +132,8 @@ pub mod message { } /// WebSocket wrapper - #[derive(Debug, Clone)] + #[derive(Debug, Clone, Serialize)] + #[serde(tag = "type", content = "params", rename_all = "snake_case")] pub enum WsMessage Deserialize<'de>> { Message(T), Binary(Vec), diff --git a/src/auth.rs b/src/utils/auth.rs similarity index 63% rename from src/auth.rs rename to src/utils/auth.rs index bea9eb5..c5894f1 100644 --- a/src/auth.rs +++ b/src/utils/auth.rs @@ -1,9 +1,11 @@ use std::sync::Arc; +use anyhow::Context; use serde::Deserialize; -use crate::{ErrorContext, logger}; -use crate::{Server, utils::client::Client}; +use crate::logger; +use crate::server::Server; +use crate::utils::client::Client; logger!(LOGGER "Auth"); @@ -24,3 +26,14 @@ pub fn auth(server: &Arc, client: &mut Client, token: &str) -> crate::Re LOGGER.info(format!("{} successfully authenticated", api_res.user_id)); Ok(api_res.user_id) } + +pub fn test(server: &Arc) -> crate::Result<()> { + ureq::get(format!( + "https://vxchat.netlify.app/api/auth-test?key={}&id={}", + server.config.server_key, server.config.server_id + )) + .call() + .context("Failed to authenticate")?; + + Ok(()) +} diff --git a/src/utils/client.rs b/src/utils/client.rs index 907738e..fa8812d 100644 --- a/src/utils/client.rs +++ b/src/utils/client.rs @@ -1,7 +1,7 @@ use std::{ hash::{Hash, Hasher}, io::{self, Read, Write}, - net::{SocketAddr, TcpStream}, + net::TcpStream, }; use anyhow::anyhow; @@ -347,9 +347,9 @@ impl Client { self.1 = Some(uuid.to_string()) } - #[deprecated] - pub fn addr(&self) -> crate::Result { - Ok(self.0.peer_addr().unwrap_or(self.0.local_addr()?)) + pub fn close(&self) -> crate::Result<()> { + self.0.shutdown(std::net::Shutdown::Both)?; + Ok(()) } } diff --git a/src/utils/database.rs b/src/utils/database.rs index 641fb26..406e8a5 100644 --- a/src/utils/database.rs +++ b/src/utils/database.rs @@ -52,7 +52,7 @@ impl Database { } /// Delete a message from the DB - pub fn delete_message(&self, message_id: usize) -> Result<()> { + pub fn delete_message(&self, message_id: i64) -> Result<()> { self.0 .execute("DELETE FROM chat WHERE id = ?1;", params![message_id])?; @@ -60,7 +60,7 @@ impl Database { } /// Delete a message from the DB - pub fn edit_message(&self, message_id: usize, contents: &str) -> Result<()> { + pub fn edit_message(&self, message_id: i64, contents: &str) -> Result<()> { self.0.execute( "UPDATE table_name SET contents = ?2 @@ -73,7 +73,7 @@ impl Database { } /// Get a message by its ID - pub fn get_message_by_id(&self, message_id: &str) -> Result> { + pub fn get_message_by_id(&self, message_id: i64) -> Result> { let mut stmt = self.0.prepare( "SELECT id, channel_id, user_id, contents, timestamp FROM chat @@ -104,7 +104,7 @@ impl Database { } /// Get all messages with an ID greater than the given one - pub fn get_messages_after_id(&self, message_id: usize) -> Result> { + pub fn get_messages_after_id(&self, message_id: i64) -> Result> { let mut stmt = self.0.prepare( "SELECT id, channel_id, user_id, contents, timestamp FROM chat diff --git a/src/utils/loader.rs b/src/utils/loader.rs deleted file mode 100644 index 70d52ac..0000000 --- a/src/utils/loader.rs +++ /dev/null @@ -1,41 +0,0 @@ -use std::path::Path; - -use libloading::{Library, Symbol}; - -use crate::{logger, utils::plugin::DynPlugin, utils::vfs}; - -logger! { - const LOGGER "Loader" -} - -pub fn load_plugin(path: &Path) -> anyhow::Result { - unsafe { - LOGGER.info(format!("Loading plugin: {:?}", path)); - let lib = Library::new(path)?; - let func: Symbol DynPlugin> = lib.get(b"load_plugin").unwrap(); - Ok(func()) - } -} - -pub fn load_plugins(arr: &mut Vec, path: &Path) -> crate::Result<()> { - LOGGER.info("Loading plugins"); - vfs::dir(path)?; - if path.is_dir() { - for entry in std::fs::read_dir(path)? { - let entry = entry?; - let path = entry.path(); - if path.extension().and_then(|s| s.to_str()) == Some("dylib") { - match load_plugin(&path) { - Ok(plugin) => { - arr.push(plugin); - } - Err(e) => LOGGER.error(format!("Failed to load plugin {:?}: {}", path, e)), - } - } - } - } else { - LOGGER.error(format!("{:?} is not a directory", path)); - } - - Ok(()) -} diff --git a/src/utils/mod.rs b/src/utils/mod.rs index d7279fe..270e652 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1,7 +1,5 @@ +pub mod auth; pub mod client; pub mod database; -#[cfg(feature = "loader")] -pub mod loader; pub mod logger; -pub mod plugin; pub mod vfs; diff --git a/src/utils/plugin.rs b/src/utils/plugin.rs deleted file mode 100644 index d934e49..0000000 --- a/src/utils/plugin.rs +++ /dev/null @@ -1,22 +0,0 @@ -use std::sync::Arc; - -use crate::{ - Server, - types::message::{ClientMessage, WsMessage}, - utils::client::Client, -}; - -pub type DynPlugin = Box; - -pub trait Plugin { - fn init(&mut self, server: &Arc); - #[allow(unused_variables)] - fn on_request( - &mut self, - req: &WsMessage, - client: &Client, - server: &Arc, - ) -> bool { - false - } -} diff --git a/test-plugin/Cargo.lock b/test-plugin/Cargo.lock deleted file mode 100644 index 11c94a1..0000000 --- a/test-plugin/Cargo.lock +++ /dev/null @@ -1,911 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bitflags" -version = "2.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "cc" -version = "1.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" -dependencies = [ - "find-msvc-tools", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" - -[[package]] -name = "chrono" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-link", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - -[[package]] -name = "fallible-streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" - -[[package]] -name = "find-msvc-tools" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" - -[[package]] -name = "flate2" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.7+wasi-0.2.4", -] - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash", -] - -[[package]] -name = "hashlink" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" -dependencies = [ - "hashbrown", -] - -[[package]] -name = "http" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "iana-time-zone" -version = "0.1.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "js-sys" -version = "0.3.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "libc" -version = "0.2.175" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" - -[[package]] -name = "libsqlite3-sys" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" -dependencies = [ - "pkg-config", - "vcpkg", -] - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "memchr" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.3", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys", -] - -[[package]] -name = "rusqlite" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" -dependencies = [ - "bitflags", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink", - "libsqlite3-sys", - "smallvec", -] - -[[package]] -name = "rustls" -version = "0.23.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.143" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "2.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "test-plugin" -version = "0.1.0" -dependencies = [ - "voxa-server", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "ureq" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ba1025f18a4a3fc3e9b48c868e9beb4f24f4b4b1a325bada26bd4119f46537" -dependencies = [ - "base64", - "flate2", - "log", - "percent-encoding", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "ureq-proto", - "utf-8", - "webpki-roots", -] - -[[package]] -name = "ureq-proto" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b4531c118335662134346048ddb0e54cc86bd7e81866757873055f0e38f5d2" -dependencies = [ - "base64", - "http", - "httparse", - "log", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "voxa-server" -version = "0.1.0" -dependencies = [ - "anyhow", - "base64", - "chrono", - "once_cell", - "rand", - "rusqlite", - "serde", - "serde_json", - "sha1", - "ureq", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - -[[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "webpki-roots" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "windows-core" -version = "0.62.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-link" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" - -[[package]] -name = "windows-result" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "wit-bindgen" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - -[[package]] -name = "zerocopy" -version = "0.8.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/test-plugin/Cargo.toml b/test-plugin/Cargo.toml deleted file mode 100644 index 5ad980d..0000000 --- a/test-plugin/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "test-plugin" -version = "0.1.0" -edition = "2024" - -[lib] -crate-type = ["cdylib", "lib"] - -[dependencies] -voxa-server = { path = "../" } \ No newline at end of file diff --git a/test-plugin/src/lib.rs b/test-plugin/src/lib.rs deleted file mode 100644 index 5f72e68..0000000 --- a/test-plugin/src/lib.rs +++ /dev/null @@ -1,49 +0,0 @@ -use std::sync::Arc; -use voxa_server::{Server, export_plugin, logger, utils::plugin::Plugin}; - -logger! { - const LOGGER "My Plugin" -} - -#[derive(Default)] -pub struct MyPlugin; - -impl Plugin for MyPlugin { - fn init(&mut self, _server: &Arc) { - LOGGER.info("MyPlugin initialized!"); - } - - fn on_request( - &mut self, - msg: &voxa_server::types::message::WsMessage, - client: &voxa_server::utils::client::Client, - _server: &Arc, - ) -> bool { - LOGGER.info(&format!("Received message: {:?}", msg)); - match msg { - voxa_server::types::message::WsMessage::Message( - voxa_server::types::message::ClientMessage::SendMessage { contents, .. }, - ) => { - if contents == "ping" { - LOGGER.info("Pong!"); - // client - // .send(voxa_server::types::message::ServerMessage::TempMessage { - // message: "pong".to_string(), - // }) - // .unwrap(); - client - .send(voxa_server::types::message::ServerMessage::TempMessage { - message: "pong".to_string(), - }) - .unwrap(); - true - } else { - false - } - } - _ => false, - } - } -} - -export_plugin!(Box::new(MyPlugin)); diff --git a/test-plugin/src/main.rs b/test-plugin/src/main.rs deleted file mode 100644 index 7400176..0000000 --- a/test-plugin/src/main.rs +++ /dev/null @@ -1,16 +0,0 @@ -use std::path::PathBuf; - -use voxa_server::{ServerConfig, utils::vfs}; - -fn main() -> voxa_server::Result<()> { - let root = PathBuf::from("./"); - let config: ServerConfig = if let Ok(env_config) = std::env::var("VX_CONFIG") { - ServerConfig::from_str(&env_config)? - } else { - vfs::read_config(&root.join("config.json"))? - }; - let server = config.build(&root); - server.add_plugin(Box::new(test_plugin::MyPlugin::default())); - server.run()?; - Ok(()) -}