From f6c57b23b42d4c9b3561ac82a0d69968c4c16a6e Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Mon, 26 Aug 2024 20:01:10 +0100 Subject: [PATCH] feat: bindings for node.js --- Cargo.lock | 243 ++++++++++++++++++++-------- Cargo.toml | 7 +- crates/bindings/node/.gitignore | 7 + crates/bindings/node/Cargo.toml | 24 +++ crates/bindings/node/README.md | 92 +++++++++++ crates/bindings/node/index.d.ts | 66 ++++++++ crates/bindings/node/package.json | 36 +++++ crates/bindings/node/pnpm-lock.yaml | 117 ++++++++++++++ crates/bindings/node/src/lib.rs | 170 +++++++++++++++++++ crates/bindings/node/test.js | 53 ++++++ crates/bindings/package-lock.json | 6 + 11 files changed, 752 insertions(+), 69 deletions(-) create mode 100644 crates/bindings/node/.gitignore create mode 100644 crates/bindings/node/Cargo.toml create mode 100644 crates/bindings/node/README.md create mode 100644 crates/bindings/node/index.d.ts create mode 100644 crates/bindings/node/package.json create mode 100644 crates/bindings/node/pnpm-lock.yaml create mode 100644 crates/bindings/node/src/lib.rs create mode 100644 crates/bindings/node/test.js create mode 100644 crates/bindings/package-lock.json diff --git a/Cargo.lock b/Cargo.lock index fae184ef6..7426c0552 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -128,7 +128,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" dependencies = [ - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -238,8 +238,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" dependencies = [ "proc-macro2", - "quote 1.0.26", - "syn 2.0.15", + "quote 1.0.37", + "syn 2.0.76", ] [[package]] @@ -302,7 +302,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -319,7 +319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -648,7 +648,7 @@ dependencies = [ "cached_proc_macro_types", "darling 0.14.4", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -898,7 +898,7 @@ version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" dependencies = [ - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -971,7 +971,7 @@ dependencies = [ "fnv", "ident_case", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "strsim", "syn 1.0.107", ] @@ -985,7 +985,7 @@ dependencies = [ "fnv", "ident_case", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "strsim", "syn 1.0.107", ] @@ -997,7 +997,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core 0.13.4", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -1008,7 +1008,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ "darling_core 0.14.4", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -1084,7 +1084,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8aed3b3c608dc56cf36c45fe979d04eda51242e6703d8d0bb03426ef7c41db6a" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", "synstructure", ] @@ -1096,7 +1096,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -1117,7 +1117,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "123c73e7a6e51b05c75fe1a1b2f4e241399ea5740ed810b0e3e6cacd9db5e7b2" dependencies = [ "devise_core", - "quote 1.0.26", + "quote 1.0.37", ] [[package]] @@ -1129,7 +1129,7 @@ dependencies = [ "bitflags", "proc-macro2", "proc-macro2-diagnostics", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -1266,7 +1266,7 @@ checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" dependencies = [ "heck", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -1286,7 +1286,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "828de45d0ca18782232dfb8f3ea9cc428e8ced380eb26a520baaacfc70de39ce" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -1467,7 +1467,7 @@ dependencies = [ "parking_lot", "rand 0.8.5", "redis-protocol", - "semver 1.0.9", + "semver 1.0.23", "socket2 0.5.5", "tokio 1.35.1", "tokio-stream", @@ -1563,7 +1563,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -1654,7 +1654,7 @@ checksum = "e45727250e75cc04ff2846a66397da8ef2b3db8e40e0cef4df67950a07621eb9" dependencies = [ "proc-macro-error", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -2321,6 +2321,16 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets", +] + [[package]] name = "libm" version = "0.2.7" @@ -2500,7 +2510,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49e30813093f757be5cf21e50389a24dc7dbb22c49f23b7e8f51d69b508a5ffa" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -2660,6 +2670,43 @@ dependencies = [ "tempfile", ] +[[package]] +name = "neon" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d75440242411c87dc39847b0e33e961ec1f10326a9d8ecf9c1ea64a3b3c13dc" +dependencies = [ + "getrandom", + "libloading", + "neon-macros", + "once_cell", + "semver 1.0.23", + "send_wrapper", + "smallvec", +] + +[[package]] +name = "neon-macros" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6813fde79b646e47e7ad75f480aa80ef76a5d9599e2717407961531169ee38b" +dependencies = [ + "quote 1.0.37", + "syn 2.0.76", + "syn-mid", +] + +[[package]] +name = "neon-serde4" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8778b4afaa506e067da24566623873c38797987be593232a4f9ad82c84bb3eb3" +dependencies = [ + "neon", + "num", + "serde", +] + [[package]] name = "nom" version = "7.1.1" @@ -2679,6 +2726,19 @@ dependencies = [ "winapi", ] +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + [[package]] name = "num-bigint-dig" version = "0.8.4" @@ -2696,32 +2756,50 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg 1.1.0", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg 1.1.0", "num-integer", "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg 1.1.0", "libm", @@ -2763,7 +2841,7 @@ checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -2775,8 +2853,8 @@ checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.26", - "syn 2.0.15", + "quote 1.0.37", + "syn 2.0.76", ] [[package]] @@ -2828,7 +2906,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -2963,7 +3041,7 @@ checksum = "82a5ca643c2303ecb740d506539deba189e16f2754040a42901cd8105d0282d0" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -3040,7 +3118,7 @@ dependencies = [ "pest", "pest_meta", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -3071,7 +3149,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -3180,7 +3258,7 @@ checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", "version_check", ] @@ -3192,15 +3270,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "version_check", ] [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -3212,7 +3290,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", "version_check", "yansi", @@ -3252,9 +3330,9 @@ checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" [[package]] name = "quote" -version = "1.0.26" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -3506,7 +3584,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a043824e29c94169374ac5183ac0ed43f5724dc4556b19568007486bd840fa1f" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -3748,6 +3826,18 @@ dependencies = [ "validator 0.16.0", ] +[[package]] +name = "revolt-nodejs-bindings" +version = "0.7.15" +dependencies = [ + "async-std", + "neon", + "neon-serde4", + "revolt-database", + "revolt-result", + "serde", +] + [[package]] name = "revolt-permissions" version = "0.7.15" @@ -3856,7 +3946,7 @@ checksum = "cc6620569d8ac8f0a1690fcca13f488503807a60e96ebf729749b59aca1dbef9" dependencies = [ "darling 0.13.4", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "rocket_http", "syn 1.0.107", ] @@ -3988,7 +4078,7 @@ dependencies = [ "glob", "indexmap 1.9.3", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "rocket_http", "syn 1.0.107", "unicode-xid 0.2.3", @@ -4133,7 +4223,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.9", + "semver 1.0.23", ] [[package]] @@ -4250,7 +4340,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af4d7e1b012cb3d9129567661a63755ea4b8a7386d339dc945ae187e403c6743" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "serde_derive_internals", "syn 1.0.107", ] @@ -4336,9 +4426,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.9" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "semver-parser" @@ -4346,6 +4436,12 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + [[package]] name = "sentry" version = "0.31.5" @@ -4479,8 +4575,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", - "quote 1.0.26", - "syn 2.0.15", + "quote 1.0.37", + "syn 2.0.76", ] [[package]] @@ -4490,7 +4586,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -4536,7 +4632,7 @@ checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" dependencies = [ "darling 0.13.4", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -4741,21 +4837,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.15" +version = "2.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "unicode-ident", ] +[[package]] +name = "syn-mid" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5dc35bb08dd1ca3dfb09dce91fd2d13294d6711c88897d9a9d60acf39bce049" +dependencies = [ + "proc-macro2", + "quote 1.0.37", + "syn 2.0.76", +] + [[package]] name = "synom" version = "0.11.3" @@ -4772,7 +4879,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", "unicode-xid 0.2.3", ] @@ -4836,7 +4943,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -4939,8 +5046,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", - "quote 1.0.26", - "syn 2.0.15", + "quote 1.0.37", + "syn 2.0.76", ] [[package]] @@ -5082,8 +5189,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", - "quote 1.0.26", - "syn 2.0.15", + "quote 1.0.37", + "syn 2.0.76", ] [[package]] @@ -5212,7 +5319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89851716b67b937e393b3daa8423e67ddfc4bbbf1654bcf05488e95e0828db0c" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", ] @@ -5473,7 +5580,7 @@ dependencies = [ "lazy_static", "proc-macro-error", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "regex", "syn 1.0.107", "validator_types", @@ -5583,7 +5690,7 @@ dependencies = [ "lazy_static", "log", "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", "wasm-bindgen-shared", ] @@ -5606,7 +5713,7 @@ version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" dependencies = [ - "quote 1.0.26", + "quote 1.0.37", "wasm-bindgen-macro-support", ] @@ -5617,7 +5724,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" dependencies = [ "proc-macro2", - "quote 1.0.26", + "quote 1.0.37", "syn 1.0.107", "wasm-bindgen-backend", "wasm-bindgen-shared", diff --git a/Cargo.toml b/Cargo.toml index b55327166..b7149663d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,11 @@ [workspace] resolver = "2" -members = ["crates/delta", "crates/bonfire", "crates/core/*"] +members = [ + "crates/delta", + "crates/bonfire", + "crates/core/*", + "crates/bindings/node", +] [patch.crates-io] # mobc-redis = { git = "https://github.com/insertish/mobc", rev = "8b880bb59f2ba80b4c7bc40c649c113d8857a186" } diff --git a/crates/bindings/node/.gitignore b/crates/bindings/node/.gitignore new file mode 100644 index 000000000..c76a159c7 --- /dev/null +++ b/crates/bindings/node/.gitignore @@ -0,0 +1,7 @@ +target +index.node +**/node_modules +**/.DS_Store +npm-debug.log* +cargo.log +cross.log diff --git a/crates/bindings/node/Cargo.toml b/crates/bindings/node/Cargo.toml new file mode 100644 index 000000000..68e5b5ba0 --- /dev/null +++ b/crates/bindings/node/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "revolt-nodejs-bindings" +version = "0.7.15" +description = "Node.js bindings for the Revolt software" +authors = ["Paul Makles "] +license = "MIT" +edition = "2021" +exclude = ["index.node"] + +[lib] +crate-type = ["cdylib"] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +neon = "1.0.0" +neon-serde4 = "1.0.0" + +serde = { version = "1", features = ["derive"] } + +async-std = "1.12.0" + +revolt-result = { version = "0.7.15", path = "../../core/result" } +revolt-database = { version = "0.7.15", path = "../../core/database" } diff --git a/crates/bindings/node/README.md b/crates/bindings/node/README.md new file mode 100644 index 000000000..f2ccee6ee --- /dev/null +++ b/crates/bindings/node/README.md @@ -0,0 +1,92 @@ +# revolt.node + +**revolt.node:** Node.js bindings for the Revolt software + +This project was bootstrapped by [create-neon](https://www.npmjs.com/package/create-neon). + +## Building revolt.node + +Building revolt.node requires a [supported version of Node and Rust](https://github.com/neon-bindings/neon#platform-support). + +To run the build, run: + +```sh +$ npm run build +``` + +This command uses the [@neon-rs/cli](https://www.npmjs.com/package/@neon-rs/cli) utility to assemble the binary Node addon from the output of `cargo`. + +## Exploring revolt.node + +After building revolt.node, you can explore its exports at the Node console: + +```sh +$ npm i +$ npm run build +$ node +> require('.').hello() +'hello node' +``` + +## Available Scripts + +In the project directory, you can run: + +#### `npm install` + +Installs the project, including running `npm run build`. + +#### `npm run build` + +Builds the Node addon (`index.node`) from source, generating a release build with `cargo --release`. + +Additional [`cargo build`](https://doc.rust-lang.org/cargo/commands/cargo-build.html) arguments may be passed to `npm run build` and similar commands. For example, to enable a [cargo feature](https://doc.rust-lang.org/cargo/reference/features.html): + +``` +npm run build -- --feature=beetle +``` + +#### `npm run debug` + +Similar to `npm run build` but generates a debug build with `cargo`. + +#### `npm run cross` + +Similar to `npm run build` but uses [cross-rs](https://github.com/cross-rs/cross) to cross-compile for another platform. Use the [`CARGO_BUILD_TARGET`](https://doc.rust-lang.org/cargo/reference/config.html#buildtarget) environment variable to select the build target. + +#### `npm test` + +Runs the unit tests by calling `cargo test`. You can learn more about [adding tests to your Rust code](https://doc.rust-lang.org/book/ch11-01-writing-tests.html) from the [Rust book](https://doc.rust-lang.org/book/). + +## Project Layout + +The directory structure of this project is: + +``` +revolt.node/ +├── Cargo.toml +├── README.md +├── src/ +| └── lib.rs +├── index.node +├── package.json +└── target/ +``` + +| Entry | Purpose | +|----------------|------------------------------------------------------------------------------------------------------------------------------------------| +| `Cargo.toml` | The Cargo [manifest file](https://doc.rust-lang.org/cargo/reference/manifest.html), which informs the `cargo` command. | +| `README.md` | This file. | +| `src/` | The directory tree containing the Rust source code for the project. | +| `lib.rs` | Entry point for the Rust source code. | +| `index.node` | The main module, a [Node addon](https://nodejs.org/api/addons.html) generated by the build and pointed to by `"main"` in `package.json`. | +| `package.json` | The npm [manifest file](https://docs.npmjs.com/cli/v7/configuring-npm/package-json), which informs the `npm` command. | +| `target/` | Binary artifacts generated by the Rust build. | + +## Learn More + +Learn more about: + +- [Neon](https://neon-bindings.com). +- [Rust](https://www.rust-lang.org). +- [Node](https://nodejs.org). diff --git a/crates/bindings/node/index.d.ts b/crates/bindings/node/index.d.ts new file mode 100644 index 000000000..a9f9ba919 --- /dev/null +++ b/crates/bindings/node/index.d.ts @@ -0,0 +1,66 @@ +import { Channel, User } from "revolt-api"; + +/** + * Opaque type for Revolt database + */ +export declare interface Database {} + +/** + * Opaque type for Revolt database + */ +export declare interface OpaqueUser {} + +/** + * Error type from Revolt backend + */ +export declare interface Err { + type: string; + location: string; +} + +/** + * Gets a new handle to the Revolt database + * @returns {Database} Handle + */ +export declare function database(): Database; + +/** + * Fetch user from database + * @param {string} userId User's ID + * @this {Database} + */ +export declare function database_fetch_user(userId: string): OpaqueUser; + +/** + * Fetch user from database + * @param {string} username Username + * @param {string} discriminator Discriminator + * @this {Database} + */ +export declare function database_fetch_user_by_username( + username: string, + discriminator: string +): OpaqueUser; + +/** + * Gets model data as JSON + * @this {OpaqueUser} + */ +export declare function model_data(): User; + +/** + * Gets error if the model failed to fetch + * @this {OpaqueUser} + */ +export declare function model_error(): Err; + +/** + * Open a direct message channel between two users + * @param {string} userA User A ID + * @param {string} userB User B ID + * @returns Existing or newly created channel + */ +export declare function proc_channels_create_dm( + userA: string, + userB: string +): Promise; diff --git a/crates/bindings/node/package.json b/crates/bindings/node/package.json new file mode 100644 index 000000000..1bcb0ee7d --- /dev/null +++ b/crates/bindings/node/package.json @@ -0,0 +1,36 @@ +{ + "name": "revolt-nodejs-bindings", + "version": "0.7.15", + "description": "Node.js bindings for the Revolt software", + "main": "index.node", + "scripts": { + "test": "cargo test", + "cargo-build": "cargo build --message-format=json > cargo.log", + "cross-build": "cross build --message-format=json > cross.log", + "postcargo-build": "neon dist < cargo.log", + "postcross-build": "neon dist -m /target < cross.log", + "debug": "npm run cargo-build --", + "build": "npm run cargo-build -- --release", + "cross": "npm run cross-build -- --release" + }, + "author": "Paul Makles", + "license": "AGPL-3.0", + "devDependencies": { + "@neon-rs/cli": "0.1.73" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/revoltchat/backend" + }, + "keywords": [ + "revolt", + "chat" + ], + "bugs": { + "url": "https://github.com/revoltchat/backend/issues" + }, + "homepage": "https://github.com/revoltchat/backend#readme", + "dependencies": { + "revolt-api": "^0.7.15" + } +} \ No newline at end of file diff --git a/crates/bindings/node/pnpm-lock.yaml b/crates/bindings/node/pnpm-lock.yaml new file mode 100644 index 000000000..1d623ad9c --- /dev/null +++ b/crates/bindings/node/pnpm-lock.yaml @@ -0,0 +1,117 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + revolt-api: + specifier: ^0.7.15 + version: 0.7.15 + +devDependencies: + '@neon-rs/cli': + specifier: 0.1.73 + version: 0.1.73 + +packages: + + /@cargo-messages/android-arm-eabi@0.1.72: + resolution: {integrity: sha512-gGZxIM1mj+Y5x+ULND6ZCNr7f70OJi9wDlycSK8hGONy9wrChN6JAIHryddC5cqcwlYAoQ6IDcDFElnhAYbybA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@cargo-messages/darwin-arm64@0.1.72: + resolution: {integrity: sha512-EAzN5MLaXPljZKZDO5qR+aBs44eSq2ZbEnS7AI/FziE3MzeXbrGOS3fLba5+7yWPFXJyZolXzePm8N1EBv8ovg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cargo-messages/darwin-x64@0.1.72: + resolution: {integrity: sha512-RLo6j8s3nYbjdd1LDct4wamfChyRit7zokUuxtIYCu9XOlltkN5vnj1vwnrPvoqCMZ/7CbbuHFwSTn9A71de/w==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cargo-messages/linux-arm-gnueabihf@0.1.72: + resolution: {integrity: sha512-tHsRshuzfjrX6SDW3jg6al8vMNLTMgczGnVYl5RuBZf/yrAUuwe30KxA9ge6w6mW6Ox797DyBchzAc9OLgTgmQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cargo-messages/linux-x64-gnu@0.1.72: + resolution: {integrity: sha512-VGtL6CCnUbhsP4aYuBNT5kfrAL7o0qjrxw97a+ax13t+nJd26tVEEIKHMu5drvvS/Nm/hn7sLT8zMnnCv0pvHg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cargo-messages/win32-arm64-msvc@0.1.72: + resolution: {integrity: sha512-V93Cgz39K+yqa3MveNbhh29pYCp8izK5uEavjPoxlNxAbsMCWH+s0verGDdUcfGxjR1H2V7oZ4FszPqR2SqMRQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@cargo-messages/win32-x64-msvc@0.1.72: + resolution: {integrity: sha512-knz3uSrO0OSbq3U5VWfCY8FB4NsM43BOWLZ7x4sfaMOC1XWv+IyvDdkLe6DhJx8KUw46KIAimYs9YROrp6l46Q==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@neon-rs/cli@0.1.73: + resolution: {integrity: sha512-1kv8S/feB6UQWQQwsnGfkSkEBOtlFDNExnioL81E2BwvUWgjQPaseHgpi2EpWVgsPUgur5eBm4QowmlpWkD4/w==} + hasBin: true + optionalDependencies: + '@cargo-messages/android-arm-eabi': 0.1.72 + '@cargo-messages/darwin-arm64': 0.1.72 + '@cargo-messages/darwin-x64': 0.1.72 + '@cargo-messages/linux-arm-gnueabihf': 0.1.72 + '@cargo-messages/linux-x64-gnu': 0.1.72 + '@cargo-messages/win32-arm64-msvc': 0.1.72 + '@cargo-messages/win32-x64-msvc': 0.1.72 + dev: true + + /axios@0.26.1: + resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + dependencies: + follow-redirects: 1.15.6 + transitivePeerDependencies: + - debug + dev: false + + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /lodash.defaultsdeep@4.6.1: + resolution: {integrity: sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==} + dev: false + + /revolt-api@0.7.15: + resolution: {integrity: sha512-rWRnjBFvoXt/RHRxHg9KuP+x1Jk61KdsOpKOczVJg5tIqGDmqp/6QZHw5rJTtG+wCH3Ah3YKwY+MM5NHfg1W3Q==} + dependencies: + axios: 0.26.1 + lodash.defaultsdeep: 4.6.1 + transitivePeerDependencies: + - debug + dev: false diff --git a/crates/bindings/node/src/lib.rs b/crates/bindings/node/src/lib.rs new file mode 100644 index 000000000..4fb2975f4 --- /dev/null +++ b/crates/bindings/node/src/lib.rs @@ -0,0 +1,170 @@ +#[macro_use] +extern crate serde; + +use neon::prelude::*; +use revolt_database::{Database, DatabaseInfo}; + +struct DatabaseBinding(Database, Channel); +impl Finalize for DatabaseBinding {} +impl DatabaseBinding { + fn take(&self) -> (Database, Channel) { + (self.0.clone(), self.1.clone()) + } +} + +fn js_database(mut cx: FunctionContext) -> JsResult> { + let db = async_std::task::block_on(DatabaseInfo::Auto.connect()) + .or_else(|err| cx.throw_error(err))?; + + let channel = cx.channel(); + Ok(cx.boxed(DatabaseBinding(db, channel))) +} + +// Implementations for models +#[derive(Clone)] +#[allow(clippy::large_enum_variant)] +enum Model { + User(revolt_database::User), + Error(revolt_result::Error), +} + +impl Model { + fn give(&self) -> Model { + self.clone() + } +} + +impl Finalize for Model {} + +macro_rules! shim_boxed { + ($cx: ident, $name: ident, $model: ident, $( $variable: ident $type: ident $id: expr )+, $cmd: ident, $( $arg: expr, )+) => { + fn $name(mut cx: FunctionContext) -> JsResult { + $( + let $variable = cx.argument::<$type>($id)?.value(&mut cx); + )+ + + let (db, channel) = cx.this::>()?.take(); + let (deferred, promise) = cx.promise(); + + async_std::task::spawn(async move { + let result = db.$cmd($($arg,)+).await; + deferred.settle_with(&channel, move |mut cx| { + Ok(cx.boxed(match result { + Ok(value) => Model::$model(value), + Err(error) => Model::Error(error) + })) + }) + }); + + Ok(promise) + } + + $cx.export_function(stringify!($name), $name)?; + }; +} + +fn js_data(mut cx: FunctionContext) -> JsResult { + match cx.this::>()?.give() { + Model::Error(_) => neon_serde4::to_value(&mut cx, &None::<()>), + Model::User(user) => neon_serde4::to_value(&mut cx, &user), + } + .or_else(|e| cx.throw_error(e.to_string())) +} + +fn js_error(mut cx: FunctionContext) -> JsResult { + let value = match cx.this::>()?.give() { + Model::Error(err) => Some(err), + _ => None, + }; + + neon_serde4::to_value(&mut cx, &value).or_else(|e| cx.throw_error(e.to_string())) +} + +// Basic data implementation +#[derive(Serialize, Deserialize)] +struct ResultBinding { + #[serde(flatten)] + value: Option, + error: Option, +} + +macro_rules! shim { + ($cx: ident, $name: ident, $( $variable: ident $type: ident $id: expr )+, | $db: ident | $closure: expr, $( $arg: expr, )+) => { + fn $name(mut cx: FunctionContext) -> JsResult { + $( + let $variable = cx.argument::<$type>($id)?.value(&mut cx); + )+ + + let (db, channel) = cx.this::>()?.take(); + let (deferred, promise) = cx.promise(); + + async_std::task::spawn(async move { + #[allow(clippy::redundant_closure_call)] + let result = (|$db: $crate::Database| $closure)(db.clone()).await; + deferred.settle_with(&channel, move |mut cx| { + neon_serde4::to_value( + &mut cx, + &match result { + Ok(value) => ResultBinding { + value: Some(value), + error: None, + }, + Err(error) => ResultBinding { + value: None, + error: Some(error), + }, + }, + ) + .or_else(|e| cx.throw_error(e.to_string())) + }) + }); + + Ok(promise) + } + + $cx.export_function(stringify!($name), $name)?; + }; +} + +#[neon::main] +fn main(mut cx: ModuleContext) -> NeonResult<()> { + // database & model stuff + cx.export_function("database", js_database)?; + cx.export_function("model_data", js_data)?; + cx.export_function("model_error", js_error)?; + + shim_boxed!( + cx, + database_fetch_user, + User, + user_id JsString 0, + fetch_user, + &user_id, + ); + + shim_boxed!( + cx, + database_fetch_user_by_username, + User, + username JsString 0 + discriminator JsString 1, + fetch_user_by_username, + &username, &discriminator, + ); + + // procedure calls + shim!( + cx, + proc_channels_create_dm, + user_a JsString 0 + user_b JsString 1, + |db| async move { + let user_a = db.fetch_user(&user_a).await?; + let user_b = db.fetch_user(&user_b).await?; + revolt_database::Channel::create_dm(&db, &user_a, &user_b).await + }, + &userA, &userB, + ); + + Ok(()) +} diff --git a/crates/bindings/node/test.js b/crates/bindings/node/test.js new file mode 100644 index 000000000..d8f601747 --- /dev/null +++ b/crates/bindings/node/test.js @@ -0,0 +1,53 @@ +const Internal = require("."); + +// playing around with class wrapper, not practical +class Model { + constructor(model) { + this.model = model; + } + + data() { + return Internal.model_data.bind(this.model)(); + } + + error() { + return Internal.model_error.bind(this.model)(); + } +} + +class User extends Model { + constructor(db, user) { + super(user); + this.db = db; + } +} + +class Database { + constructor() { + this.db = Internal.database(); + } + + async fetchUser(userId) { + return new User( + this, + await Internal.database_fetch_user.bind(this.db)(userId) + ); + } + + async fetchUserByUsername(username, discriminator) { + return new User( + this, + await Internal.database_fetch_user_by_username.bind(this.db)( + username, + discriminator + ) + ); + } +} + +const db = new Database(); +db.fetchUserByUsername("dos", "7624").then((user) => console.info(user.data())); +db.fetchUserByUsername("dos", "1111").then((user) => console.info(user.data())); +db.fetchUserByUsername("dos", "1111").then((user) => + console.info(user.error()) +); diff --git a/crates/bindings/package-lock.json b/crates/bindings/package-lock.json new file mode 100644 index 000000000..9376d3a95 --- /dev/null +++ b/crates/bindings/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "bindings", + "lockfileVersion": 3, + "requires": true, + "packages": {} +}