From b5551a0dd36b7222bfa15070e2e8bf7b7245bd24 Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Fri, 17 Nov 2023 17:28:20 +0200 Subject: [PATCH 01/15] it works as CF Worker --- Cargo.lock | 290 ++- crates/async_runtime/Cargo.toml | 15 + crates/async_runtime/src/lib.rs | 14 + crates/benches/Cargo.toml | 2 +- crates/cloudflare_worker/Cargo.toml | 22 + crates/cloudflare_worker/package-lock.json | 1594 +++++++++++++++++ crates/cloudflare_worker/package.json | 12 + crates/cloudflare_worker/src/lib.rs | 71 + crates/cloudflare_worker/wrangler.toml | 6 + crates/common/src/http.rs | 2 +- crates/conductor/src/lib.rs | 9 +- crates/config/src/lib.rs | 4 + crates/engine/Cargo.toml | 3 +- crates/engine/src/gateway.rs | 77 +- .../plugins/persisted_documents/store/fs.rs | 236 +-- crates/engine/src/source/graphql_source.rs | 87 +- crates/engine/src/source/runtime.rs | 13 +- test_config/worker.yaml | 19 + 18 files changed, 2279 insertions(+), 197 deletions(-) create mode 100644 crates/async_runtime/Cargo.toml create mode 100644 crates/async_runtime/src/lib.rs create mode 100644 crates/cloudflare_worker/Cargo.toml create mode 100644 crates/cloudflare_worker/package-lock.json create mode 100644 crates/cloudflare_worker/package.json create mode 100644 crates/cloudflare_worker/src/lib.rs create mode 100644 crates/cloudflare_worker/wrangler.toml create mode 100644 test_config/worker.yaml diff --git a/Cargo.lock b/Cargo.lock index 8d857acf..7bb373f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -268,6 +268,15 @@ dependencies = [ "syn 2.0.32", ] +[[package]] +name = "async_runtime" +version = "0.0.0" +dependencies = [ + "send_wrapper", + "tokio", + "wasm-bindgen-futures", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -399,6 +408,39 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "js-sys", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "chrono-tz" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c39203181991a7dd4343b8005bd804e7a9a37afb8ac070e43771e8c820bbde" +dependencies = [ + "chrono", + "chrono-tz-build", + "phf", +] + +[[package]] +name = "chrono-tz-build" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f509c3a87b33437b05e2458750a0700e5bdd6956176773e6c7d6dd15a283a0c" +dependencies = [ + "parse-zoneinfo", + "phf", + "phf_codegen", +] + [[package]] name = "ciborium" version = "0.2.1" @@ -512,13 +554,14 @@ name = "conductor_engine" version = "0.0.0" dependencies = [ "async-trait", + "async_runtime", "conductor_common", "conductor_config", + "matchit 0.7.3", "reqwest", "serde", "serde_json", "thiserror", - "tokio", "tracing", ] @@ -1064,9 +1107,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -1128,6 +1171,18 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "matchit" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9376a4f0340565ad675d11fc1419227faf5f60cd7ac9cb2e7185a471f30af833" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "memchr" version = "2.5.0" @@ -1321,6 +1376,15 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "parse-zoneinfo" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" +dependencies = [ + "regex", +] + [[package]] name = "paste" version = "1.0.14" @@ -1333,6 +1397,65 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", + "uncased", +] + +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] + [[package]] name = "pin-project-lite" version = "0.2.12" @@ -1652,6 +1775,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" +dependencies = [ + "futures-core", +] + [[package]] name = "serde" version = "1.0.192" @@ -1661,6 +1793,17 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-wasm-bindgen" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "serde_derive" version = "1.0.192" @@ -1748,6 +1891,12 @@ dependencies = [ "libc", ] +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "slab" version = "0.4.8" @@ -2053,6 +2202,15 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "uncased" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.13" @@ -2151,9 +2309,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2161,24 +2319,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.32", + "syn 1.0.109", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" dependencies = [ "cfg-if", "js-sys", @@ -2188,9 +2346,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2198,28 +2356,41 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "wasm-streams" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" dependencies = [ "js-sys", "wasm-bindgen", @@ -2332,6 +2503,87 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "worker" +version = "0.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ec504c3c7afcbcc9688938a540ec290d642e780b99cfc5b90bcc3c8ea32470" +dependencies = [ + "async-trait", + "chrono", + "chrono-tz", + "futures-channel", + "futures-util", + "http", + "js-sys", + "matchit 0.4.6", + "pin-project", + "serde", + "serde-wasm-bindgen", + "serde_json", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "worker-kv", + "worker-macros", + "worker-sys", +] + +[[package]] +name = "worker-kv" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d4b9fe1a87b7aef252fceb4f30bf6303036a5de329c81ccad9be9c35d1fdbc7" +dependencies = [ + "js-sys", + "serde", + "serde-wasm-bindgen", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", +] + +[[package]] +name = "worker-macros" +version = "0.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86b080d7a6472a244fd1b5b1f36be3dc53942aef13e716724a4b74715708afc" +dependencies = [ + "async-trait", + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-macro-support", + "worker-sys", +] + +[[package]] +name = "worker-rust" +version = "0.1.0" +dependencies = [ + "conductor_common", + "conductor_config", + "conductor_engine", + "worker", +] + +[[package]] +name = "worker-sys" +version = "0.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b842e2ac2871c2d83e50ce8e8844fc3893666d1c16825b809505de6506ad4487" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "zerocopy" version = "0.7.26" diff --git a/crates/async_runtime/Cargo.toml b/crates/async_runtime/Cargo.toml new file mode 100644 index 00000000..34971578 --- /dev/null +++ b/crates/async_runtime/Cargo.toml @@ -0,0 +1,15 @@ + +[package] +name = "async_runtime" +version = "0.0.0" +edition = "2021" + +[lib] +path = "src/lib.rs" + +[target.'cfg(target_arch = "wasm32")'.dependencies] +wasm-bindgen-futures = { version = "0.4" } +send_wrapper = { version = "0.6", features = ["futures"] } + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +tokio = { version = "1.34.0" } diff --git a/crates/async_runtime/src/lib.rs b/crates/async_runtime/src/lib.rs new file mode 100644 index 00000000..63095c8e --- /dev/null +++ b/crates/async_runtime/src/lib.rs @@ -0,0 +1,14 @@ +use core::future::Future; + +#[cfg(target_arch = "wasm32")] +pub fn call_async(future: impl Future) -> impl Future + Send { + send_wrapper::SendWrapper::new(future) +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn call_async(future: F) -> F +where + F: Future + Send, +{ + future +} diff --git a/crates/benches/Cargo.toml b/crates/benches/Cargo.toml index e537d36d..64be1c8a 100644 --- a/crates/benches/Cargo.toml +++ b/crates/benches/Cargo.toml @@ -9,8 +9,8 @@ conductor = { path = "../conductor" } futures = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -tokio = "1.34.0" hyper = "0.14.27" +tokio = { version = "1.34.0", features = ["full"] } [[bench]] name = "bench" diff --git a/crates/cloudflare_worker/Cargo.toml b/crates/cloudflare_worker/Cargo.toml new file mode 100644 index 00000000..cc8191c0 --- /dev/null +++ b/crates/cloudflare_worker/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "worker-rust" +version = "0.1.0" +edition = "2021" + +# https://github.com/rustwasm/wasm-pack/issues/1247 +[package.metadata.wasm-pack.profile.release] +wasm-opt = false + +[lib] +crate-type = ["cdylib"] + +[dependencies] +worker = "0.0.15" +conductor_config = { path = "../config" } +conductor_engine = { path = "../engine" } +conductor_common = { path = "../common" } + +[profile.release] +lto = true +strip = true +codegen-units = 1 diff --git a/crates/cloudflare_worker/package-lock.json b/crates/cloudflare_worker/package-lock.json new file mode 100644 index 00000000..440dda36 --- /dev/null +++ b/crates/cloudflare_worker/package-lock.json @@ -0,0 +1,1594 @@ +{ + "name": "template-worker-rust", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "template-worker-rust", + "version": "0.0.0", + "devDependencies": { + "wrangler": "^2.13.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.2.0.tgz", + "integrity": "sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==", + "dev": true, + "dependencies": { + "mime": "^3.0.0" + } + }, + "node_modules/@esbuild-plugins/node-globals-polyfill": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.1.1.tgz", + "integrity": "sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==", + "dev": true, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild-plugins/node-modules-polyfill": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.1.4.tgz", + "integrity": "sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" + }, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.3.tgz", + "integrity": "sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.3.tgz", + "integrity": "sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.3.tgz", + "integrity": "sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.3.tgz", + "integrity": "sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.3.tgz", + "integrity": "sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.3.tgz", + "integrity": "sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.3.tgz", + "integrity": "sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.3.tgz", + "integrity": "sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.3.tgz", + "integrity": "sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.3.tgz", + "integrity": "sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.3.tgz", + "integrity": "sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.3.tgz", + "integrity": "sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.3.tgz", + "integrity": "sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.3.tgz", + "integrity": "sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.3.tgz", + "integrity": "sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.3.tgz", + "integrity": "sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.3.tgz", + "integrity": "sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.3.tgz", + "integrity": "sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.3.tgz", + "integrity": "sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.3.tgz", + "integrity": "sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.3.tgz", + "integrity": "sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.3.tgz", + "integrity": "sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, + "node_modules/@miniflare/cache": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/cache/-/cache-2.13.0.tgz", + "integrity": "sha512-y3SdN3SVyPECWmLAEGkkrv0RB+LugEPs/FeXn8QtN9aE1vyj69clOAgmsDzoh1DpFfFsLKRiv05aWs4m79P8Xw==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.13.0", + "@miniflare/shared": "2.13.0", + "http-cache-semantics": "^4.1.0", + "undici": "5.20.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/cli-parser": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/cli-parser/-/cli-parser-2.13.0.tgz", + "integrity": "sha512-Nx1PIfuMZ3mK9Dg/JojWZAjHR16h1pcdCFSqYln/ME7y5ifx+P1E5UkShWUQ1cBlibNaltjbJ2n/7stSAsIGPQ==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.13.0", + "kleur": "^4.1.4" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/core": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/core/-/core-2.13.0.tgz", + "integrity": "sha512-YJ/C0J3k+7xn4gvlMpvePnM3xC8nOnkweW96cc0IA8kJ1JSmScOO2tZ7rrU1RyDgp6StkAtQBw4yC0wYeFycBw==", + "dev": true, + "dependencies": { + "@iarna/toml": "^2.2.5", + "@miniflare/queues": "2.13.0", + "@miniflare/shared": "2.13.0", + "@miniflare/watcher": "2.13.0", + "busboy": "^1.6.0", + "dotenv": "^10.0.0", + "kleur": "^4.1.4", + "set-cookie-parser": "^2.4.8", + "undici": "5.20.0", + "urlpattern-polyfill": "^4.0.3" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/d1": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/d1/-/d1-2.13.0.tgz", + "integrity": "sha512-OslqjO8iTcvzyrC0spByftMboRmHJEyHyTHnlKkjWDGdQQztEOjso2Xj+3I4SZIeUYvbzDRhKLS2QXI9a8LS5A==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.13.0", + "@miniflare/shared": "2.13.0" + }, + "engines": { + "node": ">=16.7" + } + }, + "node_modules/@miniflare/durable-objects": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/durable-objects/-/durable-objects-2.13.0.tgz", + "integrity": "sha512-CRGVBPO9vY4Fc3aV+pdPRVVeYIt64vQqvw+BJbyW+TQtqVP2CGQeziJGnCfcONNNKyooZxGyUkHewUypyH+Qhg==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.13.0", + "@miniflare/shared": "2.13.0", + "@miniflare/storage-memory": "2.13.0", + "undici": "5.20.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/html-rewriter": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/html-rewriter/-/html-rewriter-2.13.0.tgz", + "integrity": "sha512-XhN7Icyzvtvu+o/A0hrnSiSmla78seCaNwQ9M1TDHxt352I/ahPX4wtPXs6GbKqY0/i+V6yoG2KGFRQ/j59cQQ==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.13.0", + "@miniflare/shared": "2.13.0", + "html-rewriter-wasm": "^0.4.1", + "undici": "5.20.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/http-server": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/http-server/-/http-server-2.13.0.tgz", + "integrity": "sha512-aMS/nUMTKP15hKnyZboeuWCiqmNrrCu+XRBY/TxDDl07iXcLpiHGf3oVv+yXxXkWlJHJVCbK7i/nXSNPllRMSw==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.13.0", + "@miniflare/shared": "2.13.0", + "@miniflare/web-sockets": "2.13.0", + "kleur": "^4.1.4", + "selfsigned": "^2.0.0", + "undici": "5.20.0", + "ws": "^8.2.2", + "youch": "^2.2.2" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/kv": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/kv/-/kv-2.13.0.tgz", + "integrity": "sha512-J0AS5x3g/YVOmHMxMAZs07nRXRvSo9jyuC0eikTBf+4AABvBIyvVYmdTjYNjCmr8O5smcfWBX5S27HelD3aAAQ==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.13.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/queues": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/queues/-/queues-2.13.0.tgz", + "integrity": "sha512-Gf/a6M1mJL03iOvNqh3JNahcBfvEMPHnO28n0gkCoyYWGvddIr9lwCdFIa0qwNJsC1fIDRxhPg8PZ5cQLBMwRA==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.13.0" + }, + "engines": { + "node": ">=16.7" + } + }, + "node_modules/@miniflare/r2": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/r2/-/r2-2.13.0.tgz", + "integrity": "sha512-/5k6GHOYMNV/oBtilV9HDXBkJUrx8oXVigG5vxbnzEGRXyVRmR+Glzu7mFT8JiE94XiEbXHk9Qvu1S5Dej3wBw==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.13.0", + "undici": "5.20.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/runner-vm": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/runner-vm/-/runner-vm-2.13.0.tgz", + "integrity": "sha512-VmKtF2cA8HmTuLXor1THWY0v+DmaobPct63iLcgWIaUdP3MIvL+9X8HDXFAviCR7bCTe6MKxckHkaOj0IE0aJQ==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.13.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/scheduler": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/scheduler/-/scheduler-2.13.0.tgz", + "integrity": "sha512-AOaQanoR4NjVEzVGWHnrL15A7aMx+d9AKLJhSDF7KaP+4NrT2Wo2BQuXCpn5oStx3itOdlQpMfqQ139e/I8WhQ==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.13.0", + "@miniflare/shared": "2.13.0", + "cron-schedule": "^3.0.4" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/shared": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/shared/-/shared-2.13.0.tgz", + "integrity": "sha512-m8YFQzKmbjberrV9hPzNcQjNCXxjTjXUpuNrIGjAJO7g+BDztUHaZbdd26H9maBDlkeiWxA3hf0mDyCT/6MCMA==", + "dev": true, + "dependencies": { + "@types/better-sqlite3": "^7.6.0", + "kleur": "^4.1.4", + "npx-import": "^1.1.4", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/sites": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/sites/-/sites-2.13.0.tgz", + "integrity": "sha512-/tuzIu00o6CF2tkSv01q02MgEShXBSKx85h9jwWvc+6u7prGacAOer0FA1YNRFbE+t9QIfutAkoPGMA9zYf8+Q==", + "dev": true, + "dependencies": { + "@miniflare/kv": "2.13.0", + "@miniflare/shared": "2.13.0", + "@miniflare/storage-file": "2.13.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/storage-file": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/storage-file/-/storage-file-2.13.0.tgz", + "integrity": "sha512-LuAeAAY5046rq5U1eFLVkz+ppiFEWytWacpkQw92DvVKFFquZcXSj6WPxZF4rSs23WDk+rdcwuLekbb52aDR7A==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.13.0", + "@miniflare/storage-memory": "2.13.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/storage-memory": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/storage-memory/-/storage-memory-2.13.0.tgz", + "integrity": "sha512-FnkYcBNXa/ym1ksNilNZycg9WYYKo6cWKplVBeSthRon3e8QY6t3n7/XRseBUo7O6mhDybVTy4wNCP1R2nBiEw==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.13.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/watcher": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/watcher/-/watcher-2.13.0.tgz", + "integrity": "sha512-teAacWcpMStoBLbLae95IUaL5lPzjPlXa9lhK9CbRaio/KRMibTMRGWrYos3IVGQRZvklvLwcms/nTvgcdb6yw==", + "dev": true, + "dependencies": { + "@miniflare/shared": "2.13.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@miniflare/web-sockets": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@miniflare/web-sockets/-/web-sockets-2.13.0.tgz", + "integrity": "sha512-+U2/HCf+BetRIgjAnNQjkuN6UeAjQmXifhQC+7CCaX834XJhrKXoR6z2xr2xkg1qj0qQs4D2jWG0KzrO5OUpug==", + "dev": true, + "dependencies": { + "@miniflare/core": "2.13.0", + "@miniflare/shared": "2.13.0", + "undici": "5.20.0", + "ws": "^8.2.2" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.7.tgz", + "integrity": "sha512-+c2YGPWY5831v3uj2/X0HRTK94u1GXU3sCnLqu7AKlxlSfawswnAiJR//TFzSL5azWsLQkG/uS+YnnqHtuZxPw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.9.tgz", + "integrity": "sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-trace": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/stack-trace/-/stack-trace-0.0.29.tgz", + "integrity": "sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dev": true, + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cron-schedule": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/cron-schedule/-/cron-schedule-3.0.6.tgz", + "integrity": "sha512-izfGgKyzzIyLaeb1EtZ3KbglkS6AKp9cv7LxmiyoOu+fXfol1tQDC0Cof0enVZGNtudTHW+3lfuW9ZkLQss4Wg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/esbuild": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.3.tgz", + "integrity": "sha512-71f7EjPWTiSguen8X/kxEpkAS7BFHwtQKisCDDV3Y4GLGWBaoSCyD5uXkaUew6JDzA9FEN1W23mdnSwW9kqCeg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.3", + "@esbuild/android-arm64": "0.16.3", + "@esbuild/android-x64": "0.16.3", + "@esbuild/darwin-arm64": "0.16.3", + "@esbuild/darwin-x64": "0.16.3", + "@esbuild/freebsd-arm64": "0.16.3", + "@esbuild/freebsd-x64": "0.16.3", + "@esbuild/linux-arm": "0.16.3", + "@esbuild/linux-arm64": "0.16.3", + "@esbuild/linux-ia32": "0.16.3", + "@esbuild/linux-loong64": "0.16.3", + "@esbuild/linux-mips64el": "0.16.3", + "@esbuild/linux-ppc64": "0.16.3", + "@esbuild/linux-riscv64": "0.16.3", + "@esbuild/linux-s390x": "0.16.3", + "@esbuild/linux-x64": "0.16.3", + "@esbuild/netbsd-x64": "0.16.3", + "@esbuild/openbsd-x64": "0.16.3", + "@esbuild/sunos-x64": "0.16.3", + "@esbuild/win32-arm64": "0.16.3", + "@esbuild/win32-ia32": "0.16.3", + "@esbuild/win32-x64": "0.16.3" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-rewriter-wasm": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/html-rewriter-wasm/-/html-rewriter-wasm-0.4.1.tgz", + "integrity": "sha512-lNovG8CMCCmcVB1Q7xggMSf7tqPCijZXaH4gL6iE8BFghdQCbaY5Met9i1x2Ex8m/cZHDUtXK9H6/znKamRP8Q==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "dev": true, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/miniflare": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-2.13.0.tgz", + "integrity": "sha512-ayNhVa4a6bZiOuHtrPmOt4BCYcmW1fBQ/+qGL85smq1m2OBBm3aUs6f4ISf38xH8tk+qewgmAywetyVtn6KHPw==", + "dev": true, + "dependencies": { + "@miniflare/cache": "2.13.0", + "@miniflare/cli-parser": "2.13.0", + "@miniflare/core": "2.13.0", + "@miniflare/d1": "2.13.0", + "@miniflare/durable-objects": "2.13.0", + "@miniflare/html-rewriter": "2.13.0", + "@miniflare/http-server": "2.13.0", + "@miniflare/kv": "2.13.0", + "@miniflare/queues": "2.13.0", + "@miniflare/r2": "2.13.0", + "@miniflare/runner-vm": "2.13.0", + "@miniflare/scheduler": "2.13.0", + "@miniflare/shared": "2.13.0", + "@miniflare/sites": "2.13.0", + "@miniflare/storage-file": "2.13.0", + "@miniflare/storage-memory": "2.13.0", + "@miniflare/web-sockets": "2.13.0", + "kleur": "^4.1.4", + "semiver": "^1.1.0", + "source-map-support": "^0.5.20", + "undici": "5.20.0" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "@miniflare/storage-redis": "2.13.0", + "cron-schedule": "^3.0.4", + "ioredis": "^4.27.9" + }, + "peerDependenciesMeta": { + "@miniflare/storage-redis": { + "optional": true + }, + "cron-schedule": { + "optional": true + }, + "ioredis": { + "optional": true + } + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npx-import": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.1.4.tgz", + "integrity": "sha512-3ShymTWOgqGyNlh5lMJAejLuIv3W1K3fbI5Ewc6YErZU3Sp0PqsNs8UIU1O8z5+KVl/Du5ag56Gza9vdorGEoA==", + "dev": true, + "dependencies": { + "execa": "^6.1.0", + "parse-package-name": "^1.0.0", + "semver": "^7.3.7", + "validate-npm-package-name": "^4.0.0" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-package-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-package-name/-/parse-package-name-1.0.0.tgz", + "integrity": "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + } + }, + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dev": true, + "dependencies": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semiver": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz", + "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/undici": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/urlpattern-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-4.0.3.tgz", + "integrity": "sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ==", + "dev": true + }, + "node_modules/validate-npm-package-name": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrangler": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-2.20.1.tgz", + "integrity": "sha512-5fl7xF7OkRHim0B0kVXtmSPMrRhRKZ3rqAdn9tKYgi6MnZOvWC+HesGKpNxpVUWsJYpPfJ5AU6gZ6gEL1OLmFQ==", + "dev": true, + "dependencies": { + "@cloudflare/kv-asset-handler": "^0.2.0", + "@esbuild-plugins/node-globals-polyfill": "^0.1.1", + "@esbuild-plugins/node-modules-polyfill": "^0.1.4", + "@miniflare/core": "2.13.0", + "@miniflare/d1": "2.13.0", + "@miniflare/durable-objects": "2.13.0", + "blake3-wasm": "^2.1.5", + "chokidar": "^3.5.3", + "esbuild": "0.16.3", + "miniflare": "2.13.0", + "nanoid": "^3.3.3", + "path-to-regexp": "^6.2.0", + "selfsigned": "^2.0.1", + "source-map": "^0.7.4", + "xxhash-wasm": "^1.0.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=16.13.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xxhash-wasm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", + "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/youch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/youch/-/youch-2.2.2.tgz", + "integrity": "sha512-/FaCeG3GkuJwaMR34GHVg0l8jCbafZLHiFowSjqLlqhC6OMyf2tPJBu8UirF7/NI9X/R5ai4QfEKUCOxMAGxZQ==", + "dev": true, + "dependencies": { + "@types/stack-trace": "0.0.29", + "cookie": "^0.4.1", + "mustache": "^4.2.0", + "stack-trace": "0.0.10" + } + } + } +} diff --git a/crates/cloudflare_worker/package.json b/crates/cloudflare_worker/package.json new file mode 100644 index 00000000..f7a4badf --- /dev/null +++ b/crates/cloudflare_worker/package.json @@ -0,0 +1,12 @@ +{ + "name": "conductor-cf-worker", + "version": "0.0.0", + "private": true, + "scripts": { + "deploy": "wrangler deploy", + "dev": "wrangler dev --local --var \"CONDUCTOR_CONFIG:$CONDUCTOR_CONFIG\"" + }, + "devDependencies": { + "wrangler": "^2.13.0" + } +} diff --git a/crates/cloudflare_worker/src/lib.rs b/crates/cloudflare_worker/src/lib.rs new file mode 100644 index 00000000..4a65614b --- /dev/null +++ b/crates/cloudflare_worker/src/lib.rs @@ -0,0 +1,71 @@ +use std::str::FromStr; + +use conductor_common::http::{ + ConductorHttpRequest, HeaderName, HeaderValue, HttpHeadersMap, Method, +}; +use conductor_config::from_yaml; +use conductor_engine::gateway::ConductorGateway; +use worker::*; + +async fn run_flow(mut req: Request, env: Env, ctx: Context) -> Result { + let conductor_config_str = env.var("CONDUCTOR_CONFIG").map(|v| v.to_string()); + + match conductor_config_str { + Ok(conductor_config_str) => match from_yaml(&conductor_config_str) { + Ok(conductor_config) => { + let gw = ConductorGateway::lazy(conductor_config); + + if let Some(route_data) = gw.match_route(&req.url().unwrap()) { + console_log!("Route found: {:?}", route_data); + let mut headers_map = HttpHeadersMap::new(); + + for (k, v) in (&req).headers().entries() { + headers_map.insert( + HeaderName::from_str(&k).unwrap(), + HeaderValue::from_str(&v).unwrap(), + ); + } + + let body = req.bytes().await.unwrap().into(); + let uri = req.url().unwrap().to_string(); + let query_string = req.url().unwrap().query().unwrap_or_default().to_string(); + let method = Method::from_str(&req.method().to_string()).unwrap(); + + let conductor_req = ConductorHttpRequest { + body, + uri, + query_string, + method, + headers: headers_map, + }; + + let conductor_response = gw.execute(conductor_req, &route_data).await; + + let mut response_headers = Headers::new(); + for (k, v) in conductor_response.headers.into_iter() { + response_headers + .append(&k.unwrap().to_string(), &v.to_str().unwrap()) + .unwrap(); + } + + return Response::from_bytes(conductor_response.body.into()).map(|r| { + r.with_status(conductor_response.status.as_u16()) + .with_headers(response_headers) + }); + } else { + return Response::error("No route found", 404); + } + } + Err(e) => Response::error(e.to_string(), 500), + }, + Err(e) => Response::error(e.to_string(), 500), + } +} + +#[event(fetch, respond_with_errors)] +async fn main(req: Request, env: Env, ctx: Context) -> Result { + match run_flow(req, env, ctx).await { + Ok(response) => Ok(response), + Err(e) => Response::error(e.to_string(), 500), + } +} diff --git a/crates/cloudflare_worker/wrangler.toml b/crates/cloudflare_worker/wrangler.toml new file mode 100644 index 00000000..bf21a058 --- /dev/null +++ b/crates/cloudflare_worker/wrangler.toml @@ -0,0 +1,6 @@ +name = "worker-rust" +main = "build/worker/shim.mjs" +compatibility_date = "2023-03-22" + +[build] +command = "cargo install -q worker-build && worker-build --release" diff --git a/crates/common/src/http.rs b/crates/common/src/http.rs index 7712a3f3..7a63cd9b 100644 --- a/crates/common/src/http.rs +++ b/crates/common/src/http.rs @@ -5,7 +5,7 @@ pub use http::Uri; use http::{HeaderMap, StatusCode as RawStatusCode}; pub use url::Url; -pub use http::header::{HeaderValue, ACCEPT, CONTENT_TYPE}; +pub use http::header::{HeaderName, HeaderValue, ACCEPT, CONTENT_TYPE}; pub use http::Method; pub use mime::{Mime, APPLICATION_JSON, APPLICATION_WWW_FORM_URLENCODED}; use serde::de::DeserializeOwned; diff --git a/crates/conductor/src/lib.rs b/crates/conductor/src/lib.rs index dbc603a5..d697e4e4 100644 --- a/crates/conductor/src/lib.rs +++ b/crates/conductor/src/lib.rs @@ -42,14 +42,17 @@ fn create_router_from_config( > { let root_router = App::new(); - let (gateway, root_router) = - ConductorGateway::new(config_object, root_router, &mut |route_data, app, path| { + let (gateway, root_router) = ConductorGateway::new_with_external_router( + config_object, + root_router, + &mut |route_data, app, path| { let child_router = Scope::new(path.as_str()) .app_data(web::Data::new(route_data)) .route("/.*", web::route().to(handler)); app.service(child_router) - }); + }, + ); root_router.app_data(web::Data::new(gateway)) } diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index b6dec7f4..4c0b7371 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -159,3 +159,7 @@ pub async fn load_config(file_path: &String) -> ConductorConfig { None => panic!("Config file has no extension"), } } + +pub fn from_yaml(contents: &String) -> Result { + serde_yaml::from_str::(&contents) +} diff --git a/crates/engine/Cargo.toml b/crates/engine/Cargo.toml index eb1e9f33..433fda33 100644 --- a/crates/engine/Cargo.toml +++ b/crates/engine/Cargo.toml @@ -15,4 +15,5 @@ thiserror = { workspace = true } conductor_common = { path = "../common" } conductor_config = { path = "../config" } reqwest = { version = "0.11.22", features = ["json"] } -tokio = { version = "1.34.0", features = ["full"] } +async_runtime = { path = "../async_runtime" } +matchit = "0.7.3" diff --git a/crates/engine/src/gateway.rs b/crates/engine/src/gateway.rs index a3c377e1..3dea8c97 100644 --- a/crates/engine/src/gateway.rs +++ b/crates/engine/src/gateway.rs @@ -7,7 +7,7 @@ use conductor_common::{ graphql::{ ExtractGraphQLOperationError, GraphQLRequest, GraphQLResponse, ParsedGraphQLRequest, }, - http::{ConductorHttpRequest, ConductorHttpResponse, Method, StatusCode}, + http::{ConductorHttpRequest, ConductorHttpResponse, Method, StatusCode, Url}, }; use conductor_config::{ConductorConfig, SourceDefinition}; use tracing::debug; @@ -33,10 +33,73 @@ impl Debug for dyn SourceRuntime { } #[derive(Debug)] -pub struct ConductorGateway; +pub struct ConductorGateway { + config: ConductorConfig, +} impl ConductorGateway { - pub fn new Data>( + pub fn lazy(config_object: ConductorConfig) -> Self { + Self { + config: config_object, + } + } + + pub fn match_route(&self, route: &Url) -> Option { + let global_plugins = &self.config.plugins; + let endpoint_config = self + .config + .endpoints + .iter() + .find(|e| route.path().starts_with(&e.path)); + + if endpoint_config.is_none() { + return None; + } + + let endpoint_config = endpoint_config.unwrap(); + let source_runtime = self + .config + .sources + .iter() + .find_map(|source_def| match source_def { + SourceDefinition::GraphQL { id, config } + if id.eq(endpoint_config.from.as_str()) => + { + Some(GraphQLSourceRuntime::new(config.clone())) + } + _ => None, + }); + + if source_runtime.is_none() { + return None; + } + + let endpoint_runtime = EndpointRuntime { + config: endpoint_config.clone(), + }; + + let combined_plugins = global_plugins + .iter() + .chain(&self.config.plugins) + .flat_map(|vec| vec.iter()) + .cloned() + .collect::>(); + + let plugin_manager = Arc::new(PluginManager::new(&Some(combined_plugins))); + + let route_data = ConductorGatewayRouteData { + from: endpoint_runtime, + to: Arc::new(source_runtime.unwrap()), + plugin_manager, + }; + + Some(route_data) + } + + pub fn new_with_external_router< + Data, + F: FnMut(ConductorGatewayRouteData, Data, &String) -> Data, + >( config_object: ConductorConfig, data: Data, route_factory: &mut F, @@ -79,7 +142,12 @@ impl ConductorGateway { user_data = route_factory(route_data, user_data, &endpoint_config.path); } - (Self {}, user_data) + ( + Self { + config: config_object, + }, + user_data, + ) } #[tracing::instrument(skip(self, request, route_data))] @@ -170,7 +238,6 @@ impl ConductorGateway { } let upstream_response = route_data.to.execute(route_data, &mut request_ctx).await; - let final_response = match upstream_response { Ok(response) => response, Err(e) => e.into(), diff --git a/crates/engine/src/plugins/persisted_documents/store/fs.rs b/crates/engine/src/plugins/persisted_documents/store/fs.rs index aa55f334..59177a91 100644 --- a/crates/engine/src/plugins/persisted_documents/store/fs.rs +++ b/crates/engine/src/plugins/persisted_documents/store/fs.rs @@ -60,121 +60,121 @@ impl PersistedDocumentsFilesystemStore { } } -#[tokio::test] -async fn fs_store_apollo_manifest_value() { - use serde_json::json; - - // valid JSON structure with empty array - assert_eq!( - PersistedDocumentsFilesystemStore::new_from_file_contents( - &json!({ - "format": "apollo", - "version": 1, - "operations": [] - }) - .to_string(), - &PersistedDocumentsFileFormat::ApolloPersistedQueryManifest, - ) - .expect("expected valid apollo manifest store") - .known_documents - .len(), - 0 - ); - - // valid store mapping - let store = PersistedDocumentsFilesystemStore::new_from_file_contents( - &json!({ - "format": "apollo", - "version": 1, - "operations": [ - { - "id": "key1", - "body": "query test { __typename }", - "name": "test", - "type": "query" - } - ] - }) - .to_string(), - &PersistedDocumentsFileFormat::ApolloPersistedQueryManifest, - ) - .expect("expected valid apollo manifest store"); - assert_eq!(store.known_documents.len(), 1); - assert_eq!(store.has_document("key1").await, true); - assert_eq!( - store.get_document("key1").await.cloned(), - Some("query test { __typename }".to_string()) - ); - - // Invalid JSON - assert_eq!( - PersistedDocumentsFilesystemStore::new_from_file_contents( - &"{".to_string(), - &PersistedDocumentsFileFormat::ApolloPersistedQueryManifest, - ) - .is_err(), - true - ); - - // invalid JSON structure - assert_eq!( - PersistedDocumentsFilesystemStore::new_from_file_contents( - &json!({}).to_string(), - &PersistedDocumentsFileFormat::ApolloPersistedQueryManifest, - ) - .is_err(), - true - ); -} - -#[tokio::test] -async fn fs_store_json_key_value() { - use serde_json::json; - - // Valid empty JSON map - assert_eq!( - PersistedDocumentsFilesystemStore::new_from_file_contents( - &json!({}).to_string(), - &PersistedDocumentsFileFormat::JsonKeyValue, - ) - .expect("failed to create store from json key value") - .known_documents - .len(), - 0 - ); - - // Valid JSON map - assert_eq!( - PersistedDocumentsFilesystemStore::new_from_file_contents( - &json!({ - "key1": "query { __typename }" - }) - .to_string(), - &PersistedDocumentsFileFormat::JsonKeyValue, - ) - .expect("failed to create store from json key value") - .known_documents - .len(), - 1 - ); - - // Invalid object structure - assert_eq!( - PersistedDocumentsFilesystemStore::new_from_file_contents( - &json!([]).to_string(), - &PersistedDocumentsFileFormat::JsonKeyValue, - ) - .is_err(), - true - ); - - // Invalid JSON - assert_eq!( - PersistedDocumentsFilesystemStore::new_from_file_contents( - &"{".to_string(), - &PersistedDocumentsFileFormat::JsonKeyValue, - ) - .is_err(), - true - ); -} +// #[tokio::test] +// async fn fs_store_apollo_manifest_value() { +// use serde_json::json; + +// // valid JSON structure with empty array +// assert_eq!( +// PersistedDocumentsFilesystemStore::new_from_file_contents( +// &json!({ +// "format": "apollo", +// "version": 1, +// "operations": [] +// }) +// .to_string(), +// &PersistedDocumentsFileFormat::ApolloPersistedQueryManifest, +// ) +// .expect("expected valid apollo manifest store") +// .known_documents +// .len(), +// 0 +// ); + +// // valid store mapping +// let store = PersistedDocumentsFilesystemStore::new_from_file_contents( +// &json!({ +// "format": "apollo", +// "version": 1, +// "operations": [ +// { +// "id": "key1", +// "body": "query test { __typename }", +// "name": "test", +// "type": "query" +// } +// ] +// }) +// .to_string(), +// &PersistedDocumentsFileFormat::ApolloPersistedQueryManifest, +// ) +// .expect("expected valid apollo manifest store"); +// assert_eq!(store.known_documents.len(), 1); +// assert_eq!(store.has_document("key1").await, true); +// assert_eq!( +// store.get_document("key1").await.cloned(), +// Some("query test { __typename }".to_string()) +// ); + +// // Invalid JSON +// assert_eq!( +// PersistedDocumentsFilesystemStore::new_from_file_contents( +// &"{".to_string(), +// &PersistedDocumentsFileFormat::ApolloPersistedQueryManifest, +// ) +// .is_err(), +// true +// ); + +// // invalid JSON structure +// assert_eq!( +// PersistedDocumentsFilesystemStore::new_from_file_contents( +// &json!({}).to_string(), +// &PersistedDocumentsFileFormat::ApolloPersistedQueryManifest, +// ) +// .is_err(), +// true +// ); +// } + +// #[tokio::test] +// async fn fs_store_json_key_value() { +// use serde_json::json; + +// // Valid empty JSON map +// assert_eq!( +// PersistedDocumentsFilesystemStore::new_from_file_contents( +// &json!({}).to_string(), +// &PersistedDocumentsFileFormat::JsonKeyValue, +// ) +// .expect("failed to create store from json key value") +// .known_documents +// .len(), +// 0 +// ); + +// // Valid JSON map +// assert_eq!( +// PersistedDocumentsFilesystemStore::new_from_file_contents( +// &json!({ +// "key1": "query { __typename }" +// }) +// .to_string(), +// &PersistedDocumentsFileFormat::JsonKeyValue, +// ) +// .expect("failed to create store from json key value") +// .known_documents +// .len(), +// 1 +// ); + +// // Invalid object structure +// assert_eq!( +// PersistedDocumentsFilesystemStore::new_from_file_contents( +// &json!([]).to_string(), +// &PersistedDocumentsFileFormat::JsonKeyValue, +// ) +// .is_err(), +// true +// ); + +// // Invalid JSON +// assert_eq!( +// PersistedDocumentsFilesystemStore::new_from_file_contents( +// &"{".to_string(), +// &PersistedDocumentsFileFormat::JsonKeyValue, +// ) +// .is_err(), +// true +// ); +// } diff --git a/crates/engine/src/source/graphql_source.rs b/crates/engine/src/source/graphql_source.rs index b4b37fb1..9a848f47 100644 --- a/crates/engine/src/source/graphql_source.rs +++ b/crates/engine/src/source/graphql_source.rs @@ -1,5 +1,6 @@ -use std::time::Duration; +use std::{future::Future, pin::Pin, time::Duration}; +use async_runtime::call_async; use conductor_common::{graphql::GraphQLResponse, http::Bytes}; use conductor_config::GraphQLSourceConfig; use reqwest::{Client, Method}; @@ -19,8 +20,8 @@ pub struct GraphQLSourceRuntime { impl GraphQLSourceRuntime { pub fn new(config: GraphQLSourceConfig) -> Self { let fetcher = Client::builder() - .connect_timeout(Duration::from_secs(10)) - .tcp_keepalive(Duration::from_secs(120)) + // .connect_timeout(Duration::from_secs(10)) + // .tcp_keepalive(Duration::from_secs(120)) .build() .unwrap(); @@ -28,50 +29,50 @@ impl GraphQLSourceRuntime { } } -#[async_trait::async_trait] impl SourceRuntime for GraphQLSourceRuntime { - #[tracing::instrument(skip(self, route_data, request_context))] - async fn execute( - &self, - route_data: &ConductorGatewayRouteData, - request_context: &mut RequestExecutionContext<'_>, - ) -> Result { - let fetcher = &self.fetcher; - let endpoint = &self.config.endpoint; - let source_req = &mut request_context - .downstream_graphql_request - .as_mut() - .unwrap() - .request; + fn execute<'a>( + &'a self, + route_data: &'a ConductorGatewayRouteData, + request_context: &'a mut RequestExecutionContext<'_>, + ) -> Pin> + Send + 'a)>> { + Box::pin(call_async(async move { + let fetcher = &self.fetcher; + let endpoint = &self.config.endpoint; + let source_req = &mut request_context + .downstream_graphql_request + .as_mut() + .unwrap() + .request; + route_data + .plugin_manager + .on_upstream_graphql_request(source_req) + .await; - route_data - .plugin_manager - .on_upstream_graphql_request(source_req) - .await; + let body_bytes: Bytes = source_req.into(); + let upstream_response = fetcher + .request(Method::POST, endpoint) + .body(body_bytes) + .send() + .await; - let body_bytes: Bytes = source_req.into(); - let upstream_response = fetcher - .request(Method::POST, endpoint) - .body(body_bytes) - .send() - .await; + match upstream_response { + Ok(res) => match res.status() { + reqwest::StatusCode::OK => { + let body = res.bytes().await.unwrap(); + let mut response = + serde_json::from_slice::(&body).unwrap(); - match upstream_response { - Ok(res) => match res.status() { - reqwest::StatusCode::OK => { - let body = res.bytes().await.unwrap(); - let mut response = serde_json::from_slice::(&body).unwrap(); + route_data + .plugin_manager + .on_upstream_graphql_response(&mut response) + .await; - route_data - .plugin_manager - .on_upstream_graphql_response(&mut response) - .await; - - Ok(response) - } - code => Err(SourceError::UnexpectedHTTPStatusError(code)), - }, - Err(e) => Err(SourceError::NetworkError(e)), - } + Ok(response) + } + code => Err(SourceError::UnexpectedHTTPStatusError(code)), + }, + Err(e) => Err(SourceError::NetworkError(e)), + } + })) } } diff --git a/crates/engine/src/source/runtime.rs b/crates/engine/src/source/runtime.rs index c7e7b5a5..813c9d24 100644 --- a/crates/engine/src/source/runtime.rs +++ b/crates/engine/src/source/runtime.rs @@ -1,16 +1,17 @@ +use std::{future::Future, pin::Pin}; + use conductor_common::{graphql::GraphQLResponse, http::StatusCode}; use crate::{ gateway::ConductorGatewayRouteData, request_execution_context::RequestExecutionContext, }; -#[async_trait::async_trait] pub trait SourceRuntime: Send + Sync + 'static { - async fn execute( - &self, - _route_data: &ConductorGatewayRouteData, - _request_context: &mut RequestExecutionContext<'_>, - ) -> Result; + fn execute<'a>( + &'a self, + _route_data: &'a ConductorGatewayRouteData, + _request_context: &'a mut RequestExecutionContext<'_>, + ) -> Pin> + Send + 'a)>>; } #[derive(thiserror::Error, Debug)] diff --git a/test_config/worker.yaml b/test_config/worker.yaml new file mode 100644 index 00000000..c219d663 --- /dev/null +++ b/test_config/worker.yaml @@ -0,0 +1,19 @@ +server: + port: 9000 + +logger: + level: debug + format: pretty + +sources: + - id: countries + type: graphql + config: + endpoint: https://countries.trevorblades.com/ + +endpoints: + - path: /graphql + from: countries + plugins: + - type: graphiql + - type: http_get From 82a7ec2121c3348ed089f2f0098ff8512bc55292 Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 15:47:35 +0200 Subject: [PATCH 02/15] wip --- crates/engine/src/plugins/graphiql_plugin.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/engine/src/plugins/graphiql_plugin.rs b/crates/engine/src/plugins/graphiql_plugin.rs index aead4465..ef544214 100644 --- a/crates/engine/src/plugins/graphiql_plugin.rs +++ b/crates/engine/src/plugins/graphiql_plugin.rs @@ -15,6 +15,7 @@ pub struct GraphiQLPlugin {} #[async_trait::async_trait] impl Plugin for GraphiQLPlugin { async fn on_downstream_http_request(&self, ctx: &mut RequestExecutionContext) { + println!("im here"); if ctx.downstream_http_request.method == Method::GET { let headers = &ctx.downstream_http_request.headers; let content_type = extract_content_type(headers); From ed72575c609fb678fc138493d8b399bf7fe031f7 Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 16:01:11 +0200 Subject: [PATCH 03/15] ok logging works now --- Cargo.lock | 115 ++++++++++++++++++---------- crates/cloudflare_worker/Cargo.toml | 6 +- crates/cloudflare_worker/src/lib.rs | 22 +++++- crates/conductor/src/lib.rs | 2 + 4 files changed, 102 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7bb373f0..97ec68ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -421,9 +421,9 @@ dependencies = [ [[package]] name = "chrono-tz" -version = "0.6.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c39203181991a7dd4343b8005bd804e7a9a37afb8ac070e43771e8c820bbde" +checksum = "e23185c0e21df6ed832a12e2bda87c7d1def6842881fb634a8511ced741b0d76" dependencies = [ "chrono", "chrono-tz-build", @@ -432,9 +432,9 @@ dependencies = [ [[package]] name = "chrono-tz-build" -version = "0.0.3" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f509c3a87b33437b05e2458750a0700e5bdd6956176773e6c7d6dd15a283a0c" +checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f" dependencies = [ "parse-zoneinfo", "phf", @@ -565,6 +565,16 @@ dependencies = [ "tracing", ] +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -1107,9 +1117,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" dependencies = [ "wasm-bindgen", ] @@ -1433,7 +1443,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" dependencies = [ "siphasher", - "uncased", ] [[package]] @@ -2026,6 +2035,7 @@ checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ "deranged", "itoa", + "js-sys", "powerfmt", "serde", "time-core", @@ -2176,6 +2186,16 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.3.18" @@ -2183,11 +2203,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "nu-ansi-term", + "serde", + "serde_json", "sharded-slab", "smallvec", "thread_local", + "time", "tracing-core", "tracing-log", + "tracing-serde", +] + +[[package]] +name = "tracing-web" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ff5efc53ed5a7c4b99b3dd24fd10f41e7aa1b284a4e64ae9167d97e31afe124" +dependencies = [ + "js-sys", + "tracing-core", + "tracing-subscriber", + "wasm-bindgen", + "web-sys", ] [[package]] @@ -2202,15 +2239,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "uncased" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-bidi" version = "0.3.13" @@ -2309,9 +2337,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2319,24 +2347,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.32", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e" dependencies = [ "cfg-if", "js-sys", @@ -2346,9 +2374,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2356,28 +2384,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.32", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "wasm-streams" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078" +checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" dependencies = [ "futures-util", "js-sys", @@ -2388,9 +2416,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" dependencies = [ "js-sys", "wasm-bindgen", @@ -2505,9 +2533,9 @@ dependencies = [ [[package]] name = "worker" -version = "0.0.15" +version = "0.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ec504c3c7afcbcc9688938a540ec290d642e780b99cfc5b90bcc3c8ea32470" +checksum = "9cd7ad167392bdd707a963356f3478844019c74fc89f6af0dfc656914b30af24" dependencies = [ "async-trait", "chrono", @@ -2521,6 +2549,7 @@ dependencies = [ "serde", "serde-wasm-bindgen", "serde_json", + "tokio", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -2548,14 +2577,14 @@ dependencies = [ [[package]] name = "worker-macros" -version = "0.0.8" +version = "0.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c86b080d7a6472a244fd1b5b1f36be3dc53942aef13e716724a4b74715708afc" +checksum = "306c6b6fc316ce129de9cc393dc614b244afb37d43d8ae7a4dccf45d6f8a5ff5" dependencies = [ "async-trait", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.32", "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-macro-support", @@ -2569,14 +2598,18 @@ dependencies = [ "conductor_common", "conductor_config", "conductor_engine", + "console_error_panic_hook", + "time", + "tracing-subscriber", + "tracing-web", "worker", ] [[package]] name = "worker-sys" -version = "0.0.8" +version = "0.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b842e2ac2871c2d83e50ce8e8844fc3893666d1c16825b809505de6506ad4487" +checksum = "8f5db3bd0e45980dbcefe567c978b4930e4526e864cd9e70482252a60229ddd7" dependencies = [ "cfg-if", "js-sys", diff --git a/crates/cloudflare_worker/Cargo.toml b/crates/cloudflare_worker/Cargo.toml index cc8191c0..c8aadc67 100644 --- a/crates/cloudflare_worker/Cargo.toml +++ b/crates/cloudflare_worker/Cargo.toml @@ -11,10 +11,14 @@ wasm-opt = false crate-type = ["cdylib"] [dependencies] -worker = "0.0.15" +worker = "0.0.18" conductor_config = { path = "../config" } conductor_engine = { path = "../engine" } conductor_common = { path = "../common" } +tracing-web = "0.1.2" +tracing-subscriber = { version = "0.3.18", features = ['time', 'json'] } +time = { version = "0.3.30", features = ['wasm-bindgen'] } +console_error_panic_hook = "0.1.7" [profile.release] lto = true diff --git a/crates/cloudflare_worker/src/lib.rs b/crates/cloudflare_worker/src/lib.rs index 4a65614b..2a3bb74b 100644 --- a/crates/cloudflare_worker/src/lib.rs +++ b/crates/cloudflare_worker/src/lib.rs @@ -5,9 +5,14 @@ use conductor_common::http::{ }; use conductor_config::from_yaml; use conductor_engine::gateway::ConductorGateway; +use std::panic; +use tracing_subscriber::fmt::format::FmtSpan; +use tracing_subscriber::fmt::time::UtcTime; +use tracing_subscriber::prelude::*; +use tracing_web::MakeConsoleWriter; use worker::*; -async fn run_flow(mut req: Request, env: Env, ctx: Context) -> Result { +async fn run_flow(mut req: Request, env: Env, _ctx: Context) -> Result { let conductor_config_str = env.var("CONDUCTOR_CONFIG").map(|v| v.to_string()); match conductor_config_str { @@ -62,6 +67,21 @@ async fn run_flow(mut req: Request, env: Env, ctx: Context) -> Result } } +#[event(start)] +fn start() { + // This will make sure to capture runtime events from the WASM and print it to the log + panic::set_hook(Box::new(console_error_panic_hook::hook)); + + // This will make sure to capture the logs from the WASM and print it to the log + let fmt_layer = tracing_subscriber::fmt::layer() + .json() + .with_ansi(false) + .with_span_events(FmtSpan::ENTER | FmtSpan::EXIT) // Only partially supported across JavaScript runtimes + .with_timer(UtcTime::rfc_3339()) // std::time is not available in browsers + .with_writer(MakeConsoleWriter); // write events to the console + tracing_subscriber::registry().with(fmt_layer).init(); +} + #[event(fetch, respond_with_errors)] async fn main(req: Request, env: Env, ctx: Context) -> Result { match run_flow(req, env, ctx).await { diff --git a/crates/conductor/src/lib.rs b/crates/conductor/src/lib.rs index d697e4e4..5a00db28 100644 --- a/crates/conductor/src/lib.rs +++ b/crates/conductor/src/lib.rs @@ -8,6 +8,7 @@ use conductor_common::http::{ConductorHttpRequest, HttpHeadersMap}; use conductor_config::{load_config, ConductorConfig}; use conductor_engine::gateway::{ConductorGateway, ConductorGatewayRouteData}; use tracing::debug; +use tracing_subscriber::fmt::format::FmtSpan; pub async fn run_services(config_file_path: &String) -> std::io::Result<()> { println!("gateway process started"); @@ -17,6 +18,7 @@ pub async fn run_services(config_file_path: &String) -> std::io::Result<()> { tracing_subscriber::fmt() .with_max_level(config_object.logger.level.into_level()) + .with_span_events(FmtSpan::ENTER | FmtSpan::EXIT) .init(); let server_config = config_object.server.clone(); From 4bde9f338b489423cbc3288bdc048856a28b8c9f Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 16:16:49 +0200 Subject: [PATCH 04/15] improve perf logging --- Cargo.lock | 1 + Cargo.toml | 1 + crates/async_runtime/Cargo.toml | 2 ++ crates/async_runtime/src/lib.rs | 14 ++++++++++++++ crates/cloudflare_worker/src/lib.rs | 1 - crates/common/src/graphql.rs | 5 +++++ crates/conductor/src/lib.rs | 2 +- crates/engine/Cargo.toml | 2 +- crates/engine/src/gateway.rs | 2 +- crates/engine/src/plugins/plugin_manager.rs | 10 +++++----- crates/engine/src/source/graphql_source.rs | 19 ++++++++++--------- 11 files changed, 41 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 97ec68ca..fb3f9499 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -272,6 +272,7 @@ dependencies = [ name = "async_runtime" version = "0.0.0" dependencies = [ + "reqwest", "send_wrapper", "tokio", "wasm-bindgen-futures", diff --git a/Cargo.toml b/Cargo.toml index 630410da..4fb8beca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,4 +12,5 @@ http-body = "0.4.5" bytes = "1.5.0" async-trait = "0.1.74" anyhow = "1.0.75" +reqwest = "0.11.22" thiserror = "1.0.50" diff --git a/crates/async_runtime/Cargo.toml b/crates/async_runtime/Cargo.toml index 34971578..5b388f87 100644 --- a/crates/async_runtime/Cargo.toml +++ b/crates/async_runtime/Cargo.toml @@ -10,6 +10,8 @@ path = "src/lib.rs" [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen-futures = { version = "0.4" } send_wrapper = { version = "0.6", features = ["futures"] } +reqwest = { workspace = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] tokio = { version = "1.34.0" } +reqwest = { workspace = true } diff --git a/crates/async_runtime/src/lib.rs b/crates/async_runtime/src/lib.rs index 63095c8e..633105b4 100644 --- a/crates/async_runtime/src/lib.rs +++ b/crates/async_runtime/src/lib.rs @@ -12,3 +12,17 @@ where { future } + +#[cfg(not(target_arch = "wasm32"))] +pub fn create_http_client() -> reqwest::ClientBuilder { + use std::time::Duration; + + reqwest::Client::builder() + .connect_timeout(Duration::from_secs(10)) + .tcp_keepalive(Duration::from_secs(120)) +} + +#[cfg(target_arch = "wasm32")] +pub fn create_http_client() -> reqwest::ClientBuilder { + reqwest::Client::builder() +} diff --git a/crates/cloudflare_worker/src/lib.rs b/crates/cloudflare_worker/src/lib.rs index 2a3bb74b..0775be47 100644 --- a/crates/cloudflare_worker/src/lib.rs +++ b/crates/cloudflare_worker/src/lib.rs @@ -76,7 +76,6 @@ fn start() { let fmt_layer = tracing_subscriber::fmt::layer() .json() .with_ansi(false) - .with_span_events(FmtSpan::ENTER | FmtSpan::EXIT) // Only partially supported across JavaScript runtimes .with_timer(UtcTime::rfc_3339()) // std::time is not available in browsers .with_writer(MakeConsoleWriter); // write events to the console tracing_subscriber::registry().with(fmt_layer).init(); diff --git a/crates/common/src/graphql.rs b/crates/common/src/graphql.rs index 665049ae..e34e8c4d 100644 --- a/crates/common/src/graphql.rs +++ b/crates/common/src/graphql.rs @@ -146,6 +146,10 @@ pub struct ParsedGraphQLRequest { } impl ParsedGraphQLRequest { + #[tracing::instrument( + level = "debug", + name = "ParsedGraphQLRequest::parse_graphql_operation" + )] pub fn create_and_parse(raw_request: GraphQLRequest) -> Result { parse_graphql_operation(&raw_request.operation).map(|parsed_operation| { ParsedGraphQLRequest { @@ -155,6 +159,7 @@ impl ParsedGraphQLRequest { }) } + #[tracing::instrument(level = "trace", name = "ParsedGraphQLRequest::is_running_mutation")] pub fn is_running_mutation(&self) -> bool { if let Some(operation_name) = &self.request.operation_name { for definition in &self.parsed_operation.definitions { diff --git a/crates/conductor/src/lib.rs b/crates/conductor/src/lib.rs index 5a00db28..5cf0f886 100644 --- a/crates/conductor/src/lib.rs +++ b/crates/conductor/src/lib.rs @@ -18,7 +18,7 @@ pub async fn run_services(config_file_path: &String) -> std::io::Result<()> { tracing_subscriber::fmt() .with_max_level(config_object.logger.level.into_level()) - .with_span_events(FmtSpan::ENTER | FmtSpan::EXIT) + .with_span_events(FmtSpan::CLOSE) .init(); let server_config = config_object.server.clone(); diff --git a/crates/engine/Cargo.toml b/crates/engine/Cargo.toml index 433fda33..c2844861 100644 --- a/crates/engine/Cargo.toml +++ b/crates/engine/Cargo.toml @@ -14,6 +14,6 @@ async-trait = { workspace = true } thiserror = { workspace = true } conductor_common = { path = "../common" } conductor_config = { path = "../config" } -reqwest = { version = "0.11.22", features = ["json"] } async_runtime = { path = "../async_runtime" } matchit = "0.7.3" +reqwest = { workspace = true } diff --git a/crates/engine/src/gateway.rs b/crates/engine/src/gateway.rs index 3dea8c97..0673b0bf 100644 --- a/crates/engine/src/gateway.rs +++ b/crates/engine/src/gateway.rs @@ -150,7 +150,7 @@ impl ConductorGateway { ) } - #[tracing::instrument(skip(self, request, route_data))] + #[tracing::instrument(skip(self, request, route_data), name = "ConductorGateway::execute")] pub async fn execute( &self, request: ConductorHttpRequest, diff --git a/crates/engine/src/plugins/plugin_manager.rs b/crates/engine/src/plugins/plugin_manager.rs index 0f555e3d..226e00e5 100644 --- a/crates/engine/src/plugins/plugin_manager.rs +++ b/crates/engine/src/plugins/plugin_manager.rs @@ -45,7 +45,7 @@ impl PluginManager { self.plugins.push(Box::new(plugin)); } - #[tracing::instrument(level = "trace")] + #[tracing::instrument(level = "debug", skip(self, context))] pub async fn on_downstream_http_request(&self, context: &mut RequestExecutionContext<'_>) { let p = &self.plugins; @@ -58,7 +58,7 @@ impl PluginManager { } } - #[tracing::instrument(level = "trace")] + #[tracing::instrument(level = "debug", skip(self, context, response))] pub fn on_downstream_http_response( &self, context: &RequestExecutionContext, @@ -75,7 +75,7 @@ impl PluginManager { } } - #[tracing::instrument(level = "trace")] + #[tracing::instrument(level = "debug", skip(self, context))] pub async fn on_downstream_graphql_request(&self, context: &mut RequestExecutionContext<'_>) { let p = &self.plugins; @@ -88,7 +88,7 @@ impl PluginManager { } } - #[tracing::instrument(level = "trace")] + #[tracing::instrument(level = "debug", skip(self, req))] pub async fn on_upstream_graphql_request<'a>(&self, req: &mut GraphQLRequest) { let p = &self.plugins; @@ -97,7 +97,7 @@ impl PluginManager { } } - #[tracing::instrument(level = "trace")] + #[tracing::instrument(level = "debug", skip(self, response))] pub async fn on_upstream_graphql_response<'a>(&self, response: &mut GraphQLResponse) { let p = &self.plugins; diff --git a/crates/engine/src/source/graphql_source.rs b/crates/engine/src/source/graphql_source.rs index 9a848f47..abd4267f 100644 --- a/crates/engine/src/source/graphql_source.rs +++ b/crates/engine/src/source/graphql_source.rs @@ -1,9 +1,10 @@ -use std::{future::Future, pin::Pin, time::Duration}; +use std::{future::Future, pin::Pin}; + +use async_runtime::{call_async, create_http_client}; -use async_runtime::call_async; use conductor_common::{graphql::GraphQLResponse, http::Bytes}; use conductor_config::GraphQLSourceConfig; -use reqwest::{Client, Method}; +use reqwest::{Client, Method, StatusCode}; use crate::{ gateway::ConductorGatewayRouteData, request_execution_context::RequestExecutionContext, @@ -19,17 +20,17 @@ pub struct GraphQLSourceRuntime { impl GraphQLSourceRuntime { pub fn new(config: GraphQLSourceConfig) -> Self { - let fetcher = Client::builder() - // .connect_timeout(Duration::from_secs(10)) - // .tcp_keepalive(Duration::from_secs(120)) - .build() - .unwrap(); + let fetcher = create_http_client().build().unwrap(); Self { fetcher, config } } } impl SourceRuntime for GraphQLSourceRuntime { + #[tracing::instrument( + skip(self, route_data, request_context), + name = "GraphQLSourceRuntime::execute" + )] fn execute<'a>( &'a self, route_data: &'a ConductorGatewayRouteData, @@ -57,7 +58,7 @@ impl SourceRuntime for GraphQLSourceRuntime { match upstream_response { Ok(res) => match res.status() { - reqwest::StatusCode::OK => { + StatusCode::OK => { let body = res.bytes().await.unwrap(); let mut response = serde_json::from_slice::(&body).unwrap(); From 3a2d399ba29031a0f3fdbb19bf3f147fa7e2945a Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 16:19:50 +0200 Subject: [PATCH 05/15] prettify --- crates/cloudflare_worker/src/lib.rs | 13 ++++++------- crates/config/src/lib.rs | 4 ++-- crates/engine/src/gateway.rs | 8 ++------ 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/crates/cloudflare_worker/src/lib.rs b/crates/cloudflare_worker/src/lib.rs index 0775be47..602a5f4a 100644 --- a/crates/cloudflare_worker/src/lib.rs +++ b/crates/cloudflare_worker/src/lib.rs @@ -6,7 +6,6 @@ use conductor_common::http::{ use conductor_config::from_yaml; use conductor_engine::gateway::ConductorGateway; use std::panic; -use tracing_subscriber::fmt::format::FmtSpan; use tracing_subscriber::fmt::time::UtcTime; use tracing_subscriber::prelude::*; use tracing_web::MakeConsoleWriter; @@ -24,7 +23,7 @@ async fn run_flow(mut req: Request, env: Env, _ctx: Context) -> Result console_log!("Route found: {:?}", route_data); let mut headers_map = HttpHeadersMap::new(); - for (k, v) in (&req).headers().entries() { + for (k, v) in req.headers().entries() { headers_map.insert( HeaderName::from_str(&k).unwrap(), HeaderValue::from_str(&v).unwrap(), @@ -34,7 +33,7 @@ async fn run_flow(mut req: Request, env: Env, _ctx: Context) -> Result let body = req.bytes().await.unwrap().into(); let uri = req.url().unwrap().to_string(); let query_string = req.url().unwrap().query().unwrap_or_default().to_string(); - let method = Method::from_str(&req.method().to_string()).unwrap(); + let method = Method::from_str(req.method().as_ref()).unwrap(); let conductor_req = ConductorHttpRequest { body, @@ -49,16 +48,16 @@ async fn run_flow(mut req: Request, env: Env, _ctx: Context) -> Result let mut response_headers = Headers::new(); for (k, v) in conductor_response.headers.into_iter() { response_headers - .append(&k.unwrap().to_string(), &v.to_str().unwrap()) + .append(k.unwrap().as_str(), v.to_str().unwrap()) .unwrap(); } - return Response::from_bytes(conductor_response.body.into()).map(|r| { + Response::from_bytes(conductor_response.body.into()).map(|r| { r.with_status(conductor_response.status.as_u16()) .with_headers(response_headers) - }); + }) } else { - return Response::error("No route found", 404); + Response::error("No route found", 404) } } Err(e) => Response::error(e.to_string(), 500), diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index 4c0b7371..8f3a8ce9 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -160,6 +160,6 @@ pub async fn load_config(file_path: &String) -> ConductorConfig { } } -pub fn from_yaml(contents: &String) -> Result { - serde_yaml::from_str::(&contents) +pub fn from_yaml(contents: &str) -> Result { + serde_yaml::from_str::(contents) } diff --git a/crates/engine/src/gateway.rs b/crates/engine/src/gateway.rs index 0673b0bf..5af8980f 100644 --- a/crates/engine/src/gateway.rs +++ b/crates/engine/src/gateway.rs @@ -52,9 +52,7 @@ impl ConductorGateway { .iter() .find(|e| route.path().starts_with(&e.path)); - if endpoint_config.is_none() { - return None; - } + endpoint_config.as_ref()?; let endpoint_config = endpoint_config.unwrap(); let source_runtime = self @@ -70,9 +68,7 @@ impl ConductorGateway { _ => None, }); - if source_runtime.is_none() { - return None; - } + source_runtime.as_ref()?; let endpoint_runtime = EndpointRuntime { config: endpoint_config.clone(), From 4f7937d036154a95bf75d4ea4bc9a87635537987 Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 16:21:12 +0200 Subject: [PATCH 06/15] fix ci for this branch --- .github/workflows/ci.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1d56b2f1..5a6a2505 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -4,9 +4,7 @@ on: push: branches: - master - pull_request: - branches: - - master + pull_request: {} jobs: build: From 4ec61b621c05efc7f207e48aef1e6c692409c888 Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 20:45:38 +0200 Subject: [PATCH 07/15] ci --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5a6a2505..89e62a92 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,8 +28,8 @@ jobs: - name: check run: cargo check - - name: build - run: cargo build + - name: "build (bin: conductor)" + run: cargo build --bin conductor --release - name: test run: cargo test From fb48ef2b51a2a58fdc80e5f4494543749e91b64f Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 20:59:20 +0200 Subject: [PATCH 08/15] added ci --- .github/workflows/ci.yaml | 4 ++++ Cargo.lock | 28 +++++++++++++------------- Cargo.toml | 4 ++++ crates/cloudflare_worker/Cargo.toml | 7 +------ crates/cloudflare_worker/src/lib.rs | 4 ++-- crates/cloudflare_worker/wrangler.toml | 2 +- 6 files changed, 26 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 89e62a92..e459de90 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -31,6 +31,10 @@ jobs: - name: "build (bin: conductor)" run: cargo build --bin conductor --release + - name: "build (bin: cloudflare_worker_wasm)" + working-directory: crates/cloudflare_worker + run: cargo install -q worker-build && worker-build --release + - name: test run: cargo test diff --git a/Cargo.lock b/Cargo.lock index fb3f9499..a927564c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -520,6 +520,20 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "conductor-cf-worker" +version = "0.1.0" +dependencies = [ + "conductor_common", + "conductor_config", + "conductor_engine", + "console_error_panic_hook", + "time", + "tracing-subscriber", + "tracing-web", + "worker", +] + [[package]] name = "conductor_common" version = "0.0.0" @@ -2592,20 +2606,6 @@ dependencies = [ "worker-sys", ] -[[package]] -name = "worker-rust" -version = "0.1.0" -dependencies = [ - "conductor_common", - "conductor_config", - "conductor_engine", - "console_error_panic_hook", - "time", - "tracing-subscriber", - "tracing-web", - "worker", -] - [[package]] name = "worker-sys" version = "0.0.10" diff --git a/Cargo.toml b/Cargo.toml index 4fb8beca..c7bf42fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,3 +14,7 @@ async-trait = "0.1.74" anyhow = "1.0.75" reqwest = "0.11.22" thiserror = "1.0.50" + +[profile.release.package.conductor-cf-worker] +strip = true +codegen-units = 1 diff --git a/crates/cloudflare_worker/Cargo.toml b/crates/cloudflare_worker/Cargo.toml index c8aadc67..0cdc3c14 100644 --- a/crates/cloudflare_worker/Cargo.toml +++ b/crates/cloudflare_worker/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "worker-rust" +name = "conductor-cf-worker" version = "0.1.0" edition = "2021" @@ -19,8 +19,3 @@ tracing-web = "0.1.2" tracing-subscriber = { version = "0.3.18", features = ['time', 'json'] } time = { version = "0.3.30", features = ['wasm-bindgen'] } console_error_panic_hook = "0.1.7" - -[profile.release] -lto = true -strip = true -codegen-units = 1 diff --git a/crates/cloudflare_worker/src/lib.rs b/crates/cloudflare_worker/src/lib.rs index 602a5f4a..bf5197b8 100644 --- a/crates/cloudflare_worker/src/lib.rs +++ b/crates/cloudflare_worker/src/lib.rs @@ -75,8 +75,8 @@ fn start() { let fmt_layer = tracing_subscriber::fmt::layer() .json() .with_ansi(false) - .with_timer(UtcTime::rfc_3339()) // std::time is not available in browsers - .with_writer(MakeConsoleWriter); // write events to the console + .with_timer(UtcTime::rfc_3339()) // std::time is not available in wasm env + .with_writer(MakeConsoleWriter); tracing_subscriber::registry().with(fmt_layer).init(); } diff --git a/crates/cloudflare_worker/wrangler.toml b/crates/cloudflare_worker/wrangler.toml index bf21a058..1cd097db 100644 --- a/crates/cloudflare_worker/wrangler.toml +++ b/crates/cloudflare_worker/wrangler.toml @@ -1,4 +1,4 @@ -name = "worker-rust" +name = "conductor-cf-worker" main = "build/worker/shim.mjs" compatibility_date = "2023-03-22" From 41b1fde64fee6e84a31bcf665760876e2dd625fc Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 21:19:25 +0200 Subject: [PATCH 09/15] fix --- .github/workflows/ci.yaml | 3 ++- .github/workflows/release.yaml | 40 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e459de90..6d11e298 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -24,6 +24,7 @@ jobs: with: toolchain: ${{ matrix.rust }} override: true + components: worker-build - name: check run: cargo check @@ -33,7 +34,7 @@ jobs: - name: "build (bin: cloudflare_worker_wasm)" working-directory: crates/cloudflare_worker - run: cargo install -q worker-build && worker-build --release + run: worker-build --release - name: test run: cargo test diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index f7ec1212..5d86bb06 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -79,6 +79,46 @@ jobs: ghcr.io/the-guild-org/conductor-t2/conductor:${{ github.event.release.tag_name }} ``` + wasm: + name: compile wasm + runs-on: ubuntu-22.04 + steps: + - name: checkout + uses: actions/checkout@v4 + + - uses: actions-rs/toolchain@v1 + with: + toolchain: 1.74.0 + override: true + components: worker-build + + - name: "build (bin: cloudflare_worker_wasm)" + working-directory: crates/cloudflare_worker + run: worker-build --release + + - uses: actions/upload-artifact@v3 + if: ${{ github.event_name == 'pull_request' || github.event_name == 'push' }} + name: upload wasm artifact + with: + name: conductor-cf-worker-wasm + path: crates/cloudflare_worker/build/ + + - uses: montudor/action-zip@v1 + name: zip wasm artifact + if: ${{ github.event_name == 'release' }} + with: + args: zip -qq -r cloudflare-worker-wasm.zip crates/cloudflare_worker/build/ + + - name: upload wasm to release + if: ${{ github.event_name == 'release' }} + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: cloudflare-worker-wasm.zip + asset_name: cloudflare-worker-wasm + tag: ${{ github.ref }} + overwrite: true + binary: name: compile binary (${{ matrix.platform.target }}) strategy: From 53c1967f1c85a48efd1760d6180a780d940c5c12 Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 21:19:51 +0200 Subject: [PATCH 10/15] fix ci --- .github/workflows/release.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 5d86bb06..1c3de2a0 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -4,9 +4,7 @@ on: push: branches: - master - pull_request: - branches: - - master + pull_request: {} release: types: [created] From 68271b38ef15790ed8ce12715e198d580b5c80ee Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 21:20:48 +0200 Subject: [PATCH 11/15] fix --- .github/workflows/ci.yaml | 3 +-- .github/workflows/release.yaml | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6d11e298..4f02c671 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -24,7 +24,6 @@ jobs: with: toolchain: ${{ matrix.rust }} override: true - components: worker-build - name: check run: cargo check @@ -34,7 +33,7 @@ jobs: - name: "build (bin: cloudflare_worker_wasm)" working-directory: crates/cloudflare_worker - run: worker-build --release + run: cargo install -q && worker-build --release - name: test run: cargo test diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 1c3de2a0..c13692ab 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -88,11 +88,10 @@ jobs: with: toolchain: 1.74.0 override: true - components: worker-build - name: "build (bin: cloudflare_worker_wasm)" working-directory: crates/cloudflare_worker - run: worker-build --release + run: cargo install -q && worker-build --release - uses: actions/upload-artifact@v3 if: ${{ github.event_name == 'pull_request' || github.event_name == 'push' }} From b17dc1d520f8b747df273067afa94f2af4c3ebb1 Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 21:21:35 +0200 Subject: [PATCH 12/15] fix --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index c13692ab..96defe61 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -78,7 +78,7 @@ jobs: ``` wasm: - name: compile wasm + name: compile wasm (cloudflare-worker) runs-on: ubuntu-22.04 steps: - name: checkout From c507d66df37edc8579bd0779703c63f3a93c5e3a Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 21:22:15 +0200 Subject: [PATCH 13/15] fix --- .github/workflows/ci.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4f02c671..e459de90 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -33,7 +33,7 @@ jobs: - name: "build (bin: cloudflare_worker_wasm)" working-directory: crates/cloudflare_worker - run: cargo install -q && worker-build --release + run: cargo install -q worker-build && worker-build --release - name: test run: cargo test diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 96defe61..47a736f2 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -91,7 +91,7 @@ jobs: - name: "build (bin: cloudflare_worker_wasm)" working-directory: crates/cloudflare_worker - run: cargo install -q && worker-build --release + run: cargo install -q worker-build && worker-build --release - uses: actions/upload-artifact@v3 if: ${{ github.event_name == 'pull_request' || github.event_name == 'push' }} From 900de83a694d1b5da4b0e373e9cfddf90013cf3f Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 21:31:07 +0200 Subject: [PATCH 14/15] wip --- .github/workflows/ci.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e459de90..25ad3b50 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -33,11 +33,16 @@ jobs: - name: "build (bin: cloudflare_worker_wasm)" working-directory: crates/cloudflare_worker - run: cargo install -q worker-build && worker-build --release + run: cargo install -q worker-build && worker-build - name: test run: cargo test + - uses: chrysanthos/simple-asset-size-reporter@1.0.0 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" + files: '["crates/cloudflare_worker/build/worker/index.wasm"]' + graphql-over-http: runs-on: ubuntu-22.04 steps: From 2583ec5ff7069f370ce7c3b87564f90532c9c0e3 Mon Sep 17 00:00:00 2001 From: Dotan Simha Date: Sat, 18 Nov 2023 21:37:53 +0200 Subject: [PATCH 15/15] fix --- .github/workflows/ci.yaml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 25ad3b50..748ed124 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -38,11 +38,6 @@ jobs: - name: test run: cargo test - - uses: chrysanthos/simple-asset-size-reporter@1.0.0 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" - files: '["crates/cloudflare_worker/build/worker/index.wasm"]' - graphql-over-http: runs-on: ubuntu-22.04 steps: