this repo has no description
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

✨ Implement basic VST beacon probe registration

+797 -40
+526 -8
Cargo.lock
··· 180 180 ] 181 181 182 182 [[package]] 183 + name = "base-x" 184 + version = "0.2.11" 185 + source = "registry+https://github.com/rust-lang/crates.io-index" 186 + checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" 187 + 188 + [[package]] 183 189 name = "base64" 184 190 version = "0.22.1" 185 191 source = "registry+https://github.com/rust-lang/crates.io-index" 186 192 checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 193 + 194 + [[package]] 195 + name = "bincode" 196 + version = "1.3.3" 197 + source = "registry+https://github.com/rust-lang/crates.io-index" 198 + checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 199 + dependencies = [ 200 + "serde", 201 + ] 187 202 188 203 [[package]] 189 204 name = "bindgen" ··· 225 240 ] 226 241 227 242 [[package]] 243 + name = "borrow-bag" 244 + version = "1.1.1" 245 + source = "registry+https://github.com/rust-lang/crates.io-index" 246 + checksum = "b654fee34da149f35fa96ba970ca2d342490f7461fbaa99b6588b63595c7fccf" 247 + 248 + [[package]] 228 249 name = "bumpalo" 229 250 version = "3.16.0" 230 251 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 274 295 dependencies = [ 275 296 "camino", 276 297 "cargo-platform", 277 - "semver", 298 + "semver 1.0.25", 278 299 "serde", 279 300 "serde_json", 280 301 "thiserror", ··· 375 396 ] 376 397 377 398 [[package]] 399 + name = "const_fn" 400 + version = "0.4.11" 401 + source = "registry+https://github.com/rust-lang/crates.io-index" 402 + checksum = "2f8a2ca5ac02d09563609681103aada9e1777d54fc57a5acd7a41404f9c93b6e" 403 + 404 + [[package]] 405 + name = "cookie" 406 + version = "0.15.2" 407 + source = "registry+https://github.com/rust-lang/crates.io-index" 408 + checksum = "fc6e25dfc584d06a3dbf775d207ff00d7de98d824c952dd2233dfbb261889a42" 409 + dependencies = [ 410 + "time 0.2.27", 411 + "version_check", 412 + ] 413 + 414 + [[package]] 378 415 name = "core-foundation" 379 416 version = "0.9.4" 380 417 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 515 552 ] 516 553 517 554 [[package]] 555 + name = "discard" 556 + version = "1.0.4" 557 + source = "registry+https://github.com/rust-lang/crates.io-index" 558 + checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" 559 + 560 + [[package]] 518 561 name = "displaydoc" 519 562 version = "0.2.5" 520 563 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 667 710 ] 668 711 669 712 [[package]] 713 + name = "futures-channel" 714 + version = "0.3.31" 715 + source = "registry+https://github.com/rust-lang/crates.io-index" 716 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 717 + dependencies = [ 718 + "futures-core", 719 + ] 720 + 721 + [[package]] 722 + name = "futures-core" 723 + version = "0.3.31" 724 + source = "registry+https://github.com/rust-lang/crates.io-index" 725 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 726 + 727 + [[package]] 728 + name = "futures-macro" 729 + version = "0.3.31" 730 + source = "registry+https://github.com/rust-lang/crates.io-index" 731 + checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 732 + dependencies = [ 733 + "proc-macro2", 734 + "quote", 735 + "syn 2.0.98", 736 + ] 737 + 738 + [[package]] 739 + name = "futures-sink" 740 + version = "0.3.31" 741 + source = "registry+https://github.com/rust-lang/crates.io-index" 742 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 743 + 744 + [[package]] 745 + name = "futures-task" 746 + version = "0.3.31" 747 + source = "registry+https://github.com/rust-lang/crates.io-index" 748 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 749 + 750 + [[package]] 751 + name = "futures-util" 752 + version = "0.3.31" 753 + source = "registry+https://github.com/rust-lang/crates.io-index" 754 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 755 + dependencies = [ 756 + "futures-core", 757 + "futures-macro", 758 + "futures-task", 759 + "pin-project-lite", 760 + "pin-utils", 761 + "slab", 762 + ] 763 + 764 + [[package]] 670 765 name = "generic-array" 671 766 version = "0.14.7" 672 767 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 685 780 "cfg-if", 686 781 "js-sys", 687 782 "libc", 688 - "wasi", 783 + "wasi 0.11.0+wasi-snapshot-preview1", 689 784 "wasm-bindgen", 690 785 ] 691 786 692 787 [[package]] 788 + name = "getrandom" 789 + version = "0.3.1" 790 + source = "registry+https://github.com/rust-lang/crates.io-index" 791 + checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" 792 + dependencies = [ 793 + "cfg-if", 794 + "libc", 795 + "wasi 0.13.3+wasi-0.2.2", 796 + "windows-targets 0.52.5", 797 + ] 798 + 799 + [[package]] 693 800 name = "gif" 694 801 version = "0.13.1" 695 802 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 723 830 ] 724 831 725 832 [[package]] 833 + name = "gotham" 834 + version = "0.7.4" 835 + source = "registry+https://github.com/rust-lang/crates.io-index" 836 + checksum = "9c0e1892f0ec4bb9a4f5441c1d56af1d13d9bbb2a8f44ac58a670862eff3f8a6" 837 + dependencies = [ 838 + "anyhow", 839 + "base64", 840 + "bincode", 841 + "borrow-bag", 842 + "bytes", 843 + "cookie", 844 + "futures-util", 845 + "gotham_derive", 846 + "httpdate", 847 + "hyper", 848 + "linked-hash-map", 849 + "log", 850 + "mime", 851 + "mime_guess", 852 + "num_cpus", 853 + "percent-encoding", 854 + "pin-project", 855 + "rand", 856 + "rand_chacha", 857 + "regex", 858 + "serde", 859 + "thiserror", 860 + "time 0.3.37", 861 + "tokio", 862 + "uuid", 863 + ] 864 + 865 + [[package]] 866 + name = "gotham_derive" 867 + version = "0.7.1" 868 + source = "registry+https://github.com/rust-lang/crates.io-index" 869 + checksum = "b39260b1324f4cf40bf4d86e4aa3a7574fabf6b25fe1b07345b776698d2a0459" 870 + dependencies = [ 871 + "quote", 872 + "syn 2.0.98", 873 + ] 874 + 875 + [[package]] 876 + name = "h2" 877 + version = "0.3.26" 878 + source = "registry+https://github.com/rust-lang/crates.io-index" 879 + checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 880 + dependencies = [ 881 + "bytes", 882 + "fnv", 883 + "futures-core", 884 + "futures-sink", 885 + "futures-util", 886 + "http 0.2.12", 887 + "indexmap", 888 + "slab", 889 + "tokio", 890 + "tokio-util", 891 + "tracing", 892 + ] 893 + 894 + [[package]] 726 895 name = "half" 727 896 version = "1.8.3" 728 897 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 777 946 778 947 [[package]] 779 948 name = "http" 949 + version = "0.2.12" 950 + source = "registry+https://github.com/rust-lang/crates.io-index" 951 + checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 952 + dependencies = [ 953 + "bytes", 954 + "fnv", 955 + "itoa", 956 + ] 957 + 958 + [[package]] 959 + name = "http" 780 960 version = "1.2.0" 781 961 source = "registry+https://github.com/rust-lang/crates.io-index" 782 962 checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" ··· 787 967 ] 788 968 789 969 [[package]] 970 + name = "http-body" 971 + version = "0.4.6" 972 + source = "registry+https://github.com/rust-lang/crates.io-index" 973 + checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 974 + dependencies = [ 975 + "bytes", 976 + "http 0.2.12", 977 + "pin-project-lite", 978 + ] 979 + 980 + [[package]] 790 981 name = "httparse" 791 982 version = "1.10.0" 792 983 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 805 996 checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 806 997 807 998 [[package]] 999 + name = "hyper" 1000 + version = "0.14.32" 1001 + source = "registry+https://github.com/rust-lang/crates.io-index" 1002 + checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" 1003 + dependencies = [ 1004 + "bytes", 1005 + "futures-channel", 1006 + "futures-core", 1007 + "futures-util", 1008 + "h2", 1009 + "http 0.2.12", 1010 + "http-body", 1011 + "httparse", 1012 + "httpdate", 1013 + "itoa", 1014 + "pin-project-lite", 1015 + "socket2", 1016 + "tokio", 1017 + "tower-service", 1018 + "tracing", 1019 + "want", 1020 + ] 1021 + 1022 + [[package]] 808 1023 name = "iana-time-zone" 809 1024 version = "0.1.60" 810 1025 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1083 1298 checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" 1084 1299 1085 1300 [[package]] 1301 + name = "linked-hash-map" 1302 + version = "0.5.6" 1303 + source = "registry+https://github.com/rust-lang/crates.io-index" 1304 + checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 1305 + 1306 + [[package]] 1086 1307 name = "litemap" 1087 1308 version = "0.7.4" 1088 1309 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1163 1384 ] 1164 1385 1165 1386 [[package]] 1387 + name = "mime" 1388 + version = "0.3.17" 1389 + source = "registry+https://github.com/rust-lang/crates.io-index" 1390 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1391 + 1392 + [[package]] 1393 + name = "mime_guess" 1394 + version = "2.0.5" 1395 + source = "registry+https://github.com/rust-lang/crates.io-index" 1396 + checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" 1397 + dependencies = [ 1398 + "mime", 1399 + "unicase", 1400 + ] 1401 + 1402 + [[package]] 1166 1403 name = "minimal-lexical" 1167 1404 version = "0.2.1" 1168 1405 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1188 1425 ] 1189 1426 1190 1427 [[package]] 1428 + name = "mio" 1429 + version = "1.0.3" 1430 + source = "registry+https://github.com/rust-lang/crates.io-index" 1431 + checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1432 + dependencies = [ 1433 + "libc", 1434 + "wasi 0.11.0+wasi-snapshot-preview1", 1435 + "windows-sys", 1436 + ] 1437 + 1438 + [[package]] 1191 1439 name = "nanoid" 1192 1440 version = "0.4.0" 1193 1441 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1221 1469 "log", 1222 1470 "once_cell", 1223 1471 "termcolor", 1224 - "time", 1472 + "time 0.3.37", 1225 1473 "windows", 1226 1474 ] 1227 1475 ··· 1452 1700 checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" 1453 1701 1454 1702 [[package]] 1703 + name = "pin-project" 1704 + version = "1.1.9" 1705 + source = "registry+https://github.com/rust-lang/crates.io-index" 1706 + checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" 1707 + dependencies = [ 1708 + "pin-project-internal", 1709 + ] 1710 + 1711 + [[package]] 1712 + name = "pin-project-internal" 1713 + version = "1.1.9" 1714 + source = "registry+https://github.com/rust-lang/crates.io-index" 1715 + checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" 1716 + dependencies = [ 1717 + "proc-macro2", 1718 + "quote", 1719 + "syn 2.0.98", 1720 + ] 1721 + 1722 + [[package]] 1455 1723 name = "pin-project-lite" 1456 1724 version = "0.2.16" 1457 1725 source = "registry+https://github.com/rust-lang/crates.io-index" 1458 1726 checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1727 + 1728 + [[package]] 1729 + name = "pin-utils" 1730 + version = "0.1.0" 1731 + source = "registry+https://github.com/rust-lang/crates.io-index" 1732 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1459 1733 1460 1734 [[package]] 1461 1735 name = "pkg-config" ··· 1510 1784 checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1511 1785 1512 1786 [[package]] 1787 + name = "proc-macro-hack" 1788 + version = "0.5.20+deprecated" 1789 + source = "registry+https://github.com/rust-lang/crates.io-index" 1790 + checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" 1791 + 1792 + [[package]] 1513 1793 name = "proc-macro2" 1514 1794 version = "1.0.93" 1515 1795 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1560 1840 source = "registry+https://github.com/rust-lang/crates.io-index" 1561 1841 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1562 1842 dependencies = [ 1563 - "getrandom", 1843 + "getrandom 0.2.14", 1564 1844 ] 1565 1845 1566 1846 [[package]] ··· 1682 1962 dependencies = [ 1683 1963 "cc", 1684 1964 "cfg-if", 1685 - "getrandom", 1965 + "getrandom 0.2.14", 1686 1966 "libc", 1687 1967 "untrusted", 1688 1968 "windows-sys", ··· 1719 1999 checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1720 2000 1721 2001 [[package]] 2002 + name = "rustc_version" 2003 + version = "0.2.3" 2004 + source = "registry+https://github.com/rust-lang/crates.io-index" 2005 + checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 2006 + dependencies = [ 2007 + "semver 0.9.0", 2008 + ] 2009 + 2010 + [[package]] 1722 2011 name = "rustls" 1723 2012 version = "0.23.23" 1724 2013 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1817 2106 1818 2107 [[package]] 1819 2108 name = "semver" 2109 + version = "0.9.0" 2110 + source = "registry+https://github.com/rust-lang/crates.io-index" 2111 + checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 2112 + dependencies = [ 2113 + "semver-parser", 2114 + ] 2115 + 2116 + [[package]] 2117 + name = "semver" 1820 2118 version = "1.0.25" 1821 2119 source = "registry+https://github.com/rust-lang/crates.io-index" 1822 2120 checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" 1823 2121 dependencies = [ 1824 2122 "serde", 1825 2123 ] 2124 + 2125 + [[package]] 2126 + name = "semver-parser" 2127 + version = "0.7.0" 2128 + source = "registry+https://github.com/rust-lang/crates.io-index" 2129 + checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 1826 2130 1827 2131 [[package]] 1828 2132 name = "serde" ··· 1875 2179 ] 1876 2180 1877 2181 [[package]] 2182 + name = "sha1" 2183 + version = "0.6.1" 2184 + source = "registry+https://github.com/rust-lang/crates.io-index" 2185 + checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" 2186 + dependencies = [ 2187 + "sha1_smol", 2188 + ] 2189 + 2190 + [[package]] 2191 + name = "sha1_smol" 2192 + version = "1.0.1" 2193 + source = "registry+https://github.com/rust-lang/crates.io-index" 2194 + checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" 2195 + 2196 + [[package]] 1878 2197 name = "sha2" 1879 2198 version = "0.10.8" 1880 2199 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1897 2216 "docopt", 1898 2217 "env_logger", 1899 2218 "ffmpeg-next", 1900 - "getrandom", 2219 + "futures-util", 2220 + "getrandom 0.2.14", 2221 + "gotham", 1901 2222 "handlebars", 1902 2223 "hound", 1903 2224 "indicatif", ··· 1959 2280 checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 1960 2281 1961 2282 [[package]] 2283 + name = "slab" 2284 + version = "0.4.9" 2285 + source = "registry+https://github.com/rust-lang/crates.io-index" 2286 + checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2287 + dependencies = [ 2288 + "autocfg", 2289 + ] 2290 + 2291 + [[package]] 1962 2292 name = "slotmap" 1963 2293 version = "1.0.7" 1964 2294 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1984 2314 checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" 1985 2315 1986 2316 [[package]] 2317 + name = "socket2" 2318 + version = "0.5.8" 2319 + source = "registry+https://github.com/rust-lang/crates.io-index" 2320 + checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 2321 + dependencies = [ 2322 + "libc", 2323 + "windows-sys", 2324 + ] 2325 + 2326 + [[package]] 1987 2327 name = "stable_deref_trait" 1988 2328 version = "1.2.0" 1989 2329 source = "registry+https://github.com/rust-lang/crates.io-index" 1990 2330 checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1991 2331 1992 2332 [[package]] 2333 + name = "standback" 2334 + version = "0.2.17" 2335 + source = "registry+https://github.com/rust-lang/crates.io-index" 2336 + checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" 2337 + dependencies = [ 2338 + "version_check", 2339 + ] 2340 + 2341 + [[package]] 2342 + name = "stdweb" 2343 + version = "0.4.20" 2344 + source = "registry+https://github.com/rust-lang/crates.io-index" 2345 + checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" 2346 + dependencies = [ 2347 + "discard", 2348 + "rustc_version", 2349 + "stdweb-derive", 2350 + "stdweb-internal-macros", 2351 + "stdweb-internal-runtime", 2352 + "wasm-bindgen", 2353 + ] 2354 + 2355 + [[package]] 2356 + name = "stdweb-derive" 2357 + version = "0.5.3" 2358 + source = "registry+https://github.com/rust-lang/crates.io-index" 2359 + checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" 2360 + dependencies = [ 2361 + "proc-macro2", 2362 + "quote", 2363 + "serde", 2364 + "serde_derive", 2365 + "syn 1.0.109", 2366 + ] 2367 + 2368 + [[package]] 2369 + name = "stdweb-internal-macros" 2370 + version = "0.2.9" 2371 + source = "registry+https://github.com/rust-lang/crates.io-index" 2372 + checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" 2373 + dependencies = [ 2374 + "base-x", 2375 + "proc-macro2", 2376 + "quote", 2377 + "serde", 2378 + "serde_derive", 2379 + "serde_json", 2380 + "sha1", 2381 + "syn 1.0.109", 2382 + ] 2383 + 2384 + [[package]] 2385 + name = "stdweb-internal-runtime" 2386 + version = "0.1.5" 2387 + source = "registry+https://github.com/rust-lang/crates.io-index" 2388 + checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" 2389 + 2390 + [[package]] 1993 2391 name = "strict-num" 1994 2392 version = "0.1.1" 1995 2393 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2112 2510 2113 2511 [[package]] 2114 2512 name = "time" 2513 + version = "0.2.27" 2514 + source = "registry+https://github.com/rust-lang/crates.io-index" 2515 + checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" 2516 + dependencies = [ 2517 + "const_fn", 2518 + "libc", 2519 + "standback", 2520 + "stdweb", 2521 + "time-macros 0.1.1", 2522 + "version_check", 2523 + "winapi", 2524 + ] 2525 + 2526 + [[package]] 2527 + name = "time" 2115 2528 version = "0.3.37" 2116 2529 source = "registry+https://github.com/rust-lang/crates.io-index" 2117 2530 checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" ··· 2124 2537 "powerfmt", 2125 2538 "serde", 2126 2539 "time-core", 2127 - "time-macros", 2540 + "time-macros 0.2.19", 2128 2541 ] 2129 2542 2130 2543 [[package]] ··· 2135 2548 2136 2549 [[package]] 2137 2550 name = "time-macros" 2551 + version = "0.1.1" 2552 + source = "registry+https://github.com/rust-lang/crates.io-index" 2553 + checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" 2554 + dependencies = [ 2555 + "proc-macro-hack", 2556 + "time-macros-impl", 2557 + ] 2558 + 2559 + [[package]] 2560 + name = "time-macros" 2138 2561 version = "0.2.19" 2139 2562 source = "registry+https://github.com/rust-lang/crates.io-index" 2140 2563 checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" 2141 2564 dependencies = [ 2142 2565 "num-conv", 2143 2566 "time-core", 2567 + ] 2568 + 2569 + [[package]] 2570 + name = "time-macros-impl" 2571 + version = "0.1.2" 2572 + source = "registry+https://github.com/rust-lang/crates.io-index" 2573 + checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" 2574 + dependencies = [ 2575 + "proc-macro-hack", 2576 + "proc-macro2", 2577 + "quote", 2578 + "standback", 2579 + "syn 1.0.109", 2144 2580 ] 2145 2581 2146 2582 [[package]] ··· 2207 2643 checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2208 2644 2209 2645 [[package]] 2646 + name = "tokio" 2647 + version = "1.43.0" 2648 + source = "registry+https://github.com/rust-lang/crates.io-index" 2649 + checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" 2650 + dependencies = [ 2651 + "backtrace", 2652 + "bytes", 2653 + "libc", 2654 + "mio", 2655 + "pin-project-lite", 2656 + "socket2", 2657 + "windows-sys", 2658 + ] 2659 + 2660 + [[package]] 2661 + name = "tokio-util" 2662 + version = "0.7.13" 2663 + source = "registry+https://github.com/rust-lang/crates.io-index" 2664 + checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" 2665 + dependencies = [ 2666 + "bytes", 2667 + "futures-core", 2668 + "futures-sink", 2669 + "pin-project-lite", 2670 + "tokio", 2671 + ] 2672 + 2673 + [[package]] 2210 2674 name = "toml" 2211 2675 version = "0.7.8" 2212 2676 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2241 2705 ] 2242 2706 2243 2707 [[package]] 2708 + name = "tower-service" 2709 + version = "0.3.3" 2710 + source = "registry+https://github.com/rust-lang/crates.io-index" 2711 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2712 + 2713 + [[package]] 2244 2714 name = "tracing" 2245 2715 version = "0.1.41" 2246 2716 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2272 2742 ] 2273 2743 2274 2744 [[package]] 2745 + name = "try-lock" 2746 + version = "0.2.5" 2747 + source = "registry+https://github.com/rust-lang/crates.io-index" 2748 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2749 + 2750 + [[package]] 2275 2751 name = "ttf-parser" 2276 2752 version = "0.24.1" 2277 2753 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2293 2769 checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" 2294 2770 2295 2771 [[package]] 2772 + name = "unicase" 2773 + version = "2.8.1" 2774 + source = "registry+https://github.com/rust-lang/crates.io-index" 2775 + checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 2776 + 2777 + [[package]] 2296 2778 name = "unicode-bidi" 2297 2779 version = "0.3.18" 2298 2780 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2371 2853 checksum = "2c51fe73e1d8c4e06bb2698286f7e7453c6fc90528d6d2e7fc36bb4e87fe09b1" 2372 2854 dependencies = [ 2373 2855 "base64", 2374 - "http", 2856 + "http 1.2.0", 2375 2857 "httparse", 2376 2858 "log", 2377 2859 ] ··· 2439 2921 checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2440 2922 2441 2923 [[package]] 2924 + name = "uuid" 2925 + version = "1.15.1" 2926 + source = "registry+https://github.com/rust-lang/crates.io-index" 2927 + checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" 2928 + dependencies = [ 2929 + "getrandom 0.3.1", 2930 + ] 2931 + 2932 + [[package]] 2442 2933 name = "vcpkg" 2443 2934 version = "0.2.15" 2444 2935 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2500 2991 ] 2501 2992 2502 2993 [[package]] 2994 + name = "want" 2995 + version = "0.3.1" 2996 + source = "registry+https://github.com/rust-lang/crates.io-index" 2997 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2998 + dependencies = [ 2999 + "try-lock", 3000 + ] 3001 + 3002 + [[package]] 2503 3003 name = "wasi" 2504 3004 version = "0.11.0+wasi-snapshot-preview1" 2505 3005 source = "registry+https://github.com/rust-lang/crates.io-index" 2506 3006 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3007 + 3008 + [[package]] 3009 + name = "wasi" 3010 + version = "0.13.3+wasi-0.2.2" 3011 + source = "registry+https://github.com/rust-lang/crates.io-index" 3012 + checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" 3013 + dependencies = [ 3014 + "wit-bindgen-rt", 3015 + ] 2507 3016 2508 3017 [[package]] 2509 3018 name = "wasm-bindgen" ··· 2776 3285 checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" 2777 3286 dependencies = [ 2778 3287 "memchr", 3288 + ] 3289 + 3290 + [[package]] 3291 + name = "wit-bindgen-rt" 3292 + version = "0.33.0" 3293 + source = "registry+https://github.com/rust-lang/crates.io-index" 3294 + checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" 3295 + dependencies = [ 3296 + "bitflags 2.8.0", 2779 3297 ] 2780 3298 2781 3299 [[package]]
+3 -1
Cargo.toml
··· 22 22 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 23 23 24 24 [features] 25 - vst = ["dep:env_logger", "dep:nih_plug", "dep:ureq"] 25 + vst = ["dep:env_logger", "dep:nih_plug", "dep:ureq", "dep:gotham"] 26 26 web = ["dep:wasm-bindgen", "dep:web-sys"] 27 27 mp4 = ["dep:env_logger", "dep:ffmpeg-next", "dep:video-rs"] 28 28 ··· 74 74 ffmpeg-next = { version = "7.1.0", optional = true } 75 75 rayon = "1.10.0" 76 76 num_cpus = "1.16.0" 77 + gotham = { version = "0.7.4", optional = true } 78 + futures-util = "0.3.31" 77 79 78 80 79 81 [dev-dependencies]
+4 -1
Justfile
··· 5 5 cp target/debug/shapemaker . 6 6 7 7 vst: 8 - cargo xtask bundle shapemaker --release 8 + cargo xtask bundle shapemaker --release --features vst 9 9 gsudo cp "target/bundled/Shapemaker VST.vst3/Contents/x86_64-win/Shapemaker VST.vst3" "C:/Program Files/Common Files/VST3/Shapemaker VST.vst3" 10 + 11 + beacon out="out.mp4" args="": 12 + ./shapemaker beacon start {{out}} {{args}} 10 13 11 14 web: 12 15 wasm-pack build --target web -d examples/web --features web
+3
src/cli/mod.rs
··· 13 13 ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀v?.?.?▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ 14 14 15 15 Usage: shapemaker (image|video) [options] [--color <mapping>...] <file> 16 + shapemaker beacon start [options] [--color <mapping>...] <file> 16 17 shapemaker --help 17 18 shapemaker --version 18 19 ··· 76 77 pub struct Args { 77 78 pub cmd_image: bool, 78 79 pub cmd_video: bool, 80 + pub cmd_beacon: bool, 81 + pub cmd_start: bool, 79 82 pub arg_file: String, 80 83 pub flag_version: bool, 81 84 pub flag_color: Vec<String>,
+3
src/lib.rs
··· 13 13 #[cfg(feature = "web")] 14 14 pub mod wasm; 15 15 16 + #[cfg(feature = "vst")] 17 + pub mod vst; 18 + 16 19 pub use geometry::{Angle, Containable, Point, Region}; 17 20 pub use graphics::{ 18 21 Canvas, Color, ColorMapping, ColoredObject, Fill, Filter, FilterType, Layer, LineSegment,
+18 -2
src/main.rs
··· 21 21 info_time!("run"); 22 22 let mut canvas = canvas_from_cli(&args); 23 23 24 - if args.cmd_image && !args.cmd_video { 24 + if args.cmd_image { 25 25 canvas = examples::title(); 26 26 27 27 if args.arg_file.ends_with(".svg") { ··· 44 44 } 45 45 } 46 46 Ok(()) 47 + } else if args.cmd_video { 48 + run_video(args, canvas) 49 + } else if args.cmd_beacon && args.cmd_start { 50 + run_beacon_start(args, canvas) 47 51 } else { 48 - run_video(args, canvas) 52 + Ok(()) 49 53 } 54 + } 55 + 56 + #[cfg(not(feature = "vst"))] 57 + fn run_beacon_start(_args: cli::Args, _canvas: Canvas) -> Result<()> { 58 + println!("VST support is disabled. Enable the vst feature to use VST beaconing."); 59 + Ok(()) 60 + } 61 + 62 + #[cfg(feature = "vst")] 63 + fn run_beacon_start(_args: cli::Args, _canvas: Canvas) -> Result<()> { 64 + pub use vst::beacon::server::Beacon; 65 + Beacon::start() 50 66 } 51 67 52 68 #[cfg(not(feature = "mp4"))]
+207
src/vst/beacon.rs
··· 1 + use std::fmt::Display; 2 + 3 + use serde::{Deserialize, Serialize}; 4 + use ureq::http::Uri; 5 + 6 + #[derive(Serialize, Deserialize, Clone)] 7 + pub struct Probe { 8 + pub id: u32, 9 + pub added_at: String, 10 + pub automation_name: String, 11 + pub midi_name: String, 12 + pub audio_name: String, 13 + } 14 + 15 + impl Probe { 16 + /// Returns a new probe with the `added_at` field set to the current time. 17 + pub fn with_added_at_now(&self) -> Self { 18 + return Self { 19 + added_at: chrono::Utc::now().to_rfc3339(), 20 + ..self.clone() 21 + }; 22 + } 23 + } 24 + 25 + impl Display for Probe { 26 + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 27 + write!(f, "probe {} [", self.id)?; 28 + if !self.automation_name.is_empty() { 29 + write!(f, "automation \"{}\"", self.automation_name)?; 30 + if !self.midi_name.is_empty() || !self.audio_name.is_empty() { 31 + write!(f, " ")?; 32 + } 33 + } 34 + if !self.midi_name.is_empty() { 35 + write!(f, "midi \"{}\"", self.midi_name)?; 36 + if !self.audio_name.is_empty() { 37 + write!(f, " ")?; 38 + } 39 + } 40 + if !self.audio_name.is_empty() { 41 + write!(f, "audio \"{}\"", self.audio_name)?; 42 + } 43 + write!(f, "]")?; 44 + return Ok(()); 45 + } 46 + } 47 + 48 + const BEACON_PORT: u16 = 8080; 49 + 50 + #[inline] 51 + pub fn beacon_url() -> Uri { 52 + return format!("http://localhost:{BEACON_PORT}") 53 + .parse() 54 + .expect("Invalid default beacon URL"); 55 + } 56 + 57 + pub mod requests { 58 + use anyhow::Result; 59 + use ureq::{http::Response, Body}; 60 + 61 + use super::{beacon_url, Probe}; 62 + 63 + pub fn register_probe(probe: Probe) -> Result<Response<Body>> { 64 + return Ok( 65 + ureq::put(format!("{}/probes/{}", beacon_url(), probe.id).as_str()) 66 + .content_type("application/json") 67 + .send( 68 + serde_json::to_string(&probe) 69 + .expect("Failed to serialize probe") 70 + .as_bytes(), 71 + )?, 72 + ); 73 + } 74 + 75 + pub fn unregister_probe(id: u32) -> Result<Response<Body>> { 76 + return Ok(ureq::delete(format!("{}/probes/{}", beacon_url(), id).as_str()).call()?); 77 + } 78 + } 79 + 80 + pub mod server { 81 + use std::{ 82 + str::FromStr, 83 + sync::{Mutex, MutexGuard}, 84 + }; 85 + 86 + use super::{Probe, BEACON_PORT}; 87 + use anyhow::Result; 88 + use futures_util::{future, FutureExt}; 89 + use gotham::{ 90 + self, 91 + helpers::http::response::{create_empty_response, create_response}, 92 + hyper::{body, Body, StatusCode}, 93 + mime::Mime, 94 + prelude::{DefineSingleRoute, DrawRoutes, StaticResponseExtender}, 95 + router::build_simple_router, 96 + state::{FromState, State, StateData}, 97 + }; 98 + use once_cell::sync::Lazy; 99 + use serde::Deserialize; 100 + 101 + #[derive(Default)] 102 + pub struct Beacon { 103 + pub probes: Vec<Probe>, 104 + } 105 + 106 + static BEACON: Lazy<Mutex<Beacon>> = Lazy::new(|| Mutex::new(Beacon::default())); 107 + 108 + pub fn get_beacon() -> MutexGuard<'static, Beacon> { 109 + return BEACON.lock().unwrap(); 110 + } 111 + 112 + #[derive(Debug, Deserialize, StateData, StaticResponseExtender)] 113 + struct PathExtractorId { 114 + id: u32, 115 + } 116 + 117 + impl Beacon { 118 + pub fn new() -> Self { 119 + return Self::default(); 120 + } 121 + 122 + pub fn start() -> Result<()> { 123 + let router = build_simple_router(|route| { 124 + route.get("/probes").to(|state| { 125 + let beacon = get_beacon(); 126 + let body = 127 + serde_json::to_string(&beacon.probes).expect("Failed to serialize probes"); 128 + let response = create_response( 129 + &state, 130 + StatusCode::OK, 131 + Mime::from_str("application/json").unwrap(), 132 + body, 133 + ); 134 + (state, response) 135 + }); 136 + route 137 + .delete("/probes/:id") 138 + .with_path_extractor::<PathExtractorId>() 139 + .to(|state: State| { 140 + let id = state.borrow::<PathExtractorId>().id; 141 + let mut beacon = get_beacon(); 142 + println!("Beacon: removing probe {id}"); 143 + let probe_index = beacon.probes.iter().position(|probe| probe.id == id); 144 + match probe_index { 145 + Some(probe_index) => { 146 + let removed_probe = beacon.probes.remove(probe_index); 147 + println!("Beacon: removed {removed_probe}"); 148 + let response = 149 + create_empty_response(&state, StatusCode::NO_CONTENT); 150 + (state, response) 151 + } 152 + None => { 153 + println!("Beacon: probe {id} not found"); 154 + let response = create_empty_response(&state, StatusCode::NOT_FOUND); 155 + (state, response) 156 + } 157 + } 158 + }); 159 + route 160 + .put("/probes/:id") 161 + .with_path_extractor::<PathExtractorId>() 162 + .to(|mut state: State| { 163 + let id = state.borrow::<PathExtractorId>().id; 164 + let f = 165 + body::to_bytes(Body::take_from(&mut state)).then(move |full_body| { 166 + match full_body { 167 + Ok(valid_body) => { 168 + let content = String::from_utf8(valid_body.to_vec()) 169 + .expect("Failed to parse body"); 170 + match serde_json::from_str::<Probe>(&content) { 171 + Ok(new_probe) => { 172 + if new_probe.id != id { 173 + return future::err(( 174 + state, 175 + anyhow::anyhow!( 176 + "Probe ID does not match URL ID" 177 + ) 178 + .into(), 179 + )); 180 + } 181 + 182 + println!("Beacon: registering {new_probe}"); 183 + let mut beacon = get_beacon(); 184 + beacon.probes.push(new_probe); 185 + let response = create_empty_response( 186 + &state, 187 + StatusCode::CREATED, 188 + ); 189 + future::ok((state, response)) 190 + } 191 + Err(_) => future::err(( 192 + state, 193 + anyhow::anyhow!("Failed to parse probe").into(), 194 + )), 195 + } 196 + } 197 + Err(e) => future::err((state, e.into())), 198 + } 199 + }); 200 + f.boxed() 201 + }); 202 + }); 203 + println!("Starting beacon server on port {}", BEACON_PORT); 204 + gotham::start(format!("127.0.0.1:{BEACON_PORT}"), router).map_err(|e| e.into()) 205 + } 206 + } 207 + }
+8
src/vst/mod.rs
··· 1 + pub mod beacon; 2 + pub mod vst; 3 + 4 + use nih_plug::{nih_export_clap, nih_export_vst3}; 5 + pub use vst::*; 6 + 7 + nih_export_clap!(ShapemakerVST); 8 + nih_export_vst3!(ShapemakerVST);
+25 -28
src/vst/vst.rs
··· 1 1 use nih_plug::prelude::*; 2 + use rand::Rng; 2 3 use std::sync::Arc; 3 - use ureq; 4 4 5 - // This is a shortened version of the gain example with most comments removed, check out 6 - // https://github.com/robbert-vdh/nih-plug/blob/master/plugins/examples/gain/src/lib.rs to get 7 - // started 5 + use super::beacon::{self, Probe}; 8 6 9 - struct ShapemakerVST { 7 + pub struct ShapemakerVST { 10 8 params: Arc<ShapemakerVSTParams>, 9 + probe: Probe, 11 10 } 12 11 13 12 #[derive(Params)] 14 13 struct ShapemakerVSTParams { 15 - /// The parameter's ID is used to identify the parameter in the wrappred plugin API. As long as 16 - /// these IDs remain constant, you can rename and reorder these fields as you wish. The 17 - /// parameters are exposed to the host in the same order they were defined. In this case, this 18 - /// gain parameter is stored as linear gain while the values are displayed in decibels. 19 - #[id = "gain"] 20 - pub gain: FloatParam, 14 + /// Used to send automation data to Shapemaker 15 + #[id = "automation"] 16 + pub automation: FloatParam, 21 17 } 22 18 23 19 impl Default for ShapemakerVST { 24 20 fn default() -> Self { 25 21 Self { 26 22 params: Arc::new(ShapemakerVSTParams::default()), 23 + probe: Probe { 24 + id: rand::thread_rng().gen_range(1..=u32::MAX), 25 + added_at: chrono::Utc::now().to_rfc3339(), 26 + automation_name: "".to_string(), 27 + midi_name: "".to_string(), 28 + audio_name: "".to_string(), 29 + }, 27 30 } 28 31 } 29 32 } ··· 31 34 impl Default for ShapemakerVSTParams { 32 35 fn default() -> Self { 33 36 Self { 34 - // This gain is stored as linear gain. NIH-plug comes with useful conversion functions 35 - // to treat these kinds of parameters as if we were dealing with decibels. Storing this 36 - // as decibels is easier to work with, but requires a conversion for every sample. 37 - gain: FloatParam::new( 38 - "Gain", 37 + automation: FloatParam::new( 38 + "Send automation data", 39 39 util::db_to_gain(0.0), 40 40 FloatRange::Skewed { 41 41 min: util::db_to_gain(-30.0), ··· 59 59 } 60 60 61 61 impl Plugin for ShapemakerVST { 62 - const NAME: &'static str = "Shapemaker VST"; 62 + const NAME: &'static str = "Shapemaker VST b3"; 63 63 const VENDOR: &'static str = "Gwenn Le Bihan"; 64 64 const URL: &'static str = env!("CARGO_PKG_HOMEPAGE"); 65 - const EMAIL: &'static str = "hey@ewen.works"; 65 + const EMAIL: &'static str = "gwenn.lebihan7@gmail.com"; 66 66 67 67 const VERSION: &'static str = env!("CARGO_PKG_VERSION"); 68 68 ··· 81 81 names: PortNames::const_default(), 82 82 }]; 83 83 84 - const MIDI_INPUT: MidiConfig = MidiConfig::None; 84 + const MIDI_INPUT: MidiConfig = MidiConfig::MidiCCs; 85 85 const MIDI_OUTPUT: MidiConfig = MidiConfig::None; 86 86 87 87 const SAMPLE_ACCURATE_AUTOMATION: bool = true; ··· 105 105 _buffer_config: &BufferConfig, 106 106 _context: &mut impl InitContext<Self>, 107 107 ) -> bool { 108 - // Resize buffers and perform other potentially expensive initialization operations here. 109 - // The `reset()` function is always called right after this function. You can remove this 110 - // function if you do not need it. 111 - // Make a debug request to localhost:8080 112 - let _ = ureq::get("http://localhost:8080/haiiiii").call(); 108 + let _ = beacon::requests::register_probe(self.probe.with_added_at_now()); 113 109 true 114 110 } 115 111 ··· 118 114 // allocate. You can remove this function if you do not need it. 119 115 } 120 116 117 + fn deactivate(&mut self) { 118 + let _ = beacon::requests::unregister_probe(self.probe.id); 119 + } 120 + 121 121 fn process( 122 122 &mut self, 123 123 buffer: &mut Buffer, ··· 126 126 ) -> ProcessStatus { 127 127 for channel_samples in buffer.iter_samples() { 128 128 // Smoothing is optionally built into the parameters themselves 129 - let gain = self.params.gain.smoothed.next(); 129 + let gain = self.params.automation.smoothed.next(); 130 130 131 131 for sample in channel_samples { 132 132 *sample *= gain; ··· 155 155 const VST3_SUBCATEGORIES: &'static [Vst3SubCategory] = 156 156 &[Vst3SubCategory::Fx, Vst3SubCategory::Dynamics]; 157 157 } 158 - 159 - nih_export_clap!(ShapemakerVST); 160 - nih_export_vst3!(ShapemakerVST);