diff --git a/Cargo.lock b/Cargo.lock index e30b266c..ac3d1402 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,9 +14,9 @@ dependencies = [ [[package]] name = "actor-system-error" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62454c32e29c8b10d12f3cb09489763a0303a12c1a09a869fadec6ec8256bcb8" +checksum = "ec45e6f7ab7ffaf319988b1e1bb43e293362b8df84250af85630b7544a9c107a" dependencies = [ "derive_more", ] @@ -110,9 +110,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" [[package]] name = "array-bytes" @@ -164,7 +164,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -371,9 +371,9 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bs58" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ "tinyvec", ] @@ -629,9 +629,9 @@ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core-processor" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "492d26c105a9e4d0dcac2eb9866a9fc3ba4da8ce43179ee7e51604fa49c593f7" +checksum = "5de23a26b09a0dabcc4f3074f85f6d18885136dd70085bb132e8b4e1f61cc5f6" dependencies = [ "actor-system-error", "derive_more", @@ -873,7 +873,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -884,7 +884,7 @@ checksum = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77" dependencies = [ "darling_core", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -1183,7 +1183,7 @@ checksum = "03cdc46ec28bd728e67540c528013c6a10eb69a02eb31078a1bda695438cbfb8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -1204,7 +1204,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -1252,7 +1252,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -1390,7 +1390,7 @@ dependencies = [ "proc-macro-warning", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -1403,7 +1403,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -1414,7 +1414,7 @@ checksum = "0c3562da4b7b8e24189036c58d459b260e10c8b7af2dd180b7869ae29bb66277" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -1509,7 +1509,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -1544,18 +1544,18 @@ dependencies = [ [[package]] name = "galloc" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc660179e00a600ccac2b78923509434bf3bbd43b08beb05839c55a6c51a96b" +checksum = "99dca925c5f3985a741dc70c55372b8896c775d9022977feb713d6b2e5926714" dependencies = [ "gear-dlmalloc", ] [[package]] name = "gcore" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5018c42f6706b56ca0cce4aaa58f4f25fc3c79aa43c6abf9c988630affb250e1" +checksum = "c54420edffb115198575c6d9cd408f3936bfa3feb6fbddd573681a43c6183524" dependencies = [ "gear-core-errors", "gear-stack-buffer", @@ -1565,9 +1565,9 @@ dependencies = [ [[package]] name = "gear-common" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb2b5fa0753112e17f022dc9f8c6f2ac5e03d745a5c271eab772c75132112f7" +checksum = "ff00021793ef3316be5629d7998b13c5cb8702153ccc4579ef8d52d6cf014454" dependencies = [ "derive_more", "enum-iterator 1.5.0", @@ -1582,24 +1582,25 @@ dependencies = [ "sp-arithmetic", "sp-core", "sp-io", + "sp-runtime", "sp-std 9.0.0", ] [[package]] name = "gear-common-codegen" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae44bf1df11df017d684247aeb297e05252406c527f402b0f4b3e9be6e691348" +checksum = "1b404ba0a180173918fac0067c08b5d3a8fab2051dc6f06c5687e1481c11bfb5" dependencies = [ "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] name = "gear-core" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b171e6947c247a71c5c82371ffdf55b14774d3708338d0b3cb9518ea0d69372" +checksum = "660f7f6866240b8c42831f9351dcd9d7430e34af85f28cb1e8cf4c4629072994" dependencies = [ "blake2-rfc", "byteorder", @@ -1621,9 +1622,9 @@ dependencies = [ [[package]] name = "gear-core-backend" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d904bf78fbf85df6432c374fe1e395a00f09a655c55583c3769e39972a8b0ac" +checksum = "5372f3e9c4538c236d4de5c47ab11f09b737e38be5c4b51477d6aab415eb3c34" dependencies = [ "actor-system-error", "blake2-rfc", @@ -1641,13 +1642,14 @@ dependencies = [ [[package]] name = "gear-core-errors" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9efc280bce244132fc90879d08f38cf8df78c656fb1457507b9253b928e00225" +checksum = "36293ee8813273934186736378c2d25019031790713c2c5fc5215e3a42766dbb" dependencies = [ "derive_more", "enum-iterator 1.5.0", "scale-info", + "serde", ] [[package]] @@ -1665,9 +1667,9 @@ dependencies = [ [[package]] name = "gear-lazy-pages" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e5236ee03f6dd5e4b540167f34b3285d87116d3bb13cd503c5e0def176c0f6" +checksum = "7b0151d562c87ee96c982027b08ee04979fb9b4ae9070648cbe83f491591f419" dependencies = [ "cfg-if", "derive_more", @@ -1686,9 +1688,9 @@ dependencies = [ [[package]] name = "gear-lazy-pages-common" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3f15c3fd6731592305b905b1dea42aa6e1d253b7b089edb095f15d87ab84214" +checksum = "dc797ee72dabca5c1f00059b13e044dd563c4d002f46a43e41daeec24e28be12" dependencies = [ "gear-core", "num_enum", @@ -1697,9 +1699,9 @@ dependencies = [ [[package]] name = "gear-lazy-pages-interface" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9a525122cd12ce312a6b6c586bf0892b154fb8d3b545c64368833e94850c39" +checksum = "c6193c95d62343666ea01f9c998ecb030d7e6d41b38c6c7acb42a4d19fb4213a" dependencies = [ "byteorder", "gear-common", @@ -1723,9 +1725,9 @@ dependencies = [ [[package]] name = "gear-runtime-interface" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e5f0fae86361b7d0380267b85b5c1b563a260d8157c9ff90efc31e9227eae60" +checksum = "11bc8634992d30f1f29bb3e39edf4722fd054bb0de12ad77447959a4fbcae065" dependencies = [ "byteorder", "gear-core", @@ -1743,9 +1745,9 @@ dependencies = [ [[package]] name = "gear-sandbox" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eb8ddbe1520afe7fa4e7241296452e769f5e1452edee3a39e94a611011ee8c3" +checksum = "7dfe89b66020e136aa345cfeed2d833a37919d0dee428bd6e8237f9d2d5c3236" dependencies = [ "gear-runtime-interface", "gear-sandbox-env", @@ -1759,9 +1761,9 @@ dependencies = [ [[package]] name = "gear-sandbox-env" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e57c49b226c118eb6416f03ce7ffe0338e9735349d931bbe9e241732eef9819" +checksum = "2020a9e098a03bb2dd7cfdc8bbd0bb18d68af9f0aaeaf1eb1a9b7fd10d7f782f" dependencies = [ "parity-scale-codec", "sp-debug-derive", @@ -1771,9 +1773,9 @@ dependencies = [ [[package]] name = "gear-sandbox-host" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e596d5edcf51522fdf8b85c250b7911640904026a7b86e9b73598e270de3a5" +checksum = "e84a742d8f0d067806cb47eb38a6d3e79fa7680a42f04d524592902cd0700ee4" dependencies = [ "environmental", "gear-sandbox-env", @@ -1783,6 +1785,7 @@ dependencies = [ "sp-wasm-interface-common", "tempfile", "thiserror", + "uluru", "wasmer", "wasmer-cache", "wasmer-types", @@ -1791,15 +1794,15 @@ dependencies = [ [[package]] name = "gear-stack-buffer" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5171ae8e1b88b40f30d2349924755fa24ef6b10cbd0ae6f16627df67774386c4" +checksum = "bda85b63aca9a1abbe646995225ddf92f210a204916bec1f1463aa43236081ec" [[package]] name = "gear-utils" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54fd91242dbb99242a3002a1b9d6f2e60ba7ebe4880d8a422978d8c8b1c12e0" +checksum = "aaf1bdb9a9cbc65a968ac137179dc9acdd1f9523fc1074d52277202b75ae60e7" dependencies = [ "env_logger", "gear-core", @@ -1819,9 +1822,9 @@ checksum = "bbfbfa701dc65e683fcd2fb24f046bcef22634acbdf47ad14724637dc39ad05b" [[package]] name = "gear-wasm-builder" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90cacb0bf2bcb1b70ae4773b0a711e4c082789c301fc63b902440d2f6391b5df" +checksum = "b7a33590365b3e06e6b7a97cbf64befd64bd5c97002329158f7511a6d5a016d5" dependencies = [ "anyhow", "cargo_metadata", @@ -1844,9 +1847,9 @@ dependencies = [ [[package]] name = "gear-wasm-instrument" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7d501ae30810c2aee710e0e74ee767c4f1274c00273b110433cc7d8291bbcd8" +checksum = "86a68b7cec417630759073a22805ae7628c5663ae695e37ed4980edf0fc22660" dependencies = [ "derive_more", "enum-iterator 1.5.0", @@ -1942,9 +1945,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "gmeta" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f464cf8d902292e38cfa68fb0a42ca7249525e4358e4ed7e2521fc660ae21c22" +checksum = "c0307bbffd022225d8b35712daa3ad126ec9637e5ce9d0808971a77c628e24ad" dependencies = [ "blake2-rfc", "derive_more", @@ -1993,7 +1996,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -2025,12 +2028,12 @@ dependencies = [ [[package]] name = "gstd" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81233e10d5a9f11f697b824be5474506918dc3d707223f10a102c1e01a1b4855" +checksum = "8216c54291edaab2a1935913bea6b2ea421b9e24b706e79f9fb86486635e8108" dependencies = [ "arrayvec 0.7.4", - "bs58 0.5.0", + "bs58 0.5.1", "const_format", "futures", "galloc", @@ -2046,26 +2049,26 @@ dependencies = [ [[package]] name = "gstd-codegen" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a709957cf82f4a83ef4ed55ef4c4894d014142c1dfcf892abb93aeaff137273b" +checksum = "054636b87f7a7eef568707a94c2660b2a354330aca556d25386dd94dc1778426" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] name = "gsys" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4fed3acad7ecf119368534ab92245a41bb37477a4f14f3c14e5f011f72f4bda" +checksum = "8f7dc9624dc4bdcb00e675b4a20c39a127c2cbb15be223592e044ab0f155f2b1" [[package]] name = "gtest" -version = "1.1.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f91ddcd3d89b23995794008dc3fb8dcca720571fd661de162a82c55def07486" +checksum = "3ebe1a09120472bd29ebfea7da5b70f3370a7ef7dda2b55babbfb3bd3a3b3826" dependencies = [ "colored", "core-processor", @@ -2614,9 +2617,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "logos" @@ -2638,7 +2641,7 @@ dependencies = [ "proc-macro2", "quote", "regex-syntax 0.6.29", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -2680,6 +2683,15 @@ dependencies = [ "libc", ] +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + [[package]] name = "macro_magic" version = "0.4.2" @@ -2689,7 +2701,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -2703,7 +2715,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -2714,7 +2726,7 @@ checksum = "d710e1214dffbab3b5dacb21475dde7d6ed84c69ff722b3a47a782668d44fbac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -2725,7 +2737,7 @@ checksum = "b8fb85ec1620619edf2984a7693497d4ec88a9665d8b87e942856884c92dbf2a" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -2957,7 +2969,7 @@ checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -3160,7 +3172,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -3234,7 +3246,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -3301,14 +3313,14 @@ checksum = "3d1eaa7fa0aa1929ffdf7eeb6eac234dde6268914a14ad44d23521ab6a9b258e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] @@ -3508,7 +3520,7 @@ checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -3574,14 +3586,14 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "region" -version = "3.0.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" +checksum = "e6b6ebd13bc009aef9cd476c1310d49ac354d36e240cf1bd753290f3dc7199a7" dependencies = [ "bitflags 1.3.2", "libc", - "mach", - "winapi", + "mach2", + "windows-sys 0.52.0", ] [[package]] @@ -3820,7 +3832,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -3982,7 +3994,7 @@ checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -4162,7 +4174,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -4262,7 +4274,7 @@ checksum = "8dc707d9f5bf155d584900783e328cb3dc79c950f898a18a8f24066f41f040a5" dependencies = [ "quote", "sp-core-hashing", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -4273,7 +4285,7 @@ checksum = "f12dae7cf6c1e825d13ffd4ce16bd9309db7c539929d0302b4443ed451a9f4e5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -4417,7 +4429,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -4560,7 +4572,7 @@ dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -4698,9 +4710,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -4721,13 +4733,12 @@ checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" [[package]] name = "tempfile" -version = "3.9.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", "rustix 0.38.31", "windows-sys 0.52.0", ] @@ -4775,22 +4786,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -4893,19 +4904,19 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] name = "toml" -version = "0.7.8" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.19.15", + "toml_edit 0.22.12", ] [[package]] @@ -4924,10 +4935,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.2.2", - "serde", - "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.5.36", ] [[package]] @@ -4938,7 +4947,20 @@ checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ "indexmap 2.2.2", "toml_datetime", - "winnow", + "winnow 0.5.36", +] + +[[package]] +name = "toml_edit" +version = "0.22.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +dependencies = [ + "indexmap 2.2.2", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.7", ] [[package]] @@ -4961,7 +4983,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -5096,6 +5118,15 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "uluru" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c8a2469e56e6e5095c82ccd3afb98dad95f7af7929aab6d8ba8d6e0f73657da" +dependencies = [ + "arrayvec 0.7.4", +] + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -5197,7 +5228,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", "wasm-bindgen-shared", ] @@ -5219,7 +5250,7 @@ checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6023,6 +6054,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578" +dependencies = [ + "memchr", +] + [[package]] name = "wyz" version = "0.5.1" @@ -6058,7 +6098,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] [[package]] @@ -6078,5 +6118,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.60", ] diff --git a/Cargo.toml b/Cargo.toml index 1bd32f5c..2d8b9658 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,11 +29,11 @@ members = [ anyhow = "1" convert-case = { package = "convert_case", version = "0.6" } futures = { version = "0.3", default-features = false } -gear-core-errors = "1.1.1" +gear-core-errors = "1.3.0" git-download = "0.1" -gstd = "1.1.1" -gtest = "1.1.1" -gwasm-builder = { package = "gear-wasm-builder", version = "1.1.1" } +gstd = "1.3.0" +gtest = "1.3.0" +gwasm-builder = { package = "gear-wasm-builder", version = "1.3.0" } handlebars = "4.4" hashbrown = "0.14" hex = { version = "0.4", default-features = false } diff --git a/client-gen/src/generator.rs b/client-gen/src/generator.rs index 0ebfbee6..418fcf86 100644 --- a/client-gen/src/generator.rs +++ b/client-gen/src/generator.rs @@ -145,6 +145,7 @@ impl CtorTraitGenerator { impl<'ast> Visitor<'ast> for CtorTraitGenerator { fn visit_ctor(&mut self, ctor: &'ast Ctor) { + self.code.push_str("#[allow(dead_code)]\n"); self.code.push_str(&format!( "pub trait {}Factory {{\n", self.service_name diff --git a/client-gen/src/snapshots/sails_clientgen__generator__tests__rmrk_works.snap b/client-gen/src/snapshots/sails_clientgen__generator__tests__rmrk_works.snap index d49163c0..22e26761 100644 --- a/client-gen/src/snapshots/sails_clientgen__generator__tests__rmrk_works.snap +++ b/client-gen/src/snapshots/sails_clientgen__generator__tests__rmrk_works.snap @@ -260,6 +260,7 @@ pub struct SlotPart { } pub mod traits { use super::*; + #[allow(dead_code)] pub trait RmrkCatalogFactory { #[allow(clippy::new_ret_no_self)] fn new(remoting: impl Remoting) -> impl Activation; diff --git a/client-gen/src/snapshots/sails_clientgen__tests__full.snap b/client-gen/src/snapshots/sails_clientgen__tests__full.snap index b713e4ed..7f84e33a 100644 --- a/client-gen/src/snapshots/sails_clientgen__tests__full.snap +++ b/client-gen/src/snapshots/sails_clientgen__tests__full.snap @@ -150,6 +150,7 @@ pub enum T { } pub mod traits { use super::*; + #[allow(dead_code)] pub trait ServiceFactory { #[allow(clippy::new_ret_no_self)] fn new(remoting: impl Remoting, a: u32) -> impl Activation; diff --git a/examples/rmrk/resource/wasm/tests/resources.rs b/examples/rmrk/resource/wasm/tests/resources.rs index ff18e867..47942e07 100644 --- a/examples/rmrk/resource/wasm/tests/resources.rs +++ b/examples/rmrk/resource/wasm/tests/resources.rs @@ -64,6 +64,7 @@ fn adding_resource_to_storage_by_admin_succeeds() { assert!(run_result.contains(&(ADMIN_ID, expected_response))); let expected_event = [ + resources::RESOURCE_SERVICE_NAME.encode().as_slice(), "ResourceAdded".encode().as_slice(), &ResourceStorageEvent::ResourceAdded { resource_id: RESOURCE_ID, @@ -196,53 +197,91 @@ fn adding_non_existing_part_to_resource_fails() { struct Fixture<'a> { admin_id: u64, - net_client: GTestRemoting, + program_space: GTestRemoting, catalog_program: OnceCell>, resource_program: OnceCell>, } impl<'a> Fixture<'a> { fn new(admin_id: u64) -> Self { - let net_client = GTestRemoting::new(); - net_client.system().init_logger(); + let program_space = GTestRemoting::new(); + program_space.system().init_logger(); Self { admin_id, - net_client, + program_space, catalog_program: OnceCell::new(), resource_program: OnceCell::new(), } } - fn net_client(&self) -> >estRemoting { - &self.net_client + fn program_space(&self) -> >estRemoting { + &self.program_space } fn catalog_program(&'a self) -> &Program<'a> { self.catalog_program.get_or_init(|| { - let program = Program::from_file(self.net_client.system(), CATALOG_PROGRAM_WASM_PATH); + let program = + Program::from_file(self.program_space.system(), CATALOG_PROGRAM_WASM_PATH); let encoded_request = catalog::CTOR_FUNC_NAME.encode(); program.send_bytes(self.admin_id, encoded_request); program }) } - fn resource_program(&'a self) -> &Program<'a> { + fn resource_program_for_async(&'a self) -> &Program<'a> { + println!("For async"); self.resource_program.get_or_init(|| { - let program = Program::from_file(self.net_client.system(), RESOURCE_PROGRAM_WASM_PATH); + let program = + Program::from_file(self.program_space.system(), RESOURCE_PROGRAM_WASM_PATH); let encoded_request = resources::CTOR_FUNC_NAME.encode(); program.send_bytes(self.admin_id, encoded_request); program }) } + fn resource_program_for_sync(&'a self) -> &Program<'a> { + println!("For sync"); + self.resource_program.get_or_init(|| { + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + self.__spin_up_program( + RESOURCE_PROGRAM_WASM_PATH, + &resources::CTOR_FUNC_NAME.encode(), + ) + .await + }) + }) + } + + async fn __spin_up_program(&'a self, program_path: &str, payload: &[u8]) -> Program<'a> { + let code_id = self.program_space().system().submit_code(program_path); + let program_space = self.program_space().clone(); + let reply = program_space + .activate( + code_id.as_ref().into(), + "123", + payload, + 0, + GTestArgs::new(self.admin_id.into()), + ) + .await + .unwrap(); + self.program_space() + .system() + .get_program(*reply.await.unwrap().0.as_ref()) + } + fn add_resource( &'a self, actor_id: u64, resource_id: ResourceId, resource: &Resource, ) -> RunResult { - let program = self.resource_program(); + let program = self.resource_program_for_sync(); let encoded_request = [ resources::RESOURCE_SERVICE_NAME.encode(), resources::ADD_RESOURCE_ENTRY_FUNC_NAME.encode(), @@ -266,10 +305,10 @@ impl<'a> Fixture<'a> { resource.encode(), ] .concat(); - let net_client = self.net_client().clone(); - let reply = net_client + let program_space = self.program_space().clone(); + let reply = program_space .message( - self.resource_program().id().as_ref().into(), + self.resource_program_for_async().id().as_ref().into(), encoded_request, 0, GTestArgs::new(actor_id.into()), @@ -284,7 +323,7 @@ impl<'a> Fixture<'a> { resource_id: ResourceId, part_id: PartId, ) -> RunResult { - let program = self.resource_program(); + let program = self.resource_program_for_sync(); let encoded_request = [ resources::RESOURCE_SERVICE_NAME.encode(), resources::ADD_PART_TO_RESOURCE_FUNC_NAME.encode(), @@ -300,7 +339,7 @@ impl<'a> Fixture<'a> { actor_id: u64, resource_id: ResourceId, ) -> Option> { - let program = self.resource_program(); + let program = self.resource_program_for_sync(); let encoded_service_name = resources::RESOURCE_SERVICE_NAME.encode(); let encoded_func_name = resources::RESOURCE_FUNC_NAME.encode(); let encoded_request = [ diff --git a/examples/this-that-svc/app/src/lib.rs b/examples/this-that-svc/app/src/lib.rs index 91ae9709..d038f3ca 100644 --- a/examples/this-that-svc/app/src/lib.rs +++ b/examples/this-that-svc/app/src/lib.rs @@ -4,6 +4,7 @@ use gstd::{debug, prelude::*}; use primitive_types::{H256, U256}; use sails_macros::gservice; +#[derive(Default)] pub struct MyService; #[gservice] diff --git a/js/README.md b/js/README.md index bcc7d75c..2ccb0668 100644 --- a/js/README.md +++ b/js/README.md @@ -83,20 +83,20 @@ The key of the object is the name of the event and the value is an object with t ``` ### Get function name and decode bytes -Use `sails.getServiceName` method to get the service name from the payload bytes. -Use `sails.getFnName` method to get the function name from the payload bytes. +Use `getServiceNamePrefix` function to get the service name from the payload bytes. +Use `getFnNamePrefix` method to get the function or event name from the payload bytes. Use `sails.services.ServiceName.functions.FuncitonName.decodePayload` method of the function object to decode the payload bytes of the send message. Use `sails.services.ServiceName.functions.FuncitonName.decodeResult` method of the function object to decode the result bytes of the received message. ```javascript +import { getServiceNamePrefix, getFnNamePrefix } from 'sails-js'; const payloadOfSentMessage = '0x'; -const serviceName = sails.getServiceName(payloadOfSentMessage); -const functionName = sails.getFnName(payloadOfSentMessage); +const serviceName = getServiceNamePrefix(payloadOfSentMessage); +const functionName = getFnNamePrefix(payloadOfSentMessage); console.log(sails.services[serviceName].functions[functionName].decodeResult(payloadOfSentMessage)); const payloadOfReceivedMessage = '0x'; -const functionName = sails.getFunctionName(payloadOfReceivedMessage); -console.log(sails.functions[functionName].decodePayload(payloadOfReceivedMessage)); +console.log(sails.service[serviceName].functions[functionName].decodePayload(payloadOfReceivedMessage)); ``` The same approach can be used to encode/decode bytes of the contructor or event. diff --git a/js/package.json b/js/package.json index bdcb91ab..b31fc28a 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "sails-js", - "version": "0.1.0", + "version": "0.1.1", "description": "Parser and typescript code generator from Sails IDL files", "main": "lib/index.js", "preferGlobal": true, @@ -33,8 +33,8 @@ }, "scripts": { "prebuild": "rm -rf lib", - "build": "rm -rf lib && rollup --config rollup.config.js && node compress-parser.js", "pretest": "yarn build && node test/modify-import.js", + "build": "rm -rf lib && rollup --config rollup.config.js && node compress-parser.js", "test": "yarn node --no-warnings --experimental-vm-modules $(yarn bin jest) --detectOpenHandles" }, "peerDependencies": { @@ -43,7 +43,7 @@ "@polkadot/types": "^10.12.3" }, "devDependencies": { - "@gear-js/api": "0.37.2", + "@gear-js/api": "0.38.0", "@polkadot/api": "10.12.6", "@polkadot/types": "10.12.6", "@rollup/plugin-commonjs": "25.0.7", diff --git a/js/src/generate/service-gen.ts b/js/src/generate/service-gen.ts index a1c5915c..9c8ef26e 100644 --- a/js/src/generate/service-gen.ts +++ b/js/src/generate/service-gen.ts @@ -19,11 +19,11 @@ const getFuncName = (name: string) => { const createPayload = (serviceName: string, fnName: string, params: FuncParam[]) => { if (params.length === 0) { - return `const payload = this._program.registry.createType('(String, String)', '[${serviceName}, ${fnName}]').toU8a()`; + return `const payload = this._program.registry.createType('(String, String)', '[${serviceName}, ${fnName}]').toHex()`; } else { return `const payload = this._program.registry.createType('(String, String, ${params .map(({ def }) => getScaleCodecDef(def)) - .join(', ')})', ['${serviceName}', '${fnName}', ${params.map(({ name }) => name).join(', ')}]).toU8a()`; + .join(', ')})', ['${serviceName}', '${fnName}', ${params.map(({ name }) => name).join(', ')}]).toHex()`; } }; @@ -220,7 +220,8 @@ export class ServiceGenerator { this._out .firstLine(`const ZERO_ADDRESS = u8aToHex(new Uint8Array(32))`) .import('@polkadot/util', 'u8aToHex') - .import('@polkadot/util', 'compactFromU8aLim'); + .import('sails-js', 'getServiceNamePrefix') + .import('sails-js', 'getFnNamePrefix'); } for (const event of service.events) { @@ -243,19 +244,18 @@ export class ServiceGenerator { }, ) .line() - .line(`const payload = message.payload.toU8a()`) - .line(`const [offset, limit] = compactFromU8aLim(payload)`) - .line( - `const name = this._program.registry.createType('String', payload.subarray(offset, limit)).toString()`, + .line(`const payload = message.payload.toHex()`) + .block( + `if (getServiceNamePrefix(payload) === '${service.name}' && getFnNamePrefix(payload) === '${event.name}')`, + () => { + this._out.line( + `callback(this._program.registry.createType('(String, String, ${getScaleCodecDef( + event.def, + true, + )})', message.payload)[2].toJSON() as ${jsType})`, + ); + }, ) - .block(`if (name === '${event.name}')`, () => { - this._out.line( - `callback(this._program.registry.createType('(String, ${getScaleCodecDef( - event.def, - true, - )})', message.payload)[1].toJSON() as ${jsType})`, - ); - }) .reduceIndent() .line(`})`); }, diff --git a/js/src/index.ts b/js/src/index.ts index 6b92a8b1..16fda61c 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -1,2 +1,3 @@ export { Sails } from './sails.js'; export { TransactionBuilder } from './transaction-builder.js'; +export { getServiceNamePrefix, getFnNamePrefix } from './utils/index.js'; diff --git a/js/src/parser/visitor.ts b/js/src/parser/visitor.ts index 29e66c5e..cc003635 100644 --- a/js/src/parser/visitor.ts +++ b/js/src/parser/visitor.ts @@ -257,6 +257,8 @@ export enum EPrimitiveType { ActorId, CodeId, MessageId, + H256, + U256, } export class PrimitiveDef { @@ -329,6 +331,14 @@ export class PrimitiveDef { get isMessageId(): boolean { return this.value === EPrimitiveType.MessageId; } + + get isH256(): boolean { + return this.value === EPrimitiveType.H256; + } + + get isU256(): boolean { + return this.value === EPrimitiveType.U256; + } } export class OptionalDef extends WithDef {} diff --git a/js/src/sails.ts b/js/src/sails.ts index 1ef795b6..48d5b685 100644 --- a/js/src/sails.ts +++ b/js/src/sails.ts @@ -1,21 +1,13 @@ import { TypeRegistry } from '@polkadot/types/create'; -import { hexToU8a, u8aToHex, compactFromU8aLim } from '@polkadot/util'; +import { u8aToHex } from '@polkadot/util'; import { HexString, UserMessageSent } from '@gear-js/api'; import { Program, Service, TypeDef, WasmParser } from './parser/index.js'; import { getScaleCodecDef } from './utils/types.js'; +import { getFnNamePrefix, getServiceNamePrefix } from 'utils/prefix.js'; const ZERO_ADDRESS = u8aToHex(new Uint8Array(32)); -const getPrefixLimitAndOffset = (payload: Uint8Array) => { - const [offset, limit] = compactFromU8aLim(payload); - - return { - offset, - limit, - }; -}; - interface SailsService { functions: Record; events: Record; @@ -25,21 +17,21 @@ interface SailsServiceFunc { args: { name: string; type: any }[]; returnType: any; isQuery: boolean; - encodePayload: (...args: any[]) => Uint8Array; - decodePayload: (bytes: string | Uint8Array) => T; - decodeResult: (result: string | Uint8Array) => T; + encodePayload: (...args: any[]) => HexString; + decodePayload: (bytes: HexString) => T; + decodeResult: (result: HexString) => T; } interface SailsServiceEvent { type: any; is: (event: UserMessageSent) => boolean; - decode: (payload: Uint8Array) => any; + decode: (payload: HexString) => any; } interface SailsCtorFunc { args: { name: string; type: any }[]; - encodePayload: (...args: any[]) => Uint8Array; - decodePayload: (bytes: string | Uint8Array) => T; + encodePayload: (...args: any[]) => HexString; + decodePayload: (bytes: HexString) => T; } export class Sails { @@ -110,7 +102,7 @@ export class Sails { args: params, returnType, isQuery: func.isQuery, - encodePayload: (...args): Uint8Array => { + encodePayload: (...args): HexString => { if (args.length !== args.length) { throw new Error(`Expected ${params.length} arguments, but got ${args.length}`); } @@ -121,13 +113,13 @@ export class Sails { ...args, ]); - return payload.toU8a(); + return payload.toHex(); }, - decodePayload: (bytes: Uint8Array | string) => { + decodePayload: (bytes: HexString) => { const payload = this.registry.createType(`(String, String, ${params.map((p) => p.type).join(', ')})`, bytes); return payload[2].toJSON() as T; }, - decodeResult: (result: Uint8Array | string) => { + decodeResult: (result: HexString) => { const payload = this.registry.createType(`(String, String, ${returnType})`, result); return payload[2].toJSON() as T; }, @@ -150,20 +142,19 @@ export class Sails { return false; } - const payload = message.payload.toU8a(); - const { offset, limit } = getPrefixLimitAndOffset(payload); - const name = this.registry.createType('String', payload.subarray(offset, limit)).toString(); + if (getServiceNamePrefix(message.payload.toHex()) !== service.name) { + return false; + } - if (name === event.name) { - return true; - } else { + if (getFnNamePrefix(message.payload.toHex()) !== event.name) { return false; } + + return true; }, - decode: (payload: Uint8Array) => { - const { limit } = getPrefixLimitAndOffset(payload); - const data = this.registry.createType(typeStr, payload.subarray(limit)); - return data.toJSON(); + decode: (payload: HexString) => { + const data = this.registry.createType(`(String, String, ${typeStr})`, payload); + return data[2].toJSON(); }, }; } @@ -207,17 +198,21 @@ export class Sails { const params = func.params.map((p) => ({ name: p.name, type: getScaleCodecDef(p.def) })); funcs[func.name] = { args: params, - encodePayload: (...args): Uint8Array => { + encodePayload: (...args): HexString => { if (args.length !== args.length) { throw new Error(`Expected ${params.length} arguments, but got ${args.length}`); } + if (params.length === 0) { + return u8aToHex(this.registry.createType('String', func.name).toU8a()); + } + const payload = this.registry.createType(`(String, ${params.map((p) => p.type).join(', ')})`, [ func.name, ...args, ]); - return payload.toU8a(); + return payload.toHex(); }, decodePayload: (bytes: Uint8Array | string) => { const payload = this.registry.createType(`(String, ${params.map((p) => p.type).join(', ')})`, bytes); @@ -242,19 +237,4 @@ export class Sails { getTypeDef(name: string): TypeDef { return this.program.getTypeByName(name).def; } - - /** #### Get function name from payload bytes */ - getFnName(payload: Uint8Array | HexString) { - payload = typeof payload === 'string' ? hexToU8a(payload) : payload; - const serviceName = compactFromU8aLim(payload); - const [offset, limit] = compactFromU8aLim(payload.subarray(serviceName[1])); - return this._registry.createType('String', payload.subarray(offset, limit)).toString(); - } - - /** #### Get service name from payload bytes */ - getServiceName(payload: Uint8Array | HexString): string { - payload = typeof payload === 'string' ? hexToU8a(payload) : payload; - const [offset, limit] = compactFromU8aLim(payload); - return this._registry.createType('String', payload.subarray(offset, limit)).toString(); - } } diff --git a/js/src/utils/index.ts b/js/src/utils/index.ts index f0c8dbb4..e8808394 100644 --- a/js/src/utils/index.ts +++ b/js/src/utils/index.ts @@ -3,3 +3,4 @@ export * from './payload-method.js'; export * from './types.js'; export * from './types-replace.js'; export * from './string.js'; +export * from './prefix.js' \ No newline at end of file diff --git a/js/src/utils/prefix.ts b/js/src/utils/prefix.ts new file mode 100644 index 00000000..f9208fd1 --- /dev/null +++ b/js/src/utils/prefix.ts @@ -0,0 +1,30 @@ +import { u8aToString, hexToU8a, compactFromU8aLim } from '@polkadot/util'; +import { HexString } from '@gear-js/api'; + +/** + * ## Get service name prefix + * @param payload in hex string format + * @returns Name of the service + */ +export const getServiceNamePrefix = (payload: HexString): string => { + const _payload = hexToU8a(payload); + const [offset, limit] = compactFromU8aLim(_payload); + + return u8aToString(_payload.subarray(offset, limit + offset)); +}; + +/** + * ## Get function (or event) name prefix + * @param payload in hex string format + * @returns Name of the function + */ +export function getFnNamePrefix(payload: HexString) { + const _payload = hexToU8a(payload); + + const [sOff, sLim] = compactFromU8aLim(_payload); + const serviceOffset = sOff + sLim; + + const [offset, limit] = compactFromU8aLim(_payload.subarray(serviceOffset)); + + return u8aToString(_payload.subarray(serviceOffset + offset, serviceOffset + offset + limit)); +} diff --git a/js/src/utils/types.ts b/js/src/utils/types.ts index 2c2b1a57..d3384291 100644 --- a/js/src/utils/types.ts +++ b/js/src/utils/types.ts @@ -51,17 +51,15 @@ export const getPrimitiveTypeName = (type: PrimitiveDef, forTs = false): string if (type.isU64) return forTs ? TS_NUMBER : 'u64'; if (type.isU128) return forTs ? TS_NUMBER : 'u128'; if (type.isActorId || type.isCodeId || type.isMessageId) return forTs ? '`0x${string}` | Uint8Array' : '[u8;32]'; + if (type.isH256) return forTs ? 'string' : 'H256'; + if (type.isU256) return forTs ? TS_NUMBER : 'U256'; throw new Error('Unknown primitive type'); }; export const getScaleCodecDef = (type: TypeDef, asString = false) => { if (type.isPrimitive) { - const primitive = type.asPrimitive; - if (primitive.isActorId || primitive.isCodeId || primitive.isMessageId) { - return '[u8;32]'; - } - return getPrimitiveTypeName(primitive); + return getPrimitiveTypeName(type.asPrimitive); } if (type.isOptional) { return `Option<${getScaleCodecDef(type.asOptional.def)}>`; diff --git a/js/test/rmrk-catalog.test.ts b/js/test/rmrk-catalog.test.ts index 580166d2..81ca6d8d 100644 --- a/js/test/rmrk-catalog.test.ts +++ b/js/test/rmrk-catalog.test.ts @@ -97,7 +97,7 @@ describe('RMRK catalog', () => { expect(replyMsg).toBeDefined(); - const result = sails.services.RmrkCatalog.functions.AddParts.decodeResult(replyMsg.data.message.payload); + const result = sails.services.RmrkCatalog.functions.AddParts.decodeResult(replyMsg.data.message.payload.toHex()); expect(result).toEqual({ ok: { diff --git a/js/test/rmrk-resource.test.ts b/js/test/rmrk-resource.test.ts index 71bfe2f8..c7af6def 100644 --- a/js/test/rmrk-resource.test.ts +++ b/js/test/rmrk-resource.test.ts @@ -95,7 +95,7 @@ describe('RMRK resource', () => { return; } - resourceAddedEvent = sails.services.RmrkResource.events.ResourceAdded.decode(event.data.message.payload.toU8a()); + resourceAddedEvent = sails.services.RmrkResource.events.ResourceAdded.decode(event.data.message.payload.toHex()); }); let [msgId, blockHash] = await new Promise<[HexString, HexString]>((resolve, reject) => { @@ -118,7 +118,9 @@ describe('RMRK resource', () => { expect(replyMsg).toBeDefined(); - const result = sails.services.RmrkResource.functions.AddResourceEntry.decodeResult(replyMsg.data.message.payload); + const result = sails.services.RmrkResource.functions.AddResourceEntry.decodeResult( + replyMsg.data.message.payload.toHex(), + ); expect(result).toEqual({ ok: [ diff --git a/js/test/service.test.ts b/js/test/service.test.ts index a6c98ff0..969c7e0f 100644 --- a/js/test/service.test.ts +++ b/js/test/service.test.ts @@ -1,4 +1,5 @@ import { Sails } from '../lib'; +import { hexToU8a } from '@polkadot/util'; let sails: Sails; @@ -129,7 +130,7 @@ describe('service', () => { expect(Object.keys(result.services.TestService.functions)).toHaveLength(1); expect(Object.keys(result.ctors).includes('New')).toBeTruthy(); expect(Object.keys(result.ctors.New.args)).toHaveLength(1); - expect([...result.ctors.New.encodePayload(1)]).toEqual([12, 78, 101, 119, 1, 0, 0, 0]); + expect([...hexToU8a(result.ctors.New.encodePayload(1))]).toEqual([12, 78, 101, 119, 1, 0, 0, 0]); }); test('service with events', () => { diff --git a/js/test/this-that.test.ts b/js/test/this-that.test.ts new file mode 100644 index 00000000..48e95656 --- /dev/null +++ b/js/test/this-that.test.ts @@ -0,0 +1,88 @@ +import { readFileSync } from 'fs'; +import { hexToU8a } from '@polkadot/util'; +import { Sails } from '../lib'; + +let sails: Sails; +const IDL_PATH = '../examples/this-that-svc/wasm/this-that-svc.idl'; + +beforeAll(async () => { + sails = await Sails.new(); +}); + +describe('this-that', () => { + test('parse idl', () => { + const idl = readFileSync(IDL_PATH, 'utf-8'); + + sails.parseIdl(idl); + + expect(sails.services).toHaveProperty('Service'); + + expect(sails.scaleCodecTypes).toHaveProperty('DoThatParam'); + expect(sails.scaleCodecTypes).toHaveProperty('ManyVariants'); + expect(sails.scaleCodecTypes).toHaveProperty('TupleStruct'); + expect(sails.scaleCodecTypes.TupleStruct).toEqual('(bool)'); + expect(sails.scaleCodecTypes.DoThatParam).toEqual({ + p1: 'u32', + p2: 'String', + p3: 'ManyVariants', + }); + expect(sails.scaleCodecTypes.ManyVariants).toEqual({ + _enum: { + One: 'Null', + Two: 'u32', + Three: 'Option', + Four: { a: 'u32', b: 'Option' }, + Five: '(String, H256)', + Six: '(u32)', + }, + }); + + expect(sails.services.Service.functions).toHaveProperty('DoThis'); + expect(sails.services.Service.functions).toHaveProperty('DoThat'); + expect(sails.services.Service.functions).toHaveProperty('That'); + expect(sails.services.Service.functions).toHaveProperty('This'); + }); + + test('encode/decode', async () => { + const h256Hash = '0x' + Buffer.from(new Array(32).fill(0)).toString('hex'); + + const payloadWithH256 = sails.services.Service.functions.DoThat.encodePayload({ + p1: 1, + p2: 'hello', + p3: { five: ['str', h256Hash] }, + }); + + expect(Array.from(hexToU8a(payloadWithH256))).toEqual([ + 28, 83, 101, 114, 118, 105, 99, 101, 24, 68, 111, 84, 104, 97, 116, 1, 0, 0, 0, 20, 104, 101, 108, 108, 111, 4, + 12, 115, 116, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]); + + const payloadWithU256 = sails.services.Service.functions.DoThat.encodePayload({ + p1: 2, + p2: 'world', + p3: { three: 1234567890 }, + }); + + expect(Array.from(hexToU8a(payloadWithU256))).toEqual([ + 28, 83, 101, 114, 118, 105, 99, 101, 24, 68, 111, 84, 104, 97, 116, 2, 0, 0, 0, 20, 119, 111, 114, 108, 100, 2, 1, + 210, 2, 150, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]); + + const decodedWithH256 = sails.services.Service.functions.DoThat.decodePayload(payloadWithH256); + + expect(decodedWithH256).toEqual({ + p1: 1, + p2: 'hello', + p3: { five: ['str', h256Hash] }, + }); + + const decodedWithU256 = sails.services.Service.functions.DoThat.decodePayload(payloadWithU256); + decodedWithU256.p3.three = BigInt(decodedWithU256.p3.three); // TODO: find a better way to handle this + + expect(decodedWithU256).toEqual({ + p1: 2, + p2: 'world', + p3: { three: 1234567890n }, + }); + }); +}); diff --git a/js/yarn.lock b/js/yarn.lock index 662762f1..97ddbadc 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -304,10 +304,10 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@gear-js/api@0.37.2": - version "0.37.2" - resolved "https://registry.yarnpkg.com/@gear-js/api/-/api-0.37.2.tgz#8fd33e9015b56616b5c412e3106342f4552c4884" - integrity sha512-pCT1XV4g61MMnujqUHhi3eMMQramDlvedIp29IqDDk//hYwBysmtvNz9BThaJGh/nMMW5N+Lfe1wKyEkGZiuOg== +"@gear-js/api@0.38.0": + version "0.38.0" + resolved "https://registry.yarnpkg.com/@gear-js/api/-/api-0.38.0.tgz#7a2f6745d3e2a476e226a44c0814f8a2d9f09ca2" + integrity sha512-zc+h5tv1P/qNPaihk8Za4x3IqBqseKDlMLzHNSk4GR5P3B4IN7xRzTtE/nK5v3Aunhej8DxEyO8iZwUsuib8wQ== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" diff --git a/macros/core/src/program.rs b/macros/core/src/program.rs index b4fd84c5..e579c233 100644 --- a/macros/core/src/program.rs +++ b/macros/core/src/program.rs @@ -109,9 +109,9 @@ fn generate_init( quote!( if #input_ident.starts_with(& [ #(#invocation_route_bytes),* ]) { + static INVOCATION_ROUTE: [u8; #invocation_route_len] = [ #(#invocation_route_bytes),* ]; let request = #invocation_params_struct_ident::decode(&mut &#input_ident[#invocation_route_len..]).expect("Failed to decode request"); let program = #program_type_path :: #handler_ident (#(#handler_args),*) #handler_await; - static INVOCATION_ROUTE: [u8; #invocation_route_len] = [ #(#invocation_route_bytes),* ]; (program, INVOCATION_ROUTE.as_ref()) } ) @@ -208,10 +208,11 @@ fn generate_handle( quote!( if #input_ident.starts_with(& [ #(#invocation_route_bytes),* ]) { + static INVOCATION_ROUTE: [u8; #invocation_route_len] = [ #(#invocation_route_bytes),* ]; + let msg_scope = gstd::__create_message_scope(INVOCATION_ROUTE.as_ref()); let program_ref = unsafe { #program_ident.as_ref() }.expect("Program not initialized"); let mut service = program_ref.#service_ctor_ident(); let output = service.handle(&#input_ident[#invocation_route_len..]).await; - static INVOCATION_ROUTE: [u8; #invocation_route_len] = [ #(#invocation_route_bytes),* ]; [INVOCATION_ROUTE.as_ref(), &output].concat() } ) diff --git a/macros/core/tests/snapshots/program__gprogram_generates_handle_for_multiple_services_with_empty_and_non_empty_routes.snap b/macros/core/tests/snapshots/program__gprogram_generates_handle_for_multiple_services_with_empty_and_non_empty_routes.snap index 5d0e46e1..b213e6e7 100644 --- a/macros/core/tests/snapshots/program__gprogram_generates_handle_for_multiple_services_with_empty_and_non_empty_routes.snap +++ b/macros/core/tests/snapshots/program__gprogram_generates_handle_for_multiple_services_with_empty_and_non_empty_routes.snap @@ -67,10 +67,6 @@ pub mod wasm { let output = if input .starts_with(&[32u8, 83u8, 101u8, 114u8, 118u8, 105u8, 99u8, 101u8, 50u8]) { - let program_ref = unsafe { PROGRAM.as_ref() } - .expect("Program not initialized"); - let mut service = program_ref.service2(); - let output = service.handle(&input[9usize..]).await; static INVOCATION_ROUTE: [u8; 9usize] = [ 32u8, 83u8, @@ -82,6 +78,11 @@ pub mod wasm { 101u8, 50u8, ]; + let msg_scope = gstd::__create_message_scope(INVOCATION_ROUTE.as_ref()); + let program_ref = unsafe { PROGRAM.as_ref() } + .expect("Program not initialized"); + let mut service = program_ref.service2(); + let output = service.handle(&input[9usize..]).await; [INVOCATION_ROUTE.as_ref(), &output].concat() } else { let program_ref = unsafe { PROGRAM.as_ref() } diff --git a/macros/core/tests/snapshots/program__gprogram_generates_handle_for_multiple_services_with_non_empty_routes.snap b/macros/core/tests/snapshots/program__gprogram_generates_handle_for_multiple_services_with_non_empty_routes.snap index 80893930..b37c7214 100644 --- a/macros/core/tests/snapshots/program__gprogram_generates_handle_for_multiple_services_with_non_empty_routes.snap +++ b/macros/core/tests/snapshots/program__gprogram_generates_handle_for_multiple_services_with_non_empty_routes.snap @@ -67,10 +67,6 @@ pub mod wasm { let output = if input .starts_with(&[32u8, 83u8, 101u8, 114u8, 118u8, 105u8, 99u8, 101u8, 50u8]) { - let program_ref = unsafe { PROGRAM.as_ref() } - .expect("Program not initialized"); - let mut service = program_ref.service2(); - let output = service.handle(&input[9usize..]).await; static INVOCATION_ROUTE: [u8; 9usize] = [ 32u8, 83u8, @@ -82,13 +78,19 @@ pub mod wasm { 101u8, 50u8, ]; + let msg_scope = gstd::__create_message_scope(INVOCATION_ROUTE.as_ref()); + let program_ref = unsafe { PROGRAM.as_ref() } + .expect("Program not initialized"); + let mut service = program_ref.service2(); + let output = service.handle(&input[9usize..]).await; [INVOCATION_ROUTE.as_ref(), &output].concat() } else if input.starts_with(&[16u8, 83u8, 118u8, 99u8, 49u8]) { + static INVOCATION_ROUTE: [u8; 5usize] = [16u8, 83u8, 118u8, 99u8, 49u8]; + let msg_scope = gstd::__create_message_scope(INVOCATION_ROUTE.as_ref()); let program_ref = unsafe { PROGRAM.as_ref() } .expect("Program not initialized"); let mut service = program_ref.service1(); let output = service.handle(&input[5usize..]).await; - static INVOCATION_ROUTE: [u8; 5usize] = [16u8, 83u8, 118u8, 99u8, 49u8]; [INVOCATION_ROUTE.as_ref(), &output].concat() } else { let input = String::decode(&mut input) diff --git a/macros/core/tests/snapshots/program__gprogram_generates_handle_for_single_service_with_non_empty_route.snap b/macros/core/tests/snapshots/program__gprogram_generates_handle_for_single_service_with_non_empty_route.snap index 1158cc4f..295ab043 100644 --- a/macros/core/tests/snapshots/program__gprogram_generates_handle_for_single_service_with_non_empty_route.snap +++ b/macros/core/tests/snapshots/program__gprogram_generates_handle_for_single_service_with_non_empty_route.snap @@ -59,10 +59,6 @@ pub mod wasm { let output = if input .starts_with(&[28u8, 83u8, 101u8, 114u8, 118u8, 105u8, 99u8, 101u8]) { - let program_ref = unsafe { PROGRAM.as_ref() } - .expect("Program not initialized"); - let mut service = program_ref.service(); - let output = service.handle(&input[8usize..]).await; static INVOCATION_ROUTE: [u8; 8usize] = [ 28u8, 83u8, @@ -73,6 +69,11 @@ pub mod wasm { 99u8, 101u8, ]; + let msg_scope = gstd::__create_message_scope(INVOCATION_ROUTE.as_ref()); + let program_ref = unsafe { PROGRAM.as_ref() } + .expect("Program not initialized"); + let mut service = program_ref.service(); + let output = service.handle(&input[8usize..]).await; [INVOCATION_ROUTE.as_ref(), &output].concat() } else { let input = String::decode(&mut input) diff --git a/macros/core/tests/snapshots/program__gprogram_generates_init_for_multiple_ctors.snap b/macros/core/tests/snapshots/program__gprogram_generates_init_for_multiple_ctors.snap index d91f1e25..b564d134 100644 --- a/macros/core/tests/snapshots/program__gprogram_generates_init_for_multiple_ctors.snap +++ b/macros/core/tests/snapshots/program__gprogram_generates_init_for_multiple_ctors.snap @@ -51,16 +51,16 @@ pub mod wasm { let (program, invocation_route) = if input .starts_with(&[12u8, 78u8, 101u8, 119u8]) { + static INVOCATION_ROUTE: [u8; 4usize] = [12u8, 78u8, 101u8, 119u8]; let request = __NewParams::decode(&mut &input[4usize..]) .expect("Failed to decode request"); let program = MyProgram::new(request.p1, request.p2).await; - static INVOCATION_ROUTE: [u8; 4usize] = [12u8, 78u8, 101u8, 119u8]; (program, INVOCATION_ROUTE.as_ref()) } else if input.starts_with(&[16u8, 78u8, 101u8, 119u8, 50u8]) { + static INVOCATION_ROUTE: [u8; 5usize] = [16u8, 78u8, 101u8, 119u8, 50u8]; let request = __New2Params::decode(&mut &input[5usize..]) .expect("Failed to decode request"); let program = MyProgram::new2(request.p2, request.p1); - static INVOCATION_ROUTE: [u8; 5usize] = [16u8, 78u8, 101u8, 119u8, 50u8]; (program, INVOCATION_ROUTE.as_ref()) } else { let input = String::decode(&mut input) diff --git a/macros/core/tests/snapshots/program__gprogram_generates_init_for_single_ctor.snap b/macros/core/tests/snapshots/program__gprogram_generates_init_for_single_ctor.snap index f3c9e9cf..450bfda7 100644 --- a/macros/core/tests/snapshots/program__gprogram_generates_init_for_single_ctor.snap +++ b/macros/core/tests/snapshots/program__gprogram_generates_init_for_single_ctor.snap @@ -42,10 +42,10 @@ pub mod wasm { let (program, invocation_route) = if input .starts_with(&[12u8, 78u8, 101u8, 119u8]) { + static INVOCATION_ROUTE: [u8; 4usize] = [12u8, 78u8, 101u8, 119u8]; let request = __NewParams::decode(&mut &input[4usize..]) .expect("Failed to decode request"); let program = MyProgram::new(request.p1, request.p2).await; - static INVOCATION_ROUTE: [u8; 4usize] = [12u8, 78u8, 101u8, 119u8]; (program, INVOCATION_ROUTE.as_ref()) } else { let input = String::decode(&mut input) diff --git a/rtl/src/errors.rs b/rtl/src/errors.rs index f0b08a80..ca7bff61 100644 --- a/rtl/src/errors.rs +++ b/rtl/src/errors.rs @@ -29,4 +29,6 @@ pub enum RtlError { ReplyIsAmbiguous, #[error("reply code is missing")] ReplyCodeIsMissing, + #[error("program code is not found")] + ProgramCodeIsNotFound, } diff --git a/rtl/src/gstd/events.rs b/rtl/src/gstd/events.rs index 198d5bea..59b08e10 100644 --- a/rtl/src/gstd/events.rs +++ b/rtl/src/gstd/events.rs @@ -64,12 +64,12 @@ where .map(|v| v.as_slice()) } - fn compose_payload(event: TEvents) -> Result, RtlError> { + fn compose_payload(prefix: &[u8], event: TEvents) -> Result, RtlError> { let encoded_event_names = Self::encoded_event_names()?; let payload = event.encode(); let event_idx = payload[0]; // It is safe to get this w/o any check as we know the type is a proper event type, i.e. enum let encoded_event_name = &encoded_event_names[event_idx as usize]; - Ok([&encoded_event_name[..], &payload[1..]].concat()) + Ok([prefix, &encoded_event_name[..], &payload[1..]].concat()) } } @@ -78,7 +78,10 @@ where TEvents: Encode + StaticTypeInfo, { fn trigger(&self, event: TEvents) -> Result<()> { - let payload = Self::compose_payload(event)?; + let payload = Self::compose_payload( + super::message_service_route(super::current_message_id()), + event, + )?; msg::send_bytes(GStdActorId::zero(), payload, 0)?; Ok(()) } @@ -105,7 +108,7 @@ pub mod mocks { TEvents: Encode + StaticTypeInfo, { fn trigger(&self, event: TEvents) -> Result<()> { - GStdEventTrigger::::compose_payload(event)?; + GStdEventTrigger::::compose_payload(&[], event)?; Ok(()) } } @@ -150,12 +153,15 @@ mod tests { #[test] fn compose_payload_returns_proper_payload() { let event = TestEvents::Event1(42); - let payload = GStdEventTrigger::::compose_payload(event).unwrap(); + let payload = GStdEventTrigger::::compose_payload(&[1, 2, 3], event).unwrap(); - assert_eq!(payload, [24, 69, 118, 101, 110, 116, 49, 42, 00, 00, 00]); + assert_eq!( + payload, + [1, 2, 3, 24, 69, 118, 101, 110, 116, 49, 42, 00, 00, 00] + ); let event = TestEvents::Event2 { p1: 43 }; - let payload = GStdEventTrigger::::compose_payload(event).unwrap(); + let payload = GStdEventTrigger::::compose_payload(&[], event).unwrap(); assert_eq!(payload, [24, 69, 118, 101, 110, 116, 50, 43, 00]); } diff --git a/rtl/src/gstd/mod.rs b/rtl/src/gstd/mod.rs index 423a0cb4..1d7b88b0 100644 --- a/rtl/src/gstd/mod.rs +++ b/rtl/src/gstd/mod.rs @@ -1,4 +1,4 @@ -use crate::{ActorId, ExecContext, MessageId}; +use crate::{collections::BTreeMap, ActorId, ExecContext, MessageId}; use core::cell::OnceCell; pub use gstd::{async_init, async_main, handle_signal, message_loop, msg, record_reply}; @@ -6,6 +6,42 @@ pub mod calls; pub mod events; mod types; +static mut MESSAGE_ID_TO_SERVICE_ROUTE: BTreeMap = BTreeMap::new(); + +pub fn __create_message_scope(service_route: &'static [u8]) -> __MessageScope { + let msg_id = current_message_id(); + let prev_value = unsafe { MESSAGE_ID_TO_SERVICE_ROUTE.insert(msg_id, service_route) }; + if prev_value.is_some() { + panic!( + "Service route already registered for message id: {:?}", + msg_id + ); + } + __MessageScope { msg_id } +} + +pub struct __MessageScope { + msg_id: MessageId, +} + +impl Drop for __MessageScope { + fn drop(&mut self) { + let removed_value = unsafe { MESSAGE_ID_TO_SERVICE_ROUTE.remove(&self.msg_id) }; + if removed_value.is_none() { + panic!("Service route not found for message id: {:?}", self.msg_id); + } + } +} + +fn message_service_route(msg_id: MessageId) -> &'static [u8] { + let service_route = unsafe { MESSAGE_ID_TO_SERVICE_ROUTE.get(&msg_id).copied() }; + service_route.unwrap_or_else(|| panic!("Service route not found for message id: {:?}", msg_id)) +} + +fn current_message_id() -> MessageId { + msg::id().into() +} + #[derive(Default)] pub struct GStdExecContext { msg_source: OnceCell, diff --git a/rtl/src/gtest/calls.rs b/rtl/src/gtest/calls.rs index ae0ac96f..6c7228ec 100644 --- a/rtl/src/gtest/calls.rs +++ b/rtl/src/gtest/calls.rs @@ -6,7 +6,7 @@ use crate::{ }; use core::future::Future; use gear_core_errors::{ReplyCode, SuccessReplyReason}; -use gtest::System; +use gtest::{Program, RunResult, System}; #[derive(Debug, Clone)] pub struct GTestArgs { @@ -45,18 +45,48 @@ impl GTestRemoting { } } +impl GTestRemoting { + fn extract_reply(run_result: RunResult) -> Result> { + let mut reply_iter = run_result + .log() + .iter() + .filter(|entry| entry.reply_to() == Some(run_result.sent_message_id())); + let reply = reply_iter.next().ok_or(RtlError::ReplyIsMissing)?; + if reply_iter.next().is_some() { + Err(RtlError::ReplyIsAmbiguous)? + } + let reply_code = reply.reply_code().ok_or(RtlError::ReplyCodeIsMissing)?; + if let ReplyCode::Error(error) = reply_code { + Err(error)? + } + if reply_code != ReplyCode::Success(SuccessReplyReason::Manual) { + Err(RtlError::ReplyIsMissing)? + } + Ok(reply.payload().to_vec()) + } +} + impl Remoting for GTestRemoting { async fn activate( self, - _code_id: CodeId, - _salt: impl AsRef<[u8]>, - _payload: impl AsRef<[u8]>, - _value: ValueUnit, - _args: GTestArgs, + code_id: CodeId, + salt: impl AsRef<[u8]>, + payload: impl AsRef<[u8]>, + value: ValueUnit, + args: GTestArgs, ) -> Result)>>> { - todo!(); - #[allow(unreachable_code)] - Ok(async { Ok((ActorId::from([0; 32]), vec![])) }) + let code_id = (&code_id.as_ref()[..]).into(); + let code = self + .system + .submitted_code(code_id) + .ok_or(RtlError::ProgramCodeIsNotFound)?; + let program_id = gtest::calculate_program_id(code_id, salt.as_ref(), None); + let program = Program::from_opt_and_meta_code_with_id(&self.system, program_id, code, None); + let run_result = program.send_bytes_with_value(*args.actor_id.as_ref(), payload, value); + Ok(async move { + let reply = Self::extract_reply(run_result)?; + Ok((program_id.as_ref().into(), reply)) + }) } async fn message( @@ -68,23 +98,6 @@ impl Remoting for GTestRemoting { ) -> Result>>> { let program = self.system.get_program(*target.as_ref()); let run_result = program.send_bytes_with_value(*args.actor_id.as_ref(), payload, value); - Ok(async move { - let mut reply_iter = run_result - .log() - .iter() - .filter(|entry| entry.reply_to() == Some(run_result.sent_message_id())); - let reply = reply_iter.next().ok_or(RtlError::ReplyIsMissing)?; - if reply_iter.next().is_some() { - Err(RtlError::ReplyIsAmbiguous)? - } - let reply_code = reply.reply_code().ok_or(RtlError::ReplyCodeIsMissing)?; - if let ReplyCode::Error(error) = reply_code { - Err(error)? - } - if reply_code != ReplyCode::Success(SuccessReplyReason::Manual) { - Err(RtlError::ReplyIsMissing)? - } - Ok(reply.payload().to_vec()) - }) + Ok(async move { Self::extract_reply(run_result) }) } } diff --git a/rtl/src/prelude.rs b/rtl/src/prelude.rs index 65e47ae8..26bfd5e2 100644 --- a/rtl/src/prelude.rs +++ b/rtl/src/prelude.rs @@ -41,7 +41,7 @@ pub mod collections { pub mod ffi { extern crate alloc; - pub use alloc::ffi::*; + pub use alloc::ffi::{CString, FromVecWithNulError, IntoStringError, NulError}; pub use core::ffi::*; }